天猫商城项目演化(二)

标签: Java

**

表结构设计 数据库设计

**
电子商务网站主要作用就是用户在网站上购买商品这样一个操作所以数据库表设计,看过很多电子商务网站数据库设计基本上相同
这里写图片描述
2.表与表关系
1对多关系
(2.0项目分布式数据库当中着重介绍数据库优化问题,在高并发情况下的分布式数据库架构设计,1对多,多对多,多key情况)
3.建表SQL语句

代码实现过程
POM.XML
jar包导入
Junit、mybatis、spring-context、mysql、spring-jdbc、log4j、pageHelper、mevan环境隔离(正在学–其实我一个人开发这东西作用感觉不出来)不过最近部署代码发现有点吊用
后台管理实现过程

后台管理实现过程

1.静态资源导入
2.Jar包导入
3.JSP对应关系以及公用jsp内容(只讲解部分内容)
这里写图片描述

首先讲解
引入JSTL
这里写图片描述
引入JS/CSS框架
定义输出框的JS函数(不贴代码)
这里写图片描述
这里写图片描述
删除操作提示
这里写图片描述

页头顶部公共页面
这里写图片描述
分页效果
这里写图片描述
这里写图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>

<script>
$(function(){
    $("ul.pagination li.disabled a").click(function(){
        return false;
    });
});

</script>

<nav>
  <ul class="pagination">
    <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>>
      <a  href="?page.start=0${page.param}" aria-label="Previous" >
        <span aria-hidden="true">«</span>
      </a>
    </li>

    <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>>
      <a  href="?page.start=${page.start-page.count}${page.param}" aria-label="Previous" >
        <span aria-hidden="true"></span>
      </a>
    </li>    

    <c:forEach begin="0" end="${page.totalPage-1}" varStatus="status">

        <c:if test="${status.count*page.count-page.start<=20 && status.count*page.count-page.start>=-10}">
            <li <c:if test="${status.index*page.count==page.start}">class="disabled"</c:if>>
                <a  
                href="?page.start=${status.index*page.count}${page.param}"
                <c:if test="${status.index*page.count==page.start}">class="current"</c:if>
                >${status.count}</a>
            </li>
        </c:if>
    </c:forEach>

    <li <c:if test="${!page.hasNext}">class="disabled"</c:if>>
      <a href="?page.start=${page.start+page.count}${page.param}" aria-label="Next">
        <span aria-hidden="true"></span>
      </a>
    </li>
    <li <c:if test="${!page.hasNext}">class="disabled"</c:if>>
      <a href="?page.start=${page.last}${page.param}" aria-label="Next">
        <span aria-hidden="true">»</span>
      </a>
    </li>
  </ul>
</nav>

–感觉说起来太累了我还是直接把总体架构思路说出来吧
1.普通的MVC架构
这里写图片描述
Comparator是排序器,里面封装了所要进行排序的算法
1.按照综合来排序
这里写图片描述
2.按照时间来排序(新品)
这里写图片描述
3.按照价格来排序
这里写图片描述
4.按照评价次数来排序
这里写图片描述
5.按销量来排序
这里写图片描述
然后是三层(控制层、业务层、逻辑层)
先从实体类介绍吧
这里写图片描述
虽然电商好像喜欢叫pojo但我还是喜欢用entity
总共有9个实体类XXExample是排序使用的

Mapper(DAO)里面对应的接口
这里写图片描述
对应的service
这里写图片描述

