**
表结构设计 数据库设计
**
电子商务网站主要作用就是用户在网站上购买商品这样一个操作所以数据库表设计,看过很多电子商务网站数据库设计基本上相同
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()方法
- 获取分类 cid,和分页对象page
- 通过PageHelper设置分页参数
- 基于cid,获取当前分类下的属性集合
- 通过PageInfo获取属性总数
- 把总数设置给分页page对象
- 拼接字符串"&cid="+c.getId(),设置给page对象的Param值。 因为属性分页都是基于当前分类下的分页,所以分页的时候需要传递这个cid
- 把属性集合设置到 request的 “ps” 属性上
- 把分类对象设置到 request的 “c” 属性上。
8.把分页对象设置到 request的 “page” 对象上 - 服务端跳转到admin/listProperty.jsp页面
- 在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.产品页
-
单个产品图片集合
private List productSingleImages; -
详情产品图片集合
private List productDetailImages; -
销量
private int saleCount; -
累计评价
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数据库设计