如何使用ssm实现班主任助理系统的设计与实现

233 篇文章 0 订阅
132 篇文章 0 订阅

@TOC

ssm054班主任助理系统的设计与实现+jsp

绪论

1.1 研究背景

当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前,不接受信息改革带来的信息技术的企业随时面临被淘汰,被取代的风险。所以当今,各个行业领域,不管是传统的教育行业,餐饮行业,还是旅游行业,医疗行业等领域都将使用新的信息技术进行信息革命,改变传统的纸质化,需要人手工处理工作事务的办公环境。软件信息技术能够覆盖社会各行业领域是时代的发展要求,各种数据以及文件真正实现电子化是信息社会发展的不可逆转的必然趋势。本班主任助理系统也是紧跟科学技术的发展,运用当今一流的软件技术实现软件系统的开发,让学生管理完全通过管理系统实现科学化,规范化,程序化管理。从而帮助信息管理者节省事务处理的时间,降低数据处理的错误率,对于基础数据的管理水平可以起到促进作用,也从一定程度上对随意的业务管理工作进行了避免,同时,班主任助理系统的数据库里面存储的各种动态信息,也为上层管理人员作出重大决策提供了大量的事实依据。总之,班主任助理系统是一款可以真正提升管理者的办公效率的软件系统。

1.2 目的和意义

信息数据的处理完全依赖人工进行操作,会耗费大量的人工成本,特别是面对大量的数据信息时,传统人工操作不仅不能对数据的出错率进行保证,还容易出现各种信息资源的低利用率与低安全性问题。更有甚者,耽误大量的宝贵时间,尤其是对信息的更新,归纳与统计更是耗财耗力的过程。所以电子化信息管理的出现就能缓解以及改变传统人工方式面临的处境,一方面可以确保信息数据在短时间被高效处理,还能节省人力成本,另一方面可以确保信息数据的安全性,可靠性,并可以实现信息数据的快速检索与修改操作,这些优点是之前的旧操作模式无法比拟的。因此班主任助理系统为数据信息的管理模式的升级与改革提供了重要的窗口。

1.3 论文结构安排

为了帮助用户更好的了解和理解程序的开发流程与相关内容,本文将通过六个章节进行内容阐述。

第一章:描述了程序的开发背景,程序运用于现实生活的目的与意义,以及程序文档的结构安排信息;

第二章:描述了程序的开发环境,包括程序开发涉及到的技术,程序开发使用的数据存储工具等信息;

第三章:描述了程序着手进行开发时,会面临的可行性问题,并对程序功能以及性能要求进行描述;

第四章:描述了程序大功能模块下的功能细分信息,以及存储程序数据的数据库表文件结构的设计信息等;

第五章:描述了程序的功能实现界面的内容,也对程序操作人员操作的部分功能进行了描述;

第六章:描述了程序功能的测试内容,并介绍了系统测试的概念与方法。

2 相关技术

2.1 SSM框架介绍

本课题程序开发使用到的框架技术,英文名称缩写是SSM,在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等,作为一个课题程序采用SSH框架也可以,SSM框架也可以,SpringMVC也可以。SSH框架是属于重量级别的框架,配置繁琐,不够灵活,修改程序需要修改好多个文件,并且运行起来也占用内存较高,CPU使用率相对也高,SpringMVC是Spring开发的一套MVC架构,更灵活更好用,SSM框架取中间值,既没有SSH臃肿,也没有SpringMVC简化,属于中间级别的,在配置过程和使用过程中更能编写和理解。MyBatis框架取代Hibernate框架是因为它更灵活,不需要完全在框架里操作,它在数据操作上可以写出更灵活的代码,它的性能也比Hibernate框架更稳定。总的来说,使用SSM框架是通过综合考虑而使用的,网上有很多的使用教程和心得体会,而且SSM又是这么的流行,用SSM框架开发是顺其自然的。

2.2 B/S结构介绍

在早期,一些使用HTML语言编写的文件,再集合一些其它资源文件就可以组成一个最简单的Web程序,了解了Web程序也需要了解Web站点,它们之间的关系就是一个或者多个Web程序可以放在Internet上的一个Web站点(Web服务器)中进行使用。可以说Web应用程序的开发也带动了B/S这种网络结构模式的兴起。B是Brower(浏览器)的首字母,S是Server(服务器)的首字母,两个首字母进行组合就成了网络结构模式的简称B/S。由于这种结构模式通过安装在客户端的浏览器进行服务器的访问,可以把程序的核心功能安排在服务器中进行处理,给程序的开发,后期使用和维护省去了许多工作。图2.1展示的就是使用这种架构开发的程序的工作原理。

图2.1 B/S架构的工作原理图

