feat(purchase): 新增主题购买全流程接口

新增主题购买功能,包括余额校验、订单生成、交易记录等完整流程。同时扩展错误码支持余额不足、主题不存在等场景。
This commit is contained in:
2025-12-10 19:40:27 +08:00
parent 4f56541913
commit 22b97b99aa
9 changed files with 225 additions and 13 deletions

View File

@@ -1,19 +1,20 @@
package com.yolo.keyborad.controller;
import cn.dev33.satoken.stp.StpUtil;
import com.yolo.keyborad.common.BaseResponse;
import com.yolo.keyborad.common.ResultUtils;
import com.yolo.keyborad.model.dto.purchase.ThemePurchaseReq;
import com.yolo.keyborad.model.vo.purchase.ThemePurchaseRespVO;
import com.yolo.keyborad.model.vo.themes.KeyboardThemeStylesRespVO;
import com.yolo.keyborad.model.vo.themes.KeyboardThemesRespVO;
import com.yolo.keyborad.service.KeyboardThemePurchaseService;
import com.yolo.keyborad.service.KeyboardThemeStylesService;
import com.yolo.keyborad.service.KeyboardThemesService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -33,6 +34,9 @@ public class ThemesController {
@Resource
private KeyboardThemeStylesService keyboardThemeStylesService;
@Resource
private KeyboardThemePurchaseService themePurchaseService;
@GetMapping("/listByStyle")
@Operation(summary = "按风格查询主题", description = "按主题风格查询主题列表接口")
@@ -46,5 +50,12 @@ public class ThemesController {
return ResultUtils.success(keyboardThemeStylesService.selectAllThemeStyles());
}
@PostMapping("/purchase")
@Operation(summary = "购买主题", description = "购买主题接口,扣减用户余额")
public BaseResponse<ThemePurchaseRespVO> purchaseTheme(@RequestBody ThemePurchaseReq req) {
Long userId = StpUtil.getLoginIdAsLong();
ThemePurchaseRespVO result = themePurchaseService.purchaseTheme(userId, req.getThemeId());
return ResultUtils.success(result);
}
}