1如何学习电商系统
做任何的系统,都有一套相对固定的流程。
(1)确定需求
(2)画出原型,制作静态页面。
(3)根据静态页面,画出E-R图,创建数据库。
(4)确定系统架构
(5)确定技术选型
(6)项目组分配任务
(7)确定开发环境,统一版本
(8)开发功能模块
(9)测试
(10)预发布
(11)上线
(12)运维
我们就按照这个流程来学习、开发电商项目。
2开发流程
2.1确定需求
互联网电商系统的需求,一般从两个方面考虑:并发能力+功能需求。
2.1.1并发能力
所谓的并发,就是单位时间内,同时访问服务器的总次数。
本系统并发需求800-1000次/秒。(实际开发中由甲方客户确定)
2.1.2功能需求
核心功能:
(1)用户访问门户系统,可以搜索、浏览商品,并将商品添加到购物车。
(2)用户通过身份认证之后,可以下订单、支付。
(3)要完成身份认证,必须实现注册登陆功能。
(4)后台系统中,可以实现对商品、订单等的管理。
(5)CMS系统管理门户系统中的内容(商品、广告、链接等)。
2.2画出原型,制作静态页面
2.2.1后台系统页面
2.2.1.1主界面
2.2.1.2商品模块
(1)商品列表
[图片上传失败...(image-c091c6-1563872349515)]
(2)商品规格参数列表
(3)新增商品
--主界面
--商品类目
2.2.1.3CMS系统(Content Manager System)
--内容分类管理
--内容列表
2.2.2门户系统
(1)用户登陆
(2)用户注册
(3)搜索页面
(4)购物车
(5)订单页面
2.3画出E-R图,创建数据库
(1)既然是购物平台,肯定有一张商品表
(2)每一个商品对应一个分类,需要一张商品分类表
(3)每一类商品,都对应一个规格参数的模板。需要一张参数模板表
(4)每一个商品的规格参数值都是不一样的,所以需要一张规格参数值表。
(5)每一个商品都对应有一个详细的描述信息,所以需要一张描述信息表。
目的:将大文本的描述信息抽出来,减小商品表的体积,从而提供商品表的检索效率。
(6)CMS需要一张内容分类表
(7)每一个内容分类,都有一组具体的内容,所以需要一张内容表。
(8)用户要登陆,需要一张用户表
(9)用户下单,需要一张订单表
(10)一个订单中,可以有多个商品,所以需要一张订单项表。
(11)每一个订单都有一个收件地址,需要需要一张收件人表。
注意:本项目中,数据库已经设计好,将sql文件导入本地数据库即可。
2.4选择系统架构
2.4.1单一系统架构
整个项目只有一个应用,不同的功能模块以包为单位,写在同一个系统中。
单一系统架构
2.4.2分布式架构
分布式指的是将一个系统拆分成多个不同的子系统,部署到不同的服务器上,系统之间通过接口的形式,相互调用。
分布式架构
好处:
(1)各系统之间相互独立,以接口相互调用,代码入侵少,耦合度低。
(2)拓展性能好,新增一个功能模块时,只需要将该子系统接入即可。
(3)可以进行灵活的分布式部署和负载均衡实现。
(4)项目组分小组开发子系统,沟通成本低。
劣势:
调用接口的时候,必须开发接口,意味着增加工作量。
2.4.3确定选型后的架构图
图1-5 易购商城系统架构
核心系统描述:
后台管理系统:
管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。
前台系统:
用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作。
会员系统:
用户可以在该系统中查询已下的订单、收藏商品、我的优惠券、团购等信息。
订单系统:
提供下单、查询订单、修改订单状态、定时处理订单。
搜索系统:
提供商品的搜索功能。
单点登录系统:
为多个系统之间提供用户登录凭证以及查询登录用户的信息。
2.5技术选型(主要技术)
Spring、SpringMVC、Mybatis-Plus
JSP、JSTL、jQuery、jQuery plugin、EasyUI、KindEditor(富文本编辑器)、CSS+DIV
Redis(缓存服务器)
Solr(搜索)
Activemq(消息推送)
Httpclient、jsonp(调用系统服务,系统之间相互调用)
Mysql
tenginx(web服务器)
Linux(项目最终部署的地方)
2.6项目组任务分配
产品经理:2人,确定需求以及给出产品原型图。
项目经理:1人,项目管理。
前端团队:3人,根据产品经理给出的原型制作静态页面。
后端团队:6-8人,实现产品功能。
测试团队:2人,测试所有的功能。
运维团队:2人,项目的发布以及维护。
开发周期6-8个月。
2.7确定开发环境
2.7.1确定jdk版本
--说明:这里我们选择jdk1.8。(先安装jdk1.8)
注意:确定安装的是jdk,而不是jre
[图片上传失败...(image-fe779f-1563872349514)]
2.7.2安装Maven插件
2.7.2.1第一步:安装maven到本地磁盘
(1)解压Maven安装包
(2)解压老师提供的Maven仓库。(jar包齐全,不用从中央仓库下载)
(3)修改/conf/setting.xml文件,指定仓库地址。
D:\install\maven\maven_repository
(4)修改/conf/setting.xml文件,修改中央仓库为阿里云
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
(5)修改/conf/setting.xml文件,修改jdk版本为1.8
jdk-1.8
true
1.8
1.8
1.8
1.8
2.7.2.2第二步:在Eclipse中安装Maven插件
(1)安装maven插件
(2)添加本地的maven到Eclipse中
(3)指定默认的Maven插件
(4)加载Maven的配置setting.xml,更新本地仓库
2.8功能开发
根据确定之后的需求和任务分配,完成功能模块的开发。
3后台管理系统搭建
3.1后台系统结构
说明:
(1)ego-project是全局项目,是一个聚合工程,用来管理分布式下的所有子系统。
(2)ego-base是公共组件系统,定义工具类、pojo和mapper等。
(3)ego-manager是后台管理系统,依赖ego-base系统,通过maven坐标引入。
3.2配置步骤说明
(1)创建ego-project聚合系统
(2)创建ego-base公共系统
(3)创建ego-manager后台管理系统
3.3配置步骤
3.3.1第一部分:创建ego-project聚合工程
3.3.1.1第一步:创建项目
使用Maven创建项目(选择pom模型)
3.3.1.2第二步:集中定义jar、插件版本(锁定版本号)
修改pom.xml文件
4.0.0
cn.gzsxt.ego
ego-project
1.0
pom
4.12
4.3.16.RELEASE
2.3
5.1.40
1.6.4
2.9.5
1.0.9
4.3.5
1.2
2.5
2.0
2.5
3.3.2
1.3.2
3.3
1.3.1
2.7.2
4.10.3
joda-time
joda-time
${joda-time.version}
org.apache.commons
commons-lang3
${commons-lang3.version}
org.apache.commons
commons-io
${commons-io.version}
commons-net
commons-net
${commons-net.version}
com.fasterxml.jackson.core
jackson-databind
${jackson.version}
org.apache.httpcomponents
httpclient
${httpclient.version}
junit
junit
${junit.version}
test
org.slf4j
slf4j-log4j12
${slf4j.version}
com.baomidou
mybatis-plus
${mybatis.plus.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-aspects
${spring.version}
jstl
jstl
${jstl.version}
javax.servlet
servlet-api
${servlet-api.version}
provided
javax.servlet
jsp-api
${jsp-api.version}
provided
commons-fileupload
commons-fileupload
${commons-fileupload.version}
redis.clients
jedis
${jedis.version}
org.apache.solr
solr-solrj
${solrj.version}
${project.artifactId}
org.apache.maven.plugins
maven-resources-plugin
2.7
UTF-8
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.8
UTF-8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
3.3.2第二部分:创建ego-base工程
说明:ego-base是聚合工程中的一个子系统,使用maven module创建
3.3.2.1第一步:创建项目
3.3.3第三部分:创建后台管理系统
3.3.3.1第一步:创建ego-manager(war模型)
(1)使用Maven module创建
(2)在/WEB-INF/路径下,添加一个web.xml文件
(3)修改pom.xml文件,添加ego-base依赖,通过maven坐标引入
4.0.0
cn.gzsxt.ego
ego-project
1.0
ego-manager
war
cn.gzsxt.ego
ego-base
1.0
3.4编译ego-project工程
(1)更新ego-project聚合工程
(2)安装到本地仓库(maven clean、maven install)
(3)编译成功
4ego-manager整合
4.1整合步骤说明
(1)搭建环境。(导包、静态资源+jsp)
(2)Spring整合SpringMVC
(3)Spring整合Mybatis-plus
(4)整合测试
4.2第一部分:搭建环境
4.2.1第一步:导入jar包
(1)导入的包说明:
Spring核心包(4个)
Common-logging日志包
Spring事物+jdbc
Spring切面+AOP
Mybatis-plus核心包
Jdbc驱动+连接池druid
Jsp+servlet+jstl
(2)修改pom.xml文件
4.0.0
cn.gzsxt.ego
ego-project
1.0
ego-manager
war
cn.gzsxt.ego
ego-base
1.0
jstl
jstl
javax.servlet
servlet-api
provided
javax.servlet
jsp-api
provided
org.springframework
spring-context
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-webmvc
com.baomidou
mybatis-plus
mysql
mysql-connector-java
com.alibaba
druid
4.2.2第二步:导入静态资源、jsp页面
说明:静态资源、jsp页面,都放到/WEB-INF/路径下
4.3第二部分:Spring整合SpringMVC
4.3.1第一步:在src目录下创建spring-mvc.xml文件
4.3.2第二步:配置Springmvc核心控制器
修改web.xml文件
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
characterEncodingFilter
/*
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-*.xml
1
dispatcherServlet
/
4.3.3第三步:整合测试
需求:访问后台管理系统首页。
4.3.3.1Step1:创建PageController类
package cn.gzsxt.manager.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PageController {
@RequestMapping("/")
public String showIndex(){
System.out.println("跳转到后台管理系统首页!");
return "index";
}
}
4.3.3.2Step2:配置Tomcat插件启动项目
修改ego-manager项目的pom.xml文件,添加tomcat插件
4.0.0
cn.gzsxt.ego
ego-project
1.0
ego-manager
war
org.apache.tomcat.maven
tomcat7-maven-plugin
8080
/
UTF-8
4.3.3.3Step3:重新编译ego-manager项目
[图片上传失败...(image-475a8e-1563872474259)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-7fdce1320e5c758c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4.3.3.4Step4:启动项目
说明:通过tomcat插件启动项目。
[图片上传失败...(image-32caba-1563872474259)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-db46649222cdb641.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4.3.3.5Step5:访问index首页
后台地址:[http://localhost:8080/](http://localhost:8080/)
[图片上传失败...(image-1d4cb2-1563872474259)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-9123c5a54e062957.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
--Spring整合Springmvc成功!!!
4.3.3.6Step6:访问其它页面
(1)修改PageController,使用路径变量绑定要访问页面
package cn.gzsxt.manager.controller;
import javax.swing.plaf.synth.SynthStyle;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PageController {
@RequestMapping("/")
public String showIndex(){
System.out.println("跳转到首页index");
return "index";
}
/**
* 请求路径格式: http://localhost:8080/item-list
* @param page
* @return
*/
@RequestMapping("/{page}")
public String showPage(@PathVariable("page")String page){
System.out.println("跳转到"+page+".jsp页面");
return page;
}
}
--测试:访问添加商品页面
[图片上传失败...(image-83e69a-1563872474259)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-944d6902d2d4bbaf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4.4第三部分: Mybatis-plus整合Spring
思路:
(1)配置数据源
(2)配置会话工厂
(3)配置Mybaits动态代理
(4)配置事物代理
4.4.1第一步:创建resource.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ego
jdbc.username=root
jdbc.password=gzsxt
4.4.2第二步:创建spring-data.xml文件
4.5第四部分:SSM整合测试
4.5.1需求
根据id查询商品信息。
4.5.2配置步骤
4.5.2.1第一步:创建Item类
package cn.gzsxt.manager.pojo;
import java.util.Date;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
@TableName(value="tb_item")
public class Item {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String title;
@TableField(value = "sell_point")
private String sellPoint;
private long price;
private int num;
private String barcode;
private String image;
private long cid;
private byte status;
private Date created;
private Date updated;
public Item() {
super();
}
// 补全get、set方法
}
4.5.2.2第二步:创建ItemMapper接口
package cn.gzsxt.manager.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import cn.gzsxt.manager.pojo.Item;
public interface ItemMapper extends BaseMapper- {
}
4.5.2.3第三步:创建ItemService接口及其实现类
(1)创建ItemService
package cn.gzsxt.manager.service;
import com.baomidou.mybatisplus.service.IService;
import cn.gzsxt.base.pojo.Item;
import cn.gzsxt.base.vo.EUDataGridResult;
public interface ItemService extends IService
- {
}
(2)创建ItemServiceImpl类
package cn.gzsxt.manager.service;
import org.springframework.stereotype.Service;
import cn.gzsxt.manager.mapper.ItemMapper;
import cn.gzsxt.manager.pojo.Item;
@Service
public class ItemServiceImpl extends ServiceImpl
implements ItemService{
}
4.5.2.4第四步:创建ItremController类
package cn.gzsxt.manager.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.gzsxt.manager.pojo.Item;
import cn.gzsxt.manager.service.ItemService;
@Controller
@RequestMapping("/item")
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/{id}")
@ResponseBody
public Item getById(@PathVariable("id")Long id){
Item item = itemService.selectById(id);
return item;
}
}
4.5.2.5第五步:重新编译项目、安装到本地仓库
4.5.3整合测试
重启项目,浏览器访问地址 [http://localhost:8080/item/](http://localhost:8080/item/) 536563
4.5.3.1碰到的问题及解决办法
(1)json对象转换异常
[图片上传失败...(image-9f77fb-1563872474258)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-f695f17e48a4c8cb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
原因:
Springmvc返回json对象时,需要添加jackson依赖。
解决办法:
在ego-manager工程中,修改pom.xml文件,添加Jackson依赖。
com.fasterxml.jackson.core
jackson-databind
4.5.3.2测试结果
[图片上传失败...(image-9536a7-1563872474258)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-4981f88d12c2da85.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
SSM整合成功!!!
5配置ego-base工程
5.1必要性
除了ego-manager系统外,其它的子系统也需要用到pojo、mapper。
因此,在ego-base中创建pojo、mapper,就只需要创建一次了。
5.2配置步骤
配置步骤说明:
(1)将pojo、mapper复制到ego-base工程对应的包路径下。
(2)修改ego-manager扫描路径
5.2.1第一步:复制pojo、mapper到ego-base中
[图片上传失败...(image-b3920d-1563872474258)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-6b4bdcae2cd4fe53.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5.2.2第二步:添加mybatis-plus依赖
修改pom.xml文件
4.0.0
cn.gzsxt.ego
ego-project
1.0
ego-base
com.baomidou
mybatis-plus
5.2.3第三步:修改ego-project工程中pojo、mapper扫描路径
--修改spring-data.xml文件
重新编译ego-project工程即可!!!
6查询商品列表实现
6.1前端js实现
商品列表使用EasyUI-datagrid插件来加载。
[图片上传失败...(image-8db4d0-1563872474257)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-bd1427d39dc4b1bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
EasyUI-datagrid插件对返回数据格式要求为:
{total:”2”,rows:[{“id”:”1”,”name”,”张三”},{“id”:”2”,”name”,”李四”}]}
6.2后台java实现
6.2.1代码结构
Controller:接收参数,接收分页信息,响应实体数据
Service:业务处理,分页处理
Mapper:逆向工程生成,不需要开发。
|
请求路径
|
/item/list
|
|
请求方式
|
Get请求
|
|
请求参数
|
page=1&rows=30 (easyui-datagrid插件规定)
|
|
返回值
|
{total:”2”,rows:List>}
|
注意:请求参数在jquery.easyui.min.js中定义,如下图:
[图片上传失败...(image-18c904-1563872474257)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-e2f08b48c623cf67.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
响应值格式,也在jquery.easyui.min.js中定义,如下图:
[图片上传失败...(image-aa3d1d-1563872474257)]
![image.png](https://upload-images.jianshu.io/upload_images/17397216-2e386c4ef3923475.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
6.2.2创建返回结果类型pojo
在ego-base工程中创建。
package cn.gzsxt.base.vo;
import java.util.List;
/**
*
* 自定义EasyUIDateGrid支持的数据结果集
*/
public class EUDataGridResult {
private long total;
private List> rows;
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List> getRows() {
return rows;
}
public void setRows(List> rows) {
this.rows = rows;
}
}
6.2.3Service层实现
public EUDataGridResult listAndPage(int curPage,int rows){
EUDataGridResult result = new EUDataGridResult();
Page- page = selectPage(new Page
- (cpage,rows));
result.setRows(page.getRecords());
result.setTotal(page.getTotal());
return result;
}
###6.2.4controller层实现
@RequestMapping("/list")
@ResponseBody
public EUDataGridResult listAndPage(int page,int rows){
EUDataGridResult result = itemService.listAndPage(page, rows);
return result;
}
###6.2.5测试效果,如下图
![image.png](https://upload-images.jianshu.io/upload_images/17397216-ddaeca5d82b09bb7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)