feat(ai): 新增答题功能
- 新增答题记录接口和相关实体类
- 实现开始答题、答题、提交和上一题功能
- 添加答题记录和题目相关查询接口
- 优化答题流程和数据结构
3 files modified
1 files added
109 ■■■■■ changed files
src/main/java/cc/mrbird/febs/ai/controller/TestController.java 87 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/memberAnswer/ApiQuestionItemInfoVo.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiMemberAnswerServiceImpl.java 9 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/controller/TestController.java
New file
@@ -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);
    }
}
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;
}
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);
    }
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/**");
    }
}