基于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高考志愿填报辅助系统

相关推荐
超级无敌新新手小白43 分钟前
Java----用正则表达式爬取数据
java·爬虫
王达舒19941 小时前
Spring Boot中定时任务Cron表达式的终极指南
java·spring boot·后端
王强你强1 小时前
Spring Boot 启动参数终极解析:如何优雅地控制你的应用?
java·spring boot·后端
Lonwayne1 小时前
当编程语言有了人格
java·javascript·c++·python·php
qq_589568102 小时前
java学习笔记——多线程
java·笔记·学习·intellij-idea
编程的大耳朵2 小时前
Java 实现将Word 转换成markdown
java·word
兰德里的折磨5502 小时前
对于后端已经实现逻辑了,而前端还没有设置显示的改造
前端·vue.js·elementui
nlog3n2 小时前
MySQL 常见面试问题总结
java·数据库·mysql·面试
小灰灰是码农...2 小时前
java中的泛型和反射
java·反射·泛型