sys_user.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package v1
  2. import (
  3. "errors"
  4. "fmt"
  5. "gin-vue-admin/global"
  6. "gin-vue-admin/global/response"
  7. "gin-vue-admin/middleware"
  8. "gin-vue-admin/model"
  9. "gin-vue-admin/model/request"
  10. resp "gin-vue-admin/model/response"
  11. "gin-vue-admin/service"
  12. "gin-vue-admin/utils"
  13. "github.com/dgrijalva/jwt-go"
  14. "github.com/gin-gonic/gin"
  15. "github.com/go-redis/redis"
  16. "time"
  17. )
  18. // @Tags Base
  19. // @Summary 用户登录
  20. // @Produce application/json
  21. // @Param data body request.RegisterAndLoginStruct true "用户名, 密码, 验证码"
  22. // @Success 200 {string} string "{"success":true,"data":{},"msg":"登陆成功"}"
  23. // @Router /base/login [post]
  24. func Login(c *gin.Context) {
  25. var L request.RegisterAndLoginStruct
  26. _ = c.ShouldBindJSON(&L)
  27. UserVerify := utils.Rules{
  28. "CaptchaId": {utils.NotEmpty()},
  29. "Captcha": {utils.NotEmpty()},
  30. "Username": {utils.NotEmpty()},
  31. "Password": {utils.NotEmpty()},
  32. }
  33. if UserVerifyErr := utils.Verify(L, UserVerify); UserVerifyErr != nil {
  34. response.FailWithMessage(UserVerifyErr.Error(), c)
  35. return
  36. }
  37. if store.Verify(L.CaptchaId, L.Captcha, true) {
  38. U := &model.SysUser{Username: L.Username, Password: L.Password}
  39. if err, user := service.Login(U); err != nil {
  40. response.FailWithMessage(fmt.Sprintf("用户名密码错误或%v", err), c)
  41. } else {
  42. tokenNext(c, *user)
  43. }
  44. } else {
  45. response.FailWithMessage("验证码错误", c)
  46. }
  47. }
  48. // 登录以后签发jwt
  49. func tokenNext(c *gin.Context, user model.SysUser) {
  50. j := &middleware.JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
  51. claims := request.CustomClaims{
  52. UUID: user.UUID,
  53. ID: user.ID,
  54. NickName: user.NickName,
  55. Username: user.Username,
  56. AuthorityId: user.AuthorityId,
  57. BufferTime: 60 * 60 * 24, // 缓冲时间1天 缓冲时间内会获得新的token刷新令牌 此时一个用户会存在两个有效令牌 但是前端只留一个 另一个会丢失
  58. StandardClaims: jwt.StandardClaims{
  59. NotBefore: time.Now().Unix() - 1000, // 签名生效时间
  60. ExpiresAt: time.Now().Unix() + 60*60*24*7, // 过期时间 7天
  61. Issuer: "qmPlus", // 签名的发行者
  62. },
  63. }
  64. token, err := j.CreateToken(claims)
  65. if err != nil {
  66. response.FailWithMessage("获取token失败", c)
  67. return
  68. }
  69. if !global.GVA_CONFIG.System.UseMultipoint {
  70. response.OkWithData(resp.LoginResponse{
  71. User: user,
  72. Token: token,
  73. ExpiresAt: claims.StandardClaims.ExpiresAt * 1000,
  74. }, c)
  75. return
  76. }
  77. err, jwtStr := service.GetRedisJWT(user.Username)
  78. if err == redis.Nil {
  79. if err := service.SetRedisJWT(token, user.Username); err != nil {
  80. response.FailWithMessage("设置登录状态失败", c)
  81. return
  82. }
  83. response.OkWithData(resp.LoginResponse{
  84. User: user,
  85. Token: token,
  86. ExpiresAt: claims.StandardClaims.ExpiresAt * 1000,
  87. }, c)
  88. } else if err != nil {
  89. response.FailWithMessage(fmt.Sprintf("%v", err), c)
  90. } else {
  91. var blackJWT model.JwtBlacklist
  92. blackJWT.Jwt = jwtStr
  93. if err := service.JsonInBlacklist(blackJWT); err != nil {
  94. response.FailWithMessage("jwt作废失败", c)
  95. return
  96. }
  97. if err := service.SetRedisJWT(token, user.Username); err != nil {
  98. response.FailWithMessage("设置登录状态失败", c)
  99. return
  100. }
  101. response.OkWithData(resp.LoginResponse{
  102. User: user,
  103. Token: token,
  104. ExpiresAt: claims.StandardClaims.ExpiresAt * 1000,
  105. }, c)
  106. }
  107. }
  108. // @Tags SysUser
  109. // @Summary 用户注册账号
  110. // @Produce application/json
  111. // @Param data body model.SysUser true "用户名, 昵称, 密码, 角色ID"
  112. // @Success 200 {string} string "{"success":true,"data":{},"msg":"注册成功"}"
  113. // @Router /user/register [post]
  114. func Register(c *gin.Context) {
  115. var R request.RegisterStruct
  116. _ = c.ShouldBindJSON(&R)
  117. UserVerify := utils.Rules{
  118. "Username": {utils.NotEmpty()},
  119. "NickName": {utils.NotEmpty()},
  120. "Password": {utils.NotEmpty()},
  121. "AuthorityId": {utils.NotEmpty()},
  122. }
  123. if UserVerifyErr := utils.Verify(R, UserVerify); UserVerifyErr != nil {
  124. response.FailWithMessage(UserVerifyErr.Error(), c)
  125. return
  126. }
  127. user := &model.SysUser{Username: R.Username, NickName: R.NickName, Password: R.Password, HeaderImg: R.HeaderImg, AuthorityId: R.AuthorityId}
  128. err, userReturn := service.Register(*user)
  129. if err != nil {
  130. response.FailWithDetailed(response.ERROR, resp.SysUserResponse{User: userReturn}, fmt.Sprintf("%v", err), c)
  131. } else {
  132. response.OkDetailed(resp.SysUserResponse{User: userReturn}, "注册成功", c)
  133. }
  134. }
  135. // @Tags SysUser
  136. // @Summary 用户修改密码
  137. // @Security ApiKeyAuth
  138. // @Produce application/json
  139. // @Param data body request.ChangePasswordStruct true "用户名, 原密码, 新密码"
  140. // @Success 200 {string} string "{"success":true,"data":{},"msg":"修改成功"}"
  141. // @Router /user/changePassword [put]
  142. func ChangePassword(c *gin.Context) {
  143. var params request.ChangePasswordStruct
  144. _ = c.ShouldBindJSON(&params)
  145. UserVerify := utils.Rules{
  146. "Username": {utils.NotEmpty()},
  147. "Password": {utils.NotEmpty()},
  148. "NewPassword": {utils.NotEmpty()},
  149. }
  150. if UserVerifyErr := utils.Verify(params, UserVerify); UserVerifyErr != nil {
  151. response.FailWithMessage(UserVerifyErr.Error(), c)
  152. return
  153. }
  154. U := &model.SysUser{Username: params.Username, Password: params.Password}
  155. if err, _ := service.ChangePassword(U, params.NewPassword); err != nil {
  156. response.FailWithMessage("修改失败,请检查用户名密码", c)
  157. } else {
  158. response.OkWithMessage("修改成功", c)
  159. }
  160. }
  161. // @Tags SysUser
  162. // @Summary 分页获取用户列表
  163. // @Security ApiKeyAuth
  164. // @accept application/json
  165. // @Produce application/json
  166. // @Param data body request.PageInfo true "页码, 页大小"
  167. // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
  168. // @Router /user/getUserList [post]
  169. func GetUserList(c *gin.Context) {
  170. var pageInfo request.PageInfo
  171. _ = c.ShouldBindJSON(&pageInfo)
  172. if PageVerifyErr := utils.Verify(pageInfo, utils.CustomizeMap["PageVerify"]); PageVerifyErr != nil {
  173. response.FailWithMessage(PageVerifyErr.Error(), c)
  174. return
  175. }
  176. err, list, total := service.GetUserInfoList(pageInfo)
  177. if err != nil {
  178. response.FailWithMessage(fmt.Sprintf("获取数据失败,%v", err), c)
  179. } else {
  180. response.OkWithData(resp.PageResult{
  181. List: list,
  182. Total: total,
  183. Page: pageInfo.Page,
  184. PageSize: pageInfo.PageSize,
  185. }, c)
  186. }
  187. }
  188. // @Tags SysUser
  189. // @Summary 设置用户权限
  190. // @Security ApiKeyAuth
  191. // @accept application/json
  192. // @Produce application/json
  193. // @Param data body request.SetUserAuth true "用户UUID, 角色ID"
  194. // @Success 200 {string} string "{"success":true,"data":{},"msg":"修改成功"}"
  195. // @Router /user/setUserAuthority [post]
  196. func SetUserAuthority(c *gin.Context) {
  197. var sua request.SetUserAuth
  198. _ = c.ShouldBindJSON(&sua)
  199. UserVerify := utils.Rules{
  200. "UUID": {utils.NotEmpty()},
  201. "AuthorityId": {utils.NotEmpty()},
  202. }
  203. if UserVerifyErr := utils.Verify(sua, UserVerify); UserVerifyErr != nil {
  204. response.FailWithMessage(UserVerifyErr.Error(), c)
  205. return
  206. }
  207. err := service.SetUserAuthority(sua.UUID, sua.AuthorityId)
  208. if err != nil {
  209. response.FailWithMessage(fmt.Sprintf("修改失败,%v", err), c)
  210. } else {
  211. response.OkWithMessage("修改成功", c)
  212. }
  213. }
  214. // @Tags SysUser
  215. // @Summary 删除用户
  216. // @Security ApiKeyAuth
  217. // @accept application/json
  218. // @Produce application/json
  219. // @Param data body request.GetById true "用户ID"
  220. // @Success 200 {string} string "{"success":true,"data":{},"msg":"修改成功"}"
  221. // @Router /user/deleteUser [delete]
  222. func DeleteUser(c *gin.Context) {
  223. var reqId request.GetById
  224. _ = c.ShouldBindJSON(&reqId)
  225. if IdVerifyErr := utils.Verify(reqId, utils.CustomizeMap["IdVerify"]); IdVerifyErr != nil {
  226. response.FailWithMessage(IdVerifyErr.Error(), c)
  227. return
  228. }
  229. err := service.DeleteUser(reqId.Id)
  230. if err != nil {
  231. response.FailWithMessage(fmt.Sprintf("删除失败,%v", err), c)
  232. } else {
  233. response.OkWithMessage("删除成功", c)
  234. }
  235. }
  236. // @Tags SysUser
  237. // @Summary 设置用户信息
  238. // @Security ApiKeyAuth
  239. // @accept application/json
  240. // @Produce application/json
  241. // @Param data body model.SysUser true "ID, 用户名, 昵称, 头像链接"
  242. // @Success 200 {string} string "{"success":true,"data":{},"msg":"修改成功"}"
  243. // @Router /user/setUserInfo [put]
  244. func SetUserInfo(c *gin.Context) {
  245. var user model.SysUser
  246. UserVerify := utils.Rules{
  247. "ID": {utils.NotEmpty()},
  248. "Username": {utils.NotEmpty()},
  249. "NickName": {utils.NotEmpty()},
  250. "HeaderImg": {utils.NotEmpty()},
  251. }
  252. if UserVerifyErr := utils.Verify(user, UserVerify); UserVerifyErr != nil {
  253. response.FailWithMessage(UserVerifyErr.Error(), c)
  254. return
  255. }
  256. _ = c.ShouldBindJSON(&user)
  257. err, ReqUser := service.SetUserInfo(user)
  258. if err != nil {
  259. response.FailWithMessage(fmt.Sprintf("更新失败,%v", err), c)
  260. } else {
  261. response.OkWithData(gin.H{
  262. "userInfo": ReqUser,
  263. }, c)
  264. }
  265. }
  266. // 从Gin的Context中获取从jwt解析出来的用户ID
  267. func getUserID(c *gin.Context) (uint, error) {
  268. if claims, exists := c.Get("claims"); !exists {
  269. global.GVA_LOG.Error("从Gin的Context中获取从jwt解析出来的用户ID失败, 请检查路由是否使用jwt中间件")
  270. return 0, errors.New("解析失败")
  271. } else {
  272. waitUse := claims.(*request.CustomClaims)
  273. return waitUse.ID, nil
  274. }
  275. }
  276. // 从Gin的Context中获取从jwt解析出来的用户UUID
  277. func getUserUuid(c *gin.Context) (string, error) {
  278. if claims, exists := c.Get("claims"); !exists {
  279. global.GVA_LOG.Error("从Gin的Context中获取从jwt解析出来的用户UUID失败, 请检查路由是否使用jwt中间件")
  280. return "", errors.New("解析失败")
  281. } else {
  282. waitUse := claims.(*request.CustomClaims)
  283. return waitUse.UUID.String(), nil
  284. }
  285. }
  286. // 从Gin的Context中获取从jwt解析出来的用户角色id
  287. func getUserAuthorityId(c *gin.Context) (string, error) {
  288. if claims, exists := c.Get("claims"); !exists {
  289. global.GVA_LOG.Error("从Gin的Context中获取从jwt解析出来的用户UUID失败, 请检查路由是否使用jwt中间件")
  290. return "", errors.New("解析失败")
  291. } else {
  292. waitUse := claims.(*request.CustomClaims)
  293. return waitUse.AuthorityId, nil
  294. }
  295. }