package service import ( "errors" "regexp" "strconv" "videoplayer/dao" "videoplayer/proto" "videoplayer/worker" ) func CreateUser(name, password, email, gender string, age int) uint { 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 { 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{} } 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 } func GetUserByID(id int) []proto.User { return dao.FindUserByID(id) } func GetUserByNameLike(name string) []proto.User { return dao.FindUserByNameLike(name) } 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" { 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 } else { return 0, nil } } 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" 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 { res := dao.AddUserSync(v) 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) } } } // 同步数据到主服务器-增删改数据 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{} for _, v := range add_user_ids { id, _ := strconv.Atoi(v) user := dao.FindUserByUserID(id) add_users = append(add_users, user) } for _, v := range update_user_ids { id, _ := strconv.Atoi(v) user := dao.FindUserByUserID(id) update_users = append(update_users, user) } for _, v := range delete_user_ids { id, _ := strconv.Atoi(v) delete_users = append(delete_users, proto.UserDelID{ID: uint(id)}) } 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 }