Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"bfs.go",
"feedback.go",
"http.go",
"local.go",
],
importpath = "go-common/app/interface/main/feedback/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/feedback/conf:go_default_library",
"//app/interface/main/feedback/model:go_default_library",
"//app/interface/main/feedback/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
"//library/sync/errgroup:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,62 @@
package http
import (
"io/ioutil"
"mime/multipart"
"net/http"
"path"
"strings"
"time"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
// upload
func upload(c *bm.Context) {
var (
fileTpye string
file multipart.File
header *multipart.FileHeader
fileName string
body []byte
location string
err error
)
// res := c.Result()
if file, header, err = c.Request.FormFile("file"); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
defer file.Close()
fileName = header.Filename
fileTpye = strings.TrimPrefix(path.Ext(fileName), ".")
if body, err = ioutil.ReadAll(file); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
location, err = feedbackSvr.Upload(c, "", fileTpye, time.Now(), body)
c.JSON(struct {
URL string `json:"url"`
}{location}, err)
}
// uploadFile
func uploadFile(c *bm.Context) {
var (
req = c.Request
fileTpye, location string
body []byte
err error
)
if body, err = ioutil.ReadAll(req.Body); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
req.Body.Close()
fileTpye = http.DetectContentType(body)
location, err = feedbackSvr.Upload(c, "", fileTpye, time.Now(), body)
c.JSON(struct {
URL string `json:"url"`
}{location}, err)
}

View File

@@ -0,0 +1,480 @@
package http
import (
"io/ioutil"
"mime/multipart"
"path"
"strconv"
"strings"
"sync"
"time"
"unicode/utf8"
"go-common/app/interface/main/feedback/conf"
"go-common/app/interface/main/feedback/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/sync/errgroup"
)
const (
_timeFromat = "2006-01-02 15:04:05"
)
// addReply
func addReply(c *bm.Context) {
header := c.Request.Header
params := c.Request.Form
// params
buvid := header.Get("Buvid")
system := params.Get("system")
version := params.Get("version")
midStr := params.Get("mid")
content := params.Get("content")
imgURL := params.Get("img_url")
logURL := params.Get("log_url")
device := params.Get("device")
channel := params.Get("channel")
entrance := params.Get("entrance")
netState := params.Get("net_state")
netOperator := params.Get("net_operator")
agencyArea := params.Get("agency_area")
platform := params.Get("platform")
browser := params.Get("browser")
qq := params.Get("qq")
mobiApp := params.Get("mobi_app")
email := params.Get("email")
tagStr := params.Get("tag_id")
// check params
if buvid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if system == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if version == "" {
c.JSON(nil, ecode.RequestErr)
return
}
var (
mid int64
err error
)
if midStr != "" {
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
}
if content == "" && imgURL == "" && logURL == "" {
c.JSON(nil, ecode.RequestErr)
return
}
tagID, _ := strconv.ParseInt(tagStr, 10, 64)
c.JSON(feedbackSvr.AddReply(c, mid, tagID, buvid, system, version, mobiApp, filtered(content), imgURL, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, email, time.Now()))
}
func addWebReply(c *bm.Context) {
params := c.Request.Form
// system := params.Get("system")
version := params.Get("version")
midStr := params.Get("mid")
sidStr := params.Get("session_id")
content := params.Get("content")
imgURL := params.Get("img_url")
logURL := params.Get("log_url")
// device := params.Get("device")
buvid := params.Get("buvid")
// channel := params.Get("channel")
netState := params.Get("net_state")
netOperator := params.Get("net_operator")
agencyArea := params.Get("agency_area")
platform := params.Get("platform")
browser := params.Get("browser")
qq := params.Get("qq")
email := params.Get("email")
tagStr := params.Get("tag_id")
aidStr := params.Get("aid")
var (
mid int64
sid int64
err error
)
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if content == "" && imgURL == "" && logURL == "" {
c.JSON(nil, ecode.RequestErr)
return
}
sid, _ = strconv.ParseInt(sidStr, 10, 64)
tagID, _ := strconv.ParseInt(tagStr, 10, 64)
if platform == "" {
platform = "ugc"
}
c.JSON(feedbackSvr.AddWebReply(c, mid, sid, tagID, aidStr, filtered(content), imgURL, netState, netOperator, agencyArea, platform, version, buvid, browser, qq, email, time.Now()))
}
//replys
func replys(c *bm.Context) {
header := c.Request.Header
params := c.Request.Form
buvid := header.Get("Buvid")
system := params.Get("system")
version := params.Get("version")
midStr := params.Get("mid")
platform := params.Get("platform")
mobiApp := params.Get("mobi_app")
device := params.Get("device")
pnStr := params.Get("pn")
psStr := params.Get("ps")
entrance := params.Get("entrance")
// check params
if system == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if version == "" {
c.JSON(nil, ecode.RequestErr)
return
}
var (
mid int64
err error
)
if midStr != "" {
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
}
if mid == 0 && buvid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps < 1 || ps > conf.Conf.Feedback.ReplysNum {
ps = conf.Conf.Feedback.ReplysNum
}
rs, isEndReply, err := feedbackSvr.Replys(c, buvid, platform, mobiApp, device, system, version, entrance, mid, pn, ps)
if err != nil {
c.JSON(nil, err)
return
}
res := map[string]interface{}{
"data": rs,
"is_end_reply": isEndReply,
}
c.JSONMap(res, err)
}
func sessions(c *bm.Context) {
params := c.Request.Form
tagid := params.Get("tag_id")
platform := params.Get("platform")
stateStr := params.Get("state")
midStr := params.Get("mid")
start := params.Get("start")
end := params.Get("end")
pnStr := params.Get("pn")
psStr := params.Get("ps")
mid, err := strconv.ParseInt(midStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
var (
etime time.Time
)
if start == "" {
start = "00-00-00 00:00:00"
}
stime, _ := time.Parse(_timeFromat, start)
etime, _ = time.Parse(_timeFromat, end)
if end == "" {
etime = time.Now()
}
pn, err := strconv.Atoi(pnStr)
if err != nil || pn < 1 {
pn = 1
}
ps, err := strconv.Atoi(psStr)
if err != nil || ps < 0 || ps > 10 {
ps = 10
}
total, sessions, err := feedbackSvr.Sessions(c, mid, stateStr, tagid, platform, stime, etime, ps, pn)
if err != nil {
c.JSON(nil, err)
return
}
res := map[string]interface{}{
"data": sessions,
"total": total,
}
c.JSONMap(res, err)
}
func sessionsClose(c *bm.Context) {
params := c.Request.Form
sidStr := params.Get("session_id")
sid, err := strconv.ParseInt(sidStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, feedbackSvr.UpdateSessionState(c, 3, sid))
}
func replyTag(c *bm.Context) {
params := c.Request.Form
tp := params.Get("type") // NOTE: player
platform := params.Get("platform")
c.JSON(model.Tags[tp][platform], nil)
}
func ugcTag(c *bm.Context) {
params := c.Request.Form
tp := params.Get("type")
platform := params.Get("platform")
mold, err := strconv.Atoi(tp)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
midStr := params.Get("mid")
mid, err := strconv.ParseInt(midStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(feedbackSvr.Tags(c, mid, mold, platform))
}
func webReply(c *bm.Context) {
params := c.Request.Form
sidStr := params.Get("session_id")
sid, err := strconv.ParseInt(sidStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
midStr := params.Get("mid")
mid, err := strconv.ParseInt(midStr, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(feedbackSvr.WebReplys(c, sid, mid))
}
func filtered(content string) string {
v := make([]rune, 0, len(content))
for _, c := range content {
if c != utf8.RuneError {
v = append(v, c)
}
}
return string(v)
}
func playerCheck(c *bm.Context) {
var (
params = c.Request.Form
header = c.Request.Header
platform, ipChangeTimes int
mid, checkTime, aid, connectSpeed, ioSpeed int64
region, school string
err error
)
platformStr := params.Get("platform")
if platform = model.FormPlatForm(platformStr); platform == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if region = params.Get("region"); region == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if school = params.Get("school"); school == "" {
c.JSON(nil, ecode.RequestErr)
return
}
midStr := params.Get("mid")
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
checkTimeStr := params.Get("check_time")
if checkTime, err = strconv.ParseInt(checkTimeStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
aid, _ = strconv.ParseInt(params.Get("aid"), 10, 64)
ipChangeTimesStr := params.Get("ip_change_times")
if ipChangeTimes, err = strconv.Atoi(ipChangeTimesStr); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
connectSpeedStr := params.Get("connect_speed")
if connectSpeed, err = strconv.ParseInt(connectSpeedStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
ioSpeedStr := params.Get("io_speed")
if ioSpeed, err = strconv.ParseInt(ioSpeedStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, feedbackSvr.PlayerCheck(c, platform, ipChangeTimes, mid, checkTime, aid, connectSpeed, ioSpeed, region, school, header.Get("X-Cache-Server-Addr")))
}
// addReplyH5 add from H5
func addReplyH5(c *bm.Context) {
c.Request.ParseMultipartForm(model.MaxUploadSize)
header := c.Request.Header
params := c.Request.MultipartForm
buvid := header.Get("Buvid")
var system, version, midStr, content, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, mobiApp, email, tagStr string
// params
if len(params.Value["system"]) > 0 {
system = params.Value["system"][0]
}
if len(params.Value["version"]) > 0 {
version = params.Value["version"][0]
}
if len(params.Value["mid"]) > 0 {
midStr = params.Value["mid"][0]
}
if len(params.Value["content"]) > 0 {
content = params.Value["content"][0]
}
if len(params.Value["log_url"]) > 0 {
logURL = params.Value["log_url"][0]
}
if len(params.Value["device"]) > 0 {
device = params.Value["device"][0]
}
if len(params.Value["channel"]) > 0 {
channel = params.Value["channel"][0]
}
if len(params.Value["entrance"]) > 0 {
entrance = params.Value["entrance"][0]
}
if len(params.Value["net_state"]) > 0 {
netState = params.Value["net_state"][0]
}
if len(params.Value["net_operator"]) > 0 {
netOperator = params.Value["net_operator"][0]
}
if len(params.Value["agency_area"]) > 0 {
agencyArea = params.Value["agency_area"][0]
}
if len(params.Value["platform"]) > 0 {
platform = params.Value["platform"][0]
}
if len(params.Value["browser"]) > 0 {
browser = params.Value["browser"][0]
}
if len(params.Value["qq"]) > 0 {
qq = params.Value["qq"][0]
}
if len(params.Value["mobi_app"]) > 0 {
mobiApp = params.Value["mobi_app"][0]
}
if len(params.Value["email"]) > 0 {
email = params.Value["email"][0]
}
if len(params.Value["buvid"]) > 0 && buvid == "" {
buvid = params.Value["buvid"][0]
}
if len(params.Value["tag_id"]) > 0 {
tagStr = params.Value["tag_id"][0]
}
// check params
if buvid == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if system == "" {
c.JSON(nil, ecode.RequestErr)
return
}
if version == "" {
c.JSON(nil, ecode.RequestErr)
return
}
var (
mid int64
err error
)
if midStr != "" {
if mid, err = strconv.ParseInt(midStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
}
imgs := c.Request.MultipartForm.File["imgs"]
var (
imgURL string
urls []string
mutex = sync.Mutex{}
)
g, ctx := errgroup.WithContext(c)
for k, fh := range imgs {
if k == conf.Conf.Feedback.ImgLimit {
break
}
var (
img multipart.File
url string
fileName string
fileTpye string
body []byte
)
if img, err = fh.Open(); err != nil {
log.Error("H5 addReply Open %s failed", fh.Filename)
err = nil
continue
}
defer img.Close()
fileName = fh.Filename
fileTpye = strings.TrimPrefix(path.Ext(fileName), ".")
if body, err = ioutil.ReadAll(img); err != nil {
log.Error("H5 addReply ioutil.ReadAll %s failed", fh.Filename)
err = nil
continue
}
g.Go(func() (err error) {
if url, err = feedbackSvr.Upload(ctx, "", fileTpye, time.Now(), body); err != nil {
log.Error("H5 addReply Upload %s failed", fh.Filename)
err = nil
return
}
mutex.Lock()
urls = append(urls, url)
mutex.Unlock()
return
})
}
if err = g.Wait(); err != nil {
log.Error("%+v", err)
return
}
if len(urls) > 0 {
imgURL = strings.Join(urls, ";")
}
if content == "" && imgURL == "" && logURL == "" {
c.JSON(nil, ecode.RequestErr)
return
}
tagID, _ := strconv.ParseInt(tagStr, 10, 64)
c.JSON(feedbackSvr.AddReply(c, mid, tagID, buvid, system, version, mobiApp, filtered(content), imgURL, logURL, device, channel, entrance, netState, netOperator, agencyArea, platform, browser, qq, email, time.Now()))
}

View File

@@ -0,0 +1,71 @@
package http
import (
"go-common/app/interface/main/feedback/conf"
"go-common/app/interface/main/feedback/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/auth"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
verifySvc *verify.Verify
authSvc *auth.Auth
feedbackSvr *service.Service
)
// Init init http
func Init(c *conf.Config) error {
initService(c)
engineOut := bm.DefaultServer(c.BM.Outer)
outerRouter(engineOut)
internalRouter(engineOut)
// init external server
if err := engineOut.Start(); err != nil {
log.Error("engineOut.Start() error(%v) | config(%v)", err, c)
panic(err)
}
engineLocal := bm.DefaultServer(c.BM.Local)
localRouter(engineLocal)
// init local server
if err := engineLocal.Start(); err != nil {
log.Error("engineLocal.Start() error(%v) | config(%v)", err, c)
panic(err)
}
return nil
}
// initService init services.
func initService(c *conf.Config) {
verifySvc = verify.New(nil)
authSvc = auth.New(nil)
feedbackSvr = service.New(c)
}
func outerRouter(e *bm.Engine) {
e.Ping(ping)
// init api
feedback := e.Group("/x/feedback")
feedback.POST("/add", addReply)
feedback.GET("/reply", verifySvc.Verify, replys)
feedback.GET("/tag", verifySvc.Verify, replyTag)
feedback.POST("/upload", upload)
feedback.POST("/uploadFile", uploadFile)
feedback.POST("/playerCheck", playerCheck)
feedback.GET("/h5/tag", replyTag)
feedback.POST("/h5/add", addReplyH5)
}
func internalRouter(e *bm.Engine) {
feedbackInner := e.Group("/x/internal/feedback")
feedbackInner.POST("/ugc/add", addWebReply)
feedbackInner.GET("/ugc/session", verifySvc.Verify, sessions)
feedbackInner.POST("/ugc/session/close", verifySvc.Verify, sessionsClose)
feedbackInner.GET("/ugc/tag", verifySvc.Verify, ugcTag)
feedbackInner.GET("/ugc/reply", verifySvc.Verify, webReply)
feedbackInner.POST("/upload", authSvc.User, upload)
}
func localRouter(e *bm.Engine) {
}

View File

@@ -0,0 +1,9 @@
package http
import (
bm "go-common/library/net/http/blademaster"
)
// ping check server ok.
func ping(c *bm.Context) {
}