user.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package user
  2. import (
  3. "authService/model"
  4. "authService/response"
  5. "authService/service/role"
  6. "authService/util"
  7. "authService/validators"
  8. "errors"
  9. jsoniter "github.com/json-iterator/go"
  10. "github.com/samber/lo"
  11. "gorm.io/gorm"
  12. )
  13. var json = jsoniter.ConfigCompatibleWithStandardLibrary
  14. // 获取用户信息
  15. func Find(id int64) (*model.User, *response.ErrCode) {
  16. var user model.User
  17. err := model.DB.Where("id = ?", id).Preload("Roles").First(&user).Error
  18. if err != nil {
  19. if errors.Is(err, gorm.ErrRecordNotFound) {
  20. return nil, &response.ErrCode{
  21. Code: response.DATA_NOT_FOUND,
  22. Msg: "用户不存在",
  23. }
  24. }
  25. return nil, response.Err
  26. }
  27. return &user, nil
  28. }
  29. // 根据账号查找
  30. func FindByAccount(account string) *model.User {
  31. var existUser *model.User
  32. model.DB.Where("account = ?", account).Preload("Roles").First(&existUser)
  33. return existUser
  34. }
  35. // 创建账号
  36. func Create(user *validators.User, password string) *response.ErrCode {
  37. status := model.UserStatusDisable
  38. if user.Status != 0 {
  39. status = user.Status
  40. }
  41. if ExistUserAccount(user.Account, 0) {
  42. return &response.ErrCode{
  43. Code: response.ERROR,
  44. Msg: "账户名已存在",
  45. }
  46. }
  47. var createUser = &model.User{
  48. Account: user.Account,
  49. Nickname: user.Nickname,
  50. Status: status,
  51. Password: password,
  52. }
  53. // 创建
  54. err := model.DB.Create(&createUser).Error
  55. if err != nil {
  56. return response.Err
  57. }
  58. // 创建用户角色
  59. var roles = make([]*model.UserRole, 0)
  60. for _, roleId := range user.RoleIds {
  61. roles = append(roles, &model.UserRole{
  62. UserId: createUser.ID,
  63. RoleId: roleId,
  64. })
  65. }
  66. model.DB.CreateInBatches(roles, 100)
  67. return nil
  68. }
  69. // 修改账号
  70. func Update(user *validators.User, password string) *response.ErrCode {
  71. existsUser, findErr := Find(user.ID)
  72. if findErr != nil {
  73. return findErr
  74. }
  75. if existsUser.IsSuper == model.UserIsSuperTrue {
  76. return &response.ErrCode{
  77. Code: response.ERROR,
  78. Msg: "该用户禁止被修改",
  79. }
  80. }
  81. // 更新
  82. err := model.DB.Where("id = ?", user.ID).Updates(&model.User{
  83. Nickname: user.Nickname,
  84. Status: user.Status,
  85. Password: password,
  86. }).Error
  87. if err != nil {
  88. return response.Err
  89. }
  90. // 删除用户角色
  91. model.DB.Where("user_id = ?", user.ID).Delete(&model.UserRole{})
  92. // 创建用户角色
  93. var roles = make([]*model.UserRole, 0)
  94. for _, roleId := range user.RoleIds {
  95. roles = append(roles, &model.UserRole{
  96. UserId: user.ID,
  97. RoleId: roleId,
  98. })
  99. }
  100. model.DB.CreateInBatches(roles, 100)
  101. // 移除登录缓存
  102. Logout(user.ID)
  103. return nil
  104. }
  105. // 修改备注信息
  106. func UpdateRemark(id int64, remark string) *response.ErrCode {
  107. existsUser, findErr := Find(id)
  108. if findErr != nil {
  109. return findErr
  110. }
  111. if existsUser.IsSuper == model.UserIsSuperTrue {
  112. return &response.ErrCode{
  113. Code: response.ERROR,
  114. Msg: "该用户禁止被修改",
  115. }
  116. }
  117. // 更新
  118. err := model.DB.Where("id = ?", id).Update("remark", remark).Error
  119. if err != nil {
  120. return response.Err
  121. }
  122. return nil
  123. }
  124. // 修改或创建
  125. func UpdateOrCreate(user *validators.User, password string) *response.ErrCode {
  126. if password != "" {
  127. password = util.Md5(password)
  128. }
  129. var err *response.ErrCode
  130. if user.ID != 0 {
  131. err = Update(user, password)
  132. } else {
  133. err = Create(user, password)
  134. }
  135. return err
  136. }
  137. // 检查账户名是否重复
  138. func ExistUserAccount(account string, userId int64) bool {
  139. var existUser *model.User
  140. model.DB.Where("account = ?", account).First(&existUser)
  141. if existUser != nil {
  142. if existUser.ID != 0 && existUser.ID != userId {
  143. return true
  144. }
  145. }
  146. return false
  147. }
  148. // 修改自己的信息
  149. func UpdateMySelf(user *validators.User, oldPassword string, password string, userId int64) *response.ErrCode {
  150. if password != "" {
  151. password = util.Md5(password)
  152. if oldPassword == "" {
  153. return &response.ErrCode{
  154. Code: response.ERROR,
  155. Msg: "请输入原密码",
  156. }
  157. }
  158. oldPassword = util.Md5(oldPassword)
  159. }
  160. existsUser, findErr := Find(userId)
  161. if findErr != nil {
  162. return findErr
  163. }
  164. // 如果不是超级管理员,禁止被修改账户名
  165. if existsUser.IsSuper == model.UserIsSuperFalse {
  166. user.Account = ""
  167. }
  168. // 检查原密码是否正确
  169. if oldPassword != existsUser.Password {
  170. return &response.ErrCode{
  171. Code: response.ERROR,
  172. Msg: "原密码不正确",
  173. }
  174. }
  175. // 检查账户名是否重复
  176. if user.Account != "" && ExistUserAccount(user.Account, userId) {
  177. return &response.ErrCode{
  178. Code: response.ERROR,
  179. Msg: "账户名已存在",
  180. }
  181. }
  182. // 更新
  183. err := model.DB.Where("id = ?", userId).Updates(&model.User{
  184. Account: user.Account,
  185. Nickname: user.Nickname,
  186. Password: password,
  187. }).Error
  188. if err != nil {
  189. return response.Err
  190. }
  191. return nil
  192. }
  193. // 删除
  194. func Delete(id int64) *response.ErrCode {
  195. existsUser, findErr := Find(id)
  196. if findErr != nil {
  197. return findErr
  198. }
  199. if existsUser.IsSuper == model.UserIsSuperTrue {
  200. return &response.ErrCode{
  201. Code: response.ERROR,
  202. Msg: "该用户禁止被修改",
  203. }
  204. }
  205. model.DB.Where("id = ?", id).Delete(&model.User{})
  206. // 移除登录缓存
  207. Logout(id)
  208. return nil
  209. }
  210. // 获取分页列表
  211. func Paginate(page, pageSize int, key string) (list []*model.User, total int64) {
  212. query := model.DB.Model(&model.User{}).Where("is_super = ?", model.UserIsSuperFalse)
  213. if key != "" {
  214. query = query.Where("account like ? or nickname like ?", "%"+key+"%", "%"+key+"%")
  215. }
  216. query.Count(&total)
  217. query.Scopes(model.Paginate(page, pageSize)).Preload("Roles").Order("id desc").Find(&list)
  218. return list, total
  219. }
  220. // 格式化用户
  221. func Format(user *model.User) *validators.User {
  222. var roleIds = make([]int64, 0)
  223. var roles = make([]*validators.Role, 0)
  224. var permissions = make([]string, 0)
  225. for _, currentRole := range user.Roles {
  226. roleIds = append(roleIds, currentRole.ID)
  227. formatedRole := role.FormatRole(&currentRole)
  228. roles = append(roles, formatedRole)
  229. permissions = append(permissions, formatedRole.Permissions...)
  230. }
  231. permissions = lo.Uniq(permissions)
  232. return &validators.User{
  233. ID: user.ID,
  234. Account: user.Account,
  235. Nickname: user.Nickname,
  236. Status: user.Status,
  237. IsSuper: user.IsSuper,
  238. Permissions: permissions,
  239. RoleIds: roleIds,
  240. Roles: roles,
  241. Remark: user.Remark,
  242. }
  243. }