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