admin.go 16 KB

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