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,35 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
"go_test",
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/main/credit/cmd:all-srcs",
"//app/admin/main/credit/conf:all-srcs",
"//app/admin/main/credit/dao/account:all-srcs",
"//app/admin/main/credit/dao/blocked:all-srcs",
"//app/admin/main/credit/dao/manager:all-srcs",
"//app/admin/main/credit/dao/msg:all-srcs",
"//app/admin/main/credit/dao/relation:all-srcs",
"//app/admin/main/credit/dao/search:all-srcs",
"//app/admin/main/credit/dao/upload:all-srcs",
"//app/admin/main/credit/http:all-srcs",
"//app/admin/main/credit/model:all-srcs",
"//app/admin/main/credit/service:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,155 @@
#### credit-admin
##### Version 1.10.0
> 1.2018年风纪委硬币奖励
##### Version 1.9.0
> 1.接入 account-service gRPC服务
##### Version 1.8.1
> 1.fix search bug
##### Version 1.8.0
> 1.search 更新
##### Version 1.7.4
> 1.fix sync.WaitGroup
##### Version 1.7.3
> 1.增加案件列表、观点列表粉丝数
##### Version 1.7.2
> 1.增加封禁类型(恶意冒充他人)
##### Version 1.7.1
> 1.WebHook err 优化
##### Version 1.7.0
> 1.改为 metadata RemoteIP
##### Version 1.6.1
> 1.fix search update log
##### Version 1.6.0
> 1.接入Search v3 update
##### Version 1.5.0
> 1.接入Search v3
##### Version 1.4,7
> 1.新增动态、相簿、小视频类封禁
##### Version 1.4,6
> 1.变更老的bind参数验证
##### Version 1.4.5
> 1.es搜索变更域名
##### Version 1.4.4
> 1.产品变动小黑屋封禁理由
##### Version 1.4.3
> 1.add reason code (28、29)
##### Version 1.4.2
> 1.add reason code (27)
##### Version 1.4.1
> 1.move to main
##### Version 1.4.0
> 1.众裁举报理由变更
##### Version 1.3.10
> 1.使用account-service V7
##### Version 1.3.9
> 1.删除 “发布色情低俗信息”
> 2.新增 “破坏网络安全”、“发布虚假误导信息”
##### Version 1.3.8
> 1.更新“发布怂恿教唆信息”为“发布不适宜内容”
> 2.新增“发布青少年不良内容”
##### Version 1.3.7
> 1.fix case business_time filed type
##### Version 1.3.6
> 1.case 列表新增business_time
##### Version 1.3.4
> 1.delete statsd
##### Version 1.3.3
> 1.风纪委投票计数分级
##### Version 1.3.2
> 1.增加申诉webhook处理
##### Version 1.3.1
> 1. fix pager not nil bug
##### Version 1.3.0
> 1. http使用BM框架
##### Version 1.2.0
> 1. 增加manager平台的权限验证
##### Version 1.1.0
> 1. 案件自动提交的配置
##### Version 1.0.17
> 1. 导出数据排序
> 2. 并发导出mysql链接数bug
##### Version 1.0.16
> 1. expland get manager user ps.
##### Version 1.0.15
> 1. load manager admin users
> 2. 编辑惩罚列表公开时更新ublish_time字段
##### Version 1.0.14
> 1. fix_bug not model words
##### Version 1.0.13
> 1. 惩罚列表更新publish_time字段
##### Version 1.0.12
> 1. 删除封禁内容非必填
##### Version 1.0.11
> 1. 新增专栏理由
##### Version 1.0.10
> 1.公告show-time为空处理
##### Version 1.0.9
> 1.search mid 兼容
##### Version 1.0.8
> 1.kpi point start defult date
> 2.搜索返回ids 重构
##### Version 1.0.7
> 1.fix punish_type bug
##### Version 1.0.6
> 1.fix punish_type bug
##### Version 1.0.5
> 1.change_select_to_slave
##### Version 1.0.4
> 1.del opinion join
##### Version 1.0.3
> 1.fix juryer update info bug
##### Version 1.0.2
> 1.fix search model struct bug
##### Version 1.0.1
> 1.fix no return bug
##### Version 1.0.0
> 1.init project

View File

@@ -0,0 +1,13 @@
# Owner
zhaogangtao
wanghuan01
zhoujiahui
# Author
wangyuzhe
hejianbing
xiequan
# Reviewer
zhaogangtao
haoguanwei

View File

@@ -0,0 +1,21 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- hejianbing
- wanghuan01
- wangyuzhe
- xiequan
- zhaogangtao
- zhoujiahui
labels:
- admin
- admin/main/credit
- main
options:
no_parent_owners: true
reviewers:
- haoguanwei
- hejianbing
- wangyuzhe
- xiequan
- zhaogangtao

View File

@@ -0,0 +1,13 @@
#### credit-admin
##### 项目简介
> 1.信用体系管理后台服务
##### 编译环境
> 请只用golang v1.7.x以上版本编译执行。
##### 依赖包
> 1.公共包go-common
##### 特别说明
> 1.model目录可能会被其他项目引用请谨慎更改并通知各方。

View File

@@ -0,0 +1,45 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
)
go_binary(
name = "cmd",
embed = [":go_default_library"],
tags = ["automanaged"],
)
go_library(
name = "go_default_library",
srcs = ["main.go"],
data = [
"convey-test.toml",
"credit-admin-test.toml",
],
importpath = "go-common/app/admin/main/credit/cmd",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/http:go_default_library",
"//library/log:go_default_library",
"//library/net/trace: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,118 @@
# This is a TOML document. Boom.
version = "1.0.0"
[app]
key = "33ac033ce123e999"
secret = "0b2847315d32989a248294e350ac3ede"
[bfs]
#bucket = test
key = "221bce6492eba70f"
secret = "6eb80603e85842542f9736eb13b7e3"
#bucket = blocked
#key = "a45d5d3d38441095"
#secret = "a3690e9e11f7d356a445fe0d4ff8af"
[accClient]
timeout = "3s"
[xlog]
# dir = "/data/log/credit-admin"
stdout = true
# family = "credit-admin"
# [xlog.agent]
# taskID = "000069"
# proto = "unixgram"
# addr = "/var/run/lancer/collector.sock"
# chanSize = 10240
[bm]
addr = "0.0.0.0:6824"
maxListen = 10
timeout = "30s"
[httpClient]
key = "33ac033ce123e999"
secret = "0b2847315d32989a248294e350ac3ede"
dial = "1s"
timeout = "5s"
keepAlive = "60s"
[httpClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[rpcClient]
[rpcClient.account]
timeout = "30s"
[rpcClient.relation]
timeout = "30s"
[orm]
[orm.write]
dsn = "blocked:mUdFycLKSbvPgdE28lCveqN77SqsGOmy@tcp(172.16.33.205:3306)/blocked?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 5
idleTimeout = "4h"
[orm.read]
dsn = "blocked:mUdFycLKSbvPgdE28lCveqN77SqsGOmy@tcp(172.16.33.205:3306)/blocked?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 5
idleTimeout = "4h"
[host]
bfs = "http://172.16.0.141"
manager = "http://manager.bilibili.co"
msg = "http://message.bilibili.co"
#http://bfs.bilibili.co
[chanSize]
sysMsg = 999
[auth]
managerHost = "http://uat-manager.bilibili.co"
dashboardHost = "http://uat-dashboard-mng.bilibili.co"
dashboardCaller = "manager-go"
[auth.DsHTTPClient]
key = "manager-go"
secret = "949bbb2dd3178252638c2407578bc7ad"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.DsHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.MaHTTPClient]
key = "f6433799dbd88751"
secret = "36f8ddb1806207fe07013ab6a77a3935"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.MaHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.session]
sessionIDLength = 32
cookieLifeTime = 1800
cookieName = "mng-go"
domain = ".bilibili.co"
[auth.session.Memcache]
name = "go-business/auth"
proto = "tcp"
addr = "172.16.33.54:11211"
active = 10
idle = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"

View File

@@ -0,0 +1,120 @@
# This is a TOML document. Boom.
version = "1.0.0"
[app]
key = "33ac033ce123e999"
secret = "0b2847315d32989a248294e350ac3ede"
[bfs]
#bucket = test
key = "221bce6492eba70f"
secret = "6eb80603e85842542f9736eb13b7e3"
#bucket = blocked
#key = "a45d5d3d38441095"
#secret = "a3690e9e11f7d356a445fe0d4ff8af"
[xlog]
dir = "/data/log/credit-admin"
# family = "credit-admin"
# [xlog.agent]
# taskID = "000069"
# proto = "unixgram"
# addr = "/var/run/lancer/collector.sock"
# chanSize = 10240
[bm]
[bm.inner]
addr = "0.0.0.0:6824"
maxListen = 10
timeout = "1s"
[bm.local]
addr = "0.0.0.0:6825"
maxListen = 10
timeout = "1s"
[httpClient]
key = "33ac033ce123e999"
secret = "0b2847315d32989a248294e350ac3ede"
dial = "1s"
timeout = "5s"
keepAlive = "60s"
[httpClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[rpcClient]
[rpcClient.account]
group ="groupapp"
timeout = "30s"
[orm]
[orm.write]
dsn = "blocked:mUdFycLKSbvPgdE28lCveqN77SqsGOmy@tcp(172.16.33.205:3306)/blocked?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 5
idleTimeout = "4h"
[orm.read]
dsn = "blocked:mUdFycLKSbvPgdE28lCveqN77SqsGOmy@tcp(172.16.33.205:3306)/blocked?timeout=5s&readTimeout=5s&writeTimeout=5s&parseTime=true&loc=Local&charset=utf8,utf8mb4"
active = 5
idle = 5
idleTimeout = "4h"
[host]
bfs = "http://172.16.0.141"
manager = "http://manager.bilibili.co"
msg = "http://message.bilibili.co"
#http://bfs.bilibili.co
[chanSize]
sysMsg = 999
[auth]
managerHost = "http://uat-manager.bilibili.co"
dashboardHost = "http://uat-dashboard-mng.bilibili.co"
dashboardCaller = "manager-go"
[auth.DsHTTPClient]
key = "manager-go"
secret = "949bbb2dd3178252638c2407578bc7ad"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.DsHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.MaHTTPClient]
key = "f6433799dbd88751"
secret = "36f8ddb1806207fe07013ab6a77a3935"
dial = "1s"
timeout = "1s"
keepAlive = "60s"
[auth.MaHTTPClient.breaker]
window = "3s"
sleep = "100ms"
bucket = 10
ratio = 0.5
request = 100
[auth.session]
sessionIDLength = 32
cookieLifeTime = 1800
cookieName = "mng-go"
domain = ".bilibili.co"
[auth.session.Memcache]
name = "go-business/auth"
proto = "tcp"
addr = "172.16.33.54:11211"
active = 10
idle = 10
dialTimeout = "1s"
readTimeout = "1s"
writeTimeout = "1s"
idleTimeout = "80s"

View File

@@ -0,0 +1,46 @@
package main
import (
"flag"
"os"
"os/signal"
"syscall"
"time"
"go-common/app/admin/main/credit/conf"
"go-common/app/admin/main/credit/http"
"go-common/library/log"
"go-common/library/net/trace"
)
func main() {
flag.Parse()
// init conf,log,trace,stat,perf.
if err := conf.Init(); err != nil {
panic(err)
}
log.Init(conf.Conf.Xlog)
defer log.Close()
trace.Init(conf.Conf.Tracer)
defer trace.Close()
// service init
http.Init(conf.Conf)
// signal handler
log.Info("credit-admin start")
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
for {
s := <-c
log.Info("credit-admin get a signal %s", s.String())
switch s {
case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT:
time.Sleep(time.Second * 2)
log.Info("credit-admin exit")
return
case syscall.SIGHUP:
// TODO reload
default:
return
}
}
}

View File

