admin.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. package services
  2. import (
  3. "errors"
  4. "fmt"
  5. "hongze/hongze_mobile_admin/models/custom"
  6. "hongze/hongze_mobile_admin/models/tables/admin"
  7. "hongze/hongze_mobile_admin/models/tables/admin_record"
  8. "hongze/hongze_mobile_admin/models/tables/h5_admin_session"
  9. "hongze/hongze_mobile_admin/utils"
  10. "strconv"
  11. "time"
  12. )
  13. var ERR_NO_ADMIN_RECORD = errors.New("用户关系没有入库")
  14. var ERR_ADMIN_NOT_BIND = errors.New("用户没有绑定")
  15. //通过openid获取用户信息
  16. func GetAdminUserItemByOpenId(openid string) (item *custom.AdminWx, err error) {
  17. item = &custom.AdminWx{}
  18. //通过openid获取用户关联信息
  19. adminRecord, adminRecordErr := admin_record.GetAdminRecordByOpenId(openid)
  20. if adminRecordErr != nil {
  21. if adminRecordErr.Error() == utils.ErrNoRow() {
  22. err = ERR_NO_ADMIN_RECORD
  23. return
  24. } else {
  25. err = adminRecordErr
  26. return
  27. }
  28. }
  29. //该openid在系统中没有关联关系
  30. if adminRecord == nil {
  31. err = ERR_NO_ADMIN_RECORD
  32. return
  33. }
  34. //该openid没有绑定用户
  35. if adminRecord.UserId <= 0 {
  36. err = ERR_ADMIN_NOT_BIND
  37. //格式化返回用户数据
  38. formatWxUserAndUserRecord(item, adminRecord)
  39. return
  40. }
  41. //获取用户信息
  42. item, adminInfoErr := admin.GetAdminWxById(adminRecord.UserId)
  43. if adminInfoErr != nil {
  44. //如果是找不到该用户
  45. if adminInfoErr.Error() == utils.ErrNoRow() {
  46. //用户被删除了,但是user_record没有删除对应的关系,那么去解除绑定
  47. userUnbindErr := admin_record.UnBindAdminRecordByOpenid(openid)
  48. if userUnbindErr != nil {
  49. err = userUnbindErr
  50. return
  51. }
  52. err = ERR_ADMIN_NOT_BIND
  53. adminRecord.UserId = 0
  54. item = &custom.AdminWx{}
  55. //格式化返回用户数据
  56. formatWxUserAndUserRecord(item, adminRecord)
  57. return
  58. }
  59. err = adminInfoErr
  60. //如果是下面这个错误,那么这个可能是用户信息被删除,然后user_record表没有移除该条记录所绑定的user_id信息
  61. if adminInfoErr.Error() == utils.ErrNoRow() {
  62. err = errors.New("用户信息不存在")
  63. }
  64. return
  65. }
  66. //格式化返回用户数据
  67. formatWxUserAndUserRecord(item, adminRecord)
  68. return
  69. }
  70. //根据管理员id和平台id获取用户信息
  71. func GetAdminUserItemByAdminId(adminId, platform int) (item *custom.AdminWx, err error) {
  72. item = &custom.AdminWx{}
  73. //获取用户信息
  74. item, adminErr := admin.GetAdminWxById(adminId)
  75. if adminErr != nil {
  76. err = adminErr
  77. return
  78. }
  79. //格式化返回用户数据
  80. formatWxUser(item, platform)
  81. return
  82. }
  83. //通过用户 关系表记录 和 用户记录 格式化返回 用户数据
  84. func formatWxUserAndUserRecord(adminWx *custom.AdminWx, adminRecord *admin_record.AdminRecord) {
  85. adminWx.OpenId = adminRecord.OpenId
  86. adminWx.UnionId = adminRecord.UnionId
  87. adminWx.NickName = adminRecord.NickName
  88. adminWx.BindAccount = adminRecord.BindAccount
  89. adminWx.Sex = adminRecord.Sex
  90. adminWx.Province = adminRecord.Province
  91. adminWx.City = adminRecord.City
  92. adminWx.Country = adminRecord.Country
  93. adminWx.Headimgurl = adminRecord.Headimgurl
  94. adminWx.AdminId = adminRecord.UserId
  95. //adminWx.Subscribe = adminRecord.Subscribe
  96. //wxUser.RealName = userRecord.RealName
  97. //wxUser.BindAccount = userRecord.BindAccount
  98. }
  99. //通过用户 用户记录 和 来源平台 格式化返回 用户数据
  100. func formatWxUser(adminWx *custom.AdminWx, platform int) {
  101. //根据用户id和平台id获取用户关系
  102. adminRecord, adminRecordErr := admin_record.GetAdminRecordByAdminId(adminWx.AdminId, platform)
  103. if adminRecordErr != nil {
  104. if adminRecordErr.Error() != utils.ErrNoRow() {
  105. return
  106. }
  107. if adminRecordErr.Error() == utils.ErrNoRow() {
  108. return
  109. }
  110. }
  111. //该openid在系统中没有关联关系
  112. if adminRecord == nil {
  113. return
  114. }
  115. formatWxUserAndUserRecord(adminWx, adminRecord)
  116. return
  117. }
  118. //用户绑定
  119. func BindWxUser(openid, userName, password string, registerPlatform int) (adminWx *custom.AdminWx, err error) {
  120. if userName == "" || password == "" {
  121. err = errors.New("账号密码必填")
  122. return
  123. }
  124. //根据账号密码获取管理员信息(校验账号密码是否正常)
  125. adminInfo, err := admin.CheckAdmin(userName, password)
  126. if err != nil {
  127. if err.Error() != utils.ErrNoRow() {
  128. err = errors.New("账号或密码错误")
  129. }
  130. return
  131. }
  132. if adminInfo.Enabled == 0 {
  133. err = errors.New("您的账号已被禁用,如需登录,请联系管理员")
  134. return
  135. }
  136. //获取用户信息
  137. adminWx, err = admin.GetAdminWxById(adminInfo.AdminId)
  138. if err != nil {
  139. return
  140. }
  141. //查询openid的第三方(微信)信息
  142. adminRecord, err := admin_record.GetAdminRecordByOpenId(openid)
  143. if err != nil {
  144. return
  145. }
  146. //如果查询出来的用户是nil,那么需要新增用户
  147. //如果存在该手机号/邮箱,那么需要校验
  148. if adminRecord.UserId > 0 && adminRecord.UserId != adminInfo.AdminId {
  149. err = errors.New(fmt.Sprint("用户已绑定,不允许重复绑定:", adminRecord.UserId))
  150. return
  151. }
  152. if adminRecord.UserId == 0 {
  153. err = admin_record.BindAdminRecordByOpenid(adminInfo.AdminId, openid)
  154. if err != nil {
  155. return
  156. }
  157. adminRecord.UserId = adminInfo.AdminId
  158. }
  159. //如果当前该第三方用户信息的昵称为空串的话,那么需要去查询该用户的第一个绑定信息的数据作为来源做数据修复
  160. //if adminRecord.NickName == "" {
  161. // oldUserRecord, err := admin_record.GetAdminThirdRecordByAdminId(adminInfo.AdminId)
  162. // if err == nil && oldUserRecord != nil {
  163. // //如果该用户绑定的第一条数据的头像信息不为空串,那么就去做新数据的修复
  164. // if oldUserRecord.NickName != "" {
  165. // _ = admin_record.ModifyAdminRecordInfo(adminRecord.OpenId, oldUserRecord.NickName, oldUserRecord.Headimgurl, oldUserRecord.City, oldUserRecord.Province, oldUserRecord.Country, oldUserRecord.Sex, adminInfo.AdminId)
  166. // }
  167. // }
  168. //}
  169. //格式化用户数据
  170. formatWxUserAndUserRecord(adminWx, adminRecord)
  171. return
  172. }
  173. //用户解绑
  174. func UnbindWxUser(openid string) (err error) {
  175. err = admin_record.UnBindAdminRecordByOpenid(openid)
  176. return
  177. }
  178. //微信登录
  179. func WxLogin(wxPlatform int, wxAccessToken *WxAccessToken, wxUserInfo *WxUserInfo) (token string, adminWx *custom.AdminWx, err error, errMsg string) {
  180. errMsg = `微信登录失败`
  181. openId := wxAccessToken.Openid
  182. unionId := wxAccessToken.Unionid
  183. if unionId == "" {
  184. unionId = wxUserInfo.Unionid
  185. }
  186. //firstLogin==1,强制绑定手机号或者邮箱
  187. QUERY_WX_USER:
  188. adminWx, adminWxErr := GetAdminUserItemByOpenId(openId)
  189. if adminWxErr == ERR_NO_ADMIN_RECORD { //没有用户openid记录
  190. _, recordErr := AddUserRecord(openId, unionId, wxUserInfo.Nickname, "", wxUserInfo.Province, wxUserInfo.City, wxUserInfo.Country, wxUserInfo.Headimgurl, "", wxPlatform, wxUserInfo.Sex, 0)
  191. //如果插入失败,那么直接将错误信息返回
  192. if recordErr != nil {
  193. err = recordErr
  194. return
  195. }
  196. //插入成功后,需要重新查询该用户,并进入下面的逻辑
  197. goto QUERY_WX_USER
  198. } else if adminWxErr == ERR_ADMIN_NOT_BIND {
  199. //没有用户信息
  200. //wxUser.FirstLogin = 1
  201. } else if adminWxErr != nil {
  202. err = adminWxErr
  203. return
  204. }
  205. adminId := adminWx.AdminId
  206. if adminId > 0 && adminWx.Enabled != 1 {
  207. err = errors.New(fmt.Sprint("账户状态异常,不允许登录,ID:", adminId))
  208. errMsg = `账户信息异常!`
  209. return
  210. }
  211. //获取登录token
  212. tokenItem, tokenErr := h5_admin_session.GetTokenByOpenId(openId)
  213. if tokenErr != nil && tokenErr.Error() != utils.ErrNoRow() {
  214. err = errors.New("登录失败,获取token失败:" + tokenErr.Error())
  215. return
  216. }
  217. if tokenItem == nil || (tokenErr != nil && tokenErr.Error() == utils.ErrNoRow()) {
  218. timeUnix := time.Now().Unix()
  219. timeUnixStr := strconv.FormatInt(timeUnix, 10)
  220. token = utils.MD5(openId) + utils.MD5(timeUnixStr)
  221. //新增session
  222. {
  223. session := &h5_admin_session.H5AdminSession{
  224. OpenId: openId,
  225. AdminId: adminWx.AdminId,
  226. CreatedTime: time.Now(),
  227. LastUpdatedTime: time.Now(),
  228. ExpireTime: time.Now().AddDate(0, 3, 0),
  229. AccessToken: token,
  230. }
  231. session.AccessToken = token
  232. sessionErr := h5_admin_session.AddSession(session)
  233. if err != nil {
  234. err = errors.New("登录失败,新增用户session信息失败:" + sessionErr.Error())
  235. return
  236. }
  237. }
  238. } else {
  239. token = tokenItem.AccessToken
  240. //如果联系人编号不为空,且联系人编号与session里面的联系人编号不一致的时候,需要做session变更
  241. //if adminId > 0 && tokenItem.AdminId != adminId {
  242. // _ = h5_admin_session.UpdateSession(tokenItem.SessionId, adminId, time.Now().AddDate(0, 1, 0))
  243. //}
  244. //如果联系人编号与session里面的联系人编号不一致的时候,需要做session变更
  245. if tokenItem.AdminId != adminId {
  246. tokenItem.AdminId = adminId
  247. tokenItem.ExpireTime = time.Now().AddDate(0, 1, 0)
  248. _ = tokenItem.Update([]string{"AdminId", "ExpireTime"})
  249. }
  250. }
  251. return
  252. }
  253. //添加第三方用户(微信)记录
  254. func AddUserRecord(openId, unionId, nickName, realName, province, city, country, headimgurl, sessionKey string, platform, sex, subscribe int) (adminRecord *admin_record.AdminRecord, err error) {
  255. find, err := admin_record.GetAdminRecordByOpenId(openId)
  256. if err != nil && err.Error() != utils.ErrNoRow() {
  257. return
  258. }
  259. if find != nil {
  260. adminRecord = find
  261. return
  262. }
  263. adminRecord = &admin_record.AdminRecord{
  264. OpenId: openId, //用户open_id
  265. UnionId: unionId, //用户union_id
  266. Subscribe: subscribe,
  267. NickName: nickName, //用户昵称,最大长度:32
  268. RealName: realName, //用户实际名称,最大长度:32
  269. Sex: sex, //普通用户性别,1为男性,2为女性
  270. Province: province, //普通用户个人资料填写的省份,最大长度:30
  271. City: city, //普通用户个人资料填写的城市,最大长度:30
  272. Country: country, //国家,如中国为CN,最大长度:30
  273. Headimgurl: headimgurl, //用户第三方(微信)头像,最大长度:512
  274. CreateTime: time.Now(), //创建时间,关系添加时间、用户授权时间
  275. CreatePlatform: platform, //注册平台,1:日度点评公众号,2:管理后台,3:pc端网站,4:查研观向小程序;默认:1
  276. SessionKey: sessionKey, //微信小程序会话密钥,最大长度:255
  277. }
  278. recordId, err := admin_record.AddAdminRecord(adminRecord)
  279. if err != nil {
  280. return
  281. }
  282. adminRecord.UserRecordId = int(recordId)
  283. return
  284. }