@TOC
ssm027学校运动会信息管理系统+jsp
绪论
1.1研究背景
当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。
我们经过对学校运动会信息管理进行调查,发现了随着运动会相关数据的不断增多,学校运动会信息管理工作也越来越繁重和琐碎,容易出错,数据繁多,传统的学校运动会信息管理过度的依靠人力资源的登记管理,对于庞大的信息量,显然只依靠人力,很难准确的处理好大量的数据,传统的管理模式不仅效率低,出错率高,对于学校运动会信息管理带来了诸多不便,因此,传统的学校运动会信息管理模式已经远远无法满足当今高校的发展需求,我们急需对学校运动会信息管理体系进行变革,开发基于计算机平台的学校运动会信息管理系统。现代化的利用计算机来进行学校运动会信息管理很大程序上可以提高效率,人力方面也大大的节省,界面简单易操作,只要会计算机就可以快速的进行高校运动会相关信息的管理。对经济方面也是很大的节省,其优点是显而易见的。
1.2设计原则
在开始开发项目之前,必须要先考虑项目的实用性、科学性,以及该项目是否能够真正让用户受益并尽可能的发挥项目的作用。因此,在开发前,通过以下几条原则对项目进行判断:
(1)可行性原则。项目需要保证经济可行性和技术可行性,这包括了项目在浏览端、服务端等方面上的经济和技术上是可以达成的。
(2)适应性原则。项目要保证可维护性和可扩展性,这是每个非短期项目都需要考虑的,并且不论是维护还是扩展,都必须要建立在适应用户的正常需求的基础上。
(3)安全性及保密性原则。要充分保证用户信息的安全性和保密性,不能因为开发上的疏忽,导致用户的信息泄露。
(4)系统工程原则。为了确保项目的整体性,在项目调查、项目分析、项目设计、项目开发的过程中,都需遵从项目工程的方法和步骤逐步进行。
(5)统一规划、分期实施、逐步完善原则。项目开发的过程中,要按照规划、分期实施,特别是要注意在项目开发过程中要有条理,从点到面,一步步完善,不要贪图进度,要循环渐进的对项目进行开发。
1.3论文主要内容
(1)绪论:文章第一个部分从程序开发背景和设计原则进行多方面阐述
(2)开发技术介绍:简单介绍程序开发需要的技术,有语言技术、数据库技术,系统结构介绍,能够对程序开发技术有个大概了解
(3)需求分析:分析系统开发的可行性,降低不必要的损失,从法律,经济,操作等内容讲解程序开发的可行性,还有系统执行过程需要的软硬件环境等内容
(4)系统设计:根据前面需求最后设计出系统功能模块结构图,各个大的功能板块下面具有什么小功能板块,都能够一目了然,数据库里面的数据表设计以表格形式体现,数据库概念结构设计部分通过ER图表示出来,描述部分实体具有的属性等内容
(5)系统实现:程序编码完成阶段,看看系统具有什么样的功能,做出来的系统界面效果图,每个版块部分功能操作的详细实现,都用界面的形式表示,更加明白和了解系统功能
(6)系统测试:程序做出来都要经过多方面的内容测试,本次系统开发测试原理以文字形式阐述,程序最终通过测试,可以给用户投入使用,本程序质量还是有一定保障,后期维护也便捷
1
2 相关技术简介
2.1 JSP技术
JSP(JavaServer Pages)主是一种动态网页技术标准。 JSP技术有点类似于ASP技术。它将Javascripts(Scriptlets)和JSP标记(标记)插入到传统的网页HTML文件(* .htm,* .html)中,以形成JSP文件(* .jsp)[8]。使用JSP开发的Web应用程序是跨平台的,也就是说,它们可以在Linux下运行并在其他操作系统上运行。
JSP技术使用Java编程语言编写类似XML的标记和scriptlet来封装用于生成动态网页的处理逻辑。 JSP将Web逻辑与Web设计和显示分离,支持可重用的基于组件的设计,并使基于Web的应用程序开发变得快速而简单[9]。与Java Servlet一样,JSP在服务器端执行。通常,客户端返回HTML文本,因此只要它有浏览器,客户端就可以浏览。 JSP页面由HTML代码和嵌入其中的Java代码组成。服务器在客户端请求页面后处理Java代码,然后将生成的HTML页面返回到客户端的浏览器。 JSP易于使用Java技术,完全面向对象,平台无关且安全,主要用于Internet。
2.2 B/S结构
目前软件项目的开发存在两种架构模式,就是B/S模式和C/S模式,C/S模式就是较早流行的客户端和服务端模式,要使用新版应用需要暂停使用更新升级,就好比现在手机上的各种APP应用。而这次课题项目使用的是基于B/S,就是浏览器/服务端而开发的web项目。应用的更新都在服务端上进行,而且项目维护方便,不需要安装,只需要有浏览器和网络就可以了,越来越多的web项目被开发出来,也得到用户的认可。
B/S架构这种只需要用户在浏览器上运行不需要再下载客户端的模式,使用浏览器就可以实现和下载客户端的一样复杂的功能。给管理系统的用户带来了很大的方便,节约了大量的成本。现在B/S架构已经在Web开发上被广泛运用,它的基础内容也在不断的完善更新。
图2-1 B/S模式三层结构图
2.3 MYSQL数据库
本次开发的系统后台采用MySQL数据库来存放数据,MySQL实质是RDBMS(关系型数据库管理系统),源代码开放性比较高,数据库管理的语言采用SQL(结构化查询语言)进行数据管理[14],下面我们就简单介绍SQL语句的一些常用用法。通常我们要创建一个数据库时就会使用“CREATE DATABASE ”命令开头,使用某个数据库时就会以“use+数据库名称”命令,如果想要查看数据库里面数据表就会使用到“SHOW TABLES”命令,当然我们在操作数据表内容时也会使用到某些命令,比如删除就用“drop”,清空就用“delete from”,更新数据就用“update”,需要加入数据的话可以用“insert into ”等命令,这些就是SQL查询语句的惯用语法。这次采用mysql数据库还是源于它备受关注的实用性和可靠性,它里面的大部分功能一般的系统都还用不完,况且mysql小巧但它功能比较齐全,是一般系统软件的开发首选。MySQL开放的源代码通过360安全浏览器可以快速下载下来,程序员可以对这些免费的代码根据自身需求进行个性化定制操作。为了我们能够更好地使用MySQL,平时我们需要多加维护,有空的时候还是多多查看一些二进制日志、错误日志、常规查询日志等日志,它们能够帮助我们进行性能分析以及DBA检查,除了这个还需要注意每间隔一定时间就要更新缓冲区和缓存,这样能够降低碎片,利用OPTIMIZETABLE命令让数据表进行重新组织,还能节省许多空间避免空间浪费。
2.4 JAVA技术
Java是一门伟大的纯面向对象的编程语言和编程语言。同时,它还是Java语言从嵌入式开发到企业级开发的平台。Java凭借其一次编译,任何地方执行的优点,使得盛行的web应用程序有大量的Java编译,很好地支持网络发展跨平台开发所需的功能,成为服务器端主要流行的语言。Java EE至今仍然是企业发展最重要的服务器平台[6]。
鉴于Java语言是一种引用,它可以自动地收集浪费,编程人员不必担心面向对象的内存特性的管理,它具有一系列类别和类型的支持、多个接口和接口的继承,以及一种实现的机制关于类和接口之间的。
此外,Java语言支持Internet上的应用程序开发,Java的接口是Java net,它提供了一个类库,用于编程Web应用程序,可以是一种强大的异常处理机制和自动垃圾收集机制[7]。
编程语言Java的一个目标是适应动态环境。Java程序要求,可以动态加载执行环境或网络,它也有助于软件升级。而且,能进行运行时间的实现,对运行时间类型的控制。
2.5 Tomcat简介
Tomcat在JSP 程序调试中应用广泛,它本身就是一款轻量级的源代码开放的能够支持jsp和servlets的目前比较主流的Web 服务器。普遍适用于中小型开发系统以及同时访问系统的用户数量比较少的场景。Tomcat默认模式实际上是Servlet容器,另外Tomcat服务器它能够处理html文件的功能,这点跟Web服务器和IIS同样。只是在处理html文件上,Tomcat服务器没有Apache服务器优越。Tomcat发展以来,目前已经更新到9.0版本了。之所以选择Tomcat服务器来源于它的先进技术,稳定性能等优点,当然最主要的还是Java程序开发者对Tomcat服务器的接纳和认可,Tomcat服务器也深受某些软件开发商的喜爱。
3 系统分析
3.1 可行性分析
可行性分析是该平台系统进行投入开发的基础第一步,必须对其进行可行性分析才能够降低不必要的需要从而使资源合理利用,更具有性价比和降低成本,同时也是系统平台的成功的未雨绸缪的一步[1]。
3.1.1 技术可行性
大学期间我自己利用空闲时间学习了java编程语言,通过图书馆查阅资料以及利用宿舍电脑上网了解了开发平台,熟悉并研究了jsp开发技术,对web服务器Tomcat有了比较系统的认识,数据库像mysql和sqlserver自己在平时作业中也有一定的接触,基本的操作流程还是很熟悉。对于开发软件基础知识自身还是具备,所以技术上面还是不用担心。
3.1.2 经济可行性
这次我打算开发的系统,源代码我已经在网上找好了,利用360安全浏览器就可以下载,不需要收费,加上我自己上学期间已经配置好的一台笔记本电脑就能进行开发,目前我已经在准备在自己电脑上安装开发平台和mysql数据库等开发软件。这些软件也是自己在网上下载的,不用花钱,这样看来开发学校运动会信息管理系统经济上不需要太多支出,开发出来的系统能提高学校运动会信息管理效率,所以开发这样的软件很有必要。
3.1.3 操作可行性
在设计之初,我在网上参考了许多相关系统的界面布局设计,发现该系统界面展示比较简单,功能罗列齐全,操作流程简单明了,系统用户不用担心不会操作,系统各个功能模块都会有相应的提示,一看就明白,实在不知道的话,稍微指点就能上手,上手速度很快,时间不会耽误太多。
3.1.4 时间可行性
这次毕业设计学校预留的时间比较充分,从去年10月到今年5月几乎都是毕业设计制作阶段,从完成程序设计、编码、测试,到完成程序配套的论文,时间上面还有剩余,这点上是完全没有压力。
经过上面的分析,此次开发的系统从经济上、从技术上、从操作上、从时间上考虑都能过关。说明自己要开发的学校运动会信息管理系统可行性是完全可行,操作简单,时间、金钱上面毫无压力,该系统开发是完全可行。
3.2 系统性能分析
从性能方面本学校运动会信息管理系统必须能够进行正常高速的运行,在开发过程中必须要保证系统绝对的安全性和实效性。
(1)安全性:对于任意一个系统来说,必须有独立的密码进行系统的管理,裁判、用户和管理员权限划分明确。管理员才能查看系统后台数据,外人不可随意查看。
(2)可扩展性:每个项目不可能一次就能完善,因此该项目也预留了功能和数据的接口,以便于解决该项目在后期开发中可能发生的业务或功能的变化,为该项目提供更加快速的新增或更改功能。
(3)数据完整性:本学校运动会信息管理系统数据设计全部完整,部分采用自动生成,信息的所有录入都是需要后台进行添加,信息空不可以进行录入到系统。数据之间要联系起来,不能出错。
(4)数据存储性
该项目采用了目前主流的MySQL数据库,在安全系数和稳定性有了拥有了很高的保证。
3.3 系统功能分析
本学校运动会信息管理系统主要满足3种类型用户的需求,这3种类型用户分别为用户、裁判和管理员,他们分别实现的功能如下。
用户进入系统前台后可查看系统信息,包括首页、比赛信息、公告信息、论坛信息以及新闻资讯等,用户要想实现比赛报名等操作,必须登录系统,未有账号的用户可进行注册操作,注册登录后主要功能模块包括个人中心、用户管理、赛事报名管理以及比赛成绩管理。
用户用例图如图3-1所示。
图3-1 用户用例图
管理员可登录系统后对系统进行全面管理,管理员登陆后主要功能模块包括个人中心、用户管理、裁判管理、比赛项目管理、比赛信息管理、公告信息管理、赛事报名管理、比赛成绩管理、论坛管理、留言板管理以及系统管理。
管理员用例图如图3-2所示。
图3-2 管理员用例图
裁判注册登录后主要功能模块包括个人中心、用户管理、比赛项目管理、比赛信息管理、公告信息管理、赛事报名管理以及比赛成绩管理。
裁判用例图如图3-2所示。
图3-3 裁判用例图
3.4 系统流程分析
3.4.1注册流程
未有账号的用户和裁判均可进行注册操作,用户注册流程图如图3-4所示。
图3-4注册流程图
3.4.2登录流程
用户、裁判和管理员均可进行登录操作,用户登录流程图如图3-5所示。
图3-5 登录流程图
4 系统设计
4.1 系统架构设计
B/S系统架构是本系统开发采用的结构模式,使用B/S模式开发程序以及程序后期维护层面需要的经济成本是很低的,用户能够承担得起。使用这样的模式开发,用户使用起来舒心愉悦,不会觉得别扭,操作很容易就熟练了。而且方便管理。采用B/S体系结构开发的应用软件仅仅需要在客户端安装谷歌浏览器或者其他浏览器就可以操作,对于维护和升级操作则在服务器端就能完成,不用在客户端进行操作,这样就节省了许多开销,B/S模式能够保证软件应用的跨平台性和通用性,采用它开发软件是最佳选择。B/S模式示意图如图4-1所示。
图4-1 B/S模式示意图
4.2 系统结构设计
系统结构设计是整个系统设计中重要的一部分,在结构设计过程中,首先对系统进行需求分析,然后进行系统初步设计,将系统功能模块细化,具体分析每一个功能模块具体应该首先哪些功能,最后将各个模块进行整合,实现系统结构的最终设计。
本学校运动会信息管理系统由用户功能模块、裁判功能模块和管理员功能模块三大部分构成,系统的结构图如图4-2所示。
图4-2系统结构图
4.3 数据库设计
4.3.1数据库E-R图设计
数据库在系统中扮演这很重要的角色,在这次设计的程序中我运用的是Mysql数据库。Sql语句是访问数据库的最常用的标准化语言。使用数据库,可以使整个系统的数据更加的整洁、明了。数据库在整个系统中,就是这个系统的基础。一个好的数据库设计,更有利于后期的维护,功能的扩建。如果数据库的设计出现问题,那么将是非常麻烦的事情。
每张数据表都有其字段信息,如何直观的看出一张表的结构和数据间的关系,可以通过E-R图进行查看。E-R图灵活的表达了数据中实体和属性间的关系,使得数据关系更简单明了。每个系统数据库都需要提前进行设计规划,使整体数据库更统一规范化,也体现出开发人员的专业性。本学校运动会信息管理系统的E-R图如下图所示:
(1)赛事报名信息实体E- R图,如图4-5所示:
图4-5 赛事报名信息实体图
(2)比赛信息实体E- R图,如图4-6所示:
图4-6 比赛信息实体图
(3)裁判实体E- R图,如图4-7所示:
图4-7 裁判实体图
(4)管理员实体E- R图,如图4-8所示:
图4-8 管理员实体图
(5)用户实体E- R图,如图4-9所示:
图4-9 用户实体图
4.3.2数据库表设计
本学校运动会信息管理系统需要数据库,采用的是MYSQL这一数据库管理系统,各个数据库表的设计结果如下:
表4-1 saishibaoming赛事报名信息表
列名 | 说明 | 类型 ( 长度 ) | 备注 |
---|---|---|---|
id | 编号 | bigint(20) | 不允许空,主键 |
addtime | 添加时间 | timestamp | 允许空 |
bisaixiangmu | 比赛项目 | varchar(200) | 允许空 |
bisairiqi | 比赛日期 | varchar(200) | 允许空 |
`bisaididian | 比赛地点 | varchar(200) | 允许空 |
baomingshijian` | 报名时间 | date | 允许空 |
baomingfangshi | 报名方式 | varchar(200) | 允许空 |
zhanghao | 账号 | varchar(200) | 允许空 |
`xingming | 姓名 | varchar(200) | 允许空 |
shouji | 手机 | varchar(200) | 允许空 |
sfsh | 是否审核 | varchar(200) | 允许空 |
shhf | 审核回复 | longtext | 允许空 |
表4-2 bisaixinxi比赛信息表
列名 | 说明 | 类型 ( 长度 ) | 备注 |
---|---|---|---|
id | 编号 | bigint(20) | 不允许空,主键 |
addtime | 添加时间 | timestamp | 允许空 |
bisaixiangmu | 比赛项目 | varchar(200) | 允许空 |
tupian` | 图片 | varchar(200) | 允许空 |
bisairiqi` | 比赛日期 | date | 允许空 |
bisaididian | 比赛地点 | varchar(200) | 允许空 |
cansairenshu` | 参赛人数 | int(11) | 允许空 |
bisaixiangqing | 比赛详情 | longtext | 允许空 |
zhuyishixiang | 注意事项 | varchar(200) | 允许空 |
表4-3 caipan裁判信息表
列名 | 说明 | 类型 ( 长度 ) | 备注 |
---|---|---|---|
id | 编号 | bigint(20) | 不允许空,主键 |
addtime | 添加时间 | timestamp | 允许空 |
caipanzhanghao | 裁判账号 | varchar(200) | 允许空 |
mima | 密码 | varchar(200) | 允许空 |
`caipanxingming | 裁判姓名 | varchar(200) | 允许空 |
xingbie | 性别 | varchar(200) | 允许空 |
shenfenzheng` | 身份证 | varchar(200) | 允许空 |
shouji | 手机 | varchar(200) | 允许空 |
表4-4 users管理员信息表
列名 | 说明 | 类型 ( 长度 ) | 备注 |
---|---|---|---|
id | 编号 | bigint(20) | 不允许空,主键 |
username | 用户名 | varchar(100) | 允许空 |
password | 密码 | varchar(100) | 允许空 |
role | 角色 | varchar(100) | 允许空 |
addtime | 添加时间 | timestamp | 允许空 |
表4-5 `yonghu用户信息表
列名 | 说明 | 类型 ( 长度 ) | 备注 |
---|---|---|---|
id | 编号 | bigint(20) | 不允许空,主键 |
addtime | 添加时间 | timestamp | 允许空 |
zhanghao | 账号 | varchar(200) | 允许空 |
mima | 密码 | varchar(200) | 允许空 |
xingming | 姓名 | varchar(200) | 允许空 |
xingbie | 性别 | varchar(200) | 允许空 |
shenfenzheng | 身份证 | varchar(200) | 允许空 |
shouji | 手机 | varchar(200) | 允许空 |
touxiang | 头像 | varchar(200) | 允许空 |
5 系统实现
5.1 用户功能模块的实现
用户进入本系统可查看系统信息,系统主界面展示如图5-1所示。
图5-1系统主界面图
5.1.1用户注册界面
未有账号的用户可进入注册界面进行注册操作,用户注册界面展示如图5-2所示。
图5-2用户注册界面图
5.1.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.2管理员功能模块的实现
5.2.1管理员登录界面
管理员要想进入系统后台对系统进行管理操作,必须进行登录系统,管理员登录界面展示如图5-9所示。
图5-9管理员管理界面图
5.2.2裁判管理界面
管理员可查看所有裁判信息,并可对其进行修改和删除操作,同时也可添加裁判信息,裁判界面展示如图5-10所示。
图5-10 裁判管理界面图
5.2.3用户管理界面
管理员可添加、修改和删除用户信息,用户管理界面展示如图5-11所示。
图5-11 用户管理界面图
5.2.4比赛项目管理界面
管理员可增删改查比赛项目信息,比赛项目管理界面展示如图5-12所示。
图5-12 比赛项目管理界面图
5.2.5比赛信息管理界面
管理员可增删改查比赛信息,比赛信息管理界面展示如图5-13所示。
图5-13 比赛信息管理界面图
5.3裁判功能模块的实现
5.3.1公告信息管理界面
裁判可增删改查公告信息,公告信息管理界面展示如图5-14所示。
图5-14 公告信息管理界面图
5.3.2赛事报名管理界面
裁判可查看所有赛事报名信息,并可对其进行审核和删除操作,赛事报名管理界面展示如图5-15所示。
图5-15 赛事报名管理界面图
5.3.3比赛成绩管理界面
裁判能添加、修改和删除比赛成绩信息,比赛成绩管理界面展示如图5-16所示。
图5-16 比赛成绩管理界面图
MessagesServiceImpl.java
package com.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;
import com.dao.MessagesDao;
import com.entity.MessagesEntity;
import com.service.MessagesService;
import com.entity.vo.MessagesVO;
import com.entity.view.MessagesView;
@Service("messagesService")
public class MessagesServiceImpl extends ServiceImpl<MessagesDao, MessagesEntity> implements MessagesService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<MessagesEntity> page = this.selectPage(
new Query<MessagesEntity>(params).getPage(),
new EntityWrapper<MessagesEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<MessagesEntity> wrapper) {
Page<MessagesView> page =new Query<MessagesView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<MessagesVO> selectListVO(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public MessagesVO selectVO(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<MessagesView> selectListView(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public MessagesView selectView(Wrapper<MessagesEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
DiscussbisaixinxiController.java
package com.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.DiscussbisaixinxiEntity;
import com.entity.view.DiscussbisaixinxiView;
import com.service.DiscussbisaixinxiService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
/**
* 比赛信息评论表
* 后端接口
* @author
* @email
* @date 2021-03-20 08:05:26
*/
@RestController
@RequestMapping("/discussbisaixinxi")
public class DiscussbisaixinxiController {
@Autowired
private DiscussbisaixinxiService discussbisaixinxiService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,DiscussbisaixinxiEntity discussbisaixinxi,
HttpServletRequest request){
EntityWrapper<DiscussbisaixinxiEntity> ew = new EntityWrapper<DiscussbisaixinxiEntity>();
PageUtils page = discussbisaixinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussbisaixinxi), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,DiscussbisaixinxiEntity discussbisaixinxi, HttpServletRequest request){
EntityWrapper<DiscussbisaixinxiEntity> ew = new EntityWrapper<DiscussbisaixinxiEntity>();
PageUtils page = discussbisaixinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussbisaixinxi), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( DiscussbisaixinxiEntity discussbisaixinxi){
EntityWrapper<DiscussbisaixinxiEntity> ew = new EntityWrapper<DiscussbisaixinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( discussbisaixinxi, "discussbisaixinxi"));
return R.ok().put("data", discussbisaixinxiService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(DiscussbisaixinxiEntity discussbisaixinxi){
EntityWrapper< DiscussbisaixinxiEntity> ew = new EntityWrapper< DiscussbisaixinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( discussbisaixinxi, "discussbisaixinxi"));
DiscussbisaixinxiView discussbisaixinxiView = discussbisaixinxiService.selectView(ew);
return R.ok("查询比赛信息评论表成功").put("data", discussbisaixinxiView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
DiscussbisaixinxiEntity discussbisaixinxi = discussbisaixinxiService.selectById(id);
return R.ok().put("data", discussbisaixinxi);
}
/**
* 前端详情
*/
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
DiscussbisaixinxiEntity discussbisaixinxi = discussbisaixinxiService.selectById(id);
return R.ok().put("data", discussbisaixinxi);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody DiscussbisaixinxiEntity discussbisaixinxi, HttpServletRequest request){
discussbisaixinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(discussbisaixinxi);
discussbisaixinxiService.insert(discussbisaixinxi);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody DiscussbisaixinxiEntity discussbisaixinxi, HttpServletRequest request){
discussbisaixinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(discussbisaixinxi);
discussbisaixinxiService.insert(discussbisaixinxi);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody DiscussbisaixinxiEntity discussbisaixinxi, HttpServletRequest request){
//ValidatorUtils.validateEntity(discussbisaixinxi);
discussbisaixinxiService.updateById(discussbisaixinxi);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
discussbisaixinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
/**
* 提醒接口
*/
@RequestMapping("/remind/{columnName}/{type}")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
Wrapper<DiscussbisaixinxiEntity> wrapper = new EntityWrapper<DiscussbisaixinxiEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
int count = discussbisaixinxiService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
BisaichengjiServiceImpl.java
package com.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.List;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.utils.PageUtils;
import com.utils.Query;
import com.dao.BisaichengjiDao;
import com.entity.BisaichengjiEntity;
import com.service.BisaichengjiService;
import com.entity.vo.BisaichengjiVO;
import com.entity.view.BisaichengjiView;
@Service("bisaichengjiService")
public class BisaichengjiServiceImpl extends ServiceImpl<BisaichengjiDao, BisaichengjiEntity> implements BisaichengjiService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
Page<BisaichengjiEntity> page = this.selectPage(
new Query<BisaichengjiEntity>(params).getPage(),
new EntityWrapper<BisaichengjiEntity>()
);
return new PageUtils(page);
}
@Override
public PageUtils queryPage(Map<String, Object> params, Wrapper<BisaichengjiEntity> wrapper) {
Page<BisaichengjiView> page =new Query<BisaichengjiView>(params).getPage();
page.setRecords(baseMapper.selectListView(page,wrapper));
PageUtils pageUtil = new PageUtils(page);
return pageUtil;
}
@Override
public List<BisaichengjiVO> selectListVO(Wrapper<BisaichengjiEntity> wrapper) {
return baseMapper.selectListVO(wrapper);
}
@Override
public BisaichengjiVO selectVO(Wrapper<BisaichengjiEntity> wrapper) {
return baseMapper.selectVO(wrapper);
}
@Override
public List<BisaichengjiView> selectListView(Wrapper<BisaichengjiEntity> wrapper) {
return baseMapper.selectListView(wrapper);
}
@Override
public BisaichengjiView selectView(Wrapper<BisaichengjiEntity> wrapper) {
return baseMapper.selectView(wrapper);
}
}
annotations.src.js
(function (Highcharts, HighchartsAdapter) {
var UNDEFINED,
ALIGN_FACTOR,
ALLOWED_SHAPES,
Chart = Highcharts.Chart,
extend = Highcharts.extend,
each = Highcharts.each;
ALLOWED_SHAPES = ["path", "rect", "circle"];
ALIGN_FACTOR = {
top: 0,
left: 0,
center: 0.5,
middle: 0.5,
bottom: 1,
right: 1
};
// Highcharts helper methods
var inArray = HighchartsAdapter.inArray,
merge = Highcharts.merge;
function defaultOptions(shapeType) {
var shapeOptions,
options;
options = {
xAxis: 0,
yAxis: 0,
title: {
style: {},
text: "",
x: 0,
y: 0
},
shape: {
params: {
stroke: "#000000",
fill: "transparent",
strokeWidth: 2
}
}
};
shapeOptions = {
circle: {
params: {
x: 0,
y: 0
}
}
};
if (shapeOptions[shapeType]) {
options.shape = merge(options.shape, shapeOptions[shapeType]);
}
return options;
}
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
function isNumber(n) {
return typeof n === 'number';
}
function defined(obj) {
return obj !== UNDEFINED && obj !== null;
}
function translatePath(d, xAxis, yAxis, xOffset, yOffset) {
var len = d.length,
i = 0;
while (i < len) {
if (typeof d[i] === 'number' && typeof d[i + 1] === 'number') {
d[i] = xAxis.toPixels(d[i]) - xOffset;
d[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;
i += 2;
} else {
i += 1;
}
}
return d;
}
// Define annotation prototype
var Annotation = function () {
this.init.apply(this, arguments);
};
Annotation.prototype = {
/*
* Initialize the annotation
*/
init: function (chart, options) {
var shapeType = options.shape && options.shape.type;
this.chart = chart;
this.options = merge({}, defaultOptions(shapeType), options);
},
/*
* Render the annotation
*/
render: function (redraw) {
var annotation = this,
chart = this.chart,
renderer = annotation.chart.renderer,
group = annotation.group,
title = annotation.title,
shape = annotation.shape,
options = annotation.options,
titleOptions = options.title,
shapeOptions = options.shape;
if (!group) {
group = annotation.group = renderer.g();
}
if (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {
shape = annotation.shape = renderer[options.shape.type](shapeOptions.params);
shape.add(group);
}
if (!title && titleOptions) {
title = annotation.title = renderer.label(titleOptions);
title.add(group);
}
group.add(chart.annotations.group);
// link annotations to point or series
annotation.linkObjects();
if (redraw !== false) {
annotation.redraw();
}
},
/*
* Redraw the annotation title or shape after options update
*/
redraw: function () {
var options = this.options,
chart = this.chart,
group = this.group,
title = this.title,
shape = this.shape,
linkedTo = this.linkedObject,
xAxis = chart.xAxis[options.xAxis],
yAxis = chart.yAxis[options.yAxis],
width = options.width,
height = options.height,
anchorY = ALIGN_FACTOR[options.anchorY],
anchorX = ALIGN_FACTOR[options.anchorX],
resetBBox = false,
shapeParams,
linkType,
series,
param,
bbox,
x,
y;
if (linkedTo) {
linkType = (linkedTo instanceof Highcharts.Point) ? 'point' :
(linkedTo instanceof Highcharts.Series) ? 'series' : null;
if (linkType === 'point') {
options.xValue = linkedTo.x;
options.yValue = linkedTo.y;
series = linkedTo.series;
} else if (linkType === 'series') {
series = linkedTo;
}
if (group.visibility !== series.group.visibility) {
group.attr({
visibility: series.group.visibility
});
}
}
// Based on given options find annotation pixel position
x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);
y = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;
if (isNaN(x) || isNaN(y) || !isNumber(x) || !isNumber(y)) {
return;
}
if (title) {
title.attr(options.title);
title.css(options.title.style);
resetBBox = true;
}
if (shape) {
shapeParams = extend({}, options.shape.params);
if (options.units === 'values') {
for (param in shapeParams) {
if (inArray(param, ['width', 'x']) > -1) {
shapeParams[param] = xAxis.translate(shapeParams[param]);
} else if (inArray(param, ['height', 'y']) > -1) {
shapeParams[param] = yAxis.translate(shapeParams[param]);
}
}
if (shapeParams.width) {
shapeParams.width -= xAxis.toPixels(0) - xAxis.left;
}
if (shapeParams.x) {
shapeParams.x += xAxis.minPixelPadding;
}
if (options.shape.type === 'path') {
translatePath(shapeParams.d, xAxis, yAxis, x, y);
}
}
// move the center of the circle to shape x/y
if (options.shape.type === 'circle') {
shapeParams.x += shapeParams.r;
shapeParams.y += shapeParams.r;
}
resetBBox = true;
shape.attr(shapeParams);
}
group.bBox = null;
// If annotation width or height is not defined in options use bounding box size
if (!isNumber(width)) {
bbox = group.getBBox();
width = bbox.width;
}
if (!isNumber(height)) {
// get bbox only if it wasn't set before
if (!bbox) {
bbox = group.getBBox();
}
height = bbox.height;
}
// Calculate anchor point
if (!isNumber(anchorX)) {
anchorX = ALIGN_FACTOR.center;
}
if (!isNumber(anchorY)) {
anchorY = ALIGN_FACTOR.center;
}
// Translate group according to its dimension and anchor point
x = x - width * anchorX;
y = y - height * anchorY;
if (chart.animation && defined(group.translateX) && defined(group.translateY)) {
group.animate({
translateX: x,
translateY: y
});
} else {
group.translate(x, y);
}
},
/*
* Destroy the annotation
*/
destroy: function () {
var annotation = this,
chart = this.chart,
allItems = chart.annotations.allItems,
index = allItems.indexOf(annotation);
if (index > -1) {
allItems.splice(index, 1);
}
each(['title', 'shape', 'group'], function (element) {
if (annotation[element]) {
annotation[element].destroy();
annotation[element] = null;
}
});
annotation.group = annotation.title = annotation.shape = annotation.chart = annotation.options = null;
},
/*
* Update the annotation with a given options
*/
update: function (options, redraw) {
extend(this.options, options);
// update link to point or series
this.linkObjects();
this.render(redraw);
},
linkObjects: function () {
var annotation = this,
chart = annotation.chart,
linkedTo = annotation.linkedObject,
linkedId = linkedTo && (linkedTo.id || linkedTo.options.id),
options = annotation.options,
id = options.linkedTo;
if (!defined(id)) {
annotation.linkedObject = null;
} else if (!defined(linkedTo) || id !== linkedId) {
annotation.linkedObject = chart.get(id);
}
}
};
// Add annotations methods to chart prototype
extend(Chart.prototype, {
annotations: {
/*
* Unified method for adding annotations to the chart
*/
add: function (options, redraw) {
var annotations = this.allItems,
chart = this.chart,
item,
len;
if (!isArray(options)) {
options = [options];
}
len = options.length;
while (len--) {
item = new Annotation(chart, options[len]);
annotations.push(item);
item.render(redraw);
}
},
/**
* Redraw all annotations, method used in chart events
*/
redraw: function () {
each(this.allItems, function (annotation) {
annotation.redraw();
});
}
}
});
// Initialize on chart load
Chart.prototype.callbacks.push(function (chart) {
var options = chart.options.annotations,
group;
group = chart.renderer.g("annotations");
group.attr({
zIndex: 7
});
group.add();
// initialize empty array for annotations
chart.annotations.allItems = [];
// link chart object to annotations
chart.annotations.chart = chart;
// link annotations group element to the chart
chart.annotations.group = group;
if (isArray(options) && options.length > 0) {
chart.annotations.add(chart.options.annotations);
}
// update annotations after chart redraw
Highcharts.addEvent(chart, 'redraw', function () {
chart.annotations.redraw();
});
});
}(Highcharts, HighchartsAdapter));
声明
本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。