From 8796ef784b49da26e445f64020df6e00ee1eb5b5 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Thu, 12 Dec 2024 21:08:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=90=8C=E6=AD=A5=EF=BC=8C=E5=BE=85=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/user.go | 17 +++++++--- handler/user.go | 38 +++++++++++++++++----- service/userService.go | 73 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 107 insertions(+), 21 deletions(-) diff --git a/dao/user.go b/dao/user.go index c6236b2..43aec3a 100644 --- a/dao/user.go +++ b/dao/user.go @@ -35,7 +35,10 @@ func CreateUser(name, password, email, gender string, age int) uint { } func DeleteUserByID(id int) int { - DB.Delete(&User{}, id) + res := DB.Delete(&User{}, id) + if res.Error != nil { + return 0 + } return id } @@ -98,8 +101,12 @@ func UpdateUserByID2(id int, req proto.UpdateUserInfoReq) { } // 用户修改自己的信息 -func UpdateUserByID3(id int, req proto.UpdateUserInfoReq) { - DB.Model(&User{}).Where("id = ?", id).Updates(User{Name: req.Username, Age: req.Age, Avatar: req.Avatar, Gender: req.Gender}) +func UpdateUserByID3(id int, req proto.UpdateUserInfoReq) error { + res := DB.Model(&User{}).Where("id = ?", id).Updates(User{Name: req.Username, Age: req.Age, Avatar: req.Avatar, Gender: req.Gender}) + if res.Error != nil { + return res.Error + } + return nil } // 用户数据同步-添加 @@ -130,8 +137,8 @@ func DeleteUserSync(req proto.UserDelID) uint { } // 获取所有用户 -func GetAllUser() []proto.User { - var users []proto.User +func GetAllUser() []User { + var users []User DB.Find(&users) return users } diff --git a/handler/user.go b/handler/user.go index 03a44e0..26cfd5c 100644 --- a/handler/user.go +++ b/handler/user.go @@ -27,6 +27,7 @@ func SetUpUserGroup(router *gin.Engine) { userGroup.POST("/info", GetUserInfo) userGroup.POST("/update", UpdateUserInfo) userGroup.POST("/sync", GetSyncUserInfo) + userGroup.POST("/delete", DeleteUser) } type RLReq struct { @@ -78,6 +79,23 @@ func GetUserInfo(c *gin.Context) { } } +func DeleteUser(c *gin.Context) { + var req GetUserInfoReq + id, _ := c.Get("id") + user_id := int(id.(float64)) + if err := c.ShouldBind(&req); err == nil { + res := service.DeleteUserService(req.ID, user_id) + if res != 0 { + c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": res}) + } else { + c.JSON(200, gin.H{"code": proto.OperationFailed, "message": "failed", "data": res}) + } + } else { + c.JSON(200, gin.H{"code": proto.ParameterError, "message": err, "data": "2"}) + return + } +} + func UpdateUserInfo(c *gin.Context) { var req_data proto.UpdateUserInfoReq id, _ := c.Get("id") @@ -353,31 +371,35 @@ func registerHandler(c *gin.Context) { } type SyncUserReq struct { - token string `json:"token" form:"token"` - types int `json:"type" form:"type"` // 1为全量同步 2为增量同步 + Token string `json:"token" form:"token"` + Types int `json:"type" form:"type"` // 1为全量同步 2为增量同步 + Device string `json:"device" form:"device"` } func GetSyncUserInfo(c *gin.Context) { var req_data SyncUserReq if err := c.ShouldBind(&req_data); err == nil { - if req_data.token == "" { + if req_data.Token == "" { c.JSON(200, gin.H{"code": proto.ParameterError, "message": "error", "data": "token is empty"}) return } else { - if worker.IsContainSet("super_permission_tokens", req_data.token) { + if worker.IsContainSet("super_permission_tokens", req_data.Token) { if proto.Config.SERVER_USER_TYPE == "master" { - if req_data.types == 1 { + if req_data.Types == 1 { //1为全量同步 add_users := dao.GetAllUser() resp := proto.UserSyncResp{} resp.Add = add_users c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": resp}) - } else if req_data.types == 2 { - res := service.GetUserSyncData() + } else if req_data.Types == 2 { //2为增量同步 + if req_data.Device == "" || worker.IsContainSet("sync_devices_ids", req_data.Device) == false { + c.JSON(200, gin.H{"code": proto.ParameterError, "message": "error", "data": "device is empty or not exist"}) + return + } + res := service.GetUserSyncData(req_data.Device) c.JSON(200, gin.H{"code": proto.SuccessCode, "message": "success", "data": res}) } else { c.JSON(200, gin.H{"code": proto.ParameterError, "message": "type is error", "data": proto.UserSyncResp{}}) } - } else { c.JSON(200, gin.H{"code": proto.NoPermission, "message": "no permission,server is not master", "data": proto.UserSync{}}) } diff --git a/service/userService.go b/service/userService.go index ba5acbe..10da872 100644 --- a/service/userService.go +++ b/service/userService.go @@ -1,6 +1,7 @@ package service import ( + "errors" "regexp" "strconv" "videoplayer/dao" @@ -9,7 +10,15 @@ import ( ) func CreateUser(name, password, email, gender string, age int) uint { - return dao.CreateUser(name, password, email, gender, age) + id := dao.CreateUser(name, password, email, gender, age) + if id != 0 { + //添加用户信息到同步列表 + err := setSyncUserDataSet("add", int(id)) + if err != nil { + return id + } + } + return id } func GetUser(name, email, password string) dao.User { @@ -48,8 +57,15 @@ func UpdateUser(user_id int, req proto.UpdateUserInfoReq) (int, error) { cur_user := dao.FindUserByID2(user_id) //fmt.Println("cur_user:", cur_user, "req:", req) if user_id == req.ID && cur_user.Role != "admin" { - dao.UpdateUserByID3(user_id, req) //用户修改自己的信息,不能修改权限信息 - return user_id, nil + err := dao.UpdateUserByID3(user_id, req) //用户修改自己的信息,不能修改权限信息 + //添加修改用户信息到同步列表 + if err == nil { + err2 := setSyncUserDataSet("update", user_id) + if err2 != nil { + return user_id, nil + } + } + return user_id, err } else if cur_user.Role == "admin" { dao.UpdateUserByID2(req.ID, req) return req.ID, nil @@ -58,6 +74,25 @@ func UpdateUser(user_id int, req proto.UpdateUserInfoReq) (int, error) { } } +func DeleteUserService(id, user_id int) int { + res := 0 + if user_id == id { + res = dao.DeleteUserByID(id) + } else { + user := dao.FindUserByID2(user_id) + if user.Role == "admin" { + res = dao.DeleteUserByID(id) + } + } + if res != 0 { + //添加删除用户信息到同步列表 + err := setSyncUserDataSet("delete", id) + if err != nil { + return res + } + } + return res +} func UserSyncDataFromMaster() { //从接口获取数据 url := "http://" + proto.Config.MASTER_SERVER_DOMAIN + "/user/sync" @@ -71,7 +106,7 @@ func UserSyncDataFromMaster() { //添加用户 for _, v := range add_users { - res := dao.AddUserSync() + res := dao.AddUserSync(v) if res == 0 { fail_ids = append(fail_ids, v.ID) } @@ -93,10 +128,11 @@ func UserSyncDataFromMaster() { } // 同步数据到主服务器-增删改数据 -func GetUserSyncData() proto.UserSyncResp { - add_user_ids := worker.GetRedisSetMembers("sync_add_user_ids") - update_user_ids := worker.GetRedisSetMembers("sync_update_user_ids") - delete_user_ids := worker.GetRedisSetMembers("sync_delete_user_ids") +func GetUserSyncData(device string) proto.UserSyncResp { + key := device + "_sync_user_ids" + add_user_ids := worker.GetRedisSetMembers(key + "_add") + update_user_ids := worker.GetRedisSetMembers(key + "_update") + delete_user_ids := worker.GetRedisSetMembers(key + "_delete") add_users := []dao.User{} update_users := []dao.User{} delete_users := []proto.UserDelID{} @@ -116,3 +152,24 @@ func GetUserSyncData() proto.UserSyncResp { } return proto.UserSyncResp{Add: add_users, Update: update_users, Delete: delete_users} } + +func setSyncUserDataSet(t string, id int) error { + devices := worker.GetRedisSetMembers("sync_devices_ids") //主服务器查看从服务器的设备列表 + var err error + for _, device := range devices { + key := device + "_sync_user_ids" + if t == "add" { + key_ := key + "_add" + worker.SetRedisSetAdd(key_, strconv.Itoa(id)) + } else if t == "update" { + key_ := key + "_update" + worker.SetRedisSetAdd(key_, strconv.Itoa(id)) + } else if t == "delete" { + key_ := key + "_delete" + worker.SetRedisSetAdd(key_, strconv.Itoa(id)) + } else { + err = errors.New("error") + } + } + return err +}