Merge branch 'refs/heads/feat-user-sync'
This commit is contained in:
commit
c5dcd895f4
|
|
@ -370,15 +370,8 @@ func registerHandler(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
type SyncUserReq struct {
|
|
||||||
Token string `json:"token" form:"token"`
|
|
||||||
Types int `json:"type" form:"type"` // 1为全量同步 2为增量同步
|
|
||||||
Device string `json:"device" form:"device"`
|
|
||||||
Confirm proto.UserSyncConfirm `json:"confirm" form:"confirm"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetSyncUserInfo(c *gin.Context) {
|
func GetSyncUserInfo(c *gin.Context) {
|
||||||
var req_data SyncUserReq
|
var req_data proto.SyncUserReq
|
||||||
if err := c.ShouldBind(&req_data); err == nil {
|
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"})
|
c.JSON(200, gin.H{"code": proto.ParameterError, "message": "error", "data": "token is empty"})
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import (
|
||||||
|
|
||||||
var Config ConfigStruct
|
var Config ConfigStruct
|
||||||
var SigningKey = []byte{}
|
var SigningKey = []byte{}
|
||||||
var Url_map = map[string]bool{"/login": true, "/register": true, "/uuid": true, "/gqr": true, "/cid/callback": true, "/tool/monitor": true} // 不需要token验证的url
|
var Url_map = map[string]bool{"/login": true, "/register": true, "/uuid": true, "/gqr": true, "/cid/callback": true, "/tool/monitor": true, "/user/sync": true} // 不需要token验证的url
|
||||||
var Per_menu_map = map[string]int{"/video/": 1, "/device/": 2, "/cid/": 3}
|
var Per_menu_map = map[string]int{"/video/": 1, "/device/": 2, "/cid/": 3}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
@ -80,6 +80,7 @@ type ConfigStruct struct {
|
||||||
SERVER_USER_TYPE string `json:"user_type"` // 服务器用户类型,master: 主服务器,slave: 从服务器,从服务器会定时同步数据
|
SERVER_USER_TYPE string `json:"user_type"` // 服务器用户类型,master: 主服务器,slave: 从服务器,从服务器会定时同步数据
|
||||||
MASTER_SERVER_DOMAIN string `json:"master_server_domain"` // 主服务器域名
|
MASTER_SERVER_DOMAIN string `json:"master_server_domain"` // 主服务器域名
|
||||||
USER_SYNC_TIME int `json:"user_sync_time"` // 用户数据同步时间,单位秒
|
USER_SYNC_TIME int `json:"user_sync_time"` // 用户数据同步时间,单位秒
|
||||||
|
SERVER_NAME string `json:"server_name"` // 服务器名称,用于区分不同服务器
|
||||||
}
|
}
|
||||||
|
|
||||||
// 读取配置文件
|
// 读取配置文件
|
||||||
|
|
|
||||||
|
|
@ -76,3 +76,11 @@ type UserAddOrUpdate struct {
|
||||||
CreateTime string `json:"CreateTime" form:"CreateTime"`
|
CreateTime string `json:"CreateTime" form:"CreateTime"`
|
||||||
UpdateTime string `json:"UpdateTime" form:"UpdateTime"`
|
UpdateTime string `json:"UpdateTime" form:"UpdateTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 数据同步请求
|
||||||
|
type SyncUserReq struct {
|
||||||
|
Token string `json:"token" form:"token"`
|
||||||
|
Types int `json:"type" form:"type"` // 1为全量同步 2为增量同步
|
||||||
|
Device string `json:"device" form:"device"`
|
||||||
|
Confirm UserSyncConfirm `json:"confirm" form:"confirm"`
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -96,9 +96,20 @@ func DeleteUserService(id, user_id int) int {
|
||||||
}
|
}
|
||||||
func UserSyncDataFromMaster() {
|
func UserSyncDataFromMaster() {
|
||||||
//从接口获取数据
|
//从接口获取数据
|
||||||
url := "http://" + proto.Config.MASTER_SERVER_DOMAIN + "/user/sync"
|
url := "https://" + proto.Config.MASTER_SERVER_DOMAIN + "/user/sync"
|
||||||
tokens := worker.GetRedisSetMembers("super_permission_tokens")
|
tokens := worker.GetRedisSetMembers("super_permission_tokens")
|
||||||
user_sync_data := worker.SyncDataFromMasterReq(url, tokens[0])
|
var req proto.SyncUserReq
|
||||||
|
req.Token = tokens[0]
|
||||||
|
req.Device = proto.Config.SERVER_NAME
|
||||||
|
all := worker.GetRedis("user_sync_all")
|
||||||
|
if all == "" || all == "1" {
|
||||||
|
req.Types = 1
|
||||||
|
} else {
|
||||||
|
worker.SetRedis("user_sync_all", "2")
|
||||||
|
req.Types = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
user_sync_data := worker.SyncDataFromMasterReq2(url, req)
|
||||||
add_users := user_sync_data.Add
|
add_users := user_sync_data.Add
|
||||||
update_users := user_sync_data.Update
|
update_users := user_sync_data.Update
|
||||||
delete_users := user_sync_data.Delete
|
delete_users := user_sync_data.Delete
|
||||||
|
|
@ -106,26 +117,48 @@ func UserSyncDataFromMaster() {
|
||||||
var fail_ids []uint
|
var fail_ids []uint
|
||||||
|
|
||||||
//添加用户
|
//添加用户
|
||||||
|
var add_confirm []proto.UserConfirmID
|
||||||
for _, v := range add_users {
|
for _, v := range add_users {
|
||||||
res := dao.AddUserSync(v)
|
res := dao.AddUserSync(v)
|
||||||
if res == 0 {
|
if res == 0 {
|
||||||
fail_ids = append(fail_ids, v.ID)
|
fail_ids = append(fail_ids, v.ID)
|
||||||
|
} else {
|
||||||
|
add_confirm = append(add_confirm, proto.UserConfirmID{ID: v.ID})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//更新用户
|
//更新用户
|
||||||
|
var update_confirm []proto.UserConfirmID
|
||||||
for _, v := range update_users {
|
for _, v := range update_users {
|
||||||
res := dao.UpdateUserSync(v)
|
res := dao.UpdateUserSync(v)
|
||||||
if res == 0 {
|
if res == 0 {
|
||||||
fail_ids = append(fail_ids, v.ID)
|
fail_ids = append(fail_ids, v.ID)
|
||||||
|
} else {
|
||||||
|
update_confirm = append(update_confirm, proto.UserConfirmID{ID: v.ID})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//删除用户
|
//删除用户
|
||||||
|
var delete_confirm []proto.UserConfirmID
|
||||||
for _, v := range delete_users {
|
for _, v := range delete_users {
|
||||||
res := dao.DeleteUserSync(v)
|
res := dao.DeleteUserSync(v)
|
||||||
if res == 0 {
|
if res == 0 {
|
||||||
fail_ids = append(fail_ids, v.ID)
|
fail_ids = append(fail_ids, v.ID)
|
||||||
|
} else {
|
||||||
|
delete_confirm = append(delete_confirm, proto.UserConfirmID{ID: v.ID})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//确认同步数据
|
||||||
|
var data proto.UserSyncConfirm
|
||||||
|
data.Add = add_confirm
|
||||||
|
data.Update = update_confirm
|
||||||
|
data.Delete = delete_confirm
|
||||||
|
//确认同步数据请求
|
||||||
|
var confirm_req proto.SyncUserReq
|
||||||
|
confirm_req.Token = tokens[0]
|
||||||
|
confirm_req.Device = proto.Config.SERVER_NAME
|
||||||
|
confirm_req.Types = 3
|
||||||
|
confirm_req.Confirm = data
|
||||||
|
worker.SyncDataFromMasterReq2(url, confirm_req)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 同步数据到主服务器-增删改数据
|
// 同步数据到主服务器-增删改数据
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,17 @@ func SyncDataFromMasterReq(url string, token string) proto.UserSync {
|
||||||
return proto.UserSync{}
|
return proto.UserSync{}
|
||||||
}
|
}
|
||||||
req.Header.Set("token", token)
|
req.Header.Set("token", token)
|
||||||
client := &http.Client{}
|
//json负载
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
//传输数据
|
||||||
|
m := make(map[string]interface{})
|
||||||
|
m["token"] = token
|
||||||
|
m["device"] = ""
|
||||||
|
|
||||||
|
if client == nil {
|
||||||
|
client = &http.Client{}
|
||||||
|
}
|
||||||
|
client = &http.Client{}
|
||||||
//获取数据
|
//获取数据
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -118,3 +128,43 @@ func SyncDataFromMasterReq(url string, token string) proto.UserSync {
|
||||||
}
|
}
|
||||||
return userSync
|
return userSync
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取数据,全量及增量
|
||||||
|
func SyncDataFromMasterReq2(url string, data proto.SyncUserReq) proto.UserSync {
|
||||||
|
var res proto.UserSync
|
||||||
|
//从接口获取数据
|
||||||
|
json_data, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
req, err := http.NewRequest("POST", url, bytes.NewBuffer(json_data))
|
||||||
|
if err != nil {
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
//传输数据
|
||||||
|
if client == nil {
|
||||||
|
client = &http.Client{}
|
||||||
|
}
|
||||||
|
//获取数据
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
//解析数据
|
||||||
|
var m map[string]interface{}
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&m)
|
||||||
|
if err != nil {
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
if m["code"].(float64) != 0 {
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
err = json.Unmarshal([]byte(m["data"].(string)), &res)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("SyncDataFromMasterReq2 error decode data:", err)
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue