@TOC
ssm496图书管理系统的设计与实现+jsp
第1章 绪论
1.1 课题研究背景
现在各行各业都开始采用计算机办公软件来进行协助工作,这样可以更好的提高工作效率,减轻办公人员的工作压力,通过计算机信息化管理,可以使信息长期保存,修改和查找起来更加的方便,对于信息资料的核对也更加的精准。虽然现在很多学习的知识都可以从网上获取,但是图书作为一个获得知识的主要途径,还是没办法替代的,很多人还是习惯去图书馆进行借阅图书查看,而图书馆存储的图书量是非常大的,而且图书种类也是非常的多,如果还是传统的人工管理方式进行管理,那么首先对于图书的查找和分类管理就是一个很大的挑战,但是如果借助于计算机管理软件的出现,可以把图书馆的图书全部录入系统里,可以更精准的进行管理,对于图书馆的查找和存放管理是非常方便的,比如直接输入图书编号就可以快速查找到图书存放在什么位置。其次还额外加入了用户权限,用户可以直接通过登录系统就可以查看图书馆里有什么类型的图书,如果有自己喜欢的图书,可以直接进行网上借阅,然后到时候直接去图书馆取书就行了,这样就避免了,用户不知道图书馆有没有自己要找的书,或者有没有被人借走这种情况的发生,同时如果借阅的人多的话,还可以避免排队,可以更好的节省时间。所以说不管是针对图书馆的管理人员还是对于用户来说,都是非常具有开发价值的。
1.2课题研究现状
在我们国内使用最多的管理系统系列有金盘软件、汇文软件,在国外代表软件有ExLibris和Aleph500。随着人们要求的深入,图书管理系统加入了新的理念,更好的整合了代表管理系统的特点和加入自身特点。现代使用的图书管理系统可以实现图书的快速查找,方便用户寻找需要的图书,并且可以实现电子借阅证,用户的借阅信息实现信息化管理,防止传统借阅证丢失的情况。但经过研究,现在的图书管理系统还存在一些问题,比如由于部门不同、负责工作内容不同的原因,很多的数据都是隔离保存的,不能实现共享,这就造成在工作中需要多个部门奔跑;再有现有的图书管理系统功能不完整不能实现图书馆的整体业务管理,不能实现图书管理的整个流程。想要解决这些问题就需要采用先进的理念进行设计,并且深入了解图书管理的工作内容,采用开放的思路进行设计,最后还需要吸取用户的建议。
1.3课题实现目的和意义
图书馆内存储的图书是非常多的,首先对于图书的管理摆放来说就是非常的耗时耗力,对于管理人员来说也是一个非常大的挑战,其次用户借阅图书的数据也是非常的繁杂,而且频次也是非常的高,通过建设的数字化图书馆解决这个难题,全部把图书信息存储到计算机里,实现智能化管理,可以更好的提高工作人员的工作效率。
优质的图书管理系统不仅可以单纯的满足图书馆的日常工作需求,还可以满足用户的需求。可以降低图书馆工作人员的工作压力,提高效率,最重要的是可以实现用户参与,把工作人员的部分工作分担给用户,使工作人员的工作安排更加合理。本系统可以实现图书管理的流程化、信息化,使必要信息实现共享。综合来说本系统可以减少工作人员的工作内容,充分体现网络的作用,实现网络资源的利用从而提高图书馆的档次和使图书馆的管理工作安排更合理,并且实现服务的多样化、人性化。
1.4课题实现内容
本系统包括管理员和用户两部分。用户的内容包括个人资料管理、图书查询和图书借阅。用户通过登录后可以查找图书并进行图书的借阅。管理员在后台可以管理自己的账号和用户信息,并对图书进行更新和推荐,管理用户的借阅信息。本系统中加入图书分类管理,可以使用户在查询图书时更加快速。用户在自己的后台里可以查看借阅的审核结果和进行图书的归还。
1.5论文结构安排
本篇论文按照系统开发的生命周期进行撰写,详细描述了本系统从调研、分析、设计、实现、测试的过程。本论文从课题开发的背景、现状、目的意义开始,介绍了本课题开发的重要性;然后介绍了本课题开发所使用的相关技术和环境等;接着阐述本课题的分析,包括对课题的需求性、可行性、性能方面、功能方面的分析,紧接着设计了系统的功能和建立了系统的数据库,然后进行系统的实现和系统的测试。所以,本篇论文的结构安排为:
- 绪论,本章包含课题开发背景、现状、目的和意义以及内容;
- 系统实现的相关技术和环境,对JAVA语言和Mysql数据库进行描述,并对其它相关技术、环境进行描述;
- 系统分析,针对系统需求分析、系统经济可行性、操作可行性、技术可行性分析,还包括系统的功能、性能、流程进行分析。本章包括各类流程图;
- 总体设计,描述系统的功能结构和画出系统的功能结构图,描述数据库的设计和画出数据库ER图、数据库表;
- 系统实现,描述系统的主要功能和进行实现界面的展示;
- 系统测试,介绍测试的目的、意义、步骤等,着重描述系统的功能测试用例和进行测试总结;
总结
致谢
参考文献
第2章 系统实现的相关技术和环境
2.1UML建模语言介绍
UML建模语言是一个面向对象开发的标准化建模语言,目前作为一个统一的标注在执行,之前各种建模语言都是相互独立的,而通过UML把他们全部联系了起来,这样可以使技术灵活度很大的提高,减少了不必要的差异化。通过UML建模语言可以很大程度的扩宽系统的适用范围。建模语言的作用就是系统开发前期阶段进行可视化演练,先建立好一个动态的模型,这样就可以清晰的展示出来自己要做的系统大致是个什么类型,更能直观的通过图形化进行信息展示。UML建模工具包含很多图形,比如用例图,类图,时序图等各种图形,通过这些图形可以建立各种类之间的联系。UML的开发过程中首先是先对对象进行分析研究,然后进行文档化分析,然后在对面向对象的思想进行细化,然后设计建立设计模型,最后觉得就是通过之前建立的各种模型进行编程,UML已经是形成了一个行业内的工业标准,所以在面对UML的时候不要有任何负担,而且一种辅助工具,对于系统开发阶段是有很大益处的。而通过UML我们接触最多的就是用例图了,用例图主要就是描述出来你打算做什么系统,从而实现什么功能,然后通过用例加权限角色的形式用图形展现出来,而用例部分一般都是用一个椭圆的形状来表示,角色部分用一个人的符号表示,通过箭头的形式把他们进行联系起来。而类图主要就是用一个三层表格图来进行展示,里面内容包含类的名字,类的属性,还有类实现所需要的方法,而把这些类之间存在三种关系,就是关联,泛华和依赖。关联是通过一条实线表示,某个类里的属性引用到另个实体类里,这样就形成一种关联关系,而关联关系也分为两种不同的关系,就是聚合和组合,聚合是通过一个空心菱形框来表示,他的最大特性就是当A的实体部分,也可以当B的实体部分,而组合关系恰恰相反,当作为A的实体后就不能在作为B的实体部分了,组合关系一般是采用实心的菱形框表示,以此来进行他们之间的区别。泛华关系是用空心的三角形来标注,可以看成一种对接口的关联关系。依赖关系是如果建立的一个类进行了改动,那么跟他有关联的其他类都会进行相应的改动,会通过类信息进行发送给其他的类,作为另一个类的数据存储部分,然后进行参数变动。
2.2 Html语言介绍
Html是一种超文本标记语言,经过技术的不断发展,现在已经是html5版本了,html可以结合各种编程语言使用,比如像jsp ,Java等都可以嵌入使用,html的工作原理就是当用户进行信息访问时候,可以借助于浏览器把html代码进行可视化展示,然后显示在浏览器上,所以html主要是网页界面中使用,可以通过div+css等设计界面样式等。因为html是一个静态的网页技术,所以现在一般都不是单独使用,都要结合javascript脚本语言形成动态技术,这样才能实现跟用户的交互,才能满足现代化的需求。
2.3Mysql数据库的介绍
数据库分为很多种,一般有网状型数据库,层次型数据库,关系型数据库和面向对象数据库,而我们经常使用的就都是面向对象的数据库,比如像Mysql ,sql server或者Oracleog。这些数据库可以说是大同小异,采用的都是标准的sql语句格式,可以应用于各种关系型数据库。开发本系统我选用Mysql数据库作为存储方式,因为Mysql数据库体积更小,对硬件要求不高,最重要的还是免费的,直接就可以下载使用。Mysql分为服务端和客户端两部分,可以直接通过客户端Navicat工具进行数据库的管理,数据可以直接进行可视化图形展示,操作起来非常的方便,简单易学,所以非常适合一些中小系统的开发和使用。
第3章 系统分析
3.1系统需求分析
图书是知识记载的重要途径,虽然现在电子书横行,但传统实体书还是占有不可动摇的地位。传统图书管理的方式多为手动或者手动加入管理系统,这类管理系统功能单一,需要管理员操作,用户无法参与。这就需要管理员长期站在电脑前,工作效率低下。而本系统可以解放管理员,想要查询图书、借阅图书的用户可以自主操作,减少排队,更加满足用户的需求。所以本系统的开发非常需要。
3.2系统可行性分析
3.2.1技术可行性
本系统对硬件和软件方面的要求都不高,目前市场上常见的计算机硬件设备都可以满足开发本系统的需求,而且操作系统win7,win10都可以,也有很好的兼容性,通过Java语言,结合Html等生成动态网页技术,来实现本系统需要的所有功能。Mysql数据库作为系统的数据存储,安全性有足够的保障,而且有好的管理效率,可以直接对数据进行结构化关系化管理,所以开发本系统所采用的所有技术都是可行的。
3.2.2经济可行性
经过前期的考察调研后,本人认为开发本系统不需要有什么大的支出费用,开发本系统只需要有个计算机就可以,而开发过程中所用到的编程软件和画图软件,还有数据库都是直接从官网就行免费下载的,都属于开源的软件,可以免费使用,而且本系统采用的是Mysql数据库,可以直接自己电脑进行维护更新,不需要额外的维护费用,所以在经济上也是可行的。
3.2.3法律可行性
本系统的主题内容是积极向上的,而且开发成功以后还能对社会带来很好经济效益,对社会是有用的,开发本系统的过程中所编写的代码全部是由自己原创的,知识由老师上课所教授的,没有抄袭和借鉴任何别人的系统,所以也不存在侵权行为,所以开发本系统在法律方面也是可行的。
3.2.4操作可行性
开发的时候已经考虑到了,本系统要面向所有的人群,不管是懂计算机操作的,还是不懂的,所以采用的界面设计,简单美观,每个功能按钮都有文字提示,任何人都可以轻松掌握,熟练使用。而且采用的是B/S架构模式,可以直接借助浏览器运行,用户不需要额外安装各种繁琐的软件,直接就能在网页里进行访问,非常的方便,所以本系统在操作上也是可行的。
3.3系统性能分析
性能分析同样重要,系统的性能质量关系着系统的生命周期和受欢迎程度。对于系统的性能分析主要从以下几点来研究:
- 在系统开发的过程中要用长远的目光看待问题,不能只看当下而减少工作量,考虑系统在未来可能遇到的工作强度,在现阶段尽量提高系统的处理事务的能力和进行信息处理的响应时间;
- 系统要做到开放性,在设计数据库时要充分考虑到用户信息查询的多样性和变化性,需要对查询条件不断的进行升级、优化。加入简单的扩展配置,使后期系统在升级中可以通过扩展配置进行补充;
- 在系统开发中尽可能使用熟悉的语法并进行简单标记、注释,方便今后系统的修改和完善,减少后期修改系统时熟悉的时间;
- 除此之外要注意系统中数据的完整性、准确性和一致性,数据要实现必要的共享和独立。
3.4系统功能分析
本系统的界面分为用户界面和管理员后台界面。管理员后台界面和用户后台界面需要符合身份的用户通过登录验证后才可以使用。
用户后台功能:
- 个人资料管理功能:展示用户的资料,可以修改文字;
- 借书信息管理功能:包括查询借阅和查询图书借阅的使用状态;
- 还书信息管理功能,可以查看还书和进行还书;
- 我的收藏管理功能,管理收藏的图书信息。
管理员后台功能:
- 普通管理员管理功能:包括管理员修改密码和账号管理;
- 用户管理功能:用户信息添加、用户信息管理功能;
- 类型信息管理功能:包括图书类别添加和图书类别查询;
- 图书信息管理功能:包括图书信息添加和图书信息查询;
- 借书信息管理功能:包括审核借书和查询借书;
- 还书信息管理功能,审核用户的还书和查询还书;
- 系统管理功能,实现公告信息的设置。
3.5系统流程分析
本系统所有的功能使用都基于用户登录后,用户登录时数据流会从登录界面流向用户信息表中,然后数据库进行验证,如果可以找到用户输入的数据则界面就会跳转到登录成功界面,用户就可以在系统里进行操作。操作的数据会流向对应的数据库表中,完成用户的指令,最后将数据流入界面展示给用户。本系统的1层流程图如下图3.1所示:
图3.1系统流程1层图
对系统中信息的流动进行抽象就可以得到数据流程图。数据流程图表达了信息的逻辑模型,用来开发人员和用户进行交流。本系统的流程2层图如下图3.2所示:
图3.2系统流程2层图
对管理员的功能进行分析,得出管理员的信息流动,管理员可以管理图书信息、图书类型信息、借阅信息和用户信息等。管理员的流程3层图如下图3.3所示:
图3.3管理员数据流程3层图
对用户的功能进行分析,得出用户的信息流动,用户可以管理个人信息进行图书借阅、还书信息的查询。用户的数据流程3层图如下图3.4所示:
图3.4用户数据流程3层图
总结管理员和用户的信息流程,得出本系统的流程图。本系统的流程图如下图3.5所示:
图3.5系统流程图
第4章 总体设计
4.1系统目标
本系统旨在达到图书展示、图书查询、图书添加、图书管理、图书借阅、图书归还等为一体,为用户和管理员提供服务。使管理员更加轻松的进行工作,使用户更加快速的进行图书借阅。本系统的设计界面丰富,各个模块和按钮明确展示,使所有使用者都可以一目了然,达到人机交互、功能齐全、可扩展的目的。
4.2系统功能设计
根据第三章的功能分析设计出本系统的功能为图书管理、图书借阅、图书查询、图书归还、图书分类等。本系统的权限分为用户和管理员两种。界面分为管理员界面和用户界面。本系统的功能结构图如下图4.1所示:
图4.1系统功能结构图
4.3数据库设计
4.3.1数据库概念模型
数据库概念模型表达了数据实体和数据实体的关系等信息,在数据库的概念模型中记录了每个数据库表的字段,通过数据库概念模型可以轻松设计数据库。对系统中的数据信息进行抽象并建模可以完成数据库的概念模型,而数据库的概念模型用ER图来表达。
本系统的主要数据为管理员、用户、图书、借阅、图书类型。管理员ER图如下图4.2所示:
图4.2管理员ER图
用户数据由管理员和个人管理。用户数据ER图如下图4.3所示:
图4.3用户ER图
图书数据由管理员管理,用户可以借阅,图书数据ER图如下图4.4所示:
图4.4图书ER图
借阅数据由用户和管理员管理。借阅数据ER图如下图4.5所示:
图4.5借阅ER图
类型信息由管理员管理,类型信息ER图如下图4.6所示:
图4.6类型信息ER图
系统关系ER图如下图4.7所示:
图4.7系统关系ER图
4.3.2数据库表设计
按照高内聚、低耦合的原则,并考虑到系统后期的扩展问题设计出本系统的数据库表。本系统的数据库表为管理员信息表,用户信息表、图书信息表、借书信息表、公告信息表等。本图书管理系统的数据库表结构如下表4.1-4.11所示:
表4.1 config
表4.2 haishuxinxi
表4.3 jieshuxinxi
表4.4 leixing
表4.5 news
表4.6 putongguanliyuan
表4.7 storeup
表4.8 token
表4.9 tushuxinxi
表4.10 users
表4.11 yonghu
第5章 系统实现
5.1 JAVA与Mysql数据库连接
数据库建立好后需要和系统连接才可以使系统运行。本系统采用Mysql数据库,在连接时需要设置数据库的服务器名和密码。数据库连接的原理如下图5.1所示:
图5.1 JAVA连接数据库原理
5.2用户身份界面的功能实现
5.2.1用户登录功能的实现界面
登录功能是识别身份的唯一途径,本系统中的用户为用户、管理员。用户在登录时输入的信息需要流入数据库中进行对比。如管理员输入admin admin,数据库则需要对比管理员信息表中是否有admin admin的数据。存在该条数据才可以登录成功,不存在该条数据时会提示错误。用户登录界面的设计效果如下图5.2所示:
图5.2系统用户的登录运行界面
5.2.2 首页功能的实现界面
首页是门户,一个好的首页才可以吸引住用户。本首页里含有导航栏、图书信息、公告等信息。首页功能的实现界面如下图5.3所示:
图5.3首页展示的效果界面
5.2.3个人资料管理功能的实现界面
用户登录后可以管理自己的资料,用户的资料都是在注册时添加的,后期用户可以自己修改个人资料。用户修改个人资料功能的实现界面如下图5.4所示:
图5.4用户修改个人资料功能的运行界面
5.2.4图书信息功能的实现界面
用户可以浏览图书,图书可以分为不同的类型。图书信息功能的实现界面如下图5.5所示:
图5.5图书信息功能的实现界面
5.2.5在线借书功能的实现界面
用户选择需要的图书可以在线进行借书,需要登记必要的借书信息才可以完成。在线借书功能的实现界面如下图5.6所示:
图5.6在线借书功能的实现界面
5.2.6借书管理功能的实现界面
我的借书管理功能为核心重点功能,用户可以浏览自己的借阅信息,相当于用户的借阅证,在此功能里会详细登录用户的借阅详情,包括何时借阅的哪本书,需要何时归还的哪本书等。借书管理功能的实现界面如下图5.7所示:
图5.7借书管理功能的实现界面
5.2.7还书信息管理功能的实现界面
用户可以查询已归还的图书,并修改和删除还书信息。用户查询还书信息的实现界面如下图5.8所示:
图5.8还书信息管理功能的实现界面
5.3系统后台管理员功能实现
5.3.1用户管理功能的实现界面
本功能包括用户信息查询、用户信息添加和用户信息的管理。本功能的设计目的是登记用户信息,方便用户可以使用本系统并进行图书的借阅。用户管理功能的实现界面如下图5.9所示:
图5.9用户管理功能界面的实现
5.3.2图书信息管理功能的实现界面
本功能包括对图书的添加、删除、修改、查询。添加图书时填写图书详情就可以完成,查询图书时填写查询条件即可以查询出来相对应的图书。查询图书信息功能的实现界面如下图5.10所示:
图5.10查询图书信息功能的实现界面
5.3.3借书管理功能的实现
用户的借书信息可在本功能里进行管理,可以审核用户的借书申请。本功能还包括删除用户的借书信息。图书借书功能的实现界面如下图5.11所示:
图5.11图书借书功能的实现界面
5.3.4类型管理功能的实现界面
管理员可以设置图书的类别,并对类别进行修改的删除等。管理员查询图书类别功能的实现界面如下图5.12所示:
图5.12管理员查询图书类别功能的实现界面
5.3.5管理员管理功能的实现界面
本功能可以实现对管理员账号进行添加和查询,完成新增管理员,实现界面如下图5.13所示:
图5.13添加管理员信息的实现界面
5.3.6还书功能的实现界面
管理员也可以审核用户的还书申请,通过申请后用户才可以完成还书。管理员查询还书信息的实现界面如下图5.14所示:
图5.14查询还书信息的实现界面
5.3.7系统管理功能的实现界面
系统管理包括设置轮播图和公告,实现界面如下图5.15所示:
图5.15系统管理功能的实现界面
AlipayConfig.java
package com.config;
import java.io.FileWriter;
import java.io.IOException;
/* *
*类名:AlipayConfig
*功能:基础配置类
*详细:设置帐户有关信息及返回路径
*修改日期:2017-04-05
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
*/
public class AlipayConfig {
}
BaiduUtil.java
package com.utils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONObject;
/**
* 类说明 :
*/
public class BaiduUtil {
/**
* 根据经纬度获得省市区信息
* @param lon 纬度
* @param lat 经度
* @param coordtype 经纬度坐标系
* @return
*/
public static Map<String, String> getCityByLonLat(String key, String lng, String lat) {
String location = lat + "," + lng;
try {
//拼装url
String url = "http://api.map.baidu.com/reverse_geocoding/v3/?ak="+key+"&output=json&coordtype=wgs84ll&location="+location;
String result = HttpClientUtils.doGet(url);
JSONObject o = new JSONObject(result);
Map<String, String> area = new HashMap<>();
area.put("province", o.getJSONObject("result").getJSONObject("addressComponent").getString("province"));
area.put("city", o.getJSONObject("result").getJSONObject("addressComponent").getString("city"));
area.put("district", o.getJSONObject("result").getJSONObject("addressComponent").getString("district"));
area.put("street", o.getJSONObject("result").getJSONObject("addressComponent").getString("street"));
return area;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取API访问token
* 该token有一定的有效期,需要自行管理,当失效时需重新获取.
* @param ak - 百度云官网获取的 API Key
* @param sk - 百度云官网获取的 Securet Key
* @return assess_token
*/
public static String getAuth(String ak, String sk) {
// 获取token地址
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = "";
String line;
while ((line = in.readLine()) != null) {
result += line;
}
/**
* 返回结果示例
*/
System.err.println("result:" + result);
org.json.JSONObject jsonObject = new org.json.JSONObject(result);
String access_token = jsonObject.getString("access_token");
return access_token;
} catch (Exception e) {
System.err.printf("获取token失败!");
e.printStackTrace(System.err);
}
return null;
}
}
StoreupController.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.StoreupEntity;
import com.entity.view.StoreupView;
import com.service.StoreupService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
/**
* 收藏表
* 后端接口
* @author
* @email
* @date 2022-03-26 16:12:18
*/
@RestController
@RequestMapping("/storeup")
public class StoreupController {
@Autowired
private StoreupService storeupService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,StoreupEntity storeup,
HttpServletRequest request){
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
storeup.setUserid((Long)request.getSession().getAttribute("userId"));
}
EntityWrapper<StoreupEntity> ew = new EntityWrapper<StoreupEntity>();
PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 前端列表
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,StoreupEntity storeup,
HttpServletRequest request){
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
storeup.setUserid((Long)request.getSession().getAttribute("userId"));
}
EntityWrapper<StoreupEntity> ew = new EntityWrapper<StoreupEntity>();
PageUtils page = storeupService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, storeup), params), params));
request.setAttribute("data", page);
return R.ok().put("data", page);
}
/**
* 列表
*/
@RequestMapping("/lists")
public R list( StoreupEntity storeup){
EntityWrapper<StoreupEntity> ew = new EntityWrapper<StoreupEntity>();
ew.allEq(MPUtil.allEQMapPre( storeup, "storeup"));
return R.ok().put("data", storeupService.selectListView(ew));
}
/**
* 查询
*/
@RequestMapping("/query")
public R query(StoreupEntity storeup){
EntityWrapper< StoreupEntity> ew = new EntityWrapper< StoreupEntity>();
ew.allEq(MPUtil.allEQMapPre( storeup, "storeup"));
StoreupView storeupView = storeupService.selectView(ew);
return R.ok("查询收藏表成功").put("data", storeupView);
}
/**
* 后端详情
*/
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id){
StoreupEntity storeup = storeupService.selectById(id);
return R.ok().put("data", storeup);
}
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id){
StoreupEntity storeup = storeupService.selectById(id);
return R.ok().put("data", storeup);
}
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody StoreupEntity storeup, HttpServletRequest request){
storeup.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(storeup);
storeup.setUserid((Long)request.getSession().getAttribute("userId"));
storeupService.insert(storeup);
return R.ok();
}
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody StoreupEntity storeup, HttpServletRequest request){
storeup.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(storeup);
storeup.setUserid((Long)request.getSession().getAttribute("userId"));
storeupService.insert(storeup);
return R.ok();
}
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody StoreupEntity storeup, HttpServletRequest request){
//ValidatorUtils.validateEntity(storeup);
storeupService.updateById(storeup);//全部更新
return R.ok();
}
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids){
storeupService.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<StoreupEntity> wrapper = new EntityWrapper<StoreupEntity>();
if(map.get("remindstart")!=null) {
wrapper.ge(columnName, map.get("remindstart"));
}
if(map.get("remindend")!=null) {
wrapper.le(columnName, map.get("remindend"));
}
if(!request.getSession().getAttribute("role").toString().equals("管理员")) {
wrapper.eq("userid", (Long)request.getSession().getAttribute("userId"));
}
int count = storeupService.selectCount(wrapper);
return R.ok().put("count", count);
}
}
jquery.quicksearch.js
(function($, window, document, undefined) {
$.fn.quicksearch = function (target, opt) {
var timeout, cache, rowcache, jq_results, val = '', e = this, options = $.extend({
delay: 100,
selector: null,
stripeRows: null,
loader: null,
noResults: '',
matchedResultsCount: 0,
bind: 'keyup',
onBefore: function () {
return;
},
onAfter: function () {
return;
},
show: function () {
this.style.display = "";
},
hide: function () {
this.style.display = "none";
},
prepareQuery: function (val) {
return val.toLowerCase().split(' ');
},
testQuery: function (query, txt, _row) {
for (var i = 0; i < query.length; i += 1) {
if (txt.indexOf(query[i]) === -1) {
return false;
}
}
return true;
}
}, opt);
this.go = function () {
var i = 0,
numMatchedRows = 0,
noresults = true,
query = options.prepareQuery(val),
val_empty = (val.replace(' ', '').length === 0);
for (var i = 0, len = rowcache.length; i < len; i++) {
if (val_empty || options.testQuery(query, cache[i], rowcache[i])) {
options.show.apply(rowcache[i]);
noresults = false;
numMatchedRows++;
} else {
options.hide.apply(rowcache[i]);
}
}
if (noresults) {
this.results(false);
} else {
this.results(true);
this.stripe();
}
this.matchedResultsCount = numMatchedRows;
this.loader(false);
options.onAfter();
return this;
};
/*
* External API so that users can perform search programatically.
* */
this.search = function (submittedVal) {
val = submittedVal;
e.trigger();
};
/*
* External API to get the number of matched results as seen in
* https://github.com/ruiz107/quicksearch/commit/f78dc440b42d95ce9caed1d087174dd4359982d6
* */
this.currentMatchedResults = function() {
return this.matchedResultsCount;
};
this.stripe = function () {
if (typeof options.stripeRows === "object" && options.stripeRows !== null)
{
var joined = options.stripeRows.join(' ');
var stripeRows_length = options.stripeRows.length;
jq_results.not(':hidden').each(function (i) {
$(this).removeClass(joined).addClass(options.stripeRows[i % stripeRows_length]);
});
}
return this;
};
this.strip_html = function (input) {
var output = input.replace(new RegExp('<[^<]+\>', 'g'), "");
output = $.trim(output.toLowerCase());
return output;
};
this.results = function (bool) {
if (typeof options.noResults === "string" && options.noResults !== "") {
if (bool) {
$(options.noResults).hide();
} else {
$(options.noResults).show();
}
}
return this;
};
this.loader = function (bool) {
if (typeof options.loader === "string" && options.loader !== "") {
(bool) ? $(options.loader).show() : $(options.loader).hide();
}
return this;
};
this.cache = function () {
jq_results = $(target);
if (typeof options.noResults === "string" && options.noResults !== "") {
jq_results = jq_results.not(options.noResults);
}
var t = (typeof options.selector === "string") ? jq_results.find(options.selector) : $(target).not(options.noResults);
cache = t.map(function () {
return e.strip_html(this.innerHTML);
});
rowcache = jq_results.map(function () {
return this;
});
/*
* Modified fix for sync-ing "val".
* Original fix https://github.com/michaellwest/quicksearch/commit/4ace4008d079298a01f97f885ba8fa956a9703d1
* */
val = val || this.val() || "";
return this.go();
};
this.trigger = function () {
this.loader(true);
options.onBefore();
window.clearTimeout(timeout);
timeout = window.setTimeout(function () {
e.go();
}, options.delay);
return this;
};
this.cache();
this.results(true);
this.stripe();
this.loader(false);
return this.each(function () {
/*
* Changed from .bind to .on.
* */
$(this).on(options.bind, function () {
val = $(this).val();
e.trigger();
});
});
};
}(jQuery, this, document));
声明
本博客适用于广泛的学术和教育用途,包括但不限于个人学习、开发设计,产品设计。仅供学习参考,旨在为读者提供深入理解和学术研究的材料。