2.3 Mysql数据库介绍

开发的程序面向用户的只是程序的功能界面,让用户操作程序界面的各个功能,那么很多人就会问,用户使用程序功能生成的数据信息放在哪里的?这个就需要涉及到数据库的知识了,一般来说,程序开发通常就会对常用数据存储工具的特点进行分析比对,比如Mysql数据库的特点与优势,Access数据库的特点与优势,Sqlserver数据库的特点与优势等,最终看哪个数据库与需要开发的程序比较匹配,也符合程序功能运行需要的数据存储要求,比如,需要开发商业级别的程序,存储的数据对数据库要求较高,可以选用Oracle,如果只是比较简单的程序,对数据存储没有过多要求,可以选用微软旗下的Access,当开发程序要求数据库占用空间小,并能满足程序数据存储要求时,就可以考虑Oracle公司从瑞典MySQL AB公司在很早之前就收购过一个关系型数据库,它是现在的Mysql数据库。在数据库工具里面它是最受认可的其中一个应用软件。需要说明的信息就是,本程序的开发就运用到了此数据库。它将程序数据通过使用不同的数据表格进行保存,在增加了程序数据的存储速度的时候,也提高了数据库的灵活性。 图2.2展示的就是MySQL的架构图。

图2.2 MySQL数据库架构图

3 系统分析

当用户确定开发一款程序时,是需要遵循下面的顺序进行工作,概括为:系统分析-->系统设计-->系统开发-->系统测试,无论这个过程是否有变更或者迭代,都是按照这样的顺序开展工作的。系统分析就是分析系统需要做什么的问题,主要目的就是确定系统的功能,这也为接下来的工作做了一个好的开端。

3.1 系统可行性分析

开发一款程序软件不仅需要时间,也需要人力,物力资源。而进行可行性分析这个环节就是解决用户这方面的疑问,看看程序在当前的条件下是否可以进行开发。

3.1.1 技术可行性分析

此程序选用的开发语言是Java,这种编程语言有着丰富的数据类型,在指令控制语句上也比较完善,更重要的就是对类与对象的大力支持,这些优点为程序开发者提供了技术保障,尤其是现在代码都逐渐模块化,有关系统功能开发的源码在网络上都公开展示了,所以让具备一定计算机开发基础的开发人员独立开发系统在技术上也逐渐容易。

3.1.2 经济可行性分析

开发此程序最关键的设备就是一台电脑,无论是学校计算机室配备的电脑,还是自己入学以来购置的笔记本,都是可以符合开发要求的设备,另外在网络上,学校本已完全覆盖了校园网,所以在设备以及网络上无须考虑经济问题。

3.1.3 运行可行性分析

随着电脑软件以及配套硬件的完善升级,当下的计算机环境是一片大好,尤其是计算机已经广泛普及到家家户户,所以计算机设备现在是随处可见,由于本次开发的程序占有的资源耗费较小,在一般的电脑或笔记本上都能轻松运转起来。

通过上面的可行性描述,可以从经济,技术,运行方面解决程序开发是否可行的问题。因此可以认为该程序软件是可以进行开发的。

3.2 系统性能分析

系统性能分析也是比较重要的内容,进行系统性能分析就是为了确保系统的功能要能够在生活中运行使用时,达到规定的指标,因此一个完整的系统软件,是需要进行系统的性能分析这个步骤的。本次进行性能分析主要从易用性指标,可扩展性指标,系统健壮性指标,系统安全性指标这几个方面进行分析。

3.2.1 易用性指标

本次程序软件的开发的目的就是让使用者可以通过使用该软件提高信息数据的管理效率,同时该程序软件也需要针对不同的操作用户设置对应的功能,因此,此程序的操作流程应该尽量与用户日常操作软件的行为习惯相贴合,另外,程序软件的设计与开发也应考虑非计算机专业用户的计算机操作水平,要让大部分使用者都可以轻松操作程序提供的各个功能。

3.2.2 可扩展性指标

当前需要开发的程序软件是根据当下的用户需求进行设计开发的,但是随着时间的推移,社会大环境的改变,开发出的程序也是需要与时俱进的,需要根据用户不断变换的需求进行相应的功能内容的扩展,需要注意的就是,当对成型的程序进行功能模块新增时,仍然需要保证程序原有架构以及功能不能受到影响,新增的功能模块在系统中也能够运行正常,该指标达标也就可以保证此程序是可以在满足信息管理要求下,从容应对市场环境的变化。

3.2.3 健壮性指标

