package com.xuekairui.invite.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xuekairui.common.Result; import com.xuekairui.invite.dto.InviteConfigRequest; import com.xuekairui.invite.dto.InviteConversionStatsResponse; import com.xuekairui.invite.dto.InviteRewardResponse; import com.xuekairui.invite.dto.QuotaGrantRequest; import com.xuekairui.invite.entity.InviteConfig; import com.xuekairui.invite.service.InviteConfigService; import com.xuekairui.invite.service.InviteService; import com.xuekairui.user.dto.CrawlerUserDetailResponse; import com.xuekairui.user.entity.CrawlerQuotaGrant; import com.xuekairui.user.enums.OperationType; import com.xuekairui.user.service.OperationAuditLogService; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; /** * 运营管理接口 - 邀请配置与爬虫次数发放 * 前缀: /api/admin */ @RestController @RequestMapping("/api/admin") @RequiredArgsConstructor public class AdminController { private final InviteConfigService inviteConfigService; private final InviteService inviteService; private final OperationAuditLogService auditLogService; // ==================== 邀请配置管理 ==================== /** * 获取当前生效的邀请配置 * GET /api/admin/invite/config */ @GetMapping("/invite/config") public Result getInviteConfig() { return Result.success(inviteConfigService.getActiveConfig()); } /** * 更新当前生效的邀请配置(无则自动创建) * PUT /api/admin/invite/config */ @PutMapping("/invite/config") public Result updateInviteConfig(@Valid @RequestBody InviteConfigRequest request, HttpServletRequest httpRequest) { Long operatorId = (Long) httpRequest.getAttribute("userId"); String operatorRole = getOperatorRole(httpRequest); InviteConfig result = inviteConfigService.updateConfig(request); auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole, OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG", result.getId()); return Result.success(result); } /** * 分页获取邀请配置列表 * GET /api/admin/invite/configs?page=1&size=20 */ @GetMapping("/invite/configs") public Result> listInviteConfigs( @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer size) { return Result.success(inviteConfigService.listConfigs(page, size)); } /** * 根据ID获取邀请配置 * GET /api/admin/invite/config/{id} */ @GetMapping("/invite/config/{id}") public Result getInviteConfigById(@PathVariable Long id) { return Result.success(inviteConfigService.getById(id)); } /** * 创建新的邀请配置 * POST /api/admin/invite/config */ @PostMapping("/invite/config") public Result createInviteConfig(@Valid @RequestBody InviteConfigRequest request, HttpServletRequest httpRequest) { Long operatorId = (Long) httpRequest.getAttribute("userId"); String operatorRole = getOperatorRole(httpRequest); InviteConfig result = inviteConfigService.createConfig(request); auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole, OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG_CREATE", result.getId()); return Result.success(result); } /** * 更新指定ID的邀请配置 * PUT /api/admin/invite/config/{id} */ @PutMapping("/invite/config/{id}") public Result updateInviteConfigById(@PathVariable Long id, @Valid @RequestBody InviteConfigRequest request, HttpServletRequest httpRequest) { Long operatorId = (Long) httpRequest.getAttribute("userId"); String operatorRole = getOperatorRole(httpRequest); InviteConfig result = inviteConfigService.updateConfig(id, request); auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole, OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG_UPDATE:" + id, id); return Result.success(result); } /** * 删除邀请配置 * DELETE /api/admin/invite/config/{id} */ @DeleteMapping("/invite/config/{id}") public Result deleteInviteConfig(@PathVariable Long id, HttpServletRequest httpRequest) { Long operatorId = (Long) httpRequest.getAttribute("userId"); String operatorRole = getOperatorRole(httpRequest); inviteConfigService.deleteConfig(id); auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole, OperationType.INVITE_CONFIG_UPDATE, "INVITE_CONFIG_DELETE:" + id, id); return Result.success(); } // ==================== 爬虫次数手动发放 ==================== /** * 运营手动给用户发放爬虫次数 * POST /api/admin/crawler/grant */ @PostMapping("/crawler/grant") public Result grantCrawlerQuota(@Valid @RequestBody QuotaGrantRequest request, HttpServletRequest httpRequest) { Long operatorId = (Long) httpRequest.getAttribute("userId"); String operatorRole = getOperatorRole(httpRequest); CrawlerQuotaGrant grant = inviteService.adminGrantQuota(request); auditLogService.logSuccess(operatorId != null ? operatorId : 0L, "管理员", operatorRole, OperationType.CRAWLER_QUOTA_GRANT, "CRAWLER_QUOTA:" + request.getUserId(), request.getUserId()); return Result.success(grant); } /** * 查看发放记录 * GET /api/admin/crawler/grants?userId=1&grantType=ADMIN */ @GetMapping("/crawler/grants") public Result> listGrants( @RequestParam(required = false) Long userId, @RequestParam(required = false) String grantType) { return Result.success(inviteService.listGrants(userId, grantType)); } // ==================== 邀请记录查看 ==================== /** * 查看某用户的邀请奖励记录 * GET /api/admin/invite/rewards?userId=1 */ @GetMapping("/invite/rewards") public Result> listInviteRewards( @RequestParam(required = false) Long userId) { // 如果指定了userId,查看该用户的邀请记录;否则返回空(可扩展为全部) if (userId != null) { return Result.success(inviteService.getInviteRewards(userId)); } return Result.success(List.of()); } // ==================== 用户爬虫详情查询 ==================== /** * 查看用户爬虫使用详情(含平台分布) * GET /api/admin/crawler/user-detail?userId=1 */ @GetMapping("/crawler/user-detail") public Result getCrawlerUserDetail(@RequestParam Long userId) { return Result.success(inviteService.getCrawlerUserDetail(userId)); } /** * 查看用户邀请转化统计(点击-注册转化率) * GET /api/admin/invite/conversion-stats?userId=1 */ @GetMapping("/invite/conversion-stats") public Result getInviteConversionStats(@RequestParam Long userId) { return Result.success(inviteService.getInviteConversionStats(userId)); } private String getOperatorRole(HttpServletRequest request) { String role = (String) request.getAttribute("role"); return role != null ? role : "ADMIN"; } }