第一天:电商行业的背景。淘淘商城的介绍。搭建项目工程。Svn的使用
电商行业的背景
电商就是把线下的商业模式搬到线上。2014年双11支付宝交易峰值285万笔/分钟,相比去年双11期间79万笔/分钟的交易峰值,系统的支撑能力达到了去年3倍以上
电商特点:并发量大、数据量大
淘淘商城的介绍
电商行业的模式:
B2B:企业到企业,商家到商家,企业间交易。代表:阿里巴巴、慧聪网。bussiness--企业 client--客户
B2C:商家到客户。代表:京东、淘宝商城(B2B2C)。淘宝自己有商城,商家入驻,然后再卖
C2C:客户到客户。代表:淘宝集市。(集市:不需要办牌照,谁都可以卖,入驻淘宝商城必须要能开得出发票)
O2O:线上到线下。类似B2C,只是它线下可以提货也可以网上订购,新概念而已。
淘淘商城的模式
淘淘网上商城是一个综合性的B2C平台,类似京东商城、天猫商城。会员可以在商城 浏览商品、下订单,以及参加各种活动。(自己采购,自己卖东西,自己配送(当然,成本高))
管理员、运营可以在 平台后台 管理系统中管理商品、订单、会员等。
客服可以在后台管理系统中处理用户的询问以及投诉。(写简历可以写这些)
功能模块
这是一个B2C的架构,分前台和后台,一个网站并不是都分前台与后台,后台不是必须的,如果没有前台有添加东西需要请自动手非常不方便,我做一个后台让不懂技术的也能管理网站,其实一个商城的后台与传统的项目没有什么区别,只是有一个CMS(管理前台的,这里操作对前台有影响)系统有区别。
功能描述
后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。
前台系统:用户可以在前台系统中进行注册、登录、浏览商品、首页、下单等操作。
会员系统:用户可以在该系统中查询已下的订单、收藏的商品、我的优惠券、团购等信息。
订单系统:提供下单、查询订单、修改订单状态、定时处理订单。
搜索系统:提供商品的搜索功能。
单点登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息。
传统架构
思考:有什么问题?
1、 模块之间耦合度太高,其中一个升级其他都得升级
2、 开发困难,各个团队开发最后都要整合一起
3、 系统的扩展性差
4、 不能灵活的进行分布式部署。
1.1.1 分布式的架构:把系统按照模块拆分成多个子系统
优点:把模块拆分成独立的工程,单点运行。如果某一个点压力大可以对这一个点单独增加配置。其他的点不受影响。
缺点:1、系统之间交互需要额外的工作量来进行接口的开发。2、把系统拆分成多个工程,要完成系统的工程需要多个工程协作完成。这种形式叫做分布式。(淘宝这10年讲的就是淘宝的架构变化,淘宝用的数据库是mysql,如果老板问mysql行不行,就回答淘宝用mysql,能做得过淘宝,现在也不是说oracle卖不出去了,oracle一般对行业用户,比喻经融行业,银行行业,不在乎钱,用最好的,oracle比mysql性能好很多)
技术选型(主要技术)
没有一个网站用EasyUI、KindEditor做首页的,都是用来做后台;新浪微博用Redis;很多大的网站都在使用Nginx是一个反向代理工具
开发工具和环境
1.1 人员配置(本项目来自:我友商城)
----------------------------------------------------------------------------------------干活------------------------------------
//搭建工程,实现分布式架构,而分布式架构又有很多工程
如果像之前一个一个创建web工程,管理很麻烦,各个工程之间的依赖关系都很麻烦 就要使用maven
4、后台管理系统工程搭建
Maven功能
1、依赖管理、jar包、工程之间的依赖。2、项目构建。实现项目的一步构建。3、工程聚合(今天用)、继承、依赖。
Maven的工程类型:
1、war包工程(web工程)2、Jar包工程(java工程)3、Pom工程。(聚合工程,父工程lib有依赖、继承、聚合)
//在web创建工程之前,在公司内jar包要统一版本,maven插件要统一版本,那么怎么才能统一版本呢?所以要创建一个父工程
父工程的搭建
父工程(公司级别)应该是一个pom工程。在父工程中定义依赖的jar包的版本信息。Maven插件的版本。我们就不需要版本信息了,只需要groupId和文件版本在父工程中定义了。//新建工程之前,建好仓库
安装本地仓库
本次没有使用提供的eclipsemars版本,而是用之前的版本,jdk用的1.8
使用.m2覆盖本地仓库的内容。(C:\Users\2568833032\.m2)
创建maven工程
new ---->others---->搜maven---->选maven project(不要点下一步,先钩在下一步,下一步就是选模板了)
修改pom文件(这样父工程就建好了)
<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.taotao</groupId> <artifactId>taotao-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!-- 集中定义依赖版本号,其实就是属性,然后在dependencyManagement标签里面会 引用这些属性,在上面把版本该了,下面的所用功能都得改 --> <properties> <junit.version>4.12</junit.version> <spring.version>4.1.3.RELEASE</spring.version> <mybatis.version>3.2.8</mybatis.version> <mybatis.spring.version>1.2.2</mybatis.spring.version> <mybatis.paginator.version>1.2.15</mybatis.paginator.version> <mysql.version>5.1.32</mysql.version> <slf4j.version>1.6.4</slf4j.version> <jackson.version>2.4.2</jackson.version> <druid.version>1.0.9</druid.version> <httpclient.version>4.3.5</httpclient.version> <jstl.version>1.2</jstl.version> <servlet-api.version>2.5</servlet-api.version> <jsp-api.version>2.0</jsp-api.version> <joda-time.version>2.5</joda-time.version> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-io.version>1.3.2</commons-io.version> <commons-net.version>3.3</commons-net.version> <pagehelper.version>3.4.2-fix</pagehelper.version> <jsqlparser.version>0.9.1</jsqlparser.version> <commons-fileupload.version>1.3.1</commons-fileupload.version> <jedis.version>2.7.2</jedis.version> <solrj.version>4.10.3</solrj.version> </properties> <!-- 只是定义依赖版本号 并不实际依赖 放入dependency里面才是实际依赖,maven那个依赖还没有出来--> <dependencyManagement> <dependencies> <!-- 时间操作组件(用这个组件操作时间很简单,不用simpledateformat还要转换了) --> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>${joda-time.version}</version> </dependency> <!-- Apache工具组件 (封装了对字符串的操作) --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>${commons-io.version}</version> </dependency> <!-- net 是通信用的,比喻http服务,我们用ftp服务就会用到这个包里的东西 --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>${commons-net.version}</version> </dependency> <!-- Jackson Json处理工具包(springMVC中把对象转换成json就用这个我们在springmvc中 发过rest形式的url,url模板映射,返回responsebody。response想用json数据就要jackson 这个包放入工程里面,如果没有这个jackson包就会报406错误) --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <!-- httpclient 是调用服务用的,一个客户端--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>${httpclient.version}</version> </dependency> <!-- 单元测试 --> <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.version}</version> </dependency> <!-- Mybatis 核心包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- Mybatis整合包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> <version>${mybatis.paginator.version}</version> </dependency> <!-- 分页插件 暂时估计没见过--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</version> </dependency> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 连接池 这个是druid连接池,这个连接池是阿里开发的连接池之前用dpcp和c3p0--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</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-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!-- JSP相关 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>${servlet-api.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>${jsp-api.version}</version> <scope>provided</scope> </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> <!-- solr客户端 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>${solrj.version}</version> </dependency> </dependencies> </dependencyManagement> <build> <finalName>${project.artifactId}</finalName> <!-- 里面装的是资源插件,会把工程里面用到的资源拷贝过去 --> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- java编译插件,如果不加这个插件,默认的java编译版本是1.5,现在只要你的工程继承我们 这个工程,那么它的jdk的版本就会变成1.7--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <pluginManagement><!--只是定义版本,并不实际依赖,和上面dependencyManagement一样 --> <plugins> <!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
//截止目前,后台管理父工程就建好了。现在想:每个工程里边有好多工具类,这些工具类可能不止一个工程能用到,比如文件的处理、图片的处理、上传下载的处理、json与java对象的互相转换,这些可能在所有的项目工程中用到。有开发经验的都是在每个项目中建立一个common包,以前是把一个项目里面包里面的东西复制到另一个项目。maven就是管理依赖的,我们可以把common包里面的所有工具类打成一个jar包,让其它的项目都依赖这个jar包,这样就不需要再拷贝了,只要依赖common包即可。我们现在就创建一个工程里面放入一些通用工具类。
4.4创建一个common工程
也需要继承taotao-parent工程
创建工程
taotao-common Pom.xml文件,略
4.5 后台管理工程创建(管理工程taotao-manager)
1。创建工程,工程搭建
2。修改pom文件,依赖commons工程
3。创建pojo模块。
首先创建pojo模块,pojo是不依赖其它包的
怎么创建一个工程的模块呢? 在工程上右键--->new--->other---maven model
在工作空间中taotao-manager-pojo这个项目并没有出现,而是taotao-manager工程的一个文件夹,在ide中只不过是让它显示出来而已,pojo本来就是一个简单java类,所以不必要依赖其它工程,和jar包,所以pom.xml文件不必修改
4.创建taotao-manager-mapper模块
创建方式和创建taotao-manager-pojo相同,然后多了对此模块的pom.xml文件的修改
pom.xml里面添加了对taotao-manager-pojo的依赖、 mybatis、mybatis-spring整合包、分页插件、mysql驱动、数据库连接池 这些的依赖
5.创建taotao-manager-service模块
创建方式还是相同,对pom.xml的修改如下
6.创建taotao-manager-web模块
创建好了以后,对该web模块的pom.xml进行依赖添加(附:聚合工程中必须要有一个war包)
好了会发现,在pom.xml里面会报错,由于打的是war包,所以缺少web.xml这个文件
测试项目工程
要运行工程,需要运行聚合工程也就是 taotao-manager,之前的操作是把它部署到server下,现在我们使用maven的tomcat插件,这样就不需要安装tomcat。、
要想运行首先创建一个欢迎页面,欢迎页面首先新建一个index.jsp在taotao-manager-web下的webapp下
要运行taotao-manager需要运行聚合工程-------taotao-manager
Tomcat 插件
在taotao-manager工程的pom文件中添加如下内容
启动工程
右键--Run As----maven build---在页面中输入maven命令
clean tomcat7:run(说明clean表示把第一次编译清空,然后在运行)
tomcat7 指定使用 tomcat7 的插件 (发现报错了)
他要运行去本地仓库去找taotao-parent,而本地仓库没有(还在我们工程里面,我们还没有安装),现在需要把taotao-parent安装到本地仓库
此时运行还是会报错,原因就是刚才安装的taotao-parent依赖taotao-common所以要安装taotao-common