程序软件的开发就是为了投入使用时,可以一直稳定的处理各种数据信息,程序软件一旦不稳定,也会给使用者带来干扰。因此从性能分析的角度,就要要求程序软件在应对使用者的误操作,或者是使用者因为各种原因,填写有误的数据等情况时,程序要一直保持稳定,并能够正常让使用者进行使用。当程序的某个功能模块出现异常时,程序的其它功能模块也要能够确保正常使用。程序的健壮性指标达标可以让使用者产生良好的用户体验。

3.2.4 安全性指标

程序软件的安全问题是首要问题,毕竟程序对应数据库里面存放的数据信息是庞大的,里面也包括了许多重要的个人信息,这就对程序要具备一个完善的安全机制提出了要求。因此程序必须要设置登录功能用以进行用户身份的检查,以及身份和权限的匹配,通过对不同用户身份进行功能约束,绝不容忍用户越权操作程序。另外,也需要时刻防范计算机病毒,还有黑客,通过采取针对性的办法进行安全应对,确保程序时刻处于安全的环境,让使用者放心使用。

3.3 系统流程分析

3.3.1 操作流程分析

程序上交给用户进行使用时,需要提供程序的操作流程图(如图3.1所示),这样便于用户容易理解程序的具体工作步骤,现如今程序的操作流程都有一个大致的标准,即先通过登录页面提交登录数据,通过程序验证正确之后,用户才能在程序功能操作区页面操作对应的功能。

图3.1 程序操作流程图

3.3.2 登录流程分析

在这个部分,需要对程序的登录功能模块的运行流程(如图3.2所示),进行单独说明。程序设置登录模块也是为了安全起见,让用户使用放心,登录模块主要就是让用户提交登录信息,程序进行数据验证,验证通过的用户才能够成功登录程序。

图3.2 程序登录流程图

3.3.3 信息添加流程分析

程序的添加功能就是提供给操作者录入信息的功能,不管是涉及到用户信息添加,还是其它功能模块涉及到的信息添加,程序的信息添加流程(如图3.3所示)都是一致的。程序都是先对操作者录入的数据进行判定,这个判定规则是一段提前编写完成的程序代码,当程序判定数据符合要求时,才会把操作者录入的数据登记在数据表里面,比如添加的用户信息,就会把新添加的用户信息写入用户信息的数据表文件里面。

图3.3 信息添加流程图

3.3.4 信息删除流程分析

当从程序里面删除某种无效数据时,遵循程序的信息删除流程(如图3.4所示),先要选中操作者需要删除的数据,程序为了预防操作者误删信息,也会进行提示,当操作者真正确定要删选中的信息时,该信息就会从数据库中被永久删除。

图3.4 信息删除流程图

4 系统设计

班主任助理系统的设计方案比如功能框架的设计,比如数据库的设计的好坏也就决定了该系统在开发层面是否高效,以及在系统维护层面是否容易维护和升级,因为在系统实现阶段是需要考虑用户的所有需求,要是在设计阶段没有经过全方位考虑,那么系统实现的部分也就无从下手,所以系统设计部分也是至关重要的一个环节,只有根据用户需求进行细致全面的考虑,才有希望开发出功能健全稳定的程序软件。

4.1 系统概要设计

本次拟开发的系统为了节约开发成本,也为了后期在维护和升级上的便利性,打算通过浏览器来实现系统功能界面的展示,让程序软件的主要事务集中在后台的服务器端处理,前端部分只用处理少量的事务逻辑。下面使用一张图(如图4.1所示)来说明程序的工作原理。

图4.1 程序工作的原理图

4.2 系统功能结构设计

在分析并得出使用者对程序的功能要求时,就可以进行程序设计了。如图4.2展示的就是管理员功能结构图,管理员主要负责填充学生和其类别信息,并对已填充的数据进行维护,包括修改与删除等。

班主任助理系统

系学生信息管理

反学业预警管理

收成绩管理

申家长信息管理

用请假管理

帐修改学生信息

密添加学生信息

用新增请假记录

用审批请假记录

用请假统计

申修改家长信息

申新增家长信息

申删除家长信息

反删除学业预警

反新增学业预警

反修改学业预警

用新增成绩

用修改成绩

用删除成绩

反实习管理

反新增实习信息

修修改实习信息

反删除实习信息

图4.2 系统功能结构图

4.3 数据库设计

程序功能操作不管是添加,修改,还是删除等功能产生的数据都是经由数据库进行数据保存和更新的,所以一个数据库设计的好坏也是程序是否好坏的判定标准,因为程序的成功,有一半的功劳都是靠数据库的优秀设计。数据库一旦设计得良好是可以减轻开发人员的开发负担的。

4.3.1 数据库E-R图设计

