概念定义
SPU:Standard Product Unit (标准化产品单元),即商品列表里展示的一项商品,例如 iPhone XS
SKU:Stock Keeping Unit(库存量单位),确定商品的一个配置,例如 64G 玫瑰金 iPhone XS
数据库设计
1、时间类型
一般情况
数据库:使用datetime;不用timestamp,因为范围只在1970-2038;不用long 或 varchar,因为不能直接使用数据库内置的时间方法
Java:使用Date;不用long 或 String,因为不能直接使用现成的时间方法
前端:用 moment.js转换
服务器与客户端跨时区的情况
:数据库 用 long,Java 用 long
前端不用moment.js的情况
:后端给前端一个现成的格式
SpringBoot配置:spring.jackson.time-zone=GMT+8;spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
SpringBoot注解字段:@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
2、金额类型
数据库、Java、前端:使用 int,以分为单位;不用 float,因为 四舍五入保留2位小数 不方便;微信支付接口是以分为单位
3、表名
对表进行分类,相同类型的表,表名加上前缀,避免表的排序混乱
例如:管理员相关(admin_),人相关(man_),物相关(thing_),交易相关(trade_),组织相关(org_)
4、名词约定
客户:customer
服务提供者:provider(摒弃server、merchant、store)
用户:user,包括了customer 和 provider
运营人员:operator(摒弃 manager、admin)
商品:product(摒弃commodity、goods)
服务:serve(摒弃 service、product)
订单:order
订单ID:tradeNum(摒弃orderId)
价格:price
金额:fee(摒弃amount、sum、total、money)
数量:count
编号:num(摒弃no、number)
5、动词约定
点赞:like(摒弃 up)
收藏(标记):star(摒弃 collect、follow)
关注(订阅):follow(摒弃 subscribe、watch)
微信支付设计
1、不记录订单的支付失败状态,支付失败当作未支付
2、不马上支付的订单,不出现在订单列表,不给再次支付的机会
3、如果设计成可以继续支付,那么重新生成新的订单号,重新向微信下单,因为prepay_id默认有效期为2小时
4、退款审核通过后发生退款失败,用户再次发起退款则无需审核
5、定时关闭未支付订单:不用定时触发或者消息队列触发,可以在用户查询列表时触发
6、主动查询订单状态 以兼容 支付通知未正常处理的情况:不用定时触发或者消息队列触发,在用户查询列表时,查询未支付订单,到微信服务器查询最新状态,更新到我方服务器
商品订单设计
1、快照:一个订单里关联的商品、快递公司、收件人,可能在下单后发生修改。因此,在有订单的情况下,编辑这些对象(商品、快递公司、收件人)时,实际动作为禁用原对象,创建新对象。从而,已有订单关联的对象不会变
2、库存:库存字段在商品表里,值为剩余库存,关闭订单时,要恢复库存;管理后台更新库存时,不用创建新商品记录
通用业务
1、应用内通知(提醒、消息):对不特定用户的通知,一个通知表(不关联用户),一个通知已读表(通知ID,用户ID)