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,61 @@
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"http.go",
"member.go",
"monitor.go",
"official.go",
"realname.go",
"review.go",
],
importpath = "go-common/app/admin/main/member/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/member/conf:go_default_library",
"//app/admin/main/member/http/block:go_default_library",
"//app/admin/main/member/model:go_default_library",
"//app/admin/main/member/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/permit:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
"//library/net/metadata:go_default_library",
"//library/time:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/main/member/http/block:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,51 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["http_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/block/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"block.go",
"http.go",
],
importpath = "go-common/app/admin/main/member/http/block",
tags = ["automanaged"],
deps = [
"//app/admin/main/member/model/block:go_default_library",
"//app/admin/main/member/service/block:go_default_library",
"//library/ecode:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/middleware/permit:go_default_library",
"//vendor/github.com/pkg/errors: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,50 @@
package block
import (
model "go-common/app/admin/main/member/model/block"
bm "go-common/library/net/http/blademaster"
)
func blockSearch(c *bm.Context) {
var (
err error
v = &model.ParamSearch{}
)
if err = bind(c, v); err != nil {
return
}
c.JSON(svc.Search(c, v.MIDs))
}
func history(c *bm.Context) {
var (
err error
v = &model.ParamHistory{}
)
if err = bind(c, v); err != nil {
return
}
c.JSON(svc.History(c, v.MID, v.PS, v.PN, v.Desc))
}
func batchBlock(c *bm.Context) {
var (
err error
v = &model.ParamBatchBlock{}
)
if err = bind(c, v); err != nil {
return
}
c.JSON(nil, svc.BatchBlock(c, v))
}
func batchRemove(c *bm.Context) {
var (
err error
v = &model.ParamBatchRemove{}
)
if err = bind(c, v); err != nil {
return
}
c.JSON(nil, svc.BatchRemove(c, v))
}

View File

@@ -0,0 +1,46 @@
package block
import (
model "go-common/app/admin/main/member/model/block"
service "go-common/app/admin/main/member/service/block"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
"github.com/pkg/errors"
)
var (
svc *service.Service
)
// Setup is.
func Setup(blockSvc *service.Service, e *bm.Engine, authSvc *permit.Permit) {
svc = blockSvc
cb := e.Group("/x/admin/block", authSvc.Permit("BLOCK_SEARCH"))
{
cb.POST("/search", blockSearch)
cb.GET("/history", history)
}
cb = e.Group("/x/admin/block", authSvc.Permit("BLOCK_BLOCK"))
{
cb.POST("", batchBlock)
}
cb = e.Group("/x/admin/block", authSvc.Permit("BLOCK_REMOVE"))
{
cb.POST("/remove", batchRemove)
}
}
func bind(c *bm.Context, v model.ParamValidator) (err error) {
if err = c.Bind(v); err != nil {
err = errors.WithStack(err)
return
}
if !v.Validate() {
err = ecode.RequestErr
c.JSON(nil, ecode.RequestErr)
return
}
return
}

View File

@@ -0,0 +1,25 @@
package block
import (
"flag"
"testing"
"go-common/app/admin/main/block/conf"
. "github.com/smartystreets/goconvey/convey"
)
func TestMain(m *testing.M) {
flag.Set("conf", "../cmd/block-admin-test.toml")
var err error
if err = conf.Init(); err != nil {
panic(err)
}
m.Run()
}
func TestTools(t *testing.T) {
Convey("tools", t, func() {
})
}

View File

@@ -0,0 +1,144 @@
package http
import (
"go-common/app/admin/main/member/conf"
"go-common/app/admin/main/member/http/block"
"go-common/app/admin/main/member/service"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
authSvc *permit.Permit
vfySvc *verify.Verify
svc *service.Service
)
// Init init
func Init(c *conf.Config) {
initService(c)
// init router
engine := bm.DefaultServer(c.BM)
initRouter(engine)
block.Setup(svc.BlockImpl(), engine, authSvc)
if err := engine.Start(); err != nil {
log.Error("engine.Start error(%v)", err)
panic(err)
}
}
// initService init services.
func initService(c *conf.Config) {
authSvc = permit.New(c.Auth)
vfySvc = verify.New(nil)
svc = service.New(c)
}
// outerRouter init outer router api path.
func initRouter(e *bm.Engine) {
// init api
e.Ping(ping)
e.Register(register)
mg := e.Group("/x/admin/member")
{
mg.GET("/list", authSvc.Permit("ACCOUNT_REVIEW"), members)
mg.POST("/exp/set", authSvc.Permit("ACCOUNT_REVIEW_SET_EXP"), expSet)
mg.POST("/moral/set", authSvc.Permit("ACCOUNT_REVIEW"), moralSet)
mg.POST("/rank/set", authSvc.Permit("ACCOUNT_REVIEW_SET_RANK"), rankSet)
mg.POST("/coin/set", authSvc.Permit("ACCOUNT_REVIEW"), coinSet)
mg.POST("/addit/remark/set", authSvc.Permit("ACCOUNT_REVIEW"), additRemarkSet)
mg.GET("/profile", authSvc.Permit("ACCOUNT_REVIEW"), memberProfile)
mg.GET("/exp/log", authSvc.Permit("ACCOUNT_EXP_LOG"), expLog)
mg.GET("/face/history", authSvc.Permit("ACCOUNT_FACE_HISTORY"), faceHistory)
mg.POST("/batch/formal", authSvc.Permit("ACCOUNT_BATCH_FORMAL"), batchFormal)
mg.GET("/moral/log", moralLog)
mg.POST("/sign/del", delSign)
mg.POST("/pub/exp/msg", authSvc.Permit("ACCOUNT_PUB_EXP_MSG"), pubExpMsg)
//个人信息审核
mg.GET("/base/review", authSvc.Permit("ACCOUNT_REVIEW_AUDIT"), baseReview)
mg.POST("/face/clear", authSvc.Permit("ACCOUNT_REVIEW_AUDIT"), clearFace)
mg.POST("/sign/clear", authSvc.Permit("ACCOUNT_REVIEW_AUDIT"), clearSign)
mg.POST("/name/clear", authSvc.Permit("ACCOUNT_REVIEW_AUDIT"), clearName)
og := mg.Group("/official")
{
og.GET("/list", authSvc.Permit("OFFICIAL_VIEW"), officials)
og.GET("/list/excel", authSvc.Permit("OFFICIAL_VIEW"), officialsExcel)
og.GET("/doc", authSvc.Permit("OFFICIAL_VIEW"), officialDoc)
og.GET("/docs", authSvc.Permit("OFFICIAL_VIEW"), officialDocs)
og.GET("/docs/excel", authSvc.Permit("OFFICIAL_VIEW"), officialDocsExcel)
og.GET("/doc/audit", authSvc.Permit("OFFICIAL_AUDIT"), officialDocAudit)
og.GET("/doc/edit", authSvc.Permit("OFFICIAL_MNG"), officialDocEdit)
ex := og.Group("/internal")
ex.GET("/doc", vfySvc.Verify, officialDoc)
ex.POST("/doc/audit", vfySvc.Verify, officialDocAudit)
ex.POST("/doc/submit", vfySvc.Verify, officialDocSubmit)
}
rw := mg.Group("/review")
{
rw.GET("", authSvc.Permit("ACCOUNT_PROPERTY_REVIEW_AUDIT"), review)
rw.GET("/list", authSvc.Permit("ACCOUNT_PROPERTY_REVIEW_AUDIT"), reviewList)
rw.POST("/audit", authSvc.Permit("ACCOUNT_PROPERTY_REVIEW_AUDIT"), reviewAudit)
rw.GET("/face/list", authSvc.Permit("ACCOUNT_PROPERTY_REVIEW_FACE_AUDIT"), reviewFaceList)
rw.POST("/face/audit", authSvc.Permit("ACCOUNT_PROPERTY_REVIEW_FACE_AUDIT"), reviewAudit)
}
mn := mg.Group("/monitor")
{
mn.GET("/list", authSvc.Permit("ACCOUNT_MONITOR_REVIEW"), monitors)
mn.POST("/add", authSvc.Permit("ACCOUNT_MONITOR_MNG"), addMonitor)
mn.POST("/del", authSvc.Permit("ACCOUNT_MONITOR_MNG"), delMonitor)
}
rn := mg.Group("/realname")
{
rn.GET("/list", authSvc.Permit("REALNAME_QUERY"), realnameList)
rn.GET("/list/pending", authSvc.Permit("REALNAME_AUDIT"), realnamePendingList)
rn.GET("/image", authSvc.Permit("REALNAME_AUDIT"), realnameImage)
rn.GET("/image/preview", realnameImagePreview)
rn.POST("/apply/audit", authSvc.Permit("REALNAME_AUDIT"), realnameAuditApply)
rn.GET("/reason", authSvc.Permit("REALNAME_AUDIT"), realnameReasonList)
rn.POST("/reason/set", authSvc.Permit("REALNAME_SET_REASON"), realnameSetReason)
rn.POST("/search/card", vfySvc.Verify, realnameSearchCard)
rn.POST("/unbind", authSvc.Permit("ACCOUNT_REVIEW"), realnameUnbind)
rn.GET("/excel", authSvc.Permit("REALNAME_EXPORT"), realnameExport)
rn.POST("/file/upload", authSvc.Permit("REALNAME_SUBMIT"), realnameFileUpload)
rn.POST("/submit", authSvc.Permit("REALNAME_SUBMIT"), realnameSubmit)
ex := rn.Group("/internal", vfySvc.Verify)
ex.GET("/list", realnameList)
ex.GET("/list/pending", realnamePendingList)
ex.GET("/image", realnameImage)
ex.GET("/image/preview", realnameImagePreview)
ex.POST("/apply/audit", realnameAuditApply)
ex.GET("/reason", realnameReasonList)
ex.POST("/reason/set", realnameSetReason)
ex.POST("/search/card", realnameSearchCard)
ex.POST("/unbind", realnameUnbind)
ex.GET("/excel", realnameExport)
ex.POST("/file/upload", realnameFileUpload)
ex.POST("/submit", realnameSubmit)
}
}
}
// ping check server ok.
func ping(c *bm.Context) {
if err := svc.Ping(c); err != nil {
log.Error("Failed to ping service: %+v", err)
c.AbortWithStatus(ecode.Cause(err).Code())
return
}
c.AbortWithStatus(200)
}
func register(c *bm.Context) {
c.JSON(nil, nil)
}

View File

@@ -0,0 +1,196 @@
package http
import (
"io/ioutil"
"time"
"go-common/app/admin/main/member/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
xtime "go-common/library/time"
)
func members(ctx *bm.Context) {
arg := &model.ArgList{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.PN <= 0 {
arg.PN = 1
}
if arg.PS <= 0 {
arg.PS = 10
}
ctx.JSON(svc.Members(ctx, arg))
}
func memberProfile(ctx *bm.Context) {
arg := &model.ArgMid{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.MemberProfile(ctx, arg.Mid))
}
func delSign(ctx *bm.Context) {
arg := &model.ArgMids{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(nil, svc.DelSign(ctx, arg))
}
// pubExpMsg is.
func pubExpMsg(ctx *bm.Context) {
arg := &model.ArgPubExpMsg{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.IP == "" {
arg.IP = metadata.String(ctx, metadata.RemoteIP)
}
if arg.Ts == 0 {
arg.Ts = time.Now().Unix()
}
ctx.JSON(nil, svc.PubExpMsg(ctx, arg))
}
func expSet(ctx *bm.Context) {
arg := &model.ArgExpSet{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.IP = metadata.String(ctx, metadata.RemoteIP)
ctx.JSON(nil, svc.SetExp(ctx, arg))
}
func moralSet(ctx *bm.Context) {
arg := &model.ArgMoralSet{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.IP = metadata.String(ctx, metadata.RemoteIP)
ctx.JSON(nil, svc.SetMoral(ctx, arg))
}
func coinSet(ctx *bm.Context) {
arg := &model.ArgCoinSet{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.IP = metadata.String(ctx, metadata.RemoteIP)
ctx.JSON(nil, svc.SetCoin(ctx, arg))
}
func rankSet(ctx *bm.Context) {
arg := &model.ArgRankSet{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.IP = metadata.String(ctx, metadata.RemoteIP)
ctx.JSON(nil, svc.SetRank(ctx, arg))
}
func additRemarkSet(ctx *bm.Context) {
arg := &model.ArgAdditRemarkSet{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(nil, svc.SetAdditRemark(ctx, arg))
}
func baseReview(ctx *bm.Context) {
arg := &model.ArgBaseReview{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.BaseReview(ctx, arg))
}
func clearFace(ctx *bm.Context) {
arg := &model.ArgMids{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.ClearFace(ctx, arg), nil)
}
func clearSign(ctx *bm.Context) {
arg := &model.ArgMids{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.ClearSign(ctx, arg), nil)
}
func clearName(ctx *bm.Context) {
arg := &model.ArgMids{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.ClearName(ctx, arg), nil)
}
func expLog(ctx *bm.Context) {
arg := &model.ArgMid{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.ExpLog(ctx, arg.Mid))
}
func faceHistory(ctx *bm.Context) {
arg := &model.ArgFaceHistory{}
if err := ctx.Bind(arg); err != nil {
return
}
if ctx.Request.Form.Get("status") == "" {
// 0:队列中 1:待审核 2:通过 3:驳回
arg.Status = []int8{0, 1, 2, 3}
}
if arg.PN <= 0 {
arg.PN = 1
}
if arg.PS <= 0 {
arg.PS = 50
}
if arg.ETime <= 0 {
arg.ETime = xtime.Time(time.Now().Unix())
}
ctx.JSON(svc.FaceHistory(ctx, arg))
}
func moralLog(ctx *bm.Context) {
arg := &model.ArgMid{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.MoralLog(ctx, arg.Mid))
}
func batchFormal(ctx *bm.Context) {
arg := &model.ArgBatchFormal{}
if err := ctx.Bind(arg); err != nil {
return
}
defer ctx.Request.Form.Del("file") // 防止日志不出现
ctx.Request.ParseMultipartForm(32 << 20)
fd, _, err := ctx.Request.FormFile("file")
if err != nil {
log.Warn("Failed to parse form file: %+v", err)
ctx.JSON(nil, ecode.RequestErr)
return
}
defer fd.Close()
file, err := ioutil.ReadAll(fd)
if err != nil {
log.Warn("Failed to read form file: %+v", err)
ctx.JSON(nil, ecode.RequestErr)
return
}
log.Info("Succeeded to parse file data: file-length: %d", len(file))
arg.FileData = file
ctx.JSON(nil, svc.BatchFormal(ctx, arg))
}

View File

@@ -0,0 +1,60 @@
package http
import (
"go-common/app/admin/main/member/model"
bm "go-common/library/net/http/blademaster"
)
func monitors(ctx *bm.Context) {
arg := &model.ArgMonitor{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.Pn <= 0 {
arg.Pn = 1
}
if arg.Ps <= 0 {
arg.Ps = 10
}
mns, total, err := svc.Monitors(ctx, arg)
if err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"monitors": mns,
"page": map[string]int{
"num": arg.Pn,
"size": arg.Ps,
"total": total,
},
}
ctx.JSON(res, nil)
}
func addMonitor(ctx *bm.Context) {
arg := &model.ArgAddMonitor{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.OperatorID = operatorID(ctx)
ctx.JSON(nil, svc.AddMonitor(ctx, arg))
}
func delMonitor(ctx *bm.Context) {
arg := &model.ArgDelMonitor{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.OperatorID = operatorID(ctx)
ctx.JSON(nil, svc.DelMonitor(ctx, arg))
}
func operatorID(ctx *bm.Context) int64 {
uidI, ok := ctx.Get("uid")
if !ok {
return 0
}
uid, _ := uidI.(int64)
return uid
}

View File

@@ -0,0 +1,211 @@
package http
import (
"bytes"
"encoding/csv"
"fmt"
"strconv"
"go-common/app/admin/main/member/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func officials(ctx *bm.Context) {
arg := &model.ArgOfficial{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.Pn <= 0 {
arg.Pn = 1
}
if arg.Ps <= 0 {
arg.Ps = 10
}
os, total, err := svc.Officials(ctx, arg)
if err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"officials": os,
"page": map[string]int{
"num": arg.Pn,
"size": arg.Ps,
"total": total,
},
}
ctx.JSON(res, nil)
}
func officialsExcel(ctx *bm.Context) {
arg := &model.ArgOfficial{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.Pn <= 0 {
arg.Pn = 1
}
if arg.Ps <= 0 {
arg.Ps = 10
}
os, _, err := svc.Officials(ctx, arg)
if err != nil {
ctx.JSON(nil, err)
return
}
data := make([][]string, 0, len(os))
data = append(data, []string{"完成认证时间", "用户ID", "昵称", "认证类型", "认证称号", "称号后缀"})
for _, of := range os {
fields := []string{
of.CTime.Time().Format("2006-01-02 15:04:05"),
strconv.FormatInt(of.Mid, 10),
of.Name,
model.OfficialRoleName(of.Role),
of.Title,
of.Desc,
}
data = append(data, fields)
}
buf := bytes.NewBuffer(nil)
w := csv.NewWriter(buf)
for _, record := range data {
if err := w.Write(record); err != nil {
ctx.JSON(nil, err)
return
}
}
w.Flush()
res := buf.Bytes()
ctx.Writer.Header().Set("Content-Type", "application/csv")
ctx.Writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.csv", "官方认证名单"))
ctx.Writer.Write([]byte("\xEF\xBB\xBF")) // 写 UTF-8 的 BOM 头,别删,删了客服就找上门了
ctx.Writer.Write(res)
}
func officialDocs(ctx *bm.Context) {
arg := &model.ArgOfficialDoc{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.Pn <= 0 {
arg.Pn = 1
}
if arg.Ps <= 0 {
arg.Ps = 10
}
ods, total, err := svc.OfficialDocs(ctx, arg)
if err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"officials": ods,
"page": map[string]int{
"num": arg.Pn,
"size": arg.Ps,
"total": total,
},
}
ctx.JSON(res, nil)
}
func officialDocsExcel(ctx *bm.Context) {
arg := &model.ArgOfficialDoc{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.Pn <= 0 {
arg.Pn = 1
}
if arg.Ps <= 0 {
arg.Ps = 10
}
ods, _, err := svc.OfficialDocs(ctx, arg)
if err != nil {
ctx.JSON(nil, err)
return
}
data := make([][]string, 0, len(ods))
data = append(data, []string{"申请时间", "认证类型", "用户ID", "用户昵称", "审核状态", "认证称号", "称号后缀", "操作人"})
for _, od := range ods {
fields := []string{
od.CTime.Time().Format("2006-01-02 15:04:05"),
model.OfficialRoleName(od.Role),
strconv.FormatInt(od.Mid, 10),
od.Name,
model.OfficialStateName(od.State),
od.Title,
od.Desc,
od.Uname,
}
data = append(data, fields)
}
buf := bytes.NewBuffer(nil)
w := csv.NewWriter(buf)
for _, record := range data {
if err := w.Write(record); err != nil {
ctx.JSON(nil, err)
return
}
}
w.Flush()
res := buf.Bytes()
ctx.Writer.Header().Set("Content-Type", "application/csv")
ctx.Writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.csv", "官方认证审核记录"))
ctx.Writer.Write([]byte("\xEF\xBB\xBF")) // 写 UTF-8 的 BOM 头,别删,删了客服就找上门了
ctx.Writer.Write(res)
}
func officialDoc(ctx *bm.Context) {
arg := &model.ArgMid{}
if err := ctx.Bind(arg); err != nil {
return
}
od, logs, block, spys, rn, sameCreditCodeMids, err := svc.OfficialDoc(ctx, arg.Mid)
if err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"official": od,
"logs": logs.Result,
"block": block,
"spys": spys,
"realname": rn,
"same_credit_code_mids": sameCreditCodeMids,
}
ctx.JSON(res, nil)
}
func officialDocAudit(ctx *bm.Context) {
arg := &model.ArgOfficialAudit{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.State == model.OfficialStateNoPass && arg.Reason == "" {
ctx.JSON(nil, ecode.RequestErr)
return
}
if arg.Source != "" {
arg.Reason = fmt.Sprintf("%s来源%s", arg.Reason, arg.Source)
}
ctx.JSON(nil, svc.OfficialDocAudit(ctx, arg))
}
func officialDocEdit(ctx *bm.Context) {
arg := &model.ArgOfficialEdit{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(nil, svc.OfficialDocEdit(ctx, arg))
}
func officialDocSubmit(ctx *bm.Context) {
arg := &model.ArgOfficialSubmit{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(nil, svc.OfficialDocSubmit(ctx, arg))
}

View File

@@ -0,0 +1,357 @@
package http
import (
"bytes"
"encoding/csv"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"time"
"go-common/app/admin/main/member/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"github.com/pkg/errors"
)
func realnameList(ctx *bm.Context) {
var (
arg = &model.ArgRealnameList{}
list []*model.RespRealnameApply
total int
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
if arg.PN <= 0 {
arg.PN = 1
}
if arg.PS <= 0 || arg.PS > 100 {
arg.PS = 10
}
// 没有指定实名认证申请状态State默认查询所有
if arg.State == "" {
arg.State = model.RealnameApplyStateAll
}
// 如果没有使用 mid || card 则取默认7天前作为 TSFrom
if arg.MID == 0 && arg.Card == "" {
if arg.TSFrom <= 0 {
arg.TSFrom = time.Now().Add(-time.Hour * 24 * 7).Unix()
}
}
// 如果使用 mid 或 card 进行查询,则查询所有时间段对应的数据
if arg.MID != 0 || arg.Card != "" {
arg.TSFrom = 0
arg.TSTo = 0
}
if list, total, err = svc.RealnameList(ctx, arg); err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"list": list,
"page": map[string]int{
"num": arg.PN,
"size": arg.PS,
"total": total,
},
}
ctx.JSON(res, nil)
}
func realnamePendingList(ctx *bm.Context) {
var (
arg = &model.ArgRealnamePendingList{}
list []*model.RespRealnameApply
total int
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
if arg.PN <= 0 {
arg.PN = 1
}
if arg.PS <= 0 || arg.PS > 100 {
arg.PS = 10
}
if list, total, err = svc.RealnamePendingList(ctx, arg); err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"list": list,
"page": map[string]int{
"num": arg.PN,
"size": arg.PS,
"total": total,
},
}
ctx.JSON(res, nil)
}
func realnameAuditApply(ctx *bm.Context) {
var (
arg = &model.ArgRealnameAuditApply{}
adminName string
adminID int64
data interface{}
ok bool
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
// 驳回必须有reason
if arg.Action == model.RealnameActionReject && arg.Reason == "" {
ctx.JSON(nil, ecode.RequestErr)
return
}
if data, ok = ctx.Get("username"); !ok {
ctx.JSON(nil, ecode.AccessDenied)
return
}
if adminName, ok = data.(string); !ok {
ctx.JSON(nil, ecode.ServerErr)
return
}
if data, ok = ctx.Get("uid"); !ok {
ctx.JSON(nil, ecode.AccessDenied)
return
}
if adminID, ok = data.(int64); !ok {
ctx.JSON(nil, ecode.ServerErr)
return
}
ctx.JSON(nil, svc.RealnameAuditApply(ctx, arg, adminName, adminID))
}
func realnameReasonList(ctx *bm.Context) {
var (
arg = &model.ArgRealnameReasonList{}
list []string
total int
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
if arg.PN <= 0 {
arg.PN = 1
}
if arg.PS <= 0 || arg.PS > 100 {
arg.PS = 20
}
if list, total, err = svc.RealnameReasonList(ctx, arg); err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"list": list,
"page": map[string]int{
"num": arg.PN,
"size": arg.PS,
"total": total,
},
}
ctx.JSON(res, nil)
}
func realnameSetReason(ctx *bm.Context) {
var (
arg = &model.ArgRealnameSetReason{}
)
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(nil, svc.RealnameSetReason(ctx, arg))
}
func realnameImage(ctx *bm.Context) {
var (
arg = &model.ArgRealnameImage{}
img []byte
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
if img, err = svc.FetchRealnameImage(ctx, arg.Token); err != nil {
ctx.JSON(nil, err)
return
}
ctx.Bytes(http.StatusOK, http.DetectContentType(img), img)
}
func realnameImagePreview(ctx *bm.Context) {
var (
arg = &model.ArgRealnameImagePreview{}
img []byte
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
if arg.BorderSize <= 0 {
arg.BorderSize = 1000
}
if img, err = svc.RealnameImagePreview(ctx, arg.Token, arg.BorderSize); err != nil {
ctx.JSON(nil, err)
return
}
ctx.Bytes(http.StatusOK, http.DetectContentType(img), img)
}
func realnameSearchCard(ctx *bm.Context) {
var (
arg = &model.ArgRealnameSearchCard{}
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
if len(arg.Cards) > 50 {
err = ecode.RequestErr
return
}
ctx.JSON(svc.RealnameSearchCard(ctx, arg.Cards, arg.CardType, arg.Country))
}
func realnameUnbind(ctx *bm.Context) {
var (
arg = &model.ArgMid{}
adminName string
adminID int64
data interface{}
ok bool
err error
)
if err = ctx.Bind(arg); err != nil {
return
}
if data, ok = ctx.Get("username"); !ok {
ctx.JSON(nil, ecode.AccessDenied)
return
}
if adminName, ok = data.(string); !ok {
ctx.JSON(nil, ecode.ServerErr)
return
}
if data, ok = ctx.Get("uid"); !ok {
ctx.JSON(nil, ecode.AccessDenied)
return
}
if adminID, ok = data.(int64); !ok {
ctx.JSON(nil, ecode.ServerErr)
return
}
ctx.JSON(nil, svc.RealnameUnbind(ctx, arg.Mid, adminName, adminID))
}
func realnameExport(ctx *bm.Context) {
arg := &model.ArgMids{}
if err := ctx.Bind(arg); err != nil {
return
}
if len(arg.Mid) > 1000 {
ctx.JSON(nil, ecode.RequestErr)
return
}
realnameExports, err := svc.RealnameExcel(ctx, arg.Mid)
if err != nil {
ctx.JSON(nil, err)
return
}
data := make([][]string, 0, len(realnameExports))
data = append(data, []string{"用户uid", "用户名", "昵称", "姓名", "手机号", "证件类型", "证件号"})
for _, user := range realnameExports {
fields := []string{
strconv.FormatInt(user.Mid, 10),
user.UserID,
user.Uname,
user.Realname,
user.Tel,
model.CardTypeString(user.CardType),
avoidescape(user.CardNum),
}
data = append(data, fields)
}
buf := bytes.NewBuffer(nil)
w := csv.NewWriter(buf)
for _, record := range data {
if err := w.Write(record); err != nil {
ctx.JSON(nil, err)
return
}
}
w.Flush()
res := buf.Bytes()
ctx.Writer.Header().Set("Content-Type", "application/csv")
ctx.Writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.csv", "实名认证导出"))
ctx.Writer.Write([]byte("\xEF\xBB\xBF")) // 写 UTF-8 的 BOM 头,别删,删了客服就找上门了
ctx.Writer.Write(res)
}
func avoidescape(in string) string {
return fmt.Sprintf("%s,", in)
}
func realnameSubmit(ctx *bm.Context) {
arg := &model.ArgRealnameSubmit{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(nil, svc.RealnameSubmit(ctx, arg))
}
func realnameFileUpload(c *bm.Context) {
arg := &model.ArgMid{}
if err := c.Bind(arg); err != nil {
return
}
mid := arg.Mid
defer c.Request.Form.Del("img") // 防止日志不出现
c.Request.ParseMultipartForm(32 << 20)
imgBytes, err := func() ([]byte, error) {
img := c.Request.FormValue("img")
if img != "" {
log.Info("Succeeded to parse img file from form value: mid: %d, length: %d", mid, len(img))
return []byte(img), nil
}
log.Warn("Failed to parse img file from form value, fallback to form file: mid: %d", mid)
f, _, err := c.Request.FormFile("img")
if err != nil {
return nil, errors.Wrapf(err, "parse img form file: mid: %d", mid)
}
defer f.Close()
data, err := ioutil.ReadAll(f)
if err != nil {
return nil, errors.Wrapf(err, "read img form file: mid: %d", mid)
}
if len(data) <= 0 {
return nil, errors.Wrapf(err, "form file data: mid: %d, length: %d", mid, len(data))
}
log.Info("Succeeded to parse file from form file: mid: %d, length: %d", mid, len(data))
return data, nil
}()
if err != nil {
log.Error("Failed to parse realname upload file: mid: %d: %+v", mid, err)
c.JSON(nil, ecode.RequestErr)
return
}
var resData struct {
SRC string `json:"token"`
}
if resData.SRC, err = svc.RealnameFileUpload(c, arg.Mid, imgBytes); err != nil {
log.Error("%+v", err)
c.JSON(nil, err)
return
}
c.JSON(resData, nil)
}

View File

@@ -0,0 +1,92 @@
package http
import (
"go-common/app/admin/main/member/model"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func review(ctx *bm.Context) {
arg := &model.ArgReview{}
if err := ctx.Bind(arg); err != nil {
return
}
ctx.JSON(svc.Review(ctx, arg))
}
func reviewList(ctx *bm.Context) {
arg := &model.ArgReviewList{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.IsMonitor = true
if arg.Pn <= 0 {
arg.Pn = 1
}
if arg.Ps <= 0 {
arg.Ps = 10
}
rws, total, err := svc.Reviews(ctx, arg)
if err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"reviews": rws,
"page": map[string]int{
"num": arg.Pn,
"size": arg.Ps,
"total": total,
},
}
ctx.JSON(res, nil)
}
func reviewFaceList(ctx *bm.Context) {
arg := &model.ArgReviewList{}
if err := ctx.Bind(arg); err != nil {
return
}
arg.IsMonitor = false
arg.Property = []int8{model.ReviewPropertyFace}
if arg.Pn <= 0 {
arg.Pn = 1
}
if arg.Ps <= 0 {
arg.Ps = 10
}
rws, total, err := svc.Reviews(ctx, arg)
if err != nil {
ctx.JSON(nil, err)
return
}
res := map[string]interface{}{
"reviews": rws,
"page": map[string]int{
"num": arg.Pn,
"size": arg.Ps,
"total": total,
},
}
ctx.JSON(res, nil)
}
func reviewAudit(ctx *bm.Context) {
arg := &model.ArgReviewAudit{}
if err := ctx.Bind(arg); err != nil {
return
}
if arg.BlockUser {
blockArg := model.ArgBatchBlock{}
if err := ctx.Bind(&blockArg); err != nil {
return
}
// yuzheng: 头像这里的封禁都作为小黑屋封禁
blockArg.Source = 2
if !blockArg.Validate() {
ctx.JSON(nil, ecode.RequestErr)
return
}
arg.ArgBatchBlock = blockArg
}
ctx.JSON(nil, svc.ReviewAudit(ctx, arg))
}