正在显示
29 个修改的文件
包含
1322 行增加
和
0 行删除
common/common.go
0 → 100644
1 | +package common | ||
2 | + | ||
3 | +import ( | ||
4 | + "oppmg/common/config" | ||
5 | + "oppmg/common/log" | ||
6 | + | ||
7 | + "github.com/astaxie/beego" | ||
8 | +) | ||
9 | + | ||
10 | +func ResetCommonConfig() { | ||
11 | + mconfig := config.RestMyConfig() | ||
12 | + var setlog log.SetLoggerConfig | ||
13 | + if mconfig.LogOutput == "console" { | ||
14 | + setlog = &log.LoggerConsole{ | ||
15 | + Level: log.LogLevelDebug, Color: true, | ||
16 | + } | ||
17 | + } else if mconfig.LogOutput == "file" { | ||
18 | + setlog = &log.LoggerFile{ | ||
19 | + Level: log.LogLevel(mconfig.LogLevel), | ||
20 | + FileName: mconfig.LogFilename, | ||
21 | + } | ||
22 | + } | ||
23 | + | ||
24 | + var logCallfunc bool | ||
25 | + if beego.BConfig.RunMode != "prod" { | ||
26 | + logCallfunc = true | ||
27 | + } | ||
28 | + log.ResetLog(setlog, logCallfunc) | ||
29 | +} |
common/config/config.go
0 → 100644
1 | +package config | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/astaxie/beego" | ||
5 | +) | ||
6 | + | ||
7 | +//MyConfig 自定义配置选项 | ||
8 | +type MyConfig struct { | ||
9 | + ConfigName string | ||
10 | + SqlConn string | ||
11 | + RedisAddPort string | ||
12 | + RedisAuth string | ||
13 | + RedisDB string | ||
14 | + LogOutput string | ||
15 | + LogFilename string | ||
16 | + LogLevel string | ||
17 | +} | ||
18 | + | ||
19 | +//MConfig | ||
20 | +var MConfig *MyConfig | ||
21 | + | ||
22 | +func RestMyConfig() *MyConfig { | ||
23 | + MConfig = &MyConfig{ | ||
24 | + ConfigName: beego.AppConfig.String("config_name"), | ||
25 | + SqlConn: beego.AppConfig.String("sqlconn"), | ||
26 | + RedisAddPort: beego.AppConfig.String("redis_add_port"), | ||
27 | + RedisAuth: beego.AppConfig.DefaultString("redis_auth", ""), | ||
28 | + RedisDB: beego.AppConfig.DefaultString("redis_db", "0"), | ||
29 | + LogOutput: beego.AppConfig.DefaultString("log_outpur", "console"), | ||
30 | + LogFilename: beego.AppConfig.DefaultString("log_filename", "./log/ability.log"), | ||
31 | + LogLevel: beego.AppConfig.DefaultString("log_Level", "debug"), | ||
32 | + } | ||
33 | + | ||
34 | + return MConfig | ||
35 | +} |
common/log/logger.go
0 → 100644
1 | +package log | ||
2 | + | ||
3 | +import ( | ||
4 | + "encoding/json" | ||
5 | + | ||
6 | + "github.com/astaxie/beego/logs" | ||
7 | +) | ||
8 | + | ||
9 | +type SetLoggerConfig interface { | ||
10 | + MarshalString() string | ||
11 | + Name() string | ||
12 | +} | ||
13 | + | ||
14 | +//LoggerConsole 日志输出到命令行 | ||
15 | +type LoggerConsole struct { | ||
16 | + Level int `json:"level,omitempty"` | ||
17 | + Color bool `json:"color,omitempty"` | ||
18 | +} | ||
19 | + | ||
20 | +//LoggerFile 日志输出到文件 | ||
21 | +type LoggerFile struct { | ||
22 | + FileName string `json:"filename,omitempty"` | ||
23 | + Maxlines int `json:"maxlines,omitempty"` | ||
24 | + Maxsize int `json:"maxsize,omitempty"` | ||
25 | + Daily bool `json:"daily,omitempty"` | ||
26 | + MaxDays int `json:"maxdays,omitempty"` | ||
27 | + Rotate bool `json:"rotate,omitempty"` | ||
28 | + Level int `json:"level,omitempty"` | ||
29 | +} | ||
30 | + | ||
31 | +var ( | ||
32 | + _ SetLoggerConfig = &LoggerConsole{} | ||
33 | + _ SetLoggerConfig = &LoggerFile{} | ||
34 | +) | ||
35 | + | ||
36 | +// log level | ||
37 | +const ( | ||
38 | + LogLevelError int = logs.LevelError | ||
39 | + LogLevelWarn int = logs.LevelWarning | ||
40 | + LogLevelInfo int = logs.LevelInformational | ||
41 | + LogLevelDebug int = logs.LevelDebug | ||
42 | +) | ||
43 | + | ||
44 | +func (config LoggerConsole) MarshalString() string { | ||
45 | + bytedata, err := json.Marshal(config) | ||
46 | + if err != nil { | ||
47 | + return "" | ||
48 | + } | ||
49 | + return string(bytedata) | ||
50 | +} | ||
51 | + | ||
52 | +func (config LoggerConsole) Name() string { | ||
53 | + return logs.AdapterConsole | ||
54 | +} | ||
55 | + | ||
56 | +func (config LoggerFile) MarshalString() string { | ||
57 | + bytedata, err := json.Marshal(config) | ||
58 | + if err != nil { | ||
59 | + return "" | ||
60 | + } | ||
61 | + return string(bytedata) | ||
62 | +} | ||
63 | +func (config LoggerFile) Name() string { | ||
64 | + return logs.AdapterFile | ||
65 | +} | ||
66 | + | ||
67 | +var logger *logs.BeeLogger | ||
68 | + | ||
69 | +func ResetLog(config SetLoggerConfig, funcCall bool) { | ||
70 | + logger = logs.GetBeeLogger() | ||
71 | + logger.Async(1000) | ||
72 | + out := config.Name() | ||
73 | + logconf := config.MarshalString() | ||
74 | + logger.EnableFuncCallDepth(funcCall) | ||
75 | + logger.SetLogFuncCallDepth(3) | ||
76 | + | ||
77 | + logger.SetLogger(out, logconf) | ||
78 | + return | ||
79 | +} | ||
80 | + | ||
81 | +//LogLevel ... | ||
82 | +func LogLevel(s string) (i int) { | ||
83 | + switch s { | ||
84 | + case "info": | ||
85 | + i = LogLevelInfo | ||
86 | + case "debug": | ||
87 | + i = LogLevelDebug | ||
88 | + case "warning": | ||
89 | + i = LogLevelWarn | ||
90 | + case "error": | ||
91 | + i = LogLevelError | ||
92 | + default: | ||
93 | + i = LogLevelDebug | ||
94 | + } | ||
95 | + return | ||
96 | +} | ||
97 | + | ||
98 | +func Info(format string, v ...interface{}) { | ||
99 | + logger.Info(format, v...) | ||
100 | +} | ||
101 | + | ||
102 | +func Debug(format string, v ...interface{}) { | ||
103 | + logger.Debug(format, v...) | ||
104 | +} | ||
105 | + | ||
106 | +func Error(format string, v ...interface{}) { | ||
107 | + logger.Error(format, v...) | ||
108 | +} | ||
109 | + | ||
110 | +func Warn(format string, v ...interface{}) { | ||
111 | + logger.Warn(format, v...) | ||
112 | +} |
common/redis/redis.go
0 → 100644
1 | +package redis | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + | ||
6 | + "github.com/go-redis/redis" | ||
7 | +) | ||
8 | + | ||
9 | +//时间 | ||
10 | +const ( | ||
11 | + SECOND int64 = 1 //秒 | ||
12 | + MINUTE int64 = SECOND * 60 //分 | ||
13 | + HOUR int64 = MINUTE * 60 //小时 | ||
14 | + DAY int64 = HOUR * 24 | ||
15 | + WEEK int64 = DAY * 7 | ||
16 | +) | ||
17 | + | ||
18 | +var RedisClient *redis.Client | ||
19 | + | ||
20 | +func SetRedis(addr string, password string, db int) { | ||
21 | + RedisClient = redis.NewClient(&redis.Options{ | ||
22 | + Addr: addr, | ||
23 | + Password: password, | ||
24 | + DB: db, //使用的库 | ||
25 | + }) | ||
26 | + _, err := RedisClient.Ping().Result() | ||
27 | + if err != nil { | ||
28 | + panic(fmt.Sprintf("connect redis err:%s", err)) | ||
29 | + } | ||
30 | +} | ||
31 | + | ||
32 | +func GetRedis() *redis.Client { | ||
33 | + return RedisClient | ||
34 | +} |
common/typestruct.go
0 → 100644
1 | +package common | ||
2 | + | ||
3 | +// type CommonErr struct { | ||
4 | +// Err error | ||
5 | +// Code string | ||
6 | +// Message string | ||
7 | +// } | ||
8 | + | ||
9 | +// func (c *CommonErr) Error() string { | ||
10 | +// return c.Message | ||
11 | + | ||
12 | +// } | ||
13 | + | ||
14 | +// func (c *CommonErr) Unwrap() error { | ||
15 | +// return c.Err | ||
16 | +// } | ||
17 | + | ||
18 | +// func (c *CommonErr) CodeString() string { | ||
19 | +// return c.Code | ||
20 | +// } |
conf/app.conf
0 → 100644
conf/dev.conf
0 → 100644
1 | +[dev] | ||
2 | +config_name = "dev" | ||
3 | +#----beego的默认配置 开始--- | ||
4 | +#端口号 | ||
5 | +httpport = 8081 | ||
6 | +#开启应用内监控 | ||
7 | +EnableAdmin = true | ||
8 | +AdminPort = 8088 | ||
9 | +#---beego的默认配置 结束--- | ||
10 | + | ||
11 | +#---自定义配置 开始---- | ||
12 | +##数据库连接 | ||
13 | +sqlconn ="root:root@tcp(127.0.0.1:3306)/ability_display?charset=utf8" | ||
14 | +##redis相关配置 | ||
15 | +redis_add_port = "127.0.0.1:6379" | ||
16 | +redis_auth = "" | ||
17 | +##log相关配置 | ||
18 | +##out_put:"console","file" | ||
19 | +log_output = "file" | ||
20 | +log_filename = "./log/ability.log" | ||
21 | +# maxlines = | ||
22 | +# maxsize = | ||
23 | +# daily = | ||
24 | +# maxdays = | ||
25 | +# rotate = | ||
26 | +log_level = "debug" | ||
27 | +#---自定义配置 结束---- |
conf/local.conf
0 → 100644
1 | +[local] | ||
2 | +config_name = "local" | ||
3 | +#----beego的默认配置 开始--- | ||
4 | +#端口号 | ||
5 | +httpport = 8081 | ||
6 | +#开启应用内监控 | ||
7 | +EnableAdmin = true | ||
8 | +AdminPort = 8088 | ||
9 | +##---beego的默认配置 结束--- | ||
10 | + | ||
11 | +#---自定义配置 开始---- | ||
12 | +#数据库连接 | ||
13 | +sqlconn = "root:root@tcp(127.0.0.1:3306)/ability_display?charset=utf8" | ||
14 | +#redis相关配置 | ||
15 | +redis_add_port = "127.0.0.1:6379" | ||
16 | +redis_auth = "" | ||
17 | +#log相关配置 | ||
18 | +#out_put:"console","file" | ||
19 | +log_output = "file" | ||
20 | +log_filename = "./log/ability.log" | ||
21 | +# maxlines = | ||
22 | +# maxsize = | ||
23 | +# daily = | ||
24 | +# maxdays = | ||
25 | +# rotate = | ||
26 | +log_level = "debug" | ||
27 | +#---自定义配置 结束---- |
conf/prod.conf
0 → 100644
1 | +[prod] | ||
2 | +config_name = "prod" | ||
3 | +#----beego的默认配置 开始--- | ||
4 | +#端口号 | ||
5 | +httpport = 8080 | ||
6 | + | ||
7 | +##---beego的默认配置 结束--- | ||
8 | + | ||
9 | +#---自定义配置 开始---- | ||
10 | +#数据库连接 | ||
11 | +sqlconn = "root:root@tcp(127.0.0.1:3306)/ability_display?charset=utf8" | ||
12 | +#redis相关配置 | ||
13 | +redis_add_port = "127.0.0.1:6379" | ||
14 | +redis_auth = "" | ||
15 | +#log相关配置 | ||
16 | +#out_put:"console","file" | ||
17 | +log_output = "file" | ||
18 | +log_filename = "./log/ability.log" | ||
19 | +# maxlines = | ||
20 | +# maxsize = | ||
21 | +# daily = | ||
22 | +# maxdays = | ||
23 | +# rotate = | ||
24 | +log_level = "debug" | ||
25 | +#---自定义配置 结束---- |
controllers/auth.go
0 → 100644
1 | +package controllers | ||
2 | + | ||
3 | +import ( | ||
4 | + "encoding/json" | ||
5 | + "fmt" | ||
6 | + "oppmg/common/log" | ||
7 | + "oppmg/protocol" | ||
8 | + "oppmg/services/serveauth" | ||
9 | + | ||
10 | + "github.com/astaxie/beego/validation" | ||
11 | +) | ||
12 | + | ||
13 | +type AuthController struct { | ||
14 | + BaseController | ||
15 | +} | ||
16 | + | ||
17 | +//URLMapping 实现ControllerInterface中的URLMapping | ||
18 | +func (c *AuthController) URLMapping() { | ||
19 | + c.Mapping("AccessToken", c.AccessToken) | ||
20 | + | ||
21 | +} | ||
22 | + | ||
23 | +func (c *AuthController) AccessToken() { | ||
24 | + log.Debug("运行cotrollers") | ||
25 | + var msg *protocol.ResponseMessage | ||
26 | + defer func() { | ||
27 | + c.ResposeJson(msg) | ||
28 | + }() | ||
29 | + var param protocol.RequestCheckSmsCode | ||
30 | + if err := json.Unmarshal(c.Ctx.Input.RequestBody, ¶m); err != nil { | ||
31 | + log.Error("json 解析失败", err) | ||
32 | + msg = protocol.BadRequestParam("00001") | ||
33 | + return | ||
34 | + } | ||
35 | + valid := validation.Validation{} | ||
36 | + ok, err := valid.Valid(¶m) | ||
37 | + if err != nil { | ||
38 | + //TODO | ||
39 | + log.Error("系统错误", err) | ||
40 | + } | ||
41 | + if !ok { | ||
42 | + //TODO | ||
43 | + log.Error("参数错误") | ||
44 | + } | ||
45 | + data, commErr := serveauth.GetAccessToken(param) | ||
46 | + msg = protocol.NewReturnResponse(data, commErr) | ||
47 | + return | ||
48 | +} | ||
49 | + | ||
50 | +//Demo 登录 | ||
51 | +func (c *AuthController) Demo() { | ||
52 | + var msg *protocol.ResponseMessage | ||
53 | + defer func() { | ||
54 | + c.ResposeJson(msg) | ||
55 | + }() | ||
56 | + type Parameter struct { | ||
57 | + } | ||
58 | + var param Parameter | ||
59 | + if err := json.Unmarshal(c.Ctx.Input.RequestBody, ¶m); err != nil { | ||
60 | + fmt.Println("json 解析失败", err) | ||
61 | + // msg.Code = "1" | ||
62 | + return | ||
63 | + } | ||
64 | + /**/ | ||
65 | + | ||
66 | + return | ||
67 | +} |
controllers/base.go
0 → 100644
1 | +package controllers | ||
2 | + | ||
3 | +import ( | ||
4 | + "encoding/json" | ||
5 | + "fmt" | ||
6 | + "net/http" | ||
7 | + "oppmg/common/log" | ||
8 | + "oppmg/protocol" | ||
9 | + | ||
10 | + "github.com/astaxie/beego" | ||
11 | +) | ||
12 | + | ||
13 | +//BaseHeader 请求的header数据 | ||
14 | +//减少在具体业务方法中使用 this.Ctx.Input.Header("xxxx") | ||
15 | +type BaseHeader struct { | ||
16 | + AccessToken string `json:"access_token"` | ||
17 | + RefreshToken string `json:"refresh_token"` | ||
18 | +} | ||
19 | + | ||
20 | +//BaseController 基础 | ||
21 | +type BaseController struct { | ||
22 | + beego.Controller | ||
23 | + AppHead BaseHeader | ||
24 | +} | ||
25 | + | ||
26 | +//Options 实现beego.ControllerInterface 的接口 | ||
27 | +func (this *BaseController) Options() { | ||
28 | + | ||
29 | + this.Ctx.Abort(http.StatusBadRequest, "") | ||
30 | + | ||
31 | +} | ||
32 | + | ||
33 | +//Prepare 实现beego.ControllerInterface 的接口 | ||
34 | +func (this *BaseController) Prepare() { | ||
35 | + this.AppHead.AccessToken = this.Ctx.Input.Header("access_token") | ||
36 | + this.AppHead.RefreshToken = this.Ctx.Input.Header("refresh_token") | ||
37 | + //详细header待定 TODO | ||
38 | + if this.Ctx.Input.RequestBody != nil { | ||
39 | + log.Info(fmt.Sprintf("====>Recv data from client:\nHeadData: %s\n BodyData: %s", this.Ctx.Request.Header, string(this.Ctx.Input.RequestBody))) | ||
40 | + } else { | ||
41 | + log.Info(fmt.Sprintf("====>Recv data from client:\nHeadData: %s ", this.Ctx.Request.Header)) | ||
42 | + } | ||
43 | + | ||
44 | +} | ||
45 | + | ||
46 | +//Finish 实现beego.ControllerInterface 的接口 | ||
47 | +func (this *BaseController) Finish() { | ||
48 | + strByte, _ := json.Marshal(this.Data["json"]) | ||
49 | + length := len(strByte) | ||
50 | + if length > 5000 { | ||
51 | + log.Info(fmt.Sprintf("<====Send to client: RspBodyData: %s......", string(strByte[:5000]))) | ||
52 | + } else { | ||
53 | + log.Info(fmt.Sprintf("<====Send to client: RspBodyData: %s", string(strByte))) | ||
54 | + } | ||
55 | +} | ||
56 | + | ||
57 | +func (this *BaseController) ResposeJson(msg *protocol.ResponseMessage) { | ||
58 | + this.Data["json"] = msg | ||
59 | + this.ServeJSON() | ||
60 | +} |
go.mod
0 → 100644
1 | +module oppmg | ||
2 | + | ||
3 | +go 1.13 | ||
4 | + | ||
5 | +require ( | ||
6 | + github.com/astaxie/beego v1.10.0 | ||
7 | + github.com/dgrijalva/jwt-go v3.2.0+incompatible | ||
8 | + github.com/go-redis/redis v6.15.6+incompatible | ||
9 | + github.com/go-sql-driver/mysql v1.4.1 | ||
10 | + github.com/lib/pq v1.2.0 // indirect | ||
11 | + github.com/onsi/ginkgo v1.10.3 // indirect | ||
12 | + github.com/onsi/gomega v1.7.1 // indirect | ||
13 | + github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect | ||
14 | + golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba // indirect | ||
15 | + google.golang.org/appengine v1.6.5 // indirect | ||
16 | + gopkg.in/yaml.v2 v2.2.7 // indirect | ||
17 | +) |
go.sum
0 → 100644
1 | +github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= | ||
2 | +github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM= | ||
3 | +github.com/astaxie/beego v1.10.0 h1:s0OZ1iUO0rl8+lwWZfPK/0GhQi1tFUcIClTevyz48Pg= | ||
4 | +github.com/astaxie/beego v1.10.0/go.mod h1:0R4++1tUqERR0WYFWdfkcrsyoVBCG4DgpDGokT3yb+U= | ||
5 | +github.com/astaxie/beego v1.12.0 h1:MRhVoeeye5N+Flul5PoVfD9CslfdoH+xqC/xvSQ5u2Y= | ||
6 | +github.com/astaxie/beego v1.12.0/go.mod h1:fysx+LZNZKnvh4GED/xND7jWtjCR6HzydR2Hh2Im57o= | ||
7 | +github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= | ||
8 | +github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= | ||
9 | +github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= | ||
10 | +github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= | ||
11 | +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= | ||
12 | +github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= | ||
13 | +github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= | ||
14 | +github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= | ||
15 | +github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= | ||
16 | +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | ||
17 | +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | ||
18 | +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= | ||
19 | +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= | ||
20 | +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= | ||
21 | +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||
22 | +github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | ||
23 | +github.com/go-redis/redis v6.15.6+incompatible h1:H9evprGPLI8+ci7fxQx6WNZHJSb7be8FqJQRhdQZ5Sg= | ||
24 | +github.com/go-redis/redis v6.15.6+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= | ||
25 | +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= | ||
26 | +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= | ||
27 | +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||
28 | +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||
29 | +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= | ||
30 | +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||
31 | +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||
32 | +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= | ||
33 | +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= | ||
34 | +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||
35 | +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||
36 | +github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= | ||
37 | +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||
38 | +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= | ||
39 | +github.com/mattn/go-sqlite3 v2.0.0+incompatible h1:+afSeuaczjy4ZUN55wuDe1bCaAFBu0hg5Cf2Zw2ar0s= | ||
40 | +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||
41 | +github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= | ||
42 | +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||
43 | +github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= | ||
44 | +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= | ||
45 | +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= | ||
46 | +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||
47 | +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 h1:X+yvsM2yrEktyI+b2qND5gpH8YhURn0k8OCaeRnkINo= | ||
48 | +github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg= | ||
49 | +github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= | ||
50 | +github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= | ||
51 | +github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= | ||
52 | +github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= | ||
53 | +github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= | ||
54 | +github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= | ||
55 | +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85 h1:et7+NAX3lLIk5qUCTA9QelBjGE/NkhzYw/mhnr0s7nI= | ||
56 | +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||
57 | +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||
58 | +golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba h1:9bFeDpN3gTqNanMVqNcoR/pJQuP5uroC3t1D7eXozTE= | ||
59 | +golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||
60 | +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||
61 | +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||
62 | +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||
63 | +golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ= | ||
64 | +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= | ||
65 | +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||
66 | +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||
67 | +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||
68 | +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= | ||
69 | +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||
70 | +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||
71 | +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= | ||
72 | +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||
73 | +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||
74 | +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= | ||
75 | +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= | ||
76 | +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||
77 | +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||
78 | +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= | ||
79 | +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||
80 | +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= | ||
81 | +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | ||
82 | +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= | ||
83 | +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||
84 | +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||
85 | +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= | ||
86 | +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= |
log/ability.log
0 → 100644
1 | +2019/09/25 09:30:17.551 [D] [main.go:23] 应用启动 | ||
2 | +2019/09/25 09:30:17.602 [I] [app.go:215] http server Running on http://:8080 | ||
3 | +2019/09/25 09:41:04.196 [D] [proc.go:203] 应用启动 | ||
4 | +2019/09/25 09:41:04.245 [I] [asm_amd64.s:1357] http server Running on http://:8080 | ||
5 | +2019/09/25 09:41:51.479 [D] [main.go:23] 应用启动 | ||
6 | +2019/09/25 09:41:51.522 [I] [app.go:215] http server Running on http://:8080 | ||
7 | +2019/09/25 09:43:54.102 [D] [main.go:23] 应用启动 | ||
8 | +2019/09/25 09:43:54.148 [I] [app.go:215] http server Running on http://:8080 | ||
9 | +2019/09/25 09:44:26.483 [D] 应用启动 | ||
10 | +2019/09/25 09:44:26.527 [I] http server Running on http://:8080 | ||
11 | +2019/09/25 09:45:14.831 [D] 应用启动 | ||
12 | +2019/09/25 09:45:14.883 [I] http server Running on http://:8080 | ||
13 | +2019/09/25 09:46:11.373 [D] [main.go:23] 应用启动 | ||
14 | +2019/09/25 09:46:11.421 [I] [app.go:215] http server Running on http://:8080 | ||
15 | +2019/09/25 09:46:20.279 [D] 应用启动 | ||
16 | +2019/09/25 09:46:20.321 [I] http server Running on http://:8080 | ||
17 | +2019/09/25 09:46:36.286 [D] [main.go:23] 应用启动 | ||
18 | +2019/09/25 09:46:36.327 [I] [app.go:215] http server Running on http://:8080 | ||
19 | +2019/09/25 09:48:04.055 [D] [logger.go:70] log 配置:{"filename":"./log/ability.log"} | ||
20 | +2019/09/25 09:48:04.058 [D] [main.go:23] 应用启动 | ||
21 | +2019/09/25 09:48:04.101 [I] [app.go:215] http server Running on http://:8080 | ||
22 | +2019/09/25 09:48:57.467 [D] [logger.go:68] log 配置:{"filename":"./log/ability.log"} | ||
23 | +2019/09/25 09:48:57.472 [D] [main.go:23] 应用启动 | ||
24 | +2019/09/25 09:48:57.513 [I] [app.go:215] http server Running on http://:8080 | ||
25 | +2019/09/25 09:51:29.788 [D] [logger.go:68] log 配置:{"filename":"./log/ability.log"} | ||
26 | +2019/09/25 09:51:29.790 [D] [main.go:24] 应用启动 | ||
27 | +2019/09/25 09:51:29.831 [I] [app.go:215] http server Running on http://:8080 | ||
28 | +2019/09/25 09:52:37.088 [D] [logger.go:72] log 配置:{"filename":"./log/ability.log"} | ||
29 | +2019/09/25 09:52:37.091 [D] [main.go:24] 应用启动 | ||
30 | +2019/09/25 09:52:37.134 [I] [app.go:215] http server Running on http://:8080 | ||
31 | +2019/09/25 09:53:53.727 [D] [logger.go:74] log 配置:{"filename":"./log/ability.log"} | ||
32 | +2019/09/25 09:53:53.730 [D] [main.go:24] 应用启动 | ||
33 | +2019/09/25 09:53:53.774 [I] [app.go:215] http server Running on http://:8080 | ||
34 | +2019/09/25 09:57:45.468 [D] [logger.go:75] log 配置:{"filename":"./log/ability.log"} | ||
35 | +2019/09/25 09:57:45.471 [D] [main.go:24] 应用启动 | ||
36 | +2019/09/25 09:57:45.518 [I] [app.go:215] http server Running on http://:8080 | ||
37 | +2019/09/25 09:58:34.957 [D] [logger.go:75] log 配置:{"filename":"./log/ability.log"} | ||
38 | +2019/09/25 09:58:34.961 [D] [main.go:24] 应用启动 | ||
39 | +2019/09/25 09:58:35.001 [I] [app.go:215] http server Running on http://:8080 | ||
40 | +2019/09/25 09:59:00.222 [D] [logger.go:75] log 配置:{"filename":"./log/ability.log"} | ||
41 | +2019/09/25 09:59:00.224 [D] [main.go:24] 应用启动 | ||
42 | +2019/09/25 09:59:00.267 [I] [app.go:215] http server Running on http://:8080 | ||
43 | +2019/09/25 09:59:21.718 [D] [logger.go:75] log 配置:{"filename":"./log/ability.log"} | ||
44 | +2019/09/25 09:59:21.720 [D] [main.go:24] 应用启动 | ||
45 | +2019/09/25 09:59:21.763 [I] [app.go:215] http server Running on http://:8080 | ||
46 | +2019/09/25 09:59:51.099 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log"} | ||
47 | +2019/09/25 09:59:51.102 [D] [main.go:24] 应用启动 | ||
48 | +2019/09/25 09:59:51.144 [I] [app.go:215] http server Running on http://:8080 | ||
49 | +2019/09/25 10:00:08.480 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log"} | ||
50 | +2019/09/25 10:00:08.482 [D] [main.go:24] 应用启动 | ||
51 | +2019/09/25 10:00:08.529 [I] [app.go:215] http server Running on http://:8080 | ||
52 | +2019/09/25 10:00:24.442 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log"} | ||
53 | +2019/09/25 10:00:24.444 [D] [main.go:24] 应用启动 | ||
54 | +2019/09/25 10:00:24.487 [I] [app.go:215] http server Running on http://:8080 | ||
55 | +2019/09/25 10:00:43.449 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log","level":7} | ||
56 | +2019/09/25 10:00:43.451 [D] [main.go:24] 应用启动 | ||
57 | +2019/09/25 10:00:43.491 [I] [app.go:215] http server Running on http://:8080 | ||
58 | +2019/09/25 10:01:06.019 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log","level":7} | ||
59 | +2019/09/25 10:01:06.021 [D] [main.go:23] 应用启动 | ||
60 | +2019/09/25 10:01:06.063 [I] [app.go:215] http server Running on http://:8080 | ||
61 | +2019/09/25 10:01:11.803 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log","level":7} | ||
62 | +2019/09/25 10:01:11.805 [D] [main.go:23] 应用启动 | ||
63 | +2019/09/25 10:01:11.849 [I] [app.go:215] http server Running on http://:8080 | ||
64 | +2019/09/25 10:01:12.837 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log","level":7} | ||
65 | +2019/09/25 10:01:12.838 [D] [main.go:23] 应用启动 | ||
66 | +2019/09/25 10:01:12.880 [I] [app.go:215] http server Running on http://:8080 | ||
67 | +2019/09/25 10:01:46.181 [D] [logger.go:76] log 配置:{"filename":"./log/ability.log","level":7} | ||
68 | +2019/09/25 10:01:46.184 [D] [main.go:23] 应用启动 | ||
69 | +2019/09/25 10:01:46.231 [I] [app.go:215] http server Running on http://:8080 |
main.go
0 → 100644
1 | +package main | ||
2 | + | ||
3 | +import ( | ||
4 | + "oppmg/common" | ||
5 | + _ "oppmg/routers" | ||
6 | + | ||
7 | + "oppmg/common/config" | ||
8 | + "oppmg/common/log" | ||
9 | + | ||
10 | + "github.com/astaxie/beego" | ||
11 | + "github.com/astaxie/beego/orm" | ||
12 | + _ "github.com/go-sql-driver/mysql" | ||
13 | +) | ||
14 | + | ||
15 | +func main() { | ||
16 | + common.ResetCommonConfig() | ||
17 | + log.Debug("加载配置%s", config.MConfig.ConfigName) | ||
18 | + orm.RegisterDataBase("default", "mysql", config.MConfig.SqlConn) | ||
19 | + if beego.BConfig.RunMode == "dev" { | ||
20 | + beego.BConfig.WebConfig.DirectoryIndex = true | ||
21 | + beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger" | ||
22 | + } | ||
23 | + log.Debug("应用启动") | ||
24 | + beego.Run() | ||
25 | +} |
middleware/app_switch.go
0 → 100644
1 | +package middleware |
middleware/middle.go
0 → 100644
1 | +package middleware | ||
2 | + | ||
3 | +import ( | ||
4 | + "oppmg/common/log" | ||
5 | + | ||
6 | + "github.com/astaxie/beego/context" | ||
7 | +) | ||
8 | + | ||
9 | +//AuthToken ... | ||
10 | +var AuthToken = func(ctx *context.Context) { | ||
11 | + log.Debug("执行中间件AuthToken") | ||
12 | + ctx.Output.Body([]byte("{}")) | ||
13 | + return | ||
14 | +} | ||
15 | + | ||
16 | +//AppSwitch 使用外部变量停止处理新的请求 | ||
17 | +var AppSwitch = func(ctx *context.Context) { | ||
18 | + | ||
19 | + return | ||
20 | +} |
oppmg.exe
0 → 100644
不能预览此文件类型
protocol/error.go
0 → 100644
1 | +package protocol | ||
2 | + | ||
3 | +import ( | ||
4 | + "encoding/json" | ||
5 | +) | ||
6 | + | ||
7 | +//CustomErrParse 解析自定义错误结构体 | ||
8 | +type CustomErrParse interface { | ||
9 | + ParseToMessage() *ResponseMessage | ||
10 | +} | ||
11 | + | ||
12 | +//ErrorMap 统一消息错误编码 | ||
13 | +type ErrorMap map[string]string | ||
14 | + | ||
15 | +//Search 搜索错误描述 | ||
16 | +func (m ErrorMap) Search(code string) ErrorCode { | ||
17 | + if v, ok := m[code]; ok { | ||
18 | + return ErrorCode{ | ||
19 | + Errno: code, | ||
20 | + Errmsg: v, | ||
21 | + } | ||
22 | + } | ||
23 | + return ErrorCode{} | ||
24 | +} | ||
25 | + | ||
26 | +//ErrorCode 统一错误结构 | ||
27 | +type ErrorCode struct { | ||
28 | + Errno string `json:"code"` | ||
29 | + Errmsg string `json:"msg"` | ||
30 | +} | ||
31 | + | ||
32 | +//ResponseMessage 统一返回消息结构体 | ||
33 | +type ResponseMessage struct { | ||
34 | + ErrorCode | ||
35 | + Data interface{} `json:"data"` | ||
36 | +} | ||
37 | + | ||
38 | +func NewMesage(code string) *ResponseMessage { | ||
39 | + return &ResponseMessage{ | ||
40 | + ErrorCode: SearchErr(code), | ||
41 | + Data: nil, | ||
42 | + } | ||
43 | +} | ||
44 | + | ||
45 | +//ErrWithMessage 自定义错误结构 | ||
46 | +type ErrWithMessage struct { | ||
47 | + Err error `json:"-"` | ||
48 | + ErrorCode | ||
49 | +} | ||
50 | + | ||
51 | +var ( | ||
52 | + _ CustomErrParse = new(ErrWithMessage) | ||
53 | + _ error = new(ErrWithMessage) | ||
54 | +) | ||
55 | + | ||
56 | +//NewErrWithMessage 构建错误返回 | ||
57 | +//code:用于匹配统一消息错误编码 eRR:填充嵌套错误 | ||
58 | +func NewErrWithMessage(code string, eRR ...error) *ErrWithMessage { | ||
59 | + r := &ErrWithMessage{ | ||
60 | + ErrorCode: SearchErr(code), | ||
61 | + } | ||
62 | + if len(eRR) > 0 { | ||
63 | + r.Err = eRR[0] | ||
64 | + } | ||
65 | + return r | ||
66 | +} | ||
67 | + | ||
68 | +//Error 实现接口error 中的方法 | ||
69 | +//将ErrorCode转为json数据,建议用于日志记录 | ||
70 | +func (e ErrWithMessage) Error() string { | ||
71 | + bt, _ := json.Marshal(e.ErrorCode) | ||
72 | + return string(bt) | ||
73 | +} | ||
74 | + | ||
75 | +//Unwrap 接口实现 | ||
76 | +func (e ErrWithMessage) Unwrap() error { | ||
77 | + return e.Err | ||
78 | +} | ||
79 | + | ||
80 | +//ParseToMessage 实现CustomErrParse的接口 | ||
81 | +func (e ErrWithMessage) ParseToMessage() *ResponseMessage { | ||
82 | + return &ResponseMessage{ | ||
83 | + ErrorCode: e.ErrorCode, | ||
84 | + Data: nil, | ||
85 | + } | ||
86 | +} | ||
87 | + | ||
88 | +func SearchErr(code string) ErrorCode { | ||
89 | + return errmessge.Search(code) | ||
90 | +} | ||
91 | +func NewReturnResponse(data interface{}, eRR error) *ResponseMessage { | ||
92 | + var msg *ResponseMessage | ||
93 | + if eRR == nil { | ||
94 | + msg = NewMesage("0") | ||
95 | + msg.Data = data | ||
96 | + return msg | ||
97 | + } | ||
98 | + // fmt.Println("日志:" + eRR.Error()) | ||
99 | + if x, ok := eRR.(CustomErrParse); ok { | ||
100 | + return x.ParseToMessage() | ||
101 | + } | ||
102 | + return NewMesage("1") | ||
103 | +} | ||
104 | + | ||
105 | +func BadRequestParam(code string) *ResponseMessage { | ||
106 | + return NewMesage(code) | ||
107 | +} |
protocol/error_test.go
0 → 100644
1 | +package protocol | ||
2 | + | ||
3 | +import ( | ||
4 | + "encoding/json" | ||
5 | + "testing" | ||
6 | +) | ||
7 | + | ||
8 | +func Test_Err(t *testing.T) { | ||
9 | + errmsg := NewMesage(0) | ||
10 | + bt1, _ := json.Marshal(errmsg) | ||
11 | + t.Log(string(bt1)) | ||
12 | + normalmsg := NewErrWithMessage(0) | ||
13 | + bt2, _ := json.Marshal(normalmsg) | ||
14 | + t.Log(string(bt2)) | ||
15 | +} |
protocol/message.go
0 → 100644
protocol/user.go
0 → 100644
1 | +package protocol | ||
2 | + | ||
3 | +//验证原手机号 | ||
4 | +//POST:/user/checkSmsCode | ||
5 | +type RequestCheckSmsCode struct { | ||
6 | + Captcha string `json:"captcha"` | ||
7 | +} | ||
8 | + | ||
9 | +//获取用户数据 | ||
10 | +//POST:/user/userInfo | ||
11 | +type RequestUserInfo struct { | ||
12 | +} | ||
13 | + | ||
14 | +type DataUserInfo struct { | ||
15 | + User UserInfo `json:"user"` | ||
16 | +} | ||
17 | + | ||
18 | +type UserInfo struct { | ||
19 | + Uid int64 `json:"uid"` //用户id | ||
20 | + Uname string `json:"uname"` //用户名称 | ||
21 | + Phone string `json:"phone"` //手机号码 | ||
22 | + Image UserImages `json:"image"` //用户头像 | ||
23 | + Did int64 `json:"did"` //部门id | ||
24 | + Department string `json:"department"` //部门名称 | ||
25 | + Position string `json:"position"` //职位名称 | ||
26 | + Level int `json:"level"` //职位级别 | ||
27 | + EmployeeAttr EmployeeAttr `json:"employeeAttr"` //员工属性 | ||
28 | + ImToken string `json:"imToken"` //网易云信IM Token | ||
29 | +} | ||
30 | + | ||
31 | +const ( | ||
32 | + userLevelEmployee int = 0 //员工 | ||
33 | + userLevelBoss int = 1 //老板 | ||
34 | +) | ||
35 | + | ||
36 | +type UserImages struct { | ||
37 | + Path string `json:"path"` //图片路径 | ||
38 | + W int `json:"w"` //图片宽 | ||
39 | + H int `json:"h"` //图片高 | ||
40 | +} | ||
41 | + | ||
42 | +type EmployeeAttr struct { | ||
43 | + Id int64 `json:"id"` | ||
44 | + Name string `json:"name"` | ||
45 | +} | ||
46 | + | ||
47 | +//修改手机号 | ||
48 | +//POST:/user/changePhone | ||
49 | +type RequestChangePhone struct { | ||
50 | + Phone string `json:"phone"` | ||
51 | + Captcha string `json:"captcha"` | ||
52 | +} | ||
53 | + | ||
54 | +//重置密码 | ||
55 | +//POST:/user/resetPassword | ||
56 | +type RequestResetPasssword struct { | ||
57 | + NewPwd string `json:"newPwd"` | ||
58 | + ConfirmPwd string `json:"configmPwd"` | ||
59 | +} | ||
60 | + | ||
61 | +//修改密码 | ||
62 | +//POST:/user/changePassword | ||
63 | +type RequestChangePasssword struct { | ||
64 | + NewPwd string `json:"newPwd"` | ||
65 | + ConfirmPwd string `json:"configmPwd"` | ||
66 | + OldPwd string `json:"oldPwd"` | ||
67 | +} |
routers/router.go
0 → 100644
1 | +package routers | ||
2 | + | ||
3 | +import ( | ||
4 | + "oppmg/controllers" | ||
5 | + | ||
6 | + "oppmg/middleware" | ||
7 | + | ||
8 | + "github.com/astaxie/beego" | ||
9 | +) | ||
10 | + | ||
11 | +func init() { | ||
12 | + | ||
13 | + nsAuth := beego.NewNamespace("/auth", | ||
14 | + beego.NSBefore(middleware.AuthToken), | ||
15 | + beego.NSRouter("/accessToken", &controllers.AuthController{}, "post:AccessToken"), | ||
16 | + ) | ||
17 | + | ||
18 | + beego.AddNamespace(nsAuth) | ||
19 | +} |
services/serveauth/auth.go
0 → 100644
storage/redisdata/key.go
0 → 100644
storage/redisdata/redis.go
0 → 100644
1 | +package redisdata |
utils/encrypt/fastEndecode.go
0 → 100644
1 | +package encrypt | ||
2 | + | ||
3 | +import ( | ||
4 | + "bytes" | ||
5 | + "crypto/aes" | ||
6 | + "crypto/cipher" | ||
7 | + "crypto/md5" | ||
8 | + "encoding/base64" | ||
9 | + "encoding/hex" | ||
10 | + "fmt" | ||
11 | + "strconv" | ||
12 | + "strings" | ||
13 | +) | ||
14 | + | ||
15 | +type KeySizeError int | ||
16 | + | ||
17 | +func (k KeySizeError) Error() string { | ||
18 | + return "fastEncryptDecode/fastEnDeCode: invalid key size " + strconv.Itoa(int(k)) + " | key size must be 16" | ||
19 | +} | ||
20 | + | ||
21 | +type ecbEncrypter ecb | ||
22 | + | ||
23 | +type ecb struct { | ||
24 | + b cipher.Block | ||
25 | + blockSize int | ||
26 | +} | ||
27 | + | ||
28 | +func newECB(b cipher.Block) *ecb { | ||
29 | + return &ecb{ | ||
30 | + b: b, | ||
31 | + blockSize: b.BlockSize(), | ||
32 | + } | ||
33 | +} | ||
34 | + | ||
35 | +// byte array to string | ||
36 | +func ByteArr2Str(p []byte) string { | ||
37 | + lp := len(p) | ||
38 | + for i := 0; i < lp; i++ { | ||
39 | + if p[i] == 0 { | ||
40 | + return string(p[0:i]) | ||
41 | + } | ||
42 | + } | ||
43 | + return string(p) | ||
44 | +} | ||
45 | + | ||
46 | +func ByteArr2HexStr(bArr []byte) string { | ||
47 | + buf := new(bytes.Buffer) | ||
48 | + for _, b := range bArr { | ||
49 | + s := strconv.FormatInt(int64(b&0xff), 16) | ||
50 | + if len(s) == 1 { | ||
51 | + buf.WriteString("0") | ||
52 | + } | ||
53 | + buf.WriteString(s) | ||
54 | + } | ||
55 | + return buf.String() | ||
56 | +} | ||
57 | + | ||
58 | +func Uint16ToBytes(n uint16) []byte { | ||
59 | + return []byte{ | ||
60 | + byte(n), | ||
61 | + byte(n >> 8), | ||
62 | + } | ||
63 | +} | ||
64 | + | ||
65 | +func Uint32ToBytes(n uint32) []byte { | ||
66 | + return []byte{ | ||
67 | + byte(n), | ||
68 | + byte(n >> 8), | ||
69 | + byte(n >> 16), | ||
70 | + byte(n >> 24), | ||
71 | + } | ||
72 | +} | ||
73 | + | ||
74 | +func Uint64ToBytes(n uint64) []byte { | ||
75 | + return []byte{ | ||
76 | + byte(n), | ||
77 | + byte(n >> 8), | ||
78 | + byte(n >> 16), | ||
79 | + byte(n >> 24), | ||
80 | + byte(n >> 32), | ||
81 | + byte(n >> 40), | ||
82 | + byte(n >> 48), | ||
83 | + byte(n >> 56), | ||
84 | + } | ||
85 | +} | ||
86 | + | ||
87 | +func ByteArr2HexStrArr(bArr []byte) []string { | ||
88 | + length := len(bArr) | ||
89 | + slice := make([]string, length) | ||
90 | + buf := new(bytes.Buffer) | ||
91 | + for i := 0; i < length; i++ { | ||
92 | + buf.Reset() | ||
93 | + buf.WriteString("0x") | ||
94 | + s := strconv.FormatInt(int64(bArr[i]&0xff), 16) | ||
95 | + if len(s) == 1 { | ||
96 | + buf.WriteString("0") | ||
97 | + } | ||
98 | + buf.WriteString(s) | ||
99 | + slice[i] = buf.String() | ||
100 | + } | ||
101 | + return slice | ||
102 | +} | ||
103 | + | ||
104 | +func HexStr2ByteArr(hexString string) ([]byte, error) { | ||
105 | + length := len(hexString) / 2 | ||
106 | + slice := make([]byte, length) | ||
107 | + rs := []rune(hexString) | ||
108 | + for i := 0; i < length; i++ { | ||
109 | + s := string(rs[i*2 : i*2+2]) | ||
110 | + value, err := strconv.ParseInt(s, 16, 10) | ||
111 | + if err != nil { | ||
112 | + return nil, err | ||
113 | + } | ||
114 | + slice[i] = byte(value & 0xFF) | ||
115 | + } | ||
116 | + return slice, nil | ||
117 | +} | ||
118 | + | ||
119 | +func Utf82Unicode(code string) string { | ||
120 | + cover := strconv.QuoteToASCII(code) | ||
121 | + res := cover[1 : len(cover)-1] | ||
122 | + return res | ||
123 | +} | ||
124 | + | ||
125 | +func Unicode2Utf8(code string) string { | ||
126 | + unicodeTemp := strings.Split(code, "\\u") | ||
127 | + var context string | ||
128 | + for _, v := range unicodeTemp { | ||
129 | + if len(v) < 1 { | ||
130 | + continue | ||
131 | + } | ||
132 | + temp, err := strconv.ParseInt(v, 16, 32) | ||
133 | + if err != nil { | ||
134 | + panic(err) | ||
135 | + } | ||
136 | + context += fmt.Sprintf("%c", temp) | ||
137 | + } | ||
138 | + return context | ||
139 | +} | ||
140 | + | ||
141 | +//string to md5 | ||
142 | +func String2MD5(code string) string { | ||
143 | + h := md5.New() | ||
144 | + h.Write([]byte(code)) | ||
145 | + rs := hex.EncodeToString(h.Sum(nil)) | ||
146 | + return rs | ||
147 | +} | ||
148 | + | ||
149 | +func MD5Verify(code string, md5Str string) bool { | ||
150 | + return 0 == strings.Compare(String2MD5(code), md5Str) | ||
151 | +} | ||
152 | + | ||
153 | +//MD5 hash | ||
154 | +func MD5hash(code []byte) string { | ||
155 | + h := md5.New() | ||
156 | + h.Write(code) | ||
157 | + rs := hex.EncodeToString(h.Sum(nil)) | ||
158 | + return rs | ||
159 | +} | ||
160 | + | ||
161 | +func checkKeySize(key []byte) error { | ||
162 | + len := len(key) | ||
163 | + if len != 16 { | ||
164 | + return KeySizeError(len) | ||
165 | + } | ||
166 | + return nil | ||
167 | +} | ||
168 | + | ||
169 | +// AES encrypt pkcs7padding CBC, key for choose algorithm | ||
170 | +func AES_CBC_PKCS7_Encrypt(plantText, key string) (string, error) { | ||
171 | + res, err := AES_CBC_PKCS7_EncryptByte([]byte(plantText), []byte(key)) | ||
172 | + return ByteArr2Str(res), err | ||
173 | +} | ||
174 | + | ||
175 | +// AES encrypt pkcs7padding CBC, key for choose algorithm | ||
176 | +func AES_CBC_PKCS7_EncryptByte(plantText, key []byte) ([]byte, error) { | ||
177 | + err := checkKeySize(key) | ||
178 | + if err != nil { | ||
179 | + return nil, err | ||
180 | + } | ||
181 | + block, err := aes.NewCipher(key) | ||
182 | + if err != nil { | ||
183 | + return nil, err | ||
184 | + } | ||
185 | + plantText = pKCS7Padding(plantText, block.BlockSize()) | ||
186 | + | ||
187 | + blockModel := cipher.NewCBCEncrypter(block, key) | ||
188 | + | ||
189 | + cipherText := make([]byte, len(plantText)) | ||
190 | + | ||
191 | + blockModel.CryptBlocks(cipherText, plantText) | ||
192 | + return cipherText, nil | ||
193 | +} | ||
194 | + | ||
195 | +func AES_CBC_PKCS7_Decrypt(cipherText, key string) (string, error) { | ||
196 | + result, err := AES_CBC_PKCS7_DecryptByte([]byte(cipherText), []byte(key)) | ||
197 | + str := ByteArr2Str(result) | ||
198 | + return str, err | ||
199 | +} | ||
200 | + | ||
201 | +func AES_CBC_PKCS7_DecryptByte(cipherText, key []byte) ([]byte, error) { | ||
202 | + err := checkKeySize(key) | ||
203 | + if err != nil { | ||
204 | + return nil, err | ||
205 | + } | ||
206 | + keyBytes := []byte(key) | ||
207 | + block, err := aes.NewCipher(keyBytes) | ||
208 | + if err != nil { | ||
209 | + return nil, err | ||
210 | + } | ||
211 | + blockModel := cipher.NewCBCDecrypter(block, keyBytes) | ||
212 | + plantText := make([]byte, len(cipherText)) | ||
213 | + blockModel.CryptBlocks(plantText, cipherText) | ||
214 | + plantText = pKCS7UnPadding(plantText, block.BlockSize()) | ||
215 | + return plantText, nil | ||
216 | +} | ||
217 | + | ||
218 | +//AES Decrypt pkcs7padding CBC, key for choose algorithm | ||
219 | +func pKCS7UnPadding(plantText []byte, blockSize int) []byte { | ||
220 | + length := len(plantText) | ||
221 | + unPadding := int(plantText[length-1]) | ||
222 | + return plantText[:(length - unPadding)] | ||
223 | +} | ||
224 | + | ||
225 | +func pKCS7Padding(cipherText []byte, blockSize int) []byte { | ||
226 | + padding := blockSize - len(cipherText)%blockSize | ||
227 | + padText := bytes.Repeat([]byte{byte(padding)}, padding) | ||
228 | + return append(cipherText, padText...) | ||
229 | +} | ||
230 | + | ||
231 | +func AES_ECB_PKCS5_Encrypt(cipherText, key string) (string, error) { | ||
232 | + result, err := AES_ECB_PKCS5_EncryptByte([]byte(cipherText), []byte(key)) | ||
233 | + str := ByteArr2Str(result) | ||
234 | + return str, err | ||
235 | +} | ||
236 | + | ||
237 | +func AES_ECB_PKCS5_EncryptByte(cipherText, key []byte) ([]byte, error) { | ||
238 | + err := checkKeySize(key) | ||
239 | + if err != nil { | ||
240 | + return nil, err | ||
241 | + } | ||
242 | + block, err := aes.NewCipher(key) | ||
243 | + if err != nil { | ||
244 | + return nil, err | ||
245 | + } | ||
246 | + ecb := newECBEncrypter(block) | ||
247 | + content := cipherText | ||
248 | + content = PKCS5Padding(content, block.BlockSize()) | ||
249 | + crypted := make([]byte, len(content)) | ||
250 | + ecb.CryptBlocks(crypted, content) | ||
251 | + // 普通base64编码加密 区别于urlsafe base64 | ||
252 | + return crypted, nil | ||
253 | +} | ||
254 | + | ||
255 | +func AES_ECB_PKCS5_Decrypt(cipherText, key string) (string, error) { | ||
256 | + result, err := AES_ECB_PKCS5_DecryptByte([]byte(cipherText), []byte(key)) | ||
257 | + str := ByteArr2Str(result) | ||
258 | + return str, err | ||
259 | +} | ||
260 | + | ||
261 | +func AES_ECB_PKCS5_DecryptByte(cipherText, key []byte) ([]byte, error) { | ||
262 | + err := checkKeySize(key) | ||
263 | + if err != nil { | ||
264 | + return nil, err | ||
265 | + | ||
266 | + } | ||
267 | + block, err := aes.NewCipher(key) | ||
268 | + if err != nil { | ||
269 | + return nil, err | ||
270 | + } | ||
271 | + blockMode := newECBDecrypter(block) | ||
272 | + origData := make([]byte, len(cipherText)) | ||
273 | + blockMode.CryptBlocks(origData, cipherText) | ||
274 | + origData = PKCS5UnPadding(origData) | ||
275 | + return origData, nil | ||
276 | +} | ||
277 | + | ||
278 | +func Base64UrlSafeEncode(source []byte) string { | ||
279 | + // Base64 Url Safe is the same as Base64 but does not contain '/' and '+' (replaced by '_' and '-') and trailing '=' are removed. | ||
280 | + bytearr := base64.StdEncoding.EncodeToString(source) | ||
281 | + safeurl := strings.Replace(string(bytearr), "/", "_", -1) | ||
282 | + safeurl = strings.Replace(safeurl, "+", "-", -1) | ||
283 | + safeurl = strings.Replace(safeurl, "=", "", -1) | ||
284 | + return safeurl | ||
285 | +} | ||
286 | + | ||
287 | +func PKCS5Padding(cipherText []byte, blockSize int) []byte { | ||
288 | + padding := blockSize - len(cipherText)%blockSize | ||
289 | + padText := bytes.Repeat([]byte{byte(padding)}, padding) | ||
290 | + return append(cipherText, padText...) | ||
291 | +} | ||
292 | + | ||
293 | +func PKCS5UnPadding(origData []byte) []byte { | ||
294 | + length := len(origData) | ||
295 | + // 去掉最后一个字节 unpadding 次 | ||
296 | + unpadding := int(origData[length-1]) | ||
297 | + return origData[:(length - unpadding)] | ||
298 | +} | ||
299 | + | ||
300 | +// NewECBEncrypter returns a BlockMode which encrypts in electronic code book | ||
301 | +// mode, using the given Block. | ||
302 | +func newECBEncrypter(b cipher.Block) cipher.BlockMode { | ||
303 | + return (*ecbEncrypter)(newECB(b)) | ||
304 | +} | ||
305 | +func (x *ecbEncrypter) BlockSize() int { | ||
306 | + return x.blockSize | ||
307 | +} | ||
308 | +func (x *ecbEncrypter) CryptBlocks(dst, src []byte) { | ||
309 | + if len(src)%x.blockSize != 0 { | ||
310 | + panic("crypto/cipher: input not full blocks") | ||
311 | + } | ||
312 | + if len(dst) < len(src) { | ||
313 | + panic("crypto/cipher: output smaller than input") | ||
314 | + } | ||
315 | + for len(src) > 0 { | ||
316 | + x.b.Encrypt(dst, src[:x.blockSize]) | ||
317 | + src = src[x.blockSize:] | ||
318 | + dst = dst[x.blockSize:] | ||
319 | + } | ||
320 | +} | ||
321 | + | ||
322 | +type ecbDecrypter ecb | ||
323 | + | ||
324 | +// NewECBDecrypter returns a BlockMode which decrypts in electronic code book | ||
325 | +// mode, using the given Block. | ||
326 | +func newECBDecrypter(b cipher.Block) cipher.BlockMode { | ||
327 | + return (*ecbDecrypter)(newECB(b)) | ||
328 | +} | ||
329 | +func (x *ecbDecrypter) BlockSize() int { | ||
330 | + return x.blockSize | ||
331 | +} | ||
332 | +func (x *ecbDecrypter) CryptBlocks(dst, src []byte) { | ||
333 | + if len(src)%x.blockSize != 0 { | ||
334 | + panic("crypto/cipher: input not full blocks") | ||
335 | + } | ||
336 | + if len(dst) < len(src) { | ||
337 | + panic("crypto/cipher: output smaller than input") | ||
338 | + } | ||
339 | + for len(src) > 0 { | ||
340 | + x.b.Decrypt(dst, src[:x.blockSize]) | ||
341 | + src = src[x.blockSize:] | ||
342 | + dst = dst[x.blockSize:] | ||
343 | + } | ||
344 | +} |
utils/jwt.go
0 → 100644
1 | +package utils | ||
2 | + | ||
3 | +import ( | ||
4 | + "time" | ||
5 | + | ||
6 | + jwt "github.com/dgrijalva/jwt-go" | ||
7 | +) | ||
8 | + | ||
9 | +var ( | ||
10 | + key = []byte("sx87sda0w7x7sd") | ||
11 | +) | ||
12 | + | ||
13 | +//MyToken ... | ||
14 | +type MyToken struct { | ||
15 | + jwt.StandardClaims | ||
16 | + ID int `json:"id"` | ||
17 | +} | ||
18 | + | ||
19 | +//CreateJWTToken ... | ||
20 | +func CreateJWTToken(id int) (string, error) { | ||
21 | + nowTime := time.Now().Unix() | ||
22 | + claims := MyToken{ | ||
23 | + StandardClaims: jwt.StandardClaims{ | ||
24 | + NotBefore: nowTime, | ||
25 | + IssuedAt: nowTime, | ||
26 | + ExpiresAt: 60 * 60 * 2, //过期时间 | ||
27 | + Issuer: "test_a", | ||
28 | + }, | ||
29 | + ID: id, | ||
30 | + } | ||
31 | + | ||
32 | + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) | ||
33 | + return token.SignedString(key) | ||
34 | +} | ||
35 | + | ||
36 | +//ValidJWTToken ... | ||
37 | +func ValidJWTToken(tokenString string) (*MyToken, error) { | ||
38 | + token, err := jwt.ParseWithClaims( | ||
39 | + tokenString, | ||
40 | + &MyToken{}, | ||
41 | + func(token *jwt.Token) (interface{}, error) { | ||
42 | + return key, nil | ||
43 | + }) | ||
44 | + if err != nil { | ||
45 | + return nil, err | ||
46 | + } | ||
47 | + if claims, ok := token.Claims.(*MyToken); ok && token.Valid { | ||
48 | + // 验证成功,返回信息 | ||
49 | + return claims, nil | ||
50 | + } | ||
51 | + // 验证失败 | ||
52 | + return nil, err | ||
53 | +} |
utils/time.go
0 → 100644
1 | +package utils | ||
2 | + | ||
3 | +import "time" | ||
4 | + | ||
5 | +var localtime = time.FixedZone("UTC", 8*3600) | ||
6 | + | ||
7 | +//LocalTimeZone 设定时区东八区 | ||
8 | +func LocalTimeZone() *time.Location { | ||
9 | + | ||
10 | + return localtime | ||
11 | +} | ||
12 | + | ||
13 | +//LocalTime .... | ||
14 | +func LocalTime() time.Time { | ||
15 | + return new(time.Time).In(localtime) | ||
16 | +} |
-
请 注册 或 登录 后发表评论