Commit f56bf95d91fed049054806f9c24df85d3e83884e
1 parent
58ec1105
Exists in
v1.2
and in
1 other branch
..
Showing
12 changed files
with
158 additions
and
32 deletions
Show diff stats
API/Item.go
... | ... | @@ -142,7 +142,7 @@ func UpdateItem(c *gin.Context) { |
142 | 142 | ) |
143 | 143 | |
144 | 144 | // 更新等待时间 |
145 | - allteim := DB.Redis.Get("AllItemTime") | |
145 | + allteim := DB.Redis.Get("AllItemTime_" + c.PostForm("ScenicId")) | |
146 | 146 | jsond, _ := json.Marshal(allteim) |
147 | 147 | |
148 | 148 | var ItemTime map[string]string |
... | ... | @@ -151,10 +151,11 @@ func UpdateItem(c *gin.Context) { |
151 | 151 | if poststate == 1 { |
152 | 152 | ItemTime[c.PostForm("id")] = "--" |
153 | 153 | } |
154 | - if poststate == 0 { | |
155 | - ItemTime[c.PostForm("id")] = "0" | |
156 | - } | |
157 | - DB.Redis.Set("AllItemTime", ItemTime, time.Second*60*60*24*30) | |
154 | + //if poststate == 0 { | |
155 | + // ItemTime[c.PostForm("id")] = "0" | |
156 | + //} | |
157 | + | |
158 | + DB.Redis.Set("AllItemTime_" + c.PostForm("ScenicId"), ItemTime, time.Second*60*60*24*30) | |
158 | 159 | |
159 | 160 | c.JSON(200, tools.ResponseSeccess{ |
160 | 161 | 0, | ... | ... |
API/Operator.go
... | ... | @@ -85,6 +85,13 @@ func UpdateOperator(c *gin.Context) { |
85 | 85 | }) |
86 | 86 | return |
87 | 87 | } |
88 | + if c.PostForm("Username") == "" || c.PostForm("Password") == "" { | |
89 | + c.JSON(200, tools.ResponseError{ | |
90 | + 1, | |
91 | + "用户名密码不能为空", | |
92 | + }) | |
93 | + return | |
94 | + } | |
88 | 95 | |
89 | 96 | var _auth []string |
90 | 97 | json.Unmarshal([]byte(c.PostForm("Auth")), &_auth) | ... | ... |
... | ... | @@ -0,0 +1,58 @@ |
1 | +package Api | |
2 | + | |
3 | +import ( | |
4 | + "github.com/aarongao/tools" | |
5 | + "github.com/gin-gonic/gin" | |
6 | + "go.mongodb.org/mongo-driver/bson" | |
7 | + "go.mongodb.org/mongo-driver/mongo/options" | |
8 | + "letu/DB" | |
9 | + "math" | |
10 | + "strconv" | |
11 | +) | |
12 | + | |
13 | +// @Title 查询所有管理员日志 | |
14 | +// @Description 查询所有用户行为 | |
15 | +// @Accept json | |
16 | +// @Produce json | |
17 | +// @Param ScenicId 5dfb03070a9ac17ac7a82054 string true "景区id" | |
18 | +// @Param Page 1 int true "当前第几页" | |
19 | +// @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"total":1,"currpage":1,"totalpages":1,"prepage":20,"result":}" | |
20 | +// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" | |
21 | +// @Router /AllOperatorLog? [get] | |
22 | +func AllOperatorLog(c *gin.Context) { | |
23 | + c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) | |
24 | + c.Header("Access-Control-Allow-Credentials", "true") | |
25 | + | |
26 | + total, _ := DB.COperatorLog.CountDocuments(tools.GetContext(), bson.M{"ScenicId": c.Query("ScenicId")}) | |
27 | + limit, _ := strconv.ParseInt(c.Query("Limit"), 10, 64) | |
28 | + if limit == 0 { | |
29 | + limit = 50 | |
30 | + } | |
31 | + currPage, _ := strconv.ParseInt(c.Query("Page"), 10, 64) | |
32 | + if currPage == 0 { | |
33 | + currPage = 1 | |
34 | + } | |
35 | + | |
36 | + skip := (currPage - 1) * limit | |
37 | + | |
38 | + var aOperatorLog []DB.SOperatorLog | |
39 | + cur, err := DB.COperatorLog.Find(tools.GetContext(), bson.M{"ScenicId": c.Query("ScenicId")}, &options.FindOptions{Limit: &limit, Skip: &skip, Sort: bson.M{"_id": -1}}) | |
40 | + defer cur.Close(tools.GetContext()) | |
41 | + if err == nil { | |
42 | + for cur.Next(tools.GetContext()) { | |
43 | + var e DB.SOperatorLog | |
44 | + cur.Decode(&e) | |
45 | + aOperatorLog = append(aOperatorLog, e) | |
46 | + } | |
47 | + } | |
48 | + | |
49 | + c.JSON(200, tools.Page{ | |
50 | + 0, | |
51 | + total, | |
52 | + currPage, | |
53 | + int64(math.Ceil(float64(total) / float64(limit))), | |
54 | + limit, | |
55 | + aOperatorLog, | |
56 | + }) | |
57 | + | |
58 | +} | ... | ... |
API/UserLog.go
... | ... | @@ -100,6 +100,7 @@ func UserLog(c *gin.Context) { |
100 | 100 | // @Description 查询所有用户行为 |
101 | 101 | // @Accept json |
102 | 102 | // @Produce json |
103 | +// @Param ScenicId 5dfb03070a9ac17ac7a82054 string true "景区id" | |
103 | 104 | // @Param Page 1 int true "当前第几页" |
104 | 105 | // @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"total":1,"currpage":1,"totalpages":1,"prepage":20,"result":}" |
105 | 106 | // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" |
... | ... | @@ -109,7 +110,7 @@ func AllUserLog(c *gin.Context) { |
109 | 110 | c.Header("Access-Control-Allow-Credentials", "true") |
110 | 111 | |
111 | 112 | |
112 | - total,_ := DB.CUserLog.CountDocuments(tools.GetContext(), bson.M{}) | |
113 | + total,_ := DB.CUserLog.CountDocuments(tools.GetContext(), bson.M{"ScenicId":c.Query("ScenicId")}) | |
113 | 114 | limit, _ := strconv.ParseInt(c.Query("Limit"),10,64) |
114 | 115 | if limit == 0 { |
115 | 116 | limit = 50 |
... | ... | @@ -121,7 +122,7 @@ func AllUserLog(c *gin.Context) { |
121 | 122 | skip := (currPage - 1) * limit |
122 | 123 | |
123 | 124 | var aUserLog []DB.SUserLog |
124 | - cur, err := DB.CUserLog.Find(tools.GetContext(), bson.M{}, &options.FindOptions{Limit: &limit, Skip: &skip, Sort: bson.M{"_id": -1}}) | |
125 | + cur, err := DB.CUserLog.Find(tools.GetContext(), bson.M{"ScenicId":c.Query("ScenicId")}, &options.FindOptions{Limit: &limit, Skip: &skip, Sort: bson.M{"_id": -1}}) | |
125 | 126 | defer cur.Close(tools.GetContext()) |
126 | 127 | if err == nil { |
127 | 128 | for cur.Next(tools.GetContext()) { | ... | ... |
DB/db.go
... | ... | @@ -17,6 +17,7 @@ var CTags *mongo.Collection //标签 |
17 | 17 | var CScenic *mongo.Collection //景区 |
18 | 18 | var CLine *mongo.Collection //推荐线路 |
19 | 19 | var CUserLog *mongo.Collection //用户行为记录 |
20 | +var COperatorLog *mongo.Collection //操作员log | |
20 | 21 | var CSystemLog *mongo.Collection //操作记录 |
21 | 22 | var CTrajectory *mongo.Collection //移动轨迹 |
22 | 23 | var CIcons *mongo.Collection //图标信息 |
... | ... | @@ -109,6 +110,17 @@ type SUserLog struct { |
109 | 110 | Source string `bson:"Source" json:"Source"` //来源 |
110 | 111 | Device SDevice `bson:"Device" json:"Device"` //设备信息 |
111 | 112 | } |
113 | + | |
114 | +type SOperatorLog struct { | |
115 | + ScenicId string `bson:"ScenicId" json:"ScenicId"` | |
116 | + UserId string `bson:"UserId" json:"UserId"` // 用户ID | |
117 | + UserName string `bson:"UserName" json:"UserName"` //用户名称 | |
118 | + DateTime int64 `bson:"DateTime" json:"DateTime"` //时间戳 | |
119 | + Remarks string `bson:"Remarks" json:"Remarks"` //备注 | |
120 | + Model SModel `bson:"Model" json:"Model"` | |
121 | + Api string `bson:"Api" json:"Api"` | |
122 | + Parames interface{} `bson:"Parames" json:"Parames"` | |
123 | +} | |
112 | 124 | type SSystemLog struct { |
113 | 125 | UserId string `bson:"UserId" json:"UserId"` // 用户ID |
114 | 126 | UserName string `bson:"UserName" json:"UserName"` //用户名称 | ... | ... |
Lib/Auth/Auth.go
... | ... | @@ -7,6 +7,8 @@ import ( |
7 | 7 | "go.mongodb.org/mongo-driver/bson/primitive" |
8 | 8 | "letu/DB" |
9 | 9 | "letu/Lib/JWT" |
10 | + "letu/Lib/LeYouTu" | |
11 | + "letu/Lib/OperatorLog" | |
10 | 12 | ) |
11 | 13 | |
12 | 14 | // 系统中所有模块 |
... | ... | @@ -85,7 +87,15 @@ func CheckAuthFunc(handFunc func(c *gin.Context), auth *DB.SModel) func(c *gin.C |
85 | 87 | }) |
86 | 88 | } else { |
87 | 89 | c.Set("UserInfo", user) |
90 | + | |
88 | 91 | handFunc(c) |
92 | + | |
93 | + if auth.Model != "操作员日志"{ | |
94 | + go func() { | |
95 | + ScenicId, _ := LeYouTu.GetScenicId(c) | |
96 | + OperatorLog.CreateOperatorLog(ScenicId, user, auth, c.Request.RequestURI, c.Request.Form) | |
97 | + }() | |
98 | + } | |
89 | 99 | } |
90 | 100 | } |
91 | 101 | } | ... | ... |
Lib/JWT/jwt.go
... | ... | @@ -13,11 +13,10 @@ import ( |
13 | 13 | func CreateToken(user *DB.SMember, exp int64) (tokenss string, err error) { |
14 | 14 | //自定义claim |
15 | 15 | |
16 | - | |
17 | 16 | auth, _ := json.Marshal(user.Auth) |
18 | 17 | claim := jwt.MapClaims{ |
19 | 18 | "id": user.Id, |
20 | - //"mobile": user.Mobile, | |
19 | + "username": user.Username, | |
21 | 20 | "userType": user.UserType, |
22 | 21 | "scenicId": user.ScenicId, |
23 | 22 | "auth": string(auth), |
... | ... | @@ -61,12 +60,12 @@ func ParseToken(tokenss string) (user *DB.SMember, err error) { |
61 | 60 | |
62 | 61 | id, _ := primitive.ObjectIDFromHex(claim["id"].(string)) |
63 | 62 | user.Id = &id |
64 | - //user.Mobile = claim["mobile"].(string) | |
63 | + user.Username = claim["username"].(string) | |
65 | 64 | user.UserType = claim["userType"].(string) |
66 | 65 | user.ScenicId = claim["scenicId"].(string) |
67 | 66 | |
68 | 67 | var jsons []string |
69 | - json.Unmarshal([]byte(claim["auth"].(string)),&jsons) | |
68 | + json.Unmarshal([]byte(claim["auth"].(string)), &jsons) | |
70 | 69 | user.Auth = jsons |
71 | 70 | return |
72 | 71 | } | ... | ... |
... | ... | @@ -0,0 +1,21 @@ |
1 | +package OperatorLog | |
2 | + | |
3 | +import ( | |
4 | + "github.com/aarongao/tools" | |
5 | + "letu/DB" | |
6 | + "time" | |
7 | +) | |
8 | + | |
9 | +func CreateOperatorLog(ScenicId string, user *DB.SMember, model *DB.SModel, api string, parames interface{}) { | |
10 | + | |
11 | + DB.COperatorLog.InsertOne(tools.GetContext(), DB.SOperatorLog{ | |
12 | + ScenicId, | |
13 | + user.Id.Hex(), | |
14 | + user.Username, | |
15 | + time.Now().Unix(), | |
16 | + "", | |
17 | + *model, | |
18 | + api, | |
19 | + parames, | |
20 | + }) | |
21 | +} | ... | ... |
Lib/Token/token.go
... | ... | @@ -1,18 +0,0 @@ |
1 | -package Token | |
2 | - | |
3 | -import ( | |
4 | - "letu/DB" | |
5 | - "time" | |
6 | -) | |
7 | - | |
8 | -func GetToken(mobile string) string { | |
9 | - token := DB.Redis.Get("token_" + mobile) | |
10 | - if token == nil { | |
11 | - return "" | |
12 | - } | |
13 | - return token.(string) | |
14 | -} | |
15 | - | |
16 | -func SaveToken(mobile, token string) { | |
17 | - DB.Redis.Set("token_"+mobile, token, time.Second*3600*24*365) | |
18 | -} |
README.md
... | ... | @@ -14,6 +14,7 @@ |
14 | 14 | 1. [设备管理 - 查询所有游玩项目](#allitems-get) |
15 | 15 | 1. [查询所有线路](#allline-get) |
16 | 16 | 1. [操作员管理 - 所有操作员](#alloperator-get) |
17 | +1. [查询所有用户行为](#alloperatorlog-get) | |
17 | 18 | 1. [所有景区基础信息](#allscenic-get) |
18 | 19 | 1. [标签 - 所有标签](#alltag-get) |
19 | 20 | 1. [标签 - 按照标签分组查看所有标签](#alltaggroup-get) |
... | ... | @@ -173,6 +174,26 @@ |
173 | 174 | |
174 | 175 | |
175 | 176 | |
177 | +<a name="alloperatorlog-get"></a> | |
178 | + | |
179 | +#### /AllOperatorLog (GET) | |
180 | + | |
181 | + | |
182 | +查询所有用户行为 | |
183 | + | |
184 | +| Param Name | Example | Data Type | Description | Required? | | |
185 | +|-----|-----|-----|-----|-----| | |
186 | +| ScenicId | 5dfb03070a9ac17ac7a82054 | string | 景区id | Yes | | |
187 | +| Page | 1 | int | 当前第几页 | Yes | | |
188 | + | |
189 | + | |
190 | +| Code | Type | Model | Message | | |
191 | +|-----|-----|-----|-----| | |
192 | +| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | {"errcode":0,"total":1,"currpage":1,"totalpages":1,"prepage":20,"result":} | | |
193 | +| 500 | object | [ResponseError](#github.com.aarongao.tools.ResponseError) | {"errcode":1,"errmsg":"错误原因"} | | |
194 | + | |
195 | + | |
196 | + | |
176 | 197 | <a name="allscenic-get"></a> |
177 | 198 | |
178 | 199 | #### /AllScenic (GET) |
... | ... | @@ -234,6 +255,7 @@ |
234 | 255 | |
235 | 256 | | Param Name | Example | Data Type | Description | Required? | |
236 | 257 | |-----|-----|-----|-----|-----| |
258 | +| ScenicId | 5dfb03070a9ac17ac7a82054 | string | 景区id | Yes | | |
237 | 259 | | Page | 1 | int | 当前第几页 | Yes | |
238 | 260 | |
239 | 261 | ... | ... |
Version.md
... | ... | @@ -41,13 +41,21 @@ |
41 | 41 | /TopMenus/Remove(需要携带Token) |
42 | 42 | ``` |
43 | 43 | |
44 | - | |
45 | - | |
46 | 44 | 6. 删除【游玩项目】标签。增加【游乐设施】【演出】【餐饮】【购物】【普通】 |
47 | 45 | |
48 | 46 | 7. 删除【location】标签组 |
49 | 47 | |
50 | -8. | |
48 | +8. 修改地图切片url地址,及切片上传方式 | |
49 | + | |
50 | + /tiles2/**<u>5e0d504e24e03431008b4567</u>**/18/218274/99286.jpg | |
51 | + | |
52 | + 其中5e0d504e24e03431008b4567(景区id)为新加目录 | |
53 | + | |
54 | + 通过FTP方式上传到/root/leyoutu/tiles2/(景区id)/目录下 | |
55 | + | |
56 | +9. 后台增加管理员日志功能 | |
57 | + | |
58 | + | |
51 | 59 | |
52 | 60 | ##### 发布流程: |
53 | 61 | ... | ... |
main.go
... | ... | @@ -95,6 +95,7 @@ func main() { |
95 | 95 | DB.CDevice = DB.DB.Collection("Device") |
96 | 96 | DB.CNotice = DB.DB.Collection("Notice") |
97 | 97 | DB.CTopMenus = DB.DB.Collection("TopMenu") |
98 | + DB.COperatorLog = DB.DB.Collection("OperatorLog") | |
98 | 99 | DelayMessage.CDelayMessage = DB.DB.Collection("DelayMessage") |
99 | 100 | DelayMessage.CDelayErrorLog = DB.DB.Collection("DelayErrorLog") |
100 | 101 | |
... | ... | @@ -164,6 +165,10 @@ func main() { |
164 | 165 | |
165 | 166 | InitController("POST", "/LoginOperator", Api.LoginOperator, &DB.SModel{}) |
166 | 167 | InitController("POST", "/UpdateOperator", Api.UpdateOperator, &DB.SModel{"操作员管理", "增加和修改"}) |
168 | + | |
169 | + InitController("GET", "/AllOperatorLog", Api.AllOperatorLog, &DB.SModel{"操作员日志", "查看所有"}) | |
170 | + | |
171 | + | |
167 | 172 | InitController("GET", "/AllOperator", Api.AllOperator, &DB.SModel{"操作员管理", "查看所有"}) |
168 | 173 | InitController("GET", "/SystemInfo", Api.SystemInfo, &DB.SModel{}) |
169 | 174 | ... | ... |