sys_user.go 12.7 KB
Newer Older
1
package system
2 3

import (
S
songzhibin97 已提交
4 5
	"strconv"

6 7 8 9 10 11 12
	"github.com/flipped-aurora/gin-vue-admin/server/global"
	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
	systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
	"github.com/flipped-aurora/gin-vue-admin/server/utils"
S
songzhibin97 已提交
13

14
	"github.com/gin-gonic/gin"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
15
	"github.com/go-redis/redis/v8"
16
	"go.uber.org/zap"
17 18
)

Mr.奇淼('s avatar
Mr.奇淼( 已提交
19
// @Tags Base
20 21
// @Summary 用户登录
// @Produce  application/json
22
// @Param data body systemReq.Login true "用户名, 密码, 验证码"
S
songzhibin97 已提交
23
// @Success 200 {object} response.Response{data=systemRes.LoginResponse,msg=string} "返回包括用户信息,token,过期时间"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
24
// @Router /base/login [post]
25 26
func (b *BaseApi) Login(c *gin.Context) {
	var l systemReq.Login
27 28
	_ = c.ShouldBindJSON(&l)
	if err := utils.Verify(l, utils.LoginVerify); err != nil {
29
		response.FailWithMessage(err.Error(), c)
30 31
		return
	}
32
	if store.Verify(l.CaptchaId, l.Captcha, true) {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
33
		u := &system.SysUser{Username: l.Username, Password: l.Password}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
34
		if user, err := userService.Login(u); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
35
			global.GVA_LOG.Error("登陆失败! 用户名不存在或者密码错误!", zap.Error(err))
Mr.奇淼('s avatar
Mr.奇淼( 已提交
36
			response.FailWithMessage("用户名不存在或者密码错误", c)
37
		} else {
K
king 已提交
38 39 40 41 42
			if user.Enable != 1 {
				global.GVA_LOG.Error("登陆失败! 用户被禁止登录!")
				response.FailWithMessage("用户被禁止登录", c)
				return
			}
43
			b.TokenNext(c, *user)
44
		}
45
	} else {
46
		response.FailWithMessage("验证码错误", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
47 48 49
	}
}

50
// 登录以后签发jwt
51
func (b *BaseApi) TokenNext(c *gin.Context, user system.SysUser) {
52
	j := &utils.JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
53
	claims := j.CreateClaims(systemReq.BaseClaims{
Mr.奇淼('s avatar
Mr.奇淼( 已提交
54 55 56
		UUID:        user.UUID,
		ID:          user.ID,
		NickName:    user.NickName,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
57
		Username:    user.Username,
Mr.奇淼('s avatar
Mr.奇淼( 已提交
58
		AuthorityId: user.AuthorityId,
59
	})
60
	token, err := j.CreateToken(claims)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
61
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
62
		global.GVA_LOG.Error("获取token失败!", zap.Error(err))
63
		response.FailWithMessage("获取token失败", c)
64 65 66
		return
	}
	if !global.GVA_CONFIG.System.UseMultipoint {
67
		response.OkWithDetailed(systemRes.LoginResponse{
68 69
			User:      user,
			Token:     token,
70
			ExpiresAt: claims.StandardClaims.ExpiresAt * 1000,
71
		}, "登录成功", c)
72 73
		return
	}
74

Mr.奇淼('s avatar
Mr.奇淼( 已提交
75
	if jwtStr, err := jwtService.GetRedisJWT(user.Username); err == redis.Nil {
76
		if err := jwtService.SetRedisJWT(token, user.Username); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
77
			global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
78 79 80
			response.FailWithMessage("设置登录状态失败", c)
			return
		}
81
		response.OkWithDetailed(systemRes.LoginResponse{
82 83
			User:      user,
			Token:     token,
84
			ExpiresAt: claims.StandardClaims.ExpiresAt * 1000,
85
		}, "登录成功", c)
86
	} else if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
87
		global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
88
		response.FailWithMessage("设置登录状态失败", c)
89
	} else {
Mr.奇淼('s avatar
Mr.奇淼( 已提交
90
		var blackJWT system.JwtBlacklist
91
		blackJWT.Jwt = jwtStr
92
		if err := jwtService.JsonInBlacklist(blackJWT); err != nil {
93 94 95
			response.FailWithMessage("jwt作废失败", c)
			return
		}
96
		if err := jwtService.SetRedisJWT(token, user.Username); err != nil {
97 98
			response.FailWithMessage("设置登录状态失败", c)
			return
99
		}
100
		response.OkWithDetailed(systemRes.LoginResponse{
101 102
			User:      user,
			Token:     token,
103
			ExpiresAt: claims.StandardClaims.ExpiresAt * 1000,
104
		}, "登录成功", c)
105 106 107
	}
}

108 109 110
// @Tags SysUser
// @Summary 用户注册账号
// @Produce  application/json
111
// @Param data body systemReq.Register true "用户名, 昵称, 密码, 角色ID"
S
songzhibin97 已提交
112
// @Success 200 {object} response.Response{data=systemRes.SysUserResponse,msg=string} "用户注册账号,返回包括用户信息"
S
songzhibin97 已提交
113
// @Router /user/admin_register [post]
114 115
func (b *BaseApi) Register(c *gin.Context) {
	var r systemReq.Register
116 117
	_ = c.ShouldBindJSON(&r)
	if err := utils.Verify(r, utils.RegisterVerify); err != nil {
118
		response.FailWithMessage(err.Error(), c)
119 120
		return
	}
121 122 123 124 125 126
	var authorities []system.SysAuthority
	for _, v := range r.AuthorityIds {
		authorities = append(authorities, system.SysAuthority{
			AuthorityId: v,
		})
	}
K
king 已提交
127
	user := &system.SysUser{Username: r.Username, NickName: r.NickName, Password: r.Password, HeaderImg: r.HeaderImg, AuthorityId: r.AuthorityId, Authorities: authorities, Enable: r.Enable}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
128
	userReturn, err := userService.Register(*user)
129
	if err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
130
		global.GVA_LOG.Error("注册失败!", zap.Error(err))
131
		response.FailWithDetailed(systemRes.SysUserResponse{User: userReturn}, "注册失败", c)
132
	} else {
133
		response.OkWithDetailed(systemRes.SysUserResponse{User: userReturn}, "注册成功", c)
134 135 136
	}
}

137
// @Tags SysUser
138
// @Summary 用户修改密码
Mr.奇淼('s avatar
Mr.奇淼( 已提交
139
// @Security ApiKeyAuth
140
// @Produce  application/json
141
// @Param data body systemReq.ChangePasswordStruct true "用户名, 原密码, 新密码"
S
songzhibin97 已提交
142
// @Success 200 {object} response.Response{msg=string} "用户修改密码"
143
// @Router /user/changePassword [post]
144 145
func (b *BaseApi) ChangePassword(c *gin.Context) {
	var user systemReq.ChangePasswordStruct
146 147 148
	_ = c.ShouldBindJSON(&user)
	if err := utils.Verify(user, utils.ChangePasswordVerify); err != nil {
		response.FailWithMessage(err.Error(), c)
149 150
		return
	}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
151
	u := &system.SysUser{Username: user.Username, Password: user.Password}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
152
	if _, err := userService.ChangePassword(u, user.NewPassword); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
153
		global.GVA_LOG.Error("修改失败!", zap.Error(err))
154
		response.FailWithMessage("修改失败,原密码与当前账户不符", c)
155
	} else {
156
		response.OkWithMessage("修改成功", c)
157 158 159
	}
}

160
// @Tags SysUser
Mr.奇淼('s avatar
Mr.奇淼( 已提交
161 162 163 164
// @Summary 分页获取用户列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
165
// @Param data body request.PageInfo true "页码, 每页大小"
S
songzhibin97 已提交
166
// @Success 200 {object} response.Response{data=response.PageResult,msg=string} "分页获取用户列表,返回包括列表,总数,页码,每页数量"
167
// @Router /user/getUserList [post]
168
func (b *BaseApi) GetUserList(c *gin.Context) {
169
	var pageInfo request.PageInfo
170
	_ = c.ShouldBindJSON(&pageInfo)
171 172
	if err := utils.Verify(pageInfo, utils.PageInfoVerify); err != nil {
		response.FailWithMessage(err.Error(), c)
173 174
		return
	}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
175
	if list, total, err := userService.GetUserInfoList(pageInfo); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
176
		global.GVA_LOG.Error("获取失败!", zap.Error(err))
m0_50812349's avatar
m0_50812349 已提交
177
		response.FailWithMessage("获取失败", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
178
	} else {
179
		response.OkWithDetailed(response.PageResult{
Mr.奇淼('s avatar
Mr.奇淼( 已提交
180 181 182 183
			List:     list,
			Total:    total,
			Page:     pageInfo.Page,
			PageSize: pageInfo.PageSize,
m0_50812349's avatar
m0_50812349 已提交
184
		}, "获取成功", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
185 186
	}
}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
187

188
// @Tags SysUser
189
// @Summary 更改用户权限
Mr.奇淼('s avatar
Mr.奇淼( 已提交
190 191 192
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
193
// @Param data body systemReq.SetUserAuth true "用户UUID, 角色ID"
S
songzhibin97 已提交
194
// @Success 200 {object} response.Response{msg=string} "设置用户权限"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
195
// @Router /user/setUserAuthority [post]
196 197
func (b *BaseApi) SetUserAuthority(c *gin.Context) {
	var sua systemReq.SetUserAuth
198
	_ = c.ShouldBindJSON(&sua)
199
	if UserVerifyErr := utils.Verify(sua, utils.SetUserAuthorityVerify); UserVerifyErr != nil {
200 201 202
		response.FailWithMessage(UserVerifyErr.Error(), c)
		return
	}
203 204 205
	userID := utils.GetUserID(c)
	uuid := utils.GetUserUuid(c)
	if err := userService.SetUserAuthority(userID, uuid, sua.AuthorityId); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
206
		global.GVA_LOG.Error("修改失败!", zap.Error(err))
207 208 209
		response.FailWithMessage(err.Error(), c)
	} else {
		claims := utils.GetUserInfo(c)
210
		j := &utils.JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
211 212
		claims.AuthorityId = sua.AuthorityId
		if token, err := j.CreateToken(*claims); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
213
			global.GVA_LOG.Error("修改失败!", zap.Error(err))
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
			response.FailWithMessage(err.Error(), c)
		} else {
			c.Header("new-token", token)
			c.Header("new-expires-at", strconv.FormatInt(claims.ExpiresAt, 10))
			response.OkWithMessage("修改成功", c)
		}

	}
}

// @Tags SysUser
// @Summary 设置用户权限
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body systemReq.SetUserAuthorities true "用户UUID, 角色ID"
S
songzhibin97 已提交
230
// @Success 200 {object} response.Response{msg=string} "设置用户权限"
231 232 233 234 235
// @Router /user/setUserAuthorities [post]
func (b *BaseApi) SetUserAuthorities(c *gin.Context) {
	var sua systemReq.SetUserAuthorities
	_ = c.ShouldBindJSON(&sua)
	if err := userService.SetUserAuthorities(sua.ID, sua.AuthorityIds); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
236
		global.GVA_LOG.Error("修改失败!", zap.Error(err))
237
		response.FailWithMessage("修改失败", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
238
	} else {
239
		response.OkWithMessage("修改成功", c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
240 241
	}
}
242 243 244 245 246 247

// @Tags SysUser
// @Summary 删除用户
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
248
// @Param data body request.GetById true "用户ID"
S
songzhibin97 已提交
249
// @Success 200 {object} response.Response{msg=string} "删除用户"
250
// @Router /user/deleteUser [delete]
251
func (b *BaseApi) DeleteUser(c *gin.Context) {
252 253
	var reqId request.GetById
	_ = c.ShouldBindJSON(&reqId)
254 255
	if err := utils.Verify(reqId, utils.IdVerify); err != nil {
		response.FailWithMessage(err.Error(), c)
256 257
		return
	}
258
	jwtId := utils.GetUserID(c)
259
	if jwtId == uint(reqId.ID) {
m0_50812349's avatar
m0_50812349 已提交
260 261 262
		response.FailWithMessage("删除失败, 自杀失败", c)
		return
	}
263
	if err := userService.DeleteUser(reqId.ID); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
264
		global.GVA_LOG.Error("删除失败!", zap.Error(err))
265
		response.FailWithMessage("删除失败", c)
266 267 268 269
	} else {
		response.OkWithMessage("删除成功", c)
	}
}
270 271

// @Tags SysUser
272
// @Summary 设置用户信息
273 274 275
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
Mr.奇淼('s avatar
Mr.奇淼( 已提交
276
// @Param data body system.SysUser true "ID, 用户名, 昵称, 头像链接"
S
songzhibin97 已提交
277
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "设置用户信息"
278
// @Router /user/setUserInfo [put]
279
func (b *BaseApi) SetUserInfo(c *gin.Context) {
S
songzhibin97 已提交
280
	var user systemReq.ChangeUserInfo
281
	_ = c.ShouldBindJSON(&user)
282
	if err := utils.Verify(user, utils.IdVerify); err != nil {
283
		response.FailWithMessage(err.Error(), c)
284 285
		return
	}
S
songzhibin97 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302

	if len(user.AuthorityIds) != 0 {
		err := userService.SetUserAuthorities(user.ID, user.AuthorityIds)
		if err != nil {
			global.GVA_LOG.Error("设置失败!", zap.Error(err))
			response.FailWithMessage("设置失败", c)
		}
	}

	if err := userService.SetUserInfo(system.SysUser{
		GVA_MODEL: global.GVA_MODEL{
			ID: user.ID,
		},
		NickName:  user.NickName,
		HeaderImg: user.HeaderImg,
		Phone:     user.Phone,
		Email:     user.Email,
303
		SideMode:  user.SideMode,
K
king 已提交
304
		Enable:    user.Enable,
S
songzhibin97 已提交
305
	}); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
306
		global.GVA_LOG.Error("设置失败!", zap.Error(err))
307
		response.FailWithMessage("设置失败", c)
308
	} else {
S
songzhibin97 已提交
309
		response.OkWithMessage("设置成功", c)
310 311
	}
}
312

313 314 315 316 317 318
// @Tags SysUser
// @Summary 设置用户信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body system.SysUser true "ID, 用户名, 昵称, 头像链接"
S
songzhibin97 已提交
319
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "设置用户信息"
320 321
// @Router /user/SetSelfInfo [put]
func (b *BaseApi) SetSelfInfo(c *gin.Context) {
S
songzhibin97 已提交
322
	var user systemReq.ChangeUserInfo
323 324
	_ = c.ShouldBindJSON(&user)
	user.ID = utils.GetUserID(c)
S
songzhibin97 已提交
325 326 327 328 329 330 331 332
	if err := userService.SetUserInfo(system.SysUser{
		GVA_MODEL: global.GVA_MODEL{
			ID: user.ID,
		},
		NickName:  user.NickName,
		HeaderImg: user.HeaderImg,
		Phone:     user.Phone,
		Email:     user.Email,
333
		SideMode:  user.SideMode,
K
king 已提交
334
		Enable:    user.Enable,
S
songzhibin97 已提交
335
	}); err != nil {
336 337 338
		global.GVA_LOG.Error("设置失败!", zap.Error(err))
		response.FailWithMessage("设置失败", c)
	} else {
S
songzhibin97 已提交
339
		response.OkWithMessage("设置成功", c)
340 341 342
	}
}

343 344 345 346 347
// @Tags SysUser
// @Summary 获取用户信息
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
S
songzhibin97 已提交
348
// @Success 200 {object} response.Response{data=map[string]interface{},msg=string} "获取用户信息"
349 350 351
// @Router /user/getUserInfo [get]
func (b *BaseApi) GetUserInfo(c *gin.Context) {
	uuid := utils.GetUserUuid(c)
Mr.奇淼('s avatar
Mr.奇淼( 已提交
352
	if ReqUser, err := userService.GetUserInfo(uuid); err != nil {
Sliver_Horn's avatar
Sliver_Horn 已提交
353
		global.GVA_LOG.Error("获取失败!", zap.Error(err))
354 355 356 357 358
		response.FailWithMessage("获取失败", c)
	} else {
		response.OkWithDetailed(gin.H{"userInfo": ReqUser}, "获取成功", c)
	}
}
Mr.奇淼('s avatar
Mr.奇淼( 已提交
359 360

// @Tags SysUser
361
// @Summary 重置用户密码
Mr.奇淼('s avatar
Mr.奇淼( 已提交
362 363 364
// @Security ApiKeyAuth
// @Produce  application/json
// @Param data body system.SysUser true "ID"
365
// @Success 200 {object} response.Response{msg=string} "重置用户密码"
Mr.奇淼('s avatar
Mr.奇淼( 已提交
366 367 368 369 370 371 372 373 374 375 376
// @Router /user/resetPassword [post]
func (b *BaseApi) ResetPassword(c *gin.Context) {
	var user system.SysUser
	_ = c.ShouldBindJSON(&user)
	if err := userService.ResetPassword(user.ID); err != nil {
		global.GVA_LOG.Error("重置失败!", zap.Error(err))
		response.FailWithMessage("重置失败"+err.Error(), c)
	} else {
		response.OkWithMessage("重置成功", c)
	}
}