第一章:描述了程序的开拓背景,程序利用于现实生活的目的与意义,以及程序文档的构造安排信息;
第二章:描述了程序的开拓环境,包括程序开拓涉及到的技能,程序开拓利用的数据存储工具等信息;
第三章:描述了程序动手进行开拓时,会面临的可行性问题,并对程序功能以及性能哀求进行描述;
第四章:描述了程序大功能模块下的功能细分信息,以及存储程序数据的数据库表文件构造的设计信息等;
第五章:描述了程序的功能实现界面的内容,也对程序操作职员操作的部分功能进行了描述;
第六章:描述了程序功能的测试内容,并先容了系统测试的观点与方法。 # 2 干系技能 ## 2.1 B/S构造先容在早期,一些利用HTML措辞编写的文件,再凑集一些其它资源文件就可以组成一个最大略的Web程序,理解了Web程序也须要理解Web站点,它们之间的关系便是一个或者多个Web程序可以放在Internet上的一个Web站点(Web做事器)中进行利用。可以说Web运用程序的开拓也带动了B/S这种网络构造模式的兴起。B是Brower(浏览器)的首字母,S是Server(做事器)的首字母,两个首字母进行组合就成了网络构造模式的简称B/S。由于这种构造模式通过安装在客户真个浏览器进行做事器的访问,可以把程序的核心功能安排在做事器中进行处理,给程序的开拓,后期利用和掩护省去了许多事情。图2.2展示的便是利用这种架构开拓的程序的事情事理。
图2.2 B/S架构的事情事理图 ## 2.2 MySQL数据库先容 开拓的程序面向用户的只是程序的功能界面,让用户操作程序界面的各个功能,那么很多人就会问,用户利用程序功能天生的数据信息放在哪里的?这个就须要涉及到数据库的知识了,一样平常来说,程序开拓常日就会对常用数据存储工具的特点进行剖析比对,比如MySQL数据库的特点与上风,Access数据库的特点与上风,Sqlserver数据库的特点与上风等,终极看哪个数据库与须要开拓的程序比较匹配,也符合程序功能运行须要的数据存储哀求,比如,须要开拓商业级别的程序,存储的数据对数据库哀求较高,可以选用Oracle,如果只是比较大略的程序,对数据存储没有过多哀求,可以选用微软旗下的Access,当开拓程序哀求数据库占用空间小,并能知足程序数据存储哀求时,就可以考虑Oracle公司从瑞典MySQL AB公司在很早之前就收购过一个关系型数据库,它是现在的MySQL数据库。在数据库工具里面它是最受认可的个中一个运用软件。须要解释的信息便是,本程序的开拓就利用到了此数据库。它将程序数据通过利用不同的数据表格进行保存,在增加了程序数据的存储速率的时候,也提高了数据库的灵巧性。 图2.3展示的便是MySQL的架构图。
图2.3 MySQL数据库架构图 ## 2.3 SSM框架先容 SSM框架,是Spring+Spring MVC+MyBatis的缩写,这个是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级运用系统。
1.Spring简介
Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开拓框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为理解决企业运用开拓的繁芜性而创建的。Spring利用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用场不仅限于做事器真个开拓。从大略性、可测试性和松耦合的角度而言,任何Java运用都可以从Spring中受益。大略来说,Spring是一个轻量级的掌握反转(IoC)和面向切面(AOP)的容器框架。
2.Spring MVC简介
Spring MVC属于Spring Framework的后续产品,已经领悟在Spring Web Flow里面,它原生支持的Spring特性,让开发变得非常大略规范。Spring MVC分离了掌握器、模型工具、分派器以及处理程序工具的角色,这种分离让它们更随意马虎进行定制。
3.MyBatis简介
MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。MyBatis是一个基于Java的持久层框架。iBATIS供应的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis肃清了险些所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis利用大略的XML或表明用于配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java工具)映射成数据库中的记录。可以这么理解,MyBatis是一个用来帮你管理数据增编削查的框架。
2.4 JSP先容JSP全称Java Server Pages,是一种动态网页开拓技能。它利用JSP标签在HTML网页中插入Java代码。标签常日以<%开头以%>结束。
JSP是一种Java servlet,紧张用于实现Java web运用程序的用户界面部分。网页开拓者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中通报掌握信息和共享信息。
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模型图由长方形(实体),椭圆形(属性),菱形(关系)这三部分图形符号组成,绘制期间要区分开来,用准确的图形符号代表相应的数据元素。
(1)管理员实体属性图见图4.4。
图4.4 管理员实体属性图
(2)卖家实体属性图见图4.5。
图4.5 卖家实体属性图
(3)用户实体属性图见图4.6。
图4.6 用户实体属性图 ### 4.3.2 数据库表构造设计 数据库系统一旦选定之后,须要根据程序哀求在数据库中建立数据库文件,并在已经完成创建的数据库文件里面,为程序运行中产生的数据建立对应的数据表格,数据表构造设计便是对创建的数据表格进行字段设计,字段长度设计,字段类型设计等,当数据表格合理设计完成之后,才能正常存储干系程序运行产生的数据信息。
1系统公告表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
title
String
标题
是
4
introduction
String
简介
是
5
picture
String
图片
是
6
content
String
内容
是
2卖家表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
maijiazhanghao
String
卖家账号
是
4
mima
String
密码
是
5
maijiaxingming
String
卖家姓名
是
6
xingbie
String
性别
是
7
touxiang
String
头像
是
8
lianxidianhua
String
联系电话
是
9
shenfenzheng
String
身份证
是
3收藏表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
userid
Integer
用户id
是
4
refid
Integer
收藏id
是
5
tablename
String
表名
是
6
name
String
收藏名称
是
7
picture
String
收藏图片
是
8
type
String
类型(1:收藏,21:赞,22:踩)
是
9
inteltype
String
推举类型
是
4拍卖商品表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
shangpinmingcheng
String
商品名称
是
4
shangpinleixing
String
商品类型
是
5
tupian
String
图片
是
6
faburiqi
date
发布日期
是
7
guige
String
规格
是
8
jingpaijiage
Integer
竞拍价格
是
9
shangpinxiangqing
String
商品详情
是
10
maijiazhanghao
String
卖家账号
是
11
maijiaxingming
String
卖家姓名
是
5用户表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
username
String
用户名
是
3
password
String
密码
是
4
role
String
角色
是
5
addtime
Date
新增韶光
是
6token表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
userid
Integer
用户id
是
3
username
String
用户名
是
4
tablename
String
表名
是
5
role
String
角色
是
6
token
String
密码
是
7
addtime
Date
新增韶光
是
8
expiratedtime
Date
过期韶光
是
7成交关照表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
dingdanbianhao
String
订单编号
是
4
shangpinmingcheng
String
商品名称
是
5
shangpinleixing
String
商品类型
是
6
yonghuchujia
String
用户出价
是
7
chengjiaoshijian
datetime
成交韶光
是
8
yonghuming
String
用户名
是
9
shouji
String
手机
是
10
dizhi
String
地址
是
11
maijiazhanghao
String
卖家账号
是
12
crossuserid
Integer
跨表用户id
是
13
crossrefid
Integer
跨表主键id
是
14
ispay
String
是否支付
是
8用户表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
yonghuming
String
用户名
是
4
mima
String
密码
是
5
xingming
String
姓名
是
6
touxiang
String
头像
是
7
xingbie
String
性别
是
8
shouji
String
手机
是
9
dizhi
String
地址
是
9用户评价表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
dingdanbianhao
String
订单编号
是
4
shangpinmingcheng
String
商品名称
是
5
shangpinleixing
String
商品类型
是
6
pingfen
String
评分
是
7
pingjianeirong
String
评价内容
是
8
pingjiashijian
date
评价韶光
是
9
yonghuming
String
用户名
是
10
shouji
String
手机
是
11
maijiazhanghao
String
卖家账号
是
12
crossuserid
Integer
跨表用户id
是
13
crossrefid
Integer
跨表主键id
是
14
sfsh
String
是否审核
是
15
shhf
String
审核回答
是
10用户竞拍表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
shangpinmingcheng
String
商品名称
是
4
shangpinleixing
String
商品类型
是
5
jingpaijiage
Integer
竞拍价格
是
6
yonghuchujia
Integer
用户出价
是
7
chujiashijian
datetime
出价韶光
是
8
yonghuming
String
用户名
是
9
shouji
String
手机
是
10
dizhi
String
地址
是
11
maijiazhanghao
String
卖家账号
是
12
crossuserid
Integer
跨表用户id
是
13
crossrefid
Integer
跨表主键id
是
11留言互换表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
userid
Integer
留言人id
是
4
username
String
用户名
是
5
content
String
留言内容
是
6
cpicture
String
留言图片
是
7
reply
String
回答内容
是
8
rpicture
String
回答图片
是
12配置文件表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
name
String
配置参数名称
是
3
value
String
配置参数值
是
13商品类型表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
shangpinleixing
String
商品类型
是
14拍卖商批驳论表
序号
列名
数据类型
解释
许可空
1
Id
Int
id
否
2
addtime
Date
创建韶光
是
3
refid
Integer
关联表id
是
4
userid
Integer
用户id
是
5
nickname
String
用户名
是
6
content
String
评论内容
是
7
reply
String
回答内容
是
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.2 卖家模块功能 ### 5.2.1 拍卖商品管理 如图5.4显示的便是拍卖商品管理页面,卖家可以对拍卖商品信息进行添加,修正,删除操作。
图5.4 拍卖商品管理页面 ### 5.2.2 用户竞拍管理 如图5.4显示的便是用户竞拍管理页面,卖家可以查看和查询对自己拍卖的商品的用户竞拍信息,可以对成交用户进行关照。
图5.5 用户竞拍管理页面 ## 5.3 用户管理 ### 5.3.1 拍卖商品 如图5.4显示的便是拍卖商品页面,用户可注册可登录,登录后查看拍卖商品就可以看到竞拍按钮。
图5.6 拍卖商品页面
5.3.2 公告信息如图5.4显示的便是公告信息页面,用户可以在公告信息页面查看公告信息。
图5.7 公告信息页面 ### 5.3.3 用户竞拍 如图5.4显示的便是用户竞拍页面,用户可以在用户竞拍查看自己的所有竞拍信息。
图5.8 用户竞拍页面
系统BaiduUtil.javapackage 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失落败!
ShangpinleixingServiceImpl.java
"); e.printStackTrace(System.err); } return null; }}
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.ShangpinleixingDao;import com.entity.ShangpinleixingEntity;import com.service.ShangpinleixingService;import com.entity.vo.ShangpinleixingVO;import com.entity.view.ShangpinleixingView;@Service("shangpinleixingService")public class ShangpinleixingServiceImpl extends ServiceImpl<ShangpinleixingDao, ShangpinleixingEntity> implements ShangpinleixingService { @Override public PageUtils queryPage(Map<String, Object> params) { Page<ShangpinleixingEntity> page = this.selectPage( new Query<ShangpinleixingEntity>(params).getPage(), new EntityWrapper<ShangpinleixingEntity>() ); return new PageUtils(page); } @Override public PageUtils queryPage(Map<String, Object> params, Wrapper<ShangpinleixingEntity> wrapper) { Page<ShangpinleixingView> page =new Query<ShangpinleixingView>(params).getPage(); page.setRecords(baseMapper.selectListView(page,wrapper)); PageUtils pageUtil = new PageUtils(page); return pageUtil; } @Override public List<ShangpinleixingVO> selectListVO(Wrapper<ShangpinleixingEntity> wrapper) { return baseMapper.selectListVO(wrapper); } @Override public ShangpinleixingVO selectVO(Wrapper<ShangpinleixingEntity> wrapper) { return baseMapper.selectVO(wrapper); } @Override public List<ShangpinleixingView> selectListView(Wrapper<ShangpinleixingEntity> wrapper) { return baseMapper.selectListView(wrapper); } @Override public ShangpinleixingView selectView(Wrapper<ShangpinleixingEntity> wrapper) { return baseMapper.selectView(wrapper); }}
MPUtil.java
package com.utils;import java.util.Arrays;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import org.apache.commons.lang3.StringUtils;import cn.hutool.core.bean.BeanUtil;import com.baomidou.mybatisplus.mapper.Wrapper;/ Mybatis-Plus工具类 /public class MPUtil { public static final char UNDERLINE = '_'; //mybatis plus allEQ 表达式转换 public static Map allEQMapPre(Object bean,String pre) { Map<String, Object> map =BeanUtil.beanToMap(bean); return camelToUnderlineMap(map,pre); } //mybatis plus allEQ 表达式转换 public static Map allEQMap(Object bean) { Map<String, Object> map =BeanUtil.beanToMap(bean); return camelToUnderlineMap(map,""); } public static Wrapper allLikePre(Wrapper wrapper,Object bean,String pre) { Map<String, Object> map =BeanUtil.beanToMap(bean); Map result = camelToUnderlineMap(map,pre); return genLike(wrapper,result); } public static Wrapper allLike(Wrapper wrapper,Object bean) { Map result = BeanUtil.beanToMap(bean, true, true); return genLike(wrapper,result); } public static Wrapper genLike( Wrapper wrapper,Map param) { Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); int i=0; while (it.hasNext()) { if(i>0) wrapper.and(); Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); String value = (String) entry.getValue(); wrapper.like(key, value); i++; } return wrapper; } public static Wrapper likeOrEq(Wrapper wrapper,Object bean) { Map result = BeanUtil.beanToMap(bean, true, true); return genLikeOrEq(wrapper,result); } public static Wrapper genLikeOrEq( Wrapper wrapper,Map param) { Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); int i=0; while (it.hasNext()) { if(i>0) wrapper.and(); Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); if(entry.getValue().toString().contains("%")) { wrapper.like(key, entry.getValue().toString().replace("%", "")); } else { wrapper.eq(key, entry.getValue()); } i++; } return wrapper; } public static Wrapper allEq(Wrapper wrapper,Object bean) { Map result = BeanUtil.beanToMap(bean, true, true); return genEq(wrapper,result); } public static Wrapper genEq( Wrapper wrapper,Map param) { Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); int i=0; while (it.hasNext()) { if(i>0) wrapper.and(); Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); wrapper.eq(key, entry.getValue()); i++; } return wrapper; } public static Wrapper between(Wrapper wrapper,Map<String, Object> params) { for(String key : params.keySet()) { String columnName = ""; if(key.endsWith("_start")) { columnName = key.substring(0, key.indexOf("_start")); if(StringUtils.isNotBlank(params.get(key).toString())) { wrapper.ge(columnName, params.get(key)); } } if(key.endsWith("_end")) { columnName = key.substring(0, key.indexOf("_end")); if(StringUtils.isNotBlank(params.get(key).toString())) { wrapper.le(columnName, params.get(key)); } } } return wrapper; } public static Wrapper sort(Wrapper wrapper,Map<String, Object> params) { String order = ""; if(params.get("order") != null && StringUtils.isNotBlank(params.get("order").toString())) { order = params.get("order").toString(); } if(params.get("sort") != null && StringUtils.isNotBlank(params.get("sort").toString())) { if(order.equalsIgnoreCase("desc")) { wrapper.orderDesc(Arrays.asList(params.get("sort"))); } else { wrapper.orderAsc(Arrays.asList(params.get("sort"))); } } return wrapper; } / 驼峰格式字符串转换为下划线格式字符串 @param param @return / public static String camelToUnderline(String param) { if (param == null || "".equals(param.trim())) { return ""; } int len = param.length(); StringBuilder sb = new StringBuilder(len); for (int i = 0; i < len; i++) { char c = param.charAt(i); if (Character.isUpperCase(c)) { sb.append(UNDERLINE); sb.append(Character.toLowerCase(c)); } else { sb.append(c); } } return sb.toString(); } public static void main(String[] ages) { System.out.println(camelToUnderline("ABCddfANM")); } public static Map camelToUnderlineMap(Map param, String pre) { Map<String, Object> newMap = new HashMap<String, Object>(); Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); String newKey = camelToUnderline(key); if (pre.endsWith(".")) { newMap.put(pre + newKey, entry.getValue()); } else if (StringUtils.isEmpty(pre)) { newMap.put(newKey, entry.getValue()); } else { newMap.put(pre + "." + newKey, entry.getValue()); } } return newMap; }}
声明
本博客适用于广泛的学术和教诲用场,包括但不限于个人学习、开拓设计,产品设计。仅供学习参考,旨在为读者供应深入理解和学术研究的材料。
java系统设计,毕设辅导