2024-05-18 17:12:24 +08:00
|
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2024-12-12 21:08:53 +08:00
|
|
|
|
"errors"
|
2024-05-18 17:12:24 +08:00
|
|
|
|
"regexp"
|
2024-12-11 17:43:44 +08:00
|
|
|
|
"strconv"
|
2024-12-13 20:21:05 +08:00
|
|
|
|
"time"
|
2024-05-18 17:12:24 +08:00
|
|
|
|
"videoplayer/dao"
|
2024-12-15 15:08:20 +08:00
|
|
|
|
"videoplayer/handler"
|
2024-06-28 10:10:23 +08:00
|
|
|
|
"videoplayer/proto"
|
2024-12-11 16:10:56 +08:00
|
|
|
|
"videoplayer/worker"
|
2024-05-18 17:12:24 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2024-07-01 19:32:58 +08:00
|
|
|
|
func CreateUser(name, password, email, gender string, age int) uint {
|
2024-12-12 21:08:53 +08:00
|
|
|
|
id := dao.CreateUser(name, password, email, gender, age)
|
|
|
|
|
|
if id != 0 {
|
|
|
|
|
|
//添加用户信息到同步列表
|
|
|
|
|
|
err := setSyncUserDataSet("add", int(id))
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return id
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return id
|
2024-05-18 17:12:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-07 20:16:08 +08:00
|
|
|
|
func GetUser(name, email, password string) dao.User {
|
2024-05-18 17:12:24 +08:00
|
|
|
|
emailRegex := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
|
|
|
|
|
|
re := regexp.MustCompile(emailRegex)
|
|
|
|
|
|
var user dao.User
|
|
|
|
|
|
if re.MatchString(name) {
|
|
|
|
|
|
user = dao.FindUserByEmail(name)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
user = dao.FindUserByName(name)
|
|
|
|
|
|
}
|
|
|
|
|
|
if user.ID != 0 && user.Password == password {
|
|
|
|
|
|
return user
|
|
|
|
|
|
}
|
|
|
|
|
|
return dao.User{}
|
|
|
|
|
|
}
|
2024-05-21 15:13:01 +08:00
|
|
|
|
|
|
|
|
|
|
func ContainsUser(name, email string) bool {
|
|
|
|
|
|
user := dao.FindUserByName(name)
|
|
|
|
|
|
user2 := dao.FindUserByEmail(email)
|
|
|
|
|
|
if user.ID != 0 || user2.ID != 0 {
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
2024-06-28 10:10:23 +08:00
|
|
|
|
|
2024-06-28 10:38:55 +08:00
|
|
|
|
func GetUserByID(id int) []proto.User {
|
2024-06-28 10:10:23 +08:00
|
|
|
|
return dao.FindUserByID(id)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-06-28 10:38:55 +08:00
|
|
|
|
func GetUserByNameLike(name string) []proto.User {
|
2024-06-28 10:10:23 +08:00
|
|
|
|
return dao.FindUserByNameLike(name)
|
|
|
|
|
|
}
|
2024-10-06 16:35:54 +08:00
|
|
|
|
|
|
|
|
|
|
func UpdateUser(user_id int, req proto.UpdateUserInfoReq) (int, error) {
|
|
|
|
|
|
cur_user := dao.FindUserByID2(user_id)
|
2024-12-04 14:51:02 +08:00
|
|
|
|
//fmt.Println("cur_user:", cur_user, "req:", req)
|
2024-12-04 14:48:25 +08:00
|
|
|
|
if user_id == req.ID && cur_user.Role != "admin" {
|
2024-12-12 21:08:53 +08:00
|
|
|
|
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
|
2024-10-06 16:35:54 +08:00
|
|
|
|
} else if cur_user.Role == "admin" {
|
2024-10-06 16:41:29 +08:00
|
|
|
|
dao.UpdateUserByID2(req.ID, req)
|
2024-10-06 16:35:54 +08:00
|
|
|
|
return req.ID, nil
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return 0, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-12-11 16:10:56 +08:00
|
|
|
|
|
2024-12-12 21:08:53 +08:00
|
|
|
|
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
|
|
|
|
|
|
}
|
2024-12-11 16:10:56 +08:00
|
|
|
|
func UserSyncDataFromMaster() {
|
|
|
|
|
|
//从接口获取数据
|
|
|
|
|
|
url := "http://" + proto.Config.MASTER_SERVER_DOMAIN + "/user/sync"
|
|
|
|
|
|
tokens := worker.GetRedisSetMembers("super_permission_tokens")
|
|
|
|
|
|
user_sync_data := worker.SyncDataFromMasterReq(url, tokens[0])
|
|
|
|
|
|
add_users := user_sync_data.Add
|
|
|
|
|
|
update_users := user_sync_data.Update
|
|
|
|
|
|
delete_users := user_sync_data.Delete
|
|
|
|
|
|
//未成功操作的id
|
|
|
|
|
|
var fail_ids []uint
|
|
|
|
|
|
|
|
|
|
|
|
//添加用户
|
|
|
|
|
|
for _, v := range add_users {
|
2024-12-12 21:08:53 +08:00
|
|
|
|
res := dao.AddUserSync(v)
|
2024-12-11 16:10:56 +08:00
|
|
|
|
if res == 0 {
|
|
|
|
|
|
fail_ids = append(fail_ids, v.ID)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//更新用户
|
|
|
|
|
|
for _, v := range update_users {
|
|
|
|
|
|
res := dao.UpdateUserSync(v)
|
|
|
|
|
|
if res == 0 {
|
|
|
|
|
|
fail_ids = append(fail_ids, v.ID)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//删除用户
|
|
|
|
|
|
for _, v := range delete_users {
|
|
|
|
|
|
res := dao.DeleteUserSync(v)
|
|
|
|
|
|
if res == 0 {
|
|
|
|
|
|
fail_ids = append(fail_ids, v.ID)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-12-11 17:43:44 +08:00
|
|
|
|
|
|
|
|
|
|
// 同步数据到主服务器-增删改数据
|
2024-12-15 15:08:20 +08:00
|
|
|
|
func GetUserSyncData(device string) handler.UserSyncResp {
|
2024-12-12 21:08:53 +08:00
|
|
|
|
key := device + "_sync_user_ids"
|
2024-12-13 20:26:39 +08:00
|
|
|
|
add_temp_key := device + "_sync_user_ids_add_confirm_temp"
|
|
|
|
|
|
update_temp_key := device + "_sync_user_ids_update_confirm_temp"
|
|
|
|
|
|
delete_temp_key := device + "_sync_user_ids_delete_confirm_temp"
|
|
|
|
|
|
//需要获取暂存集合的并集,清空暂存集合,存入待确认集合
|
|
|
|
|
|
add_user_ids := worker.GetRedisSetUnion(key+"_add", add_temp_key)
|
|
|
|
|
|
update_user_ids := worker.GetRedisSetUnion(key+"_update", update_temp_key)
|
|
|
|
|
|
delete_user_ids := worker.GetRedisSetUnion(key+"_delete", delete_temp_key)
|
2024-12-11 17:43:44 +08:00
|
|
|
|
add_users := []dao.User{}
|
|
|
|
|
|
update_users := []dao.User{}
|
|
|
|
|
|
delete_users := []proto.UserDelID{}
|
|
|
|
|
|
for _, v := range add_user_ids {
|
|
|
|
|
|
id, _ := strconv.Atoi(v)
|
|
|
|
|
|
user := dao.FindUserByUserID(id)
|
|
|
|
|
|
add_users = append(add_users, user)
|
|
|
|
|
|
}
|
2024-12-13 20:21:05 +08:00
|
|
|
|
|
2024-12-11 17:43:44 +08:00
|
|
|
|
for _, v := range update_user_ids {
|
|
|
|
|
|
id, _ := strconv.Atoi(v)
|
|
|
|
|
|
user := dao.FindUserByUserID(id)
|
|
|
|
|
|
update_users = append(update_users, user)
|
|
|
|
|
|
}
|
2024-12-13 20:21:05 +08:00
|
|
|
|
|
2024-12-11 17:43:44 +08:00
|
|
|
|
for _, v := range delete_user_ids {
|
|
|
|
|
|
id, _ := strconv.Atoi(v)
|
|
|
|
|
|
delete_users = append(delete_users, proto.UserDelID{ID: uint(id)})
|
|
|
|
|
|
}
|
2024-12-13 20:26:39 +08:00
|
|
|
|
//将id存入暂存集合,清空原集合,存入待确认集合主要保证在确认时,有新的数据加入不会在确认时漏掉
|
2024-12-13 20:21:05 +08:00
|
|
|
|
worker.SetRedisSetUnionAndStore(add_temp_key, key+"_add")
|
2024-12-13 20:26:39 +08:00
|
|
|
|
worker.ClearRedisSet(key + "_add")
|
2024-12-13 20:21:05 +08:00
|
|
|
|
worker.SetRedisSetUnionAndStore(update_temp_key, key+"_update")
|
2024-12-13 20:26:39 +08:00
|
|
|
|
worker.ClearRedisSet(key + "_update")
|
2024-12-13 20:21:05 +08:00
|
|
|
|
worker.SetRedisSetUnionAndStore(delete_temp_key, key+"_delete")
|
2024-12-13 20:26:39 +08:00
|
|
|
|
worker.ClearRedisSet(key + "_delete")
|
2024-12-15 15:08:20 +08:00
|
|
|
|
return handler.UserSyncResp{Add: add_users, Update: update_users, Delete: delete_users}
|
2024-12-11 17:43:44 +08:00
|
|
|
|
}
|
2024-12-12 21:08:53 +08:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
2024-12-13 20:21:05 +08:00
|
|
|
|
|
|
|
|
|
|
// 确认同步数据
|
|
|
|
|
|
func ConfirmSyncUserData(device string, data proto.UserSyncConfirm) error {
|
|
|
|
|
|
|
|
|
|
|
|
var ids_add []string
|
|
|
|
|
|
var err error
|
|
|
|
|
|
for _, v := range data.Add {
|
|
|
|
|
|
ids_add = append(ids_add, strconv.Itoa(int(v.ID)))
|
|
|
|
|
|
}
|
|
|
|
|
|
add_key := device + "_sync_user_ids_add_confirm"
|
|
|
|
|
|
isSuccess := worker.SetRedisSetAddBatchWithExpire(add_key, ids_add, time.Second*30)
|
|
|
|
|
|
if !isSuccess {
|
|
|
|
|
|
err = errors.New("set confirm error")
|
|
|
|
|
|
}
|
|
|
|
|
|
var ids_update []string
|
|
|
|
|
|
for _, v := range data.Update {
|
|
|
|
|
|
ids_update = append(ids_update, strconv.Itoa(int(v.ID)))
|
|
|
|
|
|
}
|
|
|
|
|
|
update_key := device + "_sync_user_ids_update_confirm"
|
|
|
|
|
|
isSuccess = worker.SetRedisSetAddBatchWithExpire(update_key, ids_update, time.Second*30)
|
|
|
|
|
|
if !isSuccess {
|
|
|
|
|
|
err = errors.New("set confirm error")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var ids_delete []string
|
|
|
|
|
|
for _, v := range data.Delete {
|
|
|
|
|
|
ids_delete = append(ids_delete, strconv.Itoa(int(v.ID)))
|
|
|
|
|
|
}
|
|
|
|
|
|
del_key := device + "_sync_user_ids_delete_confirm"
|
|
|
|
|
|
isSuccess = worker.SetRedisSetAddBatchWithExpire(del_key, ids_delete, time.Second*30)
|
|
|
|
|
|
if !isSuccess {
|
|
|
|
|
|
err = errors.New("set confirm error")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//待确认集合暂存
|
|
|
|
|
|
ids_add_confirm_temp := device + "_sync_user_ids_add_confirm_temp"
|
|
|
|
|
|
ids_update_confirm_temp := device + "_sync_user_ids_update_confirm_temp"
|
|
|
|
|
|
ids_delete_confirm_temp := device + "_sync_user_ids_delete_confirm_temp"
|
|
|
|
|
|
|
|
|
|
|
|
//取差集
|
|
|
|
|
|
add_diff := worker.SetRedisSetDiffAndStore(ids_add_confirm_temp, add_key)
|
|
|
|
|
|
update_diff := worker.SetRedisSetDiffAndStore(ids_update_confirm_temp, update_key)
|
|
|
|
|
|
delete_diff := worker.SetRedisSetDiffAndStore(ids_delete_confirm_temp, del_key)
|
|
|
|
|
|
if add_diff != true || update_diff != true || delete_diff != true {
|
|
|
|
|
|
err = errors.New("confirm error")
|
|
|
|
|
|
}
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|