精华内容
下载资源
问答
  • 毕业设计-在线选课系统
    千次阅读
    2021-01-10 09:20:54

    前言

    ​ 毕业设计真的就是demo吗?作为工作前的最后一个校园项目,毕业设计应当尽可能的贴近企业实战,业务不必很复杂,但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统,需求也比较简单。系统初始化后会默认创建一个admin超级管理员账号,以及三个初始化角色:

    1. 超级管理员角色。拥有所有菜单和所有按钮的权限
    2. 教师角色。拥有账号查询、课程模块增删改查、选课记录查询、院系查询、专业查询的权限。
    3. 学生角色。拥有课程查询、报名、退课、院系查询、专业查询的权限。

    超管会默认创建好所有老师和学生的账号,以及创建好所有的院系和专业(为什么不提供注册功能?主要是管理后台往往需要权限分配,你注册了账号你还是得找超管分配权限的,所以注册意义不大),老师则可以创建课程并设置何时报名,当报名开启后,学生可以进行课程报名,在课程报名截止前,学生可以退课并重新选课。具体实现请往下看~~~

    ​ (想要源码、文档、视频教程的同学请扫码加我微信。这里打个广告,学长多年bat工作经验,常年负责校招和社招面试,有兴趣的同学可以私信我,我可以提供简历辅导和内推~~~)

    image-20210131195045721

    工程架构

    应用分层

    image-20201226111957265

    上面的分层架构摘自阿里巴巴java开发手册,我对此做了一些调整,实际分层结构如下:

    image-20210109170439191

    领域模型

    • DO(DataObject):与数据库表结构一一对应,通过DAO层向上传输数据源对象

    • BO(BusinessObject):业务对象。由Service层输出的封装业务逻辑的对象

    • VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象

      BO和VO领域模型又分为BoRequest(输入模型)、BoResponse(输出模型)、VoRequest(输入模型)、VoResponse(输出模型)

    技术栈

    前端:vue + element

    后端:jdk1.8 + springboot + redis + mysql

    权限:security+spring-session

    系统设计

    表结构设计

    CREATE TABLE `account` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `passport` varchar(16) NOT NULL COMMENT '账号',
      `name` varchar(6) NOT NULL COMMENT '名称',
      `password` varchar(64) NOT NULL COMMENT '密码',
      `status` int(11) NOT NULL DEFAULT '0' COMMENT '用户状态',
      `role_id` bigint(20) NOT NULL COMMENT '角色',
      `email` varchar(32) NOT NULL COMMENT '邮箱',
      `phone` varchar(16) NOT NULL COMMENT '手机号',
      `address` varchar(64) DEFAULT NULL COMMENT '地址',
      `sex` int(11) NOT NULL DEFAULT '0' COMMENT '性别 0:女;1:男',
      `department_id` bigint(20) NOT NULL COMMENT '院系',
      `major_id` bigint(20) NOT NULL COMMENT '专业',
      `description` varchar(128) DEFAULT NULL COMMENT '备注',
      `last_login_time` bigint(20) DEFAULT NULL COMMENT '最近登录时间',
      `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
      `update_time` bigint(20) DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`),
      UNIQUE KEY `passport_UNIQUE` (`passport`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='账号'
    
    CREATE TABLE `role` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(32) NOT NULL COMMENT '角色名称',
      `description` varchar(128) DEFAULT NULL COMMENT '备注',
      `authorities` varchar(1024) NOT NULL COMMENT '权限列表',
      `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
      `update_time` bigint(20) DEFAULT '0' COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色表'
    
    CREATE TABLE `department` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(32) NOT NULL COMMENT '院系名称',
      `introduction` text COMMENT '简介',
      `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
      `update_time` bigint(20) DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='院系'
    
    CREATE TABLE `major` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(32) NOT NULL COMMENT '专业名称',
      `introduction` text COMMENT '简介',
      `department_id` bigint(20) NOT NULL COMMENT '院系',
      `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
      `update_time` bigint(20) DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='专业'
    
    CREATE TABLE `course` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(64) NOT NULL COMMENT '课程名称',
      `credit` int(11) NOT NULL COMMENT '学分',
      `class_time` int(11) NOT NULL COMMENT '课时',
      `teach_time` varchar(32) NOT NULL COMMENT '上课时间',
      `classroom` varchar(32) NOT NULL COMMENT '教室',
      `account_id` bigint(20) NOT NULL COMMENT '老师',
      `department_id` bigint(20) NOT NULL COMMENT '所属院系',
      `major_id` bigint(20) NOT NULL COMMENT '所属专业',
      `type` int(11) NOT NULL COMMENT '类型;1:选修课 2:必修课',
      `require_type` int(11) NOT NULL COMMENT '选课限制;1:同院系 2:同专业 3:无限制',
      `available_amount` int(11) NOT NULL COMMENT '剩余人数',
      `registration_time` bigint(20) NOT NULL COMMENT '报名时间',
      `registration_close_time` bigint(20) NOT NULL COMMENT '报名截止时间',
      `introduction` text COMMENT '简介',
      `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建时间',
      `update_time` bigint(20) DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8 COMMENT='课程'
    
    CREATE TABLE `course_record` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `course_id` bigint(20) NOT NULL COMMENT '课程',
      `account_id` bigint(20) NOT NULL COMMENT '学生',
      `create_time` bigint(20) NOT NULL DEFAULT '0' COMMENT '选课时间',
      `update_time` bigint(20) DEFAULT NULL COMMENT '更新时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='选课记录'
    
    CREATE TABLE `sys_log` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `passport` varchar(128) DEFAULT NULL COMMENT '账号',
      `url` varchar(255) DEFAULT NULL COMMENT '请求URL',
      `method` varchar(255) DEFAULT NULL COMMENT '请求方法',
      `params` varchar(2048) DEFAULT NULL COMMENT '请求参数',
      `ip` varchar(255) DEFAULT NULL COMMENT '请求ip',
      `cost` bigint(20) DEFAULT NULL COMMENT '请求耗时(单位毫秒)',
      `create_time` bigint(20) NOT NULL COMMENT '创建时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系统日志'
    

    接口设计

    ​ 整个项目接口采用的目前互联网比较流行的restful风格设计,每个接口、每个参数都有详细的文档说明。因为企业中开发必然是团队协作,必然前后端分离的开发模式,你得先把接口定义出来,然后前端可以和后端同步开发。还有一种就是对外提供接口,比如你们隔壁团队也想调用你这个服务的接口,但是你两排期是同一周,这时候你得先把接口定义出来给人家,然后大家同步开发,开发完了之后再进行联调。

    image-20210109170942550

    运行效果

    系统登录

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z545LhfN-1610241337747)(G:\doc\course\pic\选课系统登录页.jpg)]

    dashboard

    image-20210109172732351

    院系管理

    页面菜单、“查询”、“创建”、“编辑”、“删除”按钮都支持单独的权限分配

    image-20210109172905105

    专业管理

    每个院系都可以创建多个专业

    image-20210109200421795

    课程管理

    ​ 会给老师分配课程管理的所有权限,老师可以在创建课程,课程可以设置所属院系以及所属专业。如下图所示,可以设置“选课限制

    • 同院系”代表该课程只有“计算机科学与技术学院”的同学才能报名;
    • 同专业”代表该课程只有“软件工程专业”的同学才能报名;
    • 无限制”代表该课程任何同学都可以报名;

    剩余人数”代表还能报名多少人,这里其实也是一个难点,对于一个热门课程,几百人同时选课,剩余人数只有20,如何保证报名人数不超呢?目前方案是采用数据库乐观锁实现。

    报名时间”表示只有到了时间后才能开始选课,否则报名按钮是不展示的。

    截止时间”表示报名持续多少时间,到了截止时间后,报名按钮自动取消,无法再报名该课程。在报名截止时间之前,学生对于选课不满意的,可以“退课”并重新选择其他课程

    image-20210109200824409

    image-20210109202118777

    课程报名

    image-20210109203605640

    image-20210109203628393

    选课记录

    ​ 对于一门课,一个人只能报一次。所有人的报名结果可以在选课记录管理菜单中查看。

    在“所有选课”tab页,能查到所有人的报名记录

    在“我的选课”tab页,能查到当前用户的报名记录。支持多种查询条件,比如老师可以通过“老师名字”和“课程名字”来搜索有哪些学生报名了自己的课程,后面可以增加课程签到、在线考试、评分等功能(这块学长暂时没做,实现起来也很简单,大家可以自己去尝试)

    image-20210109203835717

    在“我的选课”tab页,当课程报名还未截止时,可以进行“退课”操作,“退课”后,选课记录会删除,同时选课的“剩余人数”会+1。

    image-20210109204251513

    退课

    image-20210109204554203

    image-20210109204630270

    日志管理

    ​ 日志管理默认是开给管理员的,在系统中的所有操作都会被记录,在系统出现异常时也便于管理员进行问题排查。

    image-20210109205429315

    用户管理

    ​ 默认也是只有管理员拥有用户管理菜单的权限,可以新建/编辑用户、分配用户角色、禁用/启用等操作

    image-20210109205522285

    编辑用户信息

    老师和学生对于系统来说都是用户,只不过老师和学生拥有不一样的权限。新建账号时必须选择“院系”、“专业”,这样对于课程有选课限制的,直接跟用户的院系、专业进行匹配,匹配失败的则不允许选课

    image-20210109205550343

    角色管理

    ​ 默认也是只有管理员拥有角色管理菜单的权限,这里的权限是细粒度到按钮权限的,每个按钮都可以进行权限管理,假如给学生只分配了课程的“查询”权限,但是这个学生是个程序员,他想通过接口请求直接访问课程修改接口,这时候后端是会权限校验的,返回“未授权”的错误码,然后前端根据“未授权”错误码会重定向到一个403页面(这也是为什么说只有前端校验是不安全的,后端也必须得校验,这在实际企业里开发也是这样的,还没有实际开发经验的学弟学妹拿个小本本记一记,哈哈哈)

    image-20210109205851517

    image-20210109213255384

    image-20210109205945188

    权限设计

    ​ 权限基于security和spring-session实现。权限可以分为认证和授权,认证其实就是登录,用户登录时会进行账号密码的校验,校验成功后会,会把session存入redis中。授权指的是用户是否拥有访问后端资源的权限,每个新用户在创建后都会分配角色,角色其实就是一个权限集合,这里的权限可以理解为访问后端一个个接口(资源)的权限。

    ​ 这里权限设计的非常灵活,细粒度到按钮级别,比如课程菜单的新增、删除、修改、查询动作,学生可能只有课程的查询权限,无法新增和修改课程,即使通过接口直接访问后端的修改或者新增接口,后端也会返回授权失败错误,因为后端每个需要权限的接口都打了权限标识,只有拥有资源权限用户才能访问。

    日志方案

    ​ 日志采用lombok注解+slf4j+log4j2的实现方案,基于profile实现了多环境的日志配置,因为不同环境的日志打印策略是不一样,比如开发环境我可能需要打印到console控制台,需要debug级别的日志以便于本地开发调试,测试环境可能就需要打印到日志文件里,线上环境可能需要打印到文件的同时将日志发送到kafka然后收集到es中,这样当线上部署了多台机器后我们查日志不用一台一台机器去查日志了,因为都收集到es了,我们只需要登录kibana去搜索,这样就非常方便。这里说到的kafka+es+kibana这样一套日志解决方案也是目前互联网公司比较常用的一套解决方案。如果你动手能力够强,你可以本地搭一套kafka、es、kibana,然后只需要在配置文件中加入几行配置就实现了这么一套企业级的日志解决方案(默认是输出到日志文件)。

    下面是部分关键配置,如果要配置kafka,只需要在标签中配置配置即可

        <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN"  xmlns:xi="http://www.w3.org/2001/XInclude">
        <Properties>
            <Property name="LOG_FILE">system.log</Property>
            <Property name="LOG_PATH">./logs</Property>
            <Property name="PID">????</Property>
            <Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
            <Property name="LOG_LEVEL_PATTERN">%5p</Property>
            <Property name="LOG_DATE_FORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
            <Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATE_FORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
            </Property>
            <Property name="FILE_LOG_PATTERN">%d{${LOG_DATE_FORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.}:%L : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}
            </Property>
        </Properties>
        <Appenders>
            <xi:include href="log4j2/file-appender.xml"/>
        </Appenders>
        <Loggers>
            <logger name="com.senior.book" level="info"/>
            <Root level="info">
                <AppenderRef ref="FileAppender"/>
            </Root>
        </Loggers>
    </Configuration>
    

    服务监控

    ​ 服务监控基于 Actuator + Prometheus + Grafana 实现,代码侵入很小,只需要在pom中加入依赖。数据大盘Dashboard可以自己设置,也可以去Dashboard市场下载你想要的模板,总之,这块完全是看动手能力,大家自己玩吧~~~

    		<!--服务监控-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-registry-prometheus</artifactId>
            </dependency>
    

    image-20201226110228490

    更多相关内容
  • java学生在线选课系统

    2020-12-25 07:01:26
    java学生在线选课系统,功能简单、界面简洁、struts+hibernate开发框架、mysql数据库
  • 采用java技术构建的一个管理系统。整个开发过程首先对系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计...
  • 该项目是我的本科毕业设计,一个基于B/S结构的学生在线选课系统网站;Java语言实现,采用SSH框架和Mysql5数据库。
  • 学生在线选课系统源码学生在线选课系统源码学生在线选课系统源码
  • 在线选课系统

    2014-06-19 23:02:54
    在线选课系统,具有读取数据库功能,可以实现选课,可以增加课程,具有身份登陆。
  • 在线选课系统源码

    2013-03-08 09:53:18
    该课程用于学生制作毕业设计所用技术asp.net
  • 学生在线选课系统

    2018-07-29 11:41:54
    学生在线选课系统基于asp.net的Web开发,具有学生选课,教师录入成绩,管理员管理学生以及教师等功能。
  • php+mysql实现的在线选课系统,实现了学生选课所需要的功能系统针对不同的用户角色进行管理,设定以下三种角色:学生、教师、管理员,不同角色对应不同权限的操作功能。 学生:查看可选课程、选择课程(不允许同时...
  • 校无忧网上选课系统为解决学生自主选课的所带来的繁琐工作问题,通过网上在线选择课程,完成个人选课信息,替代有纸化的手工操作。系统适用于教育机构、学校、企事业单位在互
  • 在线选课系统 完整源码,eclipse可以直接导入 自带数据库、使用说明、程序功能图、数据流图 1.windows系统 2.java环境和tomcat环境 3.mysql数据库 用户名root 密码root 4.eclipse(配置有spring插件)需配置jre和...
  • ASP基于BS结构的学生在线选课系统的实现(源代码+论文).zip
  • JAVA学生在线选课系统的设计与实现

    热门讨论 2012-11-17 10:47:43
    JAVA学生在线选课系统的设计与实现 学生在线选课系统主要使用JAVA语言进行编写,利用B/S结构,主要采用MVC模式。本系统主要用到了STRUTS技术和SPRING技术。通过MYSQL数据库对系统的基本数据进行存储。系统包括三个...
  • 采用eclipse和MySQL开发的学生在线选课系统。功能如下: 1、权限控制:采用过滤器实现用户登录和权限的控制。同时,每个学生一个账户(学号)可以登录系统进行个人信息的管理,并完成选课操作;管理员(固定为admin...
  • asp.net 在线选课系统

    2015-04-01 15:35:45
    使用vs2012中asp.net制作的在线选课系统,即时课程设计的题目
  • 一个在线选课系统,提供后台和前台两部分。后台可以进行相关数据管理与导入,以及选课发起!支持多次选课,支持新高考6选三,支持手机版选课,支持嵌入微信。支持在线进行选课数据分析,以及数据下载。支持区域...
  • 基于ASP。NET平台开发的软件。内附配置说明书,以及数据库,按照配置说明书即可使用
  • JAVA在线选课系统SSM实现源码使用ssm,mysql数据库,创建库Course_Selection_System,导入sql,修改jdbc.properties. 二、主要功能 学生登录后可以操作,我的资料,查看选课列表,管理选课。 教师登录后可以操作...
  • 学生网上在线选课系统含完整论文
  • 采用asp.net编写的选课系统, 界面精美。
  • ASP基于BS结构的学生在线选课系统的实现(源代码+论文).rar
  • jsp在线选课系统

    2013-09-29 12:58:35
    jsp在线选课系统
  • JSP在线选课系统

    2011-12-24 13:41:14
    系统实现了基本的在先选课,采用JAVA+SERVLET
  • ASP基于BS结构的学生在线选课系统的实现(源代码+论文).zip源码C#项目源码+资料打包下载ASP基于BS结构的学生在线选课系统的实现(源代码+论文).zip源码C#项目源码+资料打包下载 1.适合学生做毕业设计参考模板。 2.适合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,153
精华内容 41,261
关键字:

在线选课系统