如今,互联网险些遍布于天下的各个角落,人工智能、大数据霸占的越来越主要的社会地位,比如疫情期间,通过大数据技能进行筛查,确定哪些职员无打仗史,哪些职员须要重点不雅观察,由此可以在极短的韶光内,以最快的速率对疫情进行防控。在这个大背景环境的推动下,本人通过学习Java措辞、MySQL数据库、SSM框架等干系的打算机技能,打好坚实的技能根本,方便后期对系统进行研发。而后再通过对系统进行需求剖析、可行性剖析、总体功能设计等事情准备,确定系统的总体功能需求,方便接下来详细地系统功能模块进行设计和实现,末了成功的研发了一款基于SSM的明嘉新材料公司仓库管理系统。本系统改进了传统的管理模式,将原来的手工记录和管理信息,改进为利用打算机存储和管理信息记录,极大地方便了事情职员对干系数据进行处理,为企业节约了不少的员工用度和管理开销,并且能够在较短的韶光内响运用户的需求,这种便捷的操作,对付用户来说可以节省了不少韶光和精力,也省去了不少的麻烦,极大了方便了用户。 ### 1.1.2研究意义 传统的仓库信息管理模式,紧张因此人力为主进行管理和掌握,由事情职员卖力登记用户信息,再通过对照之前的信息记录,确定是否给用户供应干系的利用需求,以及如何供应能让用户满意的利用需求。这种管理模式已经适应不了时期的变革了,正在不断地走下坡路,并且逐步被信息化管理模式所取代。所谓的信息化管理模式,是现在主流的一种管理模式,其通过与打算机技能相结合的办法,对行业的全体事情模式和做事流程进行改进和完善。其紧张通过利用打算机等设备,将事情做事流程电子化,并且进行存储记录,用以提高行业整体的做事水平。结合利用打算机技能,本人研发出一款基于SSM的明嘉新材料公司仓库管理系统,采取电子化的办法对数据信息进行存储,便于事情职员对干系信息进行记录和管理,有利于提高企业的事情运营效率以及事情职员的管理速率,以此更好的知足用户的干系需求,终极达到提升用户的利用感想熏染的目的,由此可见设计和实现本系统具有主要的意义和代价。 ## 1.2国内外研究现状 ### 1.2.1国外研究现状 美国是最先发展打算机技能的浩瀚国家之一,早在上个世纪,美国就快速的将打算机技能发展起来,并且将其利用在军事、医院、学校、社会做事等场所。日本、德国等国家紧随其后,不断地发展和完善打算机技能,侧重将医疗、社会做事等领域与打算机技能相结合[2]。而后随着社会的发展与进步,打算机技能逐渐趋于成熟。许多发达国家在探索将打算机技能运用于各行各业中时,从另一个角度来看,也在不断地推进企业的信息化管理进程,使得企业管理也变得更加网络化、信息化了。有许多专家表示,可以结合利用图像处理软件、人工智能技能等干系工具,深度地剖析仓库管理系统,紧张从简化运行操作,加设功能模块,美化系统界面,保障数据安全等方面,更深层次地提升和优化系统,并且尽可能地在空想状态下做到实时的信息共享[3]。 ### 1.2.2海内研究现状 海内的打算机技能的发展虽然晚于国外,尤其是美国、英国、德国等发达国家。但是我国的打算机技能发展势头非常迅猛,近些年,也逐渐走向成熟和完善的阶段。现在,选择网上购物已经成为人们日常生活的一种常态趋势,当然这也离不开对付天猫、支付宝、微信等运用软件的利用[4]。许多企业结合利用了云打算、人工智能等前辈的打算机技能,自主研发了行业干系的信息管理系统,使得打算机技能越来越成熟,系统功能越来越完备。结合打算机技能,采取主流的B/S开拓构造模式开拓一款基于SSM的明嘉新材料公司仓库管理系统。由此,本系统能够支持事情职员随时随地的通过利用浏览器进行访问操作,支持随时随地对干系的仓库信息进行管理,便于及时为用户供应一定的功能做事。并且所设计的系统基本上能够符合用户的客不雅观利用需求,有利于充分折衷企业的人力、财力、物力等资源,不断提高企业管理质量和水平。 ## 1.3研究内容与方法 ### 1.3.1研究内容 本文首先先容了仓库管理系统的研究背景与意义,其次先容了系统的总体功能设计,接着将总体功能设计拆分成了各个功能子模块,然后对每一个小的功能子模块进行了详细设计,末了先容了系统的功能模块展示结果和测试结果。系统紧张分为管理员角色和用户角色,详细的功能设计包括注册登录管理、用户信息管理、仓库信息管理、材料信息管理等模块。注册登录管理功能是新用户在利用系统前,须要通过注册步骤,登记详细的信息资料,而后再通过输入精确的账号和密码,成功登录系统后,即可通过一系列的操作来知足自己的干系需求。用户信息管理功能是管理干系的用户信息资料,管理职员根据现实情形的须要,选择性的对用户信息记录进行更新处理。仓库信息管理是管理干系的仓库信息记录,保存仓库的详情信息,方便及时响运用户的做事要求。材料信息管理是管理干系的材料信息记录,方便干系职员及时查看材料信息,如果碰着非常的材料信息,可以及时对其进行处理,在较短的韶光内办理问题,提高用户的利用体验。 ### 1.3.2研究方法 本系统采取B/S构造,在idea开拓平台上,通过利用Java措辞设计系统干系的功能模块,MySQL数据库管理系统干系的数据信息,并且对其进行必要的管理和掌握。系统设计的最关键的环节,则是须要通过SSM框架设计系统功能架构,再通过Tomcat做事器将系统发布到浏览器上,以便干系用户的操作和利用。本系统的设计和实现促进了企业的信息化培植,有利于简化干系职员事情流程,提高事情效率,提升事情幸福感。 ## 1.4论文的组织构造 基于SSM的明嘉新材料公司仓库管理系统的设计与实现大致可以被分成七个章节,每一个章节的详细内容如下:
第一章为绪论,本章紧张先容了系统的研究现状、背景依据等内容。根据本章所先容的研究现状、研究背景等内容,理解当前干系的系统软件产品的实际研究情形,再通过先容干系的研究内容以及研究方法等内容,总体概括系统的全体开拓流程和实现步骤,为系统供应可靠的理论依据和技能支持。
第二章为干系技能先容,本章紧张先容了开拓所利用的干系技能。本系统紧张利用的开拓技能包括Java措辞、SSM框架、MySQL数据库等,并且所利用的开拓模式为B/S构造。个中,Java措辞具有跨平台性,可移植性高,可以支持在不同的浏览器上运行本系统,MySQL数据库占用内存少,实行速率快,对付中小型系统的数据管理是非常好的选择。
第三章为系统剖析,本章紧张先容了需求剖析、可行性剖析等内容。根据需求剖析,确认利用者对系统的实际利用需求,再通过对系统进行可行性剖析,重点剖析系统研发的实际意义和利用代价,系统性能的稳定性和功能操作的便捷性,以及成功投入市场的可能性。
第四章为系统设计,本章紧张先容了系统的总体功能设计、数据库设计等内容。通过先容系统的总体功能设计,总体方案系统的功能模块,为实现系统供应参考依据和设计思路,做好功能设计的准备事情。再通过先容数据库设计,设计干系的数据二维表格存放和管理与系统有关的数据信息,便于干系职员管理与系统有关的数据信息,掩护和更新数据信息的安全。
第五章为系统实现,系统实现阶段紧张先容了用户信息管理、仓库信息管理、材料信息管理等功能模块。通过前面先容的需求剖析、总体功能设计、数据库设计等干系内容,实现系统的详细功能设计。对系统的各个功能模块进行设计和实现的过程,便是详细的系统实现过程,在全体系统开拓过程中,这一阶段是极为主要,直接关系到用户对系统的利用感想熏染。
第六章为系统测试,本章紧张先容了测试功能、结果剖析等干系内容。系统测试阶段通过采取功能测试的办法,测试所设计的系统功能模块能否正常打开并利用,在系统运行过程中是否发生非常,如运行非常、数据非常、结果非常等,并且根据测试结果,给出相应的测试总结,由此得出干系结论,解释系统是否达到预期哀求、设计目的。
第七章为总结与展望,对全文内容进行总结,并且对未来提出展望。总体来说,本系统的开拓是比较空想的,未来的事情紧张是针对付系统的功能和性能等方面,做一定的改进和完善,不断地优化系统的功能设计,美化系统的界面设计,简化系统的操作难度,使其能够知足更多用户的利用需求。 # 32
# 2干系技能先容 ## 2.1 B/S构造 就软件开拓的现状而言,目前紧张利用的系统开拓构造模式大致可以分为C/S模式和B/S模式[5]。个中,C/S模式全称为客户端/做事器模式,B/S模式全称为浏览器/做事器模式。用户在利用基于C/S模式开拓的系统时,必须下载相应的客户端,即运用程序,才能操作和利用软件系统的干系功能模块。从利用者的角度来看,由于下载和安装客户真个步骤比较繁琐,期间还须要确保下载网速的稳定性,以及安装步骤的精确性,进而增加了用户放弃利用该系统的可能性,由此可见C/S模式具有很大的局限性。
由于C/S模式适用于小范围的局域网,并且具有一定的通信效率,以是在以前系统规模很小的时期,紧张利用C/S模式对系统开拓。随着时期地发展以及社会地进步,C/S模式也越来越知足不了开拓者的设计须要,以及利用者的利用需求[6]。当下,C/S模式已经知足不了实际的系统程序设计哀求,由此,B/S模式以C/S模式为根本而被提出,并且在近些年逐渐发展成为主流的开拓构造模式。在B/S模式下开拓的系统,不再须要用户下载和安装相应的运用程序,直接通过利用浏览器,输入精确的网站地址,以访问网站的形式实现系统的干系功能操作,这一特点对C/S模式下的开拓设计做出了极大地改进,当然,利用本系统的条件是确保账号和密码是合法的。 ## 2.2 Java措辞 Java措辞是由美国sun公司提出的一种面向工具的程序设计措辞,它拥有着精良的技能体系构造。目前在市场上,很大一部分的运用系统紧张利用Java措辞进行开拓[7]。Java措辞具有大略易懂,操作方便,健壮性强等优点,开拓职员能够的在短韶光内理解和节制Java措辞,并将其利用到详细的系统开拓过程中学。针对付系统内存管理问题,Java措辞为办理这类问题,内部供应了垃圾回收机制。为了极大地简化了开拓编程的难易程度,Java措辞还将C措辞中的指针,改进成了引用,以是受到了很多开拓职员的喜好。Java措辞还具有跨平台性的特点,意味着它的可移植性非常高,这一特点有利于开拓职员更新和掩护干系代码,由它所开拓的系统可以支持在不同的浏览器中打开。由于利用Java开拓的系统兼容性较强,代码通用性较高,为了后期方便对系统进行完善和掩护,以是本人终极选择利用Java措辞开拓本系统。 ## 2.3 SSM框架 SSM框架紧张由Spring、SpringMVC、MyBatis这三个框架所集成的,是现在比较盛行的一种Java开拓框架,能够适用于大中型的运用程序的设计和搭建。Spring是前几十年前兴起的一种轻量级的、开源的Java开拓框架,利用它可以办理干系的系统工具创建和工具依赖问题,并且也可以将高耦合的系统分解为低耦合的多个功能模块,方便对系统模块进行明确的分工,对功能代码进行理解和修正,这就极大地减轻了设计职员的开拓压力[8]。SpringMVC框架是基于Spring框架而被提出的,它以MVC三层架构为核心,对Spring的干系技能进行了整合,紧张针对付Web端进行技能架构,通过对干系的要求处理进行细化处理,用来响运用户的利用要求。MyBatis框架是一种开源的Java持久层框架,它改进了手动设置参数和获取结果记录的办法,通过支持对数据库进行存储过程、高等映射等处理,使得数据库的操作更加定制化、透明化,因此降落了数据库访问的繁芜性,提高了开拓的事情效率。 ## 2.4 MySQL数据库 MySQL数据库是目前利用较多的关系型数据库。由于其具有开源免费、占用内存少、安装大略、操作便捷、利用灵巧等优点,以是常常被利用于中小型的系统开拓中[9]。MySQL数据库可以支持多线程,在同一个韶光内,能够同时相应多个用户的利用需求。MySQL数据库还自带了优化器,方便设计职员在 利用过程中,快速的查询干系的数据信息。除此之外,SQL server数据库在当下也是利用比较频繁的,它在数据安全、系统稳定等方面还是比有所保障,但是由于其收费利用、占用内存大、操作繁芜、掩护本钱高, 一样平常适用于中型及以上的系统开拓中。MySQL数据库也有着许多的运用程序接口,以供干系的编程措辞利用,编写的代码具有极高的通用性和掩护性,并且MySQL数据库能够迅速的处理上千条数据记录,在系统故发生障时,能通过日志文件快速规复。MySQL数据库与SQL server数据库比较较,综合考虑本钱开销、占存大小、代码通用、数据掩护、操作难易程度等方面,MySQL数据库霸占很大的上风,在数据库设计职员的眼中,MySQL数据库的实际利用代价极高。
3系统剖析3.1系统的需求剖析
需求剖析阶段是设计系统功能模块的总方向,可以这样来说,系统的全体的开拓流程以及设计进度,基本上都因此需求剖析为基本依据的[10]。需求剖析阶段可以确定系统的基本功能设计,以及在末了的系统验收阶段,再通过对需求剖析报告进行比拟,验证系统的功能设计是否合理,能否知足用户的基本须要,终极判断总结系统是否成功现实。本文紧张通过问卷调查的办法,来剖析仓库管理系统所须要的干系功能[11]。根据调查结果显示,系统用户紧张有两种类型,一种因此利用为紧张目的的用户角色类型,另一种因此管理为紧张目的的管理员角色类型。本系统紧张功能需求包括用户信息管理、仓库信息管理、材料信息管理等模块。个中,密码信息、用户信息、仓库信息等都是非常主要的数据记录,在系统设计的过程中,须要进行一定的加密处理,确保数据安全性,切实的保护好用户的主要信息。 ## 3.2系统的可行性剖析 ### 3.2.1经济可行性 对系统进行经济可行性剖析,也可以被称为对系统进行经济可行性研究,它是从社会的经济发展出发,通过研究全体的系统可行性,对本钱收益情形进行全面地、详细地剖析,并且根据所剖析的可行性报告,为干系的投资者供应最科学的决策理论和最优的投资方案。本系统的开拓促进了企业的信息化管理,管理职员可以直接通过在浏览器上发布仓库管理系统的网站地址,即可用户根据一定的须要,有选择的对系统干系功能进行操作。这种办法冲破了韶光和空间的限定,可以使得企业在较短的韶光内最大化地管理仓库的干系信息。并且本系统所利用的开拓技能和干系工具,大部分是开源的、免费的,以是可以节约很大一笔开拓本钱。综合上述内容剖析可知,本系统的实现在经济层面上是具备可行性的。 ### 3.2.2技能可行性 本系统是基于Java措辞而进行开拓的,由于Java措辞随意马虎学习、利用大略、可移植性高、稳定性强等特点,以是许多的开拓技能职员均喜好利用Java措辞进行系统设计,市场上很多运用程序是由Java措辞进行开拓实现的。并且Java措辞还具有跨平台的优点,这意味着所设计的系统是与平台无关的,也就解释由Java措辞开拓的系统可以支持在不同的浏览器上运行和利用。本系统利用的是MySQL数据库,相同条件下,比拟其他数据库,MySQL数据库语法大略,数据库设计职员可以尽可能快的对其学习和节制,以是一贯是中小型系统最优的数据库选择。MySQL数据库还具有占用系统内存少、功能完好、相应速率快、利用不收费等特点,能够在极短韶光内处理上千条信息记录,以是能够担保系统可以高效地运行和事情。综合上述内容剖析可知,系统的实现在技能层面上是具备可行性的。 ### 3.2.3操作可行性 如今,人们的日常生活已经离不开互联网的利用,在一定程度上,行业的信息化培植促进着社会的发展。人们通过利用手机上的运用程序,比如,通过利用电子商务系统,可以实现网上购物、在线支付等功能;通过利用国家官方网站,可以查看最新,报告个人业务;通过利用医院管理系统,可以进行网上预约登记,在线查看体检报告等操作。在这些运用的背景下,本系统利用的是B/S开拓构造模式,网站界面以人性化的设计为主,具有都雅友好、交互性好等优点,用户不须要节制一定的编程技能,直接通过对系统进行大略的功能操作,即可知足自己的利用需求。本系统还设计了一些提示信息,便于用户更好的理解系统干系功能,较快的以精确的操作办法来利用系统。综合上述内容剖析可知,系统的实现在操作层面上是具备可行性的。
4系统设计4.1系统的总体功能设计
系统的总体功能设计,是需求剖析的下一个阶段,是系统实现的上一个阶段,它是系统详细功能设计的一个大方向,也便是说系统的各种子功能模块的设计,都因此总体功能设计为目标而进行的。通过对系统进行需求剖析可知,可以大致理解系统详细所须要的干系功能。本系统紧张的功能需求包括用户信息管理、仓库信息管理、材料信息管理等模块。本系统的总体功能设计图如图4-1所示。
明嘉新材料公司仓库管理系统
管理员管理
材料信息管理
根本数据管理
仓库信息管理
用户信息管理
管理员修正
管理员新增
用户信息添加
用户信息删除
用户信息修正
仓库信息添加
仓库信息修正
仓库信息删除
材料信息添加
材料信息编削
材料信息删除
根本数据添加
根本数据修正
根本数据删除
公告信息管理
公告信息修正
公告信息删除
公告信息添加
图4-1系统总体功能设计图 ## 4.2数据库设计 ### 4.2.1观点设计 本系统利用轻量级的MySQL数据库,对系统干系的数据信息进行管理和掩护[12]。数据库设计阶段紧张可以被分为两个阶段,分别为观点设计和逻辑设计阶段。在全体的数据库设计的过程中,两个阶段起到浸染是不同的,观点设计阶段是实现根本,逻辑设计阶段终极目标。观点设计阶段紧张通过利用实体-联系图(E-R图)的办法,将现实天下中用户的干系需求抽象化为虚拟天下中的观点模型。本人通过设计E-R图,详细的对系统中的实体以及实体之间的联系进行了表达。各实体信息的E-R图如图4-2、图4-3、图4-4、图4-5、图4-6、图4-7所示,系统总体E-R图如图4-8所示。
图4-2管理员信息E-R图
图4-3用户信息E-R图
图4-4字典信息E-R图
图4-5仓库信息E-R图
图4-6材料信息E-R图
图4-7公告信息E-R图
图4-8系统总体E-R图 ### 4.2.2逻辑设计 逻辑设计阶段紧张的事情是将观点设计中的E-R图,转换成方便系统进行存储和管理的二维表格形式[13]。这一阶段也可以被称为数据库的详细设计,其直接关系到系统功能模块的正常运行、数据信息的正常更新等。在设计过程中,须要充分考虑数据库的规范性和合理性,使得能够知足系统的功能和性能需求。本系统干系的数据表格设计内容如下所示。
表4-1管理员信息表
序号
列名
数据类型
解释
许可空
1
id
Int
编号
否
2
username
String
用户名
是
3
password
String
密码
是
4
role
String
角色
是
5
addtime
Date
新增韶光
是
表4-2用户信息表
序号
列名
数据类型
解释
许可空
1
id
Int
编号
否
2
username
String
账户
是
3
password
String
密码
是
4
yonghu_uuid_number
String
用户编号
是
5
yonghu_name
String
用户姓名
是
6
yonghu_phone
String
用户手机号
是
7
yonghu_id_number
String
用户身份证号
是
8
yonghu_photo
String
用户头像
是
9
age
Integer
年事
是
10
sex_types
Integer
性别
是
11
xueli_types
Integer
学历
是
12
yonghu_xuexiao
String
毕业学校
是
13
yonghu_email
String
电子邮箱
是
14
create_time
Date
创建韶光
是
表4-3字典信息表
序号
列名
数据类型
解释
许可空
1
id
Int
编号
否
2
dic_code
String
字段
是
3
dic_name
String
字段名
是
4
code_index
Integer
编码
是
5
index_name
String
编码名字
是
6
super_id
Integer
父字段id
是
7
beizhu
String
备注
是
8
create_time
Date
创建韶光
是
表4-4仓库信息表
序号
列名
数据类型
解释
许可空
1
id
Int
编号
否
2
yonghu_id
Integer
用户
是
3
cangku_uuid_number
String
仓库编号
是
4
cangku_name
String
仓库名称
是
5
cangku_photo
String
仓库照片
是
6
cangku_types
Integer
仓库类型
是
7
cangku_mianji
BigDecimal
仓库面积
是
8
cangku_content
String
仓库先容
是
9
cangku_delete
Integer
逻辑删除
是
10
insert_time
Date
添加韶光
是
11
create_time
Date
创建韶光
是
表4-5材料信息表
序号
列名
数据类型
解释
许可空
1
id
Int
编号
否
2
yonghu_id
Integer
用户
是
3
cangku_id
Integer
仓库
是
4
cailiao_uuid_number
String
材料编号
是
5
cailiao_name
String
材料名称
是
6
cailiao_photo
String
材料照片
是
7
cailiao_types
Integer
材料类型
是
8
cailiao_number
Integer
材料数量
是
9
cailiao_content
String
材料先容
是
10
cailiao_delete
Integer
逻辑删除
是
11
insert_time
Date
添加韶光
是
12
update_time
Date
末了更新韶光
是
13
create_time
Date
创建韶光
是
表4-6公告信息表
序号
列名
数据类型
解释
许可空
1
id
Int
编号
否
2
gonggao_name
String
公告名称
是
3
gonggao_photo
String
公告图片
是
4
gonggao_types
Integer
公告类型
是
5
insert_time
Date
公告发布韶光
是
6
gonggao_content
String
公告详情
是
7
create_time
Date
创建韶光
是
5系统实现5.1个人中央通过设计的个人中央管理功能模块,管理用户可以对干系的个人信息进行管理,比如管理用户可以更新个人账号的密码信息,修正个人账号的用户名信息等,修正密码界面设计如图5-1所示,个人信息界面设计如图5-2所示。
图5-1修正密码界面
图5-2个人信息界面 ## 5.2仓库管理 通过设计的仓库管理功能模块,管理用户可以对干系的仓库信息进行管理,比如管理用户可以查看仓库名称信息,删除已经失落效的仓库信息记录等操作,仓库管理界面设计如图5-3所示。
图5-3仓库管理界面 ## 5.3材料管理 通过设计的材料管理功能模块,管理用户可以对干系的材料信息进行管理,比如管理用户可以查看材料名称信息,删除已经失落效的材料信息记录等操作,材料管理界面设计如图5-4所示。
图5-4材料管理界面 ## 5.4根本数据管理 通过设计的根本数据管理功能模块,管理用户可以对干系的材料类型、仓库类型、公告类型、学历信息进行管理,比如管理用户可以查看材料类型、仓库类型、公告类型、学历的详情信息,删除失落效的材料类型、仓库类型、公告类型、学历信息记录等,材料类型管理界面设计如图5-5所示,仓库类型管理界面设计如图5-6所示,公告类型管理界面设计如图5-7所示,学历管理界面设计如图5-8所示。
图5-5材料类型管理界面
图5-6仓库类型管理界面
图5-7公告类型管理界面
图5-8学历管理界面 ## 5.5公告管理 通过设计的公告管理功能模块,管理用户可以对干系的公告信息进行管理,比如管理用户可以查看公告发布韶光信息,删除已经失落效的公告信息记录等操作,公告管理界面设计如图5-9所示。
图5-9公告管理界面 ## 5.6用户管理 通过设计的用户管理功能模块,管理用户可以管理干系的用户信息资料,比如进行查看用户姓名,修正用户联系办法,删除已经注销的用户信息记录等操作,用户管理界面设计如图5-10所示。
图5-10用户管理界面
系FileUtil.java
package com.utils;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;/ 类解释 : /public class FileUtil { public static byte[] FileToByte(File file) throws IOException { // 将数据转为流 @SuppressWarnings(34;resource") InputStream content = new FileInputStream(file); ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while ((rc = content.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } // 得到二进制数组 return swapStream.toByteArray(); }}
CailiaoController.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("/cailiao")public class CailiaoController { private static final Logger logger = LoggerFactory.getLogger(CailiaoController.class); @Autowired private CailiaoService cailiaoService; @Autowired private TokenService tokenService; @Autowired private DictionaryService dictionaryService; //级联表service @Autowired private CangkuService cangkuService; @Autowired private YonghuService yonghuService; / 后端列表 / @RequestMapping("/page") public R page(@RequestParam Map<String, Object> params, HttpServletRequest request){ logger.debug("page方法:,,Controller:{},,params:{}",this.getClass().getName(),JSONObject.toJSONString(params)); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永不会进入"); else if("用户".equals(role)) params.put("yonghuId",request.getSession().getAttribute("userId")); params.put("cailiaoDeleteStart",1);params.put("cailiaoDeleteEnd",1); if(params.get("orderBy")==null || params.get("orderBy")==""){ params.put("orderBy","id"); } PageUtils page = cailiaoService.queryPage(params); //字典表数据转换 List<CailiaoView> list =(List<CailiaoView>)page.getList(); for(CailiaoView 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); CailiaoEntity cailiao = cailiaoService.selectById(id); if(cailiao !=null){ //entity转view CailiaoView view = new CailiaoView(); BeanUtils.copyProperties( cailiao , view );//把实体数据重构到view中 //级联表 CangkuEntity cangku = cangkuService.selectById(cailiao.getCangkuId()); if(cangku != null){ BeanUtils.copyProperties( cangku , view ,new String[]{ "id", "createTime", "insertTime", "updateTime", "yonghuId"});//把级联的数据添加到view中,并打消id和创建韶光字段 view.setCangkuId(cangku.getId()); view.setCangkuYonghuId(cangku.getYonghuId()); } //级联表 YonghuEntity yonghu = yonghuService.selectById(cailiao.getYonghuId()); if(yonghu != null){ BeanUtils.copyProperties( yonghu , view ,new String[]{ "id", "createTime", "insertTime", "updateTime"});//把级联的数据添加到view中,并打消id和创建韶光字段 view.setYonghuId(yonghu.getId()); } //修正对应字典表字段 dictionaryService.dictionaryConvert(view, request); return R.ok().put("data", view); }else { return R.error(511,"查不到数据"); } } / 后端保存 / @RequestMapping("/save") public R save(@RequestBody CailiaoEntity cailiao, HttpServletRequest request){ logger.debug("save方法:,,Controller:{},,cailiao:{}",this.getClass().getName(),cailiao.toString()); String role = String.valueOf(request.getSession().getAttribute("role")); if(false) return R.error(511,"永久不会进入"); else if("用户".equals(role)) cailiao.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); Wrapper<CailiaoEntity> queryWrapper = new EntityWrapper<CailiaoEntity>() .eq("yonghu_id", cailiao.getYonghuId()) .eq("cangku_id", cailiao.getCangkuId()) .eq("cailiao_uuid_number", cailiao.getCailiaoUuidNumber()) .eq("cailiao_name", cailiao.getCailiaoName()) .eq("cailiao_types", cailiao.getCailiaoTypes()) .eq("cailiao_number", cailiao.getCailiaoNumber()) .eq("cailiao_delete", cailiao.getCailiaoDelete()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); CailiaoEntity cailiaoEntity = cailiaoService.selectOne(queryWrapper); if(cailiaoEntity==null){ cailiao.setCailiaoDelete(1); cailiao.setInsertTime(new Date()); cailiao.setCreateTime(new Date()); cailiaoService.insert(cailiao); return R.ok(); }else { return R.error(511,"表中有相同数据"); } } / 后端修正 / @RequestMapping("/update") public R update(@RequestBody CailiaoEntity cailiao, HttpServletRequest request){ logger.debug("update方法:,,Controller:{},,cailiao:{}",this.getClass().getName(),cailiao.toString()); String role = String.valueOf(request.getSession().getAttribute("role"));// if(false)// return R.error(511,"永久不会进入");// else if("用户".equals(role))// cailiao.setYonghuId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId")))); //根据字段查询是否有相同数据 Wrapper<CailiaoEntity> queryWrapper = new EntityWrapper<CailiaoEntity>() .notIn("id",cailiao.getId()) .andNew() .eq("yonghu_id", cailiao.getYonghuId()) .eq("cangku_id", cailiao.getCangkuId()) .eq("cailiao_uuid_number", cailiao.getCailiaoUuidNumber()) .eq("cailiao_name", cailiao.getCailiaoName()) .eq("cailiao_types", cailiao.getCailiaoTypes()) .eq("cailiao_number", cailiao.getCailiaoNumber()) .eq("cailiao_delete", cailiao.getCailiaoDelete()) ; logger.info("sql语句:"+queryWrapper.getSqlSegment()); CailiaoEntity cailiaoEntity = cailiaoService.selectOne(queryWrapper); if("".equals(cailiao.getCailiaoPhoto()) || "null".equals(cailiao.getCailiaoPhoto())){ cailiao.setCailiaoPhoto(null); } cailiao.setUpdateTime(new Date()); if(cailiaoEntity==null){ cailiaoService.updateById(cailiao);//根据id更新 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()); ArrayList<CailiaoEntity> list = new ArrayList<>(); for(Integer id:ids){ CailiaoEntity cailiaoEntity = new CailiaoEntity(); cailiaoEntity.setId(id); cailiaoEntity.setCailiaoDelete(2); list.add(cailiaoEntity); } if(list != null && list.size() >0){ cailiaoService.updateBatchById(list); } return R.ok(); } / 批量上传 / @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<CailiaoEntity> cailiaoList = 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){ //循环 CailiaoEntity cailiaoEntity = new CailiaoEntity();// cailiaoEntity.setYonghuId(Integer.valueOf(data.get(0))); //用户 要改的// cailiaoEntity.setCangkuId(Integer.valueOf(data.get(0))); //仓库 要改的// cailiaoEntity.setCailiaoUuidNumber(data.get(0)); //材料编号 要改的// cailiaoEntity.setCailiaoName(data.get(0)); //材料名称 要改的// cailiaoEntity.setCailiaoPhoto("");//详情和图片// cailiaoEntity.setCailiaoTypes(Integer.valueOf(data.get(0))); //材料类型 要改的// cailiaoEntity.setCailiaoNumber(Integer.valueOf(data.get(0))); //材料数量 要改的// cailiaoEntity.setCailiaoContent("");//详情和图片// cailiaoEntity.setCailiaoDelete(1);//逻辑删除字段// cailiaoEntity.setInsertTime(date);//韶光// cailiaoEntity.setUpdateTime(sdf.parse(data.get(0))); //末了更新韶光 要改的// cailiaoEntity.setCreateTime(date);//韶光 cailiaoList.add(cailiaoEntity); //把要查询是否重复的字段放入map中 //材料编号 if(seachFields.containsKey("cailiaoUuidNumber")){ List<String> cailiaoUuidNumber = seachFields.get("cailiaoUuidNumber"); cailiaoUuidNumber.add(data.get(0));//要改的 }else{ List<String> cailiaoUuidNumber = new ArrayList<>(); cailiaoUuidNumber.add(data.get(0));//要改的 seachFields.put("cailiaoUuidNumber",cailiaoUuidNumber); } } //查询是否重复 //材料编号 List<CailiaoEntity> cailiaoEntities_cailiaoUuidNumber = cailiaoService.selectList(new EntityWrapper<CailiaoEntity>().in("cailiao_uuid_number", seachFields.get("cailiaoUuidNumber")).eq("cailiao_delete", 1)); if(cailiaoEntities_cailiaoUuidNumber.size() >0 ){ ArrayList<String> repeatFields = new ArrayList<>(); for(CailiaoEntity s:cailiaoEntities_cailiaoUuidNumber){ repeatFields.add(s.getCailiaoUuidNumber()); } return R.error(511,"数据库的该表中的 [材料编号] 字段已经存在 存在数据为:"+repeatFields.toString()); } cailiaoService.insertBatch(cailiaoList); return R.ok(); } } } }catch (Exception e){ e.printStackTrace(); return R.error(511,"批量插入数据非常,请联系管理员"); } }}
StringUtil.java
package 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); }}
bootstrap-datepicker.js
/ ========================================================= bootstrap-datepicker.js http://www.eyecon.ro/bootstrap-datepicker ========================================================= Copyright 2012 Stefan Petre Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ========================================================= / !function( $ ) { // Picker object var Datepicker = function(element, options){ this.element = $(element); this.format = DPGlobal.parseFormat(options.format||this.element.data('date-format')||'mm/dd/yyyy'); this.picker = $(DPGlobal.template) .appendTo('body') .on({ click: $.proxy(this.click, this)//, //mousedown: $.proxy(this.mousedown, this) }); this.isInput = this.element.is('input'); this.component = this.element.is('.date') ? this.element.find('.add-on') : false; if (this.isInput) { this.element.on({ focus: $.proxy(this.show, this), //blur: $.proxy(this.hide, this), keyup: $.proxy(this.update, this) }); } else { if (this.component){ this.component.on('click', $.proxy(this.show, this)); } else { this.element.on('click', $.proxy(this.show, this)); } } this.minViewMode = options.minViewMode||this.element.data('date-minviewmode')||0; if (typeof this.minViewMode === 'string') { switch (this.minViewMode) { case 'months': this.minViewMode = 1; break; case 'years': this.minViewMode = 2; break; default: this.minViewMode = 0; break; } } this.viewMode = options.viewMode||this.element.data('date-viewmode')||0; if (typeof this.viewMode === 'string') { switch (this.viewMode) { case 'months': this.viewMode = 1; break; case 'years': this.viewMode = 2; break; default: this.viewMode = 0; break; } } this.startViewMode = this.viewMode; this.weekStart = options.weekStart||this.element.data('date-weekstart')||0; this.weekEnd = this.weekStart === 0 ? 6 : this.weekStart - 1; this.onRender = options.onRender; this.fillDow(); this.fillMonths(); this.update(); this.showMode(); }; Datepicker.prototype = { constructor: Datepicker, show: function(e) { this.picker.show(); this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); this.place(); $(window).on('resize', $.proxy(this.place, this)); if (e ) { e.stopPropagation(); e.preventDefault(); } if (!this.isInput) { } var that = this; $(document).on('mousedown', function(ev){ if ($(ev.target).closest('.datepicker').length == 0) { that.hide(); } }); this.element.trigger({ type: 'show', date: this.date }); }, hide: function(){ this.picker.hide(); $(window).off('resize', this.place); this.viewMode = this.startViewMode; this.showMode(); if (!this.isInput) { $(document).off('mousedown', this.hide); } //this.set(); this.element.trigger({ type: 'hide', date: this.date }); }, set: function() { var formated = DPGlobal.formatDate(this.date, this.format); if (!this.isInput) { if (this.component){ this.element.find('input').prop('value', formated); } this.element.data('date', formated); } else { this.element.prop('value', formated); } }, setValue: function(newDate) { if (typeof newDate === 'string') { this.date = DPGlobal.parseDate(newDate, this.format); } else { this.date = new Date(newDate); } this.set(); this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); this.fill(); }, place: function(){ var offset = this.component ? this.component.offset() : this.element.offset(); this.picker.css({ top: offset.top + this.height, left: offset.left }); }, update: function(newDate){ this.date = DPGlobal.parseDate( typeof newDate === 'string' ? newDate : (this.isInput ? this.element.prop('value') : this.element.data('date')), this.format ); this.viewDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0, 0, 0, 0); this.fill(); }, fillDow: function(){ var dowCnt = this.weekStart; var html = '<tr>'; while (dowCnt < this.weekStart + 7) { html += '<th class="dow">'+DPGlobal.dates.daysMin[(dowCnt++)%7]+'</th>'; } html += '</tr>'; this.picker.find('.datepicker-days thead').append(html); }, fillMonths: function(){ var html = ''; var i = 0 while (i < 12) { html += '<span class="month">'+DPGlobal.dates.monthsShort[i++]+'</span>'; } this.picker.find('.datepicker-months td').append(html); }, fill: function() { var d = new Date(this.viewDate), year = d.getFullYear(), month = d.getMonth(), currentDate = this.date.valueOf(); this.picker.find('.datepicker-days th:eq(1)') .text(DPGlobal.dates.months[month]+' '+year); var prevMonth = new Date(year, month-1, 28,0,0,0,0), day = DPGlobal.getDaysInMonth(prevMonth.getFullYear(), prevMonth.getMonth()); prevMonth.setDate(day); prevMonth.setDate(day - (prevMonth.getDay() - this.weekStart + 7)%7); var nextMonth = new Date(prevMonth); nextMonth.setDate(nextMonth.getDate() + 42); nextMonth = nextMonth.valueOf(); var html = []; var clsName, prevY, prevM; while(prevMonth.valueOf() < nextMonth) { if (prevMonth.getDay() === this.weekStart) { html.push('<tr>'); } clsName = this.onRender(prevMonth); prevY = prevMonth.getFullYear(); prevM = prevMonth.getMonth(); if ((prevM < month && prevY === year) || prevY < year) { clsName += ' old'; } else if ((prevM > month && prevY === year) || prevY > year) { clsName += ' new'; } if (prevMonth.valueOf() === currentDate) { clsName += ' active'; } html.push('<td class="day '+clsName+'">'+prevMonth.getDate() + '</td>'); if (prevMonth.getDay() === this.weekEnd) { html.push('</tr>'); } prevMonth.setDate(prevMonth.getDate()+1); } this.picker.find('.datepicker-days tbody').empty().append(html.join('')); var currentYear = this.date.getFullYear(); var months = this.picker.find('.datepicker-months') .find('th:eq(1)') .text(year) .end() .find('span').removeClass('active'); if (currentYear === year) { months.eq(this.date.getMonth()).addClass('active'); } html = ''; year = parseInt(year/10, 10) 10; var yearCont = this.picker.find('.datepicker-years') .find('th:eq(1)') .text(year + '-' + (year + 9)) .end() .find('td'); year -= 1; for (var i = -1; i < 11; i++) { html += '<span class="year'+(i === -1 || i === 10 ? ' old' : '')+(currentYear === year ? ' active' : '')+'">'+year+'</span>'; year += 1; } yearCont.html(html); }, click: function(e) { e.stopPropagation(); e.preventDefault(); var target = $(e.target).closest('span, td, th'); if (target.length === 1) { switch(target[0].nodeName.toLowerCase()) { case 'th': switch(target[0].className) { case 'switch': this.showMode(1); break; case 'prev': case 'next': this.viewDate['set'+DPGlobal.modes[this.viewMode].navFnc].call( this.viewDate, this.viewDate['get'+DPGlobal.modes[this.viewMode].navFnc].call(this.viewDate) + DPGlobal.modes[this.viewMode].navStep (target[0].className === 'prev' ? -1 : 1) ); this.fill(); this.set(); break; } break; case 'span': if (target.is('.month')) { var month = target.parent().find('span').index(target); this.viewDate.setMonth(month); } else { var year = parseInt(target.text(), 10)||0; this.viewDate.setFullYear(year); } if (this.viewMode !== 0) { this.date = new Date(this.viewDate); this.element.trigger({ type: 'changeDate', date: this.date, viewMode: DPGlobal.modes[this.viewMode].clsName }); } this.showMode(-1); this.fill(); this.set(); break; case 'td': if (target.is('.day') && !target.is('.disabled')){ var day = parseInt(target.text(), 10)||1; var month = this.viewDate.getMonth(); if (target.is('.old')) { month -= 1; } else if (target.is('.new')) { month += 1; } var year = this.viewDate.getFullYear(); this.date = new Date(year, month, day,0,0,0,0); this.viewDate = new Date(year, month, Math.min(28, day),0,0,0,0); this.fill(); this.set(); this.element.trigger({ type: 'changeDate', date: this.date, viewMode: DPGlobal.modes[this.viewMode].clsName }); } break; } } }, mousedown: function(e){ e.stopPropagation(); e.preventDefault(); }, showMode: function(dir) { if (dir) { this.viewMode = Math.max(this.minViewMode, Math.min(2, this.viewMode + dir)); } this.picker.find('>div').hide().filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); } }; $.fn.datepicker = function ( option, val ) { return this.each(function () { var $this = $(this), data = $this.data('datepicker'), options = typeof option === 'object' && option; if (!data) { $this.data('datepicker', (data = new Datepicker(this, $.extend({}, $.fn.datepicker.defaults,options)))); } if (typeof option === 'string') data[option](val); }); }; $.fn.datepicker.defaults = { onRender: function(date) { return ''; } }; $.fn.datepicker.Constructor = Datepicker; var DPGlobal = { modes: [ { clsName: 'days', navFnc: 'Month', navStep: 1 }, { clsName: 'months', navFnc: 'FullYear', navStep: 1 }, { clsName: 'years', navFnc: 'FullYear', navStep: 10 }], dates:{ days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] }, isLeapYear: function (year) { return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) }, getDaysInMonth: function (year, month) { return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] }, parseFormat: function(format){ var separator = format.match(/[.\/\-\s].?/), parts = format.split(/\W+/); if (!separator || !parts || parts.length === 0){ throw new Error("Invalid date format."); } return {separator: separator, parts: parts}; }, parseDate: function(date, format) { var parts = date.split(format.separator), date = new Date(), val; date.setHours(0); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); if (parts.length === format.parts.length) { var year = date.getFullYear(), day = date.getDate(), month = date.getMonth(); for (var i=0, cnt = format.parts.length; i < cnt; i++) { val = parseInt(parts[i], 10)||1; switch(format.parts[i]) { case 'dd': case 'd': day = val; date.setDate(val); break; case 'mm': case 'm': month = val - 1; date.setMonth(val - 1); break; case 'yy': year = 2000 + val; date.setFullYear(2000 + val); break; case 'yyyy': year = val; date.setFullYear(val); break; } } date = new Date(year, month, day, 0 ,0 ,0); } return date; }, formatDate: function(date, format){ var val = { d: date.getDate(), m: date.getMonth() + 1, yy: date.getFullYear().toString().substring(2), yyyy: date.getFullYear() }; val.dd = (val.d < 10 ? '0' : '') + val.d; val.mm = (val.m < 10 ? '0' : '') + val.m; var date = []; for (var i=0, cnt = format.parts.length; i < cnt; i++) { date.push(val[format.parts[i]]); } return date.join(format.separator); }, headTemplate: '<thead>'+ '<tr>'+ '<th class="prev">‹</th>'+ '<th colspan="5" class="switch"></th>'+ '<th class="next">›</th>'+ '</tr>'+ '</thead>', contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>' }; DPGlobal.template = '<div class="datepicker dropdown-menu">'+ '<div class="datepicker-days">'+ '<table class=" table-condensed">'+ DPGlobal.headTemplate+ '<tbody></tbody>'+ '</table>'+ '</div>'+ '<div class="datepicker-months">'+ '<table class="table-condensed">'+ DPGlobal.headTemplate+ DPGlobal.contTemplate+ '</table>'+ '</div>'+ '<div class="datepicker-years">'+ '<table class="table-condensed">'+ DPGlobal.headTemplate+ DPGlobal.contTemplate+ '</table>'+ '</div>'+ '</div>';}( window.jQuery );
声明
本博客适用于广泛的学术和教诲用场,包括但不限于个人学习、开拓设计,产品设计。仅供学习参考,旨在为读者供应深入理解和学术研究的材料。
java系统设计,毕设辅导