基于springboot的教学在线作业管理系统(源码+调试)

项目描述

临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题,今天给大家介绍一篇基于springboot的教学在线作业管理系统设计与实现。

功能需求

本教学在线作业管理系统通过分析和确定系统的角色和功能划分,按照业务合理区分为不同的菜单功能模块。从用户角度出发,对每个功能的需求实现点进行人性化详细的构思。对每个功能的细节点进行分析设计整合完成整个教学在线作业管理系统的设计。主要分为学生、教师、管理员三个用户角色,具体功能如下图所受。

部分效果图

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

部分代码
/*** 批量导入用户* @param file* @return*/@RequestMapping("upload")@ResponseBodypublic ResponseBean uploadUser(MultipartFile file){if(file==null||file.isEmpty()){return  ResultUtil.error("请上传文件!");}String originalFilename = file.getOriginalFilename();String extendName = "."+ FileUtils.getExtension(file);logger.debug("file.getResource:"+file.getResource());String saveFileName= UUID.randomUUID().toString().replaceAll("-","")+extendName;File saveFile=new File(baseFilePath+File.separator+saveFileName);if(!saveFile.getParentFile().exists()){saveFile.getParentFile().mkdirs();}try {//保存文件到最终路径file.transferTo(saveFile);XSSFWorkbook workbook=new XSSFWorkbook(new FileInputStream(saveFile));XSSFSheet sheet = workbook.getSheetAt(0);int rows = sheet.getPhysicalNumberOfRows();if(rows<2){return  ResultUtil.error("上传文件为空!");}for(int i=1;i<rows;i++){XSSFRow row = sheet.getRow(i);String name = ToolsUtils.getValFromCell(row.getCell(0));//用户名称String code = ToolsUtils.getValFromCell(row.getCell(1));//登录账号String mobile = ToolsUtils.getValFromCell(row.getCell(2));//手机号String password = ToolsUtils.getValFromCell(row.getCell(3));//密码if(StringUtils.isEmpty(password)){password=code;}String email = ToolsUtils.getValFromCell(row.getCell(4));//邮箱String sex = ToolsUtils.getValFromCell(row.getCell(5)).equals("男")?"1":"2";//性别String type = ToolsUtils.getValFromCell(row.getCell(6)).equals("学生")?"2":"3";//角色if(!RegexUtil.checkEmail(email)||!RegexUtil.checkMobile(mobile)){logger.debug("邮箱{}或手机号{}不合法,本条不插入",email,mobile);continue;}QueryWrapper<SysUser> queryWrapper=new QueryWrapper();queryWrapper.eq("code",code).or().eq("mobile",mobile);List<SysUser> list = userService.list(queryWrapper);if(!ToolsUtils.isEmpty(list)){logger.debug("当前账号或手机号已经存在,即将跳过!");continue;}SysUser user=new SysUser();user.setCode(code);user.setName(name);user.setMobile(mobile);user.setEmail(email);user.setPassword(MD5Util.md5(password,md5Key));user.setSex(sex);user.setType(Integer.parseInt(type));userService.save(user);}return ResultUtil.success("导入成功!");} catch (IOException e) {logger.error(e.getMessage(),e);}return ResultUtil.error();}/*** 用户添加* @param user* @return*/@RequestMapping("add")@ResponseBodypublic ResponseBean addUser(SysUser user, MultipartFile file){logger.debug("addSysUser:"+user);if(user==null){return  ResultUtil.error(CommonEnum.BAD_PARAM);}String mobile = user.getMobile();if(!StringUtils.isEmpty(mobile)&&!RegexUtil.checkMobile(mobile)){logger.error("手机号为空!");return  ResultUtil.error("手机号不合法!");}SysClass sysClass = classService.getById(user.getClassId());user.setClassName(sysClass.getName());List<SysUser> list  = userService.getUserByUserName(user);if (list != null && list.size() > 0){logger.error("手机号或者账号已存在!");return  ResultUtil.error("该登录手机号或者账号已存在请重新输入!");}String password= StringUtils.isEmpty(user.getPassword())?"123456":user.getPassword();//对密码进行MD5盐值加密,数据库保存密码的密文//MD5Util.md5(password,md5Key  md5key就是盐值user.setPassword(MD5Util.md5(password,md5Key));boolean add = userService.save(user);logger.debug("用户添加结果:"+user);//保存文件并更新saveName到user.field1if (file!=null&&!file.isEmpty()) {SysFile sysFile=new SysFile();sysFile.setObjectId(user.getId());sysFile.setCategoryCode(ComCodeEnum.category_code_user);SysFile saveFile=fileService.saveOrUpdateFile(sysFile,file);if(saveFile!=null&&!StringUtils.isEmpty(saveFile.getSaveName())){user.setField1(saveFile.getSaveName());}userService.updateById(user);}return  ResultUtil.success();}/*** 跳转到用户修改页面* @param id* @param model* @return*/@RequestMapping("/editPage/{id}")public String editPage(@PathVariable Long id, Model model) {model.addAttribute("user", userService.getById(id));return prefix+"/edit";}/*** 修改用户密码* @param id* @param password* @param oldpwd* @return*/@RequestMapping("updatePWd")@ResponseBodypublic  ResponseBean updatePWd(Long id,String password,String oldpwd,HttpSession session){SysUser user = userService.getById(id);String userPassword = user.getPassword();if(!MD5Util.md5Verify(oldpwd,md5Key,userPassword)){return ResultUtil.error("原始密码不正确!");}user.setPassword(MD5Util.md5(password,md5Key));user.setUpdateTime(LocalDateTime.now());userService.updateById(user);session.setAttribute("user",user);return ResultUtil.successData(user);}/*** 初始化用户密码* @param id* @return*/@RequestMapping("initPwd")@ResponseBodypublic ResponseBean initPwd(Long id){if(id==null||id<1){return ResultUtil.error(CommonEnum.BAD_REQUEST);}SysUser sysUser = userService.getById(id);if(sysUser!=null){sysUser.setPassword(MD5Util.md5("123456",md5Key));sysUser.setUpdateTime(LocalDateTime.now());userService.updateById(sysUser);return ResultUtil.success();}return ResultUtil.error(CommonEnum.NO_USER_EXIST);}/*** 用户修改* @param user* @return*/@RequestMapping("/edit")@ResponseBodypublic ResponseBean updateById(MultipartFile file, SysUser user,HttpSession session) {if (user == null) {return ResultUtil.error(CommonEnum.BAD_PARAM);}String mobile = user.getMobile();if(!StringUtils.isEmpty(mobile)&&!RegexUtil.checkMobile(mobile)){return ResultUtil.error("手机号不合法!");}if(user.getClassId()!=null){SysClass sysClass = classService.getById(user.getClassId());user.setClassName(sysClass.getName());}//处理密码String password = user.getPassword();if(!StringUtils.isEmpty(password)){user.setPassword(MD5Util.md5(password,md5Key));}else{user.setPassword(null);}if (file!=null&&!file.isEmpty()) {SysFile sysFile=new SysFile();sysFile.setObjectId(user.getId());sysFile.setCategoryCode(ComCodeEnum.category_code_user);SysFile saveFile=fileService.saveOrUpdateFile(sysFile,file);if(saveFile!=null&&!StringUtils.isEmpty(saveFile.getSaveName())){user.setField1(saveFile.getSaveName());}}user.setUpdateTime(LocalDateTime.now());boolean i = userService.updateById(user);return ResultUtil.success() ;}/*** 跳转用户列表页面* @return*/@RequestMapping("/listPage")public String userListPage() {return prefix+"/list";}/*** 分页列表查询* @param queryParam 查询参数* params[beginTime]: 2020-10-16 -map参数* params[endTime]: 2020-10-16   -map参数* @return*/@RequestMapping("/list")@ResponseBodypublic ResponseBean getList(PageDTO pageDTO, SysUser queryParam , HttpSession session) {logger.debug("查询用户列表参数:"+queryParam+",pageDTO:"+pageDTO);QueryWrapper<SysUser> queryWrapper=new QueryWrapper<>();Integer type = ToolsUtils.getLoginUser(session).getType();//用户角色queryWrapper.eq(queryParam.getClassId()!=null,"class_id",queryParam.getClassId());queryWrapper.like(!StringUtils.isEmpty(queryParam.getName()),"name",queryParam.getName());queryWrapper.like(!StringUtils.isEmpty(queryParam.getMobile()),"mobile",queryParam.getMobile());queryWrapper.like(!StringUtils.isEmpty(queryParam.getType()),"type",queryParam.getType());queryWrapper.ne("code","admin");//用户管理里面超级管理员admin除外queryWrapper.orderBy(true,pageDTO.getIsAsc().equals("asc"), ToolsUtils.camelToUnderline(pageDTO.getOrderByColumn()));IPage<SysUser> indexPage = new Page<>(pageDTO.getPageNum(),pageDTO.getPageSize());IPage<SysUser> listPage = userService.page(indexPage, queryWrapper);logger.debug("获取的用户列表:"+listPage);//获取分页信息Map pageInfo = ToolsUtils.wrapperPageInfo(listPage);return ResultUtil.successData(pageInfo);}/*** 用户删除* @param idList* @return*/@RequestMapping("delete")@ResponseBodypublic ResponseBean delete(@RequestParam("idList") List<Long> idList){if(idList==null||idList.isEmpty()){return ResultUtil.error("ID不合法!");}idList.forEach(e->userService.removeById(e));return ResultUtil.success();}/*** 启用/禁用用户* @param id* @param state* @return*/@RequestMapping("updateState")@ResponseBodypublic ResponseBean updateState(Long id,Integer state){SysUser user = userService.getById(id);user.setState(state);user.setUpdateTime(LocalDateTime.now());userService.updateById(user);return ResultUtil.successData(user);}/*** 后台用户登录* @param user* @param session* @param verifyCode* @return*/@RequestMapping("/checkLogin")@ResponseBodypublic ResponseBean checkLogin(SysUser user, HttpSession session, @RequestParam String verifyCode) {//首先验证验证码是否存在String trueVerifyCode = (String) session.getAttribute("verifyCode");if (trueVerifyCode == null) {return ResultUtil.error(CommonEnum.REFRESH_VERIFYCODE);}//判断验证码是否输入正确(验证码忽略大小写)if (!trueVerifyCode.equalsIgnoreCase(verifyCode)) {return ResultUtil.error(CommonEnum.ERROR_VERIFYCODE);}QueryWrapper queryWrapper=new QueryWrapper();queryWrapper.eq("code",user.getCode());List<SysUser> list = userService.list(queryWrapper);//判断是否存在当前用户if (ToolsUtils.isEmpty(list)) {return new ResponseBean(false, CommonEnum.NO_USER_EXIST);}SysUser sysUser = list.get(0);if(sysUser.getType()==2){return ResultUtil.error("学生不可以登录管理后台!");}if(sysUser.getState()!=1){return ResultUtil.error("用户已经被禁用,请联系管理员!");}//判断密码是否正确if (!MD5Util.md5Verify(user.getPassword(), this.md5Key, sysUser.getPassword())) {return new ResponseBean(false, CommonEnum.INVALID_PASSWORD);}//通过所有验证session.setAttribute("user", sysUser);session.setAttribute("type", sysUser.getType());return ResultUtil.success( "登录成功!");}/*** 后台用户登录* @param user* @param session* @param verifyCode* @return*/@RequestMapping("/teacherLogin")@ResponseBodypublic ResponseBean teacherLogin(SysUser user, HttpSession session, @RequestParam String verifyCode) {//首先验证验证码是否存在String trueVerifyCode = (String) session.getAttribute("verifyCode");if (trueVerifyCode == null) {return ResultUtil.error(CommonEnum.REFRESH_VERIFYCODE);}//判断验证码是否输入正确(验证码忽略大小写)if (!trueVerifyCode.equalsIgnoreCase(verifyCode)) {return ResultUtil.error(CommonEnum.ERROR_VERIFYCODE);}QueryWrapper queryWrapper=new QueryWrapper();queryWrapper.eq("code",user.getCode());List<SysUser> list = userService.list(queryWrapper);//判断是否存在当前用户if (ToolsUtils.isEmpty(list)) {return new ResponseBean(false, CommonEnum.NO_USER_EXIST);}SysUser sysUser = list.get(0);if(sysUser.getType()==2){return ResultUtil.error("学生不可以登录教师管理后台!");}if(sysUser.getType()==1){return ResultUtil.error("管理员不可以登录教师管理后台!");}if(sysUser.getState()!=1){return ResultUtil.error("用户已经被禁用,请联系管理员!");}//判断密码是否正确if (!MD5Util.md5Verify(user.getPassword(), this.md5Key, sysUser.getPassword())) {return new ResponseBean(false, CommonEnum.INVALID_PASSWORD);}//通过所有验证session.setAttribute("user", sysUser);session.setAttribute("type", sysUser.getType());return ResultUtil.success( "登录成功!");}
安装部署需求

eclipse运行启动

系统部署

系统开发后,在生产环境配置项目运行环境,具体步骤如下:
安装linux或者windows10操作系统;
安装JDK1.8并配置环境变量;
安装MySQL5.7版本以上版本数据库,创建数据库并执行脚本创建表;
在IDEA中一键运行;

本项目用到的技术和框架

1.开发语言:Java
2.开发模式:B/S
3.数据库:MySQL5.7
4.框架:Springboot+Mybaits+HTML

本项目中的关键点

此系统的开发采用java语言开发,基于B/S结构,这些开发环境使系统更加完善。使用到的工具和技术都是开源免费的。

环境工具

开发工具 Eclipse/IDEA
语言 JDK1.8 、Java
硬件:笔记本电脑;
软件:Tomcat8.0 Web服务器、Navicat数据库客户端、MySQL;
操作系统:Windows 10;
其它软件:截图工具、常用浏览器;
以上是本系统的部分功能展示,如果你的选题正好相符,那么可以做毕业设计或课程设计使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/226802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

性能提升100%、存储节约50%!猕猴桃游戏搭载OceanBase开启云端手游新篇章

近日&#xff0c;武汉灵动在线科技有限公司&#xff08;以下简称“灵动在线”&#xff09;与 OceanBase 达成合作&#xff0c;旗下品牌猕猴桃游戏的“游戏用户中心&#xff08;微信小程序&#xff09;”和“BI 分析报表业务系统“两大关键业务系统全面接入 OB Cloud 云数据库&a…

windows下redis 设置开机自启动

1&#xff0c;在redis的目录下执行&#xff08;执行后就作为windows服务了&#xff09; redis-server --service-install redis.windows.conf 2&#xff0c;安装好后需要手动启动redis redis-server --service-start 3&#xff0c;停止服务 redis-server --service-stop

用标记接口定义类型

标记接口是不含有任何方法的接口&#xff0c;它的目的是通过将特定接口应用于类来为该类添加类型信息。以下是一个示例&#xff1a; public interface Drawable {// 标记接口&#xff0c;不包含任何方法 }public class Circle implements Drawable {private int radius;public…

C# 加载本地文件设置应用程序图标

static class Program{[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Form mainForm new Form1();mainForm.Show();//IntPtr hProcess Process.GetCurrentProcess().MainWindowHandle;// 设置应用程…

【C++11特性篇】利用 { } 初始化(1)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.回顾C98标准中{}的使用二.一切皆可用…

大创项目推荐 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

TrustZone之中断及中断处理

一、中断 接下来,我们将查看系统中的中断,如下图所示: 通用中断控制器(GIC)支持TrustZone。每个中断源,在GIC规范中称为INTID,分配到以下三个组之一: • Group0:安全中断,以FIQ方式发出信号 • 安全Group1:安全中断,以IRQ或FIQ方式发出信号 • 非安全Gr…

万兆网络之屏蔽线序接法(上)

可以经常听到用RJ45指代网线&#xff0c;用RJ11指代电话线的&#xff0c;RJ&#xff08;Registered Jack&#xff09;即已注册插口&#xff0c;可以简单理解为一种约定就行&#xff08;参见参考链接&#xff09; 前一篇已经讲到&#xff0c;网线线对互相缠绕是为了电流方向相反…

100天精通风控建模(原理+Python实现)——第10天:风控建模中主成分析是什么?怎么实现?

风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。本文以视频的形式阐述风控建模中主成分分析是什么,怎么实现。并提供风控建模原理和Python实现文章清单。    之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模?    100天…

netty-daxin-2(netty常用事件讲解)

文章目录 netty常用事件讲解ChannelHandler接口ChannelHandler适配器类ChannelInboundHandler 子接口Channel 的状态调用时机ChannelHandler 生命周期示例NettServer&CustomizeInboundHandlerNettyClient测试分析 ChannelInboundHandlerAdapter适配器类SimpleChannelInboun…

LeetCode-反转链表问题

1.反转链表 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路&#xff1a; 反转链表也就是链表倒置&#xff0c;我一直以来的办法就是先建立一个头节点&#xff0c;之后再遍历链表来进行头插。 代码&#xff1…

基于Hadoop的铁路货运大数据平台设计与应用

完整下载&#xff1a;基于Hadoop的铁路货运大数据平台设计与应用 基于Hadoop的铁路货运大数据平台设计与应用 Design and Application of Railway Freight Big Data Platform based on Hadoop 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的与意义 5 …

flatbuffer使用教程

一、定义scheme Tables FlatBuffers 中定义对象的主要方式&#xff0c;由名称和字段列表组成。每个字段都有一个名称、一个类型和一个可选的默认值。 如果架构中未指定默认值&#xff0c;则标量类型的默认值将为 0 &#xff0c;其他类型的默认值将为 null 。 限制 只能在表…

比尔盖茨最新文章——AI 将彻底改变计算机的使用形式

最近发现比尔盖茨还在写文章&#xff0c;确实了不起&#xff0c;68 岁的老人家还在坚持输出&#xff0c;除了写文章&#xff0c;比尔盖茨还致力于教育、医疗和卫生等慈善工作&#xff0c;奋斗在一线&#xff0c;看来美国人也延迟退休啊 &#x1f605; 原文《AI 将彻底改变计算…

Java数据结构篇——单链表的基本操作

1. 前言 在上一篇《Java数据结构篇——实现顺序表的增删查改》&#xff0c;我们已经熟悉了 ArrayList 的使用并且进行了简单的模拟实现。ArrayList底层使用数组来存储元素&#xff0c;由于其底层是一段连续的空间&#xff0c;当ArrayList 任意位置插入或者删除元素时&#xff…

《使用ThinkPHP6开发项目》 - 登录接口一

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 《使用ThinkPHP6开发项目》 - 创建应用-CSDN博客 《使用ThinkPHP6开发项目》 - 创建控制器-CSD…

详解Keras3.0 Layers API: Convolution layers(Conv1D、Conv2D、Conv3D)

1、Conv1D layer 通常对一维度数组&#xff08;例&#xff1a;arr np.array([1, 2, 3, 4, 5])&#xff09;进行卷积操作 keras.layers.Conv1D(filters,kernel_size,strides1,padding"valid",data_formatNone,dilation_rate1,groups1,activationNone,use_biasTrue,…

职场记6:在国企工作,追逐挑战与成就

上一篇《职场记5&#xff1a;勇闯深圳&#xff0c;追梦职场》 上回说到我决定入职一家国企&#xff0c;去入职后才发现&#xff0c;我应聘的岗位其实只招一人&#xff0c;加上我却一共来了两个人&#xff0c;也就是说我和另一个新人最终要有一个离开。 尽管我和他有着一定的竞…

SystemVerilog基础:并行块fork-join、join_any、join_none(二)

相关阅读 SystemVerilog基础https://blog.csdn.net/weixin_45791458/category_12517449.html 在第一节中&#xff0c;我们讨论了并行块中的fork-join块和fork-join_any块&#xff0c;了解了它们的差异&#xff0c;本文将继续讨论fork-join_none块的使用。 fork-join_none并行块…

12.12_黑马数据结构与算法笔记Java

目录 079 优先级队列 无序数组实现 080 优先级队列 有序数组实现 081 优先级队列 堆实现 1 082 优先级队列 堆实现 2 083 优先级队列 堆实现 3 084 优先级队列 e01 合并多个有序链表1 084 优先级队列 e01 合并多个有序链表2 085 阻塞队列 问题提出 086 阻塞队列 单锁实…