sys_user.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. package system
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. "github.com/flipped-aurora/gin-vue-admin/server/model/common"
  7. systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
  8. "github.com/flipped-aurora/gin-vue-admin/server/global"
  9. "github.com/flipped-aurora/gin-vue-admin/server/model/system"
  10. "github.com/flipped-aurora/gin-vue-admin/server/utils"
  11. "github.com/google/uuid"
  12. "gorm.io/gorm"
  13. )
  14. //@author: [piexlmax](https://github.com/piexlmax)
  15. //@function: Register
  16. //@description: 用户注册
  17. //@param: u model.SysUser
  18. //@return: userInter system.SysUser, err error
  19. type UserService struct{}
  20. var UserServiceApp = new(UserService)
  21. func (userService *UserService) Register(u system.SysUser) (userInter system.SysUser, err error) {
  22. var user system.SysUser
  23. if !errors.Is(global.GVA_DB.Where("username = ?", u.Username).First(&user).Error, gorm.ErrRecordNotFound) { // 判断用户名是否注册
  24. return userInter, errors.New("用户名已注册")
  25. }
  26. // 否则 附加uuid 密码hash加密 注册
  27. u.Password = utils.BcryptHash(u.Password)
  28. u.UUID = uuid.New()
  29. err = global.GVA_DB.Create(&u).Error
  30. return u, err
  31. }
  32. //@author: [piexlmax](https://github.com/piexlmax)
  33. //@author: [SliverHorn](https://github.com/SliverHorn)
  34. //@function: Login
  35. //@description: 用户登录
  36. //@param: u *model.SysUser
  37. //@return: err error, userInter *model.SysUser
  38. func (userService *UserService) Login(u *system.SysUser) (userInter *system.SysUser, err error) {
  39. if nil == global.GVA_DB {
  40. return nil, fmt.Errorf("db not init")
  41. }
  42. var user system.SysUser
  43. err = global.GVA_DB.Where("username = ?", u.Username).Preload("Authorities").Preload("Authority").First(&user).Error
  44. if err == nil {
  45. if ok := utils.BcryptCheck(u.Password, user.Password); !ok {
  46. return nil, errors.New("密码错误")
  47. }
  48. MenuServiceApp.UserAuthorityDefaultRouter(&user)
  49. }
  50. return &user, err
  51. }
  52. //@author: [piexlmax](https://github.com/piexlmax)
  53. //@function: ChangePassword
  54. //@description: 修改用户密码
  55. //@param: u *model.SysUser, newPassword string
  56. //@return: err error
  57. func (userService *UserService) ChangePassword(u *system.SysUser, newPassword string) (err error) {
  58. var user system.SysUser
  59. err = global.GVA_DB.Select("id, password").Where("id = ?", u.ID).First(&user).Error
  60. if err != nil {
  61. return err
  62. }
  63. if ok := utils.BcryptCheck(u.Password, user.Password); !ok {
  64. return errors.New("原密码错误")
  65. }
  66. pwd := utils.BcryptHash(newPassword)
  67. err = global.GVA_DB.Model(&user).Update("password", pwd).Error
  68. return err
  69. }
  70. //@author: [piexlmax](https://github.com/piexlmax)
  71. //@function: GetUserInfoList
  72. //@description: 分页获取数据
  73. //@param: info request.PageInfo
  74. //@return: err error, list interface{}, total int64
  75. func (userService *UserService) GetUserInfoList(info systemReq.GetUserList) (list interface{}, total int64, err error) {
  76. limit := info.PageSize
  77. offset := info.PageSize * (info.Page - 1)
  78. db := global.GVA_DB.Model(&system.SysUser{})
  79. var userList []system.SysUser
  80. if info.NickName != "" {
  81. db = db.Where("nick_name LIKE ?", "%"+info.NickName+"%")
  82. }
  83. if info.Phone != "" {
  84. db = db.Where("phone LIKE ?", "%"+info.Phone+"%")
  85. }
  86. if info.Username != "" {
  87. db = db.Where("username LIKE ?", "%"+info.Username+"%")
  88. }
  89. if info.Email != "" {
  90. db = db.Where("email LIKE ?", "%"+info.Email+"%")
  91. }
  92. err = db.Count(&total).Error
  93. if err != nil {
  94. return
  95. }
  96. err = db.Limit(limit).Offset(offset).Preload("Authorities").Preload("Authority").Find(&userList).Error
  97. return userList, total, err
  98. }
  99. //@author: [piexlmax](https://github.com/piexlmax)
  100. //@function: SetUserAuthority
  101. //@description: 设置一个用户的权限
  102. //@param: uuid uuid.UUID, authorityId string
  103. //@return: err error
  104. func (userService *UserService) SetUserAuthority(id uint, authorityId uint) (err error) {
  105. assignErr := global.GVA_DB.Where("sys_user_id = ? AND sys_authority_authority_id = ?", id, authorityId).First(&system.SysUserAuthority{}).Error
  106. if errors.Is(assignErr, gorm.ErrRecordNotFound) {
  107. return errors.New("该用户无此角色")
  108. }
  109. var authority system.SysAuthority
  110. err = global.GVA_DB.Where("authority_id = ?", authorityId).First(&authority).Error
  111. if err != nil {
  112. return err
  113. }
  114. var authorityMenu []system.SysAuthorityMenu
  115. var authorityMenuIDs []string
  116. err = global.GVA_DB.Where("sys_authority_authority_id = ?", authorityId).Find(&authorityMenu).Error
  117. if err != nil {
  118. return err
  119. }
  120. for i := range authorityMenu {
  121. authorityMenuIDs = append(authorityMenuIDs, authorityMenu[i].MenuId)
  122. }
  123. var authorityMenus []system.SysBaseMenu
  124. err = global.GVA_DB.Preload("Parameters").Where("id in (?)", authorityMenuIDs).Find(&authorityMenus).Error
  125. if err != nil {
  126. return err
  127. }
  128. hasMenu := false
  129. for i := range authorityMenus {
  130. if authorityMenus[i].Name == authority.DefaultRouter {
  131. hasMenu = true
  132. break
  133. }
  134. }
  135. if !hasMenu {
  136. return errors.New("找不到默认路由,无法切换本角色")
  137. }
  138. err = global.GVA_DB.Model(&system.SysUser{}).Where("id = ?", id).Update("authority_id", authorityId).Error
  139. return err
  140. }
  141. //@author: [piexlmax](https://github.com/piexlmax)
  142. //@function: SetUserAuthorities
  143. //@description: 设置一个用户的权限
  144. //@param: id uint, authorityIds []string
  145. //@return: err error
  146. func (userService *UserService) SetUserAuthorities(adminAuthorityID, id uint, authorityIds []uint) (err error) {
  147. return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  148. var user system.SysUser
  149. TxErr := tx.Where("id = ?", id).First(&user).Error
  150. if TxErr != nil {
  151. global.GVA_LOG.Debug(TxErr.Error())
  152. return errors.New("查询用户数据失败")
  153. }
  154. TxErr = tx.Delete(&[]system.SysUserAuthority{}, "sys_user_id = ?", id).Error
  155. if TxErr != nil {
  156. return TxErr
  157. }
  158. var useAuthority []system.SysUserAuthority
  159. for _, v := range authorityIds {
  160. e := AuthorityServiceApp.CheckAuthorityIDAuth(adminAuthorityID, v)
  161. if e != nil {
  162. return e
  163. }
  164. useAuthority = append(useAuthority, system.SysUserAuthority{
  165. SysUserId: id, SysAuthorityAuthorityId: v,
  166. })
  167. }
  168. TxErr = tx.Create(&useAuthority).Error
  169. if TxErr != nil {
  170. return TxErr
  171. }
  172. TxErr = tx.Model(&user).Update("authority_id", authorityIds[0]).Error
  173. if TxErr != nil {
  174. return TxErr
  175. }
  176. // 返回 nil 提交事务
  177. return nil
  178. })
  179. }
  180. //@author: [piexlmax](https://github.com/piexlmax)
  181. //@function: DeleteUser
  182. //@description: 删除用户
  183. //@param: id float64
  184. //@return: err error
  185. func (userService *UserService) DeleteUser(id int) (err error) {
  186. return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  187. if err := tx.Where("id = ?", id).Delete(&system.SysUser{}).Error; err != nil {
  188. return err
  189. }
  190. if err := tx.Delete(&[]system.SysUserAuthority{}, "sys_user_id = ?", id).Error; err != nil {
  191. return err
  192. }
  193. return nil
  194. })
  195. }
  196. //@author: [piexlmax](https://github.com/piexlmax)
  197. //@function: SetUserInfo
  198. //@description: 设置用户信息
  199. //@param: reqUser model.SysUser
  200. //@return: err error, user model.SysUser
  201. func (userService *UserService) SetUserInfo(req system.SysUser) error {
  202. return global.GVA_DB.Model(&system.SysUser{}).
  203. Select("updated_at", "nick_name", "header_img", "phone", "email", "enable").
  204. Where("id=?", req.ID).
  205. Updates(map[string]interface{}{
  206. "updated_at": time.Now(),
  207. "nick_name": req.NickName,
  208. "header_img": req.HeaderImg,
  209. "phone": req.Phone,
  210. "email": req.Email,
  211. "enable": req.Enable,
  212. }).Error
  213. }
  214. //@author: [piexlmax](https://github.com/piexlmax)
  215. //@function: SetSelfInfo
  216. //@description: 设置用户信息
  217. //@param: reqUser model.SysUser
  218. //@return: err error, user model.SysUser
  219. func (userService *UserService) SetSelfInfo(req system.SysUser) error {
  220. return global.GVA_DB.Model(&system.SysUser{}).
  221. Where("id=?", req.ID).
  222. Updates(req).Error
  223. }
  224. //@author: [piexlmax](https://github.com/piexlmax)
  225. //@function: SetSelfSetting
  226. //@description: 设置用户配置
  227. //@param: req datatypes.JSON, uid uint
  228. //@return: err error
  229. func (userService *UserService) SetSelfSetting(req common.JSONMap, uid uint) error {
  230. return global.GVA_DB.Model(&system.SysUser{}).Where("id = ?", uid).Update("origin_setting", req).Error
  231. }
  232. //@author: [piexlmax](https://github.com/piexlmax)
  233. //@author: [SliverHorn](https://github.com/SliverHorn)
  234. //@function: GetUserInfo
  235. //@description: 获取用户信息
  236. //@param: uuid uuid.UUID
  237. //@return: err error, user system.SysUser
  238. func (userService *UserService) GetUserInfo(uuid uuid.UUID) (user system.SysUser, err error) {
  239. var reqUser system.SysUser
  240. err = global.GVA_DB.Preload("Authorities").Preload("Authority").First(&reqUser, "uuid = ?", uuid).Error
  241. if err != nil {
  242. return reqUser, err
  243. }
  244. MenuServiceApp.UserAuthorityDefaultRouter(&reqUser)
  245. return reqUser, err
  246. }
  247. //@author: [SliverHorn](https://github.com/SliverHorn)
  248. //@function: FindUserById
  249. //@description: 通过id获取用户信息
  250. //@param: id int
  251. //@return: err error, user *model.SysUser
  252. func (userService *UserService) FindUserById(id int) (user *system.SysUser, err error) {
  253. var u system.SysUser
  254. err = global.GVA_DB.Where("id = ?", id).First(&u).Error
  255. return &u, err
  256. }
  257. //@author: [SliverHorn](https://github.com/SliverHorn)
  258. //@function: FindUserByUuid
  259. //@description: 通过uuid获取用户信息
  260. //@param: uuid string
  261. //@return: err error, user *model.SysUser
  262. func (userService *UserService) FindUserByUuid(uuid string) (user *system.SysUser, err error) {
  263. var u system.SysUser
  264. if err = global.GVA_DB.Where("uuid = ?", uuid).First(&u).Error; err != nil {
  265. return &u, errors.New("用户不存在")
  266. }
  267. return &u, nil
  268. }
  269. //@author: [piexlmax](https://github.com/piexlmax)
  270. //@function: ResetPassword
  271. //@description: 修改用户密码
  272. //@param: ID uint
  273. //@return: err error
  274. func (userService *UserService) ResetPassword(ID uint, password string) (err error) {
  275. err = global.GVA_DB.Model(&system.SysUser{}).Where("id = ?", ID).Update("password", utils.BcryptHash(password)).Error
  276. return err
  277. }