在实际的利用效果中,网上奶茶店系统的意义如下:
第一点:网上奶茶店系统的涌现,便是为了提高事情职员的效率,能够在规定韶光完成事情任务。
第二点:操作页面符合人体工程美学,符合日常人为操作习气,利用友好。

第三点:差异于传统用纸张记录,提高了信息化水平。
第四点:在信息处理方面,极大的降落了人工处理本钱。 ## 1.3 研究内容 本文对系统的描述过程将按照绪论,系统开拓技能,剖析,设计,实现,测试等环节进行展开先容。
绪论:本节内容紧张展示研究该系统的背景和意义。
系统开拓技能:本节内容紧张展示该系统开拓中须要利用的技能和搭建的开拓环境。
系统剖析:本节内容紧张便是剖析系统,包括性能,功能上的数据剖析,也包括可行性剖析等内容。
系统设计:本节内容紧张便是根据系统剖析的结果进行设计,紧张包括功能和数据库的设计。
系统实现:本节内容紧张便是通过程序编码对系统的功能进行实现,同时也对须要先容的功能进行界面运行效果的展示。
系统测试:本节内容紧张便是对系统的功能实现部分进行检测,创造系统的缺点并及时纠正,让系统能够担保运行无误。 # 2 系统开拓技能 对系统的开拓须要做好准备事情,个中安装开拓的工具以及学习开拓中须要利用的技能都是须要提提高行的,本节内容就对开拓中利用的工具还有技能进行阐述。 ## 2.1 MySQL数据库 本设计用到的数据库便是MySQL数据库,之以是用到这个数据库的缘故原由很多。首先,从知足功能需求上面来讲,MySQL是符合的;其次,从学习程度来讲,MySQL比较其他数据库不管是从安装还是利用上面来讲,都比较大略,最主要的是学习起来相称便捷,比较随意马虎入手;再次,MySQL数据库对电脑哀求不高,不管是什么样的电脑都可以安装MySQL数据库,并且并不会对电脑性能造成过多的影响。以是,就平常通俗俗通的电脑就可以作为开拓用的电脑,不须要进行额外的电脑升级。虽然自从MySQL数据库被Oracle数据库收购后,有了一些闭源的风险,但是利用者还是很多,MySQL数据库目前的开拓职员已经超过五百人了,对数据库开拓者来讲已经是一个很大的开拓团队了。MySQL在利用上面来讲,普通的增编削查操作已经可以知足大部分业务需求,像一些数据导出导入,以及一些函数,都可以知足一些不同的需求,最主要的是MySQL数据库可以创建索引,可以大大的提高数据的查询效率,当然,物极必反,如果由于索引好用而滥用,索引弄得比数据库表还要多,这样会造成MySQL数据库更新表数据时候的运行效率。总而言之,MySQL数据库在本次设计的利用上,是完备符合利用哀求的。 ## 2.2 IDEA简介 IDEA的出身在Java集成开拓工具行业正所谓平地起雷,瞬间震撼了全体Java开拓行业。真的是每个人用过的都说好。IDEA之以是比较于其他比如MyEclipse或者Eclipse之类的Java开拓工具来讲比较好,缘故原由首先在于设计方面。IDEA采取了所谓的人体工程学设计事理,让利用IDEA的职员用了就忘却不了。软件打开首先要设置主题,可以选择常规的白色或者暗色系列,永劫光的白色或者永劫光的暗色会让开发职员的眼睛疲倦加重,首先从这个细节就让程序开拓职员备受青睐,让程序员看着舒畅;然后再对一些常用性插件进行归类,让程序的开拓看重于提升生产效率,而不是一味的让开发者找各种插件,有时候插件之间的版本还会存在不兼容,IDEA就把兼容的插件双手呈现,如此知心的IDEA怎么能让人不喜好。以是选择IDEA用来开拓本项目就天经地义的了。 ## 2.3 SSM框架 最近几年盛行的SSM框架是之前的SSH框架的一种替代品,取代了原有的SSH框架的那种臃肿的配置,以及各种Bug,并且在开拓模式以及运行效率上面来讲,都是有了很大的提高。Spring是掌握层,Spring MVC是视图层,MyBatis是持久层。
在事理上面,SSM框架继续了SSH框架的那种框架以及代码分层设计,首先理解起来比较符合人类的正常理解,视图是卖力视图的掌握和显示,掌握层可以吸收和通报视图提交过来的信息,也可以吸收和通报持久层的数据信息,而持久层只须要对数据工具进行自动化的转换,给掌握层的数据是Java工具,到数据库则转换为相应的数据类型。
利用框架可以有效的办理各种代码写作过程中数据类型的转换问题,把数据类型转换让框架自己转换,写作很方便。 ## 2.4 Vue框架 Vue框架的开拓者是一个中国人,差异于其他框架的最核心的观点便是渐进式框架,Vue的涌现,让网页前真个开拓变成了一种纯前端职业,不须要在考虑后台数据类型以及业务逻辑,只须要进行数据绑定即可,大大的减少了前端开拓工程师的学习难度。Vue是当前世界上最火的一种前段框架,学习本钱比较低,只须要熟习最基本的网页知识就可以理解干系知识,并且有很好的免费教程进行学习,有各个国家措辞的教程,尤其是由于是中国人开拓的框架,让中国的高等程序开拓职员做了汉语教程。Vue框架发展之初便是高于IE8版本的,以是说只假如当前的主流浏览器都支持Vue框架,如果是很旧的那种电脑是不支持的,必须安装支持HTML5的浏览器才可以访问用Vue发布的站点。 # 3 系统剖析 对付网上奶茶店系统开拓设计到的流程有,剖析系统的功能,设计系统的构造,设计数据库,编码以及测试,个中,在系统剖析中,所做的事情包括功能的确定,性能的剖析等。 ## 3.1 可行性研究 网上奶茶店系统开拓实现剖析须要从不同的角度来进行剖析可行性,比如从韶光角度,经济角度,乃至操作角度。从不同的角度剖析可行性会让网上奶茶店系统开拓详细化,进而达到辩证开拓的精确性。 ### 3.1.1 经济可行性 从经济方面剖析是第一要素,没有经济的支持,任何项目都如水中捞月,无法实现。实现网上奶茶店系统,开拓过程不须要额外的经济条件,用本人现有的打算机就可以实现,这方面不须要额外的支出。 ### 3.1.2 韶光可行性 网上奶茶店系统设计紧张作为毕业设计,在题目确定之后,答辩之前利用的项目,对不同的开拓进度上面都有韶光的哀求,总不至于答辩完成后才能实现功能,这个肯定弗成,以是从韶光上来剖析项目的事情量,创造是可行的,符合正常开拓韶光。 ### 3.1.3 操作可行性 操作必须符合正凡人的思维模式,市情上有很多符合哀求的程序正在利用中,可以借鉴其他程序的操作流程,变成符合本设计的操作流程,在操作上面进行无缝衔接,让利用者操作过程中不会感到迷茫。
从上面的角度来剖析,后续事情可以连续进展。 ## 3.2 系统性能剖析 性能剖析是软件开拓过程中必不可少的一个环节,紧张是为了降落软件在利用的过程中的容错率。常日来讲,剖析软件系统的性能一样平常从以下几个方面进行剖析。 ### 3.2.1 系统的安全性 系统开拓出来便是让正常利用的,那么在如今的互联网时期,首先考虑的便是安全性的问题。如果系统的安全性不足,那么利用代价就会降落。如果涌现利用过程中丢失数据,那么用户就不再相信,以是系统的安全性是第一要位,只有安全性存在了,才能考虑利用的问题,总不至于本日用户注册,来日诰日用户账号透露,这些都是不友好的。以是账号一样平常在数据库里存储会通过MD5进行加密,这样关键数据加密可以担保系统的安全性。 ### 3.2.2 系统的易用性 安全性剖析处理完毕,才考虑易用性。一个软件设计得符合操作规范,符合正凡人类的理解逻辑,那么在利用上面就会很舒畅,如果违背了这条原则,安全性再高的软件也是设计失落败的,毕竟软件开拓出来便是让人利用的,这一点尤为主要。 ### 3.2.3 系统的健壮性 系统设计易用不代表没有规则,那么系统设计利用方面必须健壮,必须符合软件处理逻辑。比如设计一个价格类的输入框,用户须要输入价格,那么可以设定输入框最多两位小数的纯数字输入,如果用户欠妥心输入了其他字符,那么就会友好的提示让用户修正精确,只有输入符合规范的数据,才能进行提交,并且存储到数据库里。系统的健壮性便是这样,越是规范,越是健壮,有助于用户理解,还有助于程序利用。 ## 3.3 系统流程剖析 系统设计不是胡乱的设计,必须符合软件设计思想,详细的流程参考下图。系统设计的前期便是做各种剖析,功能的设计,数据库的设计等,等统统都设计好了,逻辑上没有问题,符合设计流程和设计规范,才可以连续编码环节,编码只是实现设计的一个环节而已。
图3.1系统开拓流程图
用户是统统运用的根本,只要牵扯到用户,那么肯定须要用户进行注册,只有这样才能让注册的用户进行利用。如果用户没有注册,只能算是游客,那么只能访问一些大众用户可以浏览的信息,如果须要用户操作的部分是不许可访问的,这样能极大的担保用户的权利。用户注册流程用下面的图来表示,紧张是先判断用户名,只有用户名能用了才可以进行后面的信息注册。
图3.2 注册流程图
当须要用户登录的时候,肯定是要验证的,只有验证通过的用户才可以进行下一步操作,用户登录成功代表着用户模块的功能对登任命户进行了开放。流程便是如下面的图所示。
图3.3 登录流程图 ## 3.4 系统功能剖析 在对设计的总体哀求理解了之后,就要把哀求给详细化,也便是功能化,要只管即便的把每个功能模块和模块之前的关系理清楚,必须符合正凡人的行为逻辑才可以,并且只管即便研究同类型的项目,这样能避免走弯路,终极才能得到设计的详细功能。
网上奶茶店系统把操作该系统的用户群分为两类,即管理员,用户。
管理员对付网上奶茶店系统操作的功能包括管理奶茶信息,回答奶茶评价信息,管理奶茶订单信息,管理会员等级信息等。其用例图如图3.4所示:
图3.4 管理员用例图
用户对付网上奶茶店系统操作的功能包括查看奶茶信息,购买奶茶,查看网站先容和公司先容,管理购物车,对奶茶订单进行查看等。其用例图如图3.5所示:
图3.5 用户用例图
4 系统设计系统在设计的过程中,一定要遵照一定的原则才可以,胡乱设计是不可取的。首先用户在利用过程中,能够直不雅观感想熏染到功能操作的便利性,符合正常思维逻辑的操作,这才是系统好用的一个开端,给利用者第一印象便是这个别系设计的相称不错。 ## 4.1 系统设计原则 系统遵照设计原则进行开拓,会有很多可以预见到的好处,只要遵照了设计原则,那么开拓出来的系统一定是有质量担保的。
首先第一条原则便是安全性原则:程序必须设定角色管理,不同的角色有不同的功能模块,不同的角色登录都须要输入相对应的账号和密码,否则不许可进行操作相对应的权限。每个用户登录只能修正自己的密码,不须要对别的账号进行密码或者其他资料的修正,否则就违背了安全性原则的设定。
其次第二条原则便是易用性原则:符合安全性只是功能的符合,不代表操作就符合,以是要设定易用性原则。易用性原则便是规定程序符合操作流程,正凡人的思维定向为根本,在不违背程序运行逻辑定义的情形下,必须利用大略,操作规范,让每个用户利用起来都能看到页面,就能感知功能模块的浸染,短韶光的就能利用程序,达到易用效果。
再次第三条原则便是实用性原则:实用性代表着花里胡哨的功能必须抛弃,只管即便符合数据处理的简洁性,不仅须要这样进行设定,还须要有预知性,系统后期可能会涌现的功能模块只管即便要解耦,与程序设定要模块化表示,这样才能达到扩展性。
第四条原则便是准确性原则:准确性原则的唯一定义便是准确,包含数据输入格式的准确,数据处理的准确,以及数据存储的准确。程序里面关于数据准确才有存在的意义,如果一堆不相关的数据存在是没有任何用途的,乃至会产生各种问题,以是必须要担保数据的准确性。
第五条原则是易掩护原则:易掩护代表着程序运行必须是可控的状态,如果不可控涌现各种问题,那么所有的事情都是空谈。程序开拓中对付各种程序剖断非常,必须有统一的处理模式,非常是程序开拓中不可避免的,但是可以对涌现的非常进行抛出,有助于程序非常处理的复盘,只要每个非常都能定位准确,那么代表程序设计是趋于完美的,掩护起来会更加的方便,只要有助于程序掩护的都必须给予支持。 ## 4.2 功能模块设计 对管理员详细功能的设计结果将以图4.1所示的管理员功能构造图来进行表示。管理员对付网上奶茶店系统操作的功能包括管理奶茶信息,回答奶茶评价信息,管理奶茶订单信息,管理会员等级信息等。
图4.1 管理员功能构造图
对用户详细功能的设计结果将以图4.2所示的用户功能构造图来进行表示。用户对付网上奶茶店系统操作的功能包括查看奶茶信息,购买奶茶,查看网站先容和公司先容,管理购物车,对奶茶订单进行查看等。
图4.2 用户功能构造图 ## 4.3 数据库设计 用户通过系统的功能操作来进行数据交互,包括数据的添加,数据的更新,数据的删除,数据的查询等基本功能操作,表面上虽然是操作系统界面供应的功能,但是实际上系统的这些数据是在数据库当中进行访问与操作的。目前市场上可供选择的存储数据的数据库有很多,除了大略版的Access之外,还有SQL Server,DB2,Informix,MySQL等关系型数据库可供选择,由于关系型数据库具有固定的表构造,以及对数据同等性哀求比较强,以是比较没有固定表构造以及具有灵巧的数据格式的非关系型数据库而言,在程序配套数据库的选择中,关系型数据库的利用率更高。本系统选择MySQL来存放数据,其干系理论以及技能在经由了很永劫光的发展之后,变得非常成熟,各大网络平台都公开分享其开拓源码,而且其对打算机的配置哀求很低,不须要过多内存进行安装,很符合本系统对付数据库的选择要求。 ### 4.3.1 数据库E-R图 本节须要对系统中存放在数据库中的数据进行充分剖析,对数据的实体,实体特色,联系等进行确定,然后通过观点模型的表示方法即E-R图进行表达,在E-R图绘制工具中,选择椭圆,菱形框,矩形等形状表达实体属性,实体间联系,实体这些信息,利用实线段将这些形状进行连接即可。初步完成E-R图之后,须要进行检讨,及时进行有误数据的变动,删除实体间存在的冗余联系,删除E-R图中冗余的数据,终极要展示一个内容准确的E-R图。
(1)奶茶包括的属性有奶茶照片,热度,奶茶先容等。其属性图如下。
图4.4 奶茶实体属性图
(2)管理员包括的属性有密码,角色,用户名等。其属性图如下。
图4.5 管理员实体属性图
(3)奶茶订单包括的属性有收货地址,支付类型,实付价格等。其属性图如下。
图4.6 奶茶订单实体属性图
(4)用户包括的属性有用户姓名,总积分,会员等级等。其属性图如下。
图4.7 用户实体属性图
(5)设计的各实体间关系E-R图如下。
图4.8 实体间关系E-R图 ### 4.3.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)
否
yonghu_id
所属用户
int(11)
是
naicha_id
奶茶
int(11)
是
buy_number
购买数量
int(11)
是
create_time
添加韶光
timestamp
是
update_time
更新韶光
timestamp
是
insert_time
创建韶光
timestamp
是
表4.3 奶茶表
字段
注释
类型
空
id (主键)
主键
int(11)
否
naicha_uuid_number
奶茶编号
varchar(200)
是
naicha_name
奶茶名称
varchar(200)
是
naicha_photo
奶茶照片
varchar(200)
是
naicha_tedian
特点
varchar(200)
是
naicha_types
奶茶类型
int(11)
是
naicha_kucun_number
奶茶库存
int(11)
是
naicha_price
购买得到积分
int(11)
是
naicha_old_money
奶茶原价
decimal(10,2)
是
naicha_new_money
现价
decimal(10,2)
是
naicha_clicknum
热度
int(11)
是
naicha_content
奶茶先容
text
是
shangxia_types
是否上架
int(11)
是
naicha_delete
逻辑删除
int(11)
是
create_time
创建韶光
timestamp
是
表4.4 奶茶收藏表
字段
注释
类型
空
id (主键)
主键
int(11)
否
naicha_id
奶茶
int(11)
是
yonghu_id
用户
int(11)
是
naicha_collection_types
类型
int(11)
是
insert_time
收藏韶光
timestamp
是
create_time
创建韶光
timestamp
是
表4.5 奶茶评价表
字段
注释
类型
空
id (主键)
主键
int(11)
否
naicha_id
奶茶
int(11)
是
yonghu_id
用户
int(11)
是
naicha_commentback_text
评价内容
text
是
insert_time
评价韶光
timestamp
是
reply_text
回答内容
text
是
update_time
回答韶光
timestamp
是
create_time
创建韶光
timestamp
是
表4.6 奶茶订单表
字段
注释
类型
空
id (主键)
主键
int(11)
否
naicha_order_uuid_number
订单号
varchar(200)
是
address_id
收货地址
int(11)
是
naicha_id
奶茶
int(11)
是
yonghu_id
用户
int(11)
是
buy_number
购买数量
int(11)
是
naicha_order_true_price
实付价格
decimal(10,2)
是
naicha_order_courier_name
配送人姓名
varchar(200)
是
naicha_order_courier_number
配送人联系办法
varchar(200)
是
naicha_order_types
订单类型
int(11)
是
naicha_order_payment_types
支付类型
int(11)
是
insert_time
订单创建韶光
timestamp
是
create_time
创建韶光
timestamp
是
表4.7 单页数据表
字段
注释
类型
空
id (主键)
主键
int(11)
否
single_seach_name
名字
varchar(200)
是
single_seach_types
数据类型
int(11)
是
single_seach_content
内容
text
是
create_time
创建韶光
timestamp
是
表4.8 管理员表
字段
注释
类型
空
id (主键)
主键
bigint(20)
否
username
用户名
varchar(100)
否
password
密码
varchar(100)
否
role
角色
varchar(100)
是
addtime
新增韶光
timestamp
否
表4.9 用户表
字段
注释
类型
空
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
是
打开新的 phpMyAdmin 窗口
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.1.4 用户管理 该功能紧张用于实现对用户基本信息的管理,用户管理界面的运行效果见图5.4。在此界面,管理员对用户账号重置密码,变动包括用户余额在内的用户资料,删除须要删除的用户等。
图5.4 用户管理界面 ### 5.1.5 会员等级管理 该功能紧张用于实现对会员等级基本信息的管理,会员等级管理界面的运行效果见图5.5。在此界面,管理员增编削查会员等级信息,不同会员等级享受的折扣不一样,等级越高,购买奶茶越优惠。
图5.5 会员等级管理界面 ## 5.2 用户功能实现 ### 5.2.1 奶茶信息 奶茶信息界面的运行效果见图5.6。在此界面,用户收藏本界面的奶茶,对奶茶的干系先容进行理解,可以查看本界面右侧区域系统推举的奶茶信息,可以在本界面实现对奶茶的购买。
图5.6 奶茶信息界面 ### 5.2.2 购物车 购物车界面的运行效果见图5.7。在此界面,用户可以把须要的奶茶都集中保存在购物车里面,然后统一支付结算,这样可以节省韶光,非常方便。
图5.7 购物车界面 ### 5.2.3 确认下单 确认下单界面的运行效果见图5.8。在此界面,用户选择适宜的收货地址,没有得当的地址也不用担心,可以先添加收货地址,再选择新增的收货地址即可,末了确认购买的奶茶,确认收费金额信息,末了下单结算。
图5.8 确认下单界面 ### 5.2.4 我的奶茶订单 我的奶茶订单界面的运行效果见图5.9。在此界面,用户对已经支付的奶茶订单信息进行检讨,创造误购的奶茶可以及时申请退款。
图5.9 我的奶茶订单界面
系统StringUtil.javapackage com.utils;public class StringUtil { public static boolean isEmpty(String s){ if(s==null || s.equals("") || s.equals("null")){ return true; } return false; } public static boolean isNotEmpty(String s){ return !StringUtil.isEmpty(s); }}
FileController.java
package com.controller;import java.io.File;import java.io.IOException;import java.util.Date;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.io.FileUtils;import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import com.annotation.IgnoreAuth;import com.baomidou.mybatisplus.mapper.EntityWrapper;import com.entity.ConfigEntity;import com.entity.EIException;import com.service.ConfigService;import com.utils.R;/ 上传文件映射表 /@RestController@RequestMapping("file")@SuppressWarnings({"unchecked","rawtypes"})public class FileController{ @Autowired private ConfigService configService; / 上传文件 / @RequestMapping("/upload") public R upload(@RequestParam("file") MultipartFile file, String type,HttpServletRequest request) throws Exception { if (file.isEmpty()) { throw new EIException("上传文件不能为空"); } String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1); String fileName = new Date().getTime()+"."+fileExt; File dest = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName); file.transferTo(dest); if(StringUtils.isNotBlank(type) && type.equals("1")) { ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile")); if(configEntity==null) { configEntity = new ConfigEntity(); configEntity.setName("faceFile"); configEntity.setValue(fileName); } else { configEntity.setValue(fileName); } configService.insertOrUpdate(configEntity); } return R.ok().put("file", fileName); } / 下载文件 / @IgnoreAuth @RequestMapping("/download") public void download(@RequestParam String fileName, HttpServletRequest request, HttpServletResponse response) { try { File file = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName); if (file.exists()) { response.reset(); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName+"\""); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setContentType("application/octet-stream; charset=UTF-8"); IOUtils.write(FileUtils.readFileToByteArray(file), response.getOutputStream()); } } catch (IOException e) { e.printStackTrace(); } } }
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; }}
utils.js
import storage from './storage';import menu from './menu';/ 是否有权限 @param {} key /export function isAuth(tableName,key) { let role = storage.get("role"); if(!role){ role = '管理员'; } let menus = menu.list(); for(let i=0;i<menus.length;i++){ if(menus[i].roleName==role){ for(let j=0;j<menus[i].backMenu.length;j++){ for(let k=0;k<menus[i].backMenu[j].child.length;k++){ if(tableName==menus[i].backMenu[j].child[k].tableName){ let buttons = menus[i].backMenu[j].child[k].buttons.join(','); return buttons.indexOf(key) !== -1 || false } } } } } // for(let i=0;i<menus.length;i++){ // if(menus[i].roleName==role){ // for(let j=0;j<menus[i].backMenu.length;j++){ // if(menus[i].backMenu[j].tableName==tableName){ // let buttons = menus[i].backMenu[j].child[0].buttons.join(','); // return buttons.indexOf(key) !== -1 || false // } // } // } // } return false;}/ 获取当前韶光(yyyy-MM-dd hh:mm:ss) /export function getCurDateTime() { let currentTime = new Date(), year = currentTime.getFullYear(), month = currentTime.getMonth() + 1 < 10 ? '0' + (currentTime.getMonth() + 1) : currentTime.getMonth() + 1, day = currentTime.getDate() < 10 ? '0' + currentTime.getDate() : currentTime.getDate(), hour = currentTime.getHours(), minute = currentTime.getMinutes(), second = currentTime.getSeconds(); return year + "-" + month + "-" + day + " " +hour +":" +minute+":"+second;}/ 获取当前日期(yyyy-MM-dd) /export function getCurDate() { let currentTime = new Date(), year = currentTime.getFullYear(), month = currentTime.getMonth() + 1 < 10 ? '0' + (currentTime.getMonth() + 1) : currentTime.getMonth() + 1, day = currentTime.getDate() < 10 ? '0' + currentTime.getDate() : currentTime.getDate(); return year + "-" + month + "-" + day;}
声明
本博客适用于广泛的学术和教诲用场,包括但不限于个人学习、开拓设计,产品设计。仅供学习参考,旨在为读者供应深入理解和学术研究的材料。
java系统设计,毕设辅导