基于SpringBoot的遗传算法排课系统前后端分离系统计算机毕业设计

前言:我是天码编程,从事计算机开发行业数年,专注Java程序设计开发、源码分享、技术指导和毕业设计
在这里插入图片描述

项目名
基于SpringBoot的遗传算法排课系统

技术栈
SpringBoot+Vue+MySQL+Maven+阿里云OSS

一、环境介绍

1.1 运行环境

开发语言:Java
数据库:MySQL
系统架构:B/S
后端:SpringBoot(MyBatis)
图片上传:阿里云OSS
前端:Vue
工具:IDEA,JDK1.8,Maven

二、系统介绍

2.1 功能模块

  • 系统角色:管理员、讲师、学生
  • 管理员:登录、系统数据、排课管理、课程管理、讲师管理、学生管理、教学资料管理、教学设施管理
  • 教师:登录、系统数据、查看课表、课程管理、班级管理、学生管理、教学资料管理
  • 学生:登录、查看课表、查看下载学习文档、查询空教室、个人中心、修改密码

2.2 系统架构

该项目是前后端分离
前端端口:8081
后端端口:8080

三、系统展示

3.1部分功能图文展示

管理员讲师登陆界面:
管理员登陆界面

排课管理页面:

排课管理页面

班级管理页面:

班级管理页面

讲师管理页面:

讲师管理页面
学生管理页面:

在这里插入图片描述

教材管理页面:

教材管理页面
教室管理页面:

教室管理页面
教学楼管理页面:

教学楼管理页面
课程类别管理页面:

课程类别管理页面
在线测试管理页面:

在线测试管理页面

四、部分代码设计

4.1.后端部分代码

/**
     * 排课算法入口
     * @param
     * @return
     */
    @Transactional
    @Override
    public ServerResponse classScheduling(String semester) {
        try {
            log.info("开始排课,时间:" + System.currentTimeMillis());
            long start = System.currentTimeMillis();
            // 1、获得开课任务
//            List<ClassTask> classTaskList = classTaskDao.selectBySemester(classTask);
            QueryWrapper<ClassTask> wrapper = new QueryWrapper<ClassTask>().eq("semester", semester);
            List<ClassTask> classTaskList = classTaskDao.selectList(wrapper);
            // 没有任务,排课失败
            if (classTaskList == null) {
                return ServerResponse.ofError("排课失败,查询不到排课任务!");
            }
            // 2、将开课任务的各项信息进行编码成染色体,分为固定时间与不固定时间
            List<Map<String, List<String>>>  geneList = coding(classTaskList);
            // 3、给初始基因编码随机分配时间,得到同班上课时间不冲突的编码
            List<String> resultGeneList = codingTime(geneList);
            // 4、将分配好时间的基因编码以班级分类成为以班级的个体,得到班级的不冲突时间初始编码
            Map<String, List<String>> individualMap = transformIndividual(resultGeneList);
            // 5、遗传进化
            individualMap = geneticEvolution(individualMap);
            // 6、分配教室并做教室冲突检测
            List<String> resultList = finalResult(individualMap);
            // 7、解码最终的染色体获取其中的基因信息
            List<CoursePlan> coursePlanList = decoding(resultList);
            // 8、写入tb_course_plan上课计划表
            coursePlanDao.deleteAllPlan(); // 先删除原来的课程计划
            for (CoursePlan coursePlan : coursePlanList) {
                coursePlanDao.insertCoursePlan(coursePlan.getGradeNo(), coursePlan.getClassNo(), coursePlan.getCourseNo(),
                        coursePlan.getTeacherNo(), coursePlan.getClassroomNo(), coursePlan.getClassTime(), semester);
            }
            log.info("完成排课,耗时:" + (System.currentTimeMillis() - start));
            return ServerResponse.ofSuccess("排课成功!");
        } catch (Exception e) {
            log.error("the error message is:" + "    " + e.getMessage());
            e.printStackTrace();
            return ServerResponse.ofError("排课失败,出现异常!");
        }
    }

/**
     * 文件上传成功返回路径
     * @param file
     * @param directory 选择需要上传到的目录下面,暂时不用,原本想将用户头像、其他文件上传到不同的目录下面的
     * @return
     */
    public static Map<String, Object> upload(MultipartFile file, String directory) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        String url = "";
        try {
            // 获取输入流
            InputStream inputStream = file.getInputStream();
            String fileName = file.getOriginalFilename();
            //1 在文件名称里面添加随机唯一的值
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            // 随机id
            String newFileName = uuid + fileName;
            // 上传
            ossClient.putObject(bucketName, fileName, inputStream);
            // 关闭OSSClient。
            ossClient.shutdown();
            url = "https://" + bucketName + "." + endpoint + "/" + fileName;
            System.out.println("url========" + url);
            Map<String, Object> map = new HashMap<>();
            map.put("url", url);
            map.put("name", fileName);
            return map;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

总结

麻烦大家帮忙点赞、收藏、关注、评论啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值