控制层(controller)
这里写图片描述
拦截器限制访问
这里写图片描述
还有一些包是稀奇古怪—
1.测试数据库连接
2.上传图片保存到image包下
3.4逆向工程生成文件
5.分页算法
6.上传图片
这里写图片描述
后面在讲解
我先—介绍整体项目实现思路-0-(0-0)
首先我们访问浏览器输入地址admin_category_list
这里写图片描述
tomcat根据web.xml上的配置信息,拦截到了/admin_category_list,并将其交由DispatcherServlet处理
这里写图片描述
DispatcherServlet 根据springMVC的配置,将这次请求交由CategoryController类进行处理,所以需要进行这个类的实例化
这里写图片描述
在实例化CategoryController的时候,注入CategoryServiceImpl
这里写图片描述
CategoryMapper.java
这里写图片描述
categoryMapper.xml
这里写图片描述
说实话这逆向工程生成的这玩意结构有点高大上0-0不过好用—就行了~(-▲-)丿
根据ApplicationContext.xml中的配置信息,将CategoryMapper和CategoryMapper.xml关联起来了
这里写图片描述
这样就拿到了实例化好了的CategoryController,并调用list方法
在list方法中,访问CategoryService,并获取数据,并把数据放在”cs”上,接着服务端跳转到listCategory.jsp去
这里写图片描述
最后在listCategory.jsp 中显示数据
这里写图片描述
这里写图片描述
分页功能
分页算法
这里写图片描述
CategoryMapper.xml项目里面的orderby id desc,之后在和上述一样思路在serviceImpl修改,然后传入controller转发到JSP
这里写图片描述
CRUD过程(思路相同一起讲拿一个为例)
这里写图片描述
Insert 数据
修改mapper
修改service
Next– serviceImpl
之后定义文件上传
这里写图片描述
还有ImageUtil

最后传入控制层再添加方法add之后把图片生成到Image包里面

大致是这样一个架构Mapper.xml->mapper.java->service接口->serviceImpl->controller控制层

逆向工程自动生成entity、mapper、XML文件过程

除了基本类之外逆向工程还会生成一个新的类XXexample这是一个在排序查询的时候使用的类

之后其他功能
1.属性管理
2.产品管理
3.产品图片管理
4.产品属性值管理
5.用户管理
6.订单管理
嗯~ o( ̄▽ ̄)o我介绍其中一个吧0-0
基本思路
这里写图片描述
这里写图片描述
除了用逆向工程生成代码之外我们需要添加一个字段,我们再一会编辑功能的时候讲解
这里写图片描述
我们为peoperty配置一个CRUD之后impl实现
之后传入控制层controller
这里写图片描述

之后是jsp文件,之后查询功能
查询地址admin_property_list映射的是PropertyController的list()方法
1. 获取分类 cid,和分页对象page
2. 通过PageHelper设置分页参数
3. 基于cid,获取当前分类下的属性集合
4. 通过PageInfo获取属性总数
5. 把总数设置给分页page对象
6. 拼接字符串”&cid=”+c.getId(),设置给page对象的Param值。 因为属性分页都是基于当前分类下的分页,所以分页的时候需要传递这个cid
7. 把属性集合设置到 request的 “ps” 属性上
8. 把分类对象设置到 request的 “c” 属性上。
8.把分页对象设置到 request的 “page” 对象上
10. 服务端跳转到admin/listProperty.jsp页面
11. 在listProperty.jsp页面上使用c:forEach 遍历ps集合,并显示

这里写图片描述

增加功能
1.在listProperty.jsp页面提交数据的时候,除了提交属性名称,还会提交cid
2. 在PropertyController通过参数Property 接受注入
3. 通过propertyService保存到数据库
4. 客户端跳转到admin_property_list,并带上参数cid
2.
这里写图片描述
编辑功能
1.在PropertyController的edit方法中,根据id获取Property对象
2. 根据properoty对象的cid属性获取Category对象,并把其设置在Property对象的category属性上
3. 把Property对象放在request的 “p” 属性中
3. 服务端跳转到admin/editProperty.jsp
4. 在editProperty.jsp中显示属性名称
5. 在editProperty.jsp中隐式提供id和cid
这里写图片描述
2.
3.

接下来我来介绍前台代码
里面对应每一个模块
这里写图片描述
1.首页
Home方法
这里写图片描述
第一个列出category下面的项目product
第二个的意思是列出所有的分类的一个集合属性
这里写图片描述

新增三个方法来填充category
这里写图片描述
然后到controller层把数据发送到jsp
这里写图片描述
Home.jsp架构和后台admin差不多由header.jsp、footer.jsp、、top.jsp、homepage.jsp
这里写图片描述
里面的homepage.jsp分为
这里写图片描述
1.categoryAndcarousel.jsp
这里写图片描述
分类和轮播
1.1 categoryMenu.jsp
竖状分类菜单
1.2 productsAsideCategorys.jsp
竖状分类菜单右侧的推荐产品列表
1.3 carousel.jsp
轮播

