From f56bf95d91fed049054806f9c24df85d3e83884e Mon Sep 17 00:00:00 2001 From: aarongao Date: Thu, 2 Apr 2020 13:34:36 +0800 Subject: [PATCH] .. --- API/Item.go | 11 ++++++----- API/Operator.go | 7 +++++++ API/OperatorLog.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ API/UserLog.go | 5 +++-- DB/db.go | 12 ++++++++++++ Lib/Auth/Auth.go | 10 ++++++++++ Lib/JWT/jwt.go | 7 +++---- Lib/OperatorLog/operatorLog.go | 21 +++++++++++++++++++++ Lib/Token/token.go | 18 ------------------ README.md | 22 ++++++++++++++++++++++ Version.md | 14 +++++++++++--- main.go | 5 +++++ 12 files changed, 158 insertions(+), 32 deletions(-) create mode 100644 API/OperatorLog.go create mode 100644 Lib/OperatorLog/operatorLog.go delete mode 100644 Lib/Token/token.go diff --git a/API/Item.go b/API/Item.go index a2da5fa..1088eec 100644 --- a/API/Item.go +++ b/API/Item.go @@ -142,7 +142,7 @@ func UpdateItem(c *gin.Context) { ) // 更新等待时间 - allteim := DB.Redis.Get("AllItemTime") + allteim := DB.Redis.Get("AllItemTime_" + c.PostForm("ScenicId")) jsond, _ := json.Marshal(allteim) var ItemTime map[string]string @@ -151,10 +151,11 @@ func UpdateItem(c *gin.Context) { if poststate == 1 { ItemTime[c.PostForm("id")] = "--" } - if poststate == 0 { - ItemTime[c.PostForm("id")] = "0" - } - DB.Redis.Set("AllItemTime", ItemTime, time.Second*60*60*24*30) + //if poststate == 0 { + // ItemTime[c.PostForm("id")] = "0" + //} + + DB.Redis.Set("AllItemTime_" + c.PostForm("ScenicId"), ItemTime, time.Second*60*60*24*30) c.JSON(200, tools.ResponseSeccess{ 0, diff --git a/API/Operator.go b/API/Operator.go index 5ec3b24..9bd7877 100644 --- a/API/Operator.go +++ b/API/Operator.go @@ -85,6 +85,13 @@ func UpdateOperator(c *gin.Context) { }) return } + if c.PostForm("Username") == "" || c.PostForm("Password") == "" { + c.JSON(200, tools.ResponseError{ + 1, + "用户名密码不能为空", + }) + return + } var _auth []string json.Unmarshal([]byte(c.PostForm("Auth")), &_auth) diff --git a/API/OperatorLog.go b/API/OperatorLog.go new file mode 100644 index 0000000..fadb9f0 --- /dev/null +++ b/API/OperatorLog.go @@ -0,0 +1,58 @@ +package Api + +import ( + "github.com/aarongao/tools" + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo/options" + "letu/DB" + "math" + "strconv" +) + +// @Title 查询所有管理员日志 +// @Description 查询所有用户行为 +// @Accept json +// @Produce json +// @Param ScenicId 5dfb03070a9ac17ac7a82054 string true "景区id" +// @Param Page 1 int true "当前第几页" +// @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"total":1,"currpage":1,"totalpages":1,"prepage":20,"result":}" +// @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" +// @Router /AllOperatorLog? [get] +func AllOperatorLog(c *gin.Context) { + c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin")) + c.Header("Access-Control-Allow-Credentials", "true") + + total, _ := DB.COperatorLog.CountDocuments(tools.GetContext(), bson.M{"ScenicId": c.Query("ScenicId")}) + limit, _ := strconv.ParseInt(c.Query("Limit"), 10, 64) + if limit == 0 { + limit = 50 + } + currPage, _ := strconv.ParseInt(c.Query("Page"), 10, 64) + if currPage == 0 { + currPage = 1 + } + + skip := (currPage - 1) * limit + + var aOperatorLog []DB.SOperatorLog + cur, err := DB.COperatorLog.Find(tools.GetContext(), bson.M{"ScenicId": c.Query("ScenicId")}, &options.FindOptions{Limit: &limit, Skip: &skip, Sort: bson.M{"_id": -1}}) + defer cur.Close(tools.GetContext()) + if err == nil { + for cur.Next(tools.GetContext()) { + var e DB.SOperatorLog + cur.Decode(&e) + aOperatorLog = append(aOperatorLog, e) + } + } + + c.JSON(200, tools.Page{ + 0, + total, + currPage, + int64(math.Ceil(float64(total) / float64(limit))), + limit, + aOperatorLog, + }) + +} diff --git a/API/UserLog.go b/API/UserLog.go index 5b1d525..304d102 100644 --- a/API/UserLog.go +++ b/API/UserLog.go @@ -100,6 +100,7 @@ func UserLog(c *gin.Context) { // @Description 查询所有用户行为 // @Accept json // @Produce json +// @Param ScenicId 5dfb03070a9ac17ac7a82054 string true "景区id" // @Param Page 1 int true "当前第几页" // @Success 200 {object} tools.ResponseSeccess "{"errcode":0,"total":1,"currpage":1,"totalpages":1,"prepage":20,"result":}" // @Failure 500 {object} tools.ResponseError "{"errcode":1,"errmsg":"错误原因"}" @@ -109,7 +110,7 @@ func AllUserLog(c *gin.Context) { c.Header("Access-Control-Allow-Credentials", "true") - total,_ := DB.CUserLog.CountDocuments(tools.GetContext(), bson.M{}) + total,_ := DB.CUserLog.CountDocuments(tools.GetContext(), bson.M{"ScenicId":c.Query("ScenicId")}) limit, _ := strconv.ParseInt(c.Query("Limit"),10,64) if limit == 0 { limit = 50 @@ -121,7 +122,7 @@ func AllUserLog(c *gin.Context) { skip := (currPage - 1) * limit var aUserLog []DB.SUserLog - cur, err := DB.CUserLog.Find(tools.GetContext(), bson.M{}, &options.FindOptions{Limit: &limit, Skip: &skip, Sort: bson.M{"_id": -1}}) + cur, err := DB.CUserLog.Find(tools.GetContext(), bson.M{"ScenicId":c.Query("ScenicId")}, &options.FindOptions{Limit: &limit, Skip: &skip, Sort: bson.M{"_id": -1}}) defer cur.Close(tools.GetContext()) if err == nil { for cur.Next(tools.GetContext()) { diff --git a/DB/db.go b/DB/db.go index 1669971..52cac7c 100644 --- a/DB/db.go +++ b/DB/db.go @@ -17,6 +17,7 @@ var CTags *mongo.Collection //标签 var CScenic *mongo.Collection //景区 var CLine *mongo.Collection //推荐线路 var CUserLog *mongo.Collection //用户行为记录 +var COperatorLog *mongo.Collection //操作员log var CSystemLog *mongo.Collection //操作记录 var CTrajectory *mongo.Collection //移动轨迹 var CIcons *mongo.Collection //图标信息 @@ -109,6 +110,17 @@ type SUserLog struct { Source string `bson:"Source" json:"Source"` //来源 Device SDevice `bson:"Device" json:"Device"` //设备信息 } + +type SOperatorLog struct { + ScenicId string `bson:"ScenicId" json:"ScenicId"` + UserId string `bson:"UserId" json:"UserId"` // 用户ID + UserName string `bson:"UserName" json:"UserName"` //用户名称 + DateTime int64 `bson:"DateTime" json:"DateTime"` //时间戳 + Remarks string `bson:"Remarks" json:"Remarks"` //备注 + Model SModel `bson:"Model" json:"Model"` + Api string `bson:"Api" json:"Api"` + Parames interface{} `bson:"Parames" json:"Parames"` +} type SSystemLog struct { UserId string `bson:"UserId" json:"UserId"` // 用户ID UserName string `bson:"UserName" json:"UserName"` //用户名称 diff --git a/Lib/Auth/Auth.go b/Lib/Auth/Auth.go index 32c116d..d8d2996 100644 --- a/Lib/Auth/Auth.go +++ b/Lib/Auth/Auth.go @@ -7,6 +7,8 @@ import ( "go.mongodb.org/mongo-driver/bson/primitive" "letu/DB" "letu/Lib/JWT" + "letu/Lib/LeYouTu" + "letu/Lib/OperatorLog" ) // 系统中所有模块 @@ -85,7 +87,15 @@ func CheckAuthFunc(handFunc func(c *gin.Context), auth *DB.SModel) func(c *gin.C }) } else { c.Set("UserInfo", user) + handFunc(c) + + if auth.Model != "操作员日志"{ + go func() { + ScenicId, _ := LeYouTu.GetScenicId(c) + OperatorLog.CreateOperatorLog(ScenicId, user, auth, c.Request.RequestURI, c.Request.Form) + }() + } } } } diff --git a/Lib/JWT/jwt.go b/Lib/JWT/jwt.go index 2ad3993..a1ef34c 100644 --- a/Lib/JWT/jwt.go +++ b/Lib/JWT/jwt.go @@ -13,11 +13,10 @@ import ( func CreateToken(user *DB.SMember, exp int64) (tokenss string, err error) { //自定义claim - auth, _ := json.Marshal(user.Auth) claim := jwt.MapClaims{ "id": user.Id, - //"mobile": user.Mobile, + "username": user.Username, "userType": user.UserType, "scenicId": user.ScenicId, "auth": string(auth), @@ -61,12 +60,12 @@ func ParseToken(tokenss string) (user *DB.SMember, err error) { id, _ := primitive.ObjectIDFromHex(claim["id"].(string)) user.Id = &id - //user.Mobile = claim["mobile"].(string) + user.Username = claim["username"].(string) user.UserType = claim["userType"].(string) user.ScenicId = claim["scenicId"].(string) var jsons []string - json.Unmarshal([]byte(claim["auth"].(string)),&jsons) + json.Unmarshal([]byte(claim["auth"].(string)), &jsons) user.Auth = jsons return } diff --git a/Lib/OperatorLog/operatorLog.go b/Lib/OperatorLog/operatorLog.go new file mode 100644 index 0000000..859c9f6 --- /dev/null +++ b/Lib/OperatorLog/operatorLog.go @@ -0,0 +1,21 @@ +package OperatorLog + +import ( + "github.com/aarongao/tools" + "letu/DB" + "time" +) + +func CreateOperatorLog(ScenicId string, user *DB.SMember, model *DB.SModel, api string, parames interface{}) { + + DB.COperatorLog.InsertOne(tools.GetContext(), DB.SOperatorLog{ + ScenicId, + user.Id.Hex(), + user.Username, + time.Now().Unix(), + "", + *model, + api, + parames, + }) +} diff --git a/Lib/Token/token.go b/Lib/Token/token.go deleted file mode 100644 index 7215e1a..0000000 --- a/Lib/Token/token.go +++ /dev/null @@ -1,18 +0,0 @@ -package Token - -import ( - "letu/DB" - "time" -) - -func GetToken(mobile string) string { - token := DB.Redis.Get("token_" + mobile) - if token == nil { - return "" - } - return token.(string) -} - -func SaveToken(mobile, token string) { - DB.Redis.Set("token_"+mobile, token, time.Second*3600*24*365) -} diff --git a/README.md b/README.md index e4060d1..2e64818 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ 1. [设备管理 - 查询所有游玩项目](#allitems-get) 1. [查询所有线路](#allline-get) 1. [操作员管理 - 所有操作员](#alloperator-get) +1. [查询所有用户行为](#alloperatorlog-get) 1. [所有景区基础信息](#allscenic-get) 1. [标签 - 所有标签](#alltag-get) 1. [标签 - 按照标签分组查看所有标签](#alltaggroup-get) @@ -173,6 +174,26 @@ + + +#### /AllOperatorLog (GET) + + +查询所有用户行为 + +| Param Name | Example | Data Type | Description | Required? | +|-----|-----|-----|-----|-----| +| ScenicId | 5dfb03070a9ac17ac7a82054 | string | 景区id | Yes | +| Page | 1 | int | 当前第几页 | Yes | + + +| Code | Type | Model | Message | +|-----|-----|-----|-----| +| 200 | object | [ResponseSeccess](#github.com.aarongao.tools.ResponseSeccess) | {"errcode":0,"total":1,"currpage":1,"totalpages":1,"prepage":20,"result":} | +| 500 | object | [ResponseError](#github.com.aarongao.tools.ResponseError) | {"errcode":1,"errmsg":"错误原因"} | + + + #### /AllScenic (GET) @@ -234,6 +255,7 @@ | Param Name | Example | Data Type | Description | Required? | |-----|-----|-----|-----|-----| +| ScenicId | 5dfb03070a9ac17ac7a82054 | string | 景区id | Yes | | Page | 1 | int | 当前第几页 | Yes | diff --git a/Version.md b/Version.md index acc0586..b6f16e8 100644 --- a/Version.md +++ b/Version.md @@ -41,13 +41,21 @@ /TopMenus/Remove(需要携带Token) ``` - - 6. 删除【游玩项目】标签。增加【游乐设施】【演出】【餐饮】【购物】【普通】 7. 删除【location】标签组 -8. +8. 修改地图切片url地址,及切片上传方式 + + /tiles2/**5e0d504e24e03431008b4567**/18/218274/99286.jpg + + 其中5e0d504e24e03431008b4567(景区id)为新加目录 + + 通过FTP方式上传到/root/leyoutu/tiles2/(景区id)/目录下 + +9. 后台增加管理员日志功能 + + ##### 发布流程: diff --git a/main.go b/main.go index eaf2ed7..8d1aea0 100644 --- a/main.go +++ b/main.go @@ -95,6 +95,7 @@ func main() { DB.CDevice = DB.DB.Collection("Device") DB.CNotice = DB.DB.Collection("Notice") DB.CTopMenus = DB.DB.Collection("TopMenu") + DB.COperatorLog = DB.DB.Collection("OperatorLog") DelayMessage.CDelayMessage = DB.DB.Collection("DelayMessage") DelayMessage.CDelayErrorLog = DB.DB.Collection("DelayErrorLog") @@ -164,6 +165,10 @@ func main() { InitController("POST", "/LoginOperator", Api.LoginOperator, &DB.SModel{}) InitController("POST", "/UpdateOperator", Api.UpdateOperator, &DB.SModel{"操作员管理", "增加和修改"}) + + InitController("GET", "/AllOperatorLog", Api.AllOperatorLog, &DB.SModel{"操作员日志", "查看所有"}) + + InitController("GET", "/AllOperator", Api.AllOperator, &DB.SModel{"操作员管理", "查看所有"}) InitController("GET", "/SystemInfo", Api.SystemInfo, &DB.SModel{}) -- libgit2 0.21.0