完善用户数据同步,待完善同步确认

This commit is contained in:
junleea 2024-12-12 21:08:53 +08:00
parent 29e8151420
commit 8796ef784b
3 changed files with 107 additions and 21 deletions

View File

@ -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
}

View File

@ -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{}})
}

View File

@ -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) //用户修改自己的信息,不能修改权限信息
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
}