如何使用ssm实现基于SpringMVC网上选课系统的设计与实现

news2024/9/27 5:55:47

@TOC

ssm696基于SpringMVC网上选课系统的设计与实现+jsp

研究背景和来源

目前的管理类系统已各种各样,涉及到生活中的每一个部分。购物类、网站类、信息统计类、办公类、官网类等非常丰富。我国各类系统的发展已非常成熟,这些系统依靠网络和计算机技术不断完善发展为人们带来更好的生活体验。而管理类的系统更是多种多样,像比如出名的库存管理系统、人事管理系统等拥有的客户群体都非常大。

受我国教育理念的影响,每个家庭都非常注重学生的学习,学生学习的课程影响到今后所要从事的行业。我国人口众多,竞争压力也越来越大,随着国民经济水平的提升,越来越多的家庭都认识到专业的重要性。我国的教育水平还处在基础阶段,学生获得知识的主要途径是通过老师在学校里传授,这种方式就造成学生在选择课程时非常谨慎,但目前学生想要了解不同课程的详细内容只能通过老师讲述或者网上自己搜索辨别。老师讲述通常不详细,自己网上辨别不确定性大,学生选课后老师的整理工作也非常复杂,老师想要为学生打分也需要手动整理、发布。

1.2课题研究现状

目前学生选课的主要途径还是通过传统方式,也就是采用在学校由老师在教室传达学生选课后上报的方式,这种方式对课程少、学生少的学校来说非常适合,但对课程种类多、学生多来说非常困难。对今后老师成绩的发布也需要大量时间的配合,信息不够及时,这种方法已非常落后。

我国线上学生信息管理系统发展已形成一定的规模,在众多管理系统里主要针对的是学生的各种资料管理。也会涉及到学生的选课和学生的成绩管理,但都不够专业,不能实现更深层次的功能,满足不了用户的需求。

1.3课题开发的目的和意义

本系统的实现目的在于帮助学生的选课。和相关的管理系统相比,本系统针对性更强,向使用用户展示最为详细的课程信息帮助学生了解课程并进行在线选课。本系统为免费的选课系统,为学校的学生选课提供辅助。本系统的核心在于内容,以丰富的课程种类取胜,去繁留简,使本系统的用户更容易抓住重点,找到核心内容,减少用户烦躁心理。本系统的实现拥有更大的意义:

  1. 本系统功能简单、针对性强,使系统用户更为直观,操作也更为简单,只要有上网经验的用户都可以轻松掌握;
  2. 本系统采用多种课程种类,学生可以根据自己的喜好选择更适合自己的课程进行学习;
  3. 本系统中的课程信息都是由管理员发布,可以做到及时、精准;
  4. 本系统中设有成绩管理功能,老师可以根据学生的表现随时给学生打分,学生也可以随时查询成绩。

1.4课题开发内容

本基于SpringMVC网上选课系统采用管理员、老师、学生界面进行设计。老师的账号和密码必须由管理员分配,管理员的账号和密码可由系统开发者在数据库中设置,学生的账号和密码可以由注册获得。管理员的主要功能为学生资料、老师资料的添加、修改,班级信息的添加和查询、课程信息的详细解释和添加还可以查询学生的选课成绩以及管理教学资源、教学计划等。老师的功能为个人资料管理和自己负责学生的成绩设置,并管理教学资源,设置教学计划。学生的主要功能为浏览课程和在线选课以及查询课程成绩、教学资源。

1.5论文结构安排

本篇论文分为摘要、目录、绪论、系统开发关键技术介绍、系统分析、系统设计和系统实现、系统测试、总结、致谢、参考文献。本篇论文的核心集中在系统设计和系统实现部分。绪论部分为基础调研,在系统分析中阐述系统的需求分析、可行性分析和数据流程图、用例图等。

第2章 系统开发关键技术介绍

2.1系统开发使用的关键技术

本系统在开发中选择B/S框架进行设计,语言采用JAVA,数据库采用MySQL,并在设计中加入Vue技术,本系统的运行环境为Idea。

2.2 Vue技术介绍

Vue是一个用来开发前台界面的JAVA框架技术,体积非常的小,所以运行效率非常的高,可以直接通过虚拟设定的 DOM进行各种JAVA计算,因为操作过程中相当于是一个预处理,所以并没有真实的DOM,也可以称作为一个虚拟的DOM。Vue还可以进行双向的数据绑定,这样操作起来更加的简单,使用户可以不用管DOM对象,直接去操作业务逻辑就可以了,可以应用的场景非常的多,而且开发成本也非常的低。目前的市场后已经有很多成熟稳定的框架组件,可以直接拿来使用,对于初学者来说非常的方便。

2.3 Idea介绍

