admin.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. package handler
  2. import (
  3. "github.com/gin-gonic/gin"
  4. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  5. "github.com/go-nunu/nunu-layout-advanced/internal/service"
  6. "net/http"
  7. )
  8. type AdminHandler struct {
  9. *Handler
  10. adminService service.AdminService
  11. }
  12. func NewAdminHandler(
  13. handler *Handler,
  14. adminService service.AdminService,
  15. ) *AdminHandler {
  16. return &AdminHandler{
  17. Handler: handler,
  18. adminService: adminService,
  19. }
  20. }
  21. // Login godoc
  22. // @Summary 账号登录
  23. // @Schemes
  24. // @Description
  25. // @Tags 用户模块
  26. // @Accept json
  27. // @Produce json
  28. // @Param request body v1.LoginRequest true "params"
  29. // @Success 200 {object} v1.LoginResponse
  30. // @Router /v1/login [post]
  31. func (h *AdminHandler) Login(ctx *gin.Context) {
  32. var req v1.LoginRequest
  33. if err := ctx.ShouldBindJSON(&req); err != nil {
  34. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  35. return
  36. }
  37. token, err := h.adminService.Login(ctx, &req)
  38. if err != nil {
  39. v1.HandleError(ctx, http.StatusUnauthorized, v1.ErrUnauthorized, nil)
  40. return
  41. }
  42. v1.HandleSuccess(ctx, v1.LoginResponseData{
  43. AccessToken: token,
  44. })
  45. }
  46. // GetMenus godoc
  47. // @Summary 获取用户菜单
  48. // @Schemes
  49. // @Description 获取当前用户的菜单列表
  50. // @Tags 菜单模块
  51. // @Accept json
  52. // @Produce json
  53. // @Security Bearer
  54. // @Success 200 {object} v1.GetMenuResponse
  55. // @Router /v1/menus [get]
  56. func (h *AdminHandler) GetMenus(ctx *gin.Context) {
  57. data, err := h.adminService.GetMenus(ctx, GetUserIdFromCtx(ctx))
  58. if err != nil {
  59. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  60. return
  61. }
  62. // 过滤权限菜单
  63. v1.HandleSuccess(ctx, data)
  64. }
  65. // GetAdminMenus godoc
  66. // @Summary 获取管理员菜单
  67. // @Schemes
  68. // @Description 获取管理员菜单列表
  69. // @Tags 菜单模块
  70. // @Accept json
  71. // @Produce json
  72. // @Security Bearer
  73. // @Success 200 {object} v1.GetMenuResponse
  74. // @Router /v1/admin/menus [get]
  75. func (h *AdminHandler) GetAdminMenus(ctx *gin.Context) {
  76. data, err := h.adminService.GetAdminMenus(ctx)
  77. if err != nil {
  78. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  79. return
  80. }
  81. // 过滤权限菜单
  82. v1.HandleSuccess(ctx, data)
  83. }
  84. // GetUserPermissions godoc
  85. // @Summary 获取用户权限
  86. // @Schemes
  87. // @Description 获取当前用户的权限列表
  88. // @Tags 权限模块
  89. // @Accept json
  90. // @Produce json
  91. // @Security Bearer
  92. // @Success 200 {object} v1.GetUserPermissionsData
  93. // @Router /v1/admin/user/permissions [get]
  94. func (h *AdminHandler) GetUserPermissions(ctx *gin.Context) {
  95. data, err := h.adminService.GetUserPermissions(ctx, GetUserIdFromCtx(ctx))
  96. if err != nil {
  97. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  98. return
  99. }
  100. // 过滤权限菜单
  101. v1.HandleSuccess(ctx, data)
  102. }
  103. // GetRolePermissions godoc
  104. // @Summary 获取角色权限
  105. // @Schemes
  106. // @Description 获取指定角色的权限列表
  107. // @Tags 权限模块
  108. // @Accept json
  109. // @Produce json
  110. // @Security Bearer
  111. // @Param role query string true "角色名称"
  112. // @Success 200 {object} v1.GetRolePermissionsData
  113. // @Router /v1/admin/role/permissions [get]
  114. func (h *AdminHandler) GetRolePermissions(ctx *gin.Context) {
  115. var req v1.GetRolePermissionsRequest
  116. if err := ctx.ShouldBind(&req); err != nil {
  117. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  118. return
  119. }
  120. data, err := h.adminService.GetRolePermissions(ctx, req.Role)
  121. if err != nil {
  122. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  123. return
  124. }
  125. v1.HandleSuccess(ctx, data)
  126. }
  127. // UpdateRolePermission godoc
  128. // @Summary 更新角色权限
  129. // @Schemes
  130. // @Description 更新指定角色的权限列表
  131. // @Tags 权限模块
  132. // @Accept json
  133. // @Produce json
  134. // @Security Bearer
  135. // @Param request body v1.UpdateRolePermissionRequest true "参数"
  136. // @Success 200 {object} v1.Response
  137. // @Router /v1/admin/role/permissions [put]
  138. func (h *AdminHandler) UpdateRolePermission(ctx *gin.Context) {
  139. var req v1.UpdateRolePermissionRequest
  140. if err := ctx.ShouldBind(&req); err != nil {
  141. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  142. return
  143. }
  144. err := h.adminService.UpdateRolePermission(ctx, &req)
  145. if err != nil {
  146. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  147. return
  148. }
  149. v1.HandleSuccess(ctx, nil)
  150. }
  151. // MenuUpdate godoc
  152. // @Summary 更新菜单
  153. // @Schemes
  154. // @Description 更新菜单信息
  155. // @Tags 菜单模块
  156. // @Accept json
  157. // @Produce json
  158. // @Security Bearer
  159. // @Param request body v1.MenuUpdateRequest true "参数"
  160. // @Success 200 {object} v1.Response
  161. // @Router /v1/admin/menu [put]
  162. func (h *AdminHandler) MenuUpdate(ctx *gin.Context) {
  163. var req v1.MenuUpdateRequest
  164. if err := ctx.ShouldBind(&req); err != nil {
  165. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  166. return
  167. }
  168. if err := h.adminService.MenuUpdate(ctx, &req); err != nil {
  169. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  170. return
  171. }
  172. v1.HandleSuccess(ctx, nil)
  173. }
  174. // MenuCreate godoc
  175. // @Summary 创建菜单
  176. // @Schemes
  177. // @Description 创建新的菜单
  178. // @Tags 菜单模块
  179. // @Accept json
  180. // @Produce json
  181. // @Security Bearer
  182. // @Param request body v1.MenuCreateRequest true "参数"
  183. // @Success 200 {object} v1.Response
  184. // @Router /v1/admin/menu [post]
  185. func (h *AdminHandler) MenuCreate(ctx *gin.Context) {
  186. var req v1.MenuCreateRequest
  187. if err := ctx.ShouldBind(&req); err != nil {
  188. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  189. return
  190. }
  191. if err := h.adminService.MenuCreate(ctx, &req); err != nil {
  192. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  193. return
  194. }
  195. v1.HandleSuccess(ctx, nil)
  196. }
  197. // MenuDelete godoc
  198. // @Summary 删除菜单
  199. // @Schemes
  200. // @Description 删除指定菜单
  201. // @Tags 菜单模块
  202. // @Accept json
  203. // @Produce json
  204. // @Security Bearer
  205. // @Param id query uint true "菜单ID"
  206. // @Success 200 {object} v1.Response
  207. // @Router /v1/admin/menu [delete]
  208. func (h *AdminHandler) MenuDelete(ctx *gin.Context) {
  209. var req v1.MenuDeleteRequest
  210. if err := ctx.ShouldBind(&req); err != nil {
  211. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  212. return
  213. }
  214. if err := h.adminService.MenuDelete(ctx, req.ID); err != nil {
  215. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  216. return
  217. }
  218. v1.HandleSuccess(ctx, nil)
  219. }
  220. // GetRoles godoc
  221. // @Summary 获取角色列表
  222. // @Schemes
  223. // @Description 获取角色列表
  224. // @Tags 角色模块
  225. // @Accept json
  226. // @Produce json
  227. // @Security Bearer
  228. // @Param page query int true "页码"
  229. // @Param pageSize query int true "每页数量"
  230. // @Param sid query string false "角色ID"
  231. // @Param name query string false "角色名称"
  232. // @Success 200 {object} v1.GetRolesResponse
  233. // @Router /v1/admin/roles [get]
  234. func (h *AdminHandler) GetRoles(ctx *gin.Context) {
  235. var req v1.GetRoleListRequest
  236. if err := ctx.ShouldBind(&req); err != nil {
  237. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  238. return
  239. }
  240. data, err := h.adminService.GetRoles(ctx, &req)
  241. if err != nil {
  242. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  243. return
  244. }
  245. v1.HandleSuccess(ctx, data)
  246. }
  247. // RoleCreate godoc
  248. // @Summary 创建角色
  249. // @Schemes
  250. // @Description 创建新的角色
  251. // @Tags 角色模块
  252. // @Accept json
  253. // @Produce json
  254. // @Security Bearer
  255. // @Param request body v1.RoleCreateRequest true "参数"
  256. // @Success 200 {object} v1.Response
  257. // @Router /v1/admin/role [post]
  258. func (h *AdminHandler) RoleCreate(ctx *gin.Context) {
  259. var req v1.RoleCreateRequest
  260. if err := ctx.ShouldBind(&req); err != nil {
  261. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  262. return
  263. }
  264. if err := h.adminService.RoleCreate(ctx, &req); err != nil {
  265. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  266. return
  267. }
  268. v1.HandleSuccess(ctx, nil)
  269. }
  270. // RoleUpdate godoc
  271. // @Summary 更新角色
  272. // @Schemes
  273. // @Description 更新角色信息
  274. // @Tags 角色模块
  275. // @Accept json
  276. // @Produce json
  277. // @Security Bearer
  278. // @Param request body v1.RoleUpdateRequest true "参数"
  279. // @Success 200 {object} v1.Response
  280. // @Router /v1/admin/role [put]
  281. func (h *AdminHandler) RoleUpdate(ctx *gin.Context) {
  282. var req v1.RoleUpdateRequest
  283. if err := ctx.ShouldBind(&req); err != nil {
  284. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  285. return
  286. }
  287. if err := h.adminService.RoleUpdate(ctx, &req); err != nil {
  288. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  289. return
  290. }
  291. v1.HandleSuccess(ctx, nil)
  292. }
  293. // RoleDelete godoc
  294. // @Summary 删除角色
  295. // @Schemes
  296. // @Description 删除指定角色
  297. // @Tags 角色模块
  298. // @Accept json
  299. // @Produce json
  300. // @Security Bearer
  301. // @Param id query uint true "角色ID"
  302. // @Success 200 {object} v1.Response
  303. // @Router /v1/admin/role [delete]
  304. func (h *AdminHandler) RoleDelete(ctx *gin.Context) {
  305. var req v1.RoleDeleteRequest
  306. if err := ctx.ShouldBind(&req); err != nil {
  307. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  308. return
  309. }
  310. if err := h.adminService.RoleDelete(ctx, req.ID); err != nil {
  311. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  312. return
  313. }
  314. v1.HandleSuccess(ctx, nil)
  315. }
  316. // GetApis godoc
  317. // @Summary 获取API列表
  318. // @Schemes
  319. // @Description 获取API列表
  320. // @Tags API模块
  321. // @Accept json
  322. // @Produce json
  323. // @Security Bearer
  324. // @Param page query int true "页码"
  325. // @Param pageSize query int true "每页数量"
  326. // @Param group query string false "API分组"
  327. // @Param name query string false "API名称"
  328. // @Param path query string false "API路径"
  329. // @Param method query string false "请求方法"
  330. // @Success 200 {object} v1.GetApisResponse
  331. // @Router /v1/admin/apis [get]
  332. func (h *AdminHandler) GetApis(ctx *gin.Context) {
  333. var req v1.GetApisRequest
  334. if err := ctx.ShouldBind(&req); err != nil {
  335. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  336. return
  337. }
  338. data, err := h.adminService.GetApis(ctx, &req)
  339. if err != nil {
  340. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  341. return
  342. }
  343. v1.HandleSuccess(ctx, data)
  344. }
  345. // ApiCreate godoc
  346. // @Summary 创建API
  347. // @Schemes
  348. // @Description 创建新的API
  349. // @Tags API模块
  350. // @Accept json
  351. // @Produce json
  352. // @Security Bearer
  353. // @Param request body v1.ApiCreateRequest true "参数"
  354. // @Success 200 {object} v1.Response
  355. // @Router /v1/admin/api [post]
  356. func (h *AdminHandler) ApiCreate(ctx *gin.Context) {
  357. var req v1.ApiCreateRequest
  358. if err := ctx.ShouldBind(&req); err != nil {
  359. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  360. return
  361. }
  362. if err := h.adminService.ApiCreate(ctx, &req); err != nil {
  363. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  364. return
  365. }
  366. v1.HandleSuccess(ctx, nil)
  367. }
  368. // ApiUpdate godoc
  369. // @Summary 更新API
  370. // @Schemes
  371. // @Description 更新API信息
  372. // @Tags API模块
  373. // @Accept json
  374. // @Produce json
  375. // @Security Bearer
  376. // @Param request body v1.ApiUpdateRequest true "参数"
  377. // @Success 200 {object} v1.Response
  378. // @Router /v1/admin/api [put]
  379. func (h *AdminHandler) ApiUpdate(ctx *gin.Context) {
  380. var req v1.ApiUpdateRequest
  381. if err := ctx.ShouldBind(&req); err != nil {
  382. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  383. return
  384. }
  385. if err := h.adminService.ApiUpdate(ctx, &req); err != nil {
  386. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  387. return
  388. }
  389. v1.HandleSuccess(ctx, nil)
  390. }
  391. // ApiDelete godoc
  392. // @Summary 删除API
  393. // @Schemes
  394. // @Description 删除指定API
  395. // @Tags API模块
  396. // @Accept json
  397. // @Produce json
  398. // @Security Bearer
  399. // @Param id query uint true "API ID"
  400. // @Success 200 {object} v1.Response
  401. // @Router /v1/admin/api [delete]
  402. func (h *AdminHandler) ApiDelete(ctx *gin.Context) {
  403. var req v1.ApiDeleteRequest
  404. if err := ctx.ShouldBind(&req); err != nil {
  405. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  406. return
  407. }
  408. if err := h.adminService.ApiDelete(ctx, req.ID); err != nil {
  409. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  410. return
  411. }
  412. v1.HandleSuccess(ctx, nil)
  413. }
  414. // AdminUserUpdate godoc
  415. // @Summary 更新管理员用户
  416. // @Schemes
  417. // @Description 更新管理员用户信息
  418. // @Tags 用户模块
  419. // @Accept json
  420. // @Produce json
  421. // @Security Bearer
  422. // @Param request body v1.AdminUserUpdateRequest true "参数"
  423. // @Success 200 {object} v1.Response
  424. // @Router /v1/admin/user [put]
  425. func (h *AdminHandler) AdminUserUpdate(ctx *gin.Context) {
  426. var req v1.AdminUserUpdateRequest
  427. if err := ctx.ShouldBind(&req); err != nil {
  428. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  429. return
  430. }
  431. if err := h.adminService.AdminUserUpdate(ctx, &req); err != nil {
  432. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  433. return
  434. }
  435. v1.HandleSuccess(ctx, nil)
  436. }
  437. // AdminUserCreate godoc
  438. // @Summary 创建管理员用户
  439. // @Schemes
  440. // @Description 创建新的管理员用户
  441. // @Tags 用户模块
  442. // @Accept json
  443. // @Produce json
  444. // @Security Bearer
  445. // @Param request body v1.AdminUserCreateRequest true "参数"
  446. // @Success 200 {object} v1.Response
  447. // @Router /v1/admin/user [post]
  448. func (h *AdminHandler) AdminUserCreate(ctx *gin.Context) {
  449. var req v1.AdminUserCreateRequest
  450. if err := ctx.ShouldBind(&req); err != nil {
  451. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  452. return
  453. }
  454. if err := h.adminService.AdminUserCreate(ctx, &req); err != nil {
  455. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  456. return
  457. }
  458. v1.HandleSuccess(ctx, nil)
  459. }
  460. // AdminUserDelete godoc
  461. // @Summary 删除管理员用户
  462. // @Schemes
  463. // @Description 删除指定管理员用户
  464. // @Tags 用户模块
  465. // @Accept json
  466. // @Produce json
  467. // @Security Bearer
  468. // @Param id query uint true "用户ID"
  469. // @Success 200 {object} v1.Response
  470. // @Router /v1/admin/user [delete]
  471. func (h *AdminHandler) AdminUserDelete(ctx *gin.Context) {
  472. var req v1.AdminUserDeleteRequest
  473. if err := ctx.ShouldBind(&req); err != nil {
  474. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  475. return
  476. }
  477. if err := h.adminService.AdminUserDelete(ctx, req.ID); err != nil {
  478. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  479. return
  480. }
  481. v1.HandleSuccess(ctx, nil)
  482. }
  483. // GetAdminUsers godoc
  484. // @Summary 获取管理员用户列表
  485. // @Schemes
  486. // @Description 获取管理员用户列表
  487. // @Tags 用户模块
  488. // @Accept json
  489. // @Produce json
  490. // @Security Bearer
  491. // @Param page query int true "页码"
  492. // @Param pageSize query int true "每页数量"
  493. // @Param username query string false "用户名"
  494. // @Param nickname query string false "昵称"
  495. // @Param phone query string false "手机号"
  496. // @Param email query string false "邮箱"
  497. // @Success 200 {object} v1.GetAdminUsersResponse
  498. // @Router /v1/admin/users [get]
  499. func (h *AdminHandler) GetAdminUsers(ctx *gin.Context) {
  500. var req v1.GetAdminUsersRequest
  501. if err := ctx.ShouldBind(&req); err != nil {
  502. v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
  503. return
  504. }
  505. data, err := h.adminService.GetAdminUsers(ctx, &req)
  506. if err != nil {
  507. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  508. return
  509. }
  510. v1.HandleSuccess(ctx, data)
  511. }
  512. // GetAdminUser godoc
  513. // @Summary 获取管理用户信息
  514. // @Schemes
  515. // @Description
  516. // @Tags 用户模块
  517. // @Accept json
  518. // @Produce json
  519. // @Security Bearer
  520. // @Success 200 {object} v1.GetAdminUserResponse
  521. // @Router /v1/admin/user [get]
  522. func (h *AdminHandler) GetAdminUser(ctx *gin.Context) {
  523. data, err := h.adminService.GetAdminUser(ctx, GetUserIdFromCtx(ctx))
  524. if err != nil {
  525. v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
  526. return
  527. }
  528. v1.HandleSuccess(ctx, data)
  529. }