这个部分的设计需要使用到E-R图绘制工具,常用的工具就是Visio工具来绘制E-R模型图,这款工具不仅可以快速创建需要的E-R模型图,而且该工具提供的操作界面很简单,可以短时间内修改绘图界面的图形或者是文字的属性。在绘制E-R模型图时,要分清楚各个图形代表的含义,以免绘制出错,E-R模型图由长方形(实体),椭圆形(属性),菱形(关系)这三部分图形符号组成,绘制期间要区分开来,用准确的图形符号代表相应的数据元素。

各个实体之间的联系用下图的E-R图表示。绘制的系统E-R图见图4.8。

学生管理

属于

属于

查询

管理

用户

分类信息

管理员

班主任助理系统

管理

管理

管理

查询

n

n

n

n

1

1

n

1

1

1

图4.8 系统E-R图

4.3.2 数据库表结构设计

数据库系统一旦选定之后,需要根据程序要求在数据库中建立数据库文件,并在已经完成创建的数据库文件里面,为程序运行中产生的数据建立对应的数据表格,数据表结构设计就是对创建的数据表格进行字段设计,字段长度设计,字段类型设计等,当数据表格合理设计完成之后,才能正常存储相关程序运行产生的数据信息。

表4.1 成绩表

序号列名数据类型说明允许空
1idint(11)主键
2yonghu_idint(11)用户
3exam_namevarchar(200)考试名称
4kemu_typesint(11)科目
5fractiondecimal(10,4)分数
6create_timetimestamp创建时间

表4.2 字典表

序号列名数据类型说明允许空
1idbigint(20)主键
2dic_codevarchar(200)字段
3dic_namevarchar(200)字段名
4code_indexint(11)编码
5index_namevarchar(200)编码名字
6super_idint(11)父字段id
7create_timetimestamp创建时间

表4.3 家长表

序号列名数据类型说明允许空
1jiazhangidint(11)
2jiazhangyonghu_idint(11)
3jiazhangusernamevarchar(200)
4jiazhangpasswordvarchar(200)
5jiazhangnamevarchar(200)
6jiazhangphonevarchar(200)
7jiazhangid_numbervarchar(200)
8jiazhangsex_typesint(11)
9jiazhangmy_photovarchar(200)
10jiazhangcreate_timetimestamp

表4.4 家长交流表

序号列名数据类型说明允许空
1idint(11)主键
2users_idint(11)老师id
3users_contentvarchar(200)留言内容
4insert_timetimestamp留言时间
5jiazhang_idint(11)家长id
6jiazhang_contentvarchar(200)家长回复
7update_timetimestamp回复时间
8create_timetimestamp创建时间

表4.5 请假表

序号列名数据类型说明允许空
1idint(11)主键
2yonghu_idint(11)用户
3ondayvarchar(200)请假开始时间
4downdayvarchar(200)请假结束时间
5qingjia_numberint(11)请假天数
6qingjia_typesint(11)请假状态
7liyou_contentvarchar(200)理由
8update_timetimestamp审批时间
9create_timetimestamp创建时间

表4.6 实习表

序号列名数据类型说明允许空
1idint(11)主键
2yonghu_idint(11)用户
3shixigongsivarchar(200)实习公司
4shixi_contentvarchar(200)实习详情
5start_timetimestamp实习开始时间
6end_timetimestamp实习结束时间
7create_timetimestamp创建时间

5 系统实现

系统实现部分就是将系统分析,系统设计部分的内容通过编码进行功能实现,以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析,系统设计最主要还是进行功能,系统操作逻辑的设计,也包括了存储数据的数据库方面的设计等内容,系统实现就是一个最终的实施阶段,将前面的设计成果进行物理转化,最终出具可以运用于实际的软件系统。

5.1 管理员功能介绍

5.1.1 学生信息管理

如图5.1显示的就是学生信息管理页面,此页面提供给管理员的功能有:添加学生,修改学生,删除学生,通过条件查看学生信息。

图5.1 学生管理页面

5.1.2 请假管理

如图5.2显示的就是请假管理页面,此页面提供给管理员的功能有:查看请假记录,审核请假,删除请假和查看统计功能。

图5.2 请假管理页面

5.1.3 成绩管理

如图5.3显示的就是成绩管理页面,此页面提供给管理员的功能有:添加某一次考试的科目的成绩,删除成绩,修改成绩,查看本次考试各门科目的平均分数。

图5.3 成绩管理页面

5.1.4 住宿管理

如图5.4显示的就是住宿管理页面,此页面提供给管理员的功能有:对学生分配宿舍,修改学生的宿舍,删除宿舍。

图5.4 宿舍管理页面

系统

JiazhangServiceImpl.java
package com.service.impl;

import org.springframework.stereotype.Service;
import java.util.Map;
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 com.dao.JiazhangDao;
import com.entity.JiazhangEntity;
import com.service.JiazhangService;
import com.entity.view.JiazhangView;