Idea是公认的最好用JAVA开发工具之一,常见最多的都是用来跟Eclipse进行比较,Eclipse可以说是最简单的,但是在兼容方面,代码设计方面明显不足。而Idea就是在Eclipse基础上进行了整合升级,更加智能。Idea最大的创新就是有智能代码助手,可以实现代码提示,还能进行代码重构,代码审查,非常适合新手的使用。Idea的宗旨就是实现智能编码,使编码更加的简单,所以在Idea上有很多其他软件所没有的特色功能,比如进行智能选取,不需要开发者在手动操作,还有各种丰富的导航模式可供选择,可以直接导入就能使用,不需要开发者在重新建立,还有历史记录功能,在误删误操作的情况下,通过这个功能就可以直接恢复。而且Idea相比Eclipse调试也更简单,通过Eclipse调试的时候需要选定表达式,否则就没办法查看它的值,而通过Idea则不需要进行任何操作,Idea会自动理解你所需要的表达式,然后给你建议参考值。而且在编码方面更加智能,会自动跳出需要的变量和参数,然后建议你最优选择。所以说相比Eclipse来说,用Idea开发更加的简单方便,更适合新用户的开发使用。

2.4 MySQL数据库介绍

数据库主要就是用来存储和管理系统数据的,按照数据结构来进行组织和存储的,数据库都有自己独立的接口来进行创建,访问,管理等,也可以直接用文件的形式进行数据存储,但是读写速度比较慢,效率不高,所以一般都是采用专门的数据库软件来进行数据库存储和管理,这样可以更加科学有效的实现数据的存储,也更加的安全。而MySQL就是一个关系型数据库管理系统,可以把各种不同的数据库存储到不同的表结构中 ,这样可以提高查找效率。

第3章 系统分析

3.1系统需求分析

目前学校组织学生选课时都选择由学校先安排不同课程的授课老师,再由各班的班主任在教室给学生传达,讲述课程的简单内容和所负责的老师等信息,然后由学生选择后上报给老师,老师整理好信息后再上报给学校,学校再给负责的授课老师传达学生资料。这种方式步骤多,一旦中间有一步出错会给学生的选择造成问题,而且学生想要了解更详细的课程内容非常不容易。而本基于SpringMVC网上选课系统提供课程详情,由学生自己了解,然后进行选择,选择后可由老师负责管理,老师也可以利用本系统设置教学计划,利用本系统也可以帮助老师发布成绩,本基于SpringMVC网上选课系统前景非常好。

3.2系统可行性分析

可行性分析主要是先进行初步调查,然后从各个方面进行系统可行性研究,比如系统需要做什么,采用什么技术,进行各种分析研究,然后得到一个可行性的方案。然后在对方案进行各个功能模块的设计,进行系统设计分析,研究系统设计可行性。所以要从多方面进行考虑,而本文主要从技术上,经济上,操作上,法律上进行研究分析。

3.2.1技术可行性

随着技术的快速发展,各种软件开发技术也在不停的更新,不断的发展,大家都在选择适合自己水平的,能达到开发需求的软件技术和开发环境。所以根据我的开发需求,然后决定开发本系统采用JAVA语言SpringMVC框架来完成,开发出来的系统可以满足功能需求,而且操作界面美观,符合目前的审美,最重要的是开发相对简单,可以自动生成所需要的框架结构。前端框架采用Vue,数据库MySQL,体积更小,存储速度快,可以满足本次开发的需求。

3.2.2经济可行性

经济可行性分析主要是对前期投资进行分析,对系统维护费用分析,对开发完成后取得的经济收益进行分析。因为本系统完全是自己开发的,作为毕业设计用途的,只需要基础的设施就行,需要电脑硬件,开发软件等,不需要额外的投入,完全满足开发需求。而系统开发完成后可以方便用户使用,还能带来一定的经济效益,所以开发本系统在经济上是可行的。

3.2.3运行可行性分析

开发本系统过程中已经充分考虑了使用者的感受,界面美观,而且有功能导航栏,方便用户很好的掌握,而且还有各种提示符,哪怕对计算机操作不熟练的也能使用本系统。所以综合考虑,本系统在运行方面是可行的。

3.2.4法律可行性

开发本系统过程中参阅的相关资料都是在学校图书馆参阅的,均为正规渠道,而且开发均是本人独立开发的,均是自己的知识储备,全是自己原创的,不存在知识产权,所以才法律上是可行的。

3.3系统功能分析

本系统采用功能针对性强、文字描述精确的方式进行设计。本基于SpringMVC网上选课系统是关于课程管理的系统,在设计功能时只取用最基础的功能,目的是提供最精准的服务。本系统包括老师、管理员和学生三部分。

学生可以浏览课程在线选课和查看课程的成绩以及查看自己所选择的所有课程,还可以查看学校的教学资源等。管理员可以管理班级信息、计划类型信息、课程性质、教学计划信息、成绩信息、学生的选课信息以及管理学生信息、教室信息、老师信息、院系信息等。老师可以管理教学计划、学生选课和教学资源信息等。

管理员用例图如下图3.1所示:

图3.1管理员用例图

学生用例图如下图3.2所示:

图3.2学生用例图

老师用例图如下图3.3所示:

图3.3老师用例图

3.4系统性能分析

