提交试卷+智能生成评价

news2024/9/19 8:46:53

文章目录

    • 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;

    @Data
    public 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
     */
    @Override
    public 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);
    // 生成tips
    String 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);
    // 生成平均tips
    String 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
    @AllArgsConstructor
    private 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();
        // 插入InterviewHistory
        InterviewHistoryPo 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);
        // 这个插入会返回id
        this.interviewHistoryMapper.insert(interviewHistoryPo);
        // 插入interview_question_history
        // 将questionList中的每一个元素map成interview_question_history
        List<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.coloradmin.cn/o/2065486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端基础篇】CSS基础速通万字介绍(下篇)

文章目录 前言背景属性背景颜色背景图片背景平铺背景位置背景尺寸 圆角矩形生成圆形生成圆角矩形 Chrome调试工具打开方式标签页含义elements标签页使用 元素显示模式块级元素行内元素/内联元素行内元素和块级元素的区别 盒模型边框内边距外边距 块级元素水平居中去除浏览器默认…

凤凰花:绚烂花语与独特魅力

一、凤凰花的花语内涵 凤凰花的花语丰富而深刻&#xff0c;蕴含着多种情感和意义。 思念&#xff0c;是凤凰花常见的花语之一。它那鲜艳的花朵绽放在枝头&#xff0c;远眺着远方&#xff0c;仿佛在传递着对朋友和亲人深深的牵挂与想念。这种思念&#xff0c;如同苦涩的咖啡&am…

Cesium 视频纹理

Cesium 视频纹理 话不多说&#xff0c;直接上代码 <video id"video_dom"><source src"./video.mp4" type"video/mp4" /></video>var videoElement document.getElementById("video_dom");videoElement.play();vie…

数据处理新纪元:2024热门PDF转Excel工具集

当PDF文件中的数据需要被进一步分析、编辑或应用于电子表格中时&#xff0c;将其转换为Excel格式便成为了一项不可或缺的任务。本文将为你盘点几款当前最为热门的pdf转换成excel的工具&#xff0c;帮助你轻松实现数据格式的转换&#xff0c;提升工作效率。 1.福昕PDF转换大师 …

MySQL基础:事务

&#x1f48e;所属专栏&#xff1a;MySQL &#x1f48e;1. 事务 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 例如转账…

【目标检测】模型评估指标

目标检测模型评价指标&#xff1a;准确度(accuracy)、精确率&#xff08;precision)、召回率&#xff08;recall&#xff09;、交正比&#xff08;IoU&#xff09;、F1 Score等 1、目标检测模型评价指标 在 目标检测 任务中&#xff0c;常用的性能指标主要包括 检测精度指标 和…

Linux下opencv报错 undefined reference to cv::imread cv::Mat

如果你是和libtorch一起使用&#xff0c;那么请你继续&#xff0c;否则该篇文章不适合你。 正文 在https://pytorch.org/下 下载的时候要选择Cxx11 ABI版 随后正常配置就可以了

Leetcode JAVA刷刷站(79)单词搜索

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;我们可以使用深度优先搜索&#xff08;DFS&#xff09;或广度优先搜索&#xff08;BFS&#xff09;来遍历网格中的字符&#xff0c;并检查是否能形成给定的单词。这里&#xff0c;我提供一个基于DFS的解决方案。 在DFS中…

拆解简单的两种固定很简陋的无刷风扇,改造自己小风扇

两种风扇功能 一种是用于电脑主机降温的&#xff0c;另一种是挂脖风扇的一个&#xff0c;拆开之后才知道固定底座很简陋 拆解降温风扇 最后分离定子和支架 个人还是不喜欢暴力拆解的&#xff0c;但尝试后发现&#xff0c;这个不暴力拆不掉&#xff0c;固定的塑料和上面定子…

python实现链表

什么是链表 链表是由一系列节点组成的元素集合。每个节点包含两部分&#xff0c;数据域item和指向下一个节点的指针next。通过节点之间的相互连接最终串联成一个链表。 python实现一个简单链表 我们可以用python实现一个超级简单的链表 class node:# 初始化数据def __init_…

Golang | Leetcode Golang题解之第367题有效的完全平方数

题目&#xff1a; 题解&#xff1a; func isPerfectSquare(num int) bool {x0 : float64(num)for {x1 : (x0 float64(num)/x0) / 2if x0-x1 < 1e-6 {x : int(x0)return x*x num}x0 x1} }

正则表达式备查

一、常用 符号内容\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如&#xff0c;“n”匹配字符“n”。“\n”匹配换行符。序列“\”匹配“\”&#xff0c;“(”匹配“(”。^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性&#xff0c;^ 还…

Dumpy:一款针对LSASS数据的动态内存取证工具

关于Dumpy Dumpy是一款针对LSASS数据的动态内存取证工具&#xff0c;该工具专为红队和蓝队研究人员设计&#xff0c;支持重新使用打开的句柄来动态转储 LSASS。 运行机制 Dumpy可以动态调用 MiniDumpWriteDump 来转储 lsass 内存内容。此过程无需打开 lsass 的新进程句柄&…

海山数据库(He3DB)+AI:(一)神经网络基础

文章目录 1 引言2 基本结构2.1 神经元2.2 模型结构 3 训练过程3.1 损失函数3.2 反向传播3.3 基于梯度的优化算法 4 总结 1 引言 神经网络可以被视为一个万能的拟合器&#xff0c;通过深层的隐藏层实现输入数据到输出结果的映射。神经网络的思想源于对大脑的模拟&#xff0c;在…

【源码+文档+调试讲解】病房管理系统设计与实现

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

springboot集成海康sdk,针对视频流获取某一点的实时温度

直接上代码吧: 前端页面专递点的x和y的坐标及其设备的ip @RequestMapping(value = "/getRealTemperatureByPoint") public float getRealTemperatureByPoint(HttpServletRequest request) {Map<String, Object> params = ParamUtil.getParams(request);Strin…

vue elementPlus中使用dayjs

安装了elementPlus后无需再次下载dayjs,因为element 中包含了dayjs 官网截图 引入方法&#xff1a; import { dayjs } from element-plus// 引入中文包 import dayjs/locale/zh-cn dayjs.locale(zh-cn) // 设置中文 使用方法和dayjs 官网一致 const state reactive({week…

Linux 安装TELEPORT堡垒机

一、查看官方文档 堡垒机官网地址&#xff1a;走向成功 - Teleport&#xff0c;高效易用的堡垒机 &#xff08;一&#xff09;官网资源链接 -》Teleport 在线文档 &#xff08;二&#xff09;手动下载安装包 二、压缩包下载和安装 &#xff08;一&#xff09;加压下载的安装…

实现高效研发运营一体化:深度落地DevOps解决方案的探索与实践

前言与概述 伴随着企业业务的快速发展&#xff0c;为了支撑业务发展&#xff0c;提高 IT 对业务的支撑能力建设。在研发工程协同方面&#xff0c;希望加强代码管理&#xff0c;实现持续构建、自动化测试、自动化部署、自动化运维&#xff0c;同时加强产品的安全和质量管理&…

VBA调用Office的MODI组件识别图片中的文字

Microsoft Office Document Imaging (MODI)是Office 2003-2007版本中的一个利用OCR&#xff08;Optical Character Recognition 光学字符识别&#xff09;技术识别图像中的文字并转换为文本的一个组件。在VBA中使用该组件需要在“工具-引用”中将其设置为“可使用的引用”&…