springboot+mysql网上家具商城(源码+sql+论文报告)

一、引言

随着国内外信息技术的发展和信息时代的到来,信息化、知识化、全球化已成为当前经济发展的三大趋势。人类社会信息化将导致一场信息革命,它使我国政府和公众 对信息作用的认识不断深化 。社会公众通过信息网络获取信息的积极性日益提高。从近几年来看,信息的快速发展为人们带来的非常大的便利,我们可以直接通过互联网了 解到任何信息,也能非常轻松的购买到任何商品。同时由于计算机技术和网络技术的应 用,人们的学习速度在不断加快,从数字处理时代到微机时代,到现在的网络化时代,学习速度越来越快,这要求我们的管理模式也要适应新的特点和新的模式。信息技术的发展对人们学习知识、掌握知识、运用知识提出了新的挑战

  • 绪论

1.1 系统开发背景

随着计算机和网络的日趋普及和技术的飞速发展,越来越多的商家开始研发和部署基于互联网的应用。 建立自己的网站, 发布商业信息, 大刀阔斧的开展电子商务。 现在琳琅满目的网店商品更是吸引着消费者的眼球, 消费者通过电子商务足不出户就能买到自己需要的并且是精心挑选的商品,方便、快捷又轻松。而对于商家来说,电商的经营模式是高效的、低成本的,所以对于商家来说是有利可图的。中国的家居用品行业迎来了大变革的大发展,需求量的扩大让国内的家居行业建立起种类齐全并与国际接轨的完整商业体系。 国内的专业人士也非常看好家居行业的发展前景,认为发展潜力很大。另外很多国外的企业也入住国内,在国内得到较好的发展。家居行业也是中国制造业不可或缺的一部分,李克强总理提出中国制造 2025 纲领,我们的家居行业也要响应国家号召,为中国家居制造业创立一个良好的契机,让我们通过“三步走”实现制造强国的战略目标能够顺利完成。同时随着结算方式的改变,以前的“送货上门、到货付款”或“邮寄上门、贷款邮资先付”的方式不仅浪费了人力物力,而且限制了网络的覆盖范围和商品的结构种类,现在越来越多的人使用网上交易支付,它现在已经能够做到相对安全、方便快捷,给我们的生活带来很大的便利。

1.2 系统开发意义

家居商品是在网上直接购买, 有专门的人会把东西送到消费者面前, 通过虚拟的网站购物商城可以让消费者足不出户地轻松购物,让购物的过程变得轻松、方便、快捷。电子商务系统由于具有营业时间自由、店面空间不受限制、地理位置不受影响、资金周转灵活、投资少回报快、消费群体数量庞大等优点,因此得到了快速地发展,在现代社会的商务活动中具有重要的作用。店铺 24 小时不关门。网上家居商城可以让消费者在每天的任意时间段购买店铺货架上提供的商品,不需要店员来照看店面。 只要消费者根据自己的喜好选择了合适的商品,在线下下单,完成消费过程就可以了。不受地理位置的影响。网购购物可以有效的屏蔽地理位置给消费者带来的影响。就商品的位置而言,假如通过网上消费在深圳买一部手机, 消费者只需通过网上商城下单,那么手机就会通过物流运到消费者的手里,不用消费者到实体店里面慢慢挑选了,大大

的节约时间和空间成本。不受店铺空间的限制。哪怕只是街边小店,在网上却可以拥有百货大楼那么大的店面,只要投资者愿意,可以摆上成千上万种商品。目前国内最大的专业拍卖网站同时在线的商品要超过 10 万件,已超过一些大超市。解决了货物积压和存放的问题。消费者数量多。互联网的普及,让越来越多的人成为网民,其中,就中国而言,已经连续 5 年成为世界上网民最高的国家。 如此多的网名为网上消费打下了基础到现在,手机通信越来越发达,随身携带随时购物的便捷性的体现,网上消费将会更多。投资少,回报率高。网上开店建店成本非常小,另外不会因为回笼资金较慢影响货品,商城可以通过在线销售得到高回报。

   

1.3项目的可行性研究设计

此系统需要java面向对象编程基础,数据库应用知识以及功能分析。根据目前阶段所掌握的知识,根据这学期以及之前学习掌握的java编程知识和数据库应用知识以及前端知识做出一个这样的基于Javaweb、springboot轻量级框架网页版的家具商城系统。

