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,45 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"answer.go",
"captcha.go",
"http.go",
"local.go",
"pendant.go",
],
importpath = "go-common/app/interface/main/answer/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/interface/main/answer/conf:go_default_library",
"//app/interface/main/answer/model:go_default_library",
"//app/interface/main/answer/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/antispam:go_default_library",
"//library/net/http/blademaster/middleware/auth:go_default_library",
"//library/xstr: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,207 @@
package http
import (
"fmt"
"strconv"
"strings"
"go-common/app/interface/main/answer/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/xstr"
)
func localized(c *bm.Context) string {
langs := detectLocalizedWeb(c)
if len(langs) == 0 {
return model.LangZhCN
}
switch langs[0] {
case model.LangZhTW:
return model.LangZhTW
case model.LangZhHK:
return model.LangZhTW
default:
return model.LangZhCN
}
}
func checkBirthDay(c *bm.Context) {
var mid, _ = c.Get("mid")
if ok := svc.CheckBirthday(c, mid.(int64)); !ok {
c.JSON(nil, ecode.MemberBirthdayInfoIsNull)
return
}
c.JSON(nil, nil)
}
// checkPro check second step answers
func checkPro(c *bm.Context) {
var (
err error
ids []int64
params = c.Request.Form
qIds = params.Get("qs_ids")
mid, _ = c.Get("mid")
ansHash = make(map[int64]string)
)
qidArr := strings.Split(qIds, ",")
for _, qid := range qidArr {
id, _ := strconv.ParseInt(qid, 10, 64)
ansHash[id] = params.Get("ans_hash_" + qid)
ids = append(ids, id)
}
hid, err := svc.ProCheck(c, mid.(int64), ids, ansHash, localized(c))
if err != nil {
log.Error("svc.ProCheck(%d,%s,%+v) error(%+v)", mid.(int64), xstr.JoinInts(ids), ansHash, err)
c.JSON(nil, err)
return
}
c.JSON(fmt.Sprintf(model.ProPassed, hid), nil)
}
// checkBase check first step answers
func checkBase(c *bm.Context) {
var (
err error
ids []int64
params = c.Request.Form
qIds = params.Get("qs_ids")
mid, _ = c.Get("mid")
ansHash = make(map[int64]string)
)
qidsArr := strings.Split(qIds, ",")
for _, qid := range qidsArr {
id, _ := strconv.ParseInt(qid, 10, 64)
ansHash[id] = params.Get("ans_hash_" + qid)
ids = append(ids, id)
}
req, err := svc.CheckBase(c, mid.(int64), ids, ansHash, localized(c))
if err != nil {
log.Error("svc.BaseCheck(%d,%s,%+v) error(%+v)", mid.(int64), xstr.JoinInts(ids), ansHash, err)
c.JSON(nil, err)
return
}
res := make(map[string]interface{})
if req != nil && len(req.QidList) > 0 {
res["next"] = false
res["ids"] = req.QidList
c.JSON(res, nil)
return
}
res["next"] = true
c.JSON(res, nil)
}
// checkExtra extra question check.
func checkExtra(c *bm.Context) {
var (
ids []int64
params = c.Request.Form
qIds = params.Get("qs_ids")
mid, ok = c.Get("mid")
ansHash = make(map[int64]string)
ua = c.Request.Header.Get("User-Agent")
refer = c.Request.Header.Get("Referer")
)
if !ok {
c.JSON(nil, ecode.RequestErr)
return
}
qidsArr := strings.Split(qIds, ",")
for _, qid := range qidsArr {
id, _ := strconv.ParseInt(qid, 10, 64)
h := params.Get("ans_hash_" + qid)
if h != "" {
ansHash[id] = params.Get("ans_hash_" + qid)
ids = append(ids, id)
}
}
buvid := c.Request.Header.Get("Buvid")
if buvid == "" {
cookie, _ := c.Request.Cookie("buvid3")
if cookie != nil {
buvid = cookie.Value
}
}
c.JSON(nil, svc.ExtraCheck(c, mid.(int64), ids, ansHash, ua, localized(c), refer, buvid))
}
// getBaseQ get first step questions
func baseQus(c *bm.Context) {
var (
mid, ok = c.Get("mid")
mobile = strings.Contains(c.Request.UserAgent(), model.MobileUserAgentFlag)
)
if !ok {
c.JSON(nil, ecode.NoLogin)
return
}
c.JSON(svc.BaseQ(c, mid.(int64), localized(c), mobile))
}
// getProType get second step question types
func proType(c *bm.Context) {
mid, ok := c.Get("mid")
if !ok {
c.JSON(nil, ecode.NoLogin)
return
}
c.JSON(svc.ProType(c, mid.(int64), localized(c)))
}
// getQstByType get second step questions
func proQus(c *bm.Context) {
var (
params = c.Request.Form
mid, ok = c.Get("mid")
tIdsStr = params.Get("type_ids")
mobile = strings.Contains(c.Request.UserAgent(), model.MobileUserAgentFlag)
)
if !ok {
c.JSON(nil, ecode.NoLogin)
return
}
c.JSON(svc.ConvertProQues(c, mid.(int64), tIdsStr, localized(c), mobile))
}
// extraQus extra question.
func extraQus(c *bm.Context) {
var (
mid, ok = c.Get("mid")
mobile = strings.Contains(c.Request.UserAgent(), model.MobileUserAgentFlag)
)
if !ok {
c.JSON(nil, ecode.NoLogin)
return
}
c.JSON(svc.ConvertExtraQs(c, mid.(int64), localized(c), mobile))
}
func cool(c *bm.Context) {
var (
err error
mid int64
hid int64
params = c.Request.Form
hidStr = params.Get("id")
)
if midI, ok := c.Get("mid"); ok {
mid = midI.(int64)
}
if hid, err = strconv.ParseInt(hidStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(svc.Cool(c, hid, mid))
}
func extraScore(c *bm.Context) {
mid, ok := c.Get("mid")
if !ok {
c.JSON(nil, ecode.NoLogin)
return
}
c.JSON(svc.ExtraScore(c, mid.(int64)))
}

View File

@@ -0,0 +1,95 @@
package http
import (
"fmt"
"strconv"
"strings"
"go-common/app/interface/main/answer/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func validate(c *bm.Context) {
var (
mid, _ = c.Get("mid")
params = c.Request.Form
challenge = params.Get("geetest_challenge")
validate = params.Get("geetest_validate")
seccode = params.Get("geetest_seccode")
success = params.Get("geetest_success")
captchaType = params.Get("captcha_type") // typ == "gt"
cookie = c.Request.Header.Get("cookie")
mobile = strings.Contains(c.Request.UserAgent(), model.MobileUserAgentFlag)
ct string
sid string
)
if mobile {
ct = model.PlatH5
} else {
ct = model.PlatPC
}
successi, err := strconv.Atoi(success)
if err != nil {
successi = 1
}
sidCookie, err := c.Request.Cookie("sid")
if err != nil {
log.Warn("cookie do not contains sid error(%v)", err)
} else {
sid = sidCookie.Value
}
comargs := map[string]string{
"ua": c.Request.Header.Get("User-Agent"),
"buvid": c.Request.Header.Get("Buvid"),
"refer": c.Request.Header.Get("Referer"),
"url": c.Request.Header.Get("URL"),
"sid": sid,
}
if captchaType == model.BiliCaptcha {
validate = params.Get("token")
seccode = params.Get("code")
if validate == "" || seccode == "" {
log.Error("validate(%+v) ", params)
c.JSON(nil, ecode.RequestErr)
}
}
req, err := svc.Validate(c, challenge, validate, seccode, ct, successi, mid.(int64), cookie, captchaType, comargs)
if err != nil {
log.Error("svc.Validate(%d,%d,%s,%s,%s,%s,%s,%s) error(%+v)", mid.(int64), successi, challenge, validate, seccode, ct,
cookie, comargs, err)
c.JSON(nil, err)
return
}
cool, err := svc.Cool(c, req.HistoryID, mid.(int64))
if err != nil {
c.JSON(nil, err)
return
}
cool.Hid = req.HistoryID
cool.URL = fmt.Sprintf(model.ProPassed, req.HistoryID)
c.JSON(cool, nil)
}
// captcha get captcha
func captcha(c *bm.Context) {
var (
err error
mid, _ = c.Get("mid")
mobile = strings.Contains(c.Request.UserAgent(), model.MobileUserAgentFlag)
ct string
)
if mobile {
ct = model.PlatH5
} else {
ct = model.PlatPC
}
req, err := svc.Captcha(c, mid.(int64), ct, 1)
if err != nil {
log.Error("svc.QueCaptcha(%d,%s) error(%+v)", mid.(int64), ct, err)
c.JSON(nil, err)
return
}
c.JSON(req, nil)
}

View File

@@ -0,0 +1,59 @@
package http
import (
"go-common/app/interface/main/answer/conf"
"go-common/app/interface/main/answer/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/antispam"
"go-common/library/net/http/blademaster/middleware/auth"
)
var (
authSvc *auth.Auth
antSvc *antispam.Antispam
svc *service.Service
)
// Init init
func Init(c *conf.Config) {
initService(c)
engineOuter := bm.DefaultServer(c.BM)
outerRouter(engineOuter)
if err := engineOuter.Start(); err != nil {
log.Error("engineOuter.Start() error(%v)", err)
panic(err)
}
}
// initService init services.
func initService(c *conf.Config) {
authSvc = auth.New(c.AuthN)
antSvc = antispam.New(c.Antispam)
svc = service.New(c)
}
// outerRouter init outer router api path.
func outerRouter(e *bm.Engine) {
e.Ping(ping)
og := e.Group("/x/answer", bm.CORS())
{
// 答题流程排序
og.GET("/v3/base", authSvc.UserWeb, antSvc.Handler(), baseQus)
og.POST("/v3/base/check", authSvc.User, checkBase)
og.GET("/v3/extra", authSvc.User, antSvc.Handler(), extraQus)
og.POST("/v3/extra/check", authSvc.UserWeb, checkExtra)
og.GET("/v3/extra/score", authSvc.User, extraScore)
og.GET("/user/birthday", authSvc.User, checkBirthDay)
og.GET("/v3/pro/type", authSvc.User, proType)
og.GET("/v3/pro", authSvc.UserWeb, antSvc.Handler(), proQus)
og.POST("/v3/pro/check", authSvc.User, checkPro)
og.GET("/v3/captcha/gt", authSvc.User, antSvc.Handler(), captcha)
og.POST("/v3/captcha/check", authSvc.User, validate)
og.GET("/v3/result", authSvc.GuestWeb, cool)
og.POST("/rec/pendant", authSvc.User, pendantRec)
}
}
func ping(c *bm.Context) {
}

View File

@@ -0,0 +1,60 @@
// Package http detect localized from http header
// and set localized info to metadata as key 'locale'
// The locale used following the specification defined at
// http://www.rfc-editor.org/rfc/bcp/bcp47.txt.
// Examples are: "en-US", "fr-CH", "es-MX"
package http
import (
"net/url"
"sort"
"strconv"
"strings"
bm "go-common/library/net/http/blademaster"
)
type language struct {
Name string
Weighting float64
}
// detectLocalizedWeb detect locale from HTTP Accept-Language header
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Language
func detectLocalizedWeb(c *bm.Context) (langs []string) {
parseLang := func(s string) (language, error) {
seps := strings.SplitN(s, ";", 2)
lang := language{Name: seps[0]}
if len(seps) == 1 {
lang.Weighting = 1
return lang, nil
}
params, err := url.ParseQuery(seps[1])
if err != nil {
return lang, err
}
lang.Weighting, err = strconv.ParseFloat(params.Get("q"), 32)
return lang, err
}
items := strings.Split(c.Request.Header.Get("Accept-Language"), ",")
if items[0] == "" {
return
}
// three language is most common accept language send by browser
languages := make([]language, 0, len(items))
for _, s := range items {
l, err := parseLang(s)
if err != nil {
//TODO(weicheng): deal with error
continue
}
languages = append(languages, l)
}
sort.Slice(languages, func(i, j int) bool {
return languages[i].Weighting > languages[j].Weighting
})
for i := range languages {
langs = append(langs, languages[i].Name)
}
return
}

View File

@@ -0,0 +1,21 @@
package http
import (
"go-common/app/interface/main/answer/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func pendantRec(c *bm.Context) {
arg := new(model.ReqPendant)
mid, ok := c.Get("mid")
if !ok {
c.JSON(nil, ecode.AccountNotLogin)
return
}
if err := c.Bind(arg); err != nil {
return
}
arg.MID = mid.(int64)
c.JSON(nil, svc.PendantRec(c, arg))
}