系统性能方面包括系统的框架、系统的开发理念、系统的开发界面原则、系统开发标准、系统开发流程、系统开发安全性、系统运行稳定性等。具体性能分析如下:

  1. 本系统是面向所有人群而开发的管理平台,所以采用的框架模式为B/s,B/s模式是借助浏览器进行系统访问的平台,所有信息可以共享;
  2. 系统在设计中采用结构化方式,首先将功能分为大的方面,再由大方面分为小方面,最后分为小细节再整合成完整的系统;
  3. 系统在界面设计时采用Vue技术,可以使界面更丰富,元素更多;
  4. 系统的操作流程采用简单的思路,使使用用户可以快速掌握本系统;
  5. 系统的运行速度要快,所有操作可以快速反映;
  6. 在系统开发时要注意系统的资源占用,以最少占用为标准进行设计;
  7. 采用发展的眼光看待问题,把系统的生命周期延长到最大;
  8. 调查所有使用用户的需求尽可能的满足。

3.5业务流程分析

业务流程涉及到系统的每个部分,调查系统在运行中数据会流动的每个环节,以用户登录开始到学生选课进行业务流程分析。确保所有信息的流入、流出以及数据的完整性和处理问题的方法。本系统的流程为学生首先进行登录,登录后可以浏览课程信息,在课程详情里可以选课和查看所有已选择的课程以及课程的成绩。管理员负责添加课程信息和班级信息、管理用户信息等。老师负责管理学生的成绩和教学计划的制定。系统中的所有数据都需要管理员审核。本系统的业务流程图如下图3.4所示:

图3.4系统业务流程图

第4章 系统设计

4.1系统功能结构设计

本系统的功能界面设计为三个,学生中心界面和管理员中心界面、老师中心界面。根据不同用户的不同需求分开设计功能。学生中心界面的功能为个人资料、选课功能、成绩功能、教学资源功能等,管理员中心界面的功能为系统用户、课程、班级、系统信息等,老师中心界面的功能为选课成绩、个人资料等。本系统的功能结构图如下图4.1所示:

图4.1系统功能结构图

4.2系统数据库设计

数据库就是数据的存储仓库,按照计算机的格式进行数据存入。为了使数据库具有独立性,防止因为系统崩溃而数据有损的问题在数据库建立时都采用单独的数据库。数据库具有共享性和单独性,在系统运行时会自动和相对应的数据进行通讯连接。本基于SpringMVC网上选课系统采用MySQL数据库设计,身份验证为Root,密码为123456。

4.2.1数据库ER图设计

根据分析所得本系统中主要的数据为管理员、学生、课程信息、成绩信息、班级信息等。所以本节针对这些数据画出数据ER图。

(1)管理员实体的属性为用户名和密码。管理员实体ER图如下图4.2所示:

图4.2管理员实体ER图

(2)学生实体的属性为编号、姓名、班级、专业等。学生实体ER图如下图4.3所示:

图4.3学生实体ER图

(3)老师信息实体的属性包括姓名、编号、职称等。老师信息实体ER图如下图4.4所示:

图4.4老师信息实体ER图

(4)课程实体的属性包括编号、名称、负责老师、分数。课程实体的ER图如下图4.5所示:

图4.5课程实体ER图

(5)类别信息实体的属性包括编号和名称。类别信息实体ER图如下图4.6所示:

 

图4.6分类信息实体的ER图

(6)班级信息包括标题、编号等。班级ER图如下图4.7所示:

图4.7班级信息ER图

(7)成绩信息包括课程编号、课程名称等。成绩ER图如下图4.8所示:

图4.8成绩信息ER图

(8)本系统的关系ER图如下图4.9所示:

图4.9系统关系ER图

4.2.2数据库表设计

本系统针对学校的在线选课而设计,所以本系统的数据库表围绕课程而建立。本系统的数据库表包括课程信息表、选课信息表、管理员信息表等。本系统的数据库表结构如下图4.1-4.11所示:

表4.1 chengji

表4.2 config

表4.3 dictionary

表4.4 jiaoshi

表4.5 jiaoxuejihua

表4.6 kecheng

表4.7 laoshi

表4.8 token

表4.9 users

表4.10 xuanke

表4.11 xuesheng

第5章 系统实现

5.1管理员功能界面的实现

管理员是系统里的最高权限,负责系统里的所有信息的管理、审核。包括学生信息、课程信息、成绩信息等。

5.1.1用户登录界面的实现

本功能设计的目的是帮助系统检验身份,保证系统的安全。在用户登录功能界面里的元素包括按钮、列表框、文字、图片等。用户输入框、密码输入框、权限列表框都居中展示。用户登录界面的实现界面如下图5.1所示:

图5.1用户登录界面的实现效果

5.1.2个人中心管理功能的实现界面

在个人中心管理功能里,管理员可以设置新的管理员,可以查询已有的管理员和修改当前登录的登录密码。设置多个管理员可以让更多的工作人员参与进来。修改个人信息功能的实现界面如下图5.2所示:

图5.2修改个人信息功能的实现界面

修改密码的实现界面如下图5.3所示:

图5.3修改密码的实现界面

5.1.3课程信息管理功能的实现界面

管理员登录后在课程信息管理功能里可以发布新的课程和删除不使用的课程以及修改错误的课程,管理员查询课程信息的实现界面如下图5.4所示:

图5.4管理员查询课程信息的功能实现界面

5.1.4老师信息管理功能的实现界面

