版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java家具商城平台一、引言随着国内外信息技术的发展和信息时代的到来,信息化、知识化、全球化已成为当前经济发展的三大趋势。人类社会信息化将导致一场信息革命,它使我国政府和公众对信息作用的认识不断深化。社会公众通过信息网络获取信息的积极性日益提高。从近几年来看,信息的快速发展为人们带来的非常大的便利,我们可以直接通过互联网了解到任何信息,也能非常轻松的购买到任何商品。同时由于计算机技术和网络技术的应用,人们的学习速度在不断加快,从数字处理时代到微机时代,到现在的网络化时代,学习速度越来越快,这要求我们的管理模式也要适应新的特点和新的模式。信息技术的发展对人们学习知识、掌握知识、运用知识提出了新的挑战绪论1.1系统开发背景随着计算机和网络的日趋普及和技术的飞速发展,越来越多的商家开始研发和部署基于互联网的应用。建立自己的网站,发布商业信息,大刀阔斧的开展电子商务。现在琳琅满目的网店商品更是吸引着消费者的眼球,消费者通过电子商务足不出户就能买到自己需要的并且是精心挑选的商品,方便、快捷又轻松。而对于商家来说,电商的经营模式是高效的、低成本的,所以对于商家来说是有利可图的。中国的家居用品行业迎来了大变革的大发展,需求量的扩大让国内的家居行业建立起种类齐全并与国际接轨的完整商业体系。国内的专业人士也非常看好家居行业的发展前景,认为发展潜力很大。另外很多国外的企业也入住国内,在国内得到较好的发展。家居行业也是中国制造业不可或缺的一部分,李克强总理提出中国制造2025纲领,我们的家居行业也要响应国家号召,为中国家居制造业创立一个良好的契机,让我们通过“三步走”实现制造强国的战略目标能够顺利完成。同时随着结算方式的改变,以前的“送货上门、到货付款”或“邮寄上门、贷款邮资先付”的方式不仅浪费了人力物力,而且限制了网络的覆盖范围和商品的结构种类,现在越来越多的人使用网上交易支付,它现在已经能够做到相对安全、方便快捷,给我们的生活带来很大的便利。1.2系统开发意义家居商品是在网上直接购买,有专门的人会把东西送到消费者面前,通过虚拟的网站购物商城可以让消费者足不出户地轻松购物,让购物的过程变得轻松、方便、快捷。电子商务系统由于具有营业时间自由、店面空间不受限制、地理位置不受影响、资金周转灵活、投资少回报快、消费群体数量庞大等优点,因此得到了快速地发展,在现代社会的商务活动中具有重要的作用。店铺24小时不关门。网上家居商城可以让消费者在每天的任意时间段购买店铺货架上提供的商品,不需要店员来照看店面。只要消费者根据自己的喜好选择了合适的商品,在线下下单,完成消费过程就可以了。不受地理位置的影响。网购购物可以有效的屏蔽地理位置给消费者带来的影响。就商品的位置而言,假如通过网上消费在深圳买一部手机,消费者只需通过网上商城下单,那么手机就会通过物流运到消费者的手里,不用消费者到实体店里面慢慢挑选了,大大的节约时间和空间成本。不受店铺空间的限制。哪怕只是街边小店,在网上却可以拥有百货大楼那么大的店面,只要投资者愿意,可以摆上成千上万种商品。目前国内最大的专业拍卖网站同时在线的商品要超过10万件,已超过一些大超市。解决了货物积压和存放的问题。消费者数量多。互联网的普及,让越来越多的人成为网民,其中,就中国而言,已经连续5年成为世界上网民最高的国家。如此多的网名为网上消费打下了基础到现在,手机通信越来越发达,随身携带随时购物的便捷性的体现,网上消费将会更多。投资少,回报率高。网上开店建店成本非常小,另外不会因为回笼资金较慢影响货品,商城可以通过在线销售得到高回报。1.3项目的可行性研究设计此系统需要java面向对象编程基础,数据库应用知识以及功能分析。根据目前阶段所掌握的知识,根据这学期以及之前学习掌握的java编程知识和数据库应用知识以及前端知识做出一个这样的基于Javaweb、springboot轻量级框架网页版的家具商城系统。1.4.社会可行性在互联网技术高速发展的今天,通过互联网的传播会让企业更容易的创造更多的经济效益,通过网上销售,有了更大的市场,在这样一个大环境下把资源统筹规化起来,就会获得高效的收益。1.5技术可行性springSpring框架是\t"/item/Spring%20Boot/_blank"Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为\t"/item/Spring%20Boot/_blank"EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有\t"/item/Spring%20Boot/_blank"面向切面编程(AOP)框架,SpringAOP框架基于代理模式,同时运行时可配置;AOP框架主要针对模块之间的交叉关注点进行模块化。Spring框架的AOP框架仅提供基本的AOP特性,虽无法与AspectJ框架相比,但通过与AspectJ的集成,也可以满足基本需求。Spring框架下的事务管理、远程访问等功能均可以通过使用SpringAOP技术实现。Spring的事务管理框架为Java平台带来了一种抽象机制,使本地和全局事务以及嵌套事务能够与保存点一起工作,并且几乎可以在Java平台的任何环境中工作。Spring集成多种事务模板,系统可以通过事务模板、XML或Java注解进行事务配置,并且事务框架集成了消息传递和缓存等功能。Spring的数据访问框架解决了开发人员在应用程序中使用数据库时遇到的常见困难。它不仅对Java:JDBC、iBATS/MyBATIs、Hibernate、Java数据对象(JDO)、ApacheOJB和ApacheCayne等所有流行的数据访问框架中提供支持,同时还可以与Spring的事务管理一起使用,为数据访问提供了灵活的抽象。Spring框架最初是没有打算构建一个自己的Web\t"/item/Spring%20Boot/_blank"MVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。SpringMVCSpringMVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,SpringMVC和Struts、Struts2非常类似。SpringMVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handlermappings、viewresolution、locale以及themeresolution来处理请求并且转到对应的视图。SpringMVC请求处理的整体流程如图:mybatismybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据SpringBootSpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。SpringBoot所具备的特征有:(1)可以创建独立的\t"/item/Spring%20Boot/_blank"Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;(2)内嵌Tomcat或Jetty等Servlet容器;(3)提供自动配置的“starter”项目对象模型(POMS)以简化\t"/item/Spring%20Boot/_blank"Maven配置;(4)尽可能自动配置Spring容器;(5)提供准备好的特性,如指标、健康检查和外部化配置;(6)绝对没有代码生成,不需要XML配置。
[1]
[2]SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。约定优于配置,Conventionoverconfiguration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。SpringBoot应用系统开发模板的基本架构设计从前端到后台进行说明:前端常使用模板引擎,主要有FreeMarker和Thymeleaf,它们都是用Java语言编写的,渲染模板并输出相应文本,使得界面的设计与应用的逻辑分离,同时前端开发还会使用到Bootstrap、AngularJS、JQuery等;在浏览器的数据传输格式上采用Json,非xml,同时提供RESTfulAPI;SpringMVC框架用于数据到达服务器后处理请求;到\t"/item/Spring%20Boot/_blank"数据访问层主要有Hibernate、MyBatis、JPA等持久层框架;数据库常用\t"/item/Spring%20Boot/_blank"MySQL;开发工具推荐IntelliJIDEA。jQueryjQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“writeLess,DoMore”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE6.0+、FF1.5+、Safari2.0+、Opera9.0+等MysqlMySQL是一款安全、跨平台、高效的,并与PHP、Java等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的MySQLAB公司开发、发布并支持,由MySQL的初始开发人员DavidAxmark和MichaelMontyWidenius于1995年建立的。
MySQL的象征符号是一只名为Sakila的海豚,代表着MySQL数据库的速度、能力、精确和优秀本质。
图:MySQL图标
目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多公司都采用MySQL数据库以降低成本。
MySQL数据库可以称得上是目前运行速度最快的SQL语言数据库之一。除了具有许多其他数据库所不具备的功能外,MySQL数据库还是一种完全免费的产品,用户可以直接通过网络下载MySQL数据库,而不必支付任何费用。MySQL特点下面总结了一下MySQL具备的特点。1)功能强大MySQL中提供了多种数据库存储引擎,各引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能,可以处理每天访问量超过数亿的高强度的搜索Web站点。MySQL5支持事务、视图、存储过程、触发器等。2)支持跨平台MySQL支持至少20种以上的开发平台,包括Linux、Windows、FreeBSD、IBMAIX、AIX、FreeBSD等。这使得在任何平台下编写的程序都可以进行移植,而不需要对程序做任何的修改。3)运行速度快高速是MySQL的显著特性。在MySQL中,使用了极快的B树磁盘表(MyISAM)和索引压缩;通过使用优化的单扫描多连接,能够极快地实现连接;SQL函数使用高度优化的类库实现,运行速度极快。4)支持面向对象PHP支持混合编程方式。编程方式可分为纯粹面向对象、纯粹面向过程、面句对象与面向过程混合3种方式。5)安全性高灵活和安全的权限与密码系统,允许基本主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码的安全。6)成本低MySQL数据库是一种完全免费的产品,用户可以直接通过网络下载。7)支持各种开发语言MySQL为各种流行的程序设计语言提供支持,为它们提供了很多的API函数,包括PHP、ASP.NET、Java、Eiffel、Python、Ruby、Tcl、C、C++、Perl语言等。8)数据库存储容量大MySQL数据库的最大有效表尺寸通常是由操作系统对文件大小的限制决定的,而不是由MySQL内部限制决定的。InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建,表空间的最大容量为64TB,可以轻松处理拥有上千万条记录的大型数据库。9)支持强大的内置函数PHP中提供了大量内置函数,几乎涵盖了Web应用开发中的所有功能。它内置了数据库连接、文件上传等功能,MySQL支持大量的扩展库,如MySQLi等,可以为快速开发Web应用提供便利。数据库的应用数据库是计算机应用系统中的一种专门管理数据资源的系统。数据有多种形式,如文字、数码、符号、图形、图像及声音等,数据是所有计算机系统所要处理的对象。我们所熟知的一种处理办法是制作文件,即将处理过程编成程序文件,将所涉及的数据按程序要求组成数据文件,再用程序来调用,数据文件与程序文件保持着一定的关系。
在计算机应用迅速发展的情况下,这种文件式管理方法便显出它的不足。比如,它使得数据通用性差、不便于移植、在不同文件中存储大量重复信息、浪费存储空间、更新不便等。
而数据库系统便能解决上述问题。数据库系统不从具体的应用程序出发,而是立足于数据本身的管理,它将所有数据保存在数据库中,进行科学的组织,并借助于数据库管理系统,以它为中介,与各种应用程序或应用系统接口,使之能方便地使用数据库中的数据。
其实简单地说,数据库就是一组经过计算机整理后的数据,存储在一个或多个文件中,而管理这个数据库的软件就称为数据库管理系统。一般一个数据库系统(DatabaseSystem)
可以分为数据库(Database)与数据管理系统(DatabaseManagementSystem,DBMS)两个部分。主流的数据库软件有Oracle、Informix、Sybase、SQLServer、PostgreSQL、MySQL、Access、FoxPro和Teradata等等。数据库在Web开发中的重要地位归根结底,动态网站都是对数据进行操作,我们平时浏览网页时,会发现网页的内容会经常变化,而页面的主体结构框架没变,新闻就是一个典型。这是因为我们将新闻存储在了数据库中,用户在浏览时,程序就会根据用户所请求的新闻编号,将对应的新闻从数据库中读取出来,然后再以特定的格式响应给用户。
Web系统的开发基本上是离不开数据库的,因为任何东西都要存放在数据库中。所谓的动态网站就是基于数据库开发的系统,最重要的就是数据管理,或者说我们在开发时都是在围绕数据库在写程序。所以作为一个Web程序员,只有先掌握一门数据库,才可能去进行软件开发。
需求分析2.1系统功能概述1)用户注册和登录登录功能:2)用户信息的管理:3)商品的操作:4)购物车的管理操作:5)订单管理操作:6)商品类型的管理7)商品的预览、查看、搜索2.2系统运行环境使用Windows7作为开发的系统。JavaJDK1.8环境配置、Java运行在idea软件上,数据库用mysql5版本数据库、数据库采用NacicatMysql可视化工具、基于主流的谷歌浏览器运行展示以及F12控制台调试样式、2.4技术难点系统设计3.1系统设计系统主要设计采用Java语言开发、采用springboot为后台框架、数据库框架采用mybatis、前端采用jquery、layui框架等主要模块设计如下:3.1.1客户端主要设计(1)用户注册和登录登录功能:①用户的注册功能:访问网站的人根据网站的提示注册自己的账户②用户的登录功能:用户可以输入用户名和密码进行登录操作,当没有该账户的时候,提示错误,用户必须通过注册完成或者从数据库中获取才能进行会员权限级别的操作。登录成功之后可以购买商品,查询订单的详细信息(2)、个人信息的管理:①用户信息的修改操作,其中包括会员名、密码、性别、联系方式e-mail和个人介绍等用户信息的修改操作。但是会员邮箱是绑定账号的,会员邮箱不能进行更改操作。②订单管理操作:订单只能查询和删除操作,不能有修改操作,修改操作是属于管理员的权限。③用户退出操作:当点击用户退出时,就会退出当前用户的登录状态,恢复到游客状态。(3)、商品的操作:①搜索商品操作:当在Search栏输入想搜索的家居用品时,会使用模糊查询,搜索出客户想到查询的家居用品。②商品列表展示:在全部列表中会有很多分列表目录,这些目录都是不同的种类,当我们点击不同的目录,就会查询不同的商品。③商品详细信息展示:会根据该目录下的商品类型展示出全部的商品。包括信息包括商品的图片、价格、售价等信息。这些信息都不带有分页,如果商品列表下的商品很多,就会分很多页进行分页查询。(4)、购物车的管理操作:①显示商品信息:当我们一进入购物车页面,就会显示出商品的详细信息,以及购物车界面的功能信息。②修改商品的数量:用户可以自己输入不同数量的商品,当商品的数量变动时,商品的库存就会相应的减少,也会根据商品的数量得到购买这一种商品的金额小计。③删除购物车中的商品:当我们点击删除时,会弹出一个提示框提示我们是否删除商品,当点击‘确定’,就删除成功,点击‘取消’,对话框消失并且没有任何操作执行。④购物流程变动:从到了购物车页面,就会显示购物流程,当每执行一步操作,购物流程就会相应的变动。5结账操作:当点击结账时,如果没有登录,那么就会提醒登录,如果登录了,就会到结算中心界面进行结算。3.1.2后台管理员主要设计系统的后台是专门为管理家居商城系统的人员设计的,功能如下:(1)、超级管理员:拥有管理该系统的最大权限,他有两个特有的功能①数据字典:可以对后台的不同分类的分类列表具有增删改查的操作。②角色管理:将拥有不同权限的管理员分成不同的角色,每个不同角色有自己的权限,不能执行越权操作,分配不同的权限的角色也是为了方便更好的管理。(2)、商品分类的管理:①添加分类:点击添加按钮,会跳转到分类添加页面,需要编写分类名称,分类描述信息。②编辑分类:点击编辑分类按钮,会跳转到分类编辑页面,需要编写分类名称,分类描述信息。另外会有数据回显,当什么都不操作时,保持原来不变。③删除分类:当点击删除按钮时,会弹出一个提醒框,当点击确定,删除分类,点击取消,保持原来不变。(3)、商品管理功能:①查询商品:查询所有商品列表,还有通过商品的名称、商品的类别和价格区间查询指定商品或符合条件的商品,并且可以查询商品的详细信息。②添加商品:点击添加商品会转到添加商品页面,需要提供商品名称、商品图片、商品类别、商品价格、库存数量、商品描述等内容。③修改商品:当点击编辑操作时,修改商品的信息,包括商品名称、商品图片、商品类别、商品价格、库存数量、商品描述等内容④删除商品:删除已过时或者库存为零的商品。3.4系统流程描述5项目源码架构系统实现4.1程序主要类4.1.1用户管理员类@Data@EntitypublicclassAdminUserimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue@ColumnprivateIntegerid;@Column(nullable=false)privateStringusername;@ColumnprivateStringpassword;publicAdminUser(Integerid,Stringusername,Stringpassword){this.id=id;this.username=username;this.password=password;}publicAdminUser(){super();}4.1.4商品分类/***分类*/@EntitypublicclassClassificationimplementsSerializable{@Id@GeneratedValue@ColumnprivateIntegerid;/***上级分类Id*/@ColumnprivateIntegerparentId;/***分类名称*/@ColumnprivateStringcname;/***类型1一级分类2二级分类*/@ColumnprivateIntegertype;4.1.4订单类/***订单*/@Entity@Table(name="`order`")publicclassOrderimplementsSerializable{@Id@GeneratedValue@ColumnprivateIntegerid;/***订单总价*/@ColumnprivateDoubletotal;/***订单状态1:未付款2:等待发货3:等待收货4:订单完成*/@ColumnprivateIntegerstate;/***订单时间*/@ColumnprivateDateorderTime;/***收货人姓名*/@Column(name="`name`")privateStringname;/***收货人联系电话*/@ColumnprivateStringphone;/***收货地址*/@ColumnprivateStringaddr;/***用户Id*/@ColumnprivateIntegeruserId;4.1.4订单项类/***订单项*/@EntitypublicclassOrderItemimplementsSerializable{@Id@GeneratedValue@ColumnprivateIntegerid;/***订单Id*/@ColumnprivateIntegerorderId;/***商品Id*/@ColumnprivateIntegerproductId;/***数量*/@ColumnprivateIntegercount;/***总价*/@ColumnprivateDoublesubTotal;@TransientprivateProductproduct;4.1.4商品类@Entity@JsonIgnoreProperties({"handler","hibernateLazyInitializer"})publicclassProductimplementsSerializable{@Id@GeneratedValue@ColumnprivateIntegerid;/***商品标题*/@ColumnprivateStringtitle;/***市场价*/@ColumnprivateDoublemarketPrice;/***商城价*/@ColumnprivateDoubleshopPrice;/***主图*/@ColumnprivateStringimage;/***描述*/@Column(name="`desc`",columnDefinition="text")privateStringdesc;/***是否热门商品*/@ColumnprivateIntegerisHot;/***二级分类Id*/@ColumnprivateIntegercsid;/***商品创建日期*/@ColumnprivateDatepdate;4.1.4用户客户类@EntitypublicclassUserimplementsSerializable{@Id@GeneratedValue@ColumnprivateIntegerid;/***用户名*/@ColumnprivateStringusername;/***密码*/@ColumnprivateStringpassword;/***姓名*/@ColumnprivateStringname;/***邮件*/@ColumnprivateStringemail;/***电话*/@ColumnprivateStringphone;/***地址*/@ColumnprivateStringaddr;4.3系统功能主要实现模块截图4.3.1登陆页面用户输入账号和密码和登录进行登录4.3.1登录关键代码:/***登录**@paramusername*@parampassword*/@RequestMapping("/login.do")publicvoidlogin(Stringusername,Stringpassword,HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{Useruser=userService.checkLogin(username,password);if(user!=null){//登录成功重定向到首页request.getSession().setAttribute("user",user);response.sendRedirect("/mall/index.html");}else{thrownewLoginException("登录失败!用户名或者密码错误");}}4.3.2注册页面: /***注册*/@RequestMapping("/register.do")publicvoidregister(Stringusername,Stringpassword,Stringname,Stringphone,Stringemail,Stringaddr,HttpServletResponseresponse)throwsIOException{Useruser=newUser();user.setUsername(username);user.setPhone(phone);user.setPassword(password);user.setName(name);user.setEmail(email);user.setAddr(addr);userService.create(user);//注册完成后重定向到登录页面response.sendRedirect("/mall/user/toLogin.html");}4.3.2系统功能截图系统主页面是商品信息的展示、右侧上方是用户功能操作、没有登录的用户可以选择登录或注册操作才可以对商品进行购买、加入购物车等操作选择分类查看家具商品信息用户登录注册操作用户可以查看我的订单信息以及我的购物车我的购物车操作查看我的订单信息后台管理员用户管理、可以对客户用户进行添加、编辑、删除操作编辑用户信息编辑商品分类列表编辑商品二级分类列表编辑商品家具具体信息4.3.4部分关键源码展示:登录模块:/***登录**@paramusername*@parampassword*/@RequestMapping("/login.do")publicvoidlogin(Stringusername,Stringpassword,HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{Useruser=userService.checkLogin(username,password);if(user!=null){//登录成功重定向到首页request.getSession().setAttribute("user",user);response.sendRedirect("/mall/index.html");}else{thrownewLoginException("登录失败!用户名或者密码错误");}}springboot全局配置文件:#\u8BBF\u95EE\u8DEF\u5F84\uFF0C\u7AEF\u53E3\u914D\u7F6Eserver.context-path=/mallserver.port=8081#\u6587\u4EF6\u4E0A\u4F20\u914D\u7F6Espring.http.multipart.enabled=truespring.http.multipart.max-file-size=100MBspring.http.multipart.max-request-size=100MBlogging.level.priv.jesse.mall=DEBUG#\u914D\u7F6E\u8F6Cjson\u7684\u65F6\u95F4\u683C\u5F0Fspring.jackson.time-zone=GMT+8spring.jackson.date-format=yyyy-MM-ddHH:mm:ss#jdbc\u8FDE\u63A5\u914D\u7F6E#mysql#spring.datasource.url=jdbc:mysql://active.iceslurry.xyz/mall?useSSL=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull#spring.datasource.username=root#spring.datasource.password=123456#spring.datasource.driver-class-name=com.mysql.jdbc.Driver#H2spring.datasource.url=jdbc:mysql://localhost:3307/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaispring.datasource.username=rootspring.datasource.password=crit@2019spring.datasource.driver-class-name=com.mysql.jdbc.Driver#spring.h2.console.settings.web-allow-others=false#spring.h2.console.path=/h2-consolespring.datasource.type=com.alibaba.druid.pool.DruidDataSource#thymeleaf\u6A21\u677F\u5F15\u64CE\u8BBE\u7F6Espring.thymeleaf.mode=HTML5spring.thymeleaf.encoding=UTF-8spring.thymeleaf.content-type=text/html##\u5F00\u53D1\u65F6\u5173\u95ED\u7F13\u5B58,\u4E0D\u7136\u6CA1\u6CD5\u770B\u5230\u5B9E\u65F6\u9875\u9762spring.thymeleaf.cache=false#####################jpahibernate\u914D\u7F6E#########################spring.jpa.show-sql=falsespring.jpa.database=perties.hibernate.format_sql=falsespring.jpa.generate-ddl=true#\u6700\u5E38\u7528\u7684\u5C5E\u6027\uFF0C\u7B2C\u4E00\u6B21\u52A0\u8F7Dhibernate\u65F6\u6839\u636Emodel\u7C7B\u4F1A\u81EA\u52A8\u5EFA\u7ACB\u8D77\u8868\u7684\u7ED3\u6784\uFF08\u524D\u63D0\u662F\u5148\u5EFA\u7ACB\u597D\u6570\u636E\u5E93\uFF09\uFF0C#\u4EE5\u540E\u52A0\u8F7Dhibernate\u65F6\u6839\u636Emodel\u7C7B\u81EA\u52A8\u66F4\u65B0\u8868\u7ED3\u6784\uFF0C\u5373\u4F7F\u8868\u7ED3\u6784\u6539\u53D8\u4E86\u4F46\u8868\u4E2D\u7684\u884C\u4ECD\u7136\u5B58\u5728\u4E0D\u4F1A\u5220\u9664\u4EE5\u524D\u7684\u884C\u3002#\u8981\u6CE8\u610F\u7684\u662F\u5F53\u90E8\u7F72\u5230\u670D\u52A1\u5668\u540E\uFF0C\u8868\u7ED3\u6784\u662F\u4E0D\u4F1A\u88AB\u9A6C\u4E0A\u5EFA\u7ACB\u8D77\u6765\u7684\uFF0C\u662F\u8981\u7B49\u5E94\u7528\u7B2C\u4E00\u6B21\u8FD0\u884C\u8D77\u6765\u540E\u624D\u4F1A\u3002spring.jpa.hibernate.ddl-auto=update####################################################################################druid\u6570\u636E\u5E93\u8FDE\u63A5\u6C60\u914D\u7F6E#############################\u914D\u7F6E\u521D\u59CB\u5316\u5927\u5C0F\uFF0C\u6700\u5C0F\uFF0C\u6700\u5927spring.datasource.druid.initial-size=1spring.datasource.druid.max-active=20spring.datasource.druid.min-idle=1#\u914D\u7F6E\u83B7\u53D6\u8FDE\u63A5\u7B49\u5F85\u8D85\u65F6\u7684\u65F6\u95F4spring.datasource.druid.max-wait=60000#\u914D\u7F6E\u95F4\u9694\u591A\u4E45\u624D\u8FDB\u884C\u4E00\u6B21\u68C0\u6D4B\uFF0C\u68C0\u6D4B\u9700\u8981\u5173\u95ED\u7684\u7A7A\u95F2\u8FDE\u63A5\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2spring.datasource.druid.time-between-eviction-runs-millis=60000#\u914D\u7F6E\u4E00\u4E2A\u8FDE\u63A5\u5728\u6C60\u4E2D\u6700\u5C0F\u751F\u5B58\u7684\u65F6\u95F4\uFF0C\u5355\u4F4D\u662F\u6BEB\u79D2spring.datasource.druid.min-evictable-idle-time-millis=300000spring.datasource.druid.validation-query=SELECT'x'spring.datasource.druid.test-on-borrow=falsespring.datasource.druid.test-on-return=falsespring.datasource.druid.test-while-idle=true#\u6253\u5F00PSCache\uFF0C\u5E76\u4E14\u6307\u5B9A\u6BCF\u4E2A\u8FDE\u63A5\u4E0APSCache\u7684\u5927\u5C0F#\u5982\u679C\u7528Oracle\uFF0C\u5219\u628ApoolPreparedStatements\u914D\u7F6E\u4E3Atrue\uFF0Cmysql\u53EF\u4EE5\u914D\u7F6E\u4E3Afalse\u3002\u5206\u5E93\u5206\u8868\u8F83\u591A\u7684\u6570\u636E\u5E93\uFF0C\u5EFA\u8BAE\u914D\u7F6E\u4E3Afalse\u3002spring.datasource.druid.pool-prepared-statements=falsespring.datasource.druid.max-pool-prepared-statement-per-connection-size=20#druid\u76D1\u63A7\u914D\u7F6Espring.datasource.druid.filters=stat,slf4j#WebStatFilter\u914D\u7F6E\uFF0C\u8BF4\u660E\u8BF7\u53C2\u8003DruidWiki\uFF0C\u914D\u7F6E_\u914D\u7F6EWebStatFilterspring.datasource.druid.web-stat-filter.enabled=truespring.datasource.druid.filter.stat.log-slow-sql=truespring.datasource.druid.filter.stat.slow-sql-millis=2000#StatViewServlet\u914D\u7F6E\uFF0C\u8BF4\u660E\u8BF7\u53C2\u8003DruidWiki\uFF0C\u914D\u7F6E_StatViewServlet\u914D\u7F6Espring.datasource.druid.stat-view-servlet.enabled=truespring.datasource.druid.stat-view-servlet.url-pattern=/druid/*spring.datasource.druid.stat-view-servlet.reset-enable=truespring.datasource.druid.stat-view-servlet.login-username=druidspring.datasource.druid.stat-view-servlet.login-password=123456#Spring\u76D1\u63A7\u914D\u7F6E\uFF0C\u8BF4\u660E\u8BF7\u53C2\u8003DruidGithubWiki\uFF0C\u914D\u7F6E_Druid\u548CSpring\u5173\u8054\u76D1\u63A7\u914D\u7F6Espring.datasource.druid.aop-patterns=priv.jesse.mall.service.impl.*#druid\u65E5\u5FD7\u8F93\u51FAspring.datasource.druid.filter.slf4j.enabled=truespring.datasource.druid.filter.slf4j.result-set-log-enabled=falsespring.datasource.druid.filter.slf4j.statement-create-after-log-enabled=falsespring.datasource.druid.filter.slf4j.statement-close-after-log-enabled=falsespring.datasource.druid.filter.slf4j.result-set-open-after-log-enabled=falsespring.datasource.druid.filter.slf4j.result-set-close-after-log-enabled=false##################druid\u8FDE\u63A5\u6C60\u914D\u7F6E\u7ED3\u675F############################log4j2.xml日志配置文件:<?xmlversion="1.0"encoding="UTF-8"?><Configurationstatus="INFO"><Appenders><Consolename="Console"target="SYSTEM_OUT"><PatternLayoutpattern="%d{HH:mm:ss.SSS}[%-5level]%logger{36}-%message%n"/></Console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用--><Filename="log"fileName="log/test.log"append="true"><PatternLayoutpattern="%d{HH:mm:ss.SSS}%-5level%class{36}%L%M-%message%xEx%n"/></File></Appenders><Loggers><Rootlevel="INFO"><AppenderRefref="Console"/><AppenderRefref="log"/></Root></Loggers></Configuration>代码主启动类:/***程序启动入口**@ServletComponentScan设置启动时spring能够扫描到我们自己编写的servlet和filter,用于Druid监控*@MapperScan("com.imlaidian.springbootdemo.dao")扫描mybatisMapper接口*@EnableScheduling启用定时任务*@EnableTransactionManagement开启事务**@authorhfb*@date2017/9/1811:13*/@ServletComponentScan@EnableConfigurationProperties@EnableTransactionManagement@SpringBootApplicationpublicclassMallApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(MallApplication.class,args); }}权限拦截控制器:packagepriv.jesse.mall.filter;importcom.fasterxml.jackson.databind.ObjectMapper;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebFilter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.OutputStream;importjava.util.HashMap;/***权限拦截器**@authorhfb*@date2017/9/18*/@WebFilterpublicclassAuthorizationFilterimplementsFilter{publicAuthorizationFilter(){}privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(AuthorizationFilter.class);@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}@OverridepublicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)req;HttpServletResponseresponse=(HttpServletResponse)res;//支持跨域访问response.setHeader("Access-Control-Allow-Origin","*");response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE");response.setHeader("Access-Control-Max-Age","3600");response.setHeader("Access-Control-Allow-Headers","Origin,X-Requested-With,Content-Type,Accept,X-Custom-Header");response.setHeader("X-Powered-By","SpringBoot");if("option".equalsIgnoreCase(request.getMethod())){responseJSON(response,newHashMap<>());return;}//除了拦截login.html其他html都拦截StringBufferurl=request.getRequestURL();//System.out.println(url);Stringpath=url.toString();//只拦截这些类型请求if(path.endsWith(".do")||path.endsWith(".html")){//登录,图片不拦截if(path.endsWith("toLogin.html")||path.endsWith("toRegister.html")||path.endsWith("register.do")||path.endsWith("login.do")||path.endsWith("logout.do")||path.endsWith("error.html")||path.endsWith("checkUsername.do")||path.contains("/mall/admin/product/img/")||path.endsWith("index.html")||path.endsWith("classification/list.do")||path.contains("product")||path.contains("/mall/h2-console")){chain.doFilter(request,response);}else{processAccessControl(request,response,chain);}}else{//其他静态资源都不拦截chain.doFilter(request,response);}}/***@paramrequest*@paramresponse*@paramchain*@throwsIOException*@throwsServletException*/privatevoidprocessAccessControl(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainchain)throwsIOException,ServletException{ObjectadminUser=request.getSession().getAttribute("login_user");Objectuser=request.getSession().getAttribute("user");Stringurl=request.getRequestURL().toString();if(url.indexOf("admin")!=-1){if(adminUser==null){response.sendRedirect("/mall/admin/toLogin.html");}else{chain.doFilter(request,response);}}else{if(user==null){response.sendRedirect("/mall/user/toLogin.html");}else{chain.doFilter(request,response);}}}@Overridepublicvoiddestroy(){}/***返回JOSN数据格式**@paramresponse*@paramobject*@throwsIOException*/publicstaticvoidresponseJSON(HttpServletResponseresponse,Objectobject)throwsIOException{response.setContentType("application/json;charset=utf-8");response.setCharacterEncoding("UTF-8");ObjectMappermapper=newObjectMapper();if(object==null)return;StringjsonStr=mapper.writeValueAsString(object);OutputStreamout=response.getOutputStream();out.write(jsonStr.getBytes("UTF-8"));out.flush();}}4.4数据库表设计4.4.0数据库三范式要求:一、第一范式1NF是对属性的原子性,要求属性具有原子性,不可再分解;表:字段1、字段2(字段2.1、字段2.2)、字段3......如学生(学号,姓名,性别,出生年月日),如果认为最后一列还可以再分成(出生年,出生月,出生日),它就不是一范式了,否则就是;二、第二范式2NF是对记录的唯一性,要求记录有唯一标识,即实体的唯一性,即不存在部分依赖;表:学号、课程号、姓名、学分;这个表明显说明了两个事务:学生信息,课程信息;由于非主键字段必须依赖主键,这里学分依赖课程号,姓名依赖与学号,所以不符合二范式。可能会存在问题:数据冗余:,每条记录都含有相同信息;删除异常:删除所有学生成绩,就把课程信息全删除了;插入异常:学生未选课,无法记录进数据库;更新异常:调整课程学分,所有行都调整。正确做法:
学生:Student(学号,姓名);
课程:Course(课程号,学分);
选课关系:StudentCourse(学号,课程号,成绩)。三、第三范式3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;表:学号,姓名,年龄,学院名称,学院电话因为存在依赖传递:(学号)→(学生)→(所在学院)→(学院电话)。可能会存在问题:数据冗余:有重复值;更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况
。正确做法:学生:(学号,姓名,年龄,所在学院);学院:(学院,电话)。四、反范式化一般说来,数据库只需满足第三范式(3NF)就行了。没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,达到以空间换时间的目的。〖例〗:有一张存放商品的基本表,“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。在Rose2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。五、范式化设计和反范式化设计的优缺点5.1范式化优点:缺点:5.2反范式化优点:缺点:数据库采用mysql5版本、满足数据库设计三范式。编码采用utf8--UTF-8Unicode排序规则采用utf8_general_ci4.4.1数据库表ER图4.4.2用户表设计主要字段有:用户名、密码、邮箱、地址、个人信息、手机号等信息4.4.3商品分类表设计主要字段有:id、上级id商品分类名称、类型等终端4.4.4用户订单表设计主要字段有:id、客户收货地址、姓名、收货时间、手机号、状态、数据量、用户id等字段4.4.5商品表设计主要字段有:id、商品id、备注、商品图片、商品价格、商品标题、商品描述、时间等4.4.5订单项表设计主要字段有:id、商品数量、订单id、商品id、总价等4.4.6数据库sql文件/*NavicatMySQLDataTransferSourceServer:jesse_rootSourceServerVersion:50713SourceHost:localhost:3306SourceDatabase:mallTargetServerType:MYSQLTargetServerVersion:50713FileEncoding
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1白鹭说课稿-2024-2025学年五年级上册语文统编版
- 科技驱动家居新潮流
- 外汇互换合同(2篇)
- 2024马铃薯种植基地生态环境监测合同3篇
- 全新办理协议离婚程序下载
- 2024招投标与合同管理实务操作与案例分析心得总结3篇
- 临时用工合同范本
- 海边异国游记的故事征文
- 2024年绿色能源管理合同
- 14 当冲突发生(说课稿)-部编版(五四制)道德与法治四年级上册
- 2025年度爱读书学长定制化阅读计划合同2篇
- 2025年首都机场集团公司招聘笔试参考题库含答案解析
- 保健品购销合同2025年
- 2024版光伏发电项目承包经营权转让合同范本3篇
- 实习终止及解除协议书
- 河南省信阳市浉河区9校联考2024-2025学年八年级上学期12月月考地理试题(含答案)
- 中国冠心病康复循证实践指南(2024版)解读
- 2024-2030年中国再生水行业发展前景预测规划分析报告
- 城市公益性公墓建设项目施工组织设计
- 2022-2024年江苏中考语文试题汇编:名著阅读(教师版)
- 2024年秋季新人教版七年级上册数学全册教案
评论
0/150
提交评论