/**
 * 家长 服务实现类
 * @author 
 * @since 2021-03-03
 */
@Service("jiazhangService")
@Transactional
public class JiazhangServiceImpl extends ServiceImpl<JiazhangDao, JiazhangEntity> implements JiazhangService {

    @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<JiazhangView> page =new Query<JiazhangView>(params).getPage();
        page.setRecords(baseMapper.selectListView(page,params));
        return new PageUtils(page);
    }

}

XiaoyoujiaoliuController.java
package com.controller;


import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;

import com.entity.YonghuEntity;
import com.service.YonghuService;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.StringUtil;
import java.lang.reflect.InvocationTargetException;

import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;

import com.entity.XiaoyoujiaoliuEntity;

import com.service.XiaoyoujiaoliuService;
import com.entity.view.XiaoyoujiaoliuView;
import com.utils.PageUtils;
import com.utils.R;

/**
 * 校友交流
 * 后端接口
 * @author
 * @email
 * @date 2021-03-03
*/
@RestController
@Controller
@RequestMapping("/xiaoyoujiaoliu")
public class XiaoyoujiaoliuController {
    private static final Logger logger = LoggerFactory.getLogger(XiaoyoujiaoliuController.class);

    @Autowired
    private XiaoyoujiaoliuService xiaoyoujiaoliuService;


    @Autowired
    private TokenService tokenService;


    //级联表service
    @Autowired
    private YonghuService yonghuService;

    //字典表map
    Map<String, Map<Integer, String>> dictionaryMap;

    /**
    * 后端列表
    */
    @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(StringUtil.isNotEmpty(role) && "用户".equals(role)){
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        }
    PageUtils page = xiaoyoujiaoliuService.queryPage(params);

    //字典表数据转换
    List<XiaoyoujiaoliuView> list =(List<XiaoyoujiaoliuView>)page.getList();
        ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
        dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
        for(XiaoyoujiaoliuView c:list){
        this.dictionaryConvert(c);
        }
        return R.ok().put("data", page);
    }
    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        XiaoyoujiaoliuEntity xiaoyoujiaoliu = xiaoyoujiaoliuService.selectById(id);
        if(xiaoyoujiaoliu !=null){
            //entity转view
            XiaoyoujiaoliuView view = new XiaoyoujiaoliuView();
            BeanUtils.copyProperties( xiaoyoujiaoliu , view );//把实体数据重构到view中

            //级联表
            YonghuEntity insertyonghu = yonghuService.selectById(xiaoyoujiaoliu.getInsertyonghuId());
            if(insertyonghu != null){
//                BeanUtils.copyProperties( insertyonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                view.setInsertyonghuId(insertyonghu.getId());
                //因为这个表中级联了两次用户表,所以字段重复,所以BeanUtils.copyProperties无法用 所以需要手动构建字段
                view.setIname(insertyonghu.getName());
                view.setIphone(insertyonghu.getPhone());
                view.setIidNumber(insertyonghu.getIdNumber());
                view.setIsexTypes(insertyonghu.getSexTypes());
                view.setIyonghuTypes(insertyonghu.getYonghuTypes());
            }
            //级联表
            YonghuEntity updateyonghu = yonghuService.selectById(xiaoyoujiaoliu.getUpdateyonghuId());
            if(updateyonghu != null){
//                BeanUtils.copyProperties( updateyonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                view.setUpdateyonghuId(updateyonghu.getId());
                //因为这个表中级联了两次用户表,所以字段重复,所以BeanUtils.copyProperties无法用 所以需要手动构建字段
                view.setUname(updateyonghu.getName());
                view.setUphone(updateyonghu.getPhone());
                view.setUidNumber(updateyonghu.getIdNumber());
                view.setUsexTypes(updateyonghu.getSexTypes());
                view.setUyonghuTypes(updateyonghu.getYonghuTypes());
            }
            //字典表字典转换
            ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
            dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
            this.dictionaryConvert(view);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

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

        xiaoyoujiaoliu.setInsertTime(new Date());
        xiaoyoujiaoliu.setCreateTime(new Date());
        xiaoyoujiaoliu.setUpdateTime(null);
        xiaoyoujiaoliuService.insert(xiaoyoujiaoliu);
        return R.ok();
    }

    /**
    * 修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody XiaoyoujiaoliuEntity xiaoyoujiaoliu, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,xiaoyoujiaoliu:{}",this.getClass().getName(),xiaoyoujiaoliu.toString());
        xiaoyoujiaoliu.setUpdateTime(new Date());
        xiaoyoujiaoliu.setInsertTime(null);
        xiaoyoujiaoliuService.updateById(xiaoyoujiaoliu);//根据id更新
        return R.ok();

    }


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

    /**
    *字典表数据转换
    */
    public void dictionaryConvert(XiaoyoujiaoliuView xiaoyoujiaoliuView){
        //当前表的字典字段

        //级联表的字典字段
        if(StringUtil.isNotEmpty(String.valueOf(xiaoyoujiaoliuView.getIsexTypes()))){
            xiaoyoujiaoliuView.setIsexValue(dictionaryMap.get("sex_types").get(xiaoyoujiaoliuView.getIsexTypes()));
        }
        if(StringUtil.isNotEmpty(String.valueOf(xiaoyoujiaoliuView.getIpoliticsTypes()))){
            xiaoyoujiaoliuView.setIpoliticsValue(dictionaryMap.get("politics_types").get(xiaoyoujiaoliuView.getIpoliticsTypes()));
        }
        if(StringUtil.isNotEmpty(String.valueOf(xiaoyoujiaoliuView.getIyonghuTypes()))){
            xiaoyoujiaoliuView.setIyonghuValue(dictionaryMap.get("yonghu_types").get(xiaoyoujiaoliuView.getIyonghuTypes()));
        }
        if(StringUtil.isNotEmpty(String.valueOf(xiaoyoujiaoliuView.getUsexTypes()))){
            xiaoyoujiaoliuView.setUsexValue(dictionaryMap.get("sex_types").get(xiaoyoujiaoliuView.getUsexTypes()));
        }
        if(StringUtil.isNotEmpty(String.valueOf(xiaoyoujiaoliuView.getUpoliticsTypes()))){
            xiaoyoujiaoliuView.setUpoliticsValue(dictionaryMap.get("politics_types").get(xiaoyoujiaoliuView.getUpoliticsTypes()));
        }
        if(StringUtil.isNotEmpty(String.valueOf(xiaoyoujiaoliuView.getUyonghuTypes()))){
            xiaoyoujiaoliuView.setUyonghuValue(dictionaryMap.get("yonghu_types").get(xiaoyoujiaoliuView.getUyonghuTypes()));
        }
    }


}


