user.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. package admin
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/lejianwen/rustdesk-api/v2/global"
  5. "github.com/lejianwen/rustdesk-api/v2/http/request/admin"
  6. "github.com/lejianwen/rustdesk-api/v2/http/response"
  7. adResp "github.com/lejianwen/rustdesk-api/v2/http/response/admin"
  8. "github.com/lejianwen/rustdesk-api/v2/model"
  9. "github.com/lejianwen/rustdesk-api/v2/service"
  10. "github.com/lejianwen/rustdesk-api/v2/utils"
  11. "gorm.io/gorm"
  12. "strconv"
  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. // Verify the old password only when the account already has one set
  237. if !service.AllService.UserService.IsPasswordEmptyByUser(u) {
  238. ok, _, err := utils.VerifyPassword(u.Password, f.OldPassword)
  239. if err != nil || !ok {
  240. response.Fail(c, 101, response.TranslateMsg(c, "OldPasswordError"))
  241. return
  242. }
  243. }
  244. err := service.AllService.UserService.UpdatePassword(u, f.NewPassword)
  245. if err != nil {
  246. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  247. return
  248. }
  249. response.Success(c, nil)
  250. }
  251. // MyOauth
  252. // @Tags 用户
  253. // @Summary 我的授权
  254. // @Description 我的授权
  255. // @Accept json
  256. // @Produce json
  257. // @Success 200 {object} response.Response{data=[]adResp.UserOauthItem}
  258. // @Failure 500 {object} response.Response
  259. // @Router /admin/user/myOauth [get]
  260. // @Security token
  261. func (ct *User) MyOauth(c *gin.Context) {
  262. u := service.AllService.UserService.CurUser(c)
  263. oal := service.AllService.OauthService.List(1, 100, nil)
  264. ops := make([]string, 0)
  265. for _, oa := range oal.Oauths {
  266. ops = append(ops, oa.Op)
  267. }
  268. uts := service.AllService.UserService.UserThirdsByUserId(u.Id)
  269. var res []*adResp.UserOauthItem
  270. for _, oa := range oal.Oauths {
  271. item := &adResp.UserOauthItem{
  272. Op: oa.Op,
  273. }
  274. for _, ut := range uts {
  275. if ut.Op == oa.Op {
  276. item.Status = 1
  277. break
  278. }
  279. }
  280. res = append(res, item)
  281. }
  282. response.Success(c, res)
  283. }
  284. // groupUsers
  285. func (ct *User) GroupUsers(c *gin.Context) {
  286. aG := service.AllService.GroupService.List(1, 999, nil)
  287. aU := service.AllService.UserService.List(1, 9999, nil)
  288. response.Success(c, gin.H{
  289. "groups": aG.Groups,
  290. "users": aU.Users,
  291. })
  292. }
  293. // Register
  294. func (ct *User) Register(c *gin.Context) {
  295. if !global.Config.App.Register {
  296. response.Fail(c, 101, response.TranslateMsg(c, "RegisterClosed"))
  297. return
  298. }
  299. f := &admin.RegisterForm{}
  300. if err := c.ShouldBindJSON(f); err != nil {
  301. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  302. return
  303. }
  304. errList := global.Validator.ValidStruct(c, f)
  305. if len(errList) > 0 {
  306. response.Fail(c, 101, errList[0])
  307. return
  308. }
  309. regStatus := model.StatusCode(global.Config.App.RegisterStatus)
  310. // 注册状态可能未配置,默认启用
  311. if regStatus != model.COMMON_STATUS_DISABLED && regStatus != model.COMMON_STATUS_ENABLE {
  312. regStatus = model.COMMON_STATUS_ENABLE
  313. }
  314. u := service.AllService.UserService.Register(f.Username, f.Email, f.Password, regStatus)
  315. if u == nil || u.Id == 0 {
  316. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed"))
  317. return
  318. }
  319. if regStatus == model.COMMON_STATUS_DISABLED {
  320. // 需要管理员审核
  321. response.Fail(c, 101, response.TranslateMsg(c, "RegisterSuccessWaitAdminConfirm"))
  322. return
  323. }
  324. // 注册成功后自动登录
  325. ut := service.AllService.UserService.Login(u, &model.LoginLog{
  326. UserId: u.Id,
  327. Client: model.LoginLogClientWebAdmin,
  328. Uuid: "",
  329. Ip: c.ClientIP(),
  330. Type: model.LoginLogTypeAccount,
  331. })
  332. responseLoginSuccess(c, u, ut.Token)
  333. }