绪论:对系统的背景,意义进行解释;
开拓环境:对系统利用的数据库工具,框架技能等解释;
系统剖析:对系统开拓可行,剖析的功能等解释;

系统设计:对系统的功能构造,数据表等解释;
系统实现:对系统的各个角色的功能操作界面进行展示息争释;
系统测试:对系统的测试进行解释;
第二章 开拓环境开拓本系统须要配置开拓环境,除了须要开拓者安装相应的软件外,也须要对开拓中利用的技能进行理解和节制。 ## 2.1 Java措辞 Java措辞是目前最盛行的措辞之一,不仅可以做桌面窗口形式的程序,还可以做浏览器访问的程序,目前最盛行的便是用Java措辞作为根本,做各种程序的后台处理。Java措辞是操作变量的措辞,而变量则是Java对付数据存在形式的定义,变量用来操作内存,而内存则牵扯到打算机安全问题,这样Java措辞反而有了免疫直接针对用Java措辞开拓出来的程序的病毒,有效的提高了Java措辞开拓出来程序的生存能力。Java是具有动态运行能力的一种措辞,Java的类不仅仅可以用Java核心供应的根本类,还可以进行重写,这样会让Java的功能变得更加丰富,乃至可以编写一些功能模块进行封装,然后其他项目如果须要用到这些可以复用的功能,完备可以直接引用,然后在用得地方调用方法即可。Java是一种开源的措辞,可以对Java里面的各种类以及引用方法进行追溯,乃至可以对已经编译过的措辞进行反编译,这样不仅仅提高学习的效率,并且可以学习其他从业者供应的优雅的编程办法。Java措辞发展到现在,已经在各个行业扎根,学习Java可以从事的行业很多,并且学习的方法很多,网上有很多免费的教程,乃至有些博识的知识也只须要付费就可以进行学习,而不是像Java措辞之初,每一个编程职员都须要用记事本进行手动编码,现在有很多集成开拓环境帮助Java从业者。选择Java措辞进行编程,是一种很好的办理问题的办法。 ## 2.2 MYSQL数据库 一样平常学习程序开拓的职员如果学习数据库的话,肯定是要学习MySQL数据库,MySQL数据库通过这么多年的不断发展,社区版本都是免费的,最主要的是小巧,占用电脑空间比较小,让更多的开拓职员可以不须要改换更高等的电脑就可以进行学习。学习只是一个方面,最主要的是MySQL市场霸占率是天下第一,基本上十个公司就有七八个用得MySQL数据库。MySQL的优点不但是这么粗浅,MySQL首先是开源的,只要不是商用就不用费钱,并且大型的数据也是支持的,只假如市情上存在的操作系统,MySQL都可以有对应的版本可供给用。由于MySQL是开源的,如果有对MySQL有分外需求的乃至可以自己修正源码,达到符合自己利用的目的。MySQL数据库好处多多,最主要的一点符合本设计的开拓需求,可以说本设计只用到了MySQL的一些根本功能,而这点根本功能就完备够用。MySQL学习的教程网上很多,许多关于入门的教程就完备可以达到普通程序员的开拓水平,只须要把基本的知识学会了,到公司里面也只是根据不同的业务逻辑进行不同的语句编写而已。 ## 2.3 Eclipse开拓工具 Eclipse是开源免费的,仅仅这样理解大概会给人一种免费没有好货的觉得,实在不是这样的。Eclipse是一个开拓源代码的开拓工具,这样会很安全,由于是开源的,如果对利用者的电脑有害,肯定能找到缘故原由所在,以是这一点安全方面是不用担心的。Eclipse是不用安装的,这样就不用对系统盘增加压力,可以放到任何一个盘里,利用的时候打开,不用的时候关闭,不会静静的在后台运行,不须要增加注册表包袱,启动还必须依赖Java的JDK才可以启动,有效的避免了一些病毒入侵,如果病毒入侵改变了源代码,就不能运行了,只能重新删除文件夹重新解压一份新的Eclipse即可,用起来很安全。Eclipse发展到现在,已经可以支持其他的开拓措辞了,家族越来越强大,功能越来越多,最主要的还是没有收费,这一点就让新手开拓者省下很多的资金用来培养自己的学习,而不用费钱买了开拓软件才创造自己不适宜进行开拓,永久免费的策略可以永久让人有想利用的机会。最主要的是Eclipse并不是免费功能就不足用,正好相反,不仅功能强大,用起来完备符合本设计的开拓需求,以是选用了Eclipse作为开拓工具。 ## 2.4 SSM框架 首先SSM框架是指的三个框架,第一个S是Spring MVC的首字母,紧张是作为掌握视图层的一种框架,第二个S是Spring框架的意思,紧张是用来作为Web层,这一层紧张是用来获取浏览器提交的一些信息并且把提交的信息处理后反馈给Spring MVC来掌握不同的显示页面和内容;第三个M是的意思是MyBatis框架,紧张是做为持久层用得,把数据工具转换成数据库表里的值,或者从数据库获取相应的数据转换成对应的Java工具让程序可以有效的进行转换和处理。三个框架可以有效的进行结合,实现不同的浸染,起到了承上启下的浸染。
第三章 系统剖析这个阶段,须要依赖大量的资料作为研究本系统的根本数据,除了剖析系统开拓可行问题之外,还要再通过调查本系统针对的目标人群的需求来确定本系统功能,并在本系统的性能上做出进一步剖析。 ## 3.1可行性剖析 在项目进行开拓之前,必须要有可行性剖析报告,这是实现科学开拓的必要步骤。 ### 3.1.1技能可行性 从技能的角度出发,目前采取开拓的技能完备能知足系统开拓须要。目前市场上有现成的开拓工具和技能,这些能担保系统顺利开拓。 ### 3.1.2操作可行性 同城蔬菜配送管理系统是根据用户常常利用的页面操作流程来进行设计的,并且页面担保统一,从视觉角度和操作角度上都能达到利用哀求。 ### 3.1.3经济可行性 在本次开拓过程中,由于须要通过电脑来进行配置开拓的环境,通过对技能的剖析,创造目前正在利用的电脑是可以知足开拓须要的,并不须要太多的金钱对电脑进行改换。以是,从经济角度上剖析,可以知足开拓哀求。
从以上三个角度来进行剖析论证,证明了同城蔬菜配送管理系统是可以正常开拓并且利用的。 ## 3.2系统流程剖析 从系统的角色上剖析,每个用户角色都代表了不同的账号身份,而不同的身份则代表着功能的异同,以是首先要区分用户的角色身份问题。设置用户登录须要输入账号,密码,系统会判断输入的信息,输入的数据精确才能进行下一步操作,如果禁绝确的账号密码,则谢绝用户登录,也代表着用户没有连续访问的权限,系统是无法连续供应做事的。
图3-1 操作流程图
任何一个别系都有一个操作流程,本设计里面,对付任何数据的存储都有一定的合法哀求,只有符合设定哀求的数据才可以进行存储。详细步骤参考下图。
图3-2 添加信息流程图
数据的存储并不是一成不变的,当须要对已经存在的数据进行改变的时候,同样也遵照着操作流程,想变动数据首先要确定变动之前的数据是什么,然后输入新的数据是否合法,都要符合流程,只有合法数据才可以被更新到数据库里存储。详细步骤参考下图。
图3-3 修正信息流程图
删除操作,在数据存储方面是一件比较慎重的事宜,很有可能会产生失落误操作,以是一样平常删除操作的时候都要提示是否删除,确定删除才会更新数据库内容,实现删除目的。详细步骤参考下图。
图3-4 删除信息流程图 ## 3.3系统性能剖析 系统在利用过程中,用户会享受到系统带来的便利。那么如何保持在永劫光的利用过程中,不涌现乱七八糟的问题,让利用系统变成一种操作上的享受,利用上的便捷,这便是须要考虑的问题。以下紧张从系统的性能剖析上面进行描述,从数据完全以及数据安全,包括系统的可扩展等方面进行先容。 ### 3.3.1系统安全性 注册用户与游客用户的差异就在于是否有账号,如果有账号,就有密码,密码是担保账号安全性的条件,游客只能浏览一些公共性信息,如果须要用户登录才能不雅观看的信息,那么也须要利用账号登录的。对付系统安全性上面,紧张考虑角色的密码加密问题,这样可以防止有效的密码数据拦截后的破解事情。一样平常密码如果有安全性哀求的话,是可以考虑加密存储。密码的加密存储大致有两种设计方法,一种是密码在前台提交后就用Java Script进行MD5加密,然后直接提交密文,这样的好处是密文传输的安全性,另一种是提交密码后在后台处理的过程中对密码进行加密或者解密,这样会增加后台的处理包袱。一样平常都居中考虑,如果登录的话会把密码在后台进行加密。目前常用的加密办法是MD5加密办法。 ### 3.3.2数据完全性 系统进行开拓的最主要的目的便是数据的处理,打算机有其善于数据的存储以及处理事情,以是数据的完全性是必须担保的,不然系统的存在是没有必要的。数据不管是设计还是存储,都必须完全,从数据的输入就从各个方面担保数据的合法性,违规数据不能直接提交的。数据处理逻辑也会担保数据的加工正常,进而进行数据存储,也会担保数据设计的合理,这些都是有数据设定哀求的。目前对数据的存储采取的关系型数据库,关系型数据库有多年的历史,功能强大,迁移备份以及无人值守都可以进行自动备份的。 ### 3.3.3系统可扩展性 系统是有必要存在扩展性的。在设计之初就要考虑可能存在的业务,以是对系统的设计就要模块化设计,这样须要进行扩展的时候,只要在对应模块进行增加,对应逻辑进行调试即可。系统可扩展性的提升会让系统增加不必要的事情量,让程序设计更加符合规范。 ## 3.4系统功能剖析 本系统在功能剖析上,紧张是根据目标用户群的角度进行剖析,为了便于展示剖析结果,这里就利用用例图进行功能展示。
管理员用例图的绘制结果见图3-5。管理员登录进入本系统操作的功能包括对员工,经理,用户,蔬菜,公告等信息进行管理。
图3-5 管理员用例图
经理用例图的绘制结果见图3-6。经理登录进入本系统操作的功能包括审核蔬菜退换货信息,对蔬菜订单进行管理,查询员工,查询用户,管理蔬菜信息等。
图3-6 经理用例图
员工用例图的绘制结果见图3-7。员工登录进入本系统操作的功能包括管理蔬菜信息,蔬菜订单信息,回答蔬菜评价信息,查看公告等。
图3-7 员工用例图
用户用例图的绘制结果见图3-8。用户登录进入本系统操作的功能包括购买蔬菜,收藏喜好的蔬菜,查看公告,查看蔬菜订单,申请蔬菜退换货等。
图3-8 用户用例图
第四章 系统设计到目前为止,市情上已经存在了各种各样的软件系统,从系统的分类动手,紧张运用范围方向于办公系统,娱乐系统,社交系统,然后下面有很多比较细的分支系统。很多系统已经经由了市场的磨练,针对不同的业务场景已经开始涌现了业务模块化,程序员减代码化的各种设计办法。到目前为止,当要设计一个别系的时候,首先根据业务模型基本上都可以在网上找到类似的模板,然后根据详细业务详细剖析,进而实现详细功能,大众的便是最好的,毕竟符合市场主流的就代表着肯定符合常规操作流程。 ## 4.1功能构造设计 本系统紧张是基于数据的增加,修正,删除等操作,利用者能够通过提前设定的登录功能进入指定的操作区,这里对利用者设计的功能进行构造展示。
管理员功能构造图的绘制结果见图4-1。管理员登录进入本系统操作的功能包括对员工,经理,用户,蔬菜,公告等信息进行管理。
图4-1 管理员功能构造图
经理功能构造图的绘制结果见图4-2。经理登录进入本系统操作的功能包括审核蔬菜退换货信息,对蔬菜订单进行管理,查询员工,查询用户,管理蔬菜信息等。
图4-2 经理功能构造图
员工功能构造图的绘制结果见图4-3。员工登录进入本系统操作的功能包括管理蔬菜信息,蔬菜订单信息,回答蔬菜评价信息,查看公告等。
图4-3 员工功能构造图
用户功能构造图的绘制结果见图4-4。用户登录进入本系统操作的功能包括购买蔬菜,收藏喜好的蔬菜,查看公告,查看蔬菜订单,申请蔬菜退换货等。
图4-4 用户功能构造图 ## 4.2数据库设计 如果说设计系统的功能很主要,那么设计该系统的数据库将更主要,毕竟系统做事于用户,数据库做事于系统,用户访问系统,操作系统的所有数据都要依赖于数据库,而系统的数据险些都是保存在数据库中的,以是,一个高质量的程序,一定拥有一个安全,快速相应,稳定可靠的数据库。本系统的MySQL数据库可以通过SQL措辞来实现对系统数据的管理,包括在指定表中插入数据,在规定的表中变动数据,以及删除指定表中的部分数据等操作。一样平常来说,像MySQL这样的关系型数据库,对付构造化查询措辞SQL都能很好的进行支持。在编程中,通过合理利用SQL措辞便能操作数据库的各种数据,真是非常方便快捷!
### 4.2.1 数据库观点设计 本节内容紧张是利用图形的办法来描述数据库中的实体,每个实体的相应属性,还有实体之间的相互联系,常用的Visio工具即可知足绘制E-R图的需求。E-R图是由矩形,椭圆,菱形等图形元素组成,矩形框中紧张写实体的名称,椭圆框中紧张是登记该实体的属性,而菱形框中紧张是登记实体之间的联系名称,末了利用实心线段把这些图形元素进行连接,即可完成E-R图的绘制。当初步得到一个E-R图时,须要进行检讨,利用剖析的办法去修正,重构E-R图,以达到肃清数据冗余,或者是肃清实体间联系冗余的目的。从而保持数据库的完全性,以及降落数据库掩护上面的难度。
(1)利用Visio这样的常用的实体属性图绘制工具来绘制蔬菜实体属性图,绘制结果见图4-3。
图4-3 蔬菜实体属性图
(2)利用Visio这样的常用的实体属性图绘制工具来绘制用户实体属性图,绘制结果见图4-4。
图4-4 用户实体属性图
(3)利用Visio这样的常用的实体属性图绘制工具来绘制蔬菜订单实体属性图,绘制结果见图4-5。
图4-5 蔬菜订单实体属性图
(4)利用Visio这样的常用的实体属性图绘制工具来绘制购物车实体属性图,绘制结果见图4-6。
图4-6 购物车实体属性图
(5)绘制的上述实体间存在的联系见图4-7。
图4-7 实体间关系E-R图 ### 4.2.2 数据库物理设计 本系统数据在数据库中都是通过各种二维表进行记录保存的,在数据库中设计这样的二维表也是比较主要的内容,由于它影响着数据的存储效率。在设计二维表也便是关系模型之前,一些有关二维表方面的常用观点须要进行充分理解。
关系:一张详细的数据表即表示关系,关系的名称与数据表的名称保持同等;
元组:数据表中,每行显示的数据即代表元组;
属性:数据表中,每列表示的数据即代表属性;
关键字:数据表中,为了与其他数据表进行区分,则须要在每张表中进行主键的设置;
通过上节内容可以知晓数据库中的各个实体,并通过一定办法把这些实体表示的内容进行数据表的转换,常日来说,每个实体都会对应一张详细的数据表,在本系统指定的数据库中创建命名好的数据库,才可以对数据表进行创建与设计。同城蔬菜配送管理系统数据表设计结果展示如下:
表4-1 收货地址表
字段
注释
类型
空
id (主键)
主键
int(20)
否
yonghu_id
创建用户
int(20)
否
address_name
收货人
varchar(200)
否
address_phone
电话
varchar(200)
否
address_dizhi
地址
varchar(200)
否
isdefault_types
是否默认地址
int(11)
否
insert_time
添加韶光
timestamp
否
update_time
修正韶光
timestamp
否
create_time
创建韶光
timestamp
否
表4-2 公告表
字段
注释
类型
空
id (主键)
主键
int(11)
否
gonggao_name
公告名称
varchar(200)
是
gonggao_photo
公告照片
varchar(255)
是
gonggao_types
公告类型
int(11)
否
insert_time
公告发布韶光
timestamp
是
gonggao_content
公告详情
text
是
create_time
创建韶光
timestamp
是
表4-3 员工表
字段
注释
类型
空
id (主键)
主键
int(11)
否
username
账户
varchar(200)
是
password
密码
varchar(200)
是
yuangong_uuid_number
员工编号
varchar(200)
是
yuangong_name
员工姓名
varchar(200)
是
yuangong_phone
员工手机号
varchar(200)
是
yuangong_id_number
员工身份证号
varchar(200)
是
yuangong_photo
员工头像
varchar(200)
是
sex_types
性别
int(11)
是
yuangong_email
电子邮箱
varchar(200)
是
create_time
创建韶光
timestamp
是
表4-4 经理表
字段
注释
类型
空
id (主键)
主键
int(11)
否
username
账户
varchar(200)
是
password
密码
varchar(200)
是
jingli_uuid_number
经理编号
varchar(200)
是
jingli_name
经理姓名
varchar(200)
是
jingli_phone
经理手机号
varchar(200)
是
jingli_id_number
经理身份证号
varchar(200)
是
jingli_photo
经理头像
varchar(200)
是
sex_types
性别
int(11)
是
jingli_email
电子邮箱
varchar(200)
是
create_time
创建韶光
timestamp
是
表4-5 购物车表
字段
注释
类型
空
id (主键)
主键
int(11)
否
yonghu_id
所属用户
int(11)
是
shucai_id
蔬菜
int(11)
是
buy_number
购买数量
int(11)
是
create_time
添加韶光
timestamp
是
update_time
更新韶光
timestamp
是
insert_time
创建韶光
timestamp
是
表4-6 蔬菜表
字段
注释
类型
空
id (主键)
主键
int(11)
否
shucai_name
蔬菜名称
varchar(200)
是
shucai_uuid_number
蔬菜编号
varchar(200)
是
shucai_photo
蔬菜照片
varchar(200)
是
shucai_types
蔬菜类型
int(11)
是
shucai_kucun_number
蔬菜库存
int(11)
是
shucai_price
购买得到积分
int(11)
是
shucai_old_money
蔬菜原价
decimal(10,2)
是
shucai_new_money
现价
decimal(10,2)
是
shucai_clicknum
蔬菜热度
int(11)
是
shucai_content
蔬菜详细先容
text
是
shangxia_types
是否上架
int(11)
是
shucai_delete
逻辑删除
int(11)
是
create_time
创建韶光
timestamp
是
表4-7 用户表
字段
注释
类型
空
id (主键)
主键
int(11)
否
username
账户
varchar(200)
是
password
密码
varchar(200)
是
yonghu_name
用户姓名
varchar(200)
是
yonghu_phone
用户手机号
varchar(200)
是
yonghu_id_number
用户身份证号
varchar(200)
是
yonghu_photo
用户头像
varchar(200)
是
sex_types
性别
int(11)
是
yonghu_email
电子邮箱
varchar(200)
是
new_money
余额
decimal(10,2)
是
yonghu_sum_jifen
总积分
decimal(10,2)
是
yonghu_new_jifen
现积分
decimal(10,2)
是
huiyuandengji_types
会员等级
int(11)
是
create_time
创建韶光
timestamp
是
表4-8蔬菜收藏表
字段
注释
类型
空
id (主键)
主键
int(11)
否
shucai_id
蔬菜
int(11)
是
yonghu_id
用户
int(11)
是
shucai_collection_types
类型
int(11)
是
insert_time
收藏韶光
timestamp
是
create_time
创建韶光
timestamp
是
表4-9 蔬菜订单表
字段
注释
类型
空
id (主键)
主键
int(11)
否
shucai_order_uuid_number
订单号
varchar(200)
是
address_id
收货地址
int(11)
是
shucai_id
蔬菜
int(11)
是
yonghu_id
用户
int(11)
是
buy_number
购买数量
int(11)
是
shucai_order_true_price
实付价格
decimal(10,2)
是
shucai_order_courier_name
快递公司
varchar(200)
是
shucai_order_courier_number
订单快递单号
varchar(200)
是
shucai_order_types
订单类型
int(11)
是
shucai_order_payment_types
支付类型
int(11)
是
insert_time
订单创建韶光
timestamp
是
create_time
创建韶光
timestamp
是
表4-10 蔬菜退换货表
字段
注释
类型
空
id (主键)
主键
int(11)
否
shucai_tuihuanhuo_uuid_number
退换货编号
varchar(200)
是
shucai_order_id
蔬菜订单
int(11)
是
yonghu_id
用户
int(11)
是
tuihuanhuo_types
退换货
int(11)
是
insert_time
申请韶光
timestamp
是
gonggao_content
申请情由
text
是
shucai_tuihuanhuo_yesno_types
审核状态
int(11)
是
shucai_tuihuanhuo_yesno_content
审核见地
text
是
shenhe_time
审核韶光
timestamp
是
shucai_tuihuanhuo_courier_name
退回快递公司
varchar(200)
是
shucai_tuihuanhuo_courier_number
退回快递单号
varchar(200)
是
kuaidi_types
快递状态
int(11)
是
shucai_huanhuo_courier_name
换货快递公司
varchar(200)
是
shucai_huanhuo_courier_number
换货快递单号
varchar(200)
是
create_time
创建韶光
timestamp
是
表4-11 管理员表
字段
注释
类型
空
id (主键)
主键
bigint(20)
否
username
用户名
varchar(100)
否
password
密码
varchar(100)
否
role
角色
varchar(100)
是
addtime
新增韶光
timestamp
否
表4-12 蔬菜评价表
字段
注释
类型
空
id (主键)
主键
int(11)
否
shucai_id
蔬菜
int(11)
是
yonghu_id
用户
int(11)
是
shucai_commentback_text
评价内容
text
是
insert_time
评价韶光
timestamp
是
reply_text
回答内容
text
是
update_time
回答韶光
timestamp
是
create_time
创建韶光
timestamp
是
打开新的 phpMyAdmin 窗口
第五章 系统实现这里紧张是对系统设计实现进行描述,通过系统的设计和数据库的设计,通过编码后变成了可以进行操作的界面,让统统想法变成了却果,通过笔墨和详细程序操作界面的截图之间的合营,可以把功能更直不雅观的描述起来。 ## 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-5所示的蔬菜订单管理界面之后,经理点击信息显示栏中最右侧的查看,发货按钮可依次完成蔬菜订单信息的查看,发货操作。
图5-5 蔬菜订单管理界面 ### 5.2.3 公告管理 公告信息有公告照片,公告名称,公告发布韶光等信息。经理进入如图5-6所示的公告管理界面之后,经理点击信息显示栏中最右侧的修正,删除按钮可依次完成公告信息的修正,删除。
图5-6 公告管理界面 ## 5.3员工功能实现 ### 5.3.1 蔬菜管理 蔬菜信息有蔬菜库存,蔬菜原价,蔬菜热度,蔬菜照片等信息。员工进入如图5-7所示的蔬菜管理界面之后,员工点击信息显示栏中最右侧的下架,增加库存,减少库存,修正,删除按钮可依次完成蔬菜信息的下架,增加库存,减少库存,修正,删除。
图5-7 蔬菜管理界面 ### 5.3.2 蔬菜评价管理 蔬菜评价信息有评价韶光,评价内容,用户姓名等信息。员工进入如图5-8所示的蔬菜评价管理界面之后,员工点击信息显示栏中最右侧的查看,回答按钮可依次完成蔬菜评价信息的查看,回答。
图5-8 蔬菜评价管理界面 ### 5.3.3 蔬菜订单管理 蔬菜订单信息有订单类型,蔬菜名称,用户姓名,订单快递单号等信息,员工进入如图5-9所示的蔬菜订单管理界面之后,员工点击信息显示栏中最右侧的查看,发货按钮可依次完成蔬菜订单信息的查看,发货操作。
图5-9 蔬菜订单管理界面 ## 5.4用户功能实现 ### 5.4.1 蔬菜信息 用户进入如图5-10所示的蔬菜信息界面之后,用户收藏喜好的蔬菜,购买须要的蔬菜,查看购买蔬菜能够得到的积分信息,查看蔬菜现价等信息。
图5-10 蔬菜信息界面 ### 5.4.2 确认下单 用户进入如图5-11所示的确认下单界面之后,用户确认购买的蔬菜的数量和购买蔬菜的信息是否精确,确认收货地址,确认实付价信息,末了支付。
图5-11 确认下单界面 ### 5.4.3 蔬菜订单 用户进入如图5-12所示的蔬菜订单界面之后,已经支付的订单如果用户创造有误购买的蔬菜,则可以申请退款,如果蔬菜订单处于发货状态,则用户只能前辈行收货操作。后期可以在蔬菜退换货管理模块申请蔬菜退换货。
图5-12 蔬菜订单界面
YonghuServiceImpl.javapackage com.service.impl;import com.utils.StringUtil;import org.springframework.stereotype.Service;import java.lang.reflect.Field;import java.util.;import com.baomidou.mybatisplus.plugins.Page;import com.baomidou.mybatisplus.service.impl.ServiceImpl;import org.springframework.transaction.annotation.Transactional;import com.utils.PageUtils;import com.utils.Query;import org.springframework.web.context.ContextLoader;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import com.dao.YonghuDao;import com.entity.YonghuEntity;import com.service.YonghuService;import com.entity.view.YonghuView;/ 用户 做事实现类 /@Service("yonghuService")@Transactionalpublic class YonghuServiceImpl extends ServiceImpl<YonghuDao, YonghuEntity> implements YonghuService { @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<YonghuView> page =new Query<YonghuView>(params).getPage(); page.setRecords(baseMapper.selectListView(page,params)); return new PageUtils(page); }}
DictionaryController.java
package com.controller;import java.io.File;import java.math.BigDecimal;import java.net.URL;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.;import java.lang.reflect.InvocationTargetException;import com.service.DictionaryService;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.;import com.entity.view.;import com.service.;import com.utils.PageUtils;import com.utils.R;import com.alibaba.fastjson.;/ 字典 后端接口 @author @email/@RestController@Controller@RequestMapping("/dictionary")public class DictionaryController { private static final Logger logger = LoggerFactory.getLogger(DictionaryController.class); @Autowired private DictionaryService dictionaryService; @Autowired private TokenService tokenService; //级联表service @Autowired private YonghuService yonghuService; @Autowired private YuangongService yuangongService; @Autowired private JingliService jingliService; / 后端列表 / @RequestMapping("/page") @IgnoreAuth public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); if(params.get("orderBy")==null || params.get("orderBy")==""){ params.put("orderBy","id"); } PageUtils page = dictionaryService.queryPage(params); //字典表数据转换 List<DictionaryView> list =(List<DictionaryView>)page.getList(); for(DictionaryView c:list){ //修正对应字典表字段 dictionaryService.dictionaryConvert(c, request); } return R.ok().put("data", page); } / 后端详情 / @RequestMapping("/info/{id}") public R info(@PathVariable("id") Long id, HttpServletRequest request){ logger.debug("info方法:,,Controller:{},,id:{}",this.getClass().getName(),id); DictionaryEntity dictionary = dictionaryService.selectById(id); if(dictionary !=null){ //entity转view DictionaryView view = new DictionaryView(); BeanUtils.copyProperties( dictionary , view );//把实体数据重构到view中 //修正对应字典表字段 dictionaryService.dictionaryConvert(view, request); return R.ok().put("data", view); }else { return R.error(511,"查不到数据"); } } / 后端保存 / @RequestMapping("/save") public R save(@RequestBody DictionaryEntity dictionary, HttpServletRequest request){ logger.debug("save方法:,,Controller:{},,dictionary:{}",this.getClass().getName(),dictionary.toString()); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永久不会进入"); Wrapper<DictionaryEntity> queryWrapper = new EntityWrapper<DictionaryEntity>() .eq("dic_code", dictionary.getDicCode()) .eq("index_name", dictionary.getIndexName()) ; if(dictionary.getDicCode().contains("_erji_types")){ queryWrapper.eq("super_id",dictionary.getSuperId()); } logger.info("sql语句:"+queryWrapper.getSqlSegment()); DictionaryEntity dictionaryEntity = dictionaryService.selectOne(queryWrapper); if(dictionaryEntity==null){ dictionary.setCreateTime(new Date()); dictionaryService.insert(dictionary); //字典表新增数据,把数据再重新查出,放入监听器中 List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>()); ServletContext servletContext = request.getServletContext(); Map<String, Map<Integer,String>> map = new HashMap<>(); for(DictionaryEntity d :dictionaryEntities){ Map<Integer, String> m = map.get(d.getDicCode()); if(m ==null || m.isEmpty()){ m = new HashMap<>(); } m.put(d.getCodeIndex(),d.getIndexName()); map.put(d.getDicCode(),m); } servletContext.setAttribute("dictionaryMap",map); return R.ok(); }else { return R.error(511,"表中有相同数据"); } } / 后端修正 / @RequestMapping("/update") public R update(@RequestBody DictionaryEntity dictionary, HttpServletRequest request){ logger.debug("update方法:,,Controller:{},,dictionary:{}",this.getClass().getName(),dictionary.toString()); String role = String.valueOf(request.getSession().getAttribute("role"));// if(false)// return R.error(511,"永久不会进入"); //根据字段查询是否有相同数据 Wrapper<DictionaryEntity> queryWrapper = new EntityWrapper<DictionaryEntity>() .notIn("id",dictionary.getId()) .eq("dic_code", dictionary.getDicCode()) .eq("index_name", dictionary.getIndexName()) ; if(dictionary.getDicCode().contains("_erji_types")){ queryWrapper.eq("super_id",dictionary.getSuperId()); } logger.info("sql语句:"+queryWrapper.getSqlSegment()); DictionaryEntity dictionaryEntity = dictionaryService.selectOne(queryWrapper); if(dictionaryEntity==null){ dictionaryService.updateById(dictionary);//根据id更新 //如果字典表修正数据的话,把数据再重新查出,放入监听器中 List<DictionaryEntity> dictionaryEntities = dictionaryService.selectList(new EntityWrapper<DictionaryEntity>()); ServletContext servletContext = request.getServletContext(); Map<String, Map<Integer,String>> map = new HashMap<>(); for(DictionaryEntity d :dictionaryEntities){ Map<Integer, String> m = map.get(d.getDicCode()); if(m ==null || m.isEmpty()){ m = new HashMap<>(); } m.put(d.getCodeIndex(),d.getIndexName()); map.put(d.getDicCode(),m); } servletContext.setAttribute("dictionaryMap",map); 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()); dictionaryService.deleteBatchIds(Arrays.asList(ids)); return R.ok(); } / 最大值 / @RequestMapping("/maxCodeIndex") public R maxCodeIndex(@RequestBody DictionaryEntity dictionary){ logger.debug("maxCodeIndex:,,Controller:{},,dictionary:{}",this.getClass().getName(),dictionary.toString()); List<String> descs = new ArrayList<>(); descs.add("code_index"); Wrapper<DictionaryEntity> queryWrapper = new EntityWrapper<DictionaryEntity>() .eq("dic_code", dictionary.getDicCode()) .orderDesc(descs); logger.info("sql语句:"+queryWrapper.getSqlSegment()); List<DictionaryEntity> dictionaryEntityList = dictionaryService.selectList(queryWrapper); if(dictionaryEntityList.size()>0 ){ return R.ok().put("maxCodeIndex",dictionaryEntityList.get(0).getCodeIndex()+1); }else{ return R.ok().put("maxCodeIndex",1); } } / 批量上传 / @RequestMapping("/batchInsert") public R save( String fileName, HttpServletRequest request){ logger.debug("batchInsert方法:,,Controller:{},,fileName:{}",this.getClass().getName(),fileName); Integer yonghuId = Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { List<DictionaryEntity> dictionaryList = new ArrayList<>();//上传的东西 Map<String, List<String>> seachFields= new HashMap<>();//要查询的字段 Date date = new Date(); int lastIndexOf = fileName.lastIndexOf("."); if(lastIndexOf == -1){ return R.error(511,"该文件没有后缀"); }else{ String suffix = fileName.substring(lastIndexOf); if(!".xls".equals(suffix)){ return R.error(511,"只支持后缀为xls的excel文件"); }else{ URL resource = this.getClass().getClassLoader().getResource("../../upload/" + fileName);//获取文件路径 File file = new File(resource.getFile()); if(!file.exists()){ return R.error(511,"找不到上传文件,请联系管理员"); }else{ List<List<String>> dataList = PoiUtil.poiImport(file.getPath());//读取xls文件 dataList.remove(0);//删除第一行,由于第一行是提示 for(List<String> data:dataList){ //循环 DictionaryEntity dictionaryEntity = new DictionaryEntity();// dictionaryEntity.setDicCode(data.get(0)); //字段 要改的// dictionaryEntity.setDicName(data.get(0)); //字段名 要改的// dictionaryEntity.setCodeIndex(Integer.valueOf(data.get(0))); //编码 要改的// dictionaryEntity.setIndexName(data.get(0)); //编码名字 要改的// dictionaryEntity.setSuperId(Integer.valueOf(data.get(0))); //父字段id 要改的// dictionaryEntity.setBeizhu(data.get(0)); //备注 要改的// dictionaryEntity.setCreateTime(date);//韶光 dictionaryList.add(dictionaryEntity); //把要查询是否重复的字段放入map中 } //查询是否重复 dictionaryService.insertBatch(dictionaryList); return R.ok(); } } } }catch (Exception e){ e.printStackTrace(); return R.error(511,"批量插入数据非常,请联系管理员"); } }}
toLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!-- token过期或未登录时逼迫跳转到登录页 -->alert('token过期或未登录!')window.location.href="${pageContext.request.contextPath}/jsp/login.jsp"
声明
本博客适用于广泛的学术和教诲用场,包括但不限于个人学习、开拓设计,产品设计。仅供学习参考,旨在为读者供应深入理解和学术研究的材料。
java系统设计,毕设辅导