ChengjiController.java
package com.controller;


import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
import org.springframework.beans.BeanUtils;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.context.ContextLoader;
import javax.servlet.ServletContext;
import com.service.TokenService;
import com.utils.StringUtil;
import java.lang.reflect.InvocationTargetException;

import org.apache.commons.lang3.StringUtils;
import com.annotation.IgnoreAuth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;

import com.entity.ChengjiEntity;

import com.service.ChengjiService;
import com.entity.view.ChengjiView;
import com.service.YonghuService;
import com.entity.YonghuEntity;
import com.utils.PageUtils;
import com.utils.R;

/**
 * 成绩
 * 后端接口
 * @author
 * @email
 * @date 2021-03-03
*/
@RestController
@Controller
@RequestMapping("/chengji")
public class ChengjiController {
    private static final Logger logger = LoggerFactory.getLogger(ChengjiController.class);

    @Autowired
    private ChengjiService chengjiService;


    @Autowired
    private TokenService tokenService;


    //级联表service
    @Autowired
    private YonghuService yonghuService;

    //字典表map
    Map<String, Map<Integer, String>> dictionaryMap;

    /**
    * 后端列表
    */
    @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(StringUtil.isNotEmpty(role) && "学生".equals(role)){
            params.put("yonghuId",request.getSession().getAttribute("userId"));
        }
    PageUtils page = chengjiService.queryPage(params);

