516 lines
14 KiB
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
|
|
}
|