user.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. package admin
  2. import (
  3. "Gwen/global"
  4. "Gwen/http/request/admin"
  5. "Gwen/http/response"
  6. adResp "Gwen/http/response/admin"
  7. "Gwen/model"
  8. "Gwen/service"
  9. "github.com/gin-gonic/gin"
  10. "gorm.io/gorm"
  11. "strconv"
  12. "time"
  13. )
  14. type User struct {
  15. }
  16. // Detail 管理员
  17. // @Tags 用户
  18. // @Summary 管理员详情
  19. // @Description 管理员详情
  20. // @Accept json
  21. // @Produce json
  22. // @Param id path int true "ID"
  23. // @Success 200 {object} response.Response{data=model.User}
  24. // @Failure 500 {object} response.Response
  25. // @Router /admin/user/detail/{id} [get]
  26. // @Security token
  27. func (ct *User) Detail(c *gin.Context) {
  28. id := c.Param("id")
  29. iid, _ := strconv.Atoi(id)
  30. u := service.AllService.UserService.InfoById(uint(iid))
  31. if u.Id > 0 {
  32. response.Success(c, u)
  33. return
  34. }
  35. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  36. return
  37. }
  38. // Create 管理员
  39. // @Tags 用户
  40. // @Summary 创建管理员
  41. // @Description 创建管理员
  42. // @Accept json
  43. // @Produce json
  44. // @Param body body admin.UserForm true "管理员信息"
  45. // @Success 200 {object} response.Response{data=model.User}
  46. // @Failure 500 {object} response.Response
  47. // @Router /admin/user/create [post]
  48. // @Security token
  49. func (ct *User) Create(c *gin.Context) {
  50. f := &admin.UserForm{}
  51. if err := c.ShouldBindJSON(f); err != nil {
  52. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  53. return
  54. }
  55. errList := global.Validator.ValidStruct(c, f)
  56. if len(errList) > 0 {
  57. response.Fail(c, 101, errList[0])
  58. return
  59. }
  60. u := f.ToUser()
  61. err := service.AllService.UserService.Create(u)
  62. if err != nil {
  63. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  64. return
  65. }
  66. response.Success(c, nil)
  67. }
  68. // List 列表
  69. // @Tags 用户
  70. // @Summary 管理员列表
  71. // @Description 管理员列表
  72. // @Accept json
  73. // @Produce json
  74. // @Param page query int false "页码"
  75. // @Param page_size query int false "页大小"
  76. // @Param username query int false "账户"
  77. // @Success 200 {object} response.Response{data=model.UserList}
  78. // @Failure 500 {object} response.Response
  79. // @Router /admin/user/list [get]
  80. // @Security token
  81. func (ct *User) List(c *gin.Context) {
  82. query := &admin.UserQuery{}
  83. if err := c.ShouldBindQuery(query); err != nil {
  84. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  85. return
  86. }
  87. res := service.AllService.UserService.List(query.Page, query.PageSize, func(tx *gorm.DB) {
  88. if query.Username != "" {
  89. tx.Where("username like ?", "%"+query.Username+"%")
  90. }
  91. })
  92. response.Success(c, res)
  93. }
  94. // Update 编辑
  95. // @Tags 用户
  96. // @Summary 管理员编辑
  97. // @Description 管理员编辑
  98. // @Accept json
  99. // @Produce json
  100. // @Param body body admin.UserForm true "用户信息"
  101. // @Success 200 {object} response.Response{data=model.User}
  102. // @Failure 500 {object} response.Response
  103. // @Router /admin/user/update [post]
  104. // @Security token
  105. func (ct *User) Update(c *gin.Context) {
  106. f := &admin.UserForm{}
  107. if err := c.ShouldBindJSON(f); err != nil {
  108. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  109. return
  110. }
  111. if f.Id == 0 {
  112. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  113. return
  114. }
  115. errList := global.Validator.ValidStruct(c, f)
  116. if len(errList) > 0 {
  117. response.Fail(c, 101, errList[0])
  118. return
  119. }
  120. u := f.ToUser()
  121. err := service.AllService.UserService.Update(u)
  122. if err != nil {
  123. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  124. return
  125. }
  126. response.Success(c, nil)
  127. }
  128. // Delete 删除
  129. // @Tags 用户
  130. // @Summary 管理员删除
  131. // @Description 管理员编删除
  132. // @Accept json
  133. // @Produce json
  134. // @Param body body admin.UserForm true "用户信息"
  135. // @Success 200 {object} response.Response
  136. // @Failure 500 {object} response.Response
  137. // @Router /admin/user/delete [post]
  138. // @Security token
  139. func (ct *User) Delete(c *gin.Context) {
  140. f := &admin.UserForm{}
  141. if err := c.ShouldBindJSON(f); err != nil {
  142. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  143. return
  144. }
  145. id := f.Id
  146. errList := global.Validator.ValidVar(c, id, "required,gt=0")
  147. if len(errList) > 0 {
  148. response.Fail(c, 101, errList[0])
  149. return
  150. }
  151. u := service.AllService.UserService.InfoById(f.Id)
  152. if u.Id > 0 {
  153. err := service.AllService.UserService.Delete(u)
  154. if err == nil {
  155. response.Success(c, nil)
  156. return
  157. }
  158. response.Fail(c, 101, err.Error())
  159. return
  160. }
  161. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  162. }
  163. // UpdatePassword 修改密码
  164. // @Tags 用户
  165. // @Summary 修改密码
  166. // @Description 修改密码
  167. // @Accept json
  168. // @Produce json
  169. // @Param body body admin.UserPasswordForm true "用户信息"
  170. // @Success 200 {object} response.Response
  171. // @Failure 500 {object} response.Response
  172. // @Router /admin/user/updatePassword [post]
  173. // @Security token
  174. func (ct *User) UpdatePassword(c *gin.Context) {
  175. f := &admin.UserPasswordForm{}
  176. if err := c.ShouldBindJSON(f); err != nil {
  177. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  178. return
  179. }
  180. errList := global.Validator.ValidStruct(c, f)
  181. if len(errList) > 0 {
  182. response.Fail(c, 101, errList[0])
  183. return
  184. }
  185. u := service.AllService.UserService.InfoById(f.Id)
  186. if u.Id == 0 {
  187. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  188. return
  189. }
  190. err := service.AllService.UserService.UpdatePassword(u, f.Password)
  191. if err != nil {
  192. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  193. return
  194. }
  195. response.Success(c, nil)
  196. }
  197. // Current 当前用户
  198. // @Tags 用户
  199. // @Summary 当前用户
  200. // @Description 当前用户
  201. // @Accept json
  202. // @Produce json
  203. // @Success 200 {object} response.Response{data=adResp.LoginPayload}
  204. // @Failure 500 {object} response.Response
  205. // @Router /admin/user/current [get]
  206. // @Security token
  207. func (ct *User) Current(c *gin.Context) {
  208. u := service.AllService.UserService.CurUser(c)
  209. token, _ := c.Get("token")
  210. t := token.(string)
  211. responseLoginSuccess(c, u, t)
  212. }
  213. // ChangeCurPwd 修改当前用户密码
  214. // @Tags 用户
  215. // @Summary 修改当前用户密码
  216. // @Description 修改当前用户密码
  217. // @Accept json
  218. // @Produce json
  219. // @Param body body admin.ChangeCurPasswordForm true "用户信息"
  220. // @Success 200 {object} response.Response
  221. // @Failure 500 {object} response.Response
  222. // @Router /admin/user/changeCurPwd [post]
  223. // @Security token
  224. func (ct *User) ChangeCurPwd(c *gin.Context) {
  225. f := &admin.ChangeCurPasswordForm{}
  226. if err := c.ShouldBindJSON(f); err != nil {
  227. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  228. return
  229. }
  230. errList := global.Validator.ValidStruct(c, f)
  231. if len(errList) > 0 {
  232. response.Fail(c, 101, errList[0])
  233. return
  234. }
  235. u := service.AllService.UserService.CurUser(c)
  236. // If the password is not empty, the old password is verified
  237. // otherwise, the old password is not verified
  238. if !service.AllService.UserService.IsPasswordEmptyByUser(u) {
  239. oldPwd := service.AllService.UserService.EncryptPassword(f.OldPassword)
  240. if u.Password != oldPwd {
  241. response.Fail(c, 101, response.TranslateMsg(c, "OldPasswordError"))
  242. return
  243. }
  244. }
  245. err := service.AllService.UserService.UpdatePassword(u, f.NewPassword)
  246. if err != nil {
  247. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  248. return
  249. }
  250. response.Success(c, nil)
  251. }
  252. // MyOauth
  253. // @Tags 用户
  254. // @Summary 我的授权
  255. // @Description 我的授权
  256. // @Accept json
  257. // @Produce json
  258. // @Success 200 {object} response.Response{data=[]adResp.UserOauthItem}
  259. // @Failure 500 {object} response.Response
  260. // @Router /admin/user/myOauth [get]
  261. // @Security token
  262. func (ct *User) MyOauth(c *gin.Context) {
  263. u := service.AllService.UserService.CurUser(c)
  264. oal := service.AllService.OauthService.List(1, 100, nil)
  265. ops := make([]string, 0)
  266. for _, oa := range oal.Oauths {
  267. ops = append(ops, oa.Op)
  268. }
  269. uts := service.AllService.UserService.UserThirdsByUserId(u.Id)
  270. var res []*adResp.UserOauthItem
  271. for _, oa := range oal.Oauths {
  272. item := &adResp.UserOauthItem{
  273. Op: oa.Op,
  274. }
  275. for _, ut := range uts {
  276. if ut.Op == oa.Op {
  277. item.Status = 1
  278. break
  279. }
  280. }
  281. res = append(res, item)
  282. }
  283. response.Success(c, res)
  284. }
  285. // MyPeer 列表
  286. // @Tags 设备
  287. // @Summary 我的设备列表
  288. // @Description 我的设备列表
  289. // @Accept json
  290. // @Produce json
  291. // @Param page query int false "页码"
  292. // @Param page_size query int false "页大小"
  293. // @Param time_ago query int false "时间"
  294. // @Param id query string false "ID"
  295. // @Param hostname query string false "主机名"
  296. // @Param uuids query string false "uuids 用逗号分隔"
  297. // @Success 200 {object} response.Response{data=model.PeerList}
  298. // @Failure 500 {object} response.Response
  299. // @Router /admin/user/myPeer [get]
  300. // @Security token
  301. func (ct *User) MyPeer(c *gin.Context) {
  302. query := &admin.PeerQuery{}
  303. if err := c.ShouldBindQuery(query); err != nil {
  304. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  305. return
  306. }
  307. u := service.AllService.UserService.CurUser(c)
  308. res := service.AllService.PeerService.ListFilterByUserId(query.Page, query.PageSize, func(tx *gorm.DB) {
  309. if query.TimeAgo > 0 {
  310. lt := time.Now().Unix() - int64(query.TimeAgo)
  311. tx.Where("last_online_time < ?", lt)
  312. }
  313. if query.TimeAgo < 0 {
  314. lt := time.Now().Unix() + int64(query.TimeAgo)
  315. tx.Where("last_online_time > ?", lt)
  316. }
  317. if query.Id != "" {
  318. tx.Where("id like ?", "%"+query.Id+"%")
  319. }
  320. if query.Hostname != "" {
  321. tx.Where("hostname like ?", "%"+query.Hostname+"%")
  322. }
  323. if query.Uuids != "" {
  324. tx.Where("uuid in (?)", query.Uuids)
  325. }
  326. }, u.Id)
  327. response.Success(c, res)
  328. }
  329. // groupUsers
  330. func (ct *User) GroupUsers(c *gin.Context) {
  331. q := &admin.GroupUsersQuery{}
  332. if err := c.ShouldBindJSON(q); err != nil {
  333. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  334. return
  335. }
  336. u := service.AllService.UserService.CurUser(c)
  337. gid := u.GroupId
  338. uid := u.Id
  339. if service.AllService.UserService.IsAdmin(u) && q.UserId > 0 {
  340. nu := service.AllService.UserService.InfoById(q.UserId)
  341. gid = nu.GroupId
  342. uid = q.UserId
  343. }
  344. res := service.AllService.UserService.List(1, 999, func(tx *gorm.DB) {
  345. tx.Where("group_id = ?", gid)
  346. })
  347. var data []*adResp.GroupUsersPayload
  348. for _, _u := range res.Users {
  349. gup := &adResp.GroupUsersPayload{}
  350. gup.FromUser(_u)
  351. if _u.Id == uid {
  352. gup.Status = 0
  353. }
  354. data = append(data, gup)
  355. }
  356. response.Success(c, data)
  357. }
  358. // Register
  359. func (ct *User) Register(c *gin.Context) {
  360. if !global.Config.App.Register {
  361. response.Fail(c, 101, response.TranslateMsg(c, "RegisterClosed"))
  362. return
  363. }
  364. f := &admin.RegisterForm{}
  365. if err := c.ShouldBindJSON(f); err != nil {
  366. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  367. return
  368. }
  369. errList := global.Validator.ValidStruct(c, f)
  370. if len(errList) > 0 {
  371. response.Fail(c, 101, errList[0])
  372. return
  373. }
  374. u := service.AllService.UserService.Register(f.Username, f.Email, f.Password)
  375. if u == nil || u.Id == 0 {
  376. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed"))
  377. return
  378. }
  379. // 注册成功后自动登录
  380. ut := service.AllService.UserService.Login(u, &model.LoginLog{
  381. UserId: u.Id,
  382. Client: model.LoginLogClientWebAdmin,
  383. Uuid: "",
  384. Ip: c.ClientIP(),
  385. Type: model.LoginLogTypeAccount,
  386. })
  387. responseLoginSuccess(c, u, ut.Token)
  388. }