    //字典表数据转换
    List<ChengjiView> list =(List<ChengjiView>)page.getList();
        ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
        dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
        for(ChengjiView c:list){
        this.dictionaryConvert(c);
        }
        return R.ok().put("data", page);
    }
    /**
    * 后端详情
    */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id);
        ChengjiEntity chengji = chengjiService.selectById(id);
        if(chengji !=null){
            //entity转view
            ChengjiView view = new ChengjiView();
            BeanUtils.copyProperties( chengji , view );//把实体数据重构到view中

            //级联表
            YonghuEntity yonghu = yonghuService.selectById(chengji.getYonghuId());
            if(yonghu != null){
                BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createDate"});//把级联的数据添加到view中,并排除id和创建时间字段
                view.setYonghuId(yonghu.getId());
            }
            //字典表字典转换
            ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
            dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
            this.dictionaryConvert(view);
            return R.ok().put("data", view);
        }else {
            return R.error(511,"查不到数据");
        }

    }

    /**
    * 后端保存
    */
    @RequestMapping("/save")
    public R save(@RequestBody ChengjiEntity chengji, HttpServletRequest request){
        logger.debug("save方法:,,Controller:{},,chengji:{}",this.getClass().getName(),chengji.toString());
        Wrapper<ChengjiEntity> queryWrapper = new EntityWrapper<ChengjiEntity>()
            .eq("yonghu_id", chengji.getYonghuId())
            .eq("exam_name", chengji.getExamName())
            .eq("kemu_types", chengji.getKemuTypes())
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        ChengjiEntity chengjiEntity = chengjiService.selectOne(queryWrapper);
        if(chengjiEntity==null){
            chengji.setCreateTime(new Date());
        //  String role = String.valueOf(request.getSession().getAttribute("role"));
        //  if("".equals(role)){
        //      chengji.set
        //  }
            chengjiService.insert(chengji);
            return R.ok();
        }else {
            return R.error(511,"该学生此次考试本门成绩已经录入过");
        }
    }

    /**
    * 修改
    */
    @RequestMapping("/update")
    public R update(@RequestBody ChengjiEntity chengji, HttpServletRequest request){
        logger.debug("update方法:,,Controller:{},,chengji:{}",this.getClass().getName(),chengji.toString());
        //根据字段查询是否有相同数据
        Wrapper<ChengjiEntity> queryWrapper = new EntityWrapper<ChengjiEntity>()
            .notIn("id",chengji.getId())
            .eq("yonghu_id", chengji.getYonghuId())
            .eq("exam_name", chengji.getExamName())
            .eq("kemu_types", chengji.getKemuTypes())
            ;
        logger.info("sql语句:"+queryWrapper.getSqlSegment());
        ChengjiEntity chengjiEntity = chengjiService.selectOne(queryWrapper);
        if(chengjiEntity==null){
            //  String role = String.valueOf(request.getSession().getAttribute("role"));
            //  if("".equals(role)){
            //      chengji.set
            //  }
            chengjiService.updateById(chengji);//根据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());
        chengjiService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }

    /**
    *字典表数据转换
    */
    public void dictionaryConvert(ChengjiView chengjiView){
        //当前表的字典字段
        if(StringUtil.isNotEmpty(String.valueOf(chengjiView.getKemuTypes()))){
            chengjiView.setKemuValue(dictionaryMap.get("kemu_types").get(chengjiView.getKemuTypes()));
        }

        //级联表的字典字段
        if(StringUtil.isNotEmpty(String.valueOf(chengjiView.getSexTypes()))){
            chengjiView.setSexValue(dictionaryMap.get("sex_types").get(chengjiView.getSexTypes()));
        }
    }



    /**
     * 柱状图统计统计
     */
    @RequestMapping("/group/bar")
    @ResponseBody
    public R groupBar() {
        logger.debug("group:,,Controller:{}",this.getClass().getName());
        List<HashMap<String, Object>> map1 = chengjiService.groupBar();
        if(map1!= null && map1.size()>0){

            //以考试名字分组  如  第一次考试 科目1    第二次考试  科目2   把科目1和科目2合并
            Map<String, HashMap<Integer, Double>> map2 = new HashMap<>();//map2 就是可以考试名字作为key  以科目作为vale的值   科目是科目类型为key,平均分数为value
            for(HashMap<String, Object> m:map1){
                Double avg = Double.parseDouble(m.get("avg").toString());//平均分数
                Integer kemu_types = Integer.parseInt(m.get("kemu_types").toString());//科目id
                String exam_name = String.valueOf(m.get("exam_name"));//考试名字
                HashMap<Integer, Double> oldKemu = map2.get(exam_name);
                if( oldKemu==null){
                    //map2中没有这个对象就说明这个考试名字的还没有加入
                    //      科目      平均成绩
                    HashMap<Integer, Double> kemu = new HashMap<>();
                    //以科目为id,以成绩为value
                    kemu.put(kemu_types,avg);
                    map2.put(exam_name,kemu);
                }else{
                    //已经有这个考试名字
                    oldKemu.put(kemu_types,avg);
                }
            }


            //插入空余科目,比如数学这次没有考试给生成0
            ServletContext servletContext = ContextLoader.getCurrentWebApplicationContext().getServletContext();
            dictionaryMap = (Map<String, Map<Integer, String>>) servletContext.getAttribute("dictionaryMap");
            Map<Integer, String> kemu_types = dictionaryMap.get("kemu_types");
            Set<Integer> integers1 = kemu_types.keySet(); // 1 2 3
            Set<String> strings = map2.keySet();
            for(String s:strings){
                HashMap<Integer, Double> integerDoubleHashMap = map2.get(s);
                Set<Integer> integers = integerDoubleHashMap.keySet(); // 2 3
                for(Integer i:integers1){
                    if(!integers.contains(i)){
                        //查出的科目不包含当前科目
                        integerDoubleHashMap.put(i,0.0);
                    }
                }
            }

            //生成最后回显数据
            Map<String, Object> result = new HashMap<>();
            List<String> categ = new ArrayList<>();
            List<List<Double>> data = new ArrayList<>();
            Map<Integer, List<Double>> kemuMap = new HashMap<>();
            for(Integer a:integers1){
                for(String s:strings ){
                    if(kemuMap.get(a)==null){
                        List<Double> doubles = new ArrayList<>();
                        doubles.add(map2.get(s).get(a));
                        kemuMap.put(a,doubles);
                    }else{
                        kemuMap.get(a).add(map2.get(s).get(a));
                    }
                }
                categ.add(kemu_types.get(a));
            }
            Set<Integer> s = kemuMap.keySet();
            for(Integer q:s){
                data.add(kemuMap.get(q));
            }
            List<String> name = new ArrayList<>(strings);
            result.put("title","平均分数");// 统计的什么东西
            result.put("name",name);//x轴最下面的名字
            result.put("categ",categ);//类别
            result.put("data",data);//数据
            return R.ok().put("data", result);
/*
    {
        "data": [
            [0.0, 19.0],
            [10.0, 10.0],
            [58.0, 0.0]
        ],
        "name": ["第一次考试", "第二次考试"],
        "categ": ["数学", "语文", "英语"],
        "title": "平均分数"
    }
*/
        }else{
            return R.error("数据为空");
        }


    }


}