总体架构
这里写图片描述
2.注册功能
首先通过控制层来做服务器跳转跳转到resigter.jsp
这里写图片描述
然后跳转到register.jsp
这里写图片描述
在simpleSearch.jsp当中完成简单搜索功能
然后到UserService里面添加isExist方法来判断是否存在之后impl实现
控制层
这里写图片描述
用ajax来进行异步验证
之后验证通过显示界面registsuccess.jsp
总体架构与首页类似略
3.登录功能
Userservice里面加上一个方法然后在impl里面实现过程
这里写图片描述
由于登录功能和上面注册功能架构类似,jsp里面略过
Forecontroller里面添加login方法
这里写图片描述
4.产品页
1. 单个产品图片集合
private List productSingleImages;

  1. 详情产品图片集合
    private List productDetailImages;

  2. 销量
    private int saleCount;

  3. 累计评价
    private int reviewCount;
    在评价内添加User user;属性
    然后添加属性方法获取评价
    修改userservice添加
    List list(int pid);

int getCount(int pid);
增加一个类是用户在评论额时候实现匿名评价
这里写图片描述
5.模态登录
6.分类页
7.搜索
后续功能不做详细介绍架构算法基本类似基本ssm框架

天猫2.0项目(优化)

前言:大型电商项目演变过程
淘宝架构体系
这里写图片描述
一般的电商项目演进过程:一般的单服务架构一个服务器对应一个文件系统和数据库
这里写图片描述
由于数据量的增多数据库和文件系统分别放在不同的服务器上面实现分离
这里写图片描述
由于流量继续增多我们增加了文件服务器数量
这里写图片描述
之后进一步优化我们添加radis缓存机制来加速I/O操作,
Raids同步缓存把20%的数据存储在里面二八原则(电商项目当中的28原则,80%流量在集中访问20%的数据)
这里写图片描述

之后我们来进行分布式session(保证服务器内数据同步)
之后我们可以进行数据库分库按照读写分离的方式
这里写图片描述

Nignx反向代理服务器加入CDN实现不同地区同步功能,把文件系统改成分布式文件系统
之后当数据量在进一步增大的时候我们需要改变数据库把读写分离数据库改成模块化的数据库product、user、categroy、order这样按照类型分类然后数据量继续增加增加在product1、2、3、4这样分离数据库。
无限容量数据库架构介绍
E-R模型当中有三种对应关系
1:1、1:N、N:N
1:1关系例如用户账号1:1 uid<–>login.name
现在下介绍几个主流的数据库架构还是贴图吧–感觉电脑上打太麻烦
这里写图片描述

接下来我来介绍如何在电商项目当中拆分用户数据库架构
1:N关系例如发朋友圈发帖 uid<–>tid1、tid2、tid3
N:N微博之间相互关注uid1、uid2、uid3、uid4、uid5、uid6之间相互关注
1:1关系数据管理架构简单我们不在此多介绍
1:N项目当中Tie2:value–>tid,uid,title,content
需求:发布、修改、查询、删除对应CRUD
其中写入的操作InsertUpdateDelete
读的操作有两种方法根据uid和tid在这两种方法当中uid搜索出来的是多行数据tid搜索出来是单行数据。
这里写图片描述
①上面这张图是介绍通过搜索快速读出数据库中帖子的方法
简单介绍一下:
我们到帖子中心去搜索数据–>帖子中心的数据来自于数据库tiedb当中的元数据,我们在在数据当中建立索引服务,由于建立索引会降低数据库性能,所以我们把索引与数据隔离Search检索服务通过ES、sdr等技术栈来实现索引,然后通过MQ日志同步的方式来对数据进行一个校验,保证数据的一致性。
②元数据设计直接贴图0-0打字好难打啊(-_-)||
总结最后一种方法是最好的
接下来我来介绍N:N数据库设计
这里写图片描述
这里写图片描述
这里写图片描述

原文链接:加载失败,请重新获取