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

news2025/1/9 2:06:31

项目描述

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

功能需求

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

部分效果图

在这里插入图片描述

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

在这里插入图片描述

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

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

部分代码

  /**
     * 批量导入用户
     * @param file
     * @return
     */
    @RequestMapping("upload")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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.field1
        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());
            }
            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")
    @ResponseBody
    public  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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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.coloradmin.cn/o/1196878.html

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

相关文章

一文图解爬虫(spider)

—引导语 互联网&#xff08;Internet&#xff09;进化到今天&#xff0c;已然成为爬虫&#xff08;Spider&#xff09;编制的天下。从个体升级为组合、从组合联结为网络。因为有爬虫&#xff0c;我们可以更迅速地触达新鲜“网事”。 那么爬虫究竟如何工作的呢&#xff1f;允许…

补坑:Java的字符串String类(1)

常用方法 字符串构造 来看看源码里面String的构造方法 普通字符串 //"hello" 是字符串常量&#xff0c;没有\0标记结尾String str "hello";System.out.println(str);//helloString str2 new String();System.out.println(str2);//没有输出String str3…

摊位展示预约小程序的作用有哪些

无论市场还是街边&#xff0c;小摊小贩往往很多&#xff0c;组成了丰富多彩的线下购物环境&#xff0c;而在实际发展中&#xff0c;摊位的需求度很高&#xff0c;但由于种种原因&#xff0c;导致在实际发展中&#xff0c;也有一定难题&#xff1a; 1、摊位预约难、信息查看难 …

IDEA的优化配置教程

前言 IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以…

多门店民宿预定系统酒店预订管理系统源码/公寓/农家乐小程序源码

技术栈&#xff1a; thinkphpuniappmysql 支持H5APP小程序 主要功能介绍&#xff1a; 在线预订 支持在线支付或到店付&#xff0c;支持配置免费取消订单时长&#xff0c;支持到店付保留时长设置 房间搜索 支持按日期搜索房间状态&#xff0c;支持按日期区间搜索房间状态…

Python tkinter库利用Scrollbar对象实现Text组件右侧滚动条

在Python的Tkinter中&#xff0c;可以使用Scrollbar来实现Text组件的上下滑动。首先&#xff0c;需要创建一个Scrollbar对象并将其与Text组件绑定&#xff0c;然后将Scrollbar放置在Text组件的右侧&#xff0c;使其能够控制Text组件的上下滑动。 运行结果 以下是一个简单的示例…

Postman常见报错与解决方法,持续更新~

postman中文文档 基本操作&#xff1a;从控制台查看请求报错 如果 Postman 无法发送你的请求&#xff0c;或者如果它没有收到你发送请求的 API 的响应&#xff0c;你将收到一条错误消息。此消息将包含问题概述和指向控制台的链接&#xff0c;你可以在其中访问有关请求的详细信…

SmargGBD(GB28181设备接入模块)如何对接wvp-gb28181-pro

技术背景 我们在对接SmartGBD&#xff08;GB28181设备接入模块&#xff09;的时候&#xff0c;除了常规的海康大华宇视等国标平台外&#xff0c;有些公司会选择wvp-gb28181-pro。 众所周知&#xff0c;WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网络视频…

SAMBA文件共享与DNS域名服务

一、SAMBA文件共享 1、什么是SAMBA SMB&#xff08;Server Message Block&#xff09;协议实现文件共享&#xff0c;也称为CIFS&#xff08;Common Internet File System &#xff09; 是Windows和类Unix系统之间共享文件的一种协议 客户端主要是Windows&#xff1b;支持多…

openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库

文章目录 openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库120.1 密态等值查询概述120.2 使用gsql操作密态数据库 openGauss学习笔记-120 openGauss 数据库管理-设置密态等值查询-概述及使用gsql操作密态数据库 120.1 密态等值查询…

【dbeaver】添加mysql高低版本选择驱动

