后台-用户模块功能
一、路由处理
user := auth.Group("/user")
{
user.GET("/list", userAPI.GetList)
user.PUT("", userAPI.Update)
user.PUT("/disable", userAPI.UpdateDisable)
user.PUT("/current/password", userAPI.UpdateCurrentPassword)
user.GET("/info", userAPI.GetInfo)
user.PUT("/current", userAPI.UpdateCurrent)
user.GET("/online", userAPI.GetOnlineList)
user.POST("/offline/:id", userAPI.ForceOffline)
}
二、功能实现
1、user.GET(“/list”, userAPI.GetList) // 用户列表
func (*User) GetList(c *gin.Context) {
var query UserQuery
if err := c.ShouldBindQuery(&query); err != nil {
ReturnError(c, g2.ErrRequest, err)
return
}
list, count, err := model.GetUserList(GetDB(c), query.Page, query.Size, query.LoginType, query.Nickname, query.Username)
if err != nil {
ReturnError(c, g2.ErrDbOp, err)
return
}
ReturnSuccess(c, PageResult[model.UserAuth]{
Size: query.Size,
Page: query.Page,
Total: count,
List: list,
})
}
func GetUserList(db *gorm.DB, page, size int, loginType int8, nickname, username string) (list []UserAuth, total int64, err error) {
if loginType != 0 {
db = db.Where("login_type = ?", loginType)
}
if username != "" {
db = db.Where("username LIKE ?", "%"+username+"%")
}
result := db.Model(&UserAuth{}).
Joins("LEFT JOIN user_info ON user_info.id = user_auth.user_info_id").
Where("user_info.nickname LIKE ?", "%"+nickname+"%").
Preload("UserInfo").
Preload("Roles").
Count(&total).
Scopes(Paginate(page, size)).
Find(&list)
return list, total, result.Error
}
2、user.PUT(“”, userAPI.Update) // 修改用户信息
func (*User) Update(c *gin.Context) {
var req UpdateUserReq
if err := c.ShouldBindJSON(&req); err != nil {
ReturnError(c, g2.ErrRequest, err)
return
}
if err := model.UpdateUserNicknameAndRole(GetDB(c), req.UserAuthId, req.Nickname, req.RoleIds); err != nil {
ReturnError(c, g2.ErrDbOp, err)
return
}
ReturnSuccess(c, nil)
}
func UpdateUserNicknameAndRole(db *gorm.DB, authId int, nickname string, roleIds []int) error {
userAuth, err := GetUserAuthInfoById(db, authId)
if err != nil {
return err
}
userInfo := UserInfo{
Model: Model{ID: userAuth.UserInfoId},
Nickname: nickname,
}
result := db.Model(&userInfo).Updates(userInfo)
if result.Error != nil {
return result.Error
}
if len(roleIds) == 0 {
return nil
}
result = db.Where(UserAuthRole{UserAuthId: userAuth.UserInfoId}).Delete(UserAuthRole{})
if result.Error != nil {
return result.Error
}
var userRoles []UserAuthRole
for _, id := range roleIds {
userRoles = append(userRoles, UserAuthRole{
RoleId: id,
UserAuthId: userAuth.ID,
})
}
result = db.Create(&userRoles)
return result.Error
}
3、user.PUT(“/disable”, userAPI.UpdateDisable) // 修改用户禁用状态
func (*User) UpdateDisable(c *gin.Context) {
var req UpdateUserDisableReq
if err := c.ShouldBindJSON(&req); err != nil {
ReturnError(c, g2.ErrRequest, err)
return
}
err := model.UpdateUserDisable(GetDB(c), req.UserAuthId, req.IsDisable)
if err != nil {
ReturnError(c, g2.ErrDbOp, err)
return
}
ReturnSuccess(c, nil)
}
func UpdateUserDisable(db *gorm.DB, id int, isDisable bool) error {
userAuth := UserAuth{
Model: Model{ID: id},
IsDisable: isDisable,
}
result := db.Model(&userAuth).Select("is_disable").Updates(&userAuth)
return result.Error
}
4、user.PUT(“/current/password”, userAPI.UpdateCurrentPassword) // 修改管理员密码
func (*User) UpdateCurrentPassword(c *gin.Context) {
var req UpdateCurrentPasswordReq
if err := c.ShouldBindJSON(&req); err != nil {
ReturnError(c, g2.ErrRequest, err)
return
}
auth, _ := CurrentUserAuth(c)
if !utils.BcryptCheck(req.OldPassword, auth.Password) {
ReturnError(c, g2.ErrOldPassword, nil)
return
}
hashPassword, _ := utils.BcryptHash(req.NewPassword)
err := model.UpdateUserPassword(GetDB(c), auth.ID, hashPassword)
if err != nil {
ReturnError(c, g2.ErrDbOp, err)
return
}
ReturnSuccess(c, nil)
}
func UpdateUserPassword(db *gorm.DB, id int, password string) error {
userAuth := UserAuth{
Model: Model{ID: id},
Password: password,
}
result := db.Model(&userAuth).Updates(userAuth)
return result.Error
}
5、user.GET(“/info”, userAPI.GetInfo)// 获取当前用户信息
func (*User) GetInfo(c *gin.Context) {
rdb := GetRDB(c)
user, err := CurrentUserAuth(c)
if err != nil {
ReturnError(c, g2.ErrTokenRuntime, err)
return
}
userInfoVO := model.UserInfoVO{UserInfo: *user.UserInfo}
userInfoVO.ArticleLikeSet, err = rdb.SMembers(rctx, g2.ARTICLE_USER_LIKE_SET+strconv.Itoa(user.UserInfoId)).Result()
if err != nil {
ReturnError(c, g2.ErrDbOp, err)
return
}
userInfoVO.CommentLikeSet, err = rdb.SMembers(rctx, g2.COMMENT_USER_LIKE_SET+strconv.Itoa(user.UserInfoId)).Result()
if err != nil {
ReturnError(c, g2.ErrDbOp, err)
return
}
ReturnSuccess(c, userInfoVO)
}
6、user.PUT(“/current”, userAPI.UpdateCurrent) // 修改当前用户信息
func (*User) UpdateCurrent(c *gin.Context) {
var req UpdateCurrentUserReq
if err := c.ShouldBindJSON(&req); err != nil {
ReturnError(c, g2.ErrRequest, err)
return
}
auth, _ := CurrentUserAuth(c)
err := model.UpdateUserInfo(GetDB(c), auth.UserInfoId, req.Nickname, req.Avatar, req.Intro, req.Website)
if err != nil {
ReturnError(c, g2.ErrDbOp, err)
return
}
ReturnSuccess(c, nil)
}
func UpdateUserInfo(db *gorm.DB, id int, nickname, avatar, intro, website string) error {
userInfo := UserInfo{
Model: Model{ID: id},
Nickname: nickname,
Avatar: avatar,
Intro: intro,
Website: website,
}
result := db.
Select("nickname", "avatar", "intro", "website").
Updates(userInfo)
return result.Error
}
7、user.GET(“/online”, userAPI.GetOnlineList) // 获取在线用户
func (*User) GetOnlineList(c *gin.Context) {
keyword := c.Query("keyword")
rdb := GetRDB(c)
onlineList := make([]model.UserAuth, 0)
keys := rdb.Keys(rctx, g2.ONLINE_USER+"*").Val()
for _, key := range keys {
var auth model.UserAuth
val := rdb.Get(rctx, key).Val()
json.Unmarshal([]byte(val), &auth)
if keyword != "" &&
!strings.Contains(auth.Username, keyword) &&
!strings.Contains(auth.UserInfo.Nickname, keyword) {
continue
}
onlineList = append(onlineList, auth)
}
sort.Slice(onlineList, func(i, j int) bool {
return onlineList[i].LastLoginTime.Unix() > onlineList[j].LastLoginTime.Unix()
})
ReturnSuccess(c, onlineList)
}
8、user.POST(“/offline/:id”, userAPI.ForceOffline) // 强制用户下线
func (*User) ForceOffline(c *gin.Context) {
id := c.Param("id")
uid, err := strconv.Atoi(id)
if err != nil {
ReturnError(c, g2.ErrRequest, err)
return
}
auth, err := CurrentUserAuth(c)
if err != nil {
ReturnError(c, g2.ErrUserAuth, err)
return
}
if auth.ID == uid {
ReturnError(c, g2.ErrForceOfflineSelf, nil)
return
}
rdb := GetRDB(c)
onlineKey := g2.ONLINE_USER + strconv.Itoa(uid)
offlineKey := g2.OFFLINE_USER + strconv.Itoa(uid)
rdb.Del(rctx, onlineKey)
rdb.Set(rctx, offlineKey, auth, time.Hour)
ReturnSuccess(c, "强制离线成功")
}