本文最后更新于 824 天前,其中的信息可能已经有所发展或是发生改变。
1.分析sql文件
- 1.1
tb_content
内容(门户广告)id
bigint(20)category_id
bigint(20) '内容类目ID',title
'内容标题',sub_title
'子标题',title_desc
'标题描述',url
'链接',pic
'图片绝对路径',pic2
'图片2',content
'内容',created
,updated
, - 1.2
tb_content_category
内容分类;id
'类目ID',parent_id
'父类目ID=0时,代表的是一级的类目',name
'分类名称',status
'状态。可选值:1(正常),2(删除)',sort_order
'排列序号,表示同级类目的展现次序,如数值相等则按名称次序排列。取值范围:大于零的整数',is_parent
'该类目是否为父类目,1为true,0为false',created
'创建时间',updated
'创建时间', - 1.3
tb_item
'商品表'id
'商品id,同时也是商品编号',title
'商品标题',sell_point
'商品卖点',price
'商品价格,单位为:分',num
'库存数量',barcode
'商品条形码',image
'商品图片',cid
'所属类目,叶子类目',status
'商品状态,1-正常,2-下架,3-删除',created
'创建时间',updated
'更新时间', - 1.4
tb_item_cat
'商品类目'id
'类目ID',parent_id
'父类目ID=0时,代表的是一级的类目',name
'类目名称',status
'状态。可选值:1(正常),2(删除)',sort_order
'排列序号,表示同级类目的展现次序,如数值相等则按名称次序排列。取值范围:大于零的整数',is_parent
'该类目是否为父类目,1为true,0为false',created
'创建时间',updated
'创建时间', - 1.5
tb_item_desc
'商品描述表'item_id
'商品ID',item_desc
'商品描述',created
'创建时间',updated
'更新时间', - 1.6
tb_item_param
'商品规则参数'id
item_cat_id
'商品类目ID',param_data
'参数数据,格式为json格式',created
updated
- 1.7
tb_item_param_item
'商品规格和商品的关系表'id
item_id
'商品ID',param_data
'参数数据,格式为json格式',created
updated
- 1.8
tb_order
order_id
'订单id',payment
'实付金额。精确到2位小数;单位:元。如:200.07,表示:200元7分',payment_type
'支付类型,1、在线支付,2、货到付款',post_fee
'邮费。精确到2位小数;单位:元。如:200.07,表示:200元7分',status
'状态:1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭create_time
'订单创建时间',update_time
'订单更新时间',payment_time
'付款时间',consign_time
'发货时间',end_time
'交易完成时间',close_time
'交易关闭时间',shipping_name
'物流名称',shipping_code
'物流单号',user_id
'用户id',buyer_message
'买家留言',buyer_nick
'买家昵称',buyer_rate
'买家是否已经评价', - 1.9
tb_order_item
(id
,item_id
'商品id',order_id
'订单id',num
'商品购买数量',title
'商品标题',price
'商品单价',total_fee
'商品总金额',pic_path
'商品图片地址', - 1.10
tb_order_shipping
(order_id
'订单ID',receiver_name
'收货人全名',receiver_phone
'固定电话',receiver_mobile
'移动电话',receiver_state
'省份',receiver_city
'城市',receiver_district
'区/县',receiver_address
'收货地址,如:xx路xx号',receiver_zip
'邮政编码,如:310001',created
updated
- 1.11
tb_user
'用户表'id
username
'用户名',password
'密码,加密存储',phone
'注册手机号',email
'注册邮箱',created
updated
2.系统架构
- 2.1 门户
- 2.2 商品搜索
- 2.3 商品展示
- 2.4 购物车
- 2.5 登录
- 2.6 订单
- 2.7 后台
3.总体项目结构
- 3.1 cart 购物车
- 3.2 commons 通用
- 3.3 item 商品
- 3.4 manage 后台管理
- 3.5 order 订单
- 3.6 paeent 父容器
- 3.7 passport 单点登录
- 3.8 pojo 实体
- 3.9 portal 门户
- 3.10 redis 缓存
- 3.11 search 搜索 solr
- 3.12 service dubbo服务接口
- 3.13 service-impl dubbo的provider 数据访问层
4.实施步骤
- 4.1. 电商Ego-基于SOA架构,使用Dubbo,逆向工程,分页插件完成商品查询
- 搭建环境
- 逆向工程
- 基于SOA架构:面向服务架构
- mybatis插件
- 后台商品分页
- 后台商品上架,下架,删除
- 4.2. 电商Ego-使用VSFTPD和Nginx完成商品新增
- 后台商品新增
- 在在ego-service-impl的applicationContext-dubbo.xml注册发布服务接口
- 实现商品新增以及图片上传
- 在 linux 中安装 vsftpd,安装后实现使用 ftpclient 完成图片上传功能.
- 在 vsftpd 所在服务器安装 nginx,实现图片回显
- 因为vsftp使用ftp协议,前端就无法使用http协议访问静态资源的方式去访问上传的图片资源,最终使用nginx解决
- 使用属性文件来实现软编码
- jsp中使用kindeditor 的多文件上传插件
- 4.3. 电商Ego-基于json格式完成商品规格参数管理
- 优化规格参数数据库设计
- 这个字段设计起来有点麻烦,不同的商品类型对应不同的商品规格,比如手机,它的商品规格包括摄像头信息,网络规格等。电脑的就没有网络规格,然后网络规格又有很多子项,比如网络频段,支持的sim卡数量,如果全部建成表的话就有,一个商品,对应一个商品分类(手机or电脑),对应多个规格(网络频段,基本参数),对应多个规格子项。这样带来的直接影响就是数据访问效率下降,所以改成了使用json格式来存储规格参数,商品表对应规格参数表(id,商品id,规格参数,创建时间,更新时间),而且在mysql5.7过后支持json数据格式了,但是我好像用的5.5,所以就要text来存储的。
- 实现规格参数查询
- 4.4. 电商Ego-使用jsonp完成前台首页导航菜单
- 在 ego-portal 中显示 tb_item_cat 商品类目的数据,让 ego-portal 调用 ego-item 中的数据,由 ego-item 调用 dubbo
- 产生跨域
- 一个 Servlet 容器(tomcat)中项目调用另一个 servlet 容器 (tomcat)中项目,称为跨域
- ajax 在研发时处于安全性考虑不允许跨域请求的.
- 解决办法:使用 jsonp 如果 ajax 请求的控制器返回的就是字符串六或 json 数据,不能访问,可以在一个项目直接访问另一个项目的 js 文件,控制器返回的结果伪装成 js 文件,前端js ajax dataType: 一定要设置 jsonp,jsonp: 传递给服务器的参数名.省略的默认 callback,使用 spring 对 jackson 封装类 MappingJacksonValue,返回的是一个方法名和方法,我就将需要返回的数据放在方法里面
- 解决办法:由 ego-portal访问自己的控制器,自己的控制器访问自己的 service,在自己的 service 中使用 httpclient,调用ego-item 的控制器方法.
- 4.5. 电商Ego-完成CMS系统
- 内容分类查询
- 内容分类新增
- 内容分类重命名
- 内容分类删除
- 内容查询
- 内容新增
- 内容删除
- 内容修改
- 4.6. 电商Ego-添加前台大广告位数据缓存
- Redis 集群安装
- 完成门户大广告显示
- 完成后台大广告缓存数据同步
- 4.7. 电商Ego-SolrJ操作SolrCloud
- Solr是什么?
- 就是一个 war 项目
- Solr基于apache lucene
- 自己的项目如何和 Solr 进行交互?
- 特定的 API 叫做 SolrJ
- Solr具备数据持久化功能.
- Solr 中会存储需要进行搜索的数据
- 把所有数据都初始化到 Solr 中.
- Solr作用(什么时候使用 Solr)
- 大量数据检索时使用 Solr,能提升检索效率.
- Solr是基于索引进行查询的.
- 顺序查询:从内容的最开始找到内容为止
- 反向键索引:把内容中进行拆分
- Solr默认对中文拆词功能支持不好
- IK Analyzer 中文拆词器
- 4.8. 电商Ego-完成商品搜索功能
- Solr 数据初始化编写
- Ego-Search 项目
- HttpClient
- 4.9. 电商Ego-显示商品详细详情
- 显示商品详细信息
- 显示商品的规格参数
- 显示商品描述功能
- 延迟加载
- 使用 js 的 setTimeout 延迟 1 秒加载,提升用户体验
- 项目中如果页面数据过大,可以考虑一些不是立即看见的内容选择延迟加载.
- 4.10. 电商Ego-完成SSO单点登录系统
- SSO 简介
- 英文名称(Single Sign On)
- 中文名称:单点登录
- 解释: 一次登录,让其他项目共享登录状态.本质:使用特定技术在分布式项目中模拟 HttpSession 功能.
- 技术选型:Redis Cookie 模拟 HttpSession 功能
- HttpSession 和 Cookie
- 搭建 ego-passport 并编写代码
- SSO 简介
- 4.11. 电商Ego-购物车
- 新建 ego-cart 并完成拦截器功能
- 在 ego-cart 中新建拦截器
- 新建 ego-cart 并完成拦截器功能
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
使用HttpClient发送请求到到单点登录项目
}
在 ego-cart 的 springmvc.xml 中配置拦截器拦截全部
<!-- 拦截器 -->
<mvc:interceptors>
<bean class="com.ego.cart.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>
- 4.12. 电商Ego-订单系统实现
- 在订单确认页面中从 redis 中把数据查询出来并显示
- 确认商品数量
- 提交订单时复杂数据类型传递.
- 向 mysql 中 3 个表新增.
- 使用事务回滚时
- 在spring中配置声明式事务,(aop)
- 该执行回滚时抛出异常,一直往上抛,不处理
- 抛出异常时spring就会进行回滚了
- 在controller中处理,因为要获取异常信息。
- 添加拦截器,实现登录拦截
- 4.13. 电商Ego-MySql读写分离 MyCat分库分表
- MySQL 主从备份
- MySQL 默认支持主(master)从(slave)功能.
- 配置完主从备份后效果:在主数据库中操作时,从同步进行变化.
- 主从本质:主数据的操作写入到日志中,从数据库从日志中读取,进行操作.
- MyCat 简介
- 数据库中间件软件.
- 利用 mySQL 主从备份功能实现读写分离.
- 增加,删除,修改,都操作主数据库
- 查询到从数据库中查询.
- 优点:提升程序执行效率.
- 具备分库/分表功能
- 默认 MyCat 分库(建议使用)
- 可以配置让MyCat进行分表,业务比较复杂,配置起来也比较复杂.
- 要求至少 3 个 database
- 逻辑库: 一个包含了所有数据库的逻辑上的数据库
- 逻辑表: 一个包含了所有表的逻辑上的表
- 数据主机:数据库软件安装到哪个服务器上
- 数据节点:数据库软件中的 database
- 分片规则: 默认每个表中数据都一样的
- 读主机:哪个数据库做为读操作
- 写主机.:哪个数据做为写操作
- MySQL 主从备份
4.14. 电商Ego-项目部署
- 部署 Dubbo
- 部署 ego-portal
- 部署 ego-item 设置虚拟域名
- 配置 Nginx 负载均衡
- 使用多个 tomcat, 每个 tomcat 中都部署相同的项目
- 使用 nginx 反向代理多个 tomcat
Post Views: 475