管理员在本功能里可以添加老师资料,可以为老师分配账号和密码,帮助老师使用本系统,当老师辞职后管理员可以及时的删除老师信息防止系统内容的外泄。管理员查询老师信息功能的实现界面如下图5.5所示:

图5.5管理员查询老师信息功能的实现界面

5.1.5班级管理功能的实现界面

班级管理功能里可以看到班级的编号和标题,点击添加班级信息可以进入添加界面里实现班级的更新。管理员查询班级信息功能的实现界面如下图5.6所示:

图5.6管理员查询班级信息功能的实现界面

5.1.6学生信息管理功能的实现界面

管理员可以添加学生信息和查询学生信息,学生信息添加后,学生可以自己修改自己的资料。管理员查询学生信息功能的实现界面如下图5.7所示:

图5.7管理员查询学生信息功能的实现界面

5.1.7成绩管理功能的实现界面

管理员也可以对学生的成绩进行修改和删除以此来审核老师给发布的学生成绩。管理员查询成绩信息功能的实现界面如下图5.8所示:

图5.8管理员查询成绩信息功能的实现界面

5.1.8教学计划管理功能的实现界面

管理员可以查询老师制定的教学计划,并可以进行修改和添加、删除。管理员查询教学计划功能的实现界面如下图5.9所示:

图5.9管理员查询教学计划信息的实现界面

5.1.9学生选课管理功能的实现界面

管理员也可以查询学生的选课详情并进行修改和删除、查询。学生选课功能的实现界面如下图5.10所示:

图5.10管理员查询学生选课信息的实现界面

5.1.10教室管理功能的实现界面

本功能属于教学资源管理的一部分,管理员可以设置教室和修改教室、删除教室。教室管理功能的实现界面如下图5.11所示:

图5.11管理员查询教室信息的实现界面

5.1.11院系管理功能的实现界面

本功能同样属于教学资源功能的一部分。管理员可以更新院系信息。实现界面如下图5.12所示:

图5.12院系信息的实现界面

5.2学生功能的界面详细实现

5.2.1个人资料管理功能的实现界面

学生可以修改自己的个人资料使其保证正确性。学生修改个人资料管理功能的实现界面如下图5.13所示:

图5.13学生修改个人资料管理功能的实现界面

5.2.2在线选课功能的实现界面

在本功能里,学生可以查询课程信息,可以看到课程的所负责老师和学分等信息,然后可以进行选择。选课管理功能的实现界面如下图5.14所示:

图5.14选课管理功能的实现界面

5.2.3成绩查询功能的实现界面

学生可以查询课程的成绩。成绩查询功能的实现界面如下图5.15所示:

图5.15学生查询成绩的功能实现界面

5.2.4选课管理功能的实现界面

学生选课后可以查看自己选择的所有课程。实现界面如下图5.16所示:

图5.16选课管理功能的实现界面

5.2.5教学资源管理功能的实现界面

学生可以查看教室信息、老师信息和院系信息。实现界面如下图5.17所示:

图5.17教学资料管理功能的实现界面

5.3老师功能的详细实现界面

老师的主要功能为为学生打分,可以根据课程名称、类型、学号、姓名、班级进行学生成绩的查询,并且可以发布教学计划。老师功能的实现界面如下图5.18所示:

图5.18老师角色功能的实现界面

第6章 系统测试

系统测试

JiaoxuejihuaController.java

package com.controller;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.entity.JiaoxuejihuaEntity;
import com.entity.KechengEntity;
import com.entity.view.JiaoxuejihuaView;
import com.service.*;
import com.utils.PageUtils;
import com.utils.PoiUtil;
import com.utils.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 教学计划
 * 后端接口
 * @author
 * @email
*/
@RestController
@Controller
@RequestMapping("/jiaoxuejihua")
public class JiaoxuejihuaController {
    private static final Logger logger = LoggerFactory.getLogger(JiaoxuejihuaController.class);

    @Autowired
    private JiaoxuejihuaService jiaoxuejihuaService;


    @Autowired
    private TokenService tokenService;
    @Autowired
    private DictionaryService dictionaryService;

    //级联表service
    @Autowired
    private KechengService kechengService;

    @Autowired
    private XueshengService xueshengService;
    @Autowired
    private LaoshiService laoshiService;


