基于Java,SpringBoot和Vue高考志愿填报辅助系统设计

摘要

本文聚焦于基于SpringBoot和Vue框架的高考志愿填报辅助系统的设计与研究。高考志愿填报作为考生人生重要抉择,关乎其未来发展方向,然而当前考生常因信息获取不全面、院校专业了解不足等面临诸多困扰。该系统设计旨在借助SpringBoot的高效后端开发能力和Vue的灵活前端交互优势,为考生提供一站式志愿填报辅助服务。系统涵盖了院校信息查询、专业详情介绍、录取分数线分析、志愿智能推荐等核心功能模块。通过对海量院校和专业数据的整合与分析,结合科学的算法模型,能够根据考生的高考成绩、兴趣爱好、地域偏好等个性化因素,为其精准推荐合适的院校和专业组合。同时,系统采用前后端分离架构,保障了系统的可扩展性、稳定性和用户体验的流畅性。经测试,该系统在数据准确性、功能完整性和用户操作便捷性等方面表现良好,能够有效帮助考生减轻志愿填报的压力,提高志愿填报的合理性和成功率,具有较高的实用价值和推广意义。

具体功能如下

学生用户拥有的功能如下:

注册、登录:未注册用户可以注册,有了账号后可以登录网站;

学校推荐:输入高考分数,系统给出符合条件的也就是该分数所能报考的院校信息。(使用加权平均算法);

专业推荐:输入各科成绩(根据考生强项给出推荐专业);

职业专业特点测评:提供MBIT测试,做测试之后给出类型、推荐职业、该职业所对应的专业信息;

高考志愿评估:输入考生已填写的志愿信息,系统做出一个综合评估,给出意见。(如:考生报考一个学校能被录取的可能性建议,使用豆包大模型的API。)

管理员拥有以下功能:

学校管理:管理员可以对学校信息进行管理;

专业管理:管理员可以对专业信息进行管理;

志愿管理:管理员可以对志愿信息进行管理,学生用户可以选择填报志愿,并由管理员审核;

用户管理:管理员可以对学生用户的信息进行管理;

用到的技术

后端:java语言,SpringBoot框架,MySQL数据库,Maven依赖管理等;

前端:vue等。

学校推荐算法代码

java 复制代码
public List<NmExamHistory> dealData(List<NmExamHistory> all,SysUser user){
        //加权平均规则
        //1 本科1批 200 2批120 3批60 专科 20 占据 0.3
        //2 距离 50内 100 200内 80 500内 50 1000内 20 1000+ 10 占0.15
        //3 211加成 160 985加成 200 占 0.3
        //4 录取平均分占0.25
        for(NmExamHistory his:all){
            his.setScore(oneCount(his,user));
        }
        // 自定义 Comparator 实现降序排序
        Comparator<NmExamHistory> descendingComparator = new Comparator<NmExamHistory>() {
            @Override
            public int compare(NmExamHistory b2, NmExamHistory b1) {
                b2.setScore(b2.getScore()==null?0d:b2.getScore());
                b1.setScore(b1.getScore()==null?0d:b1.getScore());
                return Double.compare(b1.getScore(),b2.getScore());
            }
        };
        Collections.sort(all, descendingComparator);
        return all;
    }

    public double oneCount(NmExamHistory his,SysUser user) {
        double count = his.getAvgScore()*0.25;
        if(his.getIs211() == 1){
            count += 160*0.3;
        } else if (his.getIs985() == 1) {
            count += 200*0.3;
        }

        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("city",user.getCity());
        List<NmExamAreaCoordinates> po = nmExamAreaCoordinatesMapper.selectList(queryWrapper);
        double lat = 0l;
        double lng = 0l;
        if(!po.isEmpty() && his.getLat()!=null &&his.getLng()!=null){
            lat = po.get(0).getLat();
            lng = po.get(0).getLng();
            double dist = 1000d;
            try{
                dist = calculateDistance(lat,lng,his.getLat(), his.getLng());
            }catch (Exception e){
                dist = 1000d;
            }
            if(dist <=50){
                dist = 100d;
            }else if(dist <= 200){
                dist =  80d;
            }else if(dist <= 500){
                dist =  50d;
            }else if(dist <= 1000){
                dist =  20d;
            }else{
                dist =  10d;
            }
            count += dist*0.15;
        }
        double sc = 0;
        if(his.getType() == 0){
            sc = 20;
        }
        if(his.getType() == 1){
            sc = 60;
        }
        if(his.getType() == 2){
            sc = 120;
        }
        if(his.getType() == 3){
            sc = 100;
        }
        count += sc*0.3;
        if(his.getLat()!=null&&his.getLng()!=null){
            his.setDist(calculateDistance(lat,lng,his.getLat(),his.getLng()));
        }
        return count;
    }

    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        try{
            // 将纬度和经度从度转换为弧度
            double lat1Rad = Math.toRadians(lat1);
            double lon1Rad = Math.toRadians(lon1);
            double lat2Rad = Math.toRadians(lat2);
            double lon2Rad = Math.toRadians(lon2);

            // 计算纬度和经度的差值
            double dLat = lat2Rad - lat1Rad;
            double dLon = lon2Rad - lon1Rad;

            // 使用 Haversine 公式计算距离
            double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                    Math.cos(lat1Rad) * Math.cos(lat2Rad) *
                            Math.sin(dLon / 2) * Math.sin(dLon / 2);
            double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

            // 计算最终距离 6371为地球半径
            return 6371 * c;
        }catch (Exception e){
            return 1000;
        }

    }
    
    /**
     * 查询一条数据
     *
     * @param nmExamHistory 查询条件
     * @return 对象
     */
    public ResponseResult<Object> queryNmExamHistoryObject(NmExamHistory nmExamHistory) {
        QueryWrapper<NmExamHistory> queryWrapper = new QueryWrapper<NmExamHistory>(nmExamHistory);
        return new ResponseResult<Object>(ResponseCode.SUCCESS,"查询成功",nmExamHistoryMapper.selectOne(queryWrapper));
    }
    
    /**
     * 新增一条数据
     *
     * @param nmExamHistory 新增数据实体类
     * @return 新增对象
     */
    public ResponseResult<Object> addNmExamHistory(NmExamHistory nmExamHistory) {
        int uid = SessionUtils.getUserId();
        nmExamHistory.setId(null);
        nmExamHistory.setValidFlag(1);
        nmExamHistory.setCreateTime(new Date());
        nmExamHistory.setUpdateTime(new Date());
        nmExamHistory.setCreater(uid);
        nmExamHistory.setUpdater(uid);
        nmExamHistoryMapper.insert(nmExamHistory);
        return new ResponseResult<Object>(ResponseCode.SUCCESS,"新增成功",nmExamHistory);
    }
    
    /**
     * 修改一条数据
     *
     * @param nmExamHistory 修改数据实体类
     * @return 修改后对象
     */
    public ResponseResult<Object> editNmExamHistory(NmExamHistory nmExamHistory) {
        int uid = SessionUtils.getUserId();
        nmExamHistory.setUpdateTime(new Date());
        nmExamHistory.setUpdater(uid);
        nmExamHistoryMapper.updateById(nmExamHistory);
        return new ResponseResult<Object>(ResponseCode.SUCCESS,"修改成功",nmExamHistory);
    }

    public ResponseResult<Object> dealData(MultipartFile file){
        try{
            String fileName = file.getOriginalFilename();

            int typ = 4;//专科,本科 1 2 3


            for(int i=0;i<typ;i++){
                List<List<Object>> dataList = ExcelUtil.readExcelSheet(file.getInputStream(),fileName,i);

                int flag = i;
                if(i == 1 ){
                    flag =3;
                }
                if(i == 2 ){
                    flag =2;
                }
                if(i == 3 ){
                    flag = 1;
                }
                dealData(dataList,flag);
            }

            //return CommonUtils.ResBuild(true,msg);
        }catch (Exception e){
            e.printStackTrace();
            //return CommonUtils.ResBuild(true,"导入失败");
        }
        return null;
    }
    public void dealData(List<List<Object>> dataList,Integer type){
        StringBuilder msg = new StringBuilder("导入完成");
        for (int i=1; i<dataList.size(); i++){
            JSONArray data = new JSONArray(dataList.get(i));
            String uName = data.getString(5);
            int year = 2024;
            for(int k=0;k<5;k++){
                try{

                    if("--".equals(data.getString(6+k*3)) || "-".equals(data.getString(6+k*3))){
                        continue;
                    }

                    if("--".equals(data.getString(7+k*3)) || "-".equals(data.getString(7+k*3))){
                        continue;
                    }

                    if("--".equals(data.getString(8+k*3)) || "-".equals(data.getString(8+k*3))){
                        continue;
                    }

                    Float minScore = data.getFloat(6+k*3);
                    Integer minIndex = data.getInteger(7+k*3);
                    Float avgScore = data.getFloat(8+k*3);
                    editNmExamHistory(year-k,minScore,minIndex,avgScore,uName,type);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }

        }

    }

演示视频

Java,SpringBoot和Vue高考志愿填报辅助系统

相关推荐
爱笑的源码基地30 分钟前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
慧一居士2 小时前
Element Plus 按需引入的配置使用说明和完整示例
前端·vue.js
莫逸风3 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
隔窗听雨眠3 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
z123456789864 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin5211234 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员4 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风33665 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李5 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
CoderWeen6 小时前
我写了个能一步步点着看的 Dijkstra 可视化项目(Vue3 + Leaflet + Generator)
前端·javascript·vue.js