提交试卷+智能生成评价

server/2024/9/25 15:19:14/

文章目录

    • 1.提交试卷
        • 1.req和vo
          • 1.InterviewSubmitReq.java
          • 2.InterviewResultVO.java
        • 2.InterviewController.java
        • 3.service
          • 1.InterviewHistoryService.java
          • 2.InterviewHistoryServiceImpl.java
          • 3.InterviewEngine.java
          • 4.JiChiInterviewEngine.java
          • 5.EvaluateUtils.java
        • 4.测试
    • 2.将信息存到history表中
        • 1.InterviewHistoryService.java
        • 2.InterviewHistoryServiceImpl.java
        • 2.测试
          • 1.apipost
          • 2.debug
          • 3.db
            • 1.interview_history
            • 2.interview_question_history

1.提交试卷

1.req和vo
1.InterviewSubmitReq.java
package com.sunxiansheng.interview.api.req;import com.sunxiansheng.interview.api.enums.EngineEnum;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;import java.io.Serializable;
import java.util.List;@Getter
@Setter
public class InterviewSubmitReq implements Serializable {/*** 引擎*/private String engine = EngineEnum.JI_CHI.name();/*** pdf的url*/private String interviewUrl;/*** 问题列表*/private List<Submit> questionList;@Datapublic static class Submit {/*** 标签名*/private String labelName;/*** 题目名*/private String subjectName;/*** 题目答案*/private String subjectAnswer;/*** 用户答案*/private String userAnswer;/*** 用户分数*/private Double userScore;}}
2.InterviewResultVO.java
package com.sunxiansheng.interview.api.vo;import lombok.Getter;
import lombok.Setter;import java.io.Serializable;@Getter
@Setter
public class InterviewResultVO implements Serializable {/*** 平均分*/private Double avgScore;/*** 评价*/private String tips;/*** 平均评价*/private String avgTips;}
2.InterviewController.java
    /*** 面试提交答案*/@PostMapping(value = "/submit")public Result<InterviewResultVO> submit(@RequestBody InterviewSubmitReq req) {try {if (log.isInfoEnabled()) {log.info("面试提交入参{}", JSON.toJSON(req));}Preconditions.checkArgument(!Objects.isNull(req), "参数不能为空!");// 提交试卷:计算平均分之类的InterviewResultVO submit = interviewHistoryService.submit(req);// 智能生成评价// interviewHistoryService.logInterview(req, submit);return Result.ok(submit);} catch (IllegalArgumentException e) {log.error("参数异常!错误原因{}", e.getMessage(), e);return Result.fail(e.getMessage());} catch (Exception e) {log.error("分析简历异常!错误原因{}", e.getMessage(), e);return Result.fail("分析简历异常!");}}
3.service
1.InterviewHistoryService.java
    /*** 提交试卷,计算信息** @param req* @return*/InterviewResultVO submit(InterviewSubmitReq req);
2.InterviewHistoryServiceImpl.java
    /*** 提交试卷** @param req* @return*/@Overridepublic InterviewResultVO submit(InterviewSubmitReq req) {// 获取引擎String engine = req.getEngine();InterviewEngine interviewEngine = engineMap.get(engine);Preconditions.checkArgument(!Objects.isNull(interviewEngine), "引擎不能为空!");// 交给具体的引擎return interviewEngine.submit(req);}
3.InterviewEngine.java
    /*** 提交试卷*/InterviewResultVO submit(InterviewSubmitReq req);
4.JiChiInterviewEngine.java
@Override
public InterviewResultVO submit(InterviewSubmitReq req) {InterviewResultVO interviewResultVO = new InterviewResultVO();// 获取问题列表的信息List<InterviewSubmitReq.Submit> submits = req.getQuestionList();// 计算平均分double total = submits.stream().mapToDouble(InterviewSubmitReq.Submit::getUserScore).sum();double avg = total / submits.size();interviewResultVO.setAvgScore(avg);// 生成tipsString tips = submits.stream().map(item -> {String keyWord = item.getLabelName();String evaluate = EvaluateUtils.evaluate(item.getUserScore());return String.format(evaluate, keyWord);}).distinct().collect(Collectors.joining(";"));interviewResultVO.setTips(tips);// 生成平均tipsString avgTips = EvaluateUtils.avgEvaluate(avg);interviewResultVO.setAvgTips(avgTips);return interviewResultVO;
}
5.EvaluateUtils.java
package com.sunxiansheng.interview.server.util;import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.commons.lang3.RandomUtils;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class EvaluateUtils {private static final List<Evaluate> evaluates = build();private static List<Evaluate> build() {List<Evaluate> list = new ArrayList<>();list.add(new Evaluate(0, 3, "%s掌握较差,要加把劲"));list.add(new Evaluate(0, 3, "%s掌握不大行,还要努努力"));list.add(new Evaluate(0, 3, "%s掌握有点差,要加把劲"));list.add(new Evaluate(0, 3, "%s掌握有点离谱,多想群友讨教讨教"));list.add(new Evaluate(3, 4, "%s掌握还ok,努力再上一层楼"));list.add(new Evaluate(3, 4, "%s掌握还不错,带飞下群友吧"));list.add(new Evaluate(3, 4, "%s掌握好挺好的,分享下学习心得呗"));list.add(new Evaluate(3, 4, "%s掌握的不赖,不能太飘"));list.add(new Evaluate(4, Integer.MAX_VALUE, "%s掌握的很好,以后就看你的了"));list.add(new Evaluate(4, Integer.MAX_VALUE, "%s掌握的很6,是个天才"));list.add(new Evaluate(4, Integer.MAX_VALUE, "%s掌握太熟了,未来可期"));list.add(new Evaluate(4, Integer.MAX_VALUE, "%s掌握太猛,不愧是顶级程序员"));return list;}@Data@AllArgsConstructorprivate static class Evaluate {private double min;private double max;private String desc;}public static String avgEvaluate(double score) {if (score >= 0 && score < 3) {return "掌握较差";} else if (score >= 3 && score < 4) {return "掌握程度 ok";}return "掌握程度很好";}public static String evaluate(double score) {List<Evaluate> list = evaluates.stream().filter(item -> score >= item.getMin() && score < item.getMax()).collect(Collectors.toList());return list.get(RandomUtils.nextInt(0, list.size())).getDesc();}}
4.测试

CleanShot 2024-07-23 at 15.33.26@2x

CleanShot 2024-07-23 at 15.33.19@2x

2.将信息存到history表中

1.InterviewHistoryService.java
    /*** 将信息存到history表中** @param req* @param submit*/void logInterview(InterviewSubmitReq req, InterviewResultVO submit);
2.InterviewHistoryServiceImpl.java
    /*** 将信息存到interview_history表中** @param req* @param submit*/@Override@Transactional(rollbackFor = Exception.class)public void logInterview(InterviewSubmitReq req, InterviewResultVO submit) {// 获取信息Double avgScore = submit.getAvgScore();String avgTips = submit.getAvgTips();String interviewUrl = req.getInterviewUrl();List<Submit> questionList = req.getQuestionList();// 插入InterviewHistoryInterviewHistoryPo interviewHistoryPo = new InterviewHistoryPo();interviewHistoryPo.setAvgScore(avgScore);String keyWords = req.getQuestionList().stream().map(InterviewSubmitReq.Submit::getLabelName).distinct().collect(Collectors.joining("、"));interviewHistoryPo.setKeyWords(keyWords);interviewHistoryPo.setTip(avgTips);interviewHistoryPo.setInterviewUrl(interviewUrl);interviewHistoryPo.setCreatedBy(LoginUtil.getLoginId());interviewHistoryPo.setCreatedTime(new Date());interviewHistoryPo.setIsDeleted(0);// 这个插入会返回idthis.interviewHistoryMapper.insert(interviewHistoryPo);// 插入interview_question_history// 将questionList中的每一个元素map成interview_question_historyList<InterviewQuestionHistoryPo> interviewQuestionHistoryPoList = questionList.stream().map(question -> {InterviewQuestionHistoryPo interviewQuestionHistoryPo = new InterviewQuestionHistoryPo();interviewQuestionHistoryPo.setInterviewId(interviewHistoryPo.getId());interviewQuestionHistoryPo.setScore(question.getUserScore());interviewQuestionHistoryPo.setKeyWords(question.getLabelName());interviewQuestionHistoryPo.setQuestion(question.getSubjectName());interviewQuestionHistoryPo.setAnswer(question.getSubjectAnswer());interviewQuestionHistoryPo.setUserAnswer(question.getUserAnswer());interviewQuestionHistoryPo.setCreatedBy(LoginUtil.getLoginId());interviewQuestionHistoryPo.setCreatedTime(new Date());interviewQuestionHistoryPo.setIsDeleted(0);return interviewQuestionHistoryPo;}).collect(Collectors.toList());// 批量插入this.interviewQuestionHistoryMapper.insertBatch(interviewQuestionHistoryPoList);}
2.测试
1.apipost

CleanShot 2024-07-23 at 16.04.05@2x

2.debug

CleanShot 2024-07-23 at 16.02.15@2x

CleanShot 2024-07-23 at 16.03.43@2x

3.db
1.interview_history

CleanShot 2024-07-23 at 16.05.26@2x

2.interview_question_history

CleanShot 2024-07-23 at 16.05.51@2x


http://www.ppmy.cn/server/104336.html

相关文章

vue 中 dist文件夹静态是什么意思(distribution)

Vue打包为dist的命名并没有固定规定&#xff0c;dist是一个缩写词&#xff0c;代表distribution&#xff08;分发、发布&#xff09;的意思。在Vue项目中&#xff0c;将源代码经过编译、压缩等处理后打包为dist目录&#xff0c;是为了方便将项目部署到生产环境中。 具体来说&a…

阻塞队列对于实现异步日志系统的重要性

阻塞队列在多线程环境下被认为是安全的&#xff0c;是因为它内置了线程同步机制&#xff0c;能够确保多个线程在访问共享资源&#xff08;如队列&#xff09;时不会出现数据竞争问题。而非阻塞的实现方式并不是不安全的&#xff0c;但它需要开发者手动管理线程间的同步和资源保…

nginx部署vue前端打包项目

一、nginx安装 安装说明见&#xff1a;Nginx使用命令安装说明-CSDN博客 二、打包文件上传部署 将vue打包后的静态文件进行上传&#xff0c;打包后的目录如下&#xff1a; 将dist文件夹进行压缩为dist.zip&#xff0c;并将该目录打包上传至服务器的nginx目录&#xff1a; /usr…

React学习笔记,从入门到砸门

项目构建命令 npx create-react-app react-basic npx&#xff1a;node语法 create-react-app&#xff1a;项目模板 react-basic&#xff1a;项目名称 项目结构 项目打包和本地预览 项目打包npm run build本地预览&#xff08;模拟服务器运行项目&#xff09; 安装本地服务包…

水战再起波澜,“怡宝”要下好怎样一盘棋?

不少投资者常把那些刚需性强、永远也不可能淘汰的产业称为“日不落产业”&#xff0c;从细分板块来看&#xff0c;水无疑具有一定代表性。农夫山泉掌门人钟晱晱曾直言&#xff1a;“我选择了一个日不落的产业&#xff0c;你永远要喝水&#xff0c;不可能不喝水。” 多年下来&a…

读懂 GraphRAG:提升LLM企业落地能力,智能问答革命

在企业中单纯的使用LLM并不会产生太好的效果&#xff0c;因为它们不会对有关组织活动的特定领域专有知识进行编码&#xff0c;而这些知识实际上会给信息对话界面带来价值萃取。很多企业尝试通过RAG来优化这个过程&#xff0c;并且越来越多的人在RAG的方向上不断的研究&#xff…

PythonStudio 控件使用常用方式(二十七)TActionList

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

运维大规模K8S集群注意事项

序言 闲来无事&#xff0c;一片混沌&#xff0c;想不清思不断&#xff0c;改变好像来自于各个方面&#xff0c;有的时候是内部的冲突&#xff0c;有的时候是外部的竞争&#xff0c;然而&#xff0c;大部分情况下&#xff0c;一旦错过&#xff0c;就已经没得选了。 尴尬的处境&a…