1.4.社会可行性

在互联网技术高速发展的今天,通过互联网的传播会让企业更容易的创造更多的经 济效益,通过网上销售,有了更大的市场,在这样一个大环境下把资源统筹规化起来,就会获得高效的收益。

1.5技术可行性

spring

Spring框架是Java平台上的一种开源应用框架,提供具有控制反转特性的容器。尽管Spring框架自身对编程模型没有限制,但其在Java应用中的频繁使用让它备受青睐,以至于后来让它作为EJB(EnterpriseJavaBeans)模型的补充,甚至是替补。Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供大量优秀的Web框架方便开发等等。Spring框架具有控制反转(IOC)特性,IOC旨在方便项目维护和测试,它提供了一种通过Java的反射机制对Java对象进行统一的配置和管理的方法。Spring框架利用容器管理对象的生命周期,容器可以通过扫描XML文件或类上特定Java注解来配置对象,开发者可以通过依赖查找或依赖注入来获得对象。Spring框架具有面向切面编程(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框架最初是没有打算构建一个自己的WebMVC框架,其开发人员在开发过程中认为现有的StrutsWeb框架的呈现层和请求处理层之间以及请求处理层和模型之间的分离不够,于是创建了SpringMVC。

Spring MVC

Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,Spring MVC和Struts、Struts2非常类似。Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handler mappings、view resolution、locale以及theme resolution来处理请求并且转到对应的视图。Spring MVC请求处理的整体流程如图:

mybatis

mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据

SpringBoot

SpringBoot是由Pivotal团队在2013年开始研发、2014年4月发布第一个版本的全新开源的轻量级框架。它基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

SpringBoot所具备的特征有:

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;

(2)内嵌Tomcat或Jetty等Servlet容器;

(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;

(4)尽可能自动配置Spring容器;

(5)提供准备好的特性,如指标、健康检查和外部化配置;

(6)绝对没有代码生成,不需要XML配置。 [1]  [2]

SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置。开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。约定优于配置,Convention over configuration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。

SpringBoot应用系统开发模板的基本架构设计从前端到后台进行说明:前端常使用模板引擎,主要有FreeMarker和Thymeleaf,它们都是用Java语言编写的,渲染模板并输出相应文本,使得界面的设计与应用的逻辑分离,同时前端开发还会使用到Bootstrap、AngularJS、JQuery等;在浏览器的数据传输格式上采用Json,非xml,同时提供RESTfulAPI;SpringMVC框架用于数据到达服务器后处理请求;到数据访问层主要有Hibernate、MyBatis、JPA等持久层框架;数据库常用MySQL;开发工具推荐IntelliJIDEA。

jQuery

jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。

jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等

Mysql

MySQL 是一款安全、跨平台、高效的,并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持,由 MySQL 的初始开发人员 David Axmark 和 Michael Monty Widenius 于 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 应用提供便利。

数据库的应用

数据库是计算机应用系统中的一种专门管理数据资源的系统。数据有多种形式,如文字、数码、符号、图形、图像及声音等,数据是所有计算机系统所要处理的对象。我们所熟知的一种处理办法是制作文件,即将处理过程编成程序文件,将所涉及的数据按程序要求组成数据文件,再用程序来调用,数据文件与程序文件保持着一定的关系。

在计算机应用迅速发展的情况下,这种文件式管理方法便显出它的不足。比如,它使得数据通用性差、不便于移植、在不同文件中存储大量重复信息、浪费存储空间、更新不便等。

而数据库系统便能解决上述问题。数据库系统不从具体的应用程序出发,而是立足于数据本身的管理,它将所有数据保存在数据库中,进行科学的组织,并借助于数据库管理系统,以它为中介,与各种应用程序或应用系统接口,使之能方便地使用数据库中的数据。

其实简单地说,数据库就是一组经过计算机整理后的数据,存储在一个或多个文件中,而管理这个数据库的软件就称为数据库管理系统。一般一个数据库系统(Database System)

可以分为数据库(Database)与数据管理系统(Database Management System,DBMS)两个部分。主流的数据库软件有 Oracle、Informix、Sybase、SQL Server、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版本数据库、

数据库采用Nacicat Mysql可视化工具、

基于主流的谷歌浏览器运行展示以及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系统流程描述

  1.  5项目源码架构

  • 系统实现

4.1 程序主要类

4.1.1用户管理员类

@Data

@Entity

public class AdminUser implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id

    @GeneratedValue

    @Column

    private Integer id;

    @Column(nullable = false)

    private String username;

    @Column

    private String password;

    public AdminUser(Integer id, String username, String password) {

        this.id = id;

        this.username = username;

        this.password = password;

    }

    public AdminUser() {

        super();

    }    

4.1.4商品分类

/**

 * 分类

 */

@Entity

public class Classification implements Serializable {

    @Id

    @GeneratedValue

    @Column

    private Integer id;

    /**

     * 上级分类Id

     */

    @Column

    private Integer parentId;

    /**

     * 分类名称

     */

    @Column

    private String cname;

    /**

     * 类型 1一级分类 2二级分类

     */

    @Column

    private Integer type;

    

4.1.4订单类

/**

 * 订单

 */

@Entity

@Table(name = "`order`")

public class Order implements Serializable {

    @Id

    @GeneratedValue

    @Column

    private Integer id;

    /**

     * 订单总价

     */

    @Column

    private Double total;

    /**

     * 订单状态 1:未付款 2:等待发货 3:等待收货 4:订单完成

     */

    @Column

    private Integer state;

    /**

     * 订单时间

     */

    @Column

    private Date orderTime;

    /**

     * 收货人姓名

     */

    @Column(name = "`name`")

    private String name;

    /**

     * 收货人联系电话

     */

    @Column

    private String phone;

    /**

     * 收货地址

     */

    @Column

    private String addr;

    /**

     * 用户Id

     */

    @Column

    private Integer userId;   

4.1.4订单项类

/**

 * 订单项

 */

@Entity

public class OrderItem implements Serializable {

    @Id

    @GeneratedValue

    @Column

    private Integer id;

    /**

     * 订单Id

     */

    @Column

    private Integer orderId;

    /**

     * 商品Id

     */

    @Column

    private Integer productId;

    /**

     * 数量

     */

    @Column

    private Integer count;

    /**

     * 总价

     */

    @Column

    private Double subTotal;

    @Transient

    private Product product;   

4.1.4商品类

@Entity

@JsonIgnoreProperties({ "handler","hibernateLazyInitializer" })

public class Product implements Serializable {

    @Id

    @GeneratedValue

    @Column

    private Integer id;

    /**

     * 商品标题

     */

    @Column

    private String title;

    /**

     * 市场价

     */

    @Column

    private Double marketPrice;

    /**

     * 商城价

     */

    @Column

    private Double shopPrice;

    /**

     * 主图

     */

    @Column

    private String image;

    /**

     * 描述

     */

    @Column(name = "`desc`", columnDefinition = "text")

    private String desc;

    /**

     * 是否热门商品

     */

    @Column

    private Integer isHot;

    /**

     * 二级分类Id

     */

    @Column

    private Integer csid;

    /**

     * 商品创建日期

     */

    @Column

    private Date pdate;

4.1.4用户客户类

@Entity

public class User implements Serializable {

    @Id

    @GeneratedValue

    @Column

    private Integer id;

    /**

     * 用户名

     */

    @Column

    private String username;

    /**

     * 密码

     */

    @Column

    private String password;

    /**

     * 姓名

     */

    @Column

    private String name;

    /**

     * 邮件

     */

    @Column

    private String email;

    /**

     * 电话

     */

    @Column

    private String phone;

    /**

     * 地址

     */

    @Column

    private String addr;

4.3系统功能主要实现模块截图

4.3.1登陆页面

用户输入账号和密码和登录进行登录

4.3.1登录关键代码:

/**

     * 登录

     *

     * @param username

     * @param password

     */

    @RequestMapping("/login.do")

    public void login(String username,

                      String password,

                      HttpServletRequest request,

                      HttpServletResponse response) throws IOException {

        User user = userService.checkLogin(username, password);

        if (user != null) {

            //登录成功 重定向到首页

            request.getSession().setAttribute("user", user);

            response.sendRedirect("/mall/index.html");

        } else {

            throw new LoginException("登录失败! 用户名或者密码错误");

        }

}

4.3.2注册页面:

/**

     * 注册

     */

    @RequestMapping("/register.do")

    public void register(String username,

                         String password,

                         String name,

                         String phone,

                         String email,

                         String addr,

                         HttpServletResponse response) throws IOException {

        User user = new User();

        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部分关键源码展示:

4.3.4.1登录模块:

/**

     * 登录

     *

     * @param username

     * @param password

     */

    @RequestMapping("/login.do")

    public void login(String username,

                      String password,

                      HttpServletRequest request,

                      HttpServletResponse response) throws IOException {

        User user = userService.checkLogin(username, password);

        if (user != null) {

            //登录成功 重定向到首页

            request.getSession().setAttribute("user", user);

            response.sendRedirect("/mall/index.html");

        } else {

            throw new LoginException("登录失败! 用户名或者密码错误");

        }

}

4.3.4.2 springboot全局配置文件:

# \u8BBF\u95EE\u8DEF\u5F84\uFF0C\u7AEF\u53E3\u914D\u7F6E

server.context-path=/mall

server.port=8081

# \u6587\u4EF6\u4E0A\u4F20\u914D\u7F6E

spring.http.multipart.enabled=true

spring.http.multipart.max-file-size=100MB

spring.http.multipart.max-request-size=100MB

logging.level.priv.jesse.mall=DEBUG

# \u914D\u7F6E\u8F6Cjson\u7684\u65F6\u95F4\u683C\u5F0F

spring.jackson.time-zone=GMT+8

spring.jackson.date-format=yyyy-MM-dd HH: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

#H2

spring.datasource.url=jdbc:mysql://localhost:3307/mall?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

spring.datasource.username=root

spring.datasource.password=crit@2019

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#spring.h2.console.settings.web-allow-others=false

#spring.h2.console.path=/h2-console

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

#thymeleaf \u6A21\u677F\u5F15\u64CE\u8BBE\u7F6E

spring.thymeleaf.mode=HTML5

spring.thymeleaf.encoding=UTF-8

spring.thymeleaf.content-type=text/html

##\u5F00\u53D1\u65F6\u5173\u95ED\u7F13\u5B58,\u4E0D\u7136\u6CA1\u6CD5\u770B\u5230\u5B9E\u65F6\u9875\u9762

spring.thymeleaf.cache=false

##################### jpa hibernate \u914D\u7F6E #########################

spring.jpa.show-sql=false

spring.jpa.database=mysql

spring.jpa.properties.hibernate.format_sql=false

spring.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\u3002

spring.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\u5927

spring.datasource.druid.initial-size=1

spring.datasource.druid.max-active=20

spring.datasource.druid.min-idle=1

#\u914D\u7F6E\u83B7\u53D6\u8FDE\u63A5\u7B49\u5F85\u8D85\u65F6\u7684\u65F6\u95F4

spring.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\u79D2

spring.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\u79D2

spring.datasource.druid.min-evictable-idle-time-millis=300000

spring.datasource.druid.validation-query=SELECT 'x'

spring.datasource.druid.test-on-borrow=false

spring.datasource.druid.test-on-return=false

spring.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\u3002

spring.datasource.druid.pool-prepared-statements=false

spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20

#druid\u76D1\u63A7\u914D\u7F6E

spring.datasource.druid.filters=stat,slf4j

# WebStatFilter\u914D\u7F6E\uFF0C\u8BF4\u660E\u8BF7\u53C2\u8003Druid Wiki\uFF0C\u914D\u7F6E_\u914D\u7F6EWebStatFilter

spring.datasource.druid.web-stat-filter.enabled=true

spring.datasource.druid.filter.stat.log-slow-sql=true

spring.datasource.druid.filter.stat.slow-sql-millis=2000

# StatViewServlet\u914D\u7F6E\uFF0C\u8BF4\u660E\u8BF7\u53C2\u8003Druid Wiki\uFF0C\u914D\u7F6E_StatViewServlet\u914D\u7F6E

spring.datasource.druid.stat-view-servlet.enabled=true

spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*

spring.datasource.druid.stat-view-servlet.reset-enable=true

spring.datasource.druid.stat-view-servlet.login-username=druid

spring.datasource.druid.stat-view-servlet.login-password=123456

# Spring\u76D1\u63A7\u914D\u7F6E\uFF0C\u8BF4\u660E\u8BF7\u53C2\u8003Druid Github Wiki\uFF0C\u914D\u7F6E_Druid\u548CSpring\u5173\u8054\u76D1\u63A7\u914D\u7F6E

spring.datasource.druid.aop-patterns=priv.jesse.mall.service.impl.*

# druid\u65E5\u5FD7\u8F93\u51FA

spring.datasource.druid.filter.slf4j.enabled=true

spring.datasource.druid.filter.slf4j.result-set-log-enabled=false

spring.datasource.druid.filter.slf4j.statement-create-after-log-enabled=false

spring.datasource.druid.filter.slf4j.statement-close-after-log-enabled=false

spring.datasource.druid.filter.slf4j.result-set-open-after-log-enabled=false

spring.datasource.druid.filter.slf4j.result-set-close-after-log-enabled=false

##################druid\u8FDE\u63A5\u6C60\u914D\u7F6E\u7ED3\u675F############################

4.3.4.3 log4j2.xml日志配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="INFO">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %message%n"/>

        </Console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->

        <File name="log" fileName="log/test.log" append="true">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %message%xEx%n"/>

        </File>

    </Appenders>

    <Loggers>

        <Root level="INFO">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="log"/>

        </Root>

    </Loggers>

</Configuration>

4.3.4.4代码主启动类

/**

 * 程序启动入口

 *

 * @ServletComponentScan 设置启动时spring能够扫描到我们自己编写的servlet和filter, 用于Druid监控

 * @MapperScan("com.imlaidian.springbootdemo.dao") 扫描mybatis Mapper接口

 * @EnableScheduling 启用定时任务

 * @EnableTransactionManagement 开启事务

 *

 * @author hfb

 * @date 2017/9/18 11:13

 */

@ServletComponentScan

@EnableConfigurationProperties

@EnableTransactionManagement

@SpringBootApplication

public class MallApplication {

public static void main(String[] args) {

SpringApplication.run(MallApplication.class, args);

}

}

4.3.4.5 权限拦截控制器:

package priv.jesse.mall.filter;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.OutputStream;

import java.util.HashMap;

/**

 * 权限拦截器

 *

 * @author hfb

 * @date 2017/9/18

 */

@WebFilter

public class AuthorizationFilter implements Filter {

    public AuthorizationFilter() {

    }

    private static final Logger LOGGER = LoggerFactory.getLogger(AuthorizationFilter.class);

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;

        HttpServletResponse response = (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, new HashMap<>());

            return;

        }

        //除了拦截login.html 其他html都拦截

        StringBuffer url = request.getRequestURL();

        //System.out.println(url);

        String path = 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);

        }

    }

    /**

     * @param request

     * @param response

     * @param chain

     * @throws IOException

     * @throws ServletException

     */

    private void processAccessControl(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {

        Object adminUser = request.getSession().getAttribute("login_user");

        Object user = request.getSession().getAttribute("user");

        String url = 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);

            }

        }

    }

    @Override

    public void destroy() {

    }

    /**

     * 返回JOSN数据格式

     *

     * @param response

     * @param object

     * @throws IOException

     */

    public static void responseJSON(HttpServletResponse response, Object object) throws IOException {

        response.setContentType("application/json;charset=utf-8");

        response.setCharacterEncoding("UTF-8");

        ObjectMapper mapper = new ObjectMapper();

        if (object == null)

            return;

        String jsonStr = mapper.writeValueAsString(object);

        OutputStream out = 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)就行了。

没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,达到以空间换时间的目的。

〖例〗:有一张存放商品的基本表,“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

五、范式化设计和反范式化设计的优缺点

5.1 范式化

优点:

缺点:

5.2 反范式化

优点:

缺点:

数据库采用mysql5版本、满足数据库设计三范式。

编码采用utf8 -- UTF-8 Unicode

排序规则采用utf8_general_ci

4.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文件

/*

Navicat MySQL Data Transfer

Source Server         : jesse_root

Source Server Version : 50713

Source Host           : localhost:3306

Source Database       : mall

Target Server Type    : MYSQL

Target Server Version : 50713

File Encoding         : 65001

Date: 2017-11-26 16:23:18

*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for admin_user

-- ----------------------------

DROP TABLE IF EXISTS `admin_user`;

CREATE TABLE `admin_user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `password` varchar(255) DEFAULT NULL,

  `username` varchar(255) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of admin_user

-- ----------------------------

INSERT INTO `admin_user` VALUES ('1', 'admin', 'admin');

INSERT INTO `admin_user` VALUES ('2', 'hfb', 'hfb');

-- ----------------------------

-- Table structure for classification

-- ----------------------------

DROP TABLE IF EXISTS `classification`;

CREATE TABLE `classification` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `cname` varchar(255) DEFAULT NULL,

  `parent_id` int(11) DEFAULT NULL,

  `type` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of classification

-- ----------------------------

INSERT INTO `classification` VALUES ('1', '服装', '0', '1');

INSERT INTO `classification` VALUES ('2', '电脑', null, '1');

INSERT INTO `classification` VALUES ('3', '手机', null, '1');

INSERT INTO `classification` VALUES ('4', '食品', null, '1');

INSERT INTO `classification` VALUES ('5', '笔记本', '2', '2');

INSERT INTO `classification` VALUES ('6', '平板', '2', '2');

INSERT INTO `classification` VALUES ('7', '台式机', '2', '2');

INSERT INTO `classification` VALUES ('9', '家居', '0', '1');

INSERT INTO `classification` VALUES ('10', '饮料', '4', '2');

INSERT INTO `classification` VALUES ('11', '智能手机', '3', '2');

-- ----------------------------

-- Table structure for order

-- ----------------------------

DROP TABLE IF EXISTS `order`;

CREATE TABLE `order` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `addr` varchar(255) DEFAULT NULL,

  `name` varchar(255) DEFAULT NULL,

  `order_time` datetime DEFAULT NULL,

  `phone` varchar(255) DEFAULT NULL,

  `state` int(11) DEFAULT NULL,

  `total` double DEFAULT NULL,

  `user_id` int(11) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of order

-- ----------------------------

INSERT INTO `order` VALUES ('1', 'fjsdakl', '小明', '2017-11-25 19:23:48', '12345654', '4', '8888', '1');

INSERT INTO `order` VALUES ('2', 'kdls;ajfklafkasld', 'tom', '2017-11-25 22:10:39', '123456894', '2', '17998', '1');

INSERT INTO `order` VALUES ('3', 'ffggghhhhfdfhjhff', 'Catalina', '2017-11-25 22:52:44', '1234322313', '2', '6077', '1');

INSERT INTO `order` VALUES ('4', 'fdsakldfjasl;', 'tomcat', '2017-11-25 23:35:01', '1234567878', '4', '8999', '1');

INSERT INTO `order` VALUES ('5', 'Gggggggg', 'Hfb', '2017-11-26 02:53:14', '18679658549', '1', '5999', '1');

-- ----------------------------

-- Table structure for order_item

-- ----------------------------

DROP TABLE IF EXISTS `order_item`;

CREATE TABLE `order_item` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `count` int(11) DEFAULT NULL,

  `order_id` int(11) DEFAULT NULL,

  `product_id` int(11) DEFAULT NULL,

  `sub_total` double DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of order_item

-- ----------------------------

INSERT INTO `order_item` VALUES ('1', '1', '1', '10', '8888');

INSERT INTO `order_item` VALUES ('2', '2', '2', '9', '17998');

INSERT INTO `order_item` VALUES ('3', '2', '3', '11', '78');

INSERT INTO `order_item` VALUES ('4', '1', '3', '13', '5999');

INSERT INTO `order_item` VALUES ('5', '1', '4', '9', '8999');

INSERT INTO `order_item` VALUES ('6', '1', '5', '13', '5999');

-- ----------------------------

-- Table structure for product

-- ----------------------------

DROP TABLE IF EXISTS `product`;

CREATE TABLE `product` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `csid` int(11) DEFAULT NULL,

  `desc` varchar(1000) DEFAULT NULL,

  `image` varchar(255) DEFAULT NULL,

  `is_hot` int(11) DEFAULT NULL,

  `market_price` double DEFAULT NULL,

  `pdate` datetime DEFAULT NULL,

  `shop_price` bigint(20) DEFAULT NULL,

  `title` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of product

-- ----------------------------

INSERT INTO `product` VALUES ('9', '5', '新一代 Surface Pro 比以往更出色,它不仅仅是一台笔记本,还能在工作室模式和平板间灵活切换.\r\n\r\n随心所欲,百变菁英 震撼的 PixelSense™ 显示屏支持触控笔* 和触摸操作,设计方面也有所改进,与 Surface Pro 4 相比,速度和性能都得到了进一步提升,电池续航能力有较大提高。\r\n\r\n无风扇,更安静 灵感随意 随手拈来 \r\n\r\n快捷刷脸登陆 保护隐私 轻松唤醒刷脸登陆 充分保护您的私人数据**** 无论您喜欢摄影、绘画、音乐或创作\r\n\r\n精彩视频\r\nSurface Pro总能满足您诸多创作需求 Surface Pro 酷睿 m3 和 i5 型号配备全新无风扇冷却系统***,\r\ni7 型号改进了混合冷却系统,您可以更安静地工作或播放喜欢的节目。', '/mall/admin/product/img/0B1CDC0C82A79A25A4BA159D88D8AC.jpg', '1', '9999', '2017-11-25 00:37:57', '8999', '微软(Microsoft)新Surface Pro 二合一平板电脑 12.3英寸(Intel Core i5 8G内存 256G存储 )');

INSERT INTO `product` VALUES ('10', '11', '一直以来,我们都心存一个设想,期待着能够打造出这样一部 iPhone:它有整面的屏幕,能让你在使用时完全沉浸其中,仿佛忘记了它的存在。它是如此智能,你的一触、一碰、一言、一语,哪怕是轻轻一瞥,都会得到它心有灵犀的回应。而这个设想,终于随着 iPhone X 的到来成为了现实。现在,就跟未来见个面吧。', '/mall/admin/product/img/E98ECEAC9E68BE31BB623419FD0C9E.png', '1', '9999', '2017-11-24 22:17:54', '8888', 'Apple iPhone X (A1865) 64GB 银色 移动联通电信4G手机');

INSERT INTO `product` VALUES ('11', '10', '京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。\r\n划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。\r\n折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。\r\n异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。', '/mall/admin/product/img/EA03D40CEC55463A958B3629511493.jpg', '0', '40.9', '2017-11-25 22:37:23', '39', '可口可乐330ml*24听整箱装');

INSERT INTO `product` VALUES ('12', '7', '搭载NVIDIA GeForce GTX1060 3G独立显卡,强大的图像显示和处理功能,\r\n既可以高画质下流畅运行工作软件,也支持主流大型游戏,工作游戏,左右兼顾。\r\n并支持兼容主流VR眼镜设备,为你带来身临其境的沉浸体验。', '/mall/admin/product/img/3E1E590D6BD2ED1CF047045C83B313.jpg', '1', '4999', '2017-11-25 22:39:01', '3999', '惠普(HP)光影精灵580 吃鸡游戏主机(i5-7400 8G 128GSSD+1T GTX1060)');

INSERT INTO `product` VALUES ('13', '7', '原本就拥有强劲的基础性能,能够轻松通吃时下的主流电竞游戏;外观方面整机采用多面切割搭配碳纤铠甲风格,搭配“胜利之眼”游戏氛围灯,凸显电竞元素;最主要的是这是一款UIY电竞主机,机箱内部已经给升级留足了接口和空间,在官方配置的基础上我们还可以进行性能和外观方面的额升级,而且官方配件仍然能在保修范围内。品牌PC厂商参与到PC个性化定制和部件升级服务中来,同时提供品牌厂商一贯的服务优势,完全解决了DIY模式下遇到的种种痛点。不得不说联想拯救者刃 7000的出现,开启了PC UIY时代。', '/mall/admin/product/img/9F6B955F4C732FF96793FC8BB2F244.jpg', '1', '6499', '2017-11-25 22:41:06', '5999', '联想(Lenovo)拯救者刃7000 UIY主机( i7-7700 8G 128G SSD 1T硬盘 GTX1060 Win10)');

-- ----------------------------

-- Table structure for user

-- ----------------------------

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `addr` varchar(255) DEFAULT NULL,

  `email` varchar(255) DEFAULT NULL,

  `name` varchar(255) DEFAULT NULL,

  `password` varchar(255) DEFAULT NULL,

  `phone` varchar(255) DEFAULT NULL,

  `username` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------

-- Records of user

-- ----------------------------

INSERT INTO `user` VALUES ('1', 'wew6698888', '89****96@qq.com', 'skywalker', '123456', '17688970006', 'hfb');

INSERT INTO `user` VALUES ('2', '1235645645646', '89***96@qq.com', 'hfb', '123456', '18645954845', 'jesse');

INSERT INTO `user` VALUES ('3', '江西省 吉安市 泰和县', '8976677657@qq.com', '曾涛涛', '123456', '12345678941', 'ztt');

五、测试实例

测试一:

方案

登陆时,用户名或密码有一项为空或填写错误,系统是否出现预先设定的操作提示

预期效果 输入错误无法登陆

具体操作 用户名、密码、任意一项为空或者填写有误

结果 出现登录失败

结论 要求必须填写正确的用户名和密码,才能进入管理页面,测试成功

当用户名或密码输入错误或为空时提交界面

如图 所示。

测试二:

方案

修改商品信息﹑返回商品查询界面,看其是否更新成功

预期效果 修改过后能及时更新内容

具体操作 通过后台管理修改商品信息的内容,看其是否修改成功

结果 宠物信息内容更新为修改后的信息

结论 修改商品信息功能正常,测试成功

调试时在商品信息修改界面能修改商品信息,

在商品查询界面能及时更新显示修改后的信息。

测试三:

方案

管理员删除一注册用户后,并让其登陆,看是否登陆成功

预期效果 该用户不能再进行登陆

具体操作 管理员删除一会员表中的用户后,该用户在前台登陆

结果 该用户无法登陆

结论 用户数据删除功正常,测试成功

六.系统开发总结心得与体会

经过近期对 java 面向对象程序设计、前端知识以及JAVA springboot框架的掌握和学习,让我更加了解到 java 学习的重要性。在开发这个系统是哪个,我完成多个实验以及测试,在这个阶段的学习开发中,我从认识到熟悉,而后到能够自主运用。通过对 java 相关的了解,我发现它确实有很多方便之处,它集抽象性、封装性、继承性和多态性于一体,实现了代码重用和代码扩充,提高了软件开发的效率。对于我们这个专业来说学好 java 语言是很重要的,所以在开发这个项目的过程中我都尽力理解 java 编程思想、掌握基本技巧,尽量学到最多的知识。 我学习程序设计的基本目的就是培养描述实际问题的程序化解决方案的关键技能, java 面向对象程序设计是一门实践性比较强的语言、springMVC框架的MVC三层架构、将数据访问和逻辑操作都集中到组件中 , 增强了系统的复用性。使系统的扩展性大大增强。以及前端jQuery、js、css样式的掌握让我对网页的布局、样式调整、字体等让网页效果实现的更加精准。

六、参考献文

[1] 王博轩.家居电商网站系统设计与规划[J].2015-06-21 

[2] kymymooc.信息化时代的好处?[Z]. 2013.10.21.

[3]刘鑫.基于 javaweb的网上购物系统研究与设计[硕士学位论文 ][D].北京邮电大学,2013.5.

[4]徐远棋,曾海.网上毕业论文管理系统的设计与实现[J].微型电脑应用,2013(10):42-44.

[5] 胡彦玲.基于SSH框架的户外运动商城设计与实现 [J].信息通信,2013(10):98-99.

[6] 王靖华.旅游电子商务网络营销平台设计 [J]. 桂林航天工业学院学 报,2014(02):104-108.

[7] 于绍同.二三线城市网上购物信息系统的设计 [J]. 魅力中国, 2014(17):183-185.

[8] 穆粉 .档案数字化管理系统开发过程中的系统实现[J].消费电子, 2014(05):200-202.

[9] 葛丽霞 . 小议软件黑盒测试技术 [J]. 机械管理开发, 2012(03):200-201.

[10] 任俊. 软件单元测试及测试用例设计 [J]. 科技与企业, 2013(04):293+295.

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

V+zmm10134

感谢友友们的点赞关注和评论

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值