macarons.js
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts'], factory);
    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}(this, function (exports, echarts) {
    var log = function (msg) {
        if (typeof console !== 'undefined') {
            console && console.error && console.error(msg);
        }
    };
    if (!echarts) {
        log('ECharts is not Loaded');
        return;
    }

    var colorPalette = [
        '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80',
        '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa',
        '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050',
        '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089'
    ];


    var theme = {
        color: colorPalette,

        title: {
            textStyle: {
                fontWeight: 'normal',
                color: '#008acd'
            }
        },

        visualMap: {
            itemWidth: 15,
            color: ['#5ab1ef','#e0ffff']
        },

        toolbox: {
            iconStyle: {
                normal: {
                    borderColor: colorPalette[0]
                }
            }
        },

        tooltip: {
            backgroundColor: 'rgba(50,50,50,0.5)',
            axisPointer : {
                type : 'line',
                lineStyle : {
                    color: '#008acd'
                },
                crossStyle: {
                    color: '#008acd'
                },
                shadowStyle : {
                    color: 'rgba(200,200,200,0.2)'
                }
            }
        },

        dataZoom: {
            dataBackgroundColor: '#efefff',
            fillerColor: 'rgba(182,162,222,0.2)',
            handleColor: '#008acd'
        },

        grid: {
            borderColor: '#eee'
        },

        categoryAxis: {
            axisLine: {
                lineStyle: {
                    color: '#008acd'
                }
            },
            splitLine: {
                lineStyle: {
                    color: ['#eee']
                }
            }
        },

        valueAxis: {
            axisLine: {
                lineStyle: {
                    color: '#008acd'
                }
            },
            splitArea : {
                show : true,
                areaStyle : {
                    color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)']
                }
            },
            splitLine: {
                lineStyle: {
                    color: ['#eee']
                }
            }
        },

        timeline : {
            lineStyle : {
                color : '#008acd'
            },
            controlStyle : {
                normal : { color : '#008acd'},
                emphasis : { color : '#008acd'}
            },
            symbol : 'emptyCircle',
            symbolSize : 3
        },

        line: {
            smooth : true,
            symbol: 'emptyCircle',
            symbolSize: 3
        },

        candlestick: {
            itemStyle: {
                normal: {
                    color: '#d87a80',
                    color0: '#2ec7c9',
                    lineStyle: {
                        color: '#d87a80',
                        color0: '#2ec7c9'
                    }
                }
            }
        },

        scatter: {
            symbol: 'circle',
            symbolSize: 4
        },

        map: {
            label: {
                normal: {
                    textStyle: {
                        color: '#d87a80'
                    }
                }
            },
            itemStyle: {
                normal: {
                    borderColor: '#eee',
                    areaColor: '#ddd'
                },
                emphasis: {
                    areaColor: '#fe994e'
                }
            }
        },

        graph: {
            color: colorPalette
        },

        gauge : {
            axisLine: {
                lineStyle: {
                    color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']],
                    width: 10
                }
            },
            axisTick: {
                splitNumber: 10,
                length :15,
                lineStyle: {
                    color: 'auto'
                }
            },
            splitLine: {
                length :22,
                lineStyle: {
                    color: 'auto'
                }
            },
            pointer : {
                width : 5
            }
        }
    };

    echarts.registerTheme('macarons', theme);
}));

声明

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值