ssm825城市蔬菜配送管理系统研究+jsp 第一章引言1.1 课题背景当前整个社会的发展速度很大程度上依赖于互联网。如果没有互联网的存在,市场可能会陷入低迷,严重影响经济发展水平,影响人们的生活质量。计算机的发展,无论是在硬件还是软件方面,都有大量的技术储备。每年都会产生大量的技术和软件。纵观各个领域,互联网软件并不是所有领域都使用。大部分是办公用的电脑,但每个人都有智能手机。设备已经成为人们日常生活的一部分,甚至连老百姓也了解了天文地理,这一切都依赖于互联网技术。互联网技术在信息传播方面的巨大作用,信息处理成为各行业管理者和维护人员的重要任务。人们已经习惯了互联网的存在,因此操作一些互联网产品也成为了日常。因此,开发一个全市范围的蔬菜配送管理系统供人们使用是没有问题的。在此过程中,不仅可以规范全市蔬菜流通信息管理的使用过程和信息处理过程,还可以使整个信息传播和处理处于可控范围内。最重要的是,计算机可以为管理者在同城蔬菜配送信息的管理上提供更好的帮助。 ## 1.2 选题意义当软件开发成为一种趋势时,你会发现任何行业都可以开发出适合自己的软件。无论是内部员工管理、财务管理,甚至是企业管理,都可以数字化,可以对这些数据进行集中处理,基于数据处理结果,管理水平自然得到提升。最重要的是开发一个软件并投入使用。开发过程其实就是一个梳理行业痛点的过程,就是让软件弥补行业的管理漏洞,不断优化事物的处理流程。同城蔬菜配送管理系统是专门开发的软件,采用Web技术,让用户通过任何智能设备上的浏览器即可操作和使用。数据的处理不限于地理距离。只要软件开发到位,就很容易使用,达到预期的目的。你会发现有软件和没有软件有很大的区别。有了这个软件,你会发现它在数据存储安全方面比以前满屋子查找记录要好得多。巨大的。 ## 1.3 研究内容本系统将在以下链接中进行阐述。
简介:解释系统的背景和意义;
开发环境:系统使用的数据库工具、框架技术等描述;
系统分析:系统开发可行性描述及分析功能;
系统设计:系统功能结构、数据表等描述;
系统实现:展示并讲解系统中各角色的功能操作界面;
系统测试:讲解系统的测试;
第二章开发环境开发本系统需要配置开发环境。除了要求开发人员安装相应的软件外,还需要了解和掌握开发中使用的技术。 ## 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 Manager 用例图
员工用例图的绘制结果如图3-7所示。员工登录该系统的功能包括管理蔬菜信息、蔬菜订单信息、回复蔬菜评价信息、查看公告等。
图3-7 员工用例图
用户用例图的绘制结果如图3-8所示。用户登录进入本系统的功能包括购买蔬菜、收藏喜欢的蔬菜、查看公告、查看蔬菜订单、申请蔬菜退换货等。
图3-8 用户用例图
第四章系统设计目前,市场上有各种各样的软件系统。从系统的分类来看,主要的应用范围往往是办公系统、娱乐系统、社交系统,然后下面还有很多更细的分支。系统。很多系统已经通过了市场的考验,针对不同的业务场景,开始出现了各种业务模块化、程序员减少编码的设计方法。到目前为止,在设计系统时,基本上可以根据业务模型在网上找到类似的模板,然后分析具体的业务,然后实现具体的功能。流行的就是最好的,毕竟符合市场主流。这意味着它绝对符合正常的操作流程。 ## 4.1 功能结构设计本系统主要以数据的添加、修改、删除等操作为主。用户可以通过预先设置的登录功能进入指定的操作区域。这里,用户设计的功能被结构化地显示。
管理员功能结构图绘制结果如图4-1所示。管理员登录本系统的功能包括管理员工、经理、用户、蔬菜、公告等信息。
图4-1 管理员功能结构图
绘制管理者功能结构图的结果如图4-2所示。管理人员登录本系统的功能包括查看蔬菜退换货信息、管理蔬菜订单、查询员工、查询用户、管理蔬菜信息等。
图4-2 Manager功能结构图
员工职能结构图绘制结果如图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 数据库物理设计本系统的数据通过各种二维表记录并保存在数据库中。在数据库中设计这样的二维表也很重要。内容,因为它影响数据的存储效率。在设计二维表,即关系模型之前,需要充分了解二维表的一些常见概念。
关系:具体的数据表代表一种关系,关系的名称与数据表的名称一致;
Tuple:数据表中,每一行显示的数据代表一个元组;
属性:数据表中,每一列所代表的数据代表属性;
关键字:为了将该数据表与其他数据表区分开来,需要在每个表中设置主键;
通过上一节的内容,你可以知道数据库中的每个实体,并通过一定的方式将这些实体所代表的内容转换到数据表中。一般来说,每个实体都会对应一个特定的数据表,该数据表是在本系统的数据库中指定的。只有创建命名数据库才能创建和设计数据表。同城蔬菜配送管理系统数据表设计结果如下:
表4-1 送货地址表
场地
评论
类型
无效的
id(主键)
主键
整数(20)
不
yonghu_id
创建用户
整数(20)
不
地址名称
收货人
varchar(200)
不
地址_电话
电话
varchar(200)
不
地址_dizhi
地址
varchar(200)
不
isdefault_types
是否默认地址
整数(11)
不
插入时间
添加时间
时间戳
不
更新时间
修改时间
时间戳
不
创建时间
创建时间
时间戳
不
表4-2 公告形式
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
工高名称
公告名称
varchar(200)
是的
公高_照片
公告照片
varchar(255)
是的
工高类型
公告类型
整数(11)
不
插入时间
公告发布时间
时间戳
是的
工高内容
公告详情
文本
是的
创建时间
创建时间
时间戳
是的
表4-3 员工表
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
用户名
帐户
varchar(200)
是的
密码
密码
varchar(200)
是的
Yuangong_uuid_number
员工人数
varchar(200)
是的
元工名
员工姓名
varchar(200)
是的
元工电话
员工手机号码
varchar(200)
是的
元工编号
员工身份证号码
varchar(200)
是的
元工_照片
员工头像
varchar(200)
是的
性别类型
性别
整数(11)
是的
元工邮箱
电子邮件
varchar(200)
是的
创建时间
创建时间
时间戳
是的
表4-4 管理员表
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
用户名
帐户
varchar(200)
是的
密码
密码
varchar(200)
是的
jingli_uuid_number
经理编号
varchar(200)
是的
晶丽名称
经理姓名
varchar(200)
是的
景丽电话
经理手机号码
varchar(200)
是的
jingli_id_number
经理身份证号码
varchar(200)
是的
景丽_照片
经理头像
varchar(200)
是的
性别类型
性别
整数(11)
是的
晶丽_邮箱
电子邮件
varchar(200)
是的
创建时间
创建时间
时间戳
是的
表4-5 购物车表
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
yonghu_id
用户
整数(11)
是的
数菜id
蔬菜
整数(11)
是的
购买编号
购买数量
整数(11)
是的
创建时间
添加时间
时间戳
是的
更新时间
更新时间
时间戳
是的
插入时间
创建时间
时间戳
是的
表4-6 蔬菜餐桌
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
术菜名
蔬菜名称
varchar(200)
是的
shucai_uuid_number
蔬菜编号
varchar(200)
是的
数菜_照片
蔬菜照片
varchar(200)
是的
术材类型
蔬菜类
整数(11)
是的
shucai_kucun_number
蔬菜高汤
整数(11)
是的
数菜价格
购买商品即可赚取积分
整数(11)
是的
蜀菜旧钱
蔬菜原价
小数(10,2)
是的
蜀财新钱
现价
小数(10,2)
是的
数菜_clicknum
蔬菜热量
整数(11)
是的
数菜内容
蔬菜详细介绍
文本
是的
上下类型
货架上有吗?
整数(11)
是的
数菜_删除
墓碑
整数(11)
是的
创建时间
创建时间
时间戳
是的
表4-7 用户表
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
用户名
帐户
varchar(200)
是的
密码
密码
varchar(200)
是的
yonghu_name
用户名
varchar(200)
是的
yonghu_phone
用户手机号码
varchar(200)
是的
yonghu_id_number
用户ID号
varchar(200)
是的
永湖_照片
用户头像
varchar(200)
是的
性别类型
性别
整数(11)
是的
勇虎邮箱
电子邮件
varchar(200)
是的
新钱
平衡
小数(10,2)
是的
yonghu_sum_jifen
总分
小数(10,2)
是的
yonghu_new_jifen
当前积分
小数(10,2)
是的
汇源灯集_types
会员级别
整数(11)
是的
创建时间
创建时间
时间戳
是的
表4-8 蔬菜收集表
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
数菜id
蔬菜
整数(11)
是的
yonghu_id
用户
整数(11)
是的
shucai_collection_types
类型
整数(11)
是的
插入时间
领取时间
时间戳
是的
创建时间
创建时间
时间戳
是的
表4-9 蔬菜订单表
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
shucai_order_uuid_number
订单号
varchar(200)
是的
地址ID
收件地址
整数(11)
是的
数菜id
蔬菜
整数(11)
是的
yonghu_id
用户
整数(11)
是的
购买数量
购买数量
整数(11)
是的
shucai_order_true_price
实际支付的价格
小数(10,2)
是的
shucai_order_courier_name
快递公司
varchar(200)
是的
shucai_order_courier_number
订单快递单号
varchar(200)
是的
蜀菜订单类型
订单类型
整数(11)
是的
shucai_order_ payment_types
支付方式
整数(11)
是的
插入时间
订单创建时间
时间戳
是的
创建时间
创建时间
时间戳
是的
表4-10 蔬菜退换货表
场地
评论
类型
无效的
id(主键)
主键
整数(11)
不
shucai_tuihuanhuo_uuid_number
退换货号码
瓦尔赫
ar(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\”)
@Transactional
public 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系统设计,毕设辅导