kra/internal/server/handler/system/sys_user.go

516 lines
14 KiB
Go

package system
import (
"encoding/json"
"strconv"
"time"
"kra/internal/biz/system"
"kra/pkg/response"
"kra/pkg/utils"
"github.com/gin-gonic/gin"
)
type UserApi struct{}
// RegisterRequest 注册请求
type RegisterRequest struct {
Username string `json:"userName" binding:"required"`
Password string `json:"password" binding:"required"`
NickName string `json:"nickName"`
HeaderImg string `json:"headerImg"`
AuthorityId uint `json:"authorityId" binding:"required"`
AuthorityIds []uint `json:"authorityIds"`
Phone string `json:"phone"`
Email string `json:"email"`
Enable int `json:"enable"`
}
// ChangePasswordRequest 修改密码请求
type ChangePasswordRequest struct {
Password string `json:"password" binding:"required"`
NewPassword string `json:"newPassword" binding:"required"`
}
// ResetPasswordRequest 重置密码请求
type ResetPasswordRequest struct {
ID uint `json:"ID" binding:"required"`
Password string `json:"password"`
}
// GetUserListRequest 获取用户列表请求
type GetUserListRequest struct {
Page int `json:"page"`
PageSize int `json:"pageSize"`
Username string `json:"username"`
NickName string `json:"nickName"`
Phone string `json:"phone"`
Email string `json:"email"`
}
// SetUserInfoRequest 设置用户信息请求
type SetUserInfoRequest struct {
ID uint `json:"ID" binding:"required"`
NickName string `json:"nickName"`
HeaderImg string `json:"headerImg"`
Phone string `json:"phone"`
Email string `json:"email"`
Enable int `json:"enable"`
AuthorityIds []uint `json:"authorityIds"`
}
// SetSelfInfoRequest 设置自己信息请求
type SetSelfInfoRequest struct {
NickName string `json:"nickName"`
HeaderImg string `json:"headerImg"`
Phone string `json:"phone"`
Email string `json:"email"`
}
// SetUserAuthorityRequest 设置用户角色请求
type SetUserAuthorityRequest struct {
AuthorityId uint `json:"authorityId" binding:"required"`
}
// SetUserAuthoritiesRequest 设置用户多角色请求
type SetUserAuthoritiesRequest struct {
ID uint `json:"ID" binding:"required"`
AuthorityIds []uint `json:"authorityIds" binding:"required"`
}
// DeleteUserRequest 删除用户请求
type DeleteUserRequest struct {
ID uint `json:"ID" binding:"required"`
}
// Register
// @Tags SysUser
// @Summary 用户注册账号
// @Produce application/json
// @Param data body RegisterRequest true "用户名, 昵称, 密码, 角色ID"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "用户注册账号,返回包括用户信息"
// @Router /user/admin_register [post]
func (u *UserApi) Register(c *gin.Context) {
var req RegisterRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
user := &system.User{
Username: req.Username,
Password: req.Password,
NickName: req.NickName,
HeaderImg: req.HeaderImg,
AuthorityId: req.AuthorityId,
Phone: req.Phone,
Email: req.Email,
Enable: req.Enable,
}
created, err := userUsecase.Register(c, user)
if err != nil {
response.FailWithDetailed(gin.H{"user": created}, "注册失败", c)
return
}
response.OkWithDetailed(gin.H{"user": toUserResponse(created)}, "注册成功", c)
}
// ChangePassword
// @Tags SysUser
// @Summary 用户修改密码
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body ChangePasswordRequest true "用户名, 原密码, 新密码"
// @Success 200 {object} response.Response{msg=string} "用户修改密码"
// @Router /user/changePassword [post]
func (u *UserApi) ChangePassword(c *gin.Context) {
var req ChangePasswordRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
userID := utils.GetUserID(c)
if userID == 0 {
response.FailWithMessage("请先登录", c)
return
}
if err := userUsecase.ChangePassword(c, userID, req.Password, req.NewPassword); err != nil {
response.FailWithMessage("修改失败,原密码与当前账户不符", c)
return
}
response.OkWithMessage("修改成功", c)
}
// ResetPassword
// @Tags SysUser
// @Summary 重置用户密码
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body ResetPasswordRequest true "ID"
// @Success 200 {object} response.Response{msg=string} "重置用户密码"
// @Router /user/resetPassword [post]
func (u *UserApi) ResetPassword(c *gin.Context) {
var req ResetPasswordRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
if err := userUsecase.ResetPassword(c, req.ID, req.Password); err != nil {
response.FailWithMessage("重置失败"+err.Error(), c)
return
}
response.OkWithMessage("重置成功", c)
}
// GetUserInfo
// @Tags SysUser
// @Summary 获取用户信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取用户信息"
// @Router /user/getUserInfo [get]
func (u *UserApi) GetUserInfo(c *gin.Context) {
uuid := utils.GetUserUuid(c)
user, err := userUsecase.GetUserInfo(c, uuid.String())
if err != nil {
response.FailWithMessage("获取失败", c)
return
}
// 检查用户角色默认路由
if user.Authority != nil {
defaultRouter := menuUsecase.UserAuthorityDefaultRouter(c, user.AuthorityId, user.Authority.DefaultRouter)
user.Authority.DefaultRouter = defaultRouter
}
response.OkWithDetailed(gin.H{"userInfo": toUserResponse(user)}, "获取成功", c)
}
// GetUserList
// @Tags SysUser
// @Summary 分页获取用户列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body GetUserListRequest true "页码, 每页大小"
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页获取用户列表,返回包括列表,总数,页码,每页数量"
// @Router /user/getUserList [post]
func (u *UserApi) GetUserList(c *gin.Context) {
var req GetUserListRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
if req.Page == 0 {
req.Page = 1
}
if req.PageSize == 0 {
req.PageSize = 10
}
filters := make(map[string]string)
if req.Username != "" {
filters["username"] = req.Username
}
if req.NickName != "" {
filters["nick_name"] = req.NickName
}
if req.Phone != "" {
filters["phone"] = req.Phone
}
if req.Email != "" {
filters["email"] = req.Email
}
users, total, err := userUsecase.GetUserList(c, req.Page, req.PageSize, filters)
if err != nil {
response.FailWithMessage("获取失败", c)
return
}
list := make([]interface{}, len(users))
for i, u := range users {
list[i] = toUserResponse(u)
}
response.OkWithDetailed(response.PageResult{
List: list,
Total: total,
Page: req.Page,
PageSize: req.PageSize,
}, "获取成功", c)
}
// SetUserInfo
// @Tags SysUser
// @Summary 设置用户信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body SetUserInfoRequest true "ID, 用户名, 昵称, 头像链接"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "设置用户信息"
// @Router /user/setUserInfo [put]
func (u *UserApi) SetUserInfo(c *gin.Context) {
var req SetUserInfoRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
// 设置用户角色
if len(req.AuthorityIds) > 0 {
authorityID := utils.GetUserAuthorityId(c)
if err := userUsecase.SetUserAuthorities(c, authorityID, req.ID, req.AuthorityIds); err != nil {
response.FailWithMessage("设置失败", c)
return
}
}
user := &system.User{
ID: req.ID,
NickName: req.NickName,
HeaderImg: req.HeaderImg,
Phone: req.Phone,
Email: req.Email,
Enable: req.Enable,
}
if err := userUsecase.SetUserInfo(c, user); err != nil {
response.FailWithMessage("设置失败", c)
return
}
response.OkWithMessage("设置成功", c)
}
// SetSelfInfo
// @Tags SysUser
// @Summary 设置用户信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body SetSelfInfoRequest true "ID, 用户名, 昵称, 头像链接"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "设置用户信息"
// @Router /user/SetSelfInfo [put]
func (u *UserApi) SetSelfInfo(c *gin.Context) {
var req SetSelfInfoRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
userID := utils.GetUserID(c)
if userID == 0 {
response.FailWithMessage("请先登录", c)
return
}
user := &system.User{
ID: userID,
NickName: req.NickName,
HeaderImg: req.HeaderImg,
Phone: req.Phone,
Email: req.Email,
}
if err := userUsecase.SetSelfInfo(c, user); err != nil {
response.FailWithMessage("设置失败", c)
return
}
response.OkWithMessage("设置成功", c)
}
// SetSelfSetting
// @Tags SysUser
// @Summary 设置用户配置
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body map[string]interface{} true "用户配置数据"
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "设置用户配置"
// @Router /user/SetSelfSetting [put]
func (u *UserApi) SetSelfSetting(c *gin.Context) {
var req map[string]interface{}
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
userID := utils.GetUserID(c)
if userID == 0 {
response.FailWithMessage("请先登录", c)
return
}
setting, _ := json.Marshal(req)
if err := userUsecase.SetSelfSetting(c, userID, setting); err != nil {
response.FailWithMessage("设置失败", c)
return
}
response.OkWithMessage("设置成功", c)
}
// DeleteUser
// @Tags SysUser
// @Summary 删除用户
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body DeleteUserRequest true "用户ID"
// @Success 200 {object} response.Response{msg=string} "删除用户"
// @Router /user/deleteUser [delete]
func (u *UserApi) DeleteUser(c *gin.Context) {
var req DeleteUserRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
currentUserID := utils.GetUserID(c)
if currentUserID == req.ID {
response.FailWithMessage("删除失败, 无法删除自己。", c)
return
}
if err := userUsecase.DeleteUser(c, req.ID); err != nil {
response.FailWithMessage("删除失败", c)
return
}
response.OkWithMessage("删除成功", c)
}
// SetUserAuthority
// @Tags SysUser
// @Summary 更改用户权限
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body SetUserAuthorityRequest true "用户UUID, 角色ID"
// @Success 200 {object} response.Response{msg=string} "设置用户权限"
// @Router /user/setUserAuthority [post]
func (u *UserApi) SetUserAuthority(c *gin.Context) {
var req SetUserAuthorityRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
userID := utils.GetUserID(c)
if userID == 0 {
response.FailWithMessage("请先登录", c)
return
}
if err := userUsecase.SetUserAuthority(c, userID, req.AuthorityId); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
// 重新生成token
claims := utils.GetUserInfo(c)
if claims == nil {
response.FailWithMessage("请先登录", c)
return
}
claims.AuthorityID = req.AuthorityId
token, err := jwtInstance.CreateToken(claims.BaseClaims)
if err != nil {
response.FailWithMessage(err.Error(), c)
return
}
c.Header("new-token", token)
c.Header("new-expires-at", strconv.FormatInt(claims.ExpiresAt.Unix(), 10))
utils.SetToken(c, token, int(claims.ExpiresAt.Unix()-time.Now().Unix()))
response.OkWithMessage("修改成功", c)
}
// SetUserAuthorities
// @Tags SysUser
// @Summary 设置用户权限
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body SetUserAuthoritiesRequest true "用户UUID, 角色ID"
// @Success 200 {object} response.Response{msg=string} "设置用户权限"
// @Router /user/setUserAuthorities [post]
func (u *UserApi) SetUserAuthorities(c *gin.Context) {
var req SetUserAuthoritiesRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.FailWithMessage(err.Error(), c)
return
}
authorityID := utils.GetUserAuthorityId(c)
if err := userUsecase.SetUserAuthorities(c, authorityID, req.ID, req.AuthorityIds); err != nil {
response.FailWithMessage("修改失败", c)
return
}
response.OkWithMessage("修改成功", c)
}
// toUserResponse 转换用户响应
func toUserResponse(user *system.User) map[string]interface{} {
if user == nil {
return nil
}
result := map[string]interface{}{
"ID": user.ID,
"uuid": user.UUID.String(),
"userName": user.Username,
"nickName": user.NickName,
"sideMode": user.SideMode,
"headerImg": user.HeaderImg,
"baseColor": user.BaseColor,
"authorityId": user.AuthorityId,
"phone": user.Phone,
"email": user.Email,
"enable": user.Enable,
}
if user.OriginSetting != nil {
result["originSetting"] = string(user.OriginSetting)
}
if user.Authority != nil {
result["authority"] = map[string]interface{}{
"authorityId": user.Authority.AuthorityId,
"authorityName": user.Authority.AuthorityName,
"parentId": user.Authority.ParentId,
"defaultRouter": user.Authority.DefaultRouter,
}
}
if len(user.Authorities) > 0 {
authorities := make([]map[string]interface{}, len(user.Authorities))
for i, a := range user.Authorities {
authorities[i] = map[string]interface{}{
"authorityId": a.AuthorityId,
"authorityName": a.AuthorityName,
"parentId": a.ParentId,
"defaultRouter": a.DefaultRouter,
}
}
result["authorities"] = authorities
}
return result
}