@@ -0,0 +1,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["conf.go"],
importpath = "go-common/app/admin/main/credit/conf",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/conf:go_default_library",
"//library/database/orm: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/rpc:go_default_library",
"//library/net/rpc/warden:go_default_library",
"//library/net/trace:go_default_library",
"//vendor/github.com/BurntSushi/toml: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,132 @@
package conf
import (
"errors"
"flag"
"go-common/library/conf"
"go-common/library/database/orm"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
"go-common/library/net/rpc"
"go-common/library/net/rpc/warden"
"go-common/library/net/trace"
"github.com/BurntSushi/toml"
)
// Conf global variable.
var (
// config
confPath string
client *conf.Client
Conf = &Config{}
)
// Config struct of conf.
type Config struct {
// base
App *bm.App
BFS *BFS
// http
BM *bm.ServerConfig
// db
ORM *ORM
// host
Host *Host
// log
Xlog *log.Config
// tracer
Tracer *trace.Config
// rpc client
RPCClient *RPC
AccClient *warden.ClientConfig
// http client
HTTPClient *bm.ClientConfig
// chan
ChanSize *ChanSize
Auth *permit.Config
CoinClient *warden.ClientConfig
}
// ORM orm write and read config.
type ORM struct {
Write *orm.Config
Read *orm.Config
}
// Host host config .
type Host struct {
Bfs string
Manager string
Msg string
}
// ChanSize sysmsg channel size.
type ChanSize struct {
SysMsg int64
}
// BFS bfs config
type BFS struct {
Key string
Secret string
}
// RPC rpc client config.
type RPC struct {
Account *rpc.ClientConfig
Relation *rpc.ClientConfig
}
func local() (err error) {
_, err = toml.DecodeFile(confPath, &Conf)
return
}
func remote() (err error) {
if client, err = conf.New(); err != nil {
return
}
if err = load(); err != nil {
return
}
go func() {
for range client.Event() {
log.Info("config reload")
if load() != nil {
log.Error("config reload error (%v)", err)
}
}
}()
return
}
func load() (err error) {
var (
s string
ok bool
tmpConf *Config
)
if s, ok = client.Toml2(); !ok {
return errors.New("load config center error")
}
if _, err = toml.Decode(s, &tmpConf); err != nil {
return errors.New("could not decode config")
}
*Conf = *tmpConf
return
}
func init() {
flag.StringVar(&confPath, "conf", "", "default config path")
}
// Init int config
func Init() error {
if confPath != "" {
return local()
}
return remote()
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/credit/dao/account",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/model:go_default_library",
"//app/admin/main/credit/model/blocked:go_default_library",
"//app/service/main/account/api:go_default_library",
"//library/log:go_default_library",
"//library/sync/errgroup: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,82 @@
package account
import (
"context"
"sync"
"github.com/pkg/errors"
"go-common/app/admin/main/credit/conf"
creditMDL "go-common/app/admin/main/credit/model"
blocked "go-common/app/admin/main/credit/model/blocked"
accgrpc "go-common/app/service/main/account/api"
"go-common/library/log"
"go-common/library/sync/errgroup"
)
// Dao is account dao.
type Dao struct {
// grpc
accountClient accgrpc.AccountClient
}
// New is initial for account .
func New(c *conf.Config) (d *Dao) {
d = &Dao{}
var err error
if d.accountClient, err = accgrpc.NewClient(c.AccClient); err != nil {
panic(errors.WithMessage(err, "Failed to dial account service"))
}
return
}
// RPCInfo rpc info get by muti mid .
func (d *Dao) RPCInfo(c context.Context, mid int64) (res *accgrpc.InfoReply, err error) {
arg := &accgrpc.MidReq{Mid: mid}
if res, err = d.accountClient.Info3(c, arg); err != nil {
log.Error("d.accountClient.Info3 error(%v)", err)
}
return
}
// RPCInfos rpc info get by muti mid .
func (d *Dao) RPCInfos(c context.Context, mids []int64) (res map[int64]*accgrpc.Info, err error) {
var (
g errgroup.Group
l sync.RWMutex
args *accgrpc.MidsReq
accRes *accgrpc.InfosReply
)
mids = creditMDL.ArrayUnique(mids)
total := len(mids)
pageNum := total / blocked.AccMaxPageSize
if total%blocked.AccMaxPageSize != 0 {
pageNum++
}
res = make(map[int64]*accgrpc.Info, total)
for i := 0; i < pageNum; i++ {
start := i * blocked.AccMaxPageSize
end := (i + 1) * blocked.AccMaxPageSize
if end > total {
end = total
}
g.Go(func() (err error) {
args = &accgrpc.MidsReq{Mids: mids[start:end]}
if accRes, err = d.accountClient.Infos3(c, args); err != nil {
log.Error("d.accountClient.Infos3(%+v) error(%v)", mids[start:end], err)
err = nil
return
}
for mid, info := range accRes.Infos {
l.Lock()
res[mid] = info
l.Unlock()
}
return
})
}
if err = g.Wait(); err != nil {
log.Error("g.Wait error(%v)", err)
}
return
}

View File

@@ -0,0 +1,54 @@
package account
import (
"context"
"flag"
"os"
"testing"
"go-common/app/admin/main/credit/conf"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.account-law.credit-admin")
flag.Set("conf_appid", "main.account-law.credit-admin")
flag.Set("conf_token", "eKmbn2M4jvSyyjMEOywLFOQlX5ggRG9x")
flag.Set("tree_id", "5885")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_env", "10")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/convey-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}
func Test_RPCInfo(t *testing.T) {
Convey("return someting", t, func() {
res, err := d.RPCInfo(context.TODO(), 88889021)
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}
func Test_RPCInfos(t *testing.T) {
Convey("return someting", t, func() {
res, err := d.RPCInfos(context.TODO(), []int64{88889021})
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}

View File

@@ -0,0 +1,49 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//library/database/orm:go_default_library",
"//vendor/github.com/jinzhu/gorm:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/credit/dao/blocked",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//library/database/orm:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//vendor/github.com/jinzhu/gorm: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,63 @@
package blocked
import (
"context"
"go-common/app/admin/main/credit/conf"
"go-common/library/database/orm"
bm "go-common/library/net/http/blademaster"
"github.com/jinzhu/gorm"
)
// Dao struct info of Dao.
type Dao struct {
// mysql
ReadDB *gorm.DB
DB *gorm.DB
// http
client *bm.Client
// conf
c *conf.Config
}
// New new a Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// conf
c: c,
// http client
client: bm.NewClient(c.HTTPClient),
ReadDB: orm.NewMySQL(c.ORM.Read),
DB: orm.NewMySQL(c.ORM.Write),
}
d.initORM()
return
}
func (d *Dao) initORM() {
d.ReadDB.LogMode(true)
d.DB.LogMode(true)
}
// Close close dao.
func (d *Dao) Close() {
if d.ReadDB != nil {
d.ReadDB.Close()
}
if d.DB != nil {
d.DB.Close()
}
}
// Ping check connection of db , mc.
func (d *Dao) Ping(c context.Context) (err error) {
if d.ReadDB != nil {
err = d.ReadDB.DB().PingContext(c)
return
}
if d.DB != nil {
err = d.DB.DB().PingContext(c)
}
return
}

View File

@@ -0,0 +1,69 @@
package blocked
import (
"context"
"flag"
"os"
"testing"
"go-common/app/admin/main/credit/conf"
_ "go-common/library/database/orm"
_ "github.com/jinzhu/gorm"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.account-law.credit-admin")
flag.Set("conf_appid", "main.account-law.credit-admin")
flag.Set("conf_token", "eKmbn2M4jvSyyjMEOywLFOQlX5ggRG9x")
flag.Set("tree_id", "5885")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_env", "10")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/convey-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}
func WithDao(f func(d *Dao)) func() {
return func() {
f(d)
}
}
func WithMysql(f func(d *Dao)) func() {
return func() {
f(d)
}
}
func ctx() context.Context {
return context.Background()
}
func Test_initORM(t *testing.T) {
Convey("not need return", t, func() {
d.initORM()
})
}
func Test_Ping(t *testing.T) {
Convey("return someting", t, func() {
err := d.Ping(context.TODO())
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/credit/dao/manager",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/model:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster: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,131 @@
package manager
import (
"context"
"net/url"
"strconv"
"sync"
"go-common/app/admin/main/credit/conf"
"go-common/app/admin/main/credit/model"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/sync/errgroup"
)
const (
_managersURI = "/x/admin/manager/users"
_managerTotalURI = "/x/admin/manager/users/total"
)
// Dao struct info of Dao.
type Dao struct {
// http
client *bm.Client
// conf
c *conf.Config
managersURL string
managerTotalURL string
}
// New new a Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// conf
c: c,
// http client
client: bm.NewClient(c.HTTPClient),
}
d.managersURL = c.Host.Manager + _managersURI
d.managerTotalURL = c.Host.Manager + _managerTotalURI
return
}
// Managers get manager users info.
func (d *Dao) Managers(c context.Context) (manMap map[int64]string, err error) {
var (
count, page int64
g errgroup.Group
l sync.RWMutex
)
if count, err = d.ManagerTotal(c); err != nil {
log.Error("d.ManagerTotal error(%v)", err)
return
}
if count <= 0 {
return
}
manMap = make(map[int64]string, count)
ps := int64(500)
pageNum := count / ps
if count%ps != 0 {
pageNum++
}
for page = 1; page <= pageNum; page++ {
tmpPage := page
g.Go(func() (err error) {
mi, err := d.Manager(c, tmpPage, ps)
if err != nil {
log.Error("d.Manager(%d,%d) error(%v) ", tmpPage, ps, err)
err = nil
return
}
for _, v := range mi {
l.Lock()
manMap[v.OID] = v.Uname
l.Unlock()
}
return
})
}
g.Wait()
return
}
// Manager get manager users.
func (d *Dao) Manager(c context.Context, pn, ps int64) (mi []*model.MangerInfo, err error) {
params := url.Values{}
params.Set("pn", strconv.FormatInt(pn, 10))
params.Set("ps", strconv.FormatInt(ps, 10))
var res struct {
Code int `json:"code"`
Data *struct {
Items []*model.MangerInfo `json:"items"`
} `json:"data"`
}
if err = d.client.Get(c, d.managersURL, "", params, &res); err != nil {
log.Error("Manager(%s) error(%v)", d.managersURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Warn("Manager(%s) code(%d) data(%+v)", d.managersURL+"?"+params.Encode(), res.Code, res.Data)
return
}
if res.Data != nil {
mi = res.Data.Items
}
return
}
// ManagerTotal get manager user total.
func (d *Dao) ManagerTotal(c context.Context) (count int64, err error) {
params := url.Values{}
var res struct {
Code int `json:"code"`
Data *struct {
Total int64 `json:"total"`
} `json:"data"`
}
if err = d.client.Get(c, d.managerTotalURL, "", params, &res); err != nil {
log.Error("ManagerTotal(%s) error(%v)", d.managerTotalURL+"?"+params.Encode(), err)
return
}
if res.Code != 0 {
log.Warn("ManagerTotal(%s) code(%d) data(%+v)", d.managerTotalURL+"?"+params.Encode(), res.Code, res.Data)
return
}
if res.Data != nil {
count = res.Data.Total
}
return
}

View File

@@ -0,0 +1,72 @@
package manager
import (
"context"
"flag"
"os"
"testing"
"go-common/app/admin/main/credit/conf"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.account-law.credit-admin")
flag.Set("conf_appid", "main.account-law.credit-admin")
flag.Set("conf_token", "eKmbn2M4jvSyyjMEOywLFOQlX5ggRG9x")
flag.Set("tree_id", "5885")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_env", "10")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/convey-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}
func WithDao(f func(d *Dao)) func() {
return func() {
f(d)
}
}
func ctx() context.Context {
return context.Background()
}
func Test_Managers(t *testing.T) {
Convey("return someting", t, func() {
res, err := d.Managers(context.TODO())
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}
func Test_Manager(t *testing.T) {
Convey("return someting", t, func() {
res, err := d.Manager(context.TODO(), 1, 2)
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}
func Test_ManagerTotal(t *testing.T) {
Convey("return someting", t, func() {
res, err := d.ManagerTotal(context.TODO())
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}

View File

@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/credit/dao/msg",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata: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,68 @@
package msg
import (
"context"
"fmt"
"net/url"
"go-common/app/admin/main/credit/conf"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
)
const (
_msgURL = "/api/notify/send.user.notify.do"
)
// Dao struct info of Dao.
type Dao struct {
// http
client *bm.Client
// conf
c *conf.Config
msgURL string
}
// New new a Dao and return.
func New(c *conf.Config) (d *Dao) {
d = &Dao{
// conf
c: c,
// http client
client: bm.NewClient(c.HTTPClient),
}
d.msgURL = c.Host.Msg + _msgURL
return
}
// SendSysMsg send sys msg.
func (dao *Dao) SendSysMsg(c context.Context, mid int64, title string, context string) (err error) {
params := url.Values{}
params.Set("mc", "2_1_13")
params.Set("title", title)
params.Set("data_type", "4")
params.Set("context", context)
params.Set("mid_list", fmt.Sprintf("%d", mid))
var res struct {
Code int `json:"code"`
Data *struct {
Status int8 `json:"status"`
Remark string `json:"remark"`
} `json:"data"`
}
for i := 0; i <= 5; i++ {
if err = dao.client.Post(c, dao.msgURL, metadata.String(c, metadata.RemoteIP), params, &res); err != nil {
log.Error("sendMsgURI(%s) error(%v)", dao.msgURL+"?"+params.Encode(), err)
continue
}
if res.Code != 0 {
log.Error("sendMsgURI(%s) error(%v)", dao.msgURL+"?"+params.Encode(), res.Code)
err = ecode.Int(res.Code)
continue
}
return
}
return
}

View File

@@ -0,0 +1,45 @@
package msg
import (
"context"
"flag"
"os"
"testing"
"go-common/app/admin/main/credit/conf"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.account-law.credit-admin")
flag.Set("conf_appid", "main.account-law.credit-admin")
flag.Set("conf_token", "eKmbn2M4jvSyyjMEOywLFOQlX5ggRG9x")
flag.Set("tree_id", "5885")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_env", "10")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/convey-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}
func Test_SendSysMsg(t *testing.T) {
Convey("return someting", t, func() {
err := d.SendSysMsg(context.TODO(), 212213, "", "")
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,46 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/credit/dao/relation",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/service/main/relation/model:go_default_library",
"//app/service/main/relation/rpc/client:go_default_library",
"//library/log: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,33 @@
package relation
import (
"context"
"go-common/app/admin/main/credit/conf"
relationmdl "go-common/app/service/main/relation/model"
relationrpc "go-common/app/service/main/relation/rpc/client"
"go-common/library/log"
)
// Dao is account dao.
type Dao struct {
// rpc
relationRPC *relationrpc.Service
}
// New is initial for account .
func New(c *conf.Config) (d *Dao) {
d = &Dao{
relationRPC: relationrpc.New(c.RPCClient.Relation),
}
return
}
// RPCStats rpc info get by muti mid .
func (d *Dao) RPCStats(c context.Context, mids []int64) (res map[int64]*relationmdl.Stat, err error) {
arg := &relationmdl.ArgMids{Mids: mids}
if res, err = d.relationRPC.Stats(c, arg); err != nil {
log.Error("d.relationRPC.Stats error(%v)", err)
}
return
}

View File

@@ -0,0 +1,50 @@
package relation
import (
"context"
"flag"
"fmt"
"os"
"testing"
"go-common/app/admin/main/credit/conf"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.account-law.credit-admin")
flag.Set("conf_appid", "main.account-law.credit-admin")
flag.Set("conf_token", "eKmbn2M4jvSyyjMEOywLFOQlX5ggRG9x")
flag.Set("tree_id", "5885")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_env", "10")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/convey-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}
func TestDaoRPCStats(t *testing.T) {
Convey("return someting", t, func() {
res, err := d.RPCStats(context.TODO(), []int64{88889018, 2089809})
for _, re := range res {
fmt.Printf("re:%#v \n", re)
}
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/model/blocked:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/credit/dao/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/model:go_default_library",
"//app/admin/main/credit/model/blocked:go_default_library",
"//app/admin/main/credit/model/search:go_default_library",
"//library/database/elastic:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata: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,226 @@
package search
import (
"context"
"time"
"go-common/app/admin/main/credit/conf"
"go-common/app/admin/main/credit/model"
"go-common/app/admin/main/credit/model/blocked"
"go-common/app/admin/main/credit/model/search"
"go-common/library/database/elastic"
"go-common/library/log"
"go-common/library/net/metadata"
"github.com/pkg/errors"
)
// Dao .
type Dao struct {
elastic *elastic.Elastic
}
// New .
func New(c *conf.Config) (d *Dao) {
d = &Dao{
elastic: elastic.NewElastic(nil),
}
return
}
// Blocked get search blocked.
func (d *Dao) Blocked(c context.Context, arg *blocked.ArgBlockedSearch) (ids []int64, pager *blocked.Pager, err error) {
req := d.elastic.NewRequest(blocked.BusinessBlockedInfo).Index(blocked.TableBlockedInfo).Fields("id")
if arg.Keyword != blocked.SearchDefaultString {
req.WhereLike([]string{"origin_content"}, []string{arg.Keyword}, true, elastic.LikeLevelHigh)
}
if arg.UID != blocked.SearchDefaultNum {
req.WhereEq("uid", arg.UID)
}
if arg.OPID != blocked.SearchDefaultNum {
req.WhereEq("oper_id", arg.OPID)
}
if arg.OriginType != blocked.SearchDefaultNum {
req.WhereEq("origin_type", arg.OriginType)
}
if arg.BlockedType != blocked.SearchDefaultNum {
req.WhereEq("blocked_type", arg.BlockedType)
}
if arg.PublishStatus != blocked.SearchDefaultNum {
req.WhereEq("publish_status", arg.PublishStatus)
}
req.WhereRange("punish_time", arg.Start, arg.End, elastic.RangeScopeLcRc)
req.WhereEq("status", blocked.SearchDefaultStatus)
req.Pn(arg.PN).Ps(arg.PS).Order(arg.Order, arg.Sort)
var res *search.ReSearchData
if err = req.Scan(c, &res); err != nil {
err = errors.Errorf("elastic search(%s) error(%v)", req.Params(), err)
return
}
ids, pager = pagerExtra(res)
return
}
// Publish get search publish.
func (d *Dao) Publish(c context.Context, arg *blocked.ArgPublishSearch) (ids []int64, pager *blocked.Pager, err error) {
req := d.elastic.NewRequest(blocked.BusinessBlockedPublish).Index(blocked.TableBlockedPublish).Fields("id")
if arg.Keyword != blocked.SearchDefaultString {
req.WhereLike([]string{"title", "sub_title"}, []string{arg.Keyword}, true, elastic.LikeLevelHigh)
}
if arg.Type != blocked.SearchDefaultNum {
req.WhereEq("ptype", arg.Type)
}
req.WhereRange("show_time", arg.ShowFrom, arg.ShowTo, elastic.RangeScopeLcRc)
req.WhereEq("status", blocked.SearchDefaultStatus)
req.Pn(arg.PN).Ps(arg.PS).Order(arg.Order, arg.Sort)
var res *search.ReSearchData
if err = req.Scan(c, &res); err != nil {
err = errors.Errorf("elastic search(%s) error(%v)", req.Params(), err)
return
}
ids, pager = pagerExtra(res)
return
}
// Case get search case.
func (d *Dao) Case(c context.Context, arg *blocked.ArgCaseSearch) (ids []int64, pager *blocked.Pager, err error) {
req := d.elastic.NewRequest(blocked.BusinessBlockedCase).Index(blocked.TableBlockedCase).Fields("id")
if arg.Keyword != blocked.SearchDefaultString {
req.WhereLike([]string{"origin_content"}, []string{arg.Keyword}, true, elastic.LikeLevelHigh)
}
if arg.OriginType != blocked.SearchDefaultNum {
req.WhereEq("origin_type", arg.OriginType)
}
if arg.Status != blocked.SearchDefaultNum {
req.WhereEq("status", arg.Status)
}
if arg.CaseType != blocked.SearchDefaultNum {
req.WhereEq("case_type", arg.CaseType)
}
if arg.UID != blocked.SearchDefaultNum {
req.WhereEq("mid", arg.UID)
}
if arg.OPID != blocked.SearchDefaultNum {
req.WhereEq("oper_id", arg.OPID)
}
req.WhereRange("start_time", arg.TimeFrom, arg.TimeTo, elastic.RangeScopeLcRc)
req.Pn(arg.PN).Ps(arg.PS).Order(arg.Order, arg.Sort)
var res *search.ReSearchData
if err = req.Scan(c, &res); err != nil {
err = errors.Errorf("elastic search(%s) error(%v)", req.Params(), err)
return
}
ids, pager = pagerExtra(res)
return
}
// Jury get search jury.
func (d *Dao) Jury(c context.Context, arg *blocked.ArgJurySearch) (ids []int64, pager *blocked.Pager, err error) {
req := d.elastic.NewRequest(blocked.BusinessBlockedJury).Index(blocked.TableBlockedJury).Fields("id")
if arg.UID != blocked.SearchDefaultNum {
req.WhereEq("mid", arg.UID)
}
if arg.Status != blocked.SearchDefaultNum {
req.WhereEq("status", arg.Status)
}
if arg.Black != blocked.SearchDefaultNum {
req.WhereEq("black", arg.Black)
}
req.WhereRange("expired", arg.ExpiredFrom, arg.ExpiredTo, elastic.RangeScopeLcRc)
req.Pn(arg.PN).Ps(arg.PS).Order(arg.Order, arg.Sort)
var res *search.ReSearchData
if err = req.Scan(c, &res); err != nil {
err = errors.Errorf("elastic search(%s) error(%v)", req.Params(), err)
return
}
ids, pager = pagerExtra(res)
return
}
// Opinion get search opinion.
func (d *Dao) Opinion(c context.Context, arg *blocked.ArgOpinionSearch) (ids []int64, pager *blocked.Pager, err error) {
req := d.elastic.NewRequest(blocked.BusinessBlockedOpinion).Index(blocked.TableBlockedOpinion).Fields("id")
if arg.UID != blocked.SearchDefaultNum {
req.WhereEq("mid", arg.UID)
}
if arg.CID != blocked.SearchDefaultNum {
req.WhereEq("cid", arg.CID)
}
if arg.Vote != blocked.SearchDefaultNum {
req.WhereEq("vote", arg.Vote)
}
if arg.State != blocked.SearchDefaultNum {
req.WhereEq("state", arg.State)
}
req.Pn(arg.PN).Ps(arg.PS).Order(arg.Order, arg.Sort)
var res *search.ReSearchData
if err = req.Scan(c, &res); err != nil {
err = errors.Errorf("elastic search(%s) error(%v)", req.Params(), err)
return
}
ids, pager = pagerExtra(res)
return
}
// KPIPoint get search kpi point.
func (d *Dao) KPIPoint(c context.Context, arg *blocked.ArgKpiPointSearch) (ids []int64, pager *blocked.Pager, err error) {
var (
dayFromT, dayToT time.Time
dayFrom, dayTo string
)
req := d.elastic.NewRequest(blocked.BusinessBlockedKpiPoint).Index(blocked.TableBlockedKpiPoint).Fields("id")
if arg.UID != blocked.SearchDefaultNum {
req.WhereEq("mid", arg.UID)
}
if arg.Start != blocked.SearchDefaultString {
if dayFromT, err = time.ParseInLocation(model.TimeFormatSec, arg.Start, time.Local); err != nil {
err = errors.Errorf("time.ParseInLocation(%s) error(%v)", arg.Start, err)
return
}
dayFrom = dayFromT.Format(model.TimeFormatDay)
}
if arg.End != blocked.SearchDefaultString {
if dayToT, err = time.ParseInLocation(model.TimeFormatSec, arg.End, time.Local); err != nil {
err = errors.Errorf("time.ParseInLocation(%s) error(%v)", arg.End, err)
return
}
dayTo = dayToT.Format(model.TimeFormatDay)
}
req.WhereRange("day", dayFrom, dayTo, elastic.RangeScopeLcRc)
req.Pn(arg.PN).Ps(arg.PS).Order(arg.Order, arg.Sort)
var res *search.ReSearchData
if err = req.Scan(c, &res); err != nil {
err = errors.Errorf("elastic search(%s) error(%v)", req.Params(), err)
return
}
ids, pager = pagerExtra(res)
return
}
// SearchUpdate update about seach data.
func (d *Dao) SearchUpdate(c context.Context, appid string, table string, data []interface{}) (err error) {
us := d.elastic.NewUpdate(appid)
for _, v := range data {
us.AddData(table, v)
}
if err = us.Do(c); err != nil {
log.Info("appid(%s) table(%s) params(%s) ip(%s) search blocked update error(%v)", appid, table, us.Params(), metadata.String(c, metadata.RemoteIP), err)
}
return
}
func pagerExtra(res *search.ReSearchData) (ids []int64, pager *blocked.Pager) {
for _, v := range res.Result {
ids = append(ids, v.ID)
}
if res.Page != nil {
pager = &blocked.Pager{
Total: res.Page.Total,
PN: res.Page.PN,
PS: res.Page.PS,
Sort: res.Sort,
Order: res.Order,
}
}
return
}

View File

@@ -0,0 +1,114 @@
package search
import (
"context"
"flag"
"os"
"testing"
"go-common/app/admin/main/credit/conf"
"go-common/app/admin/main/credit/model/blocked"
. "github.com/smartystreets/goconvey/convey"
)
var d *Dao
func TestMain(m *testing.M) {
if os.Getenv("DEPLOY_ENV") != "" {
flag.Set("app_id", "main.account-law.credit-admin")
flag.Set("conf_appid", "main.account-law.credit-admin")
flag.Set("conf_token", "eKmbn2M4jvSyyjMEOywLFOQlX5ggRG9x")
flag.Set("tree_id", "5885")
flag.Set("conf_version", "docker-1")
flag.Set("deploy_env", "uat")
flag.Set("conf_env", "10")
flag.Set("conf_host", "config.bilibili.co")
flag.Set("conf_path", "/tmp")
flag.Set("region", "sh")
flag.Set("zone", "sh001")
} else {
flag.Set("conf", "../../cmd/convey-test.toml")
}
flag.Parse()
if err := conf.Init(); err != nil {
panic(err)
}
d = New(conf.Conf)
os.Exit(m.Run())
}
func TestDao_Blocked(t *testing.T) {
arg := &blocked.ArgBlockedSearch{Order: "id"}
Convey("return someting", t, func() {
ids, pagers, err := d.Blocked(context.TODO(), arg)
So(err, ShouldBeNil)
So(len(ids), ShouldBeGreaterThanOrEqualTo, 0)
So(pagers, ShouldNotBeNil)
})
}
func TestDao_Publish(t *testing.T) {
arg := &blocked.ArgPublishSearch{Order: "id"}
Convey("return someting", t, func() {
ids, pagers, err := d.Publish(context.TODO(), arg)
So(err, ShouldBeNil)
So(len(ids), ShouldBeGreaterThanOrEqualTo, 0)
So(pagers, ShouldNotBeNil)
})
}
func Test_Case(t *testing.T) {
arg := &blocked.ArgCaseSearch{Order: "id"}
Convey("return someting", t, func() {
ids, pagers, err := d.Case(context.TODO(), arg)
So(err, ShouldBeNil)
So(len(ids), ShouldBeGreaterThanOrEqualTo, 0)
So(pagers, ShouldNotBeNil)
})
}
func Test_Jury(t *testing.T) {
arg := &blocked.ArgJurySearch{Order: "id"}
Convey("return someting", t, func() {
ids, pagers, err := d.Jury(context.TODO(), arg)
So(err, ShouldBeNil)
So(len(ids), ShouldBeGreaterThanOrEqualTo, 0)
So(pagers, ShouldNotBeNil)
})
}
func Test_Opinion(t *testing.T) {
arg := &blocked.ArgOpinionSearch{Order: "id"}
Convey("return someting", t, func() {
ids, pagers, err := d.Opinion(context.TODO(), arg)
So(err, ShouldBeNil)
So(len(ids), ShouldBeGreaterThanOrEqualTo, 0)
So(pagers, ShouldNotBeNil)
})
}
func Test_KPIPoint(t *testing.T) {
arg := &blocked.ArgKpiPointSearch{Order: "id", Start: "2006-01-02 15:04:05", End: "2019-01-02 15:04:05"}
Convey("return someting", t, func() {
ids, pagers, err := d.KPIPoint(context.TODO(), arg)
So(err, ShouldBeNil)
So(len(ids), ShouldBeGreaterThanOrEqualTo, 0)
So(pagers, ShouldNotBeNil)
})
}
func Test_BlockedUpdate(t *testing.T) {
single := map[string]interface{}{
"id": 1,
"oper_id": 1,
"status": 1,
"black": 1,
}
var multiple []interface{}
multiple = append(multiple, single)
Convey("return someting", t, func() {
err := d.SearchUpdate(context.TODO(), "block_info", "blocked_info", multiple)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,47 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["dao_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
"//vendor/gopkg.in/h2non/gock.v1:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = ["dao.go"],
importpath = "go-common/app/admin/main/credit/dao/upload",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster: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,96 @@
package upload
import (
"context"
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"fmt"
"hash"
"io"
"net/http"
"strconv"
"go-common/app/admin/main/credit/conf"
"go-common/library/log"
httpx "go-common/library/net/http/blademaster"
)
const (
_uploadURL = "/bfs/%s/%s"
_template = "%s\n%s\n%s\n%d\n"
_method = "PUT"
_bucket = "test" //blocked
)
// Dao .
type Dao struct {
key string
secret string
host string
client *httpx.Client
}
// New .
func New(c *conf.Config) (d *Dao) {
d = &Dao{
key: c.BFS.Key,
secret: c.BFS.Secret,
host: c.Host.Bfs,
client: httpx.NewClient(c.HTTPClient),
}
return
}
// Upload upload picture or log file to bfs
func (d *Dao) Upload(c context.Context, fileName, fileType string, expire int64, body io.Reader) (location string, err error) {
var (
url string
req *http.Request
resp *http.Response
code int
)
client := &http.Client{}
url = fmt.Sprintf(d.host+_uploadURL, _bucket, fileName)
if req, err = http.NewRequest(_method, url, body); err != nil {
log.Error("http.NewRequest() Upload(%v) error(%v)", url, err)
return
}
authorization := authorize(d.key, d.secret, _method, _bucket, fileName, expire)
req.Header.Set("Host", d.host)
req.Header.Add("Date", fmt.Sprint(expire))
req.Header.Add("Authorization", authorization)
req.Header.Add("Content-Type", fileType)
resp, err = client.Do(req)
if err != nil {
log.Error("resp.Do(%s) error(%v)", url, err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err = fmt.Errorf("status code error:%v", resp.StatusCode)
return
}
code, err = strconv.Atoi(resp.Header.Get("code"))
if err != nil || code != 200 {
err = fmt.Errorf("response code error:%v", code)
return
}
location = resp.Header.Get("Location")
return
}
// authorize returns authorization for upload file to bfs
func authorize(key, secret, method, bucket, file string, expire int64) (authorization string) {
var (
content string
mac hash.Hash
signature string
)
content = fmt.Sprintf(_template, method, bucket, file, expire)
mac = hmac.New(sha1.New, []byte(secret))
mac.Write([]byte(content))
signature = base64.StdEncoding.EncodeToString(mac.Sum(nil))
authorization = fmt.Sprintf("%s:%s:%d", key, signature, expire)
return
}

View File

@@ -0,0 +1,46 @@
package upload
import (
"context"
"flag"
"path/filepath"
"strings"
"testing"
"go-common/app/admin/main/credit/conf"
. "github.com/smartystreets/goconvey/convey"
"gopkg.in/h2non/gock.v1"
)
var d *Dao
func init() {
dir, _ := filepath.Abs("../cmd/convey-test.toml")
flag.Set("conf", dir)
conf.Init()
d = New(conf.Conf)
}
func WithDao(f func(d *Dao)) func() {
return func() {
f(d)
}
}
func httpMock(method, url string) *gock.Request {
r := gock.New(url)
r.Method = strings.ToUpper(method)
return r
}
func ctx() context.Context {
return context.Background()
}
func Test_Upload(t *testing.T) {
Convey("return someting", t, func() {
_, err := d.Upload(context.TODO(), "blocked_info", "", 12313, nil)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1,50 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"blocked.go",
"common.go",
"export.go",
"http.go",
"jury.go",
"labour.go",
"upload.go",
],
importpath = "go-common/app/admin/main/credit/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/model:go_default_library",
"//app/admin/main/credit/model/blocked:go_default_library",
"//app/admin/main/credit/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/metadata:go_default_library",
"//library/time:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/jinzhu/gorm: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,467 @@
package http
import (
"context"
"fmt"
"time"
"go-common/app/admin/main/credit/model"
"go-common/app/admin/main/credit/model/blocked"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
xtime "go-common/library/time"
"go-common/library/xstr"
)
// infos get info list.
func infos(c *bm.Context) {
v := new(blocked.ArgBlockedSearch)
err := c.Bind(v)
if err != nil {
return
}
info, pager, err := creSvc.Infos(c, v)
if err != nil {
log.Error("creSvc.Infos(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
if len(info) == 0 {
httpData(c, nil, pager)
return
}
httpData(c, info, pager)
}
// infoByID get info by id.
func infoByID(c *bm.Context) {
var err error
v := new(struct {
ID int64 `form:"id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Info{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.infoByID error(%v)", err)
httpCode(c, err)
return
}
httpData(c, nil, nil)
return
}
if item != nil {
info, err := creSvc.UserInfo(c, item.UID)
if err != nil {
log.Error("creSvc.UserInfo error(%v)", err)
err = nil
}
if info != nil {
item.UName = info.Info.Name
}
item.ReasonTypeDesc = blocked.ReasonTypeDesc(item.ReasonType)
item.BlockedDaysDesc = blocked.BDaysDesc(item.BlockedDays, item.MoralNum, item.PunishType, item.BlockedForever)
item.PublishStatusDesc = blocked.PStatusDesc[item.PublishStatus]
item.OriginTypeDesc = blocked.OriginTypeDesc[item.OriginType]
item.BlockedTypeDesc = blocked.BTypeDesc[item.BlockedType]
}
httpData(c, item, nil)
}
// upInfo update info.
func upInfo(c *bm.Context) {
var err error
v := new(blocked.ArgUpInfo)
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Info{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
log.Error("http.blcokedInfoByID(%d) error(%v)", v.ID, err)
httpCode(c, err)
return
}
var data map[string]interface{}
switch {
case item.PublishStatus == blocked.StatusClose && v.Status == blocked.StatusOpen:
data = map[string]interface{}{
"origin_content_modify": v.Content,
"publish_status": v.Status,
"oper_id": v.OID,
"publish_time": xtime.Time(time.Now().Unix()),
}
default:
data = map[string]interface{}{
"origin_content_modify": v.Content,
"publish_status": v.Status,
"oper_id": v.OID,
}
}
if err = creSvc.DB.Model(&blocked.Info{}).Where("id = ?", v.ID).Updates(data).Error; err != nil {
log.Error("s.dao.UpInfo(%v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_upInfo:%+v", v)
var multiple []interface{}
single := map[string]interface{}{
"id": item.ID,
"oper_id": v.OID,
"status": item.Status,
"publish_status": v.Status,
}
multiple = append(multiple, single)
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedInfo, blocked.TableBlockedInfo, multiple)
})
httpCode(c, nil)
}
func delInfo(c *bm.Context) {
var err error
v := new(struct {
IDS []int64 `form:"ids,split" validate:"min=1,max=100"`
OID int64 `form:"op_id" validate:"required"`
Status int8 `form:"status" default:"1"`
})
if err = c.Bind(v); err != nil {
return
}
items := []*blocked.Info{}
if err = creSvc.ReadDB.Where("id IN (?)", v.IDS).Find(&items).Error; err != nil {
log.Error("http.blcokedInfoByIDs(%s) error(%v)", xstr.JoinInts(v.IDS), err)
httpCode(c, err)
return
}
if err = creSvc.DB.Model(&blocked.Info{}).Where("id IN (?)", v.IDS).Updates(map[string]interface{}{"status": v.Status, "oper_id": v.OID}).Error; err != nil {
log.Error("s.dao.delInfo(%v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_delInfo:%+v", v)
var multiple []interface{}
for _, item := range items {
single := map[string]interface{}{
"id": item.ID,
"oper_id": v.OID,
"status": v.Status,
"publish_status": item.PublishStatus,
}
multiple = append(multiple, single)
}
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedInfo, blocked.TableBlockedInfo, multiple)
})
httpCode(c, nil)
}
// upInfoStatus update info publish_status.
func upInfoStatus(c *bm.Context) {
var err error
v := new(blocked.ArgUpStatus)
if err = c.Bind(v); err != nil {
return
}
items := []*blocked.Info{}
if err = creSvc.ReadDB.Where("id IN (?)", v.IDS).Find(&items).Error; err != nil {
log.Error("http.blcokedInfoByIDs(%s) error(%v)", xstr.JoinInts(v.IDS), err)
httpCode(c, err)
return
}
if err = creSvc.DB.Model(&blocked.Info{}).Where("id IN (?)", v.IDS).Updates(
map[string]interface{}{
"oper_id": v.OID,
"publish_status": v.Status,
"publish_time": xtime.Time(time.Now().Unix()),
}).Error; err != nil {
log.Error("creSvc.upInfoStatus(%v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_upInfoStatus:%+v", v)
var multiple []interface{}
for _, item := range items {
single := map[string]interface{}{
"id": item.ID,
"oper_id": v.OID,
"status": item.Status,
"publish_status": v.Status,
}
multiple = append(multiple, single)
}
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedInfo, blocked.TableBlockedInfo, multiple)
})
httpCode(c, nil)
}
// infosEx export info data.
func infosEx(c *bm.Context) {
v := new(blocked.ArgBlockedSearch)
if err := c.Bind(v); err != nil {
return
}
list, err := creSvc.InfosEx(c, v)
if err != nil {
log.Error("creSvc.InfosEx error(%v)", err)
httpCode(c, err)
return
}
re, err := blocked.DealInfo(list)
if err != nil {
log.Error("blocked.DealInfo error(%v)", err)
httpCode(c, err)
return
}
outBuf(c, creSvc.FormatCSV(re), fmt.Sprintf("%s-%s", time.Now().Format(model.TimeFormatDay), "blocked-info"))
}
func publishs(c *bm.Context) {
v := new(blocked.ArgPublishSearch)
if err := c.Bind(v); err != nil {
return
}
publish, pager, err := creSvc.Publishs(c, v)
if err != nil {
log.Error("creSvc.Publishs(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
if len(publish) == 0 {
httpData(c, nil, pager)
return
}
httpData(c, publish, pager)
}
// publishByID get publish by id.
func publishByID(c *bm.Context) {
var err error
v := new(struct {
ID int64 `form:"id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Publish{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.publishByID error(%v)", err)
httpCode(c, err)
return
}
httpData(c, nil, nil)
return
}
if item != nil {
item.PublishTypeDesc = blocked.PTypeDesc[item.Type]
item.PublishStatusDesc = blocked.PStatusDesc[item.PublishStatus]
item.StickStatusDesc = blocked.SStatusDesc[item.StickStatus]
}
httpData(c, item, nil)
}
func addPublish(c *bm.Context) {
var err error
v := new(blocked.ArgPublish)
if err = c.Bind(v); err != nil {
return
}
publish := &blocked.Publish{
Title: v.Title,
SubTitle: v.SubTitle,
PublishStatus: v.PublishStatus,
StickStatus: v.StickStatus,
Content: v.Content,
URL: v.URL,
Type: v.PType,
OPID: v.OID,
ShowTime: xtime.Time(time.Now().Unix()),
}
if v.ShowTime != "" {
var tm time.Time
tm, err = time.ParseInLocation(model.TimeFormatSec, v.ShowTime, time.Local)
if err == nil {
publish.ShowTime = xtime.Time(tm.Unix())
}
}
if err = creSvc.DB.Create(publish).Error; err != nil {
log.Error("creSvc.AddPublish(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_addPublish:%+v", v)
httpCode(c, nil)
}
func upPublish(c *bm.Context) {
var err error
v := new(blocked.ArgPublish)
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Publish{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
log.Error("http.publishByID(%d) error(%v)", v.ID, err)
httpCode(c, err)
return
}
var showTime xtime.Time
tm, err := time.ParseInLocation(model.TimeFormatSec, v.ShowTime, time.Local)
if err == nil {
showTime = xtime.Time(tm.Unix())
}
if err = creSvc.DB.Model(&blocked.Publish{}).Where("id = ?", v.ID).
Updates(
map[string]interface{}{
"title": v.Title,
"sub_title": v.SubTitle,
"publish_status": v.PublishStatus,
"stick_status": v.StickStatus,
"content": v.Content,
"url": v.URL,
"ptype": v.PType,
"show_time": showTime,
"oper_id": v.OID,
}).Error; err != nil {
log.Error("creSvc.UpPublish(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_upPublish:%+v", v)
var multiple []interface{}
single := map[string]interface{}{
"id": v.ID,
"title": v.Title,
"sub_title": v.SubTitle,
"oper_id": v.OID,
"ptype": v.PType,
"show_time": showTime.Time().Format(model.TimeFormatSec),
"status": item.Status,
}
multiple = append(multiple, single)
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedPublish, blocked.TableBlockedPublish, multiple)
})
httpCode(c, nil)
}
func delPublish(c *bm.Context) {
var err error
v := new(struct {
IDS []int64 `form:"ids,split" validate:"required"`
Status int8 `form:"status" default:"1"`
OID int64 `form:"op_id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.DB.Model(&blocked.Publish{}).Where(v.IDS).Updates(map[string]interface{}{"status": v.Status, "oper_id": v.OID}).Error; err != nil {
httpCode(c, err)
return
}
log.Info("business_delPublish:%+v", v)
var multiple []interface{}
for _, id := range v.IDS {
single := map[string]interface{}{
"id": id,
"oper_id": v.OID,
"status": v.Status,
}
multiple = append(multiple, single)
}
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedPublish, blocked.TableBlockedPublish, multiple)
})
httpCode(c, nil)
}
func notices(c *bm.Context) {
var (
err error
order = "id"
sort = "DESC"
)
v := new(struct {
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"20"`
})
if err = c.Bind(v); err != nil {
return
}
count := int(0)
items := []*blocked.Notice{}
pager := &blocked.Pager{
Total: count,
PN: v.PN,
PS: v.PS,
Order: order,
Sort: sort,
}
if err = creSvc.ReadDB.Offset((v.PN - 1) * v.PS).Limit(v.PS).Order(fmt.Sprintf("%s %s", order, sort)).Find(&items).Error; err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.notices error(%v)", err)
httpData(c, nil, nil)
return
}
httpData(c, nil, pager)
return
}
if err = creSvc.ReadDB.Model(&blocked.Notice{}).Count(&count).Error; err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.notices count error(%v)", err)
httpData(c, nil, nil)
return
}
httpData(c, nil, pager)
return
}
pager.Total = count
for _, v := range items {
v.StatusDesc = blocked.NoticeStateDesc[v.Status]
v.OPName = creSvc.Managers[v.OperID]
}
httpData(c, items, pager)
}
func addNotice(c *bm.Context) {
var err error
v := new(struct {
Content string `form:"content" validate:"required"`
URL string `form:"url" validate:"required"`
OID int64 `form:"op_id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.DB.Model(&blocked.Notice{}).Create(&blocked.Notice{Content: v.Content, URL: v.URL, OperID: v.OID}).Error; err != nil {
log.Error("creSvc.addNotice(%v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_addNotice:%+v", v)
httpCode(c, nil)
}
func upNoticeStatus(c *bm.Context) {
var err error
v := new(struct {
ID int `form:"id" validate:"required"`
Status int8 `form:"status" validate:"min=0,max=1"`
OID int `form:"op_id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.DB.Model(&blocked.Notice{}).Where("id=?", v.ID).Updates(map[string]interface{}{"status": v.Status, "oper_id": v.OID}).Error; err != nil {
log.Error("creSvc.upNoticeStatus(%v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_upNoticeStatus:%+v", v)
httpCode(c, nil)
}

View File

@@ -0,0 +1,29 @@
package http
import (
"go-common/app/admin/main/credit/model/blocked"
bm "go-common/library/net/http/blademaster"
)
func httpData(c *bm.Context, data interface{}, pager *blocked.Pager) {
res := make(map[string]interface{})
if data == nil {
data = struct{}{}
}
if pager == nil {
pager = &blocked.Pager{}
}
res["data"] = data
res["pager"] = &blocked.Pager{
Total: pager.Total,
PN: pager.PN,
PS: pager.PS,
Order: pager.Order,
Sort: pager.Sort,
}
c.JSONMap(res, nil)
}
func httpCode(c *bm.Context, err error) {
c.JSON(nil, err)
}

View File

@@ -0,0 +1,14 @@
package http
import (
"fmt"
bm "go-common/library/net/http/blademaster"
)
func outBuf(c *bm.Context, buf []byte, name string) {
c.Writer.Header().Set("Content-Type", "application/csv")
c.Writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.csv", name))
c.Writer.Write(buf)
}

View File

@@ -0,0 +1,124 @@
package http
import (
"net/http"
"go-common/app/admin/main/credit/conf"
"go-common/app/admin/main/credit/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
)
var (
authSvc *permit.Permit
creSvc *service.Service
)
// Init http server
func Init(c *conf.Config) {
initService(c)
engine := bm.DefaultServer(c.BM)
innerRouter(engine)
// init internal server
if err := engine.Start(); err != nil {
log.Error("engine.Start error(%v)", err)
panic(err)
}
}
// initService init service
func initService(c *conf.Config) {
creSvc = service.New(c)
authSvc = permit.New(c.Auth)
}
// innerRouter
func innerRouter(e *bm.Engine) {
// ping monitor
e.Ping(ping)
// internal api
bg := e.Group("/x/admin/credit/blocked")
{
// info
bg.GET("/info", authSvc.Permit("BLACK_HOUSE_BLOCKED_INFO"), infos) // 封禁列表
bg.GET("/info/id", authSvc.Permit("BLACK_HOUSE_BLOCKED_INFO_ID"), infoByID) // 封禁信息详情
bg.POST("/info/up", authSvc.Permit("BLACK_HOUSE_BLOCKED_INFO_UP"), upInfo) // 编辑封禁列表
bg.POST("/info/del", authSvc.Permit("BLACK_HOUSE_BLOCKED_INFO_DEL"), delInfo) // 删除封禁列表
bg.POST("/info/status/up", authSvc.Permit("BLACK_HOUSE_BLOCKED_INFO_STATUS_UP"), upInfoStatus) // 更新封禁列表状态
bg.GET("/info.so", authSvc.Permit("BLACK_HOUSE_BLOCKED_INFO_SO"), infosEx) // 封禁列表导出
// publish
bg.GET("/publish", authSvc.Permit("BLACK_HOUSE_BLOCKED_PUBLISH"), publishs) // 公告列表
bg.GET("/publish/id", authSvc.Permit("BLACK_HOUSE_BLOCKED_PUBLISH_ID"), publishByID) // 公告信息详情
bg.POST("/publish/add", authSvc.Permit("BLACK_HOUSE_BLOCKED_PUBLISH_ADD"), addPublish) // 增加公告
bg.POST("/publish/up", authSvc.Permit("BLACK_HOUSE_BLOCKED_PUBLISH_UP"), upPublish) // 更新公告
bg.POST("/publish/del", authSvc.Permit("BLACK_HOUSE_BLOCKED_PUBLISH_DEL"), delPublish) // 删除公告
// notice
bg.GET("/notice", authSvc.Permit("BLACK_HOUSE_BLOCKED_NOTICE"), notices) // 通知列表
bg.POST("/notice/add", authSvc.Permit("BLACK_HOUSE_BLOCKED_NOTICE_ADD"), addNotice) // 增加通知
bg.POST("/notice/status/up", authSvc.Permit("BLACK_HOUSE_BLOCKED_NOTICE_STATUS_UP"), upNoticeStatus) // 更新通知
}
jg := e.Group("/x/admin/credit/jury")
{
// case
jg.GET("/case", authSvc.Permit("BLACK_HOUSE_JURY_CASE"), cases) // 案件列表
jg.GET("/case/id", authSvc.Permit("BLACK_HOUSE_JURY_CASE_ID"), caseByID) // 案件信息详情
jg.GET("/case/reason", authSvc.Permit("BLACK_HOUSE_JURY_CASE_REASON"), reasons) // 案件举报理由
jg.POST("/case/add", authSvc.Permit("BLACK_HOUSE_JURY_CASE_ADD"), addCase)
jg.POST("/case/up", authSvc.Permit("BLACK_HOUSE_JURY_CASE_UP"), upCase)
jg.POST("/case/vote/add", authSvc.Permit("BLACK_HOUSE_JURY_CASE_VOTE_ADD"), addCaseVote)
jg.POST("/case/status/up", authSvc.Permit("BLACK_HOUSE_JURY_CASE_STATUS_UP"), upCaseStatus)
jg.POST("/case/type/add", authSvc.Permit("BLACK_HOUSE_JURY_CASE_TYPE_ADD"), addCaseType) // 添加众裁稿件
jg.GET("/case/auto/conf", authSvc.Permit("BLACK_HOUSE_JURY_CASE_AUTO_CONF"), autoCaseConfig)
jg.POST("/case/auto/conf/set", authSvc.Permit("BLACK_HOUSE_JURY_CASE_AUTO_CONF_SET"), setAutoCaseConfig)
// opinions
jg.GET("/opinion", authSvc.Permit("BLACK_HOUSE_JURY_OPINION"), opinions) // 观点列表
jg.GET("/opinion/id", authSvc.Permit("BLACK_HOUSE_JURY_OPINION_ID"), opinionByID) // 观点信息详情
jg.POST("/opinion/del", authSvc.Permit("BLACK_HOUSE_JURY_OPINION_DEL"), delOpinions)
// users
jg.GET("/users", authSvc.Permit("BLACK_HOUSE_JURY_USERS"), users) // 委员列表
jg.GET("/user/id", authSvc.Permit("BLACK_HOUSE_JURY_USER_ID"), userByID) // 委员信息详情
jg.POST("/user/add", authSvc.Permit("BLACK_HOUSE_JURY_USER_ADD"), userAdd) // 新增委员
jg.POST("/users/status/up", authSvc.Permit("BLACK_HOUSE_JURY_USERS_STATUS_UP"), upUserStatus)
jg.POST("/users/blackwhite", authSvc.Permit("BLACK_HOUSE_JURY_USERS_BLACKWHITE"), blackWhite)
jg.GET("/users.so", authSvc.Permit("BLACK_HOUSE_JURY_USERS_SO"), usersEx)
// kpi
jg.GET("/kpi", authSvc.Permit("BLACK_HOUSE_JURY_KPI"), kpis)
jg.GET("/kpi/point", authSvc.Permit("BLACK_HOUSE_JURY_KPI_POINT"), kpiPoints)
jg.GET("/kpi.so", authSvc.Permit("BLACK_HOUSE_JURY_KPI_SO"), kpisEx)
// config
jg.GET("/config", authSvc.Permit("BLACK_HOUSE_JURY_CONFIG"), caseConf)
jg.POST("/config/set", authSvc.Permit("BLACK_HOUSE_JURY_CONFIG_SET"), setCaseConf)
jg.GET("/votenum/conf", authSvc.Permit("BLACK_HOUSE_VOTENUM_CONFIG"), votenumConf)
jg.POST("/votenum/conf/set", authSvc.Permit("BLACK_HOUSE_VOTENUM_CONFIG_SET"), setVotenumConf)
}
ug := e.Group("/x/admin/credit/upload")
{
ug.POST("", upload)
ug.POST("/coins", annualCoins)
}
lg := e.Group("/x/admin/credit/labour")
{
/*
lg.GET("/quest", question)
lg.POST("/quest/statistics", statQuestion)
*/
lg.POST("/quest/oper", operQuestion)
lg.POST("/quest/del", delQuestion)
}
ig := e.Group("/x/admin/credit/jury")
{
// appeal webhook for internal .
ig.POST("/webhook", webHook)
}
}
// ping check server ok.
func ping(c *bm.Context) {
err := creSvc.Ping(c)
if err != nil {
log.Error("credit admin ping error")
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}

View File

@@ -0,0 +1,844 @@
package http
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"math"
"sort"
"strconv"
"time"
"go-common/app/admin/main/credit/model"
"go-common/app/admin/main/credit/model/blocked"
"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"
"go-common/library/xstr"
"github.com/jinzhu/gorm"
)
func users(c *bm.Context) {
v := new(blocked.ArgJurySearch)
if err := c.Bind(v); err != nil {
return
}
list, pager, err := creSvc.Jurys(c, v)
if err != nil {
log.Error("creSvc.Jurys error(%v)", err)
httpCode(c, err)
return
}
if len(list) == 0 {
httpData(c, nil, pager)
return
}
httpData(c, list, pager)
}
func userAdd(c *bm.Context) {
var err error
v := new(blocked.ArgAddJurys)
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.AddJury(c, v); err != nil {
httpCode(c, err)
return
}
log.Info("business_userAdd:%+v", v)
httpCode(c, nil)
}
// userByID get user by id.
func userByID(c *bm.Context) {
var err error
v := new(struct {
MID int64 `form:"mid" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Jury{}
if err = creSvc.ReadDB.Where("mid = ?", v.MID).Find(item).Error; err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.userByID error(%v)", err)
httpCode(c, err)
return
}
httpData(c, nil, nil)
return
}
if item != nil {
if item.VoteTotal > 0 {
item.VoteRadio = strconv.FormatFloat(float64(item.VoteRight)/float64(item.VoteTotal)*100, 'f', 2, 64)
} else {
item.VoteRadio = "-1"
}
item.StatusDesc = blocked.JuryerStatus[item.Status]
item.BlackDesc = blocked.JuryerStyle[item.Black]
}
httpData(c, item, nil)
}
func upUserStatus(c *bm.Context) {
v := new(struct {
MIDS []int64 `form:"mids,split" validate:"min=1,max=100"`
Status int8 `form:"status" validate:"min=1,max=2" default:"2"`
OID int64 `form:"op_id" validate:"required"`
})
if err := c.Bind(v); err != nil {
return
}
items := []*blocked.Jury{}
if err := creSvc.ReadDB.Where("mid IN (?)", v.MIDS).Find(&items).Error; err != nil {
log.Error("creSvc.juryByMIDs(%s) error(%v)", xstr.JoinInts(v.MIDS), err)
httpCode(c, err)
return
}
now := time.Now()
if err := creSvc.DB.Model(&blocked.Jury{}).Where("mid IN(?)", v.MIDS).Updates(map[string]interface{}{"status": v.Status, "expired": now, "oper_id": v.OID}).Error; err != nil {
httpCode(c, err)
return
}
log.Info("business_upUserStatus:%+v", v)
mids := make(map[int64]*blocked.Jury, len(v.MIDS))
for _, v := range items {
mids[v.UID] = v
}
var multiple []interface{}
for _, mid := range v.MIDS {
single := map[string]interface{}{
"id": mids[mid].ID,
"oper_id": v.OID,
"status": v.Status,
"expired": now.Format(model.TimeFormatSec),
"black": mids[mid].Black,
}
multiple = append(multiple, single)
}
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedJury, blocked.TableBlockedJury, multiple)
})
httpCode(c, nil)
}
func blackWhite(c *bm.Context) {
var err error
v := new(struct {
MIDS []int64 `form:"mids,split" validate:"min=1,max=100"`
Status int8 `form:"status" validate:"min=1,max=2"`
Black int8 `form:"black"`
ReMark string `form:"remark"`
OID int64 `form:"op_id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
items := []*blocked.Jury{}
if err = creSvc.ReadDB.Where("mid IN (?)", v.MIDS).Find(&items).Error; err != nil {
log.Error("creSvc.juryByMIDs(%s) error(%v)", xstr.JoinInts(v.MIDS), err)
httpCode(c, err)
return
}
mids := make(map[int64]*blocked.Jury, len(v.MIDS))
for _, v := range items {
mids[v.UID] = v
}
now := time.Now()
var multiple []interface{}
switch {
case v.Black == blocked.JuryBlack && v.Status == blocked.JuryStatusOn:
err = creSvc.DB.Model(&blocked.Jury{}).Where("mid IN(?)", v.MIDS).Updates(
map[string]interface{}{
"status": blocked.JuryStatusDown,
"black": blocked.JuryBlack,
"oper_id": v.OID,
"expired": time.Now().Unix(),
"remark": v.ReMark,
}).Error
for _, mid := range v.MIDS {
single := map[string]interface{}{
"id": mids[mid].ID,
"oper_id": v.OID,
"status": v.Status,
"expired": now.Format(model.TimeFormatSec),
"black": blocked.JuryBlack,
}
multiple = append(multiple, single)
}
case v.Black == blocked.JuryWhite && v.Status == blocked.JuryStatusOn:
err = creSvc.DB.Model(&blocked.Jury{}).Where("mid IN(?)", v.MIDS).Updates(
map[string]interface{}{
"black": blocked.JuryWhite,
"oper_id": v.OID,
"remark": v.ReMark,
}).Error
for _, mid := range v.MIDS {
single := map[string]interface{}{
"id": mids[mid].ID,
"oper_id": v.OID,
"black": blocked.JuryWhite,
}
multiple = append(multiple, single)
}
case (v.Black == blocked.JuryBlack && v.Status == blocked.JuryStatusDown) || (v.Black == blocked.JuryWhite && v.Status == blocked.JuryStatusDown):
err = creSvc.DB.Model(&blocked.Jury{}).Where("mid IN(?)", v.MIDS).Updates(
map[string]interface{}{
"black": blocked.JuryNormal,
"oper_id": v.OID,
"remark": v.ReMark,
}).Error
for _, mid := range v.MIDS {
single := map[string]interface{}{
"id": mids[mid].ID,
"oper_id": v.OID,
"black": blocked.JuryNormal,
}
multiple = append(multiple, single)
}
}
if err != nil {
log.Error("blackWhite creSvc.DB error(%v)", err)
httpCode(c, err)
return
}
log.Info("business_blackWhite:%+v", v)
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedJury, blocked.TableBlockedJury, multiple)
})
httpCode(c, nil)
}
func usersEx(c *bm.Context) {
v := new(blocked.ArgJurySearch)
if err := c.Bind(v); err != nil {
return
}
list, err := creSvc.JurysEx(c, v)
if err != nil {
log.Error("creSvc.InfosEx error(%v)", err)
httpCode(c, err)
return
}
re, err := blocked.DealJury(list)
if err != nil {
log.Error("blocked.DealInfo error(%v)", err)
httpCode(c, err)
return
}
outBuf(c, creSvc.FormatCSV(re), fmt.Sprintf("%s-%s", time.Now().Format(model.TimeFormatDay), "juryer"))
}
func cases(c *bm.Context) {
v := new(blocked.ArgCaseSearch)
if err := c.Bind(v); err != nil {
return
}
list, pager, err := creSvc.Cases(c, v)
if err != nil {
log.Error("creSvc.Publishs(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
if len(list) == 0 {
httpData(c, nil, pager)
return
}
httpData(c, list, pager)
}
// caseByID get case by id.
func caseByID(c *bm.Context) {
var err error
v := new(struct {
ID int64 `form:"id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Case{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.caseByID error(%v)", err)
httpCode(c, err)
return
}
httpData(c, nil, nil)
return
}
if item != nil {
item.CaseTypeDesc = blocked.CaseTypeDesc[item.CaseType]
item.StatusDesc = blocked.StatusDesc[item.Status]
item.OriginTypeDesc = blocked.OriginTypeDesc[item.OriginType]
item.ReasonTypeDesc = blocked.ReasonTypeDesc(item.ReasonType)
item.PunishDesc = blocked.PunishDesc[item.PunishResult]
item.VoteTotal = blocked.VoteTotal(item.VoteRule, item.VoteBreak, item.VoteDelete)
if item.VoteRule > 0 || item.VoteBreak > 0 || item.VoteDelete > 0 {
item.BlockedPercent = blocked.BreakPercent(item.VoteRule, item.VoteBreak, item.VoteDelete)
item.DeletePercent = blocked.DeletePercent(item.VoteRule, item.VoteBreak, item.VoteDelete)
item.RulePercent = blocked.RulePercent(item.VoteRule, item.VoteBreak, item.VoteDelete)
}
}
httpData(c, item, nil)
}
// reasons get all case reason.
func reasons(c *bm.Context) {
cr, err := creSvc.CaseReason(c)
if err != nil {
log.Error("creSvc.CaseReason error(%v)", err)
httpCode(c, err)
return
}
httpData(c, cr, nil)
}
func addCase(c *bm.Context) {
var err error
v := new(blocked.ArgCase)
if err = c.Bind(v); err != nil {
return
}
defTime, _ := time.ParseInLocation(model.TimeFormatSec, blocked.DefaultTime, time.Local)
if err = creSvc.DB.Create(
&blocked.Case{
MID: v.UID,
OriginType: v.Otype,
ReasonType: v.ReasonType,
PunishResult: v.PunishResult,
BlockedDays: v.BlockedDays,
OriginTitle: v.OriginTitle,
OriginContent: v.OriginContent,
OriginURL: v.OriginURL,
OPID: v.OID,
RelationID: v.RelationID,
Status: blocked.CaseStatusGrantStop,
StartTime: xtime.Time(defTime.Unix()),
EndTime: xtime.Time(defTime.Unix()),
}).Error; err != nil {
log.Error("creSvc.addCase(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_addCase:%+v", v)
httpCode(c, nil)
}
func upCase(c *bm.Context) {
var err error
v := new(blocked.ArgCase)
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Case{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
log.Error("creSvc.caseByID(%d) error(%v)", v.ID, err)
httpCode(c, err)
return
}
if err = creSvc.DB.Model(blocked.Case{}).Where("id = ?", v.ID).Updates(
map[string]interface{}{
"mid": v.UID,
"origin_type": v.Otype,
"reason_type": v.ReasonType,
"punish_result": v.PunishResult,
"blocked_days": v.BlockedDays,
"origin_title": v.OriginTitle,
"origin_content": v.OriginContent,
"origin_url": v.OriginURL,
"relation_id": v.RelationID,
"oper_id": v.OID,
}).Error; err != nil {
log.Error("creSvc.upCase(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_upCase:%+v", v)
var multiple []interface{}
single := map[string]interface{}{
"id": v.ID,
"oper_id": v.OID,
"origin_type": v.Otype,
"mid": v.UID,
"case_type": item.CaseType,
}
multiple = append(multiple, single)
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedCase, blocked.TableBlockedCase, multiple)
})
httpCode(c, nil)
}
func addCaseVote(c *bm.Context) {
var err error
v := new(struct {
ID int64 `form:"id" validate:"required"`
OPID int64 `form:"op_id" validate:"required"`
VoteRule int64 `form:"vote_rule" default:"0"`
VoteBreak int64 `form:"vote_break" default:"0"`
VoteDelete int64 `form:"vote_delete" default:"0"`
})
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Case{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
log.Error("creSvc.caseByID(%d) error(%v)", v.ID, err)
httpCode(c, err)
return
}
if (v.VoteBreak < 0 && (float64(item.VoteBreak)-math.Abs(float64(v.VoteBreak))) < 0) ||
(v.VoteRule < 0 && (float64(item.VoteRule)-math.Abs(float64(v.VoteRule))) < 0) ||
(v.VoteDelete < 0 && (float64(item.VoteDelete)-math.Abs(float64(v.VoteDelete))) < 0) {
httpCode(c, ecode.RequestErr)
return
}
if err = creSvc.DB.Model(&blocked.Case{}).Where("id = ?", v.ID).UpdateColumns(
map[string]interface{}{
"vote_rule": gorm.Expr("vote_rule + ?", v.VoteRule),
"vote_break": gorm.Expr("vote_break + ?", v.VoteBreak),
"vote_delete": gorm.Expr("vote_delete + ?", v.VoteDelete),
"oper_id": v.OPID,
}).Error; err != nil {
log.Error("creSvc.addCaseVote(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_addCaseVote:%+v", v)
httpCode(c, nil)
}
func upCaseStatus(c *bm.Context) {
var err error
v := new(blocked.ArgUpStatus)
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.UpCaseStatus(c, v); err != nil {
log.Error("creSvc.UpCaseStatus(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_upCaseStatus:%+v", v)
httpCode(c, nil)
}
func addCaseType(c *bm.Context) {
var err error
v := new(struct {
IDS []int64 `form:"ids,split" validate:"min=1,max=200"`
Type int8 `form:"type" validate:"min=0,max=1"`
OID int64 `form:"op_id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.DB.Model(blocked.Case{}).Where("id IN(?)", v.IDS).Updates(
map[string]interface{}{
"case_type": v.Type,
"oper_id": v.OID,
}).Error; err != nil {
log.Error("creSvc.addCaseType(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_addCaseType:%+v", v)
var multiple []interface{}
for _, id := range v.IDS {
single := map[string]interface{}{
"id": id,
"oper_id": v.OID,
"case_type": v.Type,
}
multiple = append(multiple, single)
}
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedCase, blocked.TableBlockedCase, multiple)
})
httpCode(c, nil)
}
func opinions(c *bm.Context) {
v := new(blocked.ArgOpinionSearch)
if err := c.Bind(v); err != nil {
return
}
list, pager, err := creSvc.Opinions(c, v)
if err != nil {
log.Error("creSvc.Opinions(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
if len(list) == 0 {
httpData(c, nil, pager)
return
}
httpData(c, list, pager)
}
// opinionByID get opinion by id.
func opinionByID(c *bm.Context) {
var err error
v := new(struct {
ID int64 `form:"id" validate:"required"`
})
if err = c.Bind(v); err != nil {
return
}
item := &blocked.Opinion{}
if err = creSvc.ReadDB.Where("id = ?", v.ID).Find(item).Error; err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.opinionByID error(%v)", err)
httpCode(c, err)
return
}
httpData(c, nil, nil)
return
}
if item != nil {
item.AttrDesc = blocked.AttrDesc[item.Attr]
item.VoteDesc = blocked.VoteDesc[item.Vote]
item.VoteStateDesc = blocked.VoteStateDesc[item.State]
}
httpData(c, item, nil)
}
func delOpinions(c *bm.Context) {
var err error
v := new(struct {
IDS []int64 `form:"ids,split" validate:"min=1,max=20"`
OID int64 `form:"op_id" validate:"required"`
Status int8 `form:"status" validate:"min=0,max=1" default:"1"`
Send int8 `form:"send" validate:"min=0,max=1"`
})
if err = c.Bind(v); err != nil {
return
}
v.IDS = model.ArrayUnique(v.IDS)
if len(v.IDS) == 0 {
return
}
if err = creSvc.DB.Model(&blocked.Opinion{}).Where("id IN (?)", v.IDS).Updates(map[string]interface{}{"state": v.Status, "oper_id": v.OID}).Error; err != nil {
log.Error("creSvc.delOpinions(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_delOpinions:%+v", v)
var multiple []interface{}
for _, id := range v.IDS {
single := map[string]interface{}{
"id": id,
"oper_id": v.OID,
"state": v.Status,
}
multiple = append(multiple, single)
}
creSvc.AddNotify(func() {
creSvc.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedOpinion, blocked.TableBlockedOpinion, multiple)
})
if v.Send == blocked.NeedSendMsg {
items := []*blocked.Opinion{}
if err = creSvc.ReadDB.Where("id IN (?)", v.IDS).Find(&items).Error; err != nil {
log.Error("creSvc.opinionByIDs(%s) error(%v)", xstr.JoinInts(v.IDS), err)
err = nil
return
}
for _, v := range items {
msg := &blocked.SysMsg{
Type: blocked.MsgTypeDelOpinion,
MID: v.MID,
CID: v.CID,
CaseContent: v.Content,
RemoteIP: metadata.String(c, metadata.RemoteIP),
}
creSvc.MsgCh <- msg
}
}
httpCode(c, nil)
}
func kpis(c *bm.Context) {
var (
err error
start, end time.Time
order = "id"
sort = "DESC"
)
v := new(blocked.ArgKpiSearch)
if err = c.Bind(v); err != nil {
return
}
if v.Start == "" {
if start, err = time.ParseInLocation(model.TimeFormatDay, time.Now().AddDate(0, -1, 0).Format(model.TimeFormatDay), time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", time.Now().AddDate(0, -1, 0).Format(model.TimeFormatDay), err)
}
} else {
if start, err = time.ParseInLocation(model.TimeFormatSec, v.Start, time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", v.Start, err)
}
}
if v.End == "" {
if end, err = time.ParseInLocation(model.TimeFormatDay, time.Now().Format(model.TimeFormatDay), time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", time.Now().Format(model.TimeFormatDay), err)
}
} else {
if end, err = time.ParseInLocation(model.TimeFormatSec, v.End, time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", v.End, err)
}
}
count := int(0)
items := []*blocked.KPI{}
pager := &blocked.Pager{
Total: count,
PN: v.PN,
PS: v.PS,
Order: order,
Sort: sort,
}
if v.UID > 0 {
err = creSvc.ReadDB.Where("mid=? and day BETWEEN ? AND ? ", v.UID, start, end).Offset((v.PN - 1) * v.PS).Limit(v.PS).Order(fmt.Sprintf("%s %s", order, sort)).Find(&items).Error
creSvc.ReadDB.Model(&blocked.KPI{}).Where("mid=? and day BETWEEN ? AND ? ", v.UID, start, end).Count(&count)
} else {
err = creSvc.ReadDB.Where("day BETWEEN ? AND ? ", start, end).Offset((v.PN - 1) * v.PS).Limit(v.PS).Order(fmt.Sprintf("%s %s", order, sort)).Find(&items).Error
creSvc.ReadDB.Model(&blocked.KPI{}).Where("day BETWEEN ? AND ? ", start, end).Count(&count)
}
if err != nil {
if err != ecode.NothingFound {
log.Error("creSvc.kpis error(%v)", err)
httpCode(c, err)
return
}
httpData(c, nil, pager)
return
}
pager.Total = count
httpData(c, items, pager)
}
func kpiPoints(c *bm.Context) {
v := new(blocked.ArgKpiPointSearch)
if err := c.Bind(v); err != nil {
return
}
list, pager, err := creSvc.KPIPoint(c, v)
if err != nil {
log.Error("creSvc.KPIPoint(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
if len(list) == 0 {
httpData(c, nil, pager)
return
}
httpData(c, list, pager)
}
func kpisEx(c *bm.Context) {
var (
err error
start, end time.Time
items, list []*blocked.KPI
)
v := new(blocked.ArgKpiSearch)
if err = c.Bind(v); err != nil {
return
}
if v.Start == "" {
if start, err = time.ParseInLocation(model.TimeFormatDay, time.Now().AddDate(0, -1, 0).Format(model.TimeFormatDay), time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", time.Now().AddDate(0, -1, 0).Format(model.TimeFormatDay), err)
}
} else {
if start, err = time.ParseInLocation(model.TimeFormatSec, v.Start, time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", v.Start, err)
}
}
if v.End == "" {
if end, err = time.ParseInLocation(model.TimeFormatDay, time.Now().Format(model.TimeFormatDay), time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", time.Now().Format(model.TimeFormatDay), err)
}
} else {
if end, err = time.ParseInLocation(model.TimeFormatSec, v.End, time.Local); err != nil {
log.Error("time.ParseInLocation(%s) error(%v)", v.End, err)
}
}
ps, pn, loop, count := int64(500), int64(1), int64(0), int64(0)
if v.UID > 0 {
err = creSvc.ReadDB.Model(&blocked.KPI{}).Where("mid=? and day BETWEEN ? AND ?", v.UID, start, end).Count(&count).Error
} else {
err = creSvc.ReadDB.Model(&blocked.KPI{}).Where("day BETWEEN ? AND ?", start, end).Count(&count).Error
}
if err != nil {
log.Error("creSvc.kpis count error(%v)", err)
httpCode(c, err)
return
}
if count < 1 {
return
}
items = make([]*blocked.KPI, 0, count)
list = make([]*blocked.KPI, 0, count)
loop = (count / ps) + 1
for pn = 1; pn <= loop; pn++ {
if v.UID > 0 {
err = creSvc.ReadDB.Where("mid=? and day BETWEEN ? AND ?", v.UID, start, end).Offset((pn - 1) * ps).Limit(ps).Order("id DESC").Find(&items).Error
} else {
err = creSvc.ReadDB.Where("day BETWEEN ? AND ?", start, end).Offset((pn - 1) * ps).Limit(ps).Order("id DESC").Find(&items).Error
}
if err != nil {
log.Error("creSvc.kpis error(%v)", err)
httpCode(c, err)
return
}
list = append(list, items...)
}
sort.Slice(list, func(i int, j int) bool {
return list[i].ID < list[j].ID
})
re, err := blocked.DealKPI(list)
if err != nil {
httpCode(c, err)
return
}
outBuf(c, creSvc.FormatCSV(re), fmt.Sprintf("%s-%s", time.Now().Format(model.TimeFormatDay), "kpi"))
}
func caseConf(c *bm.Context) {
cc, err := creSvc.CaseConf(c)
if err != nil {
log.Error("caseConfig error(%v)", err)
httpCode(c, err)
return
}
httpData(c, cc, nil)
}
func setCaseConf(c *bm.Context) {
var err error
v := new(blocked.ArgCaseConf)
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.SetCaseConf(c, v); err != nil {
log.Error("creSvc.SetCaseConf(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_setCaseConf:%+v", v)
httpCode(c, nil)
}
func autoCaseConfig(c *bm.Context) {
var err error
v := new(struct {
Platform int8 `form:"platform"`
})
if err = c.Bind(v); err != nil {
return
}
item := &blocked.AutoCase{}
if err = creSvc.ReadDB.Where("platform=?", v.Platform).Find(&item).Error; err != nil {
if err != ecode.NothingFound {
log.Error("http.autoCaseConfig error(%v)", err)
httpCode(c, err)
return
}
httpData(c, nil, nil)
return
}
if item.ReasonStr != "" {
if item.Reasons, err = xstr.SplitInts(item.ReasonStr); err != nil {
log.Error("xstr.SplitInts(%s) err(%v)", item.ReasonStr, err)
httpCode(c, err)
return
}
}
httpData(c, item, nil)
}
func setAutoCaseConfig(c *bm.Context) {
var err error
v := new(blocked.ArgAutoCaseConf)
if err = c.Bind(v); err != nil {
return
}
item := &blocked.AutoCase{}
creSvc.ReadDB.Where("id = ?", v.ID).Find(item)
var autoCase *blocked.AutoCase
if item != nil && item.ID != 0 {
autoCase = &blocked.AutoCase{
ID: item.ID,
Platform: item.Platform,
Likes: v.Likes,
ReasonStr: xstr.JoinInts(v.Reasons),
ReportScore: v.ReportScore,
OPID: v.OID,
CTime: item.CTime,
}
} else {
autoCase = &blocked.AutoCase{
Platform: v.Platform,
Likes: v.Likes,
ReasonStr: xstr.JoinInts(v.Reasons),
ReportScore: v.ReportScore,
OPID: v.OID,
}
}
if err = creSvc.DB.Save(&autoCase).Error; err != nil {
log.Error("http.setAutoCaseConfig error(%v)", err)
httpCode(c, err)
return
}
log.Info("business_setAutoCaseConfig:%+v", v)
httpCode(c, nil)
}
func votenumConf(c *bm.Context) {
content, err := creSvc.VotenumConf(c)
if err != nil {
log.Error("caseConfig error(%v)", err)
httpCode(c, err)
return
}
vc := blocked.VoteNum{}
if err = json.Unmarshal([]byte(content), &vc); err != nil {
log.Error("votenumConf_Unmarshal err:%+v", err)
httpCode(c, err)
return
}
httpData(c, vc, nil)
}
func setVotenumConf(c *bm.Context) {
var err error
v := new(blocked.ArgVoteNum)
if err = c.Bind(v); err != nil {
return
}
if err = creSvc.SetVotenumConf(c, v); err != nil {
log.Error("creSvc.setVotenumConf(%+v) error(%v)", v, err)
httpCode(c, err)
return
}
log.Info("business_SetVotenumConf:%+v", v)
httpCode(c, nil)
}
func webHook(c *bm.Context) {
body, err := ioutil.ReadAll(c.Request.Body)
if err != nil {
log.Error("read body fail error(%v)", err)
httpCode(c, ecode.RequestErr)
return
}
if err = creSvc.WebHook(c, body); err != nil {
log.Error("creSvc.WebHook error(%v)", err)
httpCode(c, err)
return
}
httpCode(c, nil)
}

View File

@@ -0,0 +1,38 @@
package http
import (
"go-common/app/admin/main/credit/model/blocked"
bm "go-common/library/net/http/blademaster"
)
func operQuestion(c *bm.Context) {
v := new(struct {
IDS []int64 `form:"ids,split" validate:"min=1,max=20"`
Status int8 `form:"status" validate:"min=0,max=1" default:"1"`
OID int `form:"oper_id" validate:"required"`
})
if err := c.Bind(v); err != nil {
return
}
if err := creSvc.DB.Model(&blocked.LabourQuestion{}).Where(v.IDS).Updates(map[string]interface{}{"status": v.Status, "oper_id": v.OID}).Error; err != nil {
httpCode(c, err)
return
}
httpCode(c, nil)
}
func delQuestion(c *bm.Context) {
v := new(struct {
IDS []int64 `form:"ids,split" validate:"min=1,max=20"`
Status int8 `form:"status" validate:"min=0,max=1" default:"1"`
OID int `form:"oper_id" validate:"required"`
})
if err := c.Bind(v); err != nil {
return
}
if err := creSvc.DB.Model(&blocked.LabourQuestion{}).Where(v.IDS).Updates(map[string]interface{}{"isdel": v.Status, "oper_id": v.OID}).Error; err != nil {
httpCode(c, err)
return
}
httpCode(c, nil)
}

View File

@@ -0,0 +1,74 @@
package http
import (
"context"
"crypto/md5"
"encoding/csv"
"fmt"
"net/http"
"net/url"
"regexp"
"time"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func upload(c *bm.Context) {
imageFile, imageHeader, err := c.Request.FormFile("file")
if err != nil {
log.Error("upload err(%v)", err)
httpCode(c, err)
return
}
defer imageFile.Close()
//读取前512个字节用于判断文件类型
firstImageBytes := make([]byte, 512)
_, err = imageFile.Read(firstImageBytes)
if err != nil {
log.Error("imageFile.Read error(%v)", err)
httpCode(c, err)
return
}
md5Checksum := md5.Sum(firstImageBytes)
extensionMatcher := regexp.MustCompile(`\\.\\w+$`)
imageName := extensionMatcher.ReplaceAllString(imageHeader.Filename, "")
filetype := http.DetectContentType(firstImageBytes)
var extension string
switch filetype {
case "image/jpeg", "image/jpg":
extension = "jpg"
case "image/gif":
extension = "gif"
case "image/png":
extension = "png"
case "application/pdf":
extension = "pdf"
default:
log.Warn("unknown filetype(%s) ", filetype)
return
}
imageName = url.PathEscape(imageName)
//重新格式化文件名
uploadFilePath := fmt.Sprintf("%x-%v.%v", md5Checksum, imageName, extension)
local, err := creSvc.Upload(c, uploadFilePath, extension, time.Now().Unix(), imageFile)
if err != nil {
log.Error("creSvc.Upload error(%v)", err)
httpCode(c, err)
return
}
httpData(c, local, nil)
}
func annualCoins(c *bm.Context) {
file, _, err := c.Request.FormFile("file")
if err != nil {
log.Error("upload err(%v)", err)
httpCode(c, err)
return
}
defer file.Close()
reader := csv.NewReader(file)
fmids := creSvc.AnnualCoins(context.Background(), reader)
httpData(c, fmids, nil)
}

View File

@@ -0,0 +1,32 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["common.go"],
importpath = "go-common/app/admin/main/credit/model",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/admin/main/credit/model/blocked:all-srcs",
"//app/admin/main/credit/model/search:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,49 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"appeal.go",
"auto_case.go",
"case.go",
"config.go",
"credit_state.go",
"info.go",
"jury.go",
"kpi.go",
"labour.go",
"msg.go",
"notice.go",
"opinion.go",
"param.go",
"publish.go",
"reason.go",
],
importpath = "go-common/app/admin/main/credit/model/blocked",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/model:go_default_library",
"//library/log:go_default_library",
"//library/time: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,7 @@
package blocked
// const Appeal const
const (
AppealStateSucc = 1
AppealStateFail = 2
)

View File

@@ -0,0 +1,21 @@
package blocked
import xtime "go-common/library/time"
// AutoCase is blocked_auto_case model.
type AutoCase struct {
ID int64 `gorm:"column:id" json:"id"`
Platform int8 `gorm:"column:platform" json:"platform"`
OPID int64 `gorm:"column:oper_id" json:"oper_id"`
ReasonStr string `gorm:"column:reasons" json:"-"`
Reasons []int64 `gorm:"-" json:"reasons"`
ReportScore int `gorm:"column:report_score" json:"report_score"`
Likes int `gorm:"column:likes" json:"likes"`
CTime xtime.Time `gorm:"column:ctime" json:"ctime"`
MTime xtime.Time `gorm:"column:mtime" json:"mtime"`
}
// TableName AutoCase tablename
func (*AutoCase) TableName() string {
return "blocked_auto_case"
}

View File

@@ -0,0 +1,199 @@
package blocked
import (
"strconv"
xtime "go-common/library/time"
)
// const case
const (
// JudeCaseTypePrivate case type private
JudeCaseTypePrivate = int8(0) // 小众众裁
// JudeCaseTypePublic case type public
JudeCaseTypePublic = int8(1) // 大众众裁
// case status.
CaseStatusGranting = int8(1) // 发放中
CaseStatusGrantStop = int8(2) // 停止发放
CaseStatusDealing = int8(3) // 结案中
CaseStatusDealed = int8(4) // 已裁决
CaseStatusRestart = int8(5) // 待重启
CaseStatusUndealed = int8(6) // 未裁决
CaseStatusFreeze = int8(7) // 冻结中
CaseStatusQueueing = int8(8) // 队列中
// vote status.
VoteTypeUndo = int8(0) // 未投票
VoteTypeViolate = int8(1) // 违规-封禁
VoteTypeLegal = int8(2) // 不违规
VoteTypeGiveUp = int8(3) // 放弃投票
VoteTypeDelete = int8(4) // 违规-删除
// origin_type.
OriginReply = int8(1) // 评论
OriginDM = int8(2) // 弹幕
OriginMsg = int8(3) // 私信
OriginTag = int8(4) // 标签
OriginMember = int8(5) // 个人资料
OriginArchive = int8(6) // 投稿
OriginMusic = int8(7) // 音频
OriginArticle = int8(8) // 专栏
OriginSpaceTop = int8(9) // 空间头图
OriginDsynamic = int8(10) // 动态
OriginPhoto = int8(11) // 相册
OriginMinVideo = int8(12) // 小视频
// punish status
PunishhNon = int8(0)
PunishBlockedTree = int8(1)
PunishBlockedSeven = int8(2)
PunishBlockedEver = int8(3)
PunishBlockedCustom = int8(4)
PunishBlockedFifteen = int8(5)
PunishJustDelete = int8(6)
// block time.
BlockMoralNum = -2 // 扣除节操
BlockCustom = -1 // N天封禁
BlockForever = 0 // 永久封禁
BlockThree = 3 // 3天封禁
BlockSeven = 7 // 7天封禁
BlockFifteen = 15 // 15天封禁
)
// var case
var (
StatusDesc = map[int8]string{
CaseStatusGranting: "发放中",
CaseStatusGrantStop: "停止发放",
CaseStatusDealing: "结案中",
CaseStatusDealed: "已裁决",
CaseStatusRestart: "待重启",
CaseStatusUndealed: "未裁决",
CaseStatusFreeze: "冻结中",
CaseStatusQueueing: "队列中",
}
OriginTypeDesc = map[int8]string{
OriginReply: "评论",
OriginDM: "弹幕",
OriginMsg: "私信",
OriginTag: "标签",
OriginMember: "个人资料",
OriginArchive: "投稿",
OriginMusic: "音频",
OriginArticle: "专栏",
OriginSpaceTop: "空间头图",
OriginDsynamic: "动态",
OriginPhoto: "相册",
OriginMinVideo: "小视频",
}
PunishDesc = map[int8]string{
PunishhNon: "不违规不封禁",
PunishBlockedTree: "封禁3天",
PunishBlockedSeven: "封禁7天",
PunishBlockedEver: "永久封禁",
PunishBlockedCustom: "自定义封禁",
PunishBlockedFifteen: "封禁15天",
PunishJustDelete: "违规仅删除",
}
blockedDesc = map[int]string{
BlockMoralNum: "扣除%d节操",
BlockCustom: "天封禁",
BlockForever: "永久封禁",
BlockThree: "3天封禁",
BlockSeven: "7天封禁",
BlockFifteen: "15天封禁",
}
CaseTypeDesc = map[int8]string{
JudeCaseTypePrivate: "非公开众裁",
JudeCaseTypePublic: "公开众裁",
}
)
// Case is blocked_case model.
type Case struct {
ID int64 `gorm:"column:id" json:"id"`
MID int64 `gorm:"column:mid" json:"uid"`
OPID int64 `gorm:"column:oper_id" json:"oper_id"`
Status int8 `gorm:"column:status" json:"status"`
OriginType int8 `gorm:"column:origin_type" json:"origin_type"`
ReasonType int8 `gorm:"column:reason_type" json:"reason_type"`
PunishResult int8 `gorm:"column:punish_result" json:"punish_result"`
JudgeType int `gorm:"column:judge_type" json:"judge_type"`
CaseType int8 `gorm:"column:case_type" json:"case_type"`
BlockedDays int `gorm:"column:blocked_days" json:"blocked_days"`
PutTotal int `gorm:"column:put_total" json:"put_total"`
VoteRule int64 `gorm:"column:vote_rule" json:"vote_rule"`
VoteBreak int64 `gorm:"column:vote_break" json:"vote_break"`
VoteDelete int64 `gorm:"column:vote_delete" json:"vote_delete"`
VoteTotal int64 `gorm:"-" json:"vote_total"` // 总得票数
StartTime xtime.Time `gorm:"column:start_time" json:"start_time"`
EndTime xtime.Time `gorm:"column:end_time" json:"end_time"`
CTime xtime.Time `gorm:"column:ctime" json:"ctime"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
OriginURL string `gorm:"column:origin_url" json:"origin_url"`
OriginTitle string `gorm:"column:origin_title" json:"origin_title"`
OriginContent string `gorm:"column:origin_content" json:"origin_content"`
BusinessTime xtime.Time `gorm:"column:business_time" json:"business_time"`
Uname string `gorm:"-" json:"uname"`
StatusDesc string `gorm:"-" json:"status_desc"`
OriginTypeDesc string `gorm:"-" json:"origin_type_desc"`
ReasonTypeDesc string `gorm:"-" json:"reason_type_desc"`
CaseTypeDesc string `gorm:"-" json:"case_type_desc"`
RelationID string `gorm:"column:relation_id" json:"relation_id"`
RulePercent string `gorm:"-" json:"rule_percent"` // 不违规得票率
BlockedPercent string `gorm:"-" json:"blocked_percent"` // 违规(封禁)得票率
DeletePercent string `gorm:"-" json:"delete_percent"` // 违规(仅删)得票率
PunishDesc string `gorm:"-" json:"punish_desc"`
OPName string `gorm:"-" json:"oname"` // 操作人
Fans int64 `gorm:"-" json:"fans"` // 粉丝数
}
// CaseVote is blocked_case_vote model.
type CaseVote struct {
ID int64 `gorm:"column:id" json:"id"`
CID int64 `gorm:"column:cid" json:"cid"`
UID int64 `gorm:"column:mid" json:"uid"`
VoteType int8 `gorm:"column:vote_type" json:"vote_type"`
Expired xtime.Time `gorm:"column:expired" json:"expired"`
CTime xtime.Time `gorm:"column:ctime" json:"-"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
}
// TableName case tablename
func (*Case) TableName() string {
return "blocked_case"
}
// TableName CaseVote tablename
func (*CaseVote) TableName() string {
return "blocked_case_vote"
}
// CaseList is case list.
type CaseList struct {
Count int
Order string
Sort string
PN int
PS int
IDs []int64
List []*Case
}
// RulePercent is rule_percent.
func RulePercent(voteRule, voteBreak, voteDelete int64) string {
return strconv.FormatFloat(float64(voteRule)/float64(voteRule+voteBreak+voteDelete), 'f', 2, 64)
}
// BreakPercent is blocked percent.
func BreakPercent(voteRule, voteBreak, voteDelete int64) string {
return strconv.FormatFloat(float64(voteBreak)/float64(voteRule+voteBreak+voteDelete), 'f', 2, 64)
}
// DeletePercent is delete_percent.
func DeletePercent(voteRule, voteBreak, voteDelete int64) string {
return strconv.FormatFloat(float64(voteDelete)/float64(voteRule+voteBreak+voteDelete), 'f', 2, 64)
}
// VoteTotal is vote_total.
func VoteTotal(voteRule, voteBreak, voteDelete int64) int64 {
return voteRule + voteBreak + voteDelete
}

View File

@@ -0,0 +1,41 @@
package blocked
// const config
const (
ConfigCaseGiveHours = "case_give_hours" // 案件发放时长
ConfigCaseCheckHours = "case_check_hours" // 单案审核时长
ConfigJuryVoteRadio = "jury_vote_radio" // 投准率下限
ConfigCaseJudgeRadio = "case_judge_radio" // 判决阙值
ConfigCaseVoteMin = "case_vote_min" // 案件投票数下限
ConfigCaseObtainMax = "case_obtain_max" // 每日获取案件数
ConfigCaseVoteMax = "case_vote_max" // 结案投票数
ConfigJuryApplyMax = "jury_apply_max" // 每日发放风纪委上限
ConfigCaseLoadMax = "case_load_max" // 案件发放最大队列数
ConfigCaseLoadSwitch = "case_load_switch" // 案件发放进入队列开关
ConfigCaseVoteMaxPercent = "case_vote_max_percent" // 结案投票数的百分比
)
// Config blocked_config model
type Config struct {
ID int64
ConfigKey string
Name string
Content string
Description string
OperID int64 `json:"oper_id"`
OperatorName string
}
// VoteNum .
type VoteNum struct {
RateS int8 `json:"rate_s"`
RateA int8 `json:"rate_a"`
RateB int8 `json:"rate_b"`
RateC int8 `json:"rate_c"`
RateD int8 `json:"rate_d"`
}
// TableName case tablename
func (*Config) TableName() string {
return "blocked_config"
}

View File

@@ -0,0 +1,110 @@
package blocked
// const credit state
const (
// SearchDefaultStatus delault status
SearchDefaultStatus = 0
// JuryDay jury day
JuryDay = 30
// AccMaxPageSize max ps.
AccMaxPageSize = 50
// NotNeedSendMsg no send msg.
NotNeedSendMsg = int8(0)
// NeedSendMsg send msg.
NeedSendMsg = int8(1)
// UnBlockedForever no on forever
UnBlockedForever = int8(0)
// OnBlockedForever on forever
OnBlockedForever = int8(1)
// SearchDefaultNum defalut num
SearchDefaultNum = -100
// SearchDefaultString defalut string
SearchDefaultString = "-"
// reasonType
ReasonBrushScreen = int8(1)
ReasonGrabFloor = int8(2)
ReasonGamblingFraud = int8(4)
ReasonProhibited = int8(5)
ReasonGarbageAds = int8(6)
ReasonPersonalAttacks = int8(7)
ReasonViolatePrivacy = int8(8)
ReasonLeadBattle = int8(9)
ReasonSpoiler = int8(10)
ReasonAddUnrelatedTags = int8(11)
ReasonDelOtherTags = int8(12)
ReasonPornographic = int8(13)
ReasonVulgar = int8(14)
ReasonBloodyViolence = int8(15)
ReasonAnimusVideoUp = int8(16)
ReasonIllegalWebsite = int8(17)
ReasonSpreadErrinfo = int8(18)
ReasonAbettingEncouragement = int8(19)
ReasonAnimusBrushScreen = int8(20)
ReasonAccountViolation = int8(21)
ReasonMaliciousPlagiarism = int8(22)
ReasonPosingAsHomemade = int8(23)
ReasonPostTeenBadContent = int8(24)
ReasonDestroyCyberSecurity = int8(25)
ReasonPostingMisleadingInfo = int8(26)
ReasonCounterfeitOfficialAuth = int8(27)
ReasonPublishInappropriateContent = int8(28)
ReasonViolationOperatingRules = int8(29)
ReasonIllegalCreateTopic = int8(30)
ReasonIllegalDrawLottery = int8(31)
ReasonIllegalFakeMan = int8(32)
// AddJuryRemark add jury word
AddJuryRemark = "后台添加风纪委员"
DefaultTime = "1980-01-01 00:00:00"
TableBlockedCase = "blocked_case"
TableBlockedInfo = "blocked_info"
TableBlockedJury = "blocked_jury"
TableBlockedOpinion = "blocked_opinion"
TableBlockedPublish = "blocked_publish"
TableBlockedKpiPoint = "blocked_kpi_point"
BusinessBlockedCase = "block_case"
BusinessBlockedInfo = "block_info"
BusinessBlockedJury = "block_jury"
BusinessBlockedOpinion = "block_opinion"
BusinessBlockedPublish = "block_publish"
BusinessBlockedKpiPoint = "block_kpi_point"
)
var _reasonType = map[int8]string{
ReasonBrushScreen: "刷屏",
ReasonGrabFloor: "抢楼",
ReasonGamblingFraud: "发布赌博诈骗信息",
ReasonProhibited: "发布违禁相关信息",
ReasonGarbageAds: "发布垃圾广告信息",
ReasonPersonalAttacks: "发布人身攻击言论",
ReasonViolatePrivacy: "发布侵犯他人隐私信息",
ReasonLeadBattle: "发布引战言论",
ReasonSpoiler: "发布剧透信息",
ReasonAddUnrelatedTags: "恶意添加无关标签",
ReasonDelOtherTags: "恶意删除他人标签",
ReasonPornographic: "发布色情信息",
ReasonVulgar: "发布低俗信息",
ReasonBloodyViolence: "发布暴力血腥信息",
ReasonAnimusVideoUp: "涉及恶意投稿行为",
ReasonIllegalWebsite: "发布非法网站信息",
ReasonSpreadErrinfo: "发布传播不实信息",
ReasonAbettingEncouragement: "发布怂恿教唆信息",
ReasonAnimusBrushScreen: "恶意刷屏",
ReasonAccountViolation: "账号违规",
ReasonMaliciousPlagiarism: "恶意抄袭",
ReasonPosingAsHomemade: "冒充自制原创",
ReasonPostTeenBadContent: "发布青少年不良内容",
ReasonDestroyCyberSecurity: "破坏网络安全",
ReasonPostingMisleadingInfo: "发布虚假误导信息",
ReasonCounterfeitOfficialAuth: "仿冒官方认证账号",
ReasonPublishInappropriateContent: "发布不适宜内容",
ReasonViolationOperatingRules: "违反运营规则",
ReasonIllegalCreateTopic: "恶意创建话题",
ReasonIllegalDrawLottery: "发布违规抽奖",
ReasonIllegalFakeMan: "恶意冒充他人",
}
// ReasonTypeDesc get reasonType desc
func ReasonTypeDesc(reasonType int8) string {
return _reasonType[reasonType]
}

View File

@@ -0,0 +1,160 @@
package blocked
import (
"encoding/json"
"fmt"
"strconv"
"go-common/app/admin/main/credit/model"
"go-common/library/log"
xtime "go-common/library/time"
)
// const info
const (
// info publish_status
StatusClose = int8(0) // 案件关闭状态
StatusOpen = int8(1) // 案件公开状态
// info block_type
PunishBlock = 0 // 系统封禁
PunishJury = 1 // 风纪仲裁
// punish type.
PunishTypeMoral = int8(1) // 节操
PunishTypeBlockTime = int8(2) // 封禁
PunishTypeBlockForever = int8(3) // 永久封禁
// info status.
BlockStateOpen = int8(0) // 未解禁
BlockStateClose = int8(1) // 已解禁
)
// var info
var (
PStatusDesc = map[int8]string{
StatusClose: "不公开",
StatusOpen: "公开",
}
BTypeDesc = map[int8]string{
PunishBlock: "系统封禁",
PunishJury: "风纪仲裁",
}
)
// Info is blocked_info model.
type Info struct {
ID int64 `gorm:"column:id" json:"id"`
UID int64 `gorm:"column:uid" json:"uid"`
UName string `gorm:"column:uname" json:"uname"`
Status int8 `gorm:"column:status" json:"status"`
OriginTitle string `gorm:"column:origin_title" json:"origin_title"`
OriginURL string `gorm:"column:origin_url" json:"origin_url"`
OriginContent string `gorm:"column:origin_content" json:"origin_content"`
OriginContentModify string `gorm:"column:origin_content_modify" json:"origin_content_modify"`
OriginType int8 `gorm:"column:origin_type" json:"origin_type"`
BlockedDays int `gorm:"column:blocked_days" json:"blocked_days"`
BlockedForever int8 `gorm:"column:blocked_forever" json:"blocked_forever"`
BlockedType int8 `gorm:"column:blocked_type" json:"blocked_type"`
BlockedRemark string `gorm:"column:blocked_remark" json:"blocked_remark"`
CaseID int64 `gorm:"column:case_id" json:"case_id"`
MoralNum int `gorm:"column:moral_num" json:"moral_num"`
ReasonType int8 `gorm:"column:reason_type" json:"reason_type"`
PublishStatus int8 `gorm:"column:publish_status" json:"publish_status"`
PunishType int8 `gorm:"column:punish_type" json:"punish_type"`
PunishTime xtime.Time `gorm:"column:punish_time" json:"punish_time"`
PublishTime xtime.Time `gorm:"column:publish_time" json:"publish_time"`
OperID int64 `gorm:"column:oper_id" json:"oper_id"`
CTime xtime.Time `gorm:"column:ctime" json:"ctime"`
MTime xtime.Time `gorm:"column:mtime" json:"mtime"`
PublishStatusDesc string `gorm:"-" json:"publish_status_desc"`
OriginTypeDesc string `gorm:"-" json:"origin_type_desc"`
BlockedTypeDesc string `gorm:"-" json:"blocked_type_desc"`
BlockedDaysDesc string `gorm:"-" json:"blocked_days_desc"`
ReasonTypeDesc string `gorm:"-" json:"reason_type_desc"`
OPName string `gorm:"-" json:"oname"`
OOPName string `gorm:"column:operator_name" json:"-"`
}
// InfoList is info list.
type InfoList struct {
IDs []int64
List []*Info
}
// InfoDesc is Info_desc model.
type InfoDesc struct {
ID string `json:"id"`
PunishTime string `json:"punish_time"`
OriginTypeDesc string `json:"origin_type_desc"`
ReasonTypeDesc string `json:"reason_type_desc"`
PublishStatusDesc string `json:"publish_status_desc"`
BlockedTypeDesc string `json:"blocked_type_desc"`
OriginContent string `json:"origin_content"`
BlockedDaysDesc string `json:"blocked_days_desc"`
UName string `json:"uname"`
UID string `json:"uid"`
OPName string `json:"oname"`
}
// TableName Info tablename
func (*Info) TableName() string {
return "blocked_info"
}
// DealInfo deal with info data.
func DealInfo(infos []*Info) (data [][]string, err error) {
var infoDescs []*InfoDesc
for _, v := range infos {
infoDesc := &InfoDesc{
ID: strconv.FormatInt(v.ID, 10),
PunishTime: v.PunishTime.Time().Format(model.TimeFormatSec),
OriginTypeDesc: v.OriginTypeDesc,
PublishStatusDesc: v.PublishStatusDesc,
BlockedTypeDesc: v.BlockedTypeDesc,
ReasonTypeDesc: v.ReasonTypeDesc,
OriginContent: v.OriginContent,
BlockedDaysDesc: v.BlockedDaysDesc,
UName: v.UName,
UID: strconv.FormatInt(v.UID, 10),
OPName: v.OPName,
}
infoDescs = append(infoDescs, infoDesc)
}
infoMap, _ := json.Marshal(infoDescs)
var objmap []map[string]string
if err = json.Unmarshal(infoMap, &objmap); err != nil {
log.Error("Unmarshal(%s) error(%v)", string(infoMap), err)
return
}
data = append(data, []string{"ID", "惩罚时间", "类型", "状态", "封禁类型", "理由类型", "原文概要", "处罚结果", "用户", "用户ID", "操作者"})
for _, v := range objmap {
var fields []string
fields = append(fields, v["id"])
fields = append(fields, v["punish_time"])
fields = append(fields, v["origin_type_desc"])
fields = append(fields, v["publish_status_desc"])
fields = append(fields, v["blocked_type_desc"])
fields = append(fields, v["reason_type_desc"])
fields = append(fields, v["origin_content"])
fields = append(fields, v["blocked_days_desc"])
fields = append(fields, v["uname"])
fields = append(fields, v["uid"])
fields = append(fields, v["oname"])
data = append(data, fields)
}
return
}
// BDaysDesc is blocked_days_desc.
func BDaysDesc(bDays, moralNum int, pType, bForever int8) string {
switch {
case pType == PunishTypeMoral:
return fmt.Sprintf(blockedDesc[BlockMoralNum], moralNum)
case bDays == BlockForever && bForever == OnBlockedForever:
return blockedDesc[BlockForever]
case pType == PunishTypeBlockTime:
if bDays == BlockThree || bDays == BlockSeven || bDays == BlockFifteen {
return blockedDesc[bDays]
}
return strconv.Itoa(bDays) + blockedDesc[BlockCustom]
}
return ""
}

View File

@@ -0,0 +1,161 @@
package blocked
import (
"encoding/json"
"go-common/library/log"
"strconv"
"go-common/app/admin/main/credit/model"
xtime "go-common/library/time"
)
// const jury
const (
// judge status.
JudgeTypeUndeal = int8(0) // 未裁决
JudgeTypeViolate = int8(1) // 违规
JudgeTypeLegal = int8(2) // 未违
// judge invalid_reason
JuryBlocked = int8(1)
JuryExpire = int8(2)
JuryAdmin = int8(3)
// jury black or white
JuryNormal = int8(0)
JuryBlack = int8(1)
JuryWhite = int8(2)
// JuryStatus
JuryStatusOn = int8(1)
JuryStatusDown = int8(2)
)
// var jury
var (
JuryerStyle = map[int8]string{
JuryNormal: "正常",
JuryBlack: "黑名单",
JuryWhite: "白名单",
}
JuryerStatus = map[int8]string{
JuryStatusOn: "有效",
JuryStatusDown: "失效",
}
)
// Jury blocked_jury model.
type Jury struct {
ID int64 `gorm:"column:id" json:"id"`
UID int64 `gorm:"column:mid" json:"uid"`
OPID int64 `gorm:"column:oper_id" json:"oper_id"`
UName string `gorm:"-" json:"uname"`
Status int8 `gorm:"column:status" json:"status"`
StatusDesc string `gorm:"-" json:"status_desc"`
Expired xtime.Time `gorm:"column:expired" json:"expired"`
EffectDay xtime.Time `gorm:"-" json:"effect_day"`
InvalidReason int8 `gorm:"column:invalid_reason" json:"invalid_reason"`
VoteTotal int `gorm:"column:vote_total" json:"vote_total"`
VoteRight int `gorm:"column:vote_right" json:"vote_right"`
Total int `gorm:"column:total" json:"total"`
Black int8 `gorm:"column:black" json:"black"`
VoteRadio string `gorm:"-" json:"vote_radio"`
BlackDesc string `gorm:"-" json:"black_desc"`
Remark string `gorm:"column:remark" json:"remark"`
CTime xtime.Time `gorm:"column:ctime" json:"ctime"`
MTime xtime.Time `gorm:"column:mtime" json:"mtime"`
OPName string `gorm:"-" json:"oname"`
}
// WebHook is work flow webhook .
type WebHook struct {
Verb string `json:"verb"`
Actor struct {
AdminID int64 `json:"admin_id"`
} `json:"actor"`
Object *struct {
CID int64 `json:"cid"`
CIDs []int64 `json:"cids"`
State int `json:"state"`
} `json:"object"`
Target *struct {
CID int64 `json:"cid"`
OID int64 `json:"oid"`
Business int `json:"business"`
Mid int64 `json:"mid"`
Tid int `json:"tid"`
State int `json:"state"`
} `json:"target"`
}
// TableName jury tablename
func (*Jury) TableName() string {
return "blocked_jury"
}
// JuryList is info list.
type JuryList struct {
Count int
PN int
PS int
Order string
Sort string
IDs []int64
List []*Jury
}
// JuryDesc struct
type JuryDesc struct {
UID string `json:"uid"`
UName string `json:"uname"`
StatusDesc string `json:"status_desc"`
BlackDesc string `json:"black_desc"`
VoteTotal string `json:"vote_total"`
VoteRadio string `json:"vote_radio"`
Expired string `json:"expired"`
Remark string `json:"remark"`
EffectDay string `json:"effect_day"`
OPName string `json:"oname"`
}
// DealJury export data.
func DealJury(jurys []*Jury) (data [][]string, err error) {
var jurysDesc []*JuryDesc
if len(jurys) < 0 {
return
}
for _, v := range jurys {
juryDesc := &JuryDesc{
UID: strconv.FormatInt(v.UID, 10),
UName: v.UName,
StatusDesc: v.StatusDesc,
BlackDesc: v.BlackDesc,
VoteTotal: strconv.FormatInt(int64(v.VoteTotal), 10),
VoteRadio: v.VoteRadio,
Expired: v.Expired.Time().Format(model.TimeFormatSec),
Remark: v.Remark,
EffectDay: v.EffectDay.Time().Format(model.TimeFormatSec),
OPName: v.OPName,
}
jurysDesc = append(jurysDesc, juryDesc)
}
jurysMap, _ := json.Marshal(jurysDesc)
var objmap []map[string]string
if err = json.Unmarshal(jurysMap, &objmap); err != nil {
log.Error("Unmarshal(%s) error(%v)", string(jurysMap), err)
return
}
data = append(data, []string{"UID", "昵称", "状态", "类型", "投票数", "投准率", "失效时间", "备注", "生效时间", "操作人"})
for _, v := range objmap {
var fields []string
fields = append(fields, v["uid"])
fields = append(fields, v["uname"])
fields = append(fields, v["status_desc"])
fields = append(fields, v["black_desc"])
fields = append(fields, v["vote_total"])
fields = append(fields, v["vote_radio"])
fields = append(fields, v["expired"])
fields = append(fields, v["remark"])
fields = append(fields, v["effect_day"])
fields = append(fields, v["oname"])
data = append(data, fields)
}
return
}

View File

@@ -0,0 +1,141 @@
package blocked
import (
"encoding/json"
"strconv"
"go-common/app/admin/main/credit/model"
"go-common/library/log"
xtime "go-common/library/time"
)
// const kpi
const (
RateS = int8(1)
RateA = int8(2)
RateB = int8(3)
RateC = int8(4)
RateD = int8(5)
)
// KPI is blocked_kpi model.
type KPI struct {
ID int64 `gorm:"column:id" json:"id"`
UID int64 `gorm:"column:mid" json:"uid"`
Day xtime.Time `gorm:"column:day" json:"day"`
Rate int8 `gorm:"column:rate" json:"rate"`
Rank int64 `gorm:"column:rank" json:"rank"`
RankPer int16 `gorm:"column:rank_per" json:"rank_per"`
RankTotal int64 `gorm:"column:rank_total" json:"rank_total"`
HStatus int8 `gorm:"column:handler_status" json:"handler_status"`
PStatus int8 `gorm:"column:pendent_status" json:"pendent_status"`
CTime xtime.Time `gorm:"column:ctime" json:"-"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
}
// KPIDesc is blocked_kpi_desc model.
type KPIDesc struct {
ID string `json:"id"`
UID string `json:"uid"`
Day string `json:"day"`
Rate string `json:"rate"`
RankPer string `json:"rank_per"`
RankTotal string `json:"rank_total"`
PStatus string `json:"pendent_status"`
}
// KPIList is kpi list.
type KPIList struct {
Count int64 `json:"count"`
Pn int `json:"pn"`
Ps int `json:"ps"`
List []*KPI `json:"list"`
}
// TableName kpi tablename
func (*KPI) TableName() string {
return "blocked_kpi"
}
// RateDesc is rate desc.
func RateDesc(rate int8) string {
switch rate {
case RateS:
return "S"
case RateA:
return "A"
case RateB:
return "B"
case RateC:
return "C"
case RateD:
return "D"
}
return ""
}
// DealKPI deal with kpi data.
func DealKPI(kpis []*KPI) (data [][]string, err error) {
var kpiDescs []*KPIDesc
for _, v := range kpis {
kpiDesc := &KPIDesc{
ID: strconv.FormatInt(v.ID, 10),
UID: strconv.FormatInt(v.UID, 10),
Day: v.Day.Time().Format(model.TimeFormatDay),
Rate: RateDesc(v.Rate),
RankPer: strconv.FormatInt(int64(v.RankPer), 10),
RankTotal: strconv.FormatInt(int64(v.RankTotal), 10),
PStatus: strconv.FormatInt(int64(v.PStatus), 10),
}
kpiDescs = append(kpiDescs, kpiDesc)
}
kpiMap, _ := json.Marshal(kpiDescs)
var objmap []map[string]string
if err = json.Unmarshal(kpiMap, &objmap); err != nil {
log.Error("Unmarshal(%s) error(%v)", string(kpiMap), err)
return
}
data = append(data, []string{"ID", "MID", "KPI日期", "评级", "排名百分比", "参与总数", "挂件发放状态"})
for _, v := range objmap {
var fields []string
fields = append(fields, v["id"])
fields = append(fields, v["uid"])
fields = append(fields, v["day"])
fields = append(fields, v["rate"])
fields = append(fields, v["rank_per"])
fields = append(fields, v["rank_total"])
fields = append(fields, v["pendent_status"])
data = append(data, fields)
}
return
}
// KPIPoint is blocked_kpi_point model.
type KPIPoint struct {
ID int64 `gorm:"column:id" json:"id"`
UID int64 `gorm:"column:mid" json:"uid"`
Day xtime.Time `gorm:"column:day" json:"day"`
Point int16 `gorm:"column:point" json:"point"`
ActiveDays int16 `gorm:"column:active_days" json:"active_days"`
VoteTotal int `gorm:"column:vote_total" json:"vote_total"`
VoteRadio int16 `gorm:"column:vote_radio" json:"vote_radio"`
BlockedTotal int `gorm:"column:blocked_total" json:"blocked_total"`
CTime xtime.Time `gorm:"column:ctime" json:"-"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
}
// TableName kpi_point tablename
func (*KPIPoint) TableName() string {
return "blocked_kpi_point"
}
// KPIPointList is kpi_point list.
type KPIPointList struct {
Count int `json:"total_count"`
Order string `json:"order"`
Sort string `json:"sort"`
PN int `json:"pn"`
PS int `json:"ps"`
IDs []int64 `json:"-"`
List []*KPIPoint `json:"list"`
}

View File

@@ -0,0 +1,41 @@
package blocked
import xtime "go-common/library/time"
// LabourAnswerLog is blocked_labour_answer_log model.
type LabourAnswerLog struct {
ID int64 `gorm:"column:id" json:"id"`
UID int64 `gorm:"column:mid" json:"uid"`
Score int16 `gorm:"column:score" json:"score"`
Content string `gorm:"column:content" json:"content"`
Stime xtime.Time `gorm:"column:start_time" json:"start_time"`
CTime xtime.Time `gorm:"column:ctime" json:"-"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
}
// TableName blocked_labour_answer_log tablename
func (*LabourAnswerLog) TableName() string {
return "blocked_labour_answer_log"
}
// LabourQuestion is blocked_labour_question model.
type LabourQuestion struct {
ID int64 `gorm:"column:id" json:"id"`
Question string `gorm:"column:question" json:"question"`
Ans int8 `gorm:"column:ans" json:"ans"`
AVID int64 `gorm:"column:av_id" json:"av_id"`
Status int8 `gorm:"column:status" json:"status"`
Source int8 `gorm:"column:source" json:"source"`
IsDel int8 `gorm:"column:isdel" json:"isdel"`
Total int64 `gorm:"column:total" json:"total"`
RightTotal int64 `gorm:"column:right_total" json:"right_total"`
OperID int `gorm:"column:oper_id" json:"oper_id"`
CTime xtime.Time `gorm:"column:ctime" json:"-"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
OPName string `gorm:"-" json:"oname"`
}
// TableName blocked_labour_question tablename
func (*LabourQuestion) TableName() string {
return "blocked_labour_question"
}

View File

@@ -0,0 +1,64 @@
package blocked
import (
"fmt"
)
// const msg
const (
MsgTypeDelOpinion = int8(1)
MsgTypeGetJuryer = int8(2)
MsgTypeAppealSucc = int8(3)
MsgTypeAppealFail = int8(4)
)
var _msg = map[int8]map[string]string{
MsgTypeDelOpinion: {
"title": "观点违规警告",
"content": `你在%d号案件中发布的观点“%s”违反#{《“众议观点”使用守则》}{"https://www.bilibili.com/blackroom/notice/44"},已被管理员删除。
请遵守相关守则,合理发布观点,多次违反将被取消风纪委员资格。`,
},
MsgTypeGetJuryer: {
"title": "获得风纪委员资格",
"content": `恭喜您获得%d天风纪委员资格风纪委员应遵守以下原则
"1. 在了解举报案件背景后,公正客观投票。对不了解或难以判断的案件,可以选择弃权。
"2. 以身作则,不在举报案件相关视频、评论下讨论或发布不相关内容。相关违规举报被落实处罚后,将会失去风纪委员资格。`,
},
MsgTypeAppealSucc: {
"title": "申诉处理通知",
"content": `经复核,您对案件%d的申诉成功相应惩罚将被撤销。很抱歉给您带来了不便。感谢您对社区工作的理解与支持。请继续遵守社区规范共同维护良好的社区氛围`,
},
MsgTypeAppealFail: {
"title": "申诉处理通知",
"content": `经复核,您对案件%d的申诉未能通过。请遵守社区规范共同维护良好的社区氛围`,
},
}
// SysMsg msg struct
type SysMsg struct {
Type int8
MID int64
Day int
CID int64
CaseContent string
RemoteIP string
}
// MsgInfo get msg info
func MsgInfo(msg *SysMsg) (title, content string) {
switch msg.Type {
case MsgTypeDelOpinion:
title = _msg[MsgTypeDelOpinion]["title"]
content = fmt.Sprintf(_msg[MsgTypeDelOpinion]["content"], msg.CID, msg.CaseContent)
case MsgTypeGetJuryer:
title = _msg[MsgTypeGetJuryer]["title"]
content = fmt.Sprintf(_msg[MsgTypeGetJuryer]["content"], msg.Day)
case MsgTypeAppealSucc:
title = _msg[MsgTypeAppealSucc]["title"]
content = fmt.Sprintf(_msg[MsgTypeAppealSucc]["content"], msg.CID)
case MsgTypeAppealFail:
title = _msg[MsgTypeAppealFail]["title"]
content = fmt.Sprintf(_msg[MsgTypeAppealFail]["content"], msg.CID)
}
return
}

View File

@@ -0,0 +1,44 @@
package blocked
import xtime "go-common/library/time"
const (
// NoticeStateOpen state open.
NoticeStateOpen = int8(0)
// NoticeStateClose state close.
NoticeStateClose = int8(1)
)
var (
// NoticeStateDesc state open or close.
NoticeStateDesc = map[int8]string{
NoticeStateOpen: "启用",
NoticeStateClose: "已删除",
}
)
// Notice notice struct.
type Notice struct {
ID int64 `gorm:"column:id" json:"id"`
Content string `gorm:"column:content" json:"content"`
URL string `gorm:"column:url" json:"url"`
Status int8 `gorm:"column:status" json:"status"`
OperID int64 `gorm:"column:oper_id" json:"oper_id"`
Ctime xtime.Time `gorm:"column:ctime" json:"-"`
Mtime xtime.Time `gorm:"column:mtime" json:"-"`
StatusDesc string `gorm:"-" json:"status_desc"`
OPName string `gorm:"-" json:"oname"`
}
// NoticeList is notice list.
type NoticeList struct {
Count int64 `json:"total_count"`
Pn int `json:"pn"`
Ps int `json:"ps"`
List []*Notice `json:"list"`
}
// TableName notice tablename
func (*Notice) TableName() string {
return "blocked_notice"
}

View File

@@ -0,0 +1,88 @@
package blocked
import (
xtime "go-common/library/time"
)
// const opinion
const (
// vote_desc
NoVote = int8(0)
BlockedVote = int8(1)
RuleVote = int8(2)
DeleteVote = int8(3)
BlockedDelete = int8(4)
// vote_state
VoteStateON = int8(0)
VoteStateOFF = int8(1)
// attr
AttrStateOFF = int8(0) // 匿名
AttrStateOn = int8(1) // 展示
)
// var opinion
var (
VoteDesc = map[int8]string{
NoVote: "未投票",
BlockedVote: "违规",
RuleVote: "不违规",
DeleteVote: "弃权",
BlockedDelete: "违规删除",
}
AttrDesc = map[int8]string{
AttrStateOFF: "匿名",
AttrStateOn: "展示",
}
VoteStateDesc = map[int8]string{
VoteStateON: "正常",
VoteStateOFF: "删除",
}
)
// Opinion opinion struct.
type Opinion struct {
ID int64 `gorm:"column:id" json:"id"`
VID int64 `gorm:"column:vid" json:"vid"`
CID int64 `gorm:"column:cid" json:"cid"`
MID int64 `gorm:"column:mid" json:"mid"`
OperID int64 `gorm:"column:oper_id" json:"oper_id"`
Vote int8 `gorm:"column:vote" json:"vote"`
State int8 `gorm:"column:state" json:"state"`
Attr int8 `gorm:"column:attr" json:"attr"`
Likes int `gorm:"column:likes" json:"likes"`
Hates int `gorm:"column:hates" json:"hates"`
Content string `gorm:"column:content" json:"content"`
CTime xtime.Time `gorm:"column:ctime" json:"ctime"`
UName string `gorm:"-" json:"uname"`
AttrDesc string `gorm:"-" json:"attr_desc"`
VoteDesc string `gorm:"-" json:"vote_desc"`
VoteStateDesc string `gorm:"-" json:"vote_state_desc"`
OPName string `gorm:"-" json:"oname"`
Fans int64 `gorm:"-" json:"fans"`
}
// TableName blocked_opinion tablename
func (*Opinion) TableName() string {
return "blocked_opinion"
}
// OpinionList is Opinion list.
type OpinionList struct {
Count int `json:"count"`
Order string `json:"order"`
Sort string `json:"sort"`
PN int `json:"pn"`
PS int `json:"ps"`
IDs []int64 `json:"-"`
List []*Opinion `json:"list"`
}
// OpinionCaseResult struct.
type OpinionCaseResult struct {
CID int64 `gorm:"column:cid"`
MID int64 `gorm:"column:mid"`
VID int64 `gorm:"column:mid"`
Content string `gorm:"column:content"`
}

View File

@@ -0,0 +1,187 @@
package blocked
// ArgBlockedSearch param struct.
type ArgBlockedSearch struct {
Keyword string `form:"keyword" default:"-"`
UID int64 `form:"mid" default:"-100"`
OPID int64 `form:"op_id" default:"-100"`
OriginType int8 `form:"origin_type" default:"-100"`
BlockedType int8 `form:"blocked_type" default:"-100"`
PublishStatus int8 `form:"publish_status" default:"-100"`
Start string `form:"start"`
End string `form:"end"`
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"50"`
Order string `form:"order" default:"id"`
Sort string `form:"sort" default:"desc"`
}
// ArgPublishSearch arg publish search
type ArgPublishSearch struct {
Keyword string `form:"keyword" default:"-"`
Type int8 `form:"type" default:"-100"`
ShowFrom string `form:"start"`
ShowTo string `form:"end"`
Order string `form:"order" default:"id"`
Sort string `form:"sort" default:"desc"`
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"50"`
}
// ArgCaseSearch struct
type ArgCaseSearch struct {
Keyword string `form:"keyword" default:"-"`
OriginType int8 `form:"origin_type" default:"-100"`
Status int8 `form:"status" default:"-100"`
CaseType int8 `form:"case_type" default:"-100"`
UID int64 `form:"uid" default:"-100"`
OPID int64 `form:"op_id" default:"-100"`
TimeFrom string `form:"start"`
TimeTo string `form:"end"`
Order string `form:"order" default:"id"`
Sort string `form:"sort" default:"desc"`
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"50"`
}
// ArgJurySearch struct
type ArgJurySearch struct {
UID int64 `form:"mid" default:"-100"`
Status int8 `form:"status" default:"-100"`
Black int8 `form:"type" default:"-100"`
ExpiredFrom string `form:"start"`
ExpiredTo string `form:"end"`
Order string `form:"order" default:"id"`
Sort string `form:"sort" default:"desc"`
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"50"`
}
// ArgAddJurys struct
type ArgAddJurys struct {
MIDs []int64 `form:"mids,split" validate:"required"`
OPID int64 `form:"op_id" validate:"required"`
Day int `form:"day" validate:"required"`
Send int8 `form:"send" validate:"min=0,max=1"`
}
// ArgOpinionSearch struct
type ArgOpinionSearch struct {
UID int64 `form:"mid" default:"-100"`
CID int64 `form:"cid" default:"-100"`
Vote int `form:"vote" default:"-100"`
State int8 `form:"state" default:"-100"`
Order string `form:"order" default:"id"`
Sort string `form:"sort" default:"desc"`
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"50"`
}
// ArgKpiPointSearch param struct.
type ArgKpiPointSearch struct {
UID int64 `form:"uid" default:"-100"`
Start string `form:"start" default:"-"`
End string `form:"end" default:"-"`
Order string `form:"order" default:"id"`
Sort string `form:"sort" default:"desc"`
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"50"`
}
// ArgKpiSearch param struct.
type ArgKpiSearch struct {
UID int64 `form:"uid" default:"0"`
Start string `form:"start"`
End string `form:"end"`
PN int `form:"pn" default:"1"`
PS int `form:"ps" default:"20"`
}
// ArgPublish param struct.
type ArgPublish struct {
ID int64 `form:"id"`
OID int64 `form:"op_id" validate:"required"`
PType int8 `form:"publish_type" validate:"min=1,max=4"`
PublishStatus int8 `form:"publish_status" validate:"min=0,max=1"`
StickStatus int8 `form:"stick_status" validate:"min=0,max=1"`
SubTitle string `form:"sub_title"`
Title string `form:"title"`
URL string `form:"url"`
Content string `form:"content"`
ShowTime string `form:"show_time"`
}
// ArgCase param struct.
type ArgCase struct {
ID int64 `form:"id"`
UID int64 `form:"uid" validate:"required"`
Otype int8 `form:"origin_type" validate:"min=0,max=20"`
ReasonType int8 `form:"reason_type" validate:"min=0,max=40"`
PunishResult int8 `form:"punish_result" validate:"min=0,max=10"`
BlockedDays int `form:"blocked_days"`
OriginTitle string `form:"origin_title" validate:"required"`
OriginURL string `form:"origin_url" validate:"required"`
OriginContent string `form:"origin_content"`
RelationID string `form:"relation_id"`
OID int64 `form:"op_id" validate:"required"`
}
// ArgUpStatus param struct
type ArgUpStatus struct {
IDS []int64 `form:"ids,split" validate:"min=1,max=100"`
OID int64 `form:"op_id" validate:"required"`
Status int8 `form:"status"`
}
// ArgUpInfo param struct
type ArgUpInfo struct {
ID int64 `form:"id" validate:"required"`
OID int64 `form:"op_id" validate:"required"`
Status int8 `form:"status" validate:"min=0,max=1"`
Content string `form:"content"`
}
// ArgCaseConf param struct
type ArgCaseConf struct {
CaseGiveHours int `form:"case_give_hours" default:"0"`
CaseCheckHours int `form:"case_check_hours" default:"0"`
JuryVoteRadio int `form:"jury_vote_radio" default:"0"`
CaseJudgeRadio int `form:"case_judge_radio" default:"0"`
CaseVoteMin int `form:"case_vote_min" default:"0"`
CaseObtainMax int `form:"case_obtain_max" default:"0"`
CaseVoteMax int `form:"case_vote_max" default:"0"`
JuryApplyMax int `form:"jury_apply_max" default:"0"`
CaseLoadMax int `form:"case_load_max" default:"0"`
CaseLoadSwitch int `form:"case_load_switch" default:"0"`
CaseVoteMaxPercent int `form:"case_vote_max_percent" default:"0"`
OID int `form:"op_id" validate:"required"`
}
// ArgAutoCaseConf param struct.
type ArgAutoCaseConf struct {
ID int64 `form:"id"`
Platform int8 `form:"platform" validate:"required"`
Reasons []int64 `form:"reasons,split"`
ReportScore int `form:"report_score" default:"0"`
Likes int `form:"likes" default:"0"`
OID int64 `form:"op_id" validate:"required"`
}
// Pager param struct.
type Pager struct {
Total int `json:"total"`
PN int `json:"page"`
PS int `json:"pagesize"`
Order string `json:"order"`
Sort string `json:"sort"`
}
// ArgVoteNum param struct.
type ArgVoteNum struct {
OID int64 `form:"op_id" validate:"required"`
RateS int8 `form:"rate_s" default:"1"`
RateA int8 `form:"rate_a" default:"1"`
RateB int8 `form:"rate_b" default:"1"`
RateC int8 `form:"rate_c" default:"1"`
RateD int8 `form:"rate_d" default:"1"`
}

View File

@@ -0,0 +1,68 @@
package blocked
import (
xtime "go-common/library/time"
)
// const publish
const (
// ptype.
PublishOfficial = int8(1) // 官方公告
PublishWeekCommunity = int8(2) // 社区周报
PublishFeatureBuild = int8(3) // 功能建设
PublishHotCommunity = int8(4) // 社区热点
// stick_status.
PublishStickON = int8(1) // 置顶
PublishStickOFF = int8(0) // 不置顶
)
// var publish
var (
PTypeDesc = map[int8]string{
PublishOfficial: "官方公告",
PublishWeekCommunity: "社区周报",
PublishFeatureBuild: "功能建设",
PublishHotCommunity: "社区热点",
}
SStatusDesc = map[int8]string{
PublishStickON: "置顶",
PublishStickOFF: "不置顶",
}
)
// Publish is blocked_publish model.
type Publish struct {
ID int64 `gorm:"column:id" json:"id"`
Title string `gorm:"column:title" json:"title"`
SubTitle string `gorm:"column:sub_title" json:"sub_title"`
Type int8 `gorm:"column:ptype" json:"type"`
PublishStatus int8 `gorm:"column:publish_status" json:"publish_status"`
StickStatus int8 `gorm:"column:stick_status" json:"stick_status"`
Status int8 `gorm:"column:status" json:"status"`
Content string `gorm:"column:content" json:"content"`
URL string `gorm:"column:url" json:"url"`
OPID int64 `gorm:"column:oper_id" json:"oper_id"`
ShowTime xtime.Time `gorm:"column:show_time" json:"show_time"`
PublishTypeDesc string `gorm:"-" json:"publish_type_desc"`
PublishStatusDesc string `gorm:"-" json:"publish_status_desc"`
StickStatusDesc string `gorm:"-" json:"stick_status_desc"`
OPName string `gorm:"-" json:"oname"`
CTime xtime.Time `gorm:"column:ctime" json:"-"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
}
// PublishList is publish list.
type PublishList struct {
Count int `json:"count"`
Order string `json:"order"`
Sort string `json:"sort"`
PN int `json:"pn"`
PS int `json:"ps"`
IDs []int64 `json:"-"`
List []*Publish `json:"list"`
}
// TableName publish tablename
func (*Publish) TableName() string {
return "blocked_publish"
}

View File

@@ -0,0 +1,20 @@
package blocked
import xtime "go-common/library/time"
// Reason is blocked_reason model.
type Reason struct {
ID int `gorm:"column:id" json:"id"`
Content string `gorm:"column:content" json:"content"`
Reason string `gorm:"column:reason" json:"reason"`
Status int8 `gorm:"column:status" json:"status"`
OperID int `gorm:"column:oper_id" json:"oper_id"`
CTime xtime.Time `gorm:"column:ctime" json:"-"`
MTime xtime.Time `gorm:"column:mtime" json:"-"`
OPName string `gorm:"-" json:"oname"`
}
// TableName publish tablename
func (*Reason) TableName() string {
return "blocked_reason"
}

View File

@@ -0,0 +1,35 @@
package model
// const common
const (
TimeFormatSec = "2006-01-02 15:04:05"
TimeFormatDay = "2006-01-02"
)
// MangerInfo struct
type MangerInfo struct {
OID int64 `json:"id"`
Uname string `json:"username"`
}
// EmptyList struct
type EmptyList struct {
Count int `json:"total_count"`
Order string `json:"order"`
Sort string `json:"sort"`
PN int `json:"pn"`
PS int `json:"ps"`
List struct{} `json:"list"`
}
// ArrayUnique struct
func ArrayUnique(ids []int64) (res []int64) {
length := len(ids)
for i := 0; i < length; i++ {
if (i > 0 && ids[i-1] == ids[i]) || ids[i] == 0 {
continue
}
res = append(res, ids[i])
}
return
}

View File

@@ -0,0 +1,28 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = ["search.go"],
importpath = "go-common/app/admin/main/credit/model/search",
tags = ["automanaged"],
visibility = ["//visibility:public"],
)
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,74 @@
package search
// Info struct
type Info struct {
ID int64 `json:"id"`
OPID int64 `json:"oper_id"`
Status int8 `json:"status" default:"-1"`
PStatus int8 `json:"publish_status" default:"-1"`
}
// Publish struct
type Publish struct {
ID int64 `json:"id,omitempty"`
Title string `json:"title,omitempty"`
SubTitle string `json:"sub_title,omitempty"`
ShowTime string `json:"show_time,omitempty"`
OPID int64 `json:"oper_id,omitempty"`
PType int8 `json:"ptype,omitempty"`
Status int8 `json:"status"`
}
// Case struct
type Case struct {
ID int64 `json:"id,omitempty"`
MID int64 `json:"mid,omitempty"`
OPID int64 `json:"oper_id,omitempty"`
OType int8 `json:"origin_type,omitempty"`
Status int8 `json:"status,omitempty"`
CaseType int8 `json:"case_type"`
StartTime string `json:"start_time,omitempty"`
}
// Jury struct
type Jury struct {
ID int64 `json:"id,omitempty"`
OPID int64 `json:"oper_id,omitempty"`
Expired string `json:"expired,omitempty"`
Status int8 `json:"status,omitempty"`
Black int8 `json:"black"`
}
// Opinion struct
type Opinion struct {
ID int64 `json:"id,omitempty"`
OPID int64 `json:"oper_id,omitempty"`
State int8 `json:"state,omitempty"`
}
// Update struct
type Update struct {
AppID string
IP string
Data interface{}
}
// Page struct
type Page struct {
PN int `json:"num"`
PS int `json:"size"`
Total int `json:"total"`
}
// ResSearch result
type ResSearch struct {
ID int64 `json:"id"`
}
// ReSearchData search result detail.
type ReSearchData struct {
Order string `json:"order"`
Sort string `json:"sort"`
Page *Page `json:"page"`
Result []*ResSearch `json:"result"`
}

View File

@@ -0,0 +1,76 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"jury_test.go",
"service_test.go",
],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/model/blocked:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"blocked.go",
"extra_func.go",
"jury.go",
"labour.go",
"msg.go",
"service.go",
"user.go",
],
importpath = "go-common/app/admin/main/credit/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/credit/conf:go_default_library",
"//app/admin/main/credit/dao/account:go_default_library",
"//app/admin/main/credit/dao/blocked:go_default_library",
"//app/admin/main/credit/dao/manager:go_default_library",
"//app/admin/main/credit/dao/msg:go_default_library",
"//app/admin/main/credit/dao/relation:go_default_library",
"//app/admin/main/credit/dao/search:go_default_library",
"//app/admin/main/credit/dao/upload:go_default_library",
"//app/admin/main/credit/model:go_default_library",
"//app/admin/main/credit/model/blocked:go_default_library",
"//app/service/main/account/api:go_default_library",
"//app/service/main/account/model:go_default_library",
"//app/service/main/coin/api:go_default_library",
"//app/service/main/relation/model:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/metadata:go_default_library",
"//library/sync/errgroup:go_default_library",
"//library/time:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/jinzhu/gorm: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,153 @@
package service
import (
"context"
"fmt"
"sort"
creditMDL "go-common/app/admin/main/credit/model"
"go-common/app/admin/main/credit/model/blocked"
account "go-common/app/service/main/account/model"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/sync/errgroup"
"go-common/library/xstr"
)
// Infos deal info data.
func (s *Service) Infos(c context.Context, arg *blocked.ArgBlockedSearch) (list []*blocked.Info, pager *blocked.Pager, err error) {
var ids []int64
ids, pager, err = s.searchDao.Blocked(c, arg)
if err != nil {
log.Error("s.searchDao.Blocked error (%v)", err)
return
}
if len(ids) == 0 {
return
}
var (
infoMap map[int64]*account.Info
uids = make([]int64, len(ids))
)
ids = creditMDL.ArrayUnique(ids)
if err = s.blockedDao.ReadDB.Where("id IN (?)", ids).Order(fmt.Sprintf("%s %s", arg.Order, arg.Sort)).Find(&list).Error; err != nil {
if err != ecode.NothingFound {
log.Error("s.blockedDao(%s) error(%v)", xstr.JoinInts(ids), err)
return
}
log.Warn("search ids(%s) not in db", xstr.JoinInts(ids))
err = nil
return
}
for _, v := range list {
uids = append(uids, v.UID)
}
if infoMap, err = s.accDao.RPCInfos(c, uids); err != nil {
log.Error("s.accDao.RPCInfos(%s) error(%v)", xstr.JoinInts(uids), err)
err = nil
}
for _, v := range list {
v.OPName = s.Managers[v.OperID]
if v.OPName == "" {
v.OPName = v.OOPName
}
if in, ok := infoMap[v.UID]; ok {
v.UName = in.Name
}
v.ReasonTypeDesc = blocked.ReasonTypeDesc(v.ReasonType)
v.PublishStatusDesc = blocked.PStatusDesc[v.PublishStatus]
v.OriginTypeDesc = blocked.OriginTypeDesc[v.OriginType]
v.BlockedTypeDesc = blocked.BTypeDesc[v.BlockedType]
v.BlockedDaysDesc = blocked.BDaysDesc(v.BlockedDays, v.MoralNum, v.PunishType, v.BlockedForever)
}
return
}
// InfosEx export info list
func (s *Service) InfosEx(c context.Context, arg *blocked.ArgBlockedSearch) (list []*blocked.Info, err error) {
var (
count int
pager *blocked.Pager
g errgroup.Group
ps = 500
)
if list, pager, err = s.Infos(c, arg); err != nil {
log.Error("s.Infos(%+v) error(%v)", arg, err)
return
}
if pager == nil {
log.Warn("arg(%+v) info search data empty!", arg)
return
}
count = pager.Total / ps
if pager.Total%ps != 0 {
count++
}
lCh := make(chan []*blocked.Info, count)
for pn := 1; pn <= count; pn++ {
tmpPn := pn
g.Go(func() (err error) {
var gInfo []*blocked.Info
gArg := &blocked.ArgBlockedSearch{
Keyword: arg.Keyword,
UID: arg.UID,
OPID: arg.OPID,
OriginType: arg.OriginType,
BlockedType: arg.BlockedType,
PublishStatus: arg.PublishStatus,
Start: arg.Start,
End: arg.End,
PN: tmpPn,
PS: ps,
Order: arg.Order,
Sort: arg.Sort,
}
gInfo, _, err = s.Infos(c, gArg)
if err != nil {
log.Error("s.Infos(%+v) error(%v)", gArg, err)
err = nil
return
}
lCh <- gInfo
return
})
}
g.Wait()
close(lCh)
for bInfo := range lCh {
list = append(list, bInfo...)
}
sort.Slice(list, func(i int, j int) bool {
return list[i].ID < list[j].ID
})
return
}
// Publishs get publishs data
func (s *Service) Publishs(c context.Context, arg *blocked.ArgPublishSearch) (list []*blocked.Publish, pager *blocked.Pager, err error) {
var ids []int64
ids, pager, err = s.searchDao.Publish(c, arg)
if err != nil {
log.Error("s.searchDao.Publish error (%v)", err)
return
}
if len(ids) == 0 {
return
}
ids = creditMDL.ArrayUnique(ids)
if err = s.blockedDao.ReadDB.Where("id IN (?)", ids).Order(fmt.Sprintf("%s %s", arg.Order, arg.Sort)).Find(&list).Error; err != nil {
if err != ecode.NothingFound {
log.Error("s.blockedDao(%s) error(%v)", xstr.JoinInts(ids), err)
return
}
log.Warn("search ids(%s) not in db", xstr.JoinInts(ids))
err = nil
}
for _, v := range list {
v.OPName = s.Managers[v.OPID]
v.PublishTypeDesc = blocked.PTypeDesc[v.Type]
v.PublishStatusDesc = blocked.PStatusDesc[v.PublishStatus]
v.StickStatusDesc = blocked.SStatusDesc[v.StickStatus]
}
return
}

View File

@@ -0,0 +1,90 @@
package service
import (
"bytes"
"context"
"encoding/csv"
"io"
"strconv"
"time"
coinclient "go-common/app/service/main/coin/api"
"go-common/library/log"
)
// FormatCSV format csv data.
func (s *Service) FormatCSV(records [][]string) (res []byte) {
buf := new(bytes.Buffer)
w := csv.NewWriter(buf)
for _, record := range records {
if err := w.Write(record); err != nil {
log.Error("error(%+v) writing record to csv:", err)
return
}
}
w.Flush()
res = buf.Bytes()
return
}
// Upload http upload file.
func (s *Service) Upload(c context.Context, fileName, fileType string, expire int64, body io.Reader) (location string, err error) {
if location, err = s.uploadDao.Upload(c, fileName, fileType, expire, body); err != nil {
log.Error("s.upload.Upload() error(%v)", err)
}
return
}
// AnnualCoins .
func (s *Service) AnnualCoins(c context.Context, reader *csv.Reader) (fmid []int64) {
for {
record, err := reader.Read()
if err == io.EOF {
log.Warn("AnnualCoins is over!")
err = nil
break
}
if err != nil {
log.Error("AnnualCoins(%+v) Error(%+v)", record, err)
err = nil
continue
}
log.Info("AnnualCoins record(%+v)", record)
if len(record) < 2 {
log.Error("AnnualCoins record(%+v) len<2", record)
continue
}
mid, err := strconv.ParseInt(record[0], 10, 64)
if err != nil {
log.Error("AnnualCoins strconv.ParseInt mid(%+v) err(%+v)", record, err)
err = nil
continue
}
coins, err := strconv.ParseInt(record[1], 10, 64)
if err != nil {
log.Error("AnnualCoins strconv.ParseInt coins(%+v) err(%+v)", record, err)
err = nil
continue
}
arg := &coinclient.ModifyCoinsReq{
Mid: mid,
Count: float64(coins),
Reason: "风纪委奖励",
IP: "",
Operator: "credit",
CheckZero: 1,
Ts: time.Now().Unix(),
}
_, err = s.coinClient.ModifyCoins(context.Background(), arg)
if err != nil {
fmid = append(fmid, mid)
log.Error("ModifyCoins arg(%+v), err(%+v)", arg, err)
continue
}
if err = s.msgDao.SendSysMsg(context.Background(), mid, "您的风纪委硬币礼包已到账", "Hi 风纪委员你好你的2018年风纪委硬币礼包已到账快进入你的硬币账户看看吧"); err != nil {
log.Error("SendSysMsg mid(%d), err(%+v)", mid, err)
}
time.Sleep(time.Duration(50) * time.Millisecond)
}
return
}

View File

@@ -0,0 +1,546 @@
package service
import (
"context"
"encoding/json"
"fmt"
"reflect"
"sort"
"strconv"
"time"
creditMDL "go-common/app/admin/main/credit/model"
"go-common/app/admin/main/credit/model/blocked"
account "go-common/app/service/main/account/api"
relationmdl "go-common/app/service/main/relation/model"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
"go-common/library/sync/errgroup"
xtime "go-common/library/time"
"go-common/library/xstr"
)
// AddJury add jury to admin
func (s *Service) AddJury(c context.Context, arg *blocked.ArgAddJurys) (err error) {
arg.MIDs = creditMDL.ArrayUnique(arg.MIDs)
if len(arg.MIDs) == 0 {
return
}
items := []*blocked.Jury{}
if err = s.blockedDao.ReadDB.Where("mid IN (?)", arg.MIDs).Find(&items).Error; err != nil {
log.Error("s.blockedDao.juryByMIDs(%s) error(%v)", xstr.JoinInts(arg.MIDs), err)
err = nil
}
mids := make(map[int64]*blocked.Jury, len(arg.MIDs))
for _, v := range items {
mids[v.UID] = v
}
day, _ := time.ParseDuration("24h")
users := make([]*blocked.Jury, 0, len(arg.MIDs))
tx := s.DB.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
now := time.Now()
var multiple []interface{}
for _, mid := range arg.MIDs {
user := &blocked.Jury{
UID: mid,
Status: blocked.JuryStatusOn,
OPID: arg.OPID,
Remark: blocked.AddJuryRemark,
Expired: xtime.Time(now.Add(day * time.Duration(arg.Day)).Unix()),
}
if jury, ok := mids[mid]; ok {
user.ID = jury.ID
switch {
case jury.Black == blocked.JuryBlack:
continue
case jury.Black == blocked.JuryWhite:
user.Black = blocked.JuryWhite
}
user.CTime = jury.CTime
user.VoteTotal = jury.VoteTotal
user.VoteRight = jury.VoteRight
user.Total = jury.Total
single := map[string]interface{}{
"id": jury.ID,
"oper_id": arg.OPID,
"status": blocked.JuryStatusOn,
"black": user.Black,
"expired": now.Add(day * time.Duration(arg.Day)).Format(creditMDL.TimeFormatSec),
}
multiple = append(multiple, single)
}
if err = tx.Save(&user).Error; err != nil {
log.Error("s.DB.Create error(%v)", err)
return
}
s.AddNotify(func() {
s.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedJury, blocked.TableBlockedJury, multiple)
})
users = append(users, user)
}
if arg.Send == blocked.NeedSendMsg {
for _, u := range users {
msg := &blocked.SysMsg{
Type: blocked.MsgTypeGetJuryer,
MID: u.UID,
Day: arg.Day,
RemoteIP: metadata.String(c, metadata.RemoteIP),
}
s.MsgCh <- msg
}
}
return
}
// Cases deal case data.
func (s *Service) Cases(c context.Context, arg *blocked.ArgCaseSearch) (list []*blocked.Case, pager *blocked.Pager, err error) {
var ids []int64
ids, pager, err = s.searchDao.Case(c, arg)
if err != nil {
log.Error(" s.searchDao.Case error(%v)", err)
return
}
if len(ids) == 0 {
return
}
var (
accInfoMap map[int64]*account.Info
relationsMap map[int64]*relationmdl.Stat
uids = make([]int64, 0)
)
ids = creditMDL.ArrayUnique(ids)
if err = s.blockedDao.ReadDB.Where("id IN (?)", ids).Order(fmt.Sprintf("%s %s", arg.Order, arg.Sort)).Find(&list).Error; err != nil {
if err != ecode.NothingFound {
log.Error("s.blockedDao(%s) error(%v)", xstr.JoinInts(ids), err)
return
}
log.Warn("search ids(%s) not in db", xstr.JoinInts(ids))
err = nil
}
for _, v := range list {
if v.MID > 0 {
uids = append(uids, v.MID)
}
}
if accInfoMap, err = s.accDao.RPCInfos(c, uids); err != nil {
log.Error("s.accDao.RPCInfos(%s) error(%v)", xstr.JoinInts(uids), err)
err = nil
}
if relationsMap, err = s.RelationDao.RPCStats(c, uids); err != nil {
log.Error("s.RelationDao.RPCStats(%s) error(%v)", xstr.JoinInts(uids), err)
err = nil
}
for _, v := range list {
if accInfo, ok := accInfoMap[v.MID]; ok {
v.Uname = accInfo.Name
}
if relationInfo, ok := relationsMap[v.MID]; ok {
v.Fans = relationInfo.Follower
}
v.OPName = s.Managers[v.OPID]
v.StatusDesc = blocked.StatusDesc[v.Status]
v.OriginTypeDesc = blocked.OriginTypeDesc[v.OriginType]
v.ReasonTypeDesc = blocked.ReasonTypeDesc(v.ReasonType)
v.PunishDesc = blocked.PunishDesc[v.PunishResult]
v.CaseTypeDesc = blocked.CaseTypeDesc[v.CaseType]
v.VoteTotal = blocked.VoteTotal(v.VoteRule, v.VoteBreak, v.VoteDelete)
if v.VoteRule > 0 || v.VoteBreak > 0 || v.VoteDelete > 0 {
v.BlockedPercent = blocked.BreakPercent(v.VoteRule, v.VoteBreak, v.VoteDelete)
v.DeletePercent = blocked.DeletePercent(v.VoteRule, v.VoteBreak, v.VoteDelete)
v.RulePercent = blocked.RulePercent(v.VoteRule, v.VoteBreak, v.VoteDelete)
}
}
return
}
// Opinions is block opinions
func (s *Service) Opinions(c context.Context, arg *blocked.ArgOpinionSearch) (list []*blocked.Opinion, pager *blocked.Pager, err error) {
var ids []int64
ids, pager, err = s.searchDao.Opinion(c, arg)
if err != nil {
log.Error("s.blockedDao.Search appid(%s) error(%v)", "", err)
return
}
if len(ids) == 0 {
return
}
var (
accInfoMap map[int64]*account.Info
relationsMap map[int64]*relationmdl.Stat
uids = make([]int64, 0)
)
ids = creditMDL.ArrayUnique(ids)
if err = s.blockedDao.ReadDB.Where("id IN (?)", ids).Order(fmt.Sprintf("%s %s", arg.Order, arg.Sort)).Find(&list).Error; err != nil {
if err != ecode.NothingFound {
log.Error("s.blockedDao(%s) error(%v)", xstr.JoinInts(ids), err)
return
}
log.Warn("search ids(%s) not in db", xstr.JoinInts(ids))
err = nil
}
for _, v := range list {
if v.MID > 0 {
uids = append(uids, v.MID)
}
}
accInfoMap, err = s.accDao.RPCInfos(c, uids)
if err != nil {
log.Error("s.accDao.RPCInfos error(%v)", err)
err = nil
}
if relationsMap, err = s.RelationDao.RPCStats(c, uids); err != nil {
log.Error("s.RelationDao.RPCStats(%s) error(%v)", xstr.JoinInts(uids), err)
err = nil
}
for _, v := range list {
if opinion, ok := accInfoMap[v.MID]; ok {
v.UName = opinion.Name
}
if relationInfo, ok := relationsMap[v.MID]; ok {
v.Fans = relationInfo.Follower
}
v.OPName = s.Managers[v.OperID]
v.AttrDesc = blocked.AttrDesc[v.Attr]
v.VoteDesc = blocked.VoteDesc[v.Vote]
v.VoteStateDesc = blocked.VoteStateDesc[v.State]
}
return
}
// Jurys select jury lists.
func (s *Service) Jurys(c context.Context, arg *blocked.ArgJurySearch) (list []*blocked.Jury, pager *blocked.Pager, err error) {
var ids []int64
ids, pager, err = s.searchDao.Jury(c, arg)
if err != nil {
log.Error("s.searchDao.Jury error(%v)", err)
return
}
if len(ids) == 0 {
return
}
var (
accInfoMap map[int64]*account.Info
uids = make([]int64, len(ids))
)
ids = creditMDL.ArrayUnique(ids)
if err = s.blockedDao.ReadDB.Where("id IN (?)", ids).Order(fmt.Sprintf("%s %s", arg.Order, arg.Sort)).Find(&list).Error; err != nil {
if err != ecode.NothingFound {
log.Error("s.blockedDao(%s) error(%v)", xstr.JoinInts(ids), err)
return
}
log.Warn("search ids(%s) not in db", xstr.JoinInts(ids))
err = nil
}
for _, v := range list {
uids = append(uids, v.UID)
}
accInfoMap, err = s.accDao.RPCInfos(c, uids)
if err != nil {
log.Error("s.accDao.RPCInfos error(%v)", err)
err = nil
}
for _, v := range list {
if jury, ok := accInfoMap[v.UID]; ok {
v.UName = jury.Name
}
v.OPName = s.Managers[v.OPID]
v.EffectDay = xtime.Time(v.Expired.Time().AddDate(0, 0, -blocked.JuryDay).Unix())
if v.EffectDay < v.CTime {
v.EffectDay = v.CTime
}
if v.VoteTotal > 0 {
v.VoteRadio = strconv.FormatFloat(float64(v.VoteRight)/float64(v.VoteTotal)*100, 'f', 2, 64)
} else {
v.VoteRadio = "-1"
}
v.StatusDesc = blocked.JuryerStatus[v.Status]
v.BlackDesc = blocked.JuryerStyle[v.Black]
}
return
}
// JurysEx export jury list.
func (s *Service) JurysEx(c context.Context, arg *blocked.ArgJurySearch) (list []*blocked.Jury, err error) {
var (
ps = 500
count int
pager *blocked.Pager
g errgroup.Group
)
if list, pager, err = s.Jurys(c, arg); err != nil {
log.Error("s.Infos(%+v) error(%v)", arg, err)
return
}
if pager == nil {
log.Warn("arg(%+v) jury search data empty!", arg)
return
}
count = pager.Total / ps
if pager.Total%ps != 0 {
count++
}
lCh := make(chan []*blocked.Jury, count)
for pn := 1; pn <= count; pn++ {
tmpPn := pn
g.Go(func() (err error) {
var gJury []*blocked.Jury
gArg := &blocked.ArgJurySearch{
UID: arg.UID,
Status: arg.Status,
Black: arg.Black,
ExpiredFrom: arg.ExpiredFrom,
ExpiredTo: arg.ExpiredTo,
Order: arg.Order,
Sort: arg.Sort,
PN: tmpPn,
PS: ps,
}
gJury, _, err = s.Jurys(c, gArg)
if err != nil {
log.Error("s.Jurys(%+v) error(%v)", gJury, err)
err = nil
return
}
lCh <- gJury
return
})
}
g.Wait()
close(lCh)
for jInfo := range lCh {
list = append(list, jInfo...)
}
sort.Slice(list, func(i int, j int) bool {
return list[i].ID < list[j].ID
})
return
}
// UpCaseStatus update case status.
func (s *Service) UpCaseStatus(c context.Context, arg *blocked.ArgUpStatus) (err error) {
items := []blocked.Case{}
if err = s.blockedDao.ReadDB.Where("id IN(?)", arg.IDS).Find(&items).Error; err != nil {
log.Error("s.blockedDao.caseByIDs(%s) error(%v)", xstr.JoinInts(arg.IDS), err)
return
}
var multiple []interface{}
if arg.Status == blocked.CaseStatusGranting {
hour := s.CaseConfig(blocked.ConfigCaseGiveHours)
now := time.Now()
if err = s.DB.Model(blocked.Case{}).Where("id IN(?)", arg.IDS).Updates(
&blocked.Case{
Status: arg.Status,
OPID: arg.OID,
StartTime: xtime.Time(now.Unix()),
EndTime: xtime.Time(now.Add(time.Duration(hour) * time.Hour).Unix()),
}).Error; err != nil {
return
}
for _, item := range items {
single := map[string]interface{}{
"id": item.ID,
"oper_id": arg.OID,
"start_time": now.Format(creditMDL.TimeFormatSec),
"status": arg.Status,
"case_type": item.CaseType,
}
multiple = append(multiple, single)
}
} else {
if err = s.DB.Model(blocked.Case{}).Where("id IN(?)", arg.IDS).Updates(
&blocked.Case{
Status: arg.Status,
OPID: arg.OID,
}).Error; err != nil {
return
}
for _, item := range items {
single := map[string]interface{}{
"id": item.ID,
"oper_id": arg.OID,
"status": arg.Status,
"case_type": item.CaseType,
}
multiple = append(multiple, single)
}
}
s.AddNotify(func() {
s.Search.SearchUpdate(context.TODO(), blocked.BusinessBlockedCase, blocked.TableBlockedCase, multiple)
})
return
}
// CaseReason reason info.
func (s *Service) CaseReason(c context.Context) (cr map[int]string, err error) {
var reason []*blocked.Reason
cr = make(map[int]string)
if err = s.ReadDB.Select([]string{"id", "reason"}).Where("status = 0").Find(&reason).Error; err != nil {
if err == ecode.NothingFound {
err = nil
return
}
return
}
for _, v := range reason {
cr[v.ID] = v.Reason
}
return
}
// CaseConf caseconfig list.
func (s *Service) CaseConf(c context.Context) (cc map[string]string, err error) {
var configs []*blocked.Config
cc = make(map[string]string)
err = s.ReadDB.Select([]string{"config_key", "content"}).Find(&configs).Error
if err != nil || configs == nil {
return
}
for _, v := range configs {
cc[v.ConfigKey] = v.Content
}
return
}
// SetCaseConf update case config.
func (s *Service) SetCaseConf(c context.Context, cc *blocked.ArgCaseConf) (err error) {
v := reflect.ValueOf(cc).Elem()
tx := s.DB.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
for i := 0; i < v.NumField(); i++ {
fieldValue := strconv.Itoa(v.Field(i).Interface().(int))
tag := v.Type().Field(i).Tag.Get("form")
if err = tx.Model(&blocked.Config{}).Where("config_key = ?", tag).Updates(map[string]interface{}{"content": fieldValue, "oper_id": cc.OID}).Error; err != nil {
log.Error("caseConfig(%s,%d) update error(%v)", v.Field(i).Type().Name(), v.Field(i).Interface().(int64), err)
return
}
}
return
}
// CaseConfig get config by key.
func (s *Service) CaseConfig(ck string) (cv int64) {
if v, ok := s.caseConfCache[ck]; ok {
cv, _ = strconv.ParseInt(v, 10, 64)
}
return
}
// KPIPoint get kpi_point data
func (s *Service) KPIPoint(c context.Context, arg *blocked.ArgKpiPointSearch) (list []*blocked.KPIPoint, pager *blocked.Pager, err error) {
var ids []int64
ids, pager, err = s.searchDao.KPIPoint(c, arg)
if err != nil {
log.Error("s.searchDao.KPIPoint error (%v)", err)
return
}
if len(ids) == 0 {
return
}
ids = creditMDL.ArrayUnique(ids)
if err = s.blockedDao.ReadDB.Where("id IN (?)", ids).Order(fmt.Sprintf("%s %s", arg.Order, arg.Sort)).Find(&list).Error; err != nil {
if err != ecode.NothingFound {
log.Error("s.blockedDao(%s) error(%v)", xstr.JoinInts(ids), err)
return
}
log.Warn("search ids(%s) not in db", xstr.JoinInts(ids))
err = nil
}
return
}
// VotenumConf votenumConf list.
func (s *Service) VotenumConf(c context.Context) (cc string, err error) {
var bc = &blocked.Config{}
err = s.ReadDB.Select("content").Where("config_key = 'vote_num'").Find(&bc).Error
if err != nil || bc.Content == "" {
log.Error("s.VotenumConf(%s) error(%v)", cc, err)
return
}
cc = bc.Content
return
}
// SetVotenumConf .
func (s *Service) SetVotenumConf(c context.Context, vn *blocked.ArgVoteNum) (err error) {
v := blocked.VoteNum{}
v.RateS = vn.RateS
v.RateA = vn.RateA
v.RateB = vn.RateB
v.RateC = vn.RateC
v.RateD = vn.RateD
vnb, err := json.Marshal(v)
if err != nil {
log.Error("json.Marshal(%+v) error(%v)", v, err)
}
config := &blocked.Config{}
s.ReadDB.Where("config_key = 'vote_num'").Find(config)
var vconfig *blocked.Config
if config != nil && config.ID != 0 {
vconfig = &blocked.Config{
ID: config.ID,
ConfigKey: "vote_num",
Content: string(vnb),
OperID: vn.OID,
}
} else {
vconfig = &blocked.Config{
ConfigKey: "vote_num",
Content: string(vnb),
OperID: vn.OID,
}
}
if err = s.DB.Save(&vconfig).Error; err != nil {
log.Error("http.setAutoCaseConfig error(%v)", err)
return
}
return
}
// WebHook a webhook from work flow.
func (s *Service) WebHook(c context.Context, data []byte) (err error) {
wh := &blocked.WebHook{}
if err = json.Unmarshal(data, &wh); err != nil {
err = ecode.RequestErr
log.Error("webhook json rawmessage(%s) error(%v)", string(data), err)
return
}
if wh.Verb == "chall.SetResult" || wh.Verb == "chall.BatchSetResult" {
if wh.Target == nil || wh.Object == nil {
log.Warn("wh.Target or wh.Object is nil %v,%v", wh.Target, wh.Object)
return
}
// appeal state not changed .
if wh.Target.State == wh.Object.State {
log.Warn("appeal state not changed target=%d object=%d", wh.Target.State, wh.Object.State)
return
}
switch wh.Object.State {
case blocked.AppealStateSucc:
if err = s.blockedDao.DB.Model(&blocked.Info{}).Where("case_id =?", wh.Target.OID).Update("status", blocked.BlockStateClose).Error; err != nil {
log.Error("s.blockedDao.DB error(%v)", err)
return
}
s.MsgCh <- &blocked.SysMsg{Type: blocked.MsgTypeAppealSucc, MID: wh.Target.Mid, CID: wh.Target.OID, RemoteIP: metadata.String(c, metadata.RemoteIP)}
case blocked.AppealStateFail:
s.MsgCh <- &blocked.SysMsg{Type: blocked.MsgTypeAppealFail, MID: wh.Target.Mid, CID: wh.Target.OID, RemoteIP: metadata.String(c, metadata.RemoteIP)}
default:
log.Warn("unknown webhook state(%d) ", wh.Object.State)
}
}
return
}

View File

@@ -0,0 +1,63 @@
package service
import (
"context"
"fmt"
"testing"
"go-common/app/admin/main/credit/model/blocked"
. "github.com/smartystreets/goconvey/convey"
)
func Test_SetCaseConf(t *testing.T) {
Convey("return someting", t, func() {
cc := new(blocked.ArgCaseConf)
cc.CaseCheckHours = 2
cc.CaseGiveHours = 24
cc.CaseJudgeRadio = 60
cc.CaseLoadMax = 20
cc.CaseLoadSwitch = 1
cc.CaseObtainMax = 100
cc.CaseVoteMax = 50
cc.CaseVoteMin = 50
cc.JuryApplyMax = 200
cc.JuryVoteRadio = 40
err := s.SetCaseConf(context.TODO(), cc)
fmt.Println(cc)
fmt.Println(err)
So(err, ShouldBeNil)
So(cc, ShouldNotBeEmpty)
})
}
func Test_CaseConfig(t *testing.T) {
Convey("return someting", t, func() {
cv := s.CaseConfig(blocked.ConfigCaseGiveHours)
fmt.Println(cv)
So(cv, ShouldNotBeEmpty)
})
}
func Test_VotenumConf(t *testing.T) {
Convey("return someting", t, func() {
cc, err := s.VotenumConf(context.TODO())
fmt.Println(cc)
fmt.Println(err)
So(err, ShouldBeNil)
So(cc, ShouldNotBeEmpty)
})
}
func Test_SetVotenumConf(t *testing.T) {
Convey("return someting", t, func() {
vn := new(blocked.ArgVoteNum)
vn.OID = 1
vn.RateS = 3
vn.RateA = 2
vn.RateB = 1
vn.RateC = 1
vn.RateD = 1
err := s.SetVotenumConf(context.TODO(), vn)
So(err, ShouldBeNil)
})
}

View File

@@ -0,0 +1 @@
package service

View File

@@ -0,0 +1,43 @@
package service
import (
"context"
"time"
blkmodel "go-common/app/admin/main/credit/model/blocked"
"go-common/library/log"
)
func (s *Service) msgproc() {
// NOTE: chan
s.wg.Add(1)
go func() {
var (
c = context.TODO()
sysMsg *blkmodel.SysMsg
ok bool
title, content string
)
defer s.wg.Done()
for {
if sysMsg, ok = <-s.MsgCh; !ok {
log.Info("msgproc s.msgCh proc stop")
return
}
if sysMsg == nil {
select {
case <-time.After(3 * time.Minute):
continue
case <-s.stop:
return
}
}
title, content = blkmodel.MsgInfo(sysMsg)
if err := s.msgDao.SendSysMsg(c, sysMsg.MID, title, content); err != nil {
log.Info("mid(%d) title(%s) content(%s) send sysMsg error(%v)", sysMsg.MID, title, content, err)
continue
}
time.Sleep(100 * time.Millisecond)
}
}()
}

View File

@@ -0,0 +1,153 @@
package service
import (
"context"
"sync"
"time"
"go-common/app/admin/main/credit/conf"
accdao "go-common/app/admin/main/credit/dao/account"
blockedao "go-common/app/admin/main/credit/dao/blocked"
managerdao "go-common/app/admin/main/credit/dao/manager"
msgdao "go-common/app/admin/main/credit/dao/msg"
relationdao "go-common/app/admin/main/credit/dao/relation"
searchdao "go-common/app/admin/main/credit/dao/search"
uploaddao "go-common/app/admin/main/credit/dao/upload"
blkmodel "go-common/app/admin/main/credit/model/blocked"
coinclient "go-common/app/service/main/coin/api"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
// Service struct of service.
type Service struct {
// conf
c *conf.Config
accDao *accdao.Dao
blockedDao *blockedao.Dao
managerDao *managerdao.Dao
searchDao *searchdao.Dao
uploadDao *uploaddao.Dao
msgDao *msgdao.Dao
RelationDao *relationdao.Dao
DB *gorm.DB
ReadDB *gorm.DB
Search *searchdao.Dao
caseConfCache map[string]string
Managers map[int64]string
caseReasons map[int]string
MsgCh chan *blkmodel.SysMsg
notifych chan func()
stop chan struct{}
// wait
wg sync.WaitGroup
coinClient coinclient.CoinClient
}
// New create service instance and return.
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
blockedDao: blockedao.New(c),
managerDao: managerdao.New(c),
accDao: accdao.New(c),
searchDao: searchdao.New(c),
uploadDao: uploaddao.New(c),
RelationDao: relationdao.New(c),
msgDao: msgdao.New(c),
MsgCh: make(chan *blkmodel.SysMsg, c.ChanSize.SysMsg),
notifych: make(chan func(), c.ChanSize.SysMsg),
stop: make(chan struct{}),
}
s.DB = s.blockedDao.DB
s.ReadDB = s.blockedDao.ReadDB
s.Search = s.searchDao
var err error
if s.coinClient, err = coinclient.NewClient(c.CoinClient); err != nil {
panic(err)
}
s.loadConfig()
s.loadManager()
go s.cacheproc()
go s.loadManagerproc()
go s.msgproc()
s.wg.Add(1)
go s.notifyproc()
return s
}
func (s *Service) cacheproc() {
for {
time.Sleep(3 * time.Minute)
s.loadConfig()
}
}
func (s *Service) loadManagerproc() {
for {
time.Sleep(1 * time.Hour)
s.loadManager()
}
}
func (s *Service) loadConfig() {
cc, err := s.CaseConf(context.TODO())
if err != nil {
log.Error("s.CaseConf error(%v)", err)
return
}
s.caseConfCache = cc
cr, err := s.CaseReason(context.TODO())
if err != nil {
log.Error("s.CaseReason error(%v)", err)
return
}
s.caseReasons = cr
}
func (s *Service) loadManager() {
managers, err := s.managerDao.Managers(context.TODO())
if err != nil {
log.Error("s.Managers error(%v)", err)
return
}
s.Managers = managers
}
// AddNotify .
func (s *Service) AddNotify(f func()) {
select {
case s.notifych <- f:
default:
log.Warn("addNotify chan full")
}
}
// notifyproc nofity clear cache
func (s *Service) notifyproc() {
defer s.wg.Done()
for {
f, ok := <-s.notifych
if !ok {
log.Warn("s.notifych chan is close")
return
}
f()
}
}
// Ping check server ok.
func (s *Service) Ping(c context.Context) error {
return s.blockedDao.Ping(c)
}
// Close dao.
func (s *Service) Close() {
s.blockedDao.Close()
close(s.MsgCh)
close(s.notifych)
close(s.stop)
time.Sleep(1 * time.Second)
s.wg.Wait()
}

View File

@@ -0,0 +1,149 @@
package service
import (
"context"
"flag"
"path/filepath"
"testing"
"time"
"go-common/app/admin/main/credit/conf"
"go-common/app/admin/main/credit/model/blocked"
. "github.com/smartystreets/goconvey/convey"
)
var (
s *Service
)
// func CleanCache() {
// //c := context.TODO()
// //pool := redis.NewPool(conf.Conf.Redis.Config)
// //pool.Get(c).Do("FLUSHDB")
// }
func init() {
dir, _ := filepath.Abs("../cmd/convey-test.toml")
flag.Set("conf", dir)
conf.Init()
s = New(conf.Conf)
time.Sleep(time.Second)
}
// func WithService(f func(s *Service)) func() {
// return func() {
// Reset(func() { CleanCache() })
// f(s)
// }
// }
func TestService_loadConfig(t *testing.T) {
s = New(conf.Conf)
s.loadConfig()
s.loadManager()
//t.Logf("config (%+v)", s.c.Judge)
}
func Test_Infos(t *testing.T) {
arg := &blocked.ArgBlockedSearch{}
Convey("return someting", t, func() {
list, pager, err := s.Infos(context.TODO(), arg)
So(err, ShouldBeNil)
So(list, ShouldNotBeNil)
So(pager, ShouldNotBeNil)
})
}
func Test_InfosEx(t *testing.T) {
arg := &blocked.ArgBlockedSearch{}
Convey("return someting", t, func() {
list, err := s.InfosEx(context.TODO(), arg)
So(err, ShouldBeNil)
So(list, ShouldNotBeNil)
})
}
func Test_Publishs(t *testing.T) {
arg := &blocked.ArgPublishSearch{}
Convey("return someting", t, func() {
list, pager, err := s.Publishs(context.TODO(), arg)
So(err, ShouldBeNil)
So(list, ShouldNotBeNil)
So(pager, ShouldNotBeNil)
})
}
func Test_FormatCSV(t *testing.T) {
var records [][]string
record := []string{"sss", "ssss"}
records = append(records, record)
Convey("return someting", t, func() {
buf := s.FormatCSV(records)
So(buf, ShouldNotBeNil)
})
}
func Test_Upload(t *testing.T) {
Convey("return someting", t, func() {
_, err := s.Upload(context.TODO(), "blocked_info", "", 12313, nil)
So(err, ShouldBeNil)
})
}
func Test_AddJury(t *testing.T) {
arg := &blocked.ArgAddJurys{MIDs: []int64{111, 22}, OPID: 111, Day: 111, Send: 1}
Convey("return someting", t, func() {
err := s.AddJury(context.TODO(), arg)
So(err, ShouldBeNil)
})
}
func Test_Cases(t *testing.T) {
arg := &blocked.ArgCaseSearch{}
Convey("return someting", t, func() {
list, pager, err := s.Cases(context.TODO(), arg)
So(err, ShouldBeNil)
So(list, ShouldNotBeNil)
So(pager, ShouldNotBeNil)
})
}
func Test_Opinions(t *testing.T) {
arg := &blocked.ArgOpinionSearch{}
Convey("return someting", t, func() {
list, pager, err := s.Opinions(context.TODO(), arg)
So(err, ShouldBeNil)
So(list, ShouldNotBeNil)
So(pager, ShouldNotBeNil)
})
}
func Test_Jurys(t *testing.T) {
arg := &blocked.ArgJurySearch{}
Convey("return someting", t, func() {
list, pager, err := s.Jurys(context.TODO(), arg)
So(err, ShouldBeNil)
So(list, ShouldNotBeNil)
So(pager, ShouldNotBeNil)
})
}
func Test_JurysEx(t *testing.T) {
arg := &blocked.ArgJurySearch{}
Convey("return someting", t, func() {
res, err := s.JurysEx(context.TODO(), arg)
So(err, ShouldBeNil)
So(res, ShouldNotBeNil)
})
}
func Test_KPIPoint(t *testing.T) {
arg := &blocked.ArgKpiPointSearch{}
Convey("return someting", t, func() {
list, pager, err := s.KPIPoint(context.TODO(), arg)
So(err, ShouldBeNil)
So(list, ShouldNotBeNil)
So(pager, ShouldNotBeNil)
})
}

View File

@@ -0,0 +1,16 @@
package service
import (
"context"
account "go-common/app/service/main/account/api"
"go-common/library/log"
)
// UserInfo get account info.
func (s *Service) UserInfo(c context.Context, mid int64) (res *account.InfoReply, err error) {
if res, err = s.accDao.RPCInfo(c, mid); err != nil {
log.Error("s.accDao.RPCInfo error (%v)", err)
}
return
}