添加mysql高低版本选择驱动 连接到数据库->全部->查询mysql MySQL 版本驱动 8.0 MySQL 5 版本驱动 5.7.x 其他需要就&#xff1a;https://downloads.mysql.com/archives/c-j/ 密码查看 项目设置密码&#xff1a; File -> Project security ->设置密码 It i…

可视化 | echarts饼图改编

echarts模板来源 &#x1f4da;改编点 &#x1f407;基本样式 去掉legend、label&#xff1a;show: false背景透明&#xff1a;backgroundColor: "transparent"去除功能标签添加载入动态animationEasing: elasticOut, animationDelay: function (idx) {return Mat…

Mac安装与配置eclipse

目录 一、安装Java&#xff1a;Mac环境配置&#xff08;Java&#xff09;----使用bash_profile进行配置&#xff08;附下载地址&#xff09; 二、下载和安装eclipse 1、进入eclipse的官网 (1)、点击“Download Packages ”​编辑 (2)、找到macOS选择符合自己电脑的框架选项…

安全框架SpringSecurity-1(认证入门数据库授权)

一、Spring Security ①&#xff1a;什么是Spring Security Spring Security是一个能够为基于Spring的企业应用系统提供声明式&#xff08;注解&#xff09;的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean&#xff0c;充分利用了Spring …

Linux-vi/vim命令

1.vim/vi编辑器的三种工作模式 ①命令模式 ②输入模式 i打开 ③底线命令模式 :打开 2.命令模式 vi 文件路径 vim 文件路径 如果文件不存在则创建新的文件&#xff0c;存在则使用vi/vim打开 3.快捷键 模式命令描述命令模式i在当前光标位置进入输入模式命令模式a在当前光标位置之…

【2】Gradle-快速入门使用【Gradle项目结构概念】

目录 【2】Gradle-快速入门使用【Gradle项目结构概念】安装本地安装先决条件 官网安装教程 Gradle 快速指南初始化项目查看Gradle的项目结构了解Gradle Wrapper调用Gradle包装器了解Gradle的项目结构了解settings文件了解构建脚本 IDEA中使用Gradle创建一个新项目创建一个Sprin…

环形处理习题,举例:约瑟夫环,魔方阵

目录 约瑟夫环 魔方阵 约瑟夫环 题目描述&#xff1a;有n 个人围成一圈,顺序排号。从第1个人开始报数从1到3报数凡是报到3 的人退出圈子,问最后留下的是原来的第几号? 环形处理:依次遍历数据集的每个元素&#xff08;每个人依次报号&#xff09;&#xff0c;直到遍历到最后…

【Linux】编译Linux内核

之所以编译内核&#xff0c;是因为gem5全系统仿真需要vmlinux文件&#xff0c;在此记录一下以备后面需要。 此过程编译之后会获得vmlinux和bzImage两个文件&#xff1b; 主要参考知行大佬的编译内核与gem5官方教程 文章目录 一、Linux源码下载二、安装编译依赖三、编译1. 内核编…

5种常用Web安全扫描工具,快来查漏补缺吧!

漏洞扫描是一种安全检测行为&#xff0c;更是一类重要的网络安全技术&#xff0c;它能够有效提高网络的安全性&#xff0c;而且漏洞扫描属于主动的防范措施&#xff0c;可以很好地避免黑客攻击行为&#xff0c;做到防患于未然。那么好用的漏洞扫描工具有哪些&#xff1f; 答案…

抖音小程序开发实战:打造独特品牌体验的代码之旅

抖音小程序的崛起为品牌提供了一个全新的数字化平台&#xff0c;而通过深入的抖音小程序开发&#xff0c;品牌不仅能够提升曝光度&#xff0c;更能打造独特的用户体验。在本文中&#xff0c;我们将深入研究抖音小程序开发的关键技术要点&#xff0c;并通过实际代码演示&#xf…