client_user.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. package client
  2. import (
  3. "errors"
  4. "github.com/flipped-aurora/gin-vue-admin/server/global"
  5. "github.com/flipped-aurora/gin-vue-admin/server/model/client"
  6. clientReq "github.com/flipped-aurora/gin-vue-admin/server/model/client/request"
  7. "github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
  8. "github.com/flipped-aurora/gin-vue-admin/server/model/system"
  9. systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
  10. systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
  11. "github.com/flipped-aurora/gin-vue-admin/server/service"
  12. "github.com/flipped-aurora/gin-vue-admin/server/utils"
  13. "github.com/gin-gonic/gin"
  14. "github.com/mojocn/base64Captcha"
  15. "github.com/redis/go-redis/v9"
  16. "go.uber.org/zap"
  17. "strconv"
  18. "time"
  19. )
  20. type ClientUserApi struct {
  21. }
  22. var clientUserService = service.ServiceGroupApp.ClientServiceGroup.ClientUserService
  23. var store = base64Captcha.DefaultMemStore
  24. func (clientUserApi *ClientUserApi) GetUserInfo(c *gin.Context) {
  25. userID := utils.GetUserID(c)
  26. id := strconv.Itoa(int(userID))
  27. if user, err := clientUserService.GetClientUser(id); err != nil {
  28. global.GVA_LOG.Error("查询失败!", zap.Error(err))
  29. response.FailWithMessage("查询失败", c)
  30. } else {
  31. response.OkWithData(user, c)
  32. }
  33. }
  34. func (clientUserApi *ClientUserApi) Login(c *gin.Context) {
  35. var l clientReq.Login
  36. err := c.ShouldBindJSON(&l)
  37. key := c.ClientIP()
  38. if err != nil {
  39. response.FailWithMessage(err.Error(), c)
  40. return
  41. }
  42. user, err := clientUserService.Login(&l)
  43. if err != nil {
  44. global.GVA_LOG.Error("登陆失败! 用户名不存在或者密码错误!", zap.Error(err))
  45. // 验证码次数+1
  46. global.BlackCache.Increment(key, 1)
  47. response.FailWithMessage(err.Error(), c)
  48. return
  49. }
  50. clientUserApi.TokenNext(c, user)
  51. return
  52. response.FailWithMessage("验证码错误", c)
  53. }
  54. func (clientUserApi *ClientUserApi) Register(c *gin.Context) {
  55. var register clientReq.CreateUser
  56. err := c.ShouldBindJSON(&register)
  57. if err != nil {
  58. response.FailWithMessage(err.Error(), c)
  59. return
  60. }
  61. if register.Password != register.RePassword {
  62. response.FailWithMessage("两次输入的密码不一致", c)
  63. return
  64. }
  65. var clientUser client.ClientUser
  66. clientUser.Username = register.Username
  67. clientUser.Password = register.Password
  68. if err := clientUserService.CreateClientUser(&clientUser); err != nil {
  69. global.GVA_LOG.Error("创建失败!", zap.Error(err))
  70. response.FailWithMessage("创建失败", c)
  71. } else {
  72. response.OkWithMessage("创建成功", c)
  73. }
  74. }
  75. // CreateClientUser 创建客户端用户
  76. // @Tags ClientUser
  77. // @Summary 创建客户端用户
  78. // @Security ApiKeyAuth
  79. // @accept application/json
  80. // @Produce application/json
  81. // @Param data body client.ClientUser true "创建客户端用户"
  82. // @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
  83. // @Router /clientUser/createClientUser [post]
  84. func (clientUserApi *ClientUserApi) CreateClientUser(c *gin.Context) {
  85. var clientUser client.ClientUser
  86. err := c.ShouldBindJSON(&clientUser)
  87. if err != nil {
  88. response.FailWithMessage(err.Error(), c)
  89. return
  90. }
  91. clientUser.CreatedBy = utils.GetUserID(c)
  92. if err := clientUserService.CreateClientUser(&clientUser); err != nil {
  93. global.GVA_LOG.Error("创建失败!", zap.Error(err))
  94. response.FailWithMessage("创建失败", c)
  95. } else {
  96. response.OkWithMessage("创建成功", c)
  97. }
  98. }
  99. // DeleteClientUser 删除客户端用户
  100. // @Tags ClientUser
  101. // @Summary 删除客户端用户
  102. // @Security ApiKeyAuth
  103. // @accept application/json
  104. // @Produce application/json
  105. // @Param data body client.ClientUser true "删除客户端用户"
  106. // @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
  107. // @Router /clientUser/deleteClientUser [delete]
  108. func (clientUserApi *ClientUserApi) DeleteClientUser(c *gin.Context) {
  109. ID := c.Query("ID")
  110. userID := utils.GetUserID(c)
  111. if err := clientUserService.DeleteClientUser(ID, userID); err != nil {
  112. global.GVA_LOG.Error("删除失败!", zap.Error(err))
  113. response.FailWithMessage("删除失败", c)
  114. } else {
  115. response.OkWithMessage("删除成功", c)
  116. }
  117. }
  118. // DeleteClientUserByIds 批量删除客户端用户
  119. // @Tags ClientUser
  120. // @Summary 批量删除客户端用户
  121. // @Security ApiKeyAuth
  122. // @accept application/json
  123. // @Produce application/json
  124. // @Success 200 {string} string "{"success":true,"data":{},"msg":"批量删除成功"}"
  125. // @Router /clientUser/deleteClientUserByIds [delete]
  126. func (clientUserApi *ClientUserApi) DeleteClientUserByIds(c *gin.Context) {
  127. IDs := c.QueryArray("IDs[]")
  128. userID := utils.GetUserID(c)
  129. if err := clientUserService.DeleteClientUserByIds(IDs, userID); err != nil {
  130. global.GVA_LOG.Error("批量删除失败!", zap.Error(err))
  131. response.FailWithMessage("批量删除失败", c)
  132. } else {
  133. response.OkWithMessage("批量删除成功", c)
  134. }
  135. }
  136. // UpdateClientUser 更新客户端用户
  137. // @Tags ClientUser
  138. // @Summary 更新客户端用户
  139. // @Security ApiKeyAuth
  140. // @accept application/json
  141. // @Produce application/json
  142. // @Param data body client.ClientUser true "更新客户端用户"
  143. // @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}"
  144. // @Router /clientUser/updateClientUser [put]
  145. func (clientUserApi *ClientUserApi) UpdateClientUser(c *gin.Context) {
  146. var clientUserReq clientReq.UpdateUser
  147. err := c.ShouldBindJSON(&clientUserReq)
  148. if err != nil {
  149. response.FailWithMessage(err.Error(), c)
  150. return
  151. }
  152. var clientUser client.ClientUser
  153. clientUser.ID = clientUserReq.ID
  154. clientUser.Nickname = clientUserReq.Nickname
  155. clientUser.Gender = clientUserReq.Gender
  156. clientUser.Phone = clientUserReq.Phone
  157. clientUser.Email = clientUserReq.Email
  158. clientUser.Building = clientUserReq.Building
  159. clientUser.Room = clientUserReq.Room
  160. clientUser.Pen = clientUserReq.Pen
  161. if err := clientUserService.UpdateClientUser(clientUser); err != nil {
  162. global.GVA_LOG.Error("更新失败!", zap.Error(err))
  163. response.FailWithMessage("更新失败", c)
  164. } else {
  165. response.OkWithMessage("更新成功", c)
  166. }
  167. }
  168. // FindClientUser 用id查询客户端用户
  169. // @Tags ClientUser
  170. // @Summary 用id查询客户端用户
  171. // @Security ApiKeyAuth
  172. // @accept application/json
  173. // @Produce application/json
  174. // @Param data query client.ClientUser true "用id查询客户端用户"
  175. // @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
  176. // @Router /clientUser/findClientUser [get]
  177. func (clientUserApi *ClientUserApi) FindClientUser(c *gin.Context) {
  178. ID := c.Query("ID")
  179. if reclientUser, err := clientUserService.GetClientUser(ID); err != nil {
  180. global.GVA_LOG.Error("查询失败!", zap.Error(err))
  181. response.FailWithMessage("查询失败", c)
  182. } else {
  183. response.OkWithData(gin.H{"reclientUser": reclientUser}, c)
  184. }
  185. }
  186. // GetClientUserList 分页获取客户端用户列表
  187. // @Tags ClientUser
  188. // @Summary 分页获取客户端用户列表
  189. // @Security ApiKeyAuth
  190. // @accept application/json
  191. // @Produce application/json
  192. // @Param data query clientReq.ClientUserSearch true "分页获取客户端用户列表"
  193. // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
  194. // @Router /clientUser/getClientUserList [get]
  195. func (clientUserApi *ClientUserApi) GetClientUserList(c *gin.Context) {
  196. var pageInfo clientReq.ClientUserSearch
  197. err := c.ShouldBindQuery(&pageInfo)
  198. if err != nil {
  199. response.FailWithMessage(err.Error(), c)
  200. return
  201. }
  202. if list, total, err := clientUserService.GetClientUserInfoList(pageInfo); err != nil {
  203. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  204. response.FailWithMessage("获取失败", c)
  205. } else {
  206. response.OkWithDetailed(response.PageResult{
  207. List: list,
  208. Total: total,
  209. Page: pageInfo.Page,
  210. PageSize: pageInfo.PageSize,
  211. }, "获取成功", c)
  212. }
  213. }
  214. // GetClientUserPublic 不需要鉴权的客户端用户接口
  215. // @Tags ClientUser
  216. // @Summary 不需要鉴权的客户端用户接口
  217. // @accept application/json
  218. // @Produce application/json
  219. // @Param data query clientReq.ClientUserSearch true "分页获取客户端用户列表"
  220. // @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
  221. // @Router /clientUser/getClientUserList [get]
  222. func (clientUserApi *ClientUserApi) GetClientUserPublic(c *gin.Context) {
  223. // 此接口不需要鉴权
  224. // 示例为返回了一个固定的消息接口,一般本接口用于C端服务,需要自己实现业务逻辑
  225. response.OkWithDetailed(gin.H{
  226. "info": "不需要鉴权的客户端用户接口信息",
  227. }, "获取成功", c)
  228. }
  229. // TokenNext 登录以后签发jwt
  230. func (clientUserApi *ClientUserApi) TokenNext(c *gin.Context, user client.ClientUser) {
  231. j := &utils.JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
  232. claims := j.CreateClaims(systemReq.BaseClaims{
  233. UUID: user.UUID,
  234. ID: user.ID,
  235. NickName: user.Nickname,
  236. Username: user.Username,
  237. AuthorityId: 8080,
  238. })
  239. token, err := j.CreateToken(claims)
  240. if err != nil {
  241. global.GVA_LOG.Error("获取token失败!", zap.Error(err))
  242. response.FailWithMessage("获取token失败", c)
  243. return
  244. }
  245. if !global.GVA_CONFIG.System.UseMultipoint {
  246. utils.SetToken(c, token, int(claims.RegisteredClaims.ExpiresAt.Unix()-time.Now().Unix()))
  247. response.OkWithDetailed(systemRes.LoginResponse{
  248. User: user,
  249. Token: token,
  250. ExpiresAt: claims.RegisteredClaims.ExpiresAt.Unix() * 1000,
  251. }, "登录成功", c)
  252. return
  253. }
  254. if jwtStr, err := jwtService.GetRedisJWT(user.Username); errors.Is(err, redis.Nil) {
  255. if err := utils.SetRedisJWT(token, user.Username); err != nil {
  256. global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
  257. response.FailWithMessage("设置登录状态失败", c)
  258. return
  259. }
  260. utils.SetToken(c, token, int(claims.RegisteredClaims.ExpiresAt.Unix()-time.Now().Unix()))
  261. response.OkWithDetailed(systemRes.LoginResponse{
  262. User: user,
  263. Token: token,
  264. ExpiresAt: claims.RegisteredClaims.ExpiresAt.Unix() * 1000,
  265. }, "登录成功", c)
  266. } else if err != nil {
  267. global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
  268. response.FailWithMessage("设置登录状态失败", c)
  269. } else {
  270. var blackJWT system.JwtBlacklist
  271. blackJWT.Jwt = jwtStr
  272. if err := jwtService.JsonInBlacklist(blackJWT); err != nil {
  273. response.FailWithMessage("jwt作废失败", c)
  274. return
  275. }
  276. if err := utils.SetRedisJWT(token, user.Username); err != nil {
  277. response.FailWithMessage("设置登录状态失败", c)
  278. return
  279. }
  280. utils.SetToken(c, token, int(claims.RegisteredClaims.ExpiresAt.Unix()-time.Now().Unix()))
  281. response.OkWithDetailed(systemRes.LoginResponse{
  282. User: user,
  283. Token: token,
  284. ExpiresAt: claims.RegisteredClaims.ExpiresAt.Unix() * 1000,
  285. }, "登录成功", c)
  286. }
  287. }
  288. func (clientUserApi *ClientUserApi) ResetPassword(c *gin.Context) {
  289. var rps systemReq.ResetPassword
  290. err := c.ShouldBindJSON(&rps)
  291. if err != nil {
  292. response.FailWithMessage(err.Error(), c)
  293. return
  294. }
  295. err = clientUserService.ResetPassword(rps.ID, rps.Password)
  296. if err != nil {
  297. global.GVA_LOG.Error("重置失败!", zap.Error(err))
  298. response.FailWithMessage("重置失败"+err.Error(), c)
  299. return
  300. }
  301. response.OkWithMessage("重置成功", c)
  302. }
  303. // 类型转换
  304. func interfaceToInt(v interface{}) (i int) {
  305. switch v := v.(type) {
  306. case int:
  307. i = v
  308. default:
  309. i = 0
  310. }
  311. return
  312. }