电商行业发展
近年来,中国的电子商务快速发展,交易额连创新高,电子商务在各领域的应用不断拓展和深化、相关服务业蓬勃发展、支撑体系不断健全完善、创新的动力和能力不断增强。
电子商务正在与实体经济深度融合,进入规模性发展阶段,对经济社会生活的影响不断增大,正成为我过经济发展的新引擎。
中国电子商务研究院中心数据显示,截止到2012年底,中国电子商务市场交易规模达7.85万亿人民币,同比增长30.83%。
其中B2B电子商务交易额达6.25万亿,同比增长27%。而2011年全年,中国电子商务市场交易额达6万亿人民币,同比增长33%,占GDP比重上升到13%;2012年,电子商务占GDP的比重已经高达15%。2013年我国电子商务规模已突破十万亿大关。
天猫双十一交易额
电商行业技术特点
- 技术新
- 技术范围广
- 分布式
- 高并发、集群、负载均衡、高可用
- 海量数据
- 业务复杂
- 系统安全
电商行业的模式
- B2B:企业到企业、商家到商家。代表:阿里巴巴、慧聪网
- B2C:商家到客户。代表:京东、淘宝商城。
- C2C:客户到客户。淘宝集市
- O2O:线上到线下。
易购商城的模式
易购网上商城是一个综合性的B2C平台,类似京东商城,天猫商城。会员可以在商城浏览商品、下订单、以及参加各种活动。管理员、运营可以在平台后台管理系统中管理商品、订单、会员等。客服可以在后台管理系统中处理用户的询问以及投诉。
功能模块
功能描述
- 后台管理系统:管理商品,订单,类目,商品规格属性,用户管理以及内容发布等功能。
- 前台系统:用户可以在前台系统中进行注册,登录,浏览商品,首页,下单等操作。
- 会员系统:用户可以在该系统中查询已下单,收藏的商品,我的优惠券,团购等信息。
- 订单系统:提供下单,查询订单,修改订单状态,定时处理订单。
- 搜索系统:提供商品的搜索功能。
- 单点登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息。
技术架构
- 传统架构
有什么问题?
- 模块之间耦合度太高,其中一个升级其他都得升级
- 开发困难,各个团队开发最后都要整合一起。
- 系统的扩展性差
- 不能灵活的进行分布式部署
解决方法:系统拆分
优点:
把模块拆分成独立的工程,单点运行,如果某一个点压力大可以对这一个点单独增加配置。其它的点不受影响。
把系统拆分成多个工程,要完成系统的工程需要多个工程协作完成,这种形式叫做分布式。
- 分布式架构
分布式架构:
把系统按照模块拆分成多个子系统
优点:
- 把模块拆分,使用接口通信,降低模块之间的耦合度。
- 把项目拆分成若干个子项目,不同的团队负责不同的子项目。
- 增加功能是只需要再增加一个子项目,调用其它系统的接口就可以了。
- 可以灵活的进行分布式部署。
缺点:
系统之间交互需要使用远程通信,接口开发增加工作量。
技术选型
- java(核心编程语言)
- spring,springmvc,mybatis(三大框架)
- Dubbo(分布式服务框架)
- Zookeeper(服务注册中心)
- Redis(缓存数据库)
- Solr(搜索引擎)
- SSO(单点登录)
- Mysql(数据库)
- Nginx(web服务器)
- Vsftp(文件上传服务器)
- Jquery,Bootstrap(前端框架)
- doT.js(模块引擎)
- UEditor(富文本编辑器)
- Google Kaptcha(图形验证码)
- 邮件发送
- geetest 极验验证
- 蚂蚁金服支付
开发工具
- intellij IDEA
- Maven 3.6.0
- JDK 1.8
- Jetty 6.1.26
- Tomcat 8.5.37
- Mysql 5.7.20
- Nginx 1.14.2
- Dubbo 2.6.0
- Zookeeper 3.4.13
- Redis 5.0.3
- Solr 7.6.0
- Win10(开发环境),Centos7.3-1611(部署环境)
注意:单独使用可以随意选择版本,如果咋集群下需要考虑多种技术之间的兼容性,比如:redis,solr可以使用单台服务器也可以使用多台服务器,使用多台服务器时需要考虑与其他技术的兼容性,或者统一都用高版本jar包,或者统一降低版本jar包,一高一低可能会出问题。
人员配置
- 产品经理:3人,确定需求以及给出产品原型图
- 项目经理:1人,项目管理
- 架构师:2人,负责解决技术难点与定制标准(开发准则,接口标准,技术选型)
- 前端团队:5人,根据产品经理给出的原型制作静态页面。
- 安卓团队:5人,开发android客户端
- IOS团队:5人,开发IOS客户端
- 后端团队:20人,实现整个系统业务功能
- 测试团队:5人,测试所有的功能,性能,安装
- 运维团队:3人,项目的发布以及维护
- 如果采用oracle,需要配备DBA:2人。
易购商城研发优势
商城系统优势:
- 节约成本
包括硬件成本和软件成本,硬件包括店面,房租,装修,纸张等最必须用品,软件包括网上商城购物系统,网络信息,图片,视频等,都可长期使用,良性循环,经济和环保。 - 营销推广经济,便捷
传统媒体广告费用高昂,更适合与进行品牌塑造,而网络营销主要是策略与定位把控问题,实惠很多,费用与传统媒体相比微乎其微,并且流量与用户也更加精准。 - 信息更加立体,全面
通过互联网,企业的信息展示,品牌塑造和形象宣传可以通过文字,图片,音频,视频等多维度进行现实与虚拟相结合的展示,使用户对企业的了解更加立体和全面,有助于形成良好的形象与口碑。 - 管理高效,便捷
运用信息化的数据库管理,各类形象精准,清晰,无误的保存,避免出现人工操作出现低级错误的情况,可随时查阅,核算,统计。
功能点
- 商家入驻
商家入驻功能包括:商家入驻申请流程,商家店铺自定义装修功能,多套店铺模板选择,商家店铺展示,商家独立店铺功能,店铺报表统计功能,搜索店铺列表页,商家自定义广告位,区分平台与商家分类,类型 ,订单分单功能,订单退换功能,商家订单佣金结算等。 - 会员中心
会员中心功能包括:会员中个人主页美化,会员中心订单列表美化,会员中心收货地址列表美化,会员中心缺货登记,会员中心退换货,会员中心退换货详情页,用户信息,新增会员头像上传功能,平台红包,物流跟踪功能,资金管理。 - 购物车
购物车功能包括:购物车选择购买功能,购物车加强功能,商品促销满减,满赠,折扣功能,凑单功能,简化购物流程,购物车为空时去购物功能,提示购物车商品是否有库存。 - 订单
订单功能包括:商家自定义配送方式和运费,门店自提功能,发票功能,商品无库存时提交订单弹窗提示继续购物,结算页面无货提交弹出框,快递配送方式选择如韵达。 - 积分商城
积分商城功能包括:积分商品列表,兑换商品排序,精品推荐,热门兑换,兑换商品详情页。 - 拍卖活动
拍卖活动功能包括:拍卖活动列表,竞拍商品排序和搜索,拍卖商品详情页,出价记录,商家店铺。 - 优惠活动
优惠活动功能包括:优惠活动列表页,优惠范围,优惠方式。
项目架构搭建
- 父工程:ego-parent.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ego</groupId>
<artifactId>ego-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>ego-common</module>
<module>ego-manager</module>
</modules>
<!--集中定义依赖组件版本号-->
<properties>
<junit.version>4.12</junit.version>
<spring-version>4.3.4.RELEASE</spring-version>
<hibernate-validator.version>5.3.3.Final</hibernate-validator.version>
<mybatis-spring.version>1.3.0</mybatis-spring.version>
<mybatis.version>3.4.1</mybatis.version>
<servlet.version>3.0.1</servlet.version>
<jstl.version>1.2</jstl.version>
<standard.version>1.1.2</standard.version>
<slf4j-log4j12.version>1.7.22</slf4j-log4j12.version>
<jackson.version>2.8.5</jackson.version>
<druid.version>1.0.27</druid.version>
<mysql.version>5.1.8</mysql.version>
<pagehelper.version>4.1.6</pagehelper.version>
<commons-fileupload.version>1.3.2</commons-fileupload.version>
<jedis.version>2.9.1</jedis.version>
<springdata-redis.version>1.8.18.RELEASE</springdata-redis.version>
<solrj.version>7.6.0</solrj.version>
<jdk.version>1.8</jdk.version>
<maven-compiler-plugin.version>3.5.1</maven-compiler-plugin.version>
<poi.version>3.15</poi.version>
<commons-net.version>3.3</commons-net.version>
<commons-logging.version>1.2</commons-logging.version>
</properties>
<!--只定义依赖的版本,并不实际依赖-->
<dependencyManagement>
<dependencies>
<!--servlet api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!--jsp相关-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring-version}</version>
</dependency>
<!--使用hibernate的数据验证框架-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
<!--jachson json处理工具包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!--junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!--日志处理-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--文件上传组件-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!--redis客户端-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!--spring data redis 依赖-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${springdata-redis.version}</version>
</dependency>
<!--solr客户端-->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<!--Apache其他组件-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons-net.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons-logging.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
- 子工程:ego-common.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ego-parent</artifactId>
<groupId>com.ego</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ego-common</artifactId>
<name>ego-common</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<!--分页工具-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
</dependency>
<!--添加依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!--redis客户端-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!--servlet api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
- 子工程:ego-manager.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ego-parent</artifactId>
<groupId>com.ego</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ego-manager</artifactId>
<packaging>pom</packaging>
<modules>
<module>ego-manager-pojo</module>
<module>ego-manager-mapper</module>
<module>ego-manager-service</module>
<module>ego-manager-web</module>
</modules>
<dependencies>
<dependency>
<groupId>com.ego</groupId>
<artifactId>ego-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
- ego-manager子工程:ego-manager-mapper.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ego-manager</artifactId>
<groupId>com.ego</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ego-manager-mapper</artifactId>
<name>ego-manager-mapper</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.ego</groupId>
<artifactId>ego-manager-pojo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--mybatis 依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--druid 连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!--分页工具-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
</dependency>
</dependencies>
</project>
- ego-manager子工程:ego-manager-pojo.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ego-manager</artifactId>
<groupId>com.ego</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ego-manager-pojo</artifactId>
<name>ego-manager-pojo</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
- ego-manager子工程:ego-manager-service.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ego-manager</artifactId>
<groupId>com.ego</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ego-manager-service</artifactId>
<name>ego-manager-service</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.ego</groupId>
<artifactId>ego-manager-mapper</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--spring 依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!--日志打印-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>
</project>
- ego-manager子工程:ego-manager-web.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ego-manager</artifactId>
<groupId>com.ego</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ego-manager-web</artifactId>
<packaging>war</packaging>
<name>ego-manager-web Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.ego</groupId>
<artifactId>ego-manager-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
</dependency>
</dependencies>
<build>
<finalName>ego-manager-web</finalName>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<!--项目访问的路径-->
<contextPath>/ego-manager-web</contextPath>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 已下好