    /**
    * 后端列表
    */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){
        logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params));
        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永不会进入");
        else if("学生".equals(role))
            params.put("xueshengId",request.getSession().getAttribute("userId"));
        else if("老师".equals(role))
            params.put("laoshiId",request.getSession().getAttribute("userId"));
        if(params.get("orderBy")==null || params.get("orderBy")==""){
            params.put("orderBy","id");
        }
        PageUtils page = jiaoxuejihuaService.queryPage(params);

        //字典表数据转换
        List<JiaoxuejihuaView> list =(List<JiaoxuejihuaView>)page.getList();
        for(JiaoxuejihuaView c:list){
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(c, request);
        }
        return R.ok().put("data", page);
    }

    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id, HttpServletRequest request){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        JiaoxuejihuaEntity jiaoxuejihua = jiaoxuejihuaService.selectById(id);
        if(jiaoxuejihua !=null){
            //entity转view
            JiaoxuejihuaView view = new JiaoxuejihuaView();
            BeanUtils.copyProperties( jiaoxuejihua , view );//把实体数据重构到view中

                //级联表
                KechengEntity kecheng = kechengService.selectById(jiaoxuejihua.getKechengId());
                if(kecheng != null){
                    BeanUtils.copyProperties( kecheng , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并排除id和创建时间字段
                    view.setKechengId(kecheng.getId());
                }
            //修改对应字典表字段
            dictionaryService.dictionaryConvert(view, request);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody JiaoxuejihuaEntity jiaoxuejihua, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,jiaoxuejihua:{}",this.getClass().getName(),jiaoxuejihua.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
        if(false)
            return R.error(511,"永远不会进入");

        Wrapper<JiaoxuejihuaEntity> queryWrapper = new EntityWrapper<JiaoxuejihuaEntity>()
            .eq("kecheng_id", jiaoxuejihua.getKechengId())
            .eq("jiaoxuejihua_uuid_number", jiaoxuejihua.getJiaoxuejihuaUuidNumber())
            .eq("jiaoxuejihua_name", jiaoxuejihua.getJiaoxuejihuaName())
            .eq("jiaoxuejihua_types", jiaoxuejihua.getJiaoxuejihuaTypes())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        JiaoxuejihuaEntity jiaoxuejihuaEntity = jiaoxuejihuaService.selectOne(queryWrapper);
        if(jiaoxuejihuaEntity==null){
            jiaoxuejihua.setInsertTime(new Date());
            jiaoxuejihua.setCreateTime(new Date());
            jiaoxuejihuaService.insert(jiaoxuejihua);
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }

    /**
    * 后端修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody JiaoxuejihuaEntity jiaoxuejihua, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,jiaoxuejihua:{}",this.getClass().getName(),jiaoxuejihua.toString());

        String role = String.valueOf(request.getSession().getAttribute("role"));
//        if(false)
//            return R.error(511,"永远不会进入");
        //根据字段查询是否有相同数据
        Wrapper<JiaoxuejihuaEntity> queryWrapper = new EntityWrapper<JiaoxuejihuaEntity>()
            .notIn("id",jiaoxuejihua.getId())
            .andNew()
            .eq("kecheng_id", jiaoxuejihua.getKechengId())
            .eq("jiaoxuejihua_uuid_number", jiaoxuejihua.getJiaoxuejihuaUuidNumber())
            .eq("jiaoxuejihua_name", jiaoxuejihua.getJiaoxuejihuaName())
            .eq("jiaoxuejihua_types", jiaoxuejihua.getJiaoxuejihuaTypes())
            ;

        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        JiaoxuejihuaEntity jiaoxuejihuaEntity = jiaoxuejihuaService.selectOne(queryWrapper);
        if(jiaoxuejihuaEntity==null){
            jiaoxuejihuaService.updateById(jiaoxuejihua);//根据id更新
            return R.ok();
        }else {
            return R.error(511,"表中有相同数据");
        }
    }



    /**
    * 删除
    */
    @RequestMapping("/delete")
    public R delete(@RequestBody Integer[] ids){
        logger.debug("delete:,,Controller:{},,ids:{}",this.getClass().getName(),ids.toString());
        jiaoxuejihuaService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }


    /**
     * 批量上传
     */
    @RequestMapping("/batchInsert")
    public R save(String fileName, HttpServletRequest request){
        logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName);
        Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")));
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            List<JiaoxuejihuaEntity> jiaoxuejihuaList = new ArrayList<>();//上传的东西
            Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段
            Date date = new Date();
            int lastIndexOf = fileName.lastIndexOf(".");
            if(lastIndexOf == -1){
                return R.error(511,"该文件没有后缀");
            }else{
                String suffix = fileName.substring(lastIndexOf);
                if(!".xls".equals(suffix)){
                    return R.error(511,"只支持后缀为xls的excel文件");
                }else{
                    URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径
                    File file = new File(resource.getFile());
                    if(!file.exists()){
                        return R.error(511,"找不到上传文件,请联系管理员");
                    }else{
                        List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件
                        dataList.remove(0);//删除第一行,因为第一行是提示
                        for(List<String> data:dataList){
                            //循环
                            JiaoxuejihuaEntity jiaoxuejihuaEntity = new JiaoxuejihuaEntity();
//                            jiaoxuejihuaEntity.setKechengId(Integer.valueOf(data.get(0)));   //课程 要改的
//                            jiaoxuejihuaEntity.setJiaoxuejihuaUuidNumber(data.get(0));                    //教学计划编号 要改的
//                            jiaoxuejihuaEntity.setJiaoxuejihuaName(data.get(0));                    //教学计划名称 要改的
//                            jiaoxuejihuaEntity.setJiaoxuejihuaTypes(Integer.valueOf(data.get(0)));   //计划类型 要改的
//                            jiaoxuejihuaEntity.setJiaoxuejihuaContent("");//详情和图片
//                            jiaoxuejihuaEntity.setInsertTime(date);//时间
//                            jiaoxuejihuaEntity.setCreateTime(date);//时间
                            jiaoxuejihuaList.add(jiaoxuejihuaEntity);


                            //把要查询是否重复的字段放入map中
                                //教学计划编号
                                if(seachFields.containsKey("jiaoxuejihuaUuidNumber")){
                                    List<String> jiaoxuejihuaUuidNumber = seachFields.get("jiaoxuejihuaUuidNumber");
                                    jiaoxuejihuaUuidNumber.add(data.get(0));//要改的
                                }else{
                                    List<String> jiaoxuejihuaUuidNumber = new ArrayList<>();
                                    jiaoxuejihuaUuidNumber.add(data.get(0));//要改的
                                    seachFields.put("jiaoxuejihuaUuidNumber",jiaoxuejihuaUuidNumber);
                                }
                        }

                        //查询是否重复
                         //教学计划编号
                        List<JiaoxuejihuaEntity> jiaoxuejihuaEntities_jiaoxuejihuaUuidNumber = jiaoxuejihuaService.selectList(new EntityWrapper<JiaoxuejihuaEntity>().in("jiaoxuejihua_uuid_number", seachFields.get("jiaoxuejihuaUuidNumber")));
                        if(jiaoxuejihuaEntities_jiaoxuejihuaUuidNumber.size() >0 ){
                            ArrayList<String> repeatFields = new ArrayList<>();
                            for(JiaoxuejihuaEntity s:jiaoxuejihuaEntities_jiaoxuejihuaUuidNumber){
                                repeatFields.add(s.getJiaoxuejihuaUuidNumber());
                            }
                            return R.error(511,"数据库的该表中的 [教学计划编号] 字段已经存在 存在数据为:"+repeatFields.toString());
                        }
                        jiaoxuejihuaService.insertBatch(jiaoxuejihuaList);
                        return R.ok();
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.error(511,"批量插入数据异常,请联系管理员");
        }
    }






}

CommonServiceImpl.java

package com.service.impl;


import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dao.CommonDao;
import com.service.CommonService;


/**
 * 系统用户
 * @author
 * @date
 */
@Service("commonService")
public class CommonServiceImpl implements CommonService {
	
	@Autowired
	private CommonDao commonDao;

	@Override
	public List<String> getOption(Map<String, Object> params) {
		return commonDao.getOption(params);
	}
	
	@Override
	public Map<String, Object> getFollowByOption(Map<String, Object> params) {
		return commonDao.getFollowByOption(params);
	}


	/**
	 tableName 查询表
	 condition1 条件1
	 condition1Value 条件1值
	 average 计算平均评分
	 * */
	public Map<String, Object> queryScore(Map<String, Object> params){
		return commonDao.queryScore(params);
	}
	
	@Override
	public void sh(Map<String, Object> params) {
		commonDao.sh(params); 
	}

	@Override
	public int remindCount(Map<String, Object> params) {
		return commonDao.remindCount(params);
	}

	@Override
	public Map<String, Object> selectCal(Map<String, Object> params) {
		return commonDao.selectCal(params);
	}
	
	@Override
	public List<Map<String, Object>> selectGroup(Map<String, Object> params) {
		return commonDao.selectGroup(params);
	}
	
	@Override
	public List<Map<String, Object>> selectValue(Map<String, Object> params) {
		return commonDao.selectValue(params);
	}

	@Override
	public List<Map<String, Object>> chartBoth(Map<String, Object> params) {
		return commonDao.chartBoth(params);
	}

	@Override
	public List<Map<String, Object>> chartOne(Map<String, Object> params) {
		return commonDao.chartOne(params);
	}


	/**
	 * 新的级联字典表的  分组求和统计
	 * @param params
	 * @return
	 */
	@Override
	public List<Map<String, Object>> newSelectGroupSum(Map<String, Object> params) {
		return commonDao.newSelectGroupSum(params);
	}


	/**
	 * 新的级联字典表的  分组条数统计
	 * @param params
	 * @return
	 */
	@Override
	public List<Map<String, Object>> newSelectGroupCount(Map<String, Object> params) {
		return commonDao.newSelectGroupCount(params);
	}

	/**
	 * 当前表的日期分组求和
	 * @param params
	 * @return
	 */
	@Override
	public List<Map<String, Object>> newSelectDateGroupSum(Map<String, Object> params) {
		return commonDao.newSelectDateGroupSum(params);
	}


	/**
	 * 查询字典表的分组统计总条数
	 * @param params
	 * @return
	 */
	@Override
	public List<Map<String, Object>> newSelectDateGroupCount(Map<String, Object> params) {
		return commonDao.newSelectDateGroupCount(params);
	}

	@Override
	public int plusCloumNumber(Map<String, Object> params) {
		return commonDao.plusCloumNumber(params);
	}
	@Override
	public int reduceCloumNumber(Map<String, Object> params) {
		return commonDao.reduceCloumNumber(params);
	}
	@Override
	public int updateCloumValue(Map<String, Object> params) {
		return commonDao.updateCloumValue(params);
	}

/**
 * 饼状图
 * -- 饼状图  查询当前表
 -- 				查询字典表【月】
 -- 				 统计   -- 查询某个月的每个类型的订单销售数量
 -- 				 求和   -- 查询某个月的每个类型的订单销售额
 -- 				查询某个字符串【月】
 -- 				 统计   -- 查询某个月的每个员工的订单销售数量
 -- 				 求和   -- 查询某个月的每个员工的订单销售额
 -- 				查询时间【年】
 -- 				 统计 	-- 查询每个月的订单销售数量
 -- 				 求和 	-- 查询每个月的订单销售额
 -- 饼状图  查询级联表
 -- 				查询字典表
 -- 				 统计  	-- 查询某个月的每个类型的订单销售数量
 -- 				 求和   -- 查询某个月的每个类型的订单销售额
 -- 				查询某个字符串
 -- 				 统计   -- 查询某个月的每个员工的订单销售数量
 -- 				 求和   -- 查询某个月的每个员工的订单销售额
 -- 				查询时间
 -- 				 统计 	-- 统计每个月的订单销售数量
 -- 				 求和 	-- 查询每个月的订单销售额
 */


/**
 * 柱状图
 -- 柱状图  查询当前表
 --             某个【年,月】
 -- 			 当前表 2 级联表 1
 -- 						统计
 --   						【日期,字符串,下拉框】
 -- 						求和
 --   						【日期,字符串,下拉框】
 -- 柱状图  查询级联表
 -- 					某个【年,月】
 -- 						统计
 --   						【日期,字符串,下拉框】
 -- 						求和
 --   						【日期,字符串,下拉框】
 */
	/**
	 * 柱状图求和
	 * @param params
	 * @return
	 */
	public List<Map<String, Object>> barSum(Map<String, Object> params){
		return commonDao.barSum(params);
	}

	/**
	 * 柱状图统计
	 * @param params
	 * @return
	 */
	public List<Map<String, Object>> barCount(Map<String, Object> params){
		return commonDao.barCount(params);
	}

}

KechengServiceImpl.java
package com.service.impl;

import com.utils.StringUtil;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.*;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import com.utils.PageUtils;
import com.utils.Query;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import com.dao.KechengDao;
import com.entity.KechengEntity;
import com.service.KechengService;
import com.entity.view.KechengView;

/**
 * 课程 服务实现类
 */
@Service("kechengService")
@Transactional
public class KechengServiceImpl extends ServiceImpl<KechengDao, KechengEntity> implements KechengService {

    @Override
    public PageUtils queryPage(Map<String,Object> params) {
        if(params != null && (params.get("limit") == null || params.get("page") == null)){
            params.put("page","1");
            params.put("limit","10");
        }
        Page<KechengView> page =new Query<KechengView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }


}

声明

本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。

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

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

相关文章

多网站域名共享微信网页授权:PHP实现微信授权代理转发

在做网站需要微信扫码或微信内授权注册登陆&#xff0c;但是做过类似功能的都知道&#xff0c;需要授权登陆比较麻烦。 需要满足以下条件&#xff1a; 申请公众号网站域名备案开放平台注册新建应用审核 有没有简单&#xff0c;不需要申请免备案可用的方案&#xff0c;答案肯…

解决 ValueError: did not find HDF5 headers----安装netCDF4报错

报错如图 报错说是hdf5找不到&#xff0c;按照这个思路搞了半天都没搞好。后来换了一个安装命令 pip install netcdf41.5.7 成功&#xff01;&#xff01;

基于vue框架的大连盐业有限公司生产管理系统的设计与实现3hk5y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;计划员,工艺员,生产建模,生产计划,生产信息,生产监视,工艺质量,盐政信息 开题报告内容 一、引言 随着信息技术的飞速发展和市场竞争的日益激烈&#xff0c;传统盐业企业如大连盐业有限公司正面临着转型升级的迫切需求。传统管理模式下…

python-比较月亮大小/数组下标/人见人爱a+b

一:比较月亮大小 题目描述 小理是一名出色的狼人。众所周知&#xff0c;狼人只有在满月之夜才会变成狼。 同时&#xff0c;月亮的大小随着时间变化&#xff0c;它的大小变化 3030 天为一循环。 它的变化情况(从第一天开始)为 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,1…

Python提供内置正则表达式库

正则表达式是一种强大的文本处理工具&#xff0c;可以匹配文本片段的模式 最简单的正则表达式就是普通的字符串&#xff0c;可以匹配自身 要注意的是&#xff0c;正则表达式并不是一个程序&#xff0c;它使用一种特定的语法模式来描述在搜索文本时要匹配的一个或多个字符串。正…

UE5 C++: 插件编写05 | 批量删除无用资产

删除无用的asset 已经在地图中使用的asset会有asset reference EditorAssetLibrary&#xff08;按F12&#xff09;open header file&#xff0c;会有如下一个功能&#xff0c;可以找asset reference&#xff0c;返回bool值 UFUNCTION(BlueprintCallable, Category "Edi…

wpf在图上画矩形,矩形可拖动、大小可调节,使用装饰器Adorner调整矩形大小,限制拖动和调节范围

效果 功能 使用wpf实现 在图片上画一个矩形框该矩形框可以调节大小该矩形框可以拖动调整位置 注&#xff1a;这里的鼠标事件是&#xff0c;双击在图上画一个固定大小的矩形框&#xff0c;右键按住拖动矩形框。有需要的可以自行调整对应的鼠标事件 参考资料&#xff1a;https…

心理测试小程序开发心理健康MBTI人格测试,小程序源码部署支持多种流量主

简介 在当今这个高速运转的社会里&#xff0c;个人内心性格与心理健康日益成为人们关注的焦点。随着科技的日新月异&#xff0c;心理评估的方式正经历着深刻的变革&#xff0c;从传统的面对面咨询室中解放出来&#xff0c;无缝融入了我们日常使用的移动设备之中。这一趋势极大…

【网络安全】网络基础第一阶段——第四节:网络协议基础---- VRRP与网络架构设计

目录 一、VRRP 1.1 VRRP使用场景及简介 1.2 VRRP基本原理 1.2.1 VRRP基本结构 1.2.2 设备类型 1.2.3 VRRP工作原理 1.3 VRRP的基本配置 1.3.1 基于三层交换机的VRRP组配置 1.3.2 SMTPVRRP经典组网 1.4 端口聚合 1.4.1 端口聚合技术 1.4.2 聚合模式 1.4.3 Eth-trun…

Python项目Flask框架整合Redis

一、在配置文件中创建Redis连接信息 二、 实现Redis配置类 import redis from config.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWD, REDIS_DB, EXPIRE_TIMEclass RedisDb():def __init__(self, REDIS_HOST, REDIS_PORT, REDIS_DB, EXPIRE_TIME, REDIS_PASSWD):# 建立…

【笔记】KaiOS 系统框架和应用结构(APP界面逻辑)

KaiOS系统框架 最早自下而上分成Gonk-Gecko-Gaia层,代码有同名的目录,现在已经不用这种称呼。 按照官网3.0的版本迭代介绍,2.5->3.0已经将系统更新成如下部分: 仅分为上层web应用和底层平台核心,通过WebAPIs连接上下层,这也是kaios系统升级变更较大的部分。 KaiOS P…

Spring Boot 点餐系统:您的餐饮技术伙伴

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统&#xff0c;它彻底改变了过去传统的…

Spring不能处理的循环依赖

文章目录 场景一&#xff1a;prototype 类型的循环依赖场景二&#xff1a; constructor 注入的循环依赖场景三&#xff1a;普通的 AOP 代理 Bean 的循环依赖–默认是可以的场景四&#xff1a;Async 增强的 Bean 的循环依赖总结 参考&#xff1a;https://blog.csdn.net/wang4896…

Redis系列补充:聊聊布隆过滤器(go语言实践篇)

1 介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是 Redis 4.0 版本之后提供的新功能&#xff0c;我们一般将它当做插件加载到 Redis Service服务器中&#xff0c;给 Redis 提供强大的滤重功能。 它是一种概率性数据结构&#xff0c;可用于判断一个元素是否存在于一个集…

Elasticsearch导出导入数据

1.概念回顾 2.基础操作 展示详细信息 GET&#xff1a;http://127.0.0.1:9200/_cat/indices?v Java代码将文件导入到ES package com.Graph.medicalgraph;import org.apache.http.HttpHost; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.act…

Java中的位图和布隆过滤器(如果想知道Java中有关位图和布隆过滤器的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习之前的数据结构的时候&#xff0c;我们使用的数据量都不是很大&#xff0c;但是在生活中&#xff0c;我们常常面临着要处理大量数据结果并得出最终结果&#xff0c;那么有没有什么数据结构可以帮助我们实现这样的功能呢&#xff1f; ✨✨✨这里是秋刀鱼不…

Circular dependency between the following tasks(gradle循环依赖的问题)

简介 目前公司项目主要使用gradle而不是maven&#xff0c;所以对gradle的使用不是很清楚&#xff0c;遇到这个问题的时候一直在晚上查资料&#xff0c;但是解决方案基本都是安卓的&#xff0c;后续先前辈请教了一下&#xff0c;才找到解决方案。 问题解析 本质上就是两个模块…

【QT 5 调试软件+Linux下调用脚本shell-无法调度+目录拼写+无法找目录+sudo权限(2)+问题解决方式+后续补充】

【QT 5 调试软件Linux下调用脚本shell-无法调度目录拼写无法找目录sudo权限&#xff08;2&#xff09;问题解决方式后续补充】 1、前言2、问题综述&#xff1a;自研qt上位机无法调度脚本&#xff08;1&#xff09;可能原因1&#xff1a;无法找到目录情况说明&#xff1a;解决思…

程序人生:软件测试 非技术性面试题【建议每个测试人观看】

1、自我介绍&#xff1a;三分钟左右 2、为什么从郑州/太原离职&#xff1f; 3、你的职业规划是什么样的&#xff1f; 4、对下一家公司有什么自己的想法吗&#xff1f; 5、你觉得作为一名测试工程师&#xff0c;应该具备什么样的素养&#xff1f; 6、你觉得管理层&#xff…

HTML | 外部引入 CSS 的2种方式:link和@import有什么区别?

外部引入 CSS 有2种方式&#xff0c;link 和 import。就结论而言&#xff0c;强烈建议使用 link &#xff0c;慎用 import 方式。 两者都是外部引用 CSS 的方式&#xff0c;但是存在一定的区别&#xff1a; &#xff08;1&#xff09;从属关系区别 link是HTML / XHTML标签&a…