AdminController.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.xuekairui.invite.controller;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import com.xuekairui.common.Result;
  4. import com.xuekairui.invite.dto.InviteConfigRequest;
  5. import com.xuekairui.invite.dto.InviteConversionStatsResponse;
  6. import com.xuekairui.invite.dto.InviteRewardResponse;
  7. import com.xuekairui.invite.dto.QuotaGrantRequest;
  8. import com.xuekairui.invite.entity.InviteConfig;
  9. import com.xuekairui.invite.service.InviteConfigService;
  10. import com.xuekairui.invite.service.InviteService;
  11. import com.xuekairui.user.dto.CrawlerUserDetailResponse;
  12. import com.xuekairui.user.entity.CrawlerQuotaGrant;
  13. import com.xuekairui.user.enums.OperationType;
  14. import com.xuekairui.user.service.OperationAuditLogService;
  15. import jakarta.servlet.http.HttpServletRequest;
  16. import jakarta.validation.Valid;
  17. import lombok.RequiredArgsConstructor;
  18. import org.springframework.web.bind.annotation.*;
  19. import java.util.List;
  20. /**
  21. * 运营管理接口 - 邀请配置与爬虫次数发放
  22. * 前缀: /api/admin
  23. */
  24. @RestController
  25. @RequestMapping("/api/admin")
  26. @RequiredArgsConstructor
  27. public class AdminController {
  28. private final InviteConfigService inviteConfigService;
  29. private final InviteService inviteService;
  30. private final OperationAuditLogService auditLogService;
  31. // ==================== 邀请配置管理 ====================
  32. /**
  33. * 获取当前生效的邀请配置
  34. * GET /api/admin/invite/config
  35. */
  36. @GetMapping("/invite/config")
  37. public Result<InviteConfig> getInviteConfig() {
  38. return Result.success(inviteConfigService.getActiveConfig());
  39. }
  40. /**
  41. * 更新当前生效的邀请配置(无则自动创建)
  42. * PUT /api/admin/invite/config
  43. */
  44. @PutMapping("/invite/config")
  45. public Result<InviteConfig> updateInviteConfig(@Valid @RequestBody InviteConfigRequest request,
  46. HttpServletRequest httpRequest) {
  47. Long operatorId = (Long) httpRequest.getAttribute("userId");
  48. String operatorRole = getOperatorRole(httpRequest);
  49. InviteConfig result = inviteConfigService.updateConfig(request);
  50. auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole,
  51. OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG", result.getId());
  52. return Result.success(result);
  53. }
  54. /**
  55. * 分页获取邀请配置列表
  56. * GET /api/admin/invite/configs?page=1&size=20
  57. */
  58. @GetMapping("/invite/configs")
  59. public Result<Page<InviteConfig>> listInviteConfigs(
  60. @RequestParam(defaultValue = "1") Integer page,
  61. @RequestParam(defaultValue = "20") Integer size) {
  62. return Result.success(inviteConfigService.listConfigs(page, size));
  63. }
  64. /**
  65. * 根据ID获取邀请配置
  66. * GET /api/admin/invite/config/{id}
  67. */
  68. @GetMapping("/invite/config/{id}")
  69. public Result<InviteConfig> getInviteConfigById(@PathVariable Long id) {
  70. return Result.success(inviteConfigService.getById(id));
  71. }
  72. /**
  73. * 创建新的邀请配置
  74. * POST /api/admin/invite/config
  75. */
  76. @PostMapping("/invite/config")
  77. public Result<InviteConfig> createInviteConfig(@Valid @RequestBody InviteConfigRequest request,
  78. HttpServletRequest httpRequest) {
  79. Long operatorId = (Long) httpRequest.getAttribute("userId");
  80. String operatorRole = getOperatorRole(httpRequest);
  81. InviteConfig result = inviteConfigService.createConfig(request);
  82. auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole,
  83. OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG_CREATE", result.getId());
  84. return Result.success(result);
  85. }
  86. /**
  87. * 更新指定ID的邀请配置
  88. * PUT /api/admin/invite/config/{id}
  89. */
  90. @PutMapping("/invite/config/{id}")
  91. public Result<InviteConfig> updateInviteConfigById(@PathVariable Long id,
  92. @Valid @RequestBody InviteConfigRequest request,
  93. HttpServletRequest httpRequest) {
  94. Long operatorId = (Long) httpRequest.getAttribute("userId");
  95. String operatorRole = getOperatorRole(httpRequest);
  96. InviteConfig result = inviteConfigService.updateConfig(id, request);
  97. auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole,
  98. OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG_UPDATE:" + id, id);
  99. return Result.success(result);
  100. }
  101. /**
  102. * 删除邀请配置
  103. * DELETE /api/admin/invite/config/{id}
  104. */
  105. @DeleteMapping("/invite/config/{id}")
  106. public Result<Void> deleteInviteConfig(@PathVariable Long id,
  107. HttpServletRequest httpRequest) {
  108. Long operatorId = (Long) httpRequest.getAttribute("userId");
  109. String operatorRole = getOperatorRole(httpRequest);
  110. inviteConfigService.deleteConfig(id);
  111. auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole,
  112. OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG_DELETE:" + id, id);
  113. return Result.success();
  114. }
  115. // ==================== 爬虫次数手动发放 ====================
  116. /**
  117. * 运营手动给用户发放爬虫次数
  118. * POST /api/admin/crawler/grant
  119. */
  120. @PostMapping("/crawler/grant")
  121. public Result<CrawlerQuotaGrant> grantCrawlerQuota(@Valid @RequestBody QuotaGrantRequest request,
  122. HttpServletRequest httpRequest) {
  123. Long operatorId = (Long) httpRequest.getAttribute("userId");
  124. String operatorRole = getOperatorRole(httpRequest);
  125. CrawlerQuotaGrant grant = inviteService.adminGrantQuota(request);
  126. auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole,
  127. OperationType.CRAWLER_QUOTA_GRANT, "CRAWLER_QUOTA:" + request.getUserId(), request.getUserId());
  128. return Result.success(grant);
  129. }
  130. /**
  131. * 查看发放记录
  132. * GET /api/admin/crawler/grants?userId=1&grantType=ADMIN
  133. */
  134. @GetMapping("/crawler/grants")
  135. public Result<List<com.xuekairui.user.dto.CrawlerQuotaGrantResponse>> listGrants(
  136. @RequestParam(required = false) Long userId,
  137. @RequestParam(required = false) String grantType) {
  138. return Result.success(inviteService.listGrants(userId, grantType));
  139. }
  140. // ==================== 邀请记录查看 ====================
  141. /**
  142. * 查看某用户的邀请奖励记录
  143. * GET /api/admin/invite/rewards?userId=1
  144. */
  145. @GetMapping("/invite/rewards")
  146. public Result<List<InviteRewardResponse>> listInviteRewards(
  147. @RequestParam(required = false) Long userId) {
  148. // 如果指定了userId,查看该用户的邀请记录;否则返回空(可扩展为全部)
  149. if (userId != null) {
  150. return Result.success(inviteService.getInviteRewards(userId));
  151. }
  152. return Result.success(List.of());
  153. }
  154. // ==================== 用户爬虫详情查询 ====================
  155. /**
  156. * 查看用户爬虫使用详情(含平台分布)
  157. * GET /api/admin/crawler/user-detail?userId=1
  158. */
  159. @GetMapping("/crawler/user-detail")
  160. public Result<CrawlerUserDetailResponse> getCrawlerUserDetail(@RequestParam Long userId) {
  161. return Result.success(inviteService.getCrawlerUserDetail(userId));
  162. }
  163. /**
  164. * 查看用户邀请转化统计(点击-注册转化率)
  165. * GET /api/admin/invite/conversion-stats?userId=1
  166. */
  167. @GetMapping("/invite/conversion-stats")
  168. public Result<InviteConversionStatsResponse> getInviteConversionStats(@RequestParam Long userId) {
  169. return Result.success(inviteService.getInviteConversionStats(userId));
  170. }
  171. private String getOperatorRole(HttpServletRequest request) {
  172. String role = (String) request.getAttribute("role");
  173. return role != null ? role : "ADMIN";
  174. }
  175. }