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