电商实战
1.系统介绍
O2O(Online To Offline):线上转线下 代表:美团,饿了么
B2B(Business To Business) :企业对企业的电子商务模式 代表:阿里巴巴集团
C2C(Consumer To Consumer): 人人电子商务的专业用语,是个人与个人之间 的电子商务 代表:淘宝二手网闲鱼
P2P(Peer to Peer): 是一种将非常小额度的资金聚集起来借贷给有资金需求人群的一种民间小额借贷模式 代表:人人贷
P2C(Production To Consumer) : 简称为商品和顾客,在国内叫做:生活服务平台 代表:餐饮、家政服务、健康、医疗
B2C(Business To Consumer): “商对客”企业通过互联网为消费者提供一个新型的购物环境--网上商店,消费者通过网络在网上购物、在网上支付 代表:天猫、京东
2.数据结构的介绍
电子商务系统设计图
后台管理系统
1 搭建
1 pom依赖 2 web配置 3 spring配置 4 mvc配置 5其他配置 |
2 管理系统开发步骤
1 了解业务(需求) 完成商品信息,属性信息,库存单元信息的增删改查 2 技术方案 Ssm Jquery-Easyui后台js的样式框架 3 具体实现步骤 先做页面跳转(controller) 在完成业务层代码 |
3 页面加载静态分类数据
用jquery的 js脚本客户端进行加载 1 选择一级分类后 2 触发二级分类列表 3 触发品牌列表 |
4 存储服务器
1 软件共享 Tomcat+web项目 Fastdfs 2 硬件共享
|
5 图片上传预览
1 上传按钮代替file对象 2 点击上传按钮触发file对象的点击事件 3 选择图片后,在浏览器加载完图片的blob对象后,获得预览图对象 4 将预览图对象替换上传按钮 5 显示预览图后追加新的上传按钮 |
6 商品属性管理()
1 选择添加或者查询属性时,需要选择分类列表 2 查询商品属性列表 3 添加平台分类属性 多重对象的同步表单参数提交
A页面表达式ognl(object gram navigation language) List_attr[0].list_value[0].shxzh B mvc如何封装 拥有Setter方法
|
7 主键返回策略
1 单独参数 直接用set方法 2 map 对象名.id 3 多参数列表 对象名.id |
8 任务
1 spu添加的时候指定封面图片
2测试主键返回的三种情况
3 属性添加页面加入动态追加的效果
4 属性集合查询语句
9 sku库存单元添加
1 选择商品列表,异步刷新商品spu列表(ajax+json) Js函数中可以使用el表达式 El表达式中不能使用js的变量 调用spu列表异步方法->传递品牌和二级分类id->查询spu列表->返回json->页面加载json数据
2 页面展示选择框的属性和属性值列表 展示:根据选择的属性复选框,显示属性值列表 参数:被选中的属性的id和属性值的id需要以集合方式提交到后台 a参数对象类型 b参数的对象索引 3 页面选择的属性和属性值选择框,提交到后台参数处理 |
交易系统首页
1 介绍
1 导航栏 2 搜索区域 3 类目区域 4 首页区域 |
2 任务
1 分类检索(分类检索mysql/关键词搜索) 2 商品详情(详情的结构/商品销售属性) 3 购物车(购物车增删改查/购物车和缓存的使用) 4 用户系统 5 订单和支付 6 搜索->缓存和搜索引擎 7 分布式部署 |
商品检索
1 介绍
1 条件检索 Select * from table where column1 = ? and column2 = ?
2 关键字过滤 Select * from table where (column1 like ‘%关键字1%’ or column1 like ‘%关键字2%’ …) Or/and (column2 like ‘%关键字1%’ or column2 like ‘%关键字2%’ …) … |
2 商品的分类列表检索
1 分类检索 分类id检索 A属性列表 B商品列表 Spu名称/图片/介绍 Sku价格/销量 评论/商家 品牌
2 属性检索 |
注意检索出来的数据会出现重复了,考虑好各依赖关系,是1对1,还是1对多,多对多。
SELECT * FROM t_mall_product spu, t_mall_sku sku, t_mall_trade_mark tm WHERE spu.Id = sku.shp_id and spu.pp_id = tm.Id and spu.flbh2 = 28 |
3 异步刷新属性检索列表
1 点击属性 2 存储参数 3 调用ajax 4 传递参数 5 检索业务 6 返回html 7 刷新列表 |
4 ajax异步提交参数的方式
数组传参
用js数组对象,ajax在转化为请求字符串时 会在参数名结尾加[],所以mvc中用@RequestParam("param_array[]")接收 |
Json传参
1 json的数组对象 2 json的查询字符串 |
表单序列化
$("#loginForm").serialize(); |
5 属性检索的业务实现
二级分类的商品集合
and sku.id in ( select sku0.sku_id from (select sku_id from t_mall_sku_attr_value where shxm_id = 13 and shxzh_id in (30,31,32,..)) sku0, (select sku_id from t_mall_sku_attr_value where shxm_id = ? and shxzh_id = ?) sku1, (select sku_id from t_mall_sku_attr_value where shxm_id = ? and shxzh_id = ?) sku2 where sku0.sku_id = sku1.sku_id and sku1.sku_id = sku2.sku_id ) |
6.商品详情
1 sku库存单元信息 2 spu商品信息 3同一个spu下的其他sku库存单元列表 4商品的规格信息(属性)
5其他内容: 价格(功能) 白条、增值、套装 推荐、达人选购 商品评论: Comment:评论,replay:回复 自动审核、人工审核 |
1 设计详情页面的数据对象的结构
Detail_t_mall_sku 图片列表 Spu信息 属性列表(属性名/属性值)object_av_name |
2 商品详情页面介绍商品的销售属性的使用
1 在添加spu的功能上增加商品颜色和商品版本的销售属性,保存到 t_mall_product_color t_mall_product_version 2 在添加sku的功能上在选择spu后,展示该spu的销售属性列表(颜色/版本) 3 提交sku添加时,选择该sku的对应颜色和版本,保存到t_mall_product_sku_info
4 前台在根据版本和列表切换sku时 在查询商品详情时
[{ys_id:1,bb_id:2,dkr:12,sku_id:0},{ys_id:1,bb_id:2,dkr:12,sku_id:0}]
|
购物车
1 介绍
浏览器本地的购物车信息
1用户未登陆时,购物车使用的本地的cookie 2 list_cart_cookie 3没有用户id和购物车id |
服务器持久层购物车信息
1用户登录时,购物车针对持久层的操作 2 list_cart_db 3有购物车id和用户id |
服务器缓存中的购物车信息
1用户登录时,购物车查询,使用的缓存(redis/session) 2 list_cart_session 3有购物车id和用户id |
2 功能介绍
1 购物车添加 2 购物车查询 3 购物车同步 4 购物车操做 |
3 购物车添加
4 购物车同步
5 购物车列表
1 列表显示,页面的选择框(复选、单选、下拉) 根据数据列表的字段值显示为是否选中 $(function (){ $(":checkbox").each(function(i,json){ var shfxz = json.value; if(shfxz=="1"){ $(json).attr("checked",true); } }); });
A==b?”checked”:”” ${cart.shfxz=="1"?"checked":""} |
用户系统
1介绍
1 sso 2 jwt |
2 ws
Webservice
1 soap 在http基础上封装的统一的ws协议(传输协议和安全协议) 有统一框架和协议,cxf 2 http 在rest风格基础上,企业发布公共开源的接口用 直接使用http访问,不需要统一的框架 |
Springmvc + spring + mybatis Cxf + spring + mybatis |
ws用户接口(saop/rest)
用户登录、注册
地址添加、查询
3.ws的安全问题
Wssj=webservice security for java
1 身份校验
1 在需要进行验证的接口中加入拦截器 2 对拦截器进行配置,对调用接口的身份进行拦截 3 usernameToken |
2 信息加密
结算和订单
1 介绍
2 结算
1 确认收货地址和支付方式 2 送货清单 结算的拆单 收货地址和出货地址 哪些商品放在一个物流中 |
订单拆分规则
1 商家 2 地址 3 商品种类 4 商品价值 |
1 交易系统主单号 2 支付后调用仓库系统,进行二次拆单 |
3 异常处理
1 运行时异常 2 非运行时异常 3 第三方应用调用 手动处理,一旦第三方出现调用问题 4 业务异常 手动处理,自定义异常 |
4 订单提交
5 订单支付成功
1 支付结果必须先保存到数据库 2 当用户订单中某些产品购买状态异常,需要将整个订单回滚,给用户订单的异常提示 |
修改sku库存单元
库存超卖/超买(事务) 原因: 1 超卖出现在修改库存业务的方法中,并不是出现在数据库的更新语句中(mysql的update写操作不能并发执行) 2 业务的方法中超卖造成原因是什么,mysql的写操作和读操作可以并发执行,导致多个线程同时修改了一条库存不足的商品 解决:事务锁 悲观锁(显式锁) Select kc from t_mall_sku where id=id For update
乐观锁 一(弊端,其实是锁住了整条数据,后台管理人员可能会去修改该数据表的其他数据,这时候下面的语句无法实现该要求) Select version from t_mall_sku where id = id Update t_mall_sku set kc = kc - ?,version= version +1 where id = id and version = version
二(下面的做法虽然可以不影响其他属性的修改,但是有弊端,假设一个商品价值10000,促销打折为100,促销活动即将结束,后台系统即将更新价格,在那瞬间,并发事件发生了,顾客在11:59:59促销结束前用100支付成功,这时商品迅速恢复原价为10000,顾客的订单消息显示为10000购买得到这个商品,银行卡只扣了一百块,这时在进行退货,不就爽了。) Select kc_version from t_mall_sku where id = id Update t_mall_sku set kc = kc - ?, kc_version= kc_version +1 where id = id and kc_version = kc_version |
6 订单状态
修改状态 |
物流和库存 修改 |
支付服务
1 支付流程介绍
1 浏览器提交订单 2 订单返回重定向支付服务的命令 3 浏览器跳转到支付服务 4 支付服务返回重定向支付宝命令 5 浏览器请求支付宝 6 支付宝返回支付界面 7 支付请求 8 支付宝返回重定向支付服务命令 9 浏览器请求支付服务 10 支付服务返回重定向订单的命令 11 浏览器请求订单 12 订单返回成功页面 |
通知和确认
1 在订单调支付服务,和支付服务调支付宝 两对: return_url:浏览器重定向url,给客户端看(没有实际意义) notify_url:服务器之间异步通知接口(有实际意义) |
缓存数据库的使用
1 介绍
Key value缓存redis
全文搜索solr/lucen
日志系统(mq)
Soa :dubbo
2 事务
Spring容器事务(aop)
1 链接点、切入点、通知 2 创建一个事务管理器 DataSourceTransactionManager(通过数据源管理事务) 3 DataSourceTransactionManager事务管理器配置成aop的通知 4 用切入点表达式 将通知(事务管理器)和连接点(需要被代理的业务层的方法们)整合 注:参照springapi4.0的第8章和第11章 |
事务和springmvc
1 mvc注入业务层,使用接口注入 在使用事务aop时候,需要用接口注入动态代理生成的代理对象(和被代理类实现同一个接口) 2 spring容器来扫描业务层方法 在使用事务aop时候,容器事务管理器不能够访问私有容器中的被代理类(bean) |
3 多数据源和事务管理
4 缓存
5 redis
1 redis可以存储用户信息(session)
2 redis可以存储购物车数据
3 redis可以存储条件检索的商品数据(k:v)
6 分类商品列表
1 用分类id作为key 2 用商品sku对象集合作为value 3 将商品缓存数据放入到redis中的zset里 检索结果需要排序 检索结果需要分页 |
真实环境中redis使用
1 每次使用一个key时,都需要对该key是否存在进行判断 Key生成的规则:key要体现出检索条件 交叉检索,每次检索时,需要先判断key是否存在,如果已经存在,直接返回
2 redis查询排序和分页 Zrangebyscore Zrevrangebyscore zrangebyscore k1 0 10 withscores limit 3 3
3 交叉检索时,需要注意 对score进行处理,排序关键字(乘法因子相乘后相加) Zinterstore weights 乘法因子1 乘法因子2
4 redis数据结构 所有条件检索的key,存储的是sku的id Sku的具体信息,skuid为key,sku内容为value的集合 Hash Key:value Key:value
5 如果需要更新redis 先删除后添加 Zrem + zadd
|
全文搜索
搜索引擎
爬虫
分析
查询
搜索项目
1 solor的api 2 springmvc和mybatis 3提供rest接口给交易系统检索访问 |
搜索方式
1 一般使用组合字段进行搜索 默认为关键字分词后的所有词语在组合字段中结果的并集 2 配置结果的交集和并集在字段中加入 <solrQueryParser defaultOperator="AND"/> |
消息队列的应用
1 介绍
1 网站业务日志
2 手机短信
3 邮箱邮件
4 站内信
5 订单(订单支付后调用订单系统,仓库,物流)
mq结构
Mq:消息提供者Producer -> 消息消费者consumer
Mvc:返回值Produces ->参数 comsumes
Dubbo:服务提供者Provider -> 服务消费者consumer
日志服务功能
消息的发送和接收
在mq的消息存储中 1 队列模式的消息,默认永久保存 2 订阅模式的消息,默认不永久保存,如果需要永久保存,需要为consumer在服务器上初始化一个永久保存的存储空间 |