From 40164c6fc697bec898c899629b5bd302897641a9 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Tue, 05 Aug 2025 10:04:24 +0800 Subject: [PATCH] feat(ai): 新增答题功能 - 新增答题记录接口和相关实体类 - 实现开始答题、答题、提交和上一题功能 - 添加答题记录和题目相关查询接口 - 优化答题流程和数据结构 --- src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiQuestionItemInfoVo.java | 12 +++++ src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java | 9 ++++ src/main/java/cc/mrbird/febs/ai/controller/TestController.java | 87 +++++++++++++++++++++++++++++++++++++++++++ src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java | 1 4 files changed, 107 insertions(+), 2 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/ai/controller/TestController.java b/src/main/java/cc/mrbird/febs/ai/controller/TestController.java new file mode 100644 index 0000000..a019a22 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/ai/controller/TestController.java @@ -0,0 +1,87 @@ +package cc.mrbird.febs.ai.controller; + +import cc.mrbird.febs.ai.entity.AiMember; +import cc.mrbird.febs.ai.mapper.AiMemberMapper; +import cc.mrbird.febs.ai.req.product.ApiProductInfoDto; +import cc.mrbird.febs.ai.res.product.ApiProductInfoVo; +import cc.mrbird.febs.ai.utils.UUID; +import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.utils.AppContants; +import cc.mrbird.febs.common.utils.RedisUtils; +import cc.mrbird.febs.mall.entity.MallMember; +import cc.mrbird.febs.mall.mapper.MallMemberMapper; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.asymmetric.KeyType; +import cn.hutool.crypto.asymmetric.RSA; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Administrator + */ +@Slf4j +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/api/ai/test") +@Api(value = "ApiProductController", tags = "AI-登录测试") +public class TestController { + + private final MallMemberMapper mallMemberMapper; + private final AiMemberMapper aiMemberMapper; + private final RedisUtils redisUtils; + @ApiOperation(value = "登录测试", notes = "登录测试") + @GetMapping(value = "/login") + public FebsResponse info() { + + MallMember mallMember = mallMemberMapper.selectById(3634); + if(StrUtil.isEmpty(mallMember.getMemberUuid())){ + AiMember aiMember = new AiMember(); + aiMember.setId(UUID.getSimpleUUIDString()); + aiMemberMapper.insert(aiMember); + mallMember.setMemberUuid(aiMember.getId()); + mallMemberMapper.update(null, + Wrappers.lambdaUpdate(MallMember.class) + .set(MallMember::getMemberUuid, aiMember.getId()) + .eq(MallMember::getId, mallMember.getId()) + ); + } + // 存放redis + String redisKey = AppContants.XCX_LOGIN_PREFIX + mallMember.getId(); + String existToken = redisUtils.getString(redisKey); + if (StrUtil.isNotBlank(existToken)) { + Object o = redisUtils.get(existToken); + if (ObjectUtil.isNotEmpty(o)) { + redisUtils.del(existToken); + } + } + String token = IdUtil.simpleUUID(); + redisUtils.set(token, JSONObject.toJSONString(mallMember), -1); + redisUtils.set(redisKey, token, -1); + Map<String, Object> authInfo = new HashMap<>(); + authInfo.put("token", token); + authInfo.put("member", mallMember); + authInfo.put("rasToken", generateAsaToken(token)); + return new FebsResponse().success().data(authInfo); + } + + public String generateAsaToken(String token) { + RSA rsa = new RSA(null, AppContants.PUBLIC_KEY); +// return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey); + //去掉时间戳 + return rsa.encryptBase64(token, KeyType.PublicKey); + } +} diff --git a/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiQuestionItemInfoVo.java b/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiQuestionItemInfoVo.java index 0cb2483..11e6f90 100644 --- a/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiQuestionItemInfoVo.java +++ b/src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiQuestionItemInfoVo.java @@ -11,7 +11,10 @@ @ApiModel(value = "ApiQuestionItemInfoVo", description = "参数") public class ApiQuestionItemInfoVo { - @ApiModelProperty(value = "答案") + @ApiModelProperty(value = "正确答案ID") + private String answerID; + + @ApiModelProperty(value = "正确答案") private String answer; @ApiModelProperty(value = "答案解析") @@ -20,4 +23,11 @@ @ApiModelProperty(value = "用户回答状态 0-未回答 1-答对了 2-答错了") private Integer memberAnswerState; + + @ApiModelProperty(value = "题目数量") + private Integer questionCnt; + + @ApiModelProperty(value = "答题数量") + private Integer doneCnt; + } diff --git a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java index 9a1587e..4f81043 100644 --- a/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java @@ -104,6 +104,7 @@ } ApiMemberAnswerVo apiMemberAnswerVo = new ApiMemberAnswerVo(); + apiMemberAnswerVo.setMemberAnswerId(aiMemberAnswer.getId()); apiMemberAnswerVo.setName(aiProduct.getName()); apiMemberAnswerVo.setQuestionCnt(aiMemberAnswer.getQuestionCnt()); apiMemberAnswerVo.setDoneCnt(aiMemberAnswer.getDoneCnt()); @@ -184,6 +185,9 @@ aiMemberAnswerItem.setAnswer(aiProductQuestionItem.getId()); aiMemberAnswerItem.setCorrectAnswer(aiProductQuestionItem.getCorrectAnswer()); aiMemberAnswerItem.setAnswerAnalysis(aiProductQuestionItem.getAnswerAnalysis()); + + apiQuestionItemInfoVo.setAnswerID(aiProductQuestionItem.getId()); + apiQuestionItemInfoVo.setAnswer(aiProductQuestionItem.getAnswer()); } aiMemberAnswerItem.setMemberAnswerQuestionId(productQuestionItemId); aiMemberAnswerItem.setMemberAnswerState( @@ -191,6 +195,8 @@ ); if (aiMemberAnswerItem.getMemberAnswerState() == 2){ aiMemberAnswerItem.setIsCollected(1); + }else{ + aiMemberAnswerItem.setIsCollected(0); } aiMemberAnswerItemService.save(aiMemberAnswerItem); @@ -201,9 +207,10 @@ aiMemberAnswer.setUpdatedTime(createdTime); this.updateById(aiMemberAnswer); - apiQuestionItemInfoVo.setAnswer(aiMemberAnswerItem.getAnswer()); apiQuestionItemInfoVo.setAnswerAnalysis(aiMemberAnswerItem.getAnswerAnalysis()); apiQuestionItemInfoVo.setMemberAnswerState(aiMemberAnswerItem.getMemberAnswerState()); + apiQuestionItemInfoVo.setQuestionCnt(aiMemberAnswer.getQuestionCnt()); + apiQuestionItemInfoVo.setDoneCnt(aiMemberAnswer.getDoneCnt()); return new FebsResponse().success().data(apiQuestionItemInfoVo); } diff --git a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java index 68f0465..65b8ac5 100644 --- a/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java +++ b/src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java @@ -51,5 +51,6 @@ registration.excludePathPatterns("/api/ai/productCategory/**"); registration.excludePathPatterns("/api/ai/product/**"); registration.excludePathPatterns("/api/ai/productPoint/**"); + registration.excludePathPatterns("/api/ai/test/**"); } } -- Gitblit v1.9.1