基于Springboot和Redis实现的在线选课系统
1.项目简介
1.1 介绍
毕业设计真的就是demo吗?作为工作前的最后一个校园项目,毕业设计应当尽可能的贴近企业实战,业务不必很复杂,但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统,需求也比较简单。系统初始化后会默认创建一个admin管理员账号,以及三个初始化角色:
-
管理员角色 :拥有所有菜单和所有按钮的权限拥有账号查询、课程模块增删改查、选课记录查询、院系查询、专业查询的权限
-
学生角色 :拥有课程查询、报名、退课、院系查询、专业查询的权限
超管会默认创建好所有老账号,以及创建好所有的院系和专业(为什么不提供注册功能?主要是管理后台往往需要权限分配,你注册了账号你还是得找超管分配权限的,所以注册意义不大),当报名开启后,学生可以进行课程报名,在课程报名截止前,学生可以退课并重新选课。
1.2 技术栈
-
前端 :使用semanticUI渲染及Ajax动态填写
-
后端 :采用基于springboot,涉及的技术栈有mybatis,spring,springMVC,spring security,log4j,swaggerUI,redis等
1.3 应用分层
上面的分层架构摘自阿里巴巴java开发手册,我对此做了一些调整,实际分层结构如下:
2.数据库设计
2.1 表结构
管理员表
学院表
选课表
学生用户表
用户—课程表
2.2 E-R图
3.项目实现
3.1 接口设计
整个项目接口采用的目前互联网比较流行的restful风格设计,每个接口、每个参数都有详细的文档说明。因为企业中开发必然是团队协作,必然前后端分离的开发模式,你得先把接口定义出来,然后前端可以和后端同步开发。还有一种就是对外提供接口,比如你们隔壁团队也想调用你这个服务的接口,但是你两排期是同一周,这时候你得先把接口定义出来给人家,然后大家同步开发,开发完了之后再进行联调。
swagger接口文档 ![image-20210820142046656]
3.2 Redis序列化
java
@Configuration
@EnableCaching//开启注解
public class RedisConfig{
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
{
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
@Bean
public RedisTemplate<String,SelectableCourse> redisCourseTemplate(RedisConnectionFactory factory){
RedisTemplate<String,SelectableCourse>template=new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(SelectableCourse.class));
return template;
}
redis缓存操作
java
public class RedisOperator{
@Resource
private RedisTemplate<String ,SelectableCourse> template;
/**course**/
public void setCourses(SelectableCourse course){
//将course对象保存在缓存中
template.opsForSet().add("course", course);
}
public SelectableCourse getCourses(){
return template.opsForValue().get("course");
}
//更新缓存
public void updateCourse(Integer key, SelectableCourse course){
template.delete("course"+key);
template.opsForValue().set("course"+key,course);
}
public Boolean infoisexist(Integer key){
if(template.hasKey("course"+key)){
return true;
}
return false;
}
//获取缓存集合。
public Set<SelectableCourse> getList(){
return template.opsForSet().members("course");
}
/**
* 移除key
*/
public void removeKey() {
template.delete("course");
}
3.3 主要功能实现
java
//用户登录
public User login(String username){
return adminDAO.login(username);
}
//导出学生选课信息
public void excelOut(HttpServletResponse response) throws IOException{
int count = 0;
//表头数据
String[] header = {"学生id" , "姓名" , "学号" , "专业" };
//学生数据
List<User> users = userDAO.selectAll();
//已被选择的课程数据
List<SelectableCourse> courses = selectableCourseDAO.selectedCourses();
//学生的选课数据.
List<UserCourse> userCourses = userCourseDAO.selectAll();
//声明一个工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//生成一个表格,设置表格名称为"学生表"
HSSFSheet sheet = workbook.createSheet("学生选课表");
//设置表格列宽度为10个字节
sheet.setDefaultColumnWidth(10);
for(SelectableCourse cours : courses){
//创建第一行表头
HSSFRow headrow = sheet.createRow(count);
//创建一个单元格
HSSFCell cell = headrow.createCell(0);
//创建一个内容对象 (课程名称)
HSSFRichTextString text = new HSSFRichTextString("课程名称:"+cours.getCourseName()+" 任课老师:"+cours.getTeacher()+" 上课时间:"+cours.getAddress());
//将内容对象的文字内容写入到单元格中
cell.setCellValue(text);
count++;
//遍历添加表头(下面模拟遍历学生,也是同样的操作过程)
//创建第2行表头
HSSFRow row = sheet.createRow(count);
for(int i = 0 ; i < header.length ; i++){
//创建一个单元格
HSSFCell cellRow = row.createCell(i);
//创建一个内容对象
HSSFRichTextString head2 = new HSSFRichTextString(header[i]);
//将内容对象的文字内容写入到单元格中
cellRow.setCellValue(head2);
}
count++;
//遍历学生数据
for(UserCourse uc : userCourses){
for(User user : users){
if(uc.getCourseId().equals(cours.getCourseId())){
if(uc.getUsername().equals(user.getUsername())){
HSSFRow stuRow = sheet.createRow(count);
HSSFCell stuCell = stuRow.createCell(0);
HSSFRichTextString stuText = new HSSFRichTextString(user.getUserId().toString());
stuCell.setCellValue(stuText);
HSSFCell stuCell2 = stuRow.createCell(1);
HSSFRichTextString stuText2 = new HSSFRichTextString(user.getStudentName());
stuCell2.setCellValue(stuText2);
HSSFCell stuCell3 = stuRow.createCell(2);
HSSFRichTextString stuText3 = new HSSFRichTextString(user.getUsername());
stuCell3.setCellValue(stuText3);
HSSFCell stuCell4 = stuRow.createCell(3);
HSSFRichTextString stuText4 = new HSSFRichTextString(user.getObject());
stuCell4.setCellValue(stuText4);
count++;
break;
}
}
}
}
HSSFRow newRow = sheet.createRow(count);
count++;
HSSFRow newRow2 = sheet.createRow(count);
count++;
}
//准备将Excel的输出流通过response输出到页面下载
//八进制输出流
response.setContentType("application/octet-stream");
//这后面可以设置导出Excel的名称,此例中名为student.xls
response.setHeader("Content-disposition" , "attachment;filename=student.xls");
//刷新缓冲
response.flushBuffer();
//workbook将Excel写入到response的输出流中,供页面下载
workbook.write(response.getOutputStream());
}
4.项目展示
4.1 普通用户
主页
选课或退课操作
个人选课信息
4.2 管理员
主页
学生管理
修改学生信息
导出信息
参考文献
- 基于SpringCloud的在线教育平台的设计与实现(华中科技大学·李嘉蕊)
- 琼州学院网上选课系统的设计与实现(大连海事大学·李金霞)
- 基于微服务的在线教育系统的设计与实现(华中科技大学·毛颖志)
- 基于Internet的学生选课信息管理系统的设计与实现(电子科技大学·李智)
- 在线学习过程管理系统软件设计与实现(北京邮电大学·王嘉康)
- 基于SSH架构的高校选课系统的设计与实现(黑龙江大学·于虹博)
- 成人教育综合信息管理系统设计与实现(电子科技大学·伍家卫)
- MOOC服务平台的设计与实现(齐鲁工业大学·宫琳琳)
- 基于Web的高校选课系统的设计与实现(电子科技大学·谢慧萍)
- 基于微服务的在线教育系统的设计与实现(华中科技大学·毛颖志)
- 基于J2EE的网上选课系统的研究与实现(华东师范大学·罗海勇)
- 基于微服务架构的在线教学平台的设计与实现(西北大学·刘坤)
- 基于微服务架构的在线教学平台的设计与实现(西北大学·刘坤)
- 互动网络课堂的研究及平台设计实现(沈阳建筑大学·吴宇玲)
- 基于Web的高校选课系统的设计与实现(电子科技大学·谢慧萍)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设项目助手 ,原文地址:https://bishedaima.com/yuanma/35494.html