我的内心毫无波动

我的内心毫无波动 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

我的内心毫无波动 赞了文章 · 11月10日

PHP8.x 你必须知道的这些新特性

前言

Hello 大家好,我是CrazyCodes,距离上次发文已经过去4个月的时间,今年是悲惨的一年,也是奋发的一年,我会发布一些更好更实用的文章与大家分享,谢谢大家一直以来的支持。

本篇是我参加《2020 PHP开发者峰会》 Nikita分享内了解到的一些知识与大家分享

Nikita 是PHP8的核心开发者。
PHP8的版本会在今年11月26日与各位开发者见面,敬请期待

JIT

值得被提起的则是JIT新的特性,它会将PHP代码转换为传统的机器码,而并非通过zend虚拟机来运行,这样大大的增加了运行速度,但并不向下兼容,这意味着你不能通过像PHP5升级到PHP7那样获得该特性。

JIT可以通过php.ini去设置,例如这样

opcache.jit=on // on 代表打开,则off代表关闭

注解

PHP8版本彻底把注解扶正,当然在这之前像 Symfony,hyperf通过php-parser加入注解的使用方法,但这毕竟不属于PHP8内核真正的部分,在PHP8的版本中,但依旧需要反射

new ReflecationProperty(User::class,"id");

去获取到注解部分,看来注解在PHP的历史长河中还是需要继续不断完善的。

类中的成员变量

小的知识点

在PHP8之前,我们一般会这样定义一个类,首先要设置成员变量,然后在构造或者某一个方法为它赋值。

class User{
    public $username;
    public $phone;
    public $sex;
    
    public function __contruct(
        $username,$phone,$sex
    ){
        $this->username = $username;
        $this->phone = $phone;
        $this->sex = $sex;
    }
}

但在PHP8上,我们可以这样做

class User{
    public function __contruct(
        public string $username = "zhangsan",
        public string $phone = "110110";
        public string $sex = "男"
    ){}
}

命名参数

当我们创建一个函数时,例如

function roule($name,$controller,$model){
    // ... code
}

在调用这个函数时,我们需要顺序输入参数

roule("user/login","UserController","login");

但在PHP8中,我们可以这样做

roule(name:"user/login",controller:"UserController",model:"login");

因为可以需要输入参数名来区分传入的字段,那么在一些函数中,类比中间某项这段需要默认值,那我们就可以跳过这个字段

function roule($name,$controller="UserController",$model){
    // ... code
}
roule(name:"user/login",model:"login");

当然也可以以传统方式与其相结合

roule("user/login",model:"login");

联合类型

在PHP7中,我们在强制函数返回类型时是这样做的

function create() : bool

那么在PHP8中你可以使用多种预测类型

function create() : bool|string

当然在传参时也可以这样做

function create(bool|string $userId)

并且也可以设置类型NULL和TRUE,FALSE了。

总结

以上是PHP8主要的一些特性,所有表达和案例都是在Nikita的基础上描述的,并没有直接照搬,当然Nikita的演讲并不仅仅只有这些,为了保持对峰会主办方的尊重,还请各位移步至
https://www.itdks.com/Home/Ac...
观看Nikita的完整演讲。

致谢

感谢你看到这里,希望本篇文章对你的技术生涯多一分动力,谢谢!

查看原文

赞 17 收藏 7 评论 6

我的内心毫无波动 赞了文章 · 11月10日

国内值得关注的官方API集合

项目地址:https://github.com/marktony/A...

本页仅收集国内部分官方API,如需查看其他版本,请点击这里

目录

笔记

  • 为知笔记 - 为知笔记Windows客户端开放了大量的API,其中绝大部分,都通过COM提供,可以在javascript, C#, C++, Delphi等语言中使用。接口通过IDL(Interface description language)语言描述。

  • 印象笔记 - 印象笔记提供了ActionScript 3, Android, C++, Windows, iOS, Java, JavaScript, OS X, Perl, PHP, Python, Ruby等平台的SDK和完整的API参考文档,可通过API进行认证,笔记,笔记本,附件,搜索,同步等操作,同时提供企业版和本地API。

  • 有道云笔记 - 有道云笔记提供了Android SDK,同时Open API允许进行授权,用户,笔记本,笔记,分享,附件等方面的操作。

出行

  • 滴滴 - 滴滴提供了iOS和Android SDK, 可实现拉起滴滴叫车等方面的操作。

  • 神州专车 - 神州专车提供了API模式和H5模式两种接入模式,允许进行基础信息,订单,支付,充值,用户,发票,代金券,企业等方面的操作。

  • Uber - Uber提供了Android和iOS的SDK,允许进行乘客,行程体验,司机,派送次数等四大方面的操作。

词典

  • 百度翻译 - 百度翻译支持多种语言互相翻译,包含PHP, JS, Python, C, Java版Demo。

  • 必应词典 - 微软翻译API支持文字和语音两种类型,支持多种语言互相翻译,提供C#版本Demo。

  • 金山词霸 - 金山词霸允许进行简单的翻译操作。

  • 扇贝 - 扇贝提供了完整的API,允许进行用户,查询,添加学习记录,忘记单词,例句,笔记等方面的操作。

  • 有道词典 - 有道词典允许进行简单的翻译操作。

电商

  • 当当 - 当当允许商家用户和网站接入授权,可进行商品,订单,图片,问答,店铺和促销等方面的操作。

  • 京东 - 京东提供了Java, PHP, .net的SDK,授权后可进行多种操作。

  • 苏宁开放服务 - 苏宁提供了Java, PHP, .Net, Python版本的SDK,授权后可进行多种操作。

  • 淘宝开放平台 - 淘宝提供了Java, .Net, PHP, Python版本的SDK,授权后提供多种操作。

  • 亚马逊 - 亚马逊提供多种语言版本的SDK,授权后允许多种操作。

地图

  • 百度地图 - 百度地图提供了Android, iOS版本的SDK和JavaScript API,可进行定位、地图、数据、出行、鹰眼轨迹和分析服务。

  • 高德地图 - 高德地图提供了JavaScript和web服务API,Android和iOS SDK,支持地图,定位,搜索,路线规划,导航和室内地图等。

  • 腾讯地图 - 腾讯地图提供了JavaScript API,Android和iOS SDK,支持定位,地图,地点搜索,路线和导航等。

  • 天地图 - 天地图提供了H5 API和JavaScript API等web API,同时提供了Android和iOS SDK,支持基础地图服务,图层管理,地图覆盖物,地图工具,地名搜索和出行规划服务。

  • 图吧地图 - 图吧提供了JavaScript和Flash API,Android和iOS SDK,支持定位,地址解析,位置标注,位置截图,路线规划,周边查询,兴趣点搜索和在线导航。

电影

  • 豆瓣电影 - 豆瓣电影支持电影条目,影人条目,搜索和榜单等。

即时通讯

  • 环信 - 支持Android, iOS, WebIM, Linux, REST集成,支持多种消息类型。

  • 融云 - 支持Android, iOS, Web, 游戏集成,支持多种消息类型。

  • 网易云信 - 支持IM实时通讯,实时音视频,教学白班,专线电话,短信,聊天室,提供iOS, Android, Windows和Web SDK。

  • 腾讯云通信IM - 提供iOS, Android, Windows和Web SDK,支持多种消息类型。

开发者网站

  • 干货集中营 - 提供妹子图和Android, iOS, 前端,拓展资源等内容。

  • diycode - 授权后可访问diycode网站的内容。

  • 开源中国 - 授权后可访问开源中国网站的内容。

  • Ruby China - 授权后可访问Ruby China网站的内容。

  • V2EX - 可访问V2EX网站的内容。

快递查询

  • 爱快递 - 爱快递支持国内90多家快递物流订单查询服务,免费版有使用次数限制,可用于电子商城单号跟踪,手机应用,微信快递接口等服务。

  • 快递100 - 快递100支持300家国内国际快递,免费版有使用次数限制。

  • 快递鸟 - 快递鸟支持国内外400多家快递公司,免费版有使用次数限制,包含.Net, PHP, Java版Demo。

  • 快递网 - 快递网支持上百家快递查询服务,免费版有使用次数限制。

旅游

  • 去哪儿 - 支持获取去哪儿网的内容。

  • 途牛 - 支持途牛网的内容,仅开放给供应商系统。

  • 携程 - 支持携程网的内容。

  • 艺龙 - 支持获取产品数据,完成用户的预订,进行订单查询、更改或取消。提供在线工具,以及H5, Java, C#, PHP, Ruby版本的Demo。

社交

  • 钉钉 - 支持免登,企业通讯录,服务窗,钉盘,地图,会话,DING,电话,音频,扫码,支付,分享等服务,提供SDK和Demo,PC版UI规范,调试工具和钉钉UI组件库。

  • 豆瓣 - 支持图书,电影,音乐,同城,广播,用户,日记,相册,线上活动,论坛,回复和我去等功能,提供豆瓣组件,豆瓣标示和Demo。

  • 开心网 - 支持用户信息,登录授权,好友,传播应用,支付,分享内容,消息,交互,开心网应用等内容,提供SDK,开源插件和标示素材。

  • QQ互联 - 支持用户资料,QQ会员信息,空间相册,腾讯微博资料,分享到腾讯微博,微博好友信息,财付通信息等内容,提供SDK, Demo, 以及设计资源。

  • 微博 - 支持粉丝服务,微博,评论,用户,关系,账号,收藏,搜索,提醒,短链,公共服务,位置服务,地理信息,地图引擎,支付以及OAuth2.0授权等内容,提供微博标示及SDK。

  • 微信 - 支持移动应用,网站应用,公众账号,公众号第三方平台等内容,提供SDK, Demo, 以及设计资源。

视频

  • 爱奇艺 - 支持弹幕,全色彩播放器,高清码流,视频托管,播放爱奇艺视频,应用分发,IOCP等内容。

  • 乐视 - 支持标准直播,标准点播,视频发行平台,移动直播等内容,提供SDK下载。

  • 搜狐视频 - 支持一二级内容获取,内容分类获取,视频详情信息,专辑详情信息,分级列表获取,关键词搜索等内容。

  • 土豆 - 支持视频模块,豆单模块,影视库模块,用户模块,转帖模块,字段定义模块等内容。

  • 优酷 - 支持内容输出,视频搜索,智能推荐,用户登录,用户互动,用户信息,视频上传至优酷,视频互动等内容,提供SDK。

天气

  • 彩云天气 - 支持全球天气数据,两种空气质量数据,天气预报,实况天气,独家降水预报,独家空气质量预报,六种天气数据,四种生活指数数据等内容,部分功能收费。

  • 和风天气 - 支持7-10天预报,实况天气,每小时预报,生活指数,灾害预警,景点天气,历史天气,城市查询等内容,仅国内数据免费。

  • 心知天气 - 支持天气实况,逐日预报和历史,24小时逐小时预报,过去24小时天气历史记录,气象灾害预警,空气质量实况与城市排行,逐日和逐小时空气质量预报,过去24小时空气质量历史记录,生活指数,农历、节气、生肖,机动车尾号限行,日出日落,月初月落和月像,城市搜索等内容,仅国内数据免费。

图片与图像处理

  • Camera360 - 支持全帧率直播美白滤镜,提供SDK和Demo。

  • 嗨图 - 支持图片标注,仅提供iOS版本SDK。

  • 名片全能王 - 支持精准识别几十种语言的名片,自动切边并美化名片图像,自动返回识别结果,提供多种版本SDK,收费。

  • 企业证件识别 - 支持身份证,驾驶证,护照等,收费。

  • 扫描全能王 - 支持图像智能剪裁,五种图像增强模式,手动调节图像细节,自动返回扫描结果等,提供iOS与Android版本SDK,收费。

  • 我知图 - 支持相似图像搜索,图像识别匹配,图像识别关键词推荐,重复图片探测等内容。

  • 银行卡|信用卡识别 - 提供SDK和API,收费。

外卖

  • 百度外卖 - 支持商户,菜品,商品,订单和基础数据等内容,提供SDK和Demo。

  • 大众点评 - 支持商户,团购,在线预定,商品点评,数据统计,元数据等内容。

  • 饿了么 - 支持查询,预定,订单,其他订单,数据推送,支付,评价,活动,账户同步,数据落地同步等内容。

  • 美团外卖 - 支持门店,配送范围,菜品,药品,订单,订单推送等内容。

消息推送

  • 百度云推送 - 支持iOS, Android和服务器端,支持推送,统计,组管理等Rest API接口。服务器端支持Java, Python, PHP, REST API。提供所支持各语言版本的SDK。

  • 华为推送 - 支持Android,提供SDK。

  • 极光 - 支持Android, iOS, WindowsPhone, 服务器端REST API, 提供Java, Python, PHP, Ruby, C#, Node.js等版本的SDK。

  • LeanCloud - 支持Android, iOS, WindowsPhone和Web网页推送,使用云引擎和JavaScript创建推送,使用REST API推送消息。提供Objectvie-C(开放源码), JavaScript(开放源码), Android, Unity, .Net, WindowsPhone, Java(开放源码), Python(开放源码), PHP(开放源码), C++(开放源码), Swift(开放源码)版本SDK。同时提供Demo。

  • 腾讯信鸽 - 支持iOS和Android平台,服务器端采用Rest API, 同时服务器端支持Java, PHP, Python等语言并提供SDK。

  • 小米 - 支持Android和iOS平台,服务器端支持Java, Python并提供SDK。

  • 友盟 - 支持Android和iOS平台,服务器端支持PHP, Java, Python并提供SDK。

音乐

  • 豆瓣音乐 - 支持音乐信息,评论信息,标签信息,搜索音乐,某个音乐中标记最多的标签,发表、修改、删除评论,用户对音乐的所有标签等内容。

  • 考拉FM - 支持获取指定分类下列表和内容,搜索指定关键字内容,专辑/电台/直播详情,指定专辑下列表,指定电台播单,分类下专辑TOP50,指定期(碎片)所在专辑最新分页功能,分类下全部直播计划,版本升级接口,排行榜,精选,传统电台列表/详情/地区等。

  • 企鹅FM - 支持获取电台分类列表,电台分类下的专辑信息列表,专辑下节目信息列表,电台节目播放链接,搜索关键字相关主播/专辑/节目,主播名下专辑,特定时间段内新增主播/更新的专辑/新增的专辑等。

  • 蜻蜓FM - 支持OAuth2.0授权,音频数据中心,分类,点播,直播,临时直播,排行榜,搜索,内容更新状态,主播,此刻,专题,活动等内容。

  • 喜马拉雅FM - 支持Android和iOS平台,并提供相应的SDK和Demo,具体支持内容请下载相关文件查看。

  • 阿里云 - 支持弹性计算,数据库,存储与CDN,网络,应用服务,域名与网站等类别的内容,并提供了相关SDK。

  • 百度云 - 支持计算和网络,存储和CDN,数据库,安全和管理,数据分析,智能多媒体服务,物联网服务,人工智能,应用服务,网站服务,数字营销服务等内容,并提供相关的SDK。

  • Bmob - 支持云数据库,容器服务,消息推送,文件存储,短信验证码,及时通讯,云端逻辑,定时任务,地理位置等。

  • LeanCloud - 支持云存储,数据分析,用户关系,实时通讯,消息推送,移动统计等。

  • 七牛云 - 支持对象存储,融合CDN,直播云,数据处理等。

  • 腾讯云 - 支持计算,网络,存储与CDN,数据库,安全服务,监控与管理,域名服务,视频服务,大数据与AI等内容,提供相关SDK。

  • 野狗 - 支持实时数据同步,实时视频通话,及时通讯,短信,身份认证等。

语音识别

  • 百度语音 - 支持全平台REST API, 离线在线融合模式,深度语义解析,场景识别定制,自定义上传语料、训练模型,基础服务永久免费。提供相应SDK和Demo应用。

  • 搜狗语音云开放平台 - 支持在线/离线语音识别,在线听歌识曲,离线语音合成等内容。提供相应平台SDK。

  • 讯飞开放平台 - 支持语音听写/转写,在线/离线命令词识别,语音唤醒等内容,平台支持广泛,提供相应SDK。

综合

  • 阿凡达数据 - 支持金融股票,充值认证,便民类,新闻文章,医药交通,科教文艺,创意数据,及时通讯等内容。

  • 阿里大于 - 支持验证码,短信通知,语音通知,流量钱包充值,私密专线,群发助手等内容。

  • APiX - 支持基础征信数据,信用分析服务,支付缴费接口等数据,部分免费。

  • 百度API STORE - 支持多种类型数据,部分免费,提供SDK。

  • HaoService - 支持多种类型数据。

  • 聚合数据 - 支持多种类型数据,部分免费。

  • 通联数据 - 提供金融类数据,支持免费试用。

查看原文

赞 33 收藏 96 评论 3

我的内心毫无波动 赞了文章 · 11月10日

PHP程序员必看书籍

以下都是我看过都书籍,无论是新手或中级别的工程师,我可以保证内容质量,大佬可跳过

概述

知识无价,还是建议各位童鞋把更多的资金投入到学习中。书名排名不分前后

《PHP7内核剖析》

深入理解PHP最佳良品

https://item.jd.com/203763489...

《鸟哥的Linux私房菜》

PHP码农最爱的LINUX入门书籍
https://item.jd.com/155195140...

《Modern PHP (中文版)》

学习(新)PHP的好书
https://item.jd.com/100062101...

《Learning PHP设计模式》

不会设计模式,你跟我说你是程序员?
https://item.jd.com/11421261....

《细说PHP》

这是我入门PHP的时候看的一本书,内容虽然有些摘抄,但知识点概括的很全
https://item.jd.com/115354399...

《高性能PHP 7》

PHP全球开发者大会上推荐的一本书,感觉内容很前卫、新鲜。吕毅大佬翻译的
https://item.jd.com/12134218....

《Docker技术入门与实战》

你确定你不了解下Docker ?
https://item.jd.com/12121728....

《疯狂JAVA讲义》

其实Java应该在PHP开发者的必会名单内
https://item.jd.com/12261787....

《Redis入门指南(第2版)》

nosql 了解一下?
https://item.jd.com/11685574....

《算法谜题》

代码敲累了?来~换换脑子
https://item.jd.com/11412901....

致谢

感谢各位看完本篇白话文,最近几天一直在写相当于过往经历一样的文章,并不是不去创造新的内容,而是我更希望把我所知道的,我做过的,告诉大伙,好的地方可借鉴,差的地方可预防。我也不是一个大佬。互相学习把。谢谢

查看原文

赞 93 收藏 93 评论 13

我的内心毫无波动 赞了文章 · 11月9日

电商系统设计之商品接口

clipboard.png

前言

我应该是少数在文章中直接展示接口文档的人。本篇我思考了很久到底要不要解析下商品接口开发的注意点。

客户端开发与服务端开发即是天敌也是兄弟。希望本篇文章让你们减少争执,把“爱”给对方。

接口设计

简述

电商系统设计之中,比较复杂的接口就论商品详情的接口了,响应参数特别多,特别杂。在开发获取商品详情接口时要遵循以下几个原则

  • 返回的JSON嵌套数量要少
  • 方便去查询到指定的SKU
  • 其他接口相关规范

clipboard.png

查询SKU

关于查询SKU,我让我的小伙伴是这样做的,首先拿出规格和属性

"选择颜色": [
   {
          "name": "银色",
          "id": 75
   }
],
"选择版本": [
   {
          "name": "公开版",
          "id": 77
   },
   {
          "name": "【原厂延保版】",
          "id": 78
   }  
],
"内存": [
   {
          "name": "64G",
          "id": 82
   },
   {
          "name": "256G",
          "id": 83
   }
],
      

没错,你没有看错,实际就是将规格作为key,属性作为value。将value[id]取出,进行拼接即可查询到对应的SKU了。

响应参数[规格名称][属性编码] = 拼接SKU串的必需品

规格相当于一个分组,属性其实也是拼接SKU的重要组成部分,上述数据为例

75_77_82 = 银色,公开版,64G

接口文档

请求地址

/v1/product/{productId}

请求类型

GET

请求参数

参数类型默认值说明
productIdint0商品编码

响应示例

{
  "code": 200,
  "message": "获取成功",
  "data": {
    "id": 131,
    "name": "Apple iPhone X (A1865) 64GB 深空灰色 移动联通电信4G手机",
    "price": "8388.00",
    "market_price": "8388.00",
    "sketch": "IPhone大法好,打九折,打九折,快剁手",
    "intro": "这是商品描述",
    "keywords":['苹果','iphone'],
    "attribute": {
      "选择颜色": [
        {
          "name": "银色",
          "id": 75
        },
        {
          "name": "深空灰色",
          "id": 76
        }
      ],
      "选择版本": [
        {
          "name": "公开版",
          "id": 77
        },
        {
          "name": "【原厂延保版】",
          "id": 78
        },
        {
          "name": "双网通版",
          "id": 79
        },
        {
          "name": "无线充套装",
          "id": 80
        },
        {
          "name": "Airpods套装",
          "id": 81
        }
      ],
      "内存": [
        {
          "name": "64G",
          "id": 82
        },
        {
          "name": "256G",
          "id": 83
        }
      ],
      "购买方式": [
        {
          "name": "官方标配",
          "id": 84
        },
        {
          "name": "移动优惠购",
          "id": 85
        },
        {
          "name": "电信优惠购",
          "id": 86
        },
        {
          "name": "联通优惠购",
          "id": 87
        }
      ]
    },
    "album": [
      {
        "id": 2,
        "name": "这是第一张图片",
        "url": "http://xxx.com/59ec33eaN6ddb0c54.jpg"
      },
      {
        "id": 3,
        "name": "这是第二张图片",
        "url": "http://xxx.com/59ec3400Nce4cc116.jpg"
      }
    ],
    "radio": {
      "id": 1,
      "name": "这是一个视频",
      "url": "http://xxx.com/1.mp4"
    },
    "sku": {
      "75_77_82_84": {
        "id": 1018,
        "name": "选择颜色:银色;选择版本:公开版;内存:64G;购买方式:官方标配;",
        "price": "8388.00",
        "stock": 83888388
      },
      "75_77_82_85": {
        "id": 1019,
        "name": "选择颜色:银色;选择版本:公开版;内存:64G;购买方式:移动优惠购;",
        "price": "8388.00",
        "stock": 83888388
      },
      "75_77_82_86": {
        "id": 1020,
        "name": "选择颜色:银色;选择版本:公开版;内存:64G;购买方式:电信优惠购;",
        "price": "8388.00",
        "stock": 83888388
      },
      "75_77_82_87": {
        "id": 1021,
        "name": "选择颜色:银色;选择版本:公开版;内存:64G;购买方式:联通优惠购;",
        "price": "8388.00",
        "stock": 83888388
      },
      "75_77_83_84": {
        "id": 1022,
        "name": "选择颜色:银色;选择版本:公开版;内存:256G;购买方式:官方标配;",
        "price": "8388.00",
        "stock": 83888388
      },
      "75_77_83_85": {
        "id": 1023,
        "name": "选择颜色:银色;选择版本:公开版;内存:256G;购买方式:移动优惠购;",
        "price": "8388.00",
        "stock": 83888388
      }
    }
  }
}

响应参数说明

核心参数

参数类型默认值说明
idint0商品编码
namestring-商品标题
pricedouble00.00商品价格
keywordsstring-商品关键字
market_pricedouble00.00市场价格
virtualint0虚拟销量
sketchstring-商品简述
introstring-商品详情

商品图参数

参数类型默认值说明
album[]array[]商品轮播图
idint0资源编码
namestring-图片名称
urlstring-资源路径

商品视频参数

无视频则返回 []
参数类型默认值说明
radio[]array[]商品视频
idint0资源编码
namestring-视频名称
urlstring-资源路径

商品规格/属性参数

参数类型默认值说明
attributearray[][]商品属性
[(attr_name)] []array[][]属性名称
namestring-属性项名称
idint0属性项编码

商品SKU参数

参数类型默认值说明
sku[]array[][]商品sku
[(option_id)] []array[]商品SKU查询办法为 attribute(attr_name) 拼接
idint0sku编码
namestring-sku 名称
pricedouble00.00商品价格
stockint0商品库存

致谢

字不在多,讲清楚就行,感谢你看到这里,希望本篇文章可以帮助到你,有疑问可以在评论区讨论,谢谢。

查看原文

赞 57 收藏 37 评论 10

我的内心毫无波动 赞了文章 · 11月9日

电商系统设计之运费模板(上)

clipboard.png

电商大伙每天都在用,类似某猫,某狗等。
电商系统设计看似复杂又很简单,看似简单又很复杂
本章适合初中级工程师细看,大佬请随意

前言

在订单系统中,运费模板是其中一个重要组成部分,看似简单的一个设置,在其内的设计中,要考虑的问题还是很多滴,开始进入正题

运费模板

1587983386971.jpg

运费模板由

  • 模板名称
  • 是否包邮
  • 默认运费
  • 特定地区运费

四部分组成,所谓模板则就是设置这样一个框架,由多个商品多对一调用一个模板,通过模板设置的规则来计算配送费用,看似简单的功能,由我来拆解开跟各位聊聊。

运费规则

无论是默认运费还是特定地区运费,无非设置如下
image.png
默认几件内多少元,每增加几件运费增加多少元
特定地区则多几步设置
image.png
image.png
特定地区的运费规则可设置多个,对某个偏远地区,如西藏、新疆设置独立的配送费用

设计原则

在运费模板的设计上,应当遵循一个通用原则,难在新增易在查询,一个应用程序使用查询语句的次数要比插入多多了。当然也应该尽可能的做到增删改查都比较简单才是最佳。

首页整理下,运费模板使用的位置

  • 后台的运费模板管理(增删改查)
  • 前端实时计算运费
  • 后端接收订单后进行的运费计算
  • 后续的退款(如未发货,则应退运费)

在数据库设计中,尤其是电商相关的数据表设计,竟然会使用冗余的方法处理相关数据,意在永久保存用户在下单的时候产生的关联数据,这些数据不会因其他字表修改而变化。

数据表设计

本次对运费模板上的设计,采用一主表一子表的方式来做。
主表则是由简单的模板名称,是否包邮,创建时间构成,表结构如下

CREATE TABLE `product_template` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '模板名称',
  `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '类型 0 自定义运费 1 包邮',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

而子表为运费规则表,也是运费模板的核心灵魂,直接决定了是否会简化增删改查的复杂度。我以一对多的方式来设计规则表。将默认运费与指定运费合并在一个表内,表结构如下

CREATE TABLE `product_template_rule` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `template_id` int(11) NOT NULL COMMENT '模板编码',
  `city` text COLLATE utf8mb4_unicode_ci COMMENT '城市',
  `default_number` int(11) NOT NULL DEFAULT '0' COMMENT '默认数量',
  `default_price` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '默认运费',
  `create_number` int(11) NOT NULL DEFAULT '0' COMMENT '新增数量',
  `create_price` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '新增运费',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

通过template_id查询指定运费模板内包含的所有规则,因为默认运费是不需要选择城市的。所以则为 (Laravel 代码)

ProductTemplateRule::where([
        ['template_id', '=', $templateId],
    ])
        ->where('city', '=', '[]')
        ->first();

而指定城市批量查询出来则使用

ProductTemplateRule::where([
        ['template_id', '=', $templateId],
    ])
        ->where('city', '!=', '[]')
        ->first();

规则查询就这样简单的完成了。查询如此简单,插入其实也并不是太难,代码如下,前端通过JSON方式将已设置好的模板规则发送到后端,如果是默认运费模板则城市为空JSON,JSON格式如下

[
    {
        'city'=>[],
        'default_number'=>1,
        'default_price'=>1.00,
        'create_number'=>1,
        'create_price'=>1.00
    },
    {
        'city'=>['北京市','上海市'],
        'default_number'=>1,
        'default_price'=>1.00,
        'create_number'=>1,
        'create_price'=>1.00
    }
]

最终的创建运费模板的代码如下

public function create(Request $request)
{
    $template        = new ProductTemplate();
    $template->title = $request->title;
    $template->type  = $request->type;
    $result          = $template->save();

    if (!$result) {
        throw new \Exception('创建失败');
    }

    $config = json_decode($request->config);
    foreach ($config as $item) {
        $rule                 = new ProductTemplateRule();
        $rule->template_id    = $template->id;
        $rule->city           = json_encode($item->city);
        $rule->default_number = $item->default_number;
        $rule->default_price  = $item->default_price;
        $rule->create_number  = $item->create_number;
        $rule->create_price   = $item->create_price;
        $rule->save();
    }

}

本章对设计表和如何创建做了详细讲解,下章说说应当如何计算运费效率最高~

致谢

感谢你看到这里,希望本篇文章可以帮助到你,谢谢。

查看原文

赞 24 收藏 15 评论 5

我的内心毫无波动 赞了文章 · 11月9日

电商系统设计之订单

timg?image&quality=80&size=b9999_10000&sec=1532631649974&di=1d2a5259543900a105826e512fb6e8a3&imgtype=0&data-original=http%3A%2F%2Fpic.cifnews.com%2Fupload%2F201503%2F23%2F201503230925232295.jpg

前言

用户交易将经历一段艰辛的历程,一般用户感觉不到,实际程序是经历了一段生死离别。具体付款流程如下

clipboard.png

不(wo)是(gu)这(yi)张(chuan)图(de),请看正经流程图

clipboard.png

之前的几篇文章介绍了

  • 购物车如何设计
  • 用户系统如何设计
  • 商品系统如何设计

其实他们都在为交易系统做铺垫,一个产品如果没有收入,那这只能是寺庙的公益产品。任何产品最终都要走向这步 (收钱)。

付款

用户付款过程中有很多场景也会出现意外,以下是我碰到的“天灾人祸”

成功

  • 用户发起微信支付并成功支付
  • 用户发起支付宝支付并成功支付
  • 用户发起银联支付并成功支付
  • 用户发起其他支付并成功支付

人祸

  • 用户发起微信支付但取消支付
  • 用户发起支付宝支付但取消支付
  • 用户发起银联支付但取消支付
  • 用户发起其他支付但取消支付

天灾

  • 用户发起微信支付“手机爆炸了”
  • 用户发起支付宝支付“瞬间没网了”
  • 用户发起银联支付“老婆来电话了”
  • 用户发起其他支付“老板进来了”

注释

遇到以上的情况,不要害怕、不要惊慌,并且不要“理会”,你只需要将这些操作记录下来即可。
正常我们都会将用户通过哪种支付方式存储到订单表中,方便查询。我想说这种做法没错,但是少了点什么,你应该有一张交易记录表,来记录用户发起了多少次支付,只有支付成功的时候方可记录到订单表中。这样做的优点有以下两点

  • 订单表是比较重要的,迫不得已尽量不要操作这张表,防止出现意外,订单表除了收货发货外一般没有其他需要操作的地方。
  • 可以记录每次用户发起支付的时间,通过所谓大数据分析用户对产品的需求度和认可度,如果用户多次发起付款但取消支付,那就说明(他没钱)他可能很期望得到,但是因为某种原因一直在犹豫,这个时候可以针对当前用户做优惠处理,例如发一张优惠券等等。

clipboard.png

表结构

交易表

CREATE TABLE `transaction` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_sn` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '交易单号',
  `member_id` bigint(20) NOT NULL COMMENT '交易的用户ID',
  `amount` decimal(8,2) NOT NULL COMMENT '交易金额',
  `integral` int(11) NOT NULL DEFAULT '0' COMMENT '使用的积分',
  `pay_state` tinyint(4) NOT NULL COMMENT '支付类型 0:余额 1:微信 2:支付宝 3:xxx',
  `source` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '支付来源 wx app web wap',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付状态 -1:取消 0 未完成 1已完成 -2:异常',
  `completion_time` int(11) NOT NULL COMMENT '交易完成时间',
  `note` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `transaction_order_sn_member_id_pay_state_source_status_index` (`order_sn`(191),`member_id`,`pay_state`,`source`(191),`status`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

支付记录表

CREATE TABLE `transaction_record` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_sn` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `events` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '事件详情',
  `result` text COLLATE utf8mb4_unicode_ci COMMENT '结果详情',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这个记录表可能让你匪夷所思,不知你对日志有什么概念,但我能说的就是,将用户的所有动作全部记录下来。这是很重要的,早晚你会懂。

订单表

CREATE TABLE `order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_no` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单编号',
  `order_sn` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '交易号',
  `member_id` int(11) NOT NULL COMMENT '客户编号',
  `supplier_id` int(11) NOT NULL COMMENT '商户编码',
  `supplier_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商户名称',
  `order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态 0未付款,1已付款,2已发货,3已签收,-1退货申请,-2退货中,-3已退货,-4取消交易',
  `after_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '用户售后状态 0 未发起售后 1 申请售后 -1 售后已取消 2 处理中 200 处理完毕',
  `product_count` int(11) NOT NULL DEFAULT '0' COMMENT '商品数量',
  `product_amount_total` decimal(12,4) NOT NULL COMMENT '商品总价',
  `order_amount_total` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT '实际付款金额',
  `logistics_fee` decimal(12,4) NOT NULL COMMENT '运费金额',
  `address_id` int(11) NOT NULL COMMENT '收货地址编码',
  `pay_channel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付渠道 0余额 1微信 2支付宝',
  `out_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单支付单号',
  `escrow_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '第三方支付流水号',
  `pay_time` int(11) NOT NULL DEFAULT '0' COMMENT '付款时间',
  `delivery_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
  `order_settlement_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单结算状态 0未结算 1已结算',
  `order_settlement_time` int(11) NOT NULL DEFAULT '0' COMMENT '订单结算时间',
  `is_package` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否是套餐',
  `is_integral` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否是积分产品',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `order_order_sn_unique` (`order_sn`),
  KEY `order_order_sn_member_id_order_status_out_trade_no_index` (`order_sn`,`member_id`,`order_status`,`out_trade_no`(191))
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

运输

用户付款结束后接下来就是快递公司的事了,当然咱们不搭理送快递的。到这一步我们就应该给客户展示运输信息。现在一些api开放平台都有快递查询的服务,有收费有免费的,性能方面差异也不大。但这里要注意一点。不是每次用户都会查询到新的信息。对于小公司来说,这样成本极高。所以我们应该定时去查询快递物流信息。这个地方有个简单的算法。

if(用户点击查看了){
    从用户点击查看两小时后更新物流信息 // 这里是按照两小时来更新的,也可以拉长这个时间
}else{
    每两小时更新一次物流信息
}

这种频繁的更新绝对要使用nosql,当用户确认收货后再存储到mysql等数据库中。

收货

当用户收到货后,这其实是最难伺候的时候,用户对产品的各种不满意就可能导致退换货,收货操作既改变订单状态为已收货,复杂点的可能还需要im,短信,推送提醒下。一般都直接提醒,量大的话加入队列内处理。

退换货

退换货淘宝是这样处理的。
淘宝将订单分两种状态

  • 未付款、已付款、已收货、已评价
  • 发起售后、售后审核、售后处理、处理完成

clipboard.png

图1展示了每个商品,包括子商品都可以单独发起售后

clipboard.png

图2是点击申请售后之后的页面

clipboard.png

图3是选择退换货的相关事项

当完成这些步骤后,就会开启售后审核,卖家审核成功后方可进行下一步操作

售后申请表

CREATE TABLE `order_returns_apply` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单单号',
  `order_detail_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '子订单编码',
  `return_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '售后单号',
  `member_id` int(11) NOT NULL COMMENT '用户编码',
  `state` tinyint(4) NOT NULL COMMENT '类型 0 仅退款 1退货退款',
  `product_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '货物状态 0:已收到货 1:未收到货',
  `why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退换货原因',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '审核状态 -1 拒绝 0 未审核 1审核通过',
  `audit_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
  `audit_why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核原因',
  `note` text COLLATE utf8mb4_unicode_ci COMMENT '备注',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

售后表

CREATE TABLE `order_returns` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `returns_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货编号 供客户查询',
  `order_id` int(11) NOT NULL COMMENT '订单编号',
  `express_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流单号',
  `consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货人姓名',
  `consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
  `consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '备用联系电话',
  `consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货地址',
  `consignee_zip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮政编码',
  `logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '物流方式',
  `logistics_fee` decimal(12,2) NOT NULL COMMENT '物流发货运费',
  `order_logistics_status` int(11) DEFAULT NULL COMMENT '物流状态',
  `logistics_settlement_status` int(11) DEFAULT NULL COMMENT '物流结算状态',
  `logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流最后状态描述',
  `logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流描述',
  `logistics_create_time` int(11) DEFAULT NULL COMMENT '发货时间',
  `logistics_update_time` int(11) DEFAULT NULL COMMENT '物流更新时间',
  `logistics_settlement_time` int(11) DEFAULT NULL COMMENT '物流结算时间',
  `returns_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0全部退单 1部分退单',
  `handling_way` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'PUPAWAY:退货入库;REDELIVERY:重新发货;RECLAIM-REDELIVERY:不要求归还并重新发货; REFUND:退款; COMPENSATION:不退货并赔偿',
  `returns_amount` decimal(8,2) NOT NULL COMMENT '退款金额',
  `return_submit_time` int(11) NOT NULL COMMENT '退货申请时间',
  `handling_time` int(11) NOT NULL COMMENT '退货处理时间',
  `remark` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货原因',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

评价

如果用户收货后直接评价了,那恭喜你,这笔订单基本成交了。这个没什么可讲的,一般小的电商也没有刷评价的,类似淘宝的防止刷评价的做法太过于复杂,这里也不过多讲解(其实我也没接触过)。

评价数据表

CREATE TABLE `order_appraise` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL COMMENT '订单编码',
  `info` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '评论内容',
  `level` enum('-1','0','1') COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '级别 -1差评 0中评 1好评',
  `desc_star` tinyint(4) NOT NULL COMMENT '描述相符 1-5',
  `logistics_star` tinyint(4) NOT NULL COMMENT '物流服务 1-5',
  `attitude_star` tinyint(4) NOT NULL COMMENT '服务态度 1-5',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `order_appraise_order_id_index` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

致谢

感谢你看到这里,希望我的文章和代码可以帮助到你。如果有什么疑问可以在评论区留言,谢谢

查看原文

赞 166 收藏 124 评论 45

我的内心毫无波动 赞了文章 · 11月9日

电商系统设计之商品 (下)

clipboard.png

电商大伙每天都在用,类似某猫,某狗等。
电商系统设计看似复杂又很简单,看似简单又很复杂
本章适合初级工程师及中级工程师细看,大佬请随意

前言

商品系统与订单系统(交易系统)是相铺相成的,当买家购买商品后将经历一个过程

商品系统->交易系统->订单系统->物流系统->售后系统

clipboard.png

完成上述流程则是完成了一笔交易,经常网上购物的童鞋都懂这个。今天我们讲下从商品系统到交易系统和订单系统的存储过程及其设计上的应该注意的“坑”。

存储

前俩篇文章讲解的商品系统的SKU与SPU的设计过程

  • SPU(Standard Product Unit)标准化产品单元
  • SKU(Stock Keeping Unit)库存量单元

现在我们已经清楚商品系统数据表的设计并且清楚为什么要这样设计。

现在抛出了一个问题

用户购买的商品如何存储到订单/交易系统中?

关联问题

现在有这么一个场景

小明在某宝买了一部爱疯手机,颜色是红色,存储是32G,他选择使用某宝支付.
SKU产品颜色存储
001爱疯手机红色32G
002爱疯手机红色256G
003爱疯手机黑色32G
004爱疯手机黑色256G

小明选择购买SKU=001的产品,正常情况下订单表应该与此SKU编码相关联来维持数据一致性。像这样

订单号用户SKU
SN110小明001

这种设计有个弊端,商品的名称及价格都不是固定,如果商户修改了商品的标题或者其他的属性,那小明当时买的爱疯手机是8000元,结果过了几年降价了商户修改了价格,结果小明的购买清单里也变成了修改后的价格,所以说这种仅仅关联的设计是不可取的(至少在电商系统中不可取)。

订单号用户SKU商品标题商品价格商品封面图商品其他属性
SN110小明001爱疯手机8000aifeng.png其他属性

像上表中设计,有人会问了 “那关联的意义何在呢?”

我的回答是 “保持数据关联” ,虽然商户有可能改变商品属性,但作为一名程序员,应该尽可能的记录用户所有的动作。

文末有订单表的数据结构

多商户电商

实际在电商系统设计上,个人感觉不应区分多商户的电商与单用户的电商(至少开发者不应区分他们),但前期设计上就应把多商户概念带入到系统内。哪怕只有一个官方专卖店呢?!

clipboard.png

涉及到多商户就需要考虑用户统一下单问题了。

  • 订单是由购物车下单,多个商品来自多个商户
  • 如果进行拆单、分单
  • 如何进行下单通知等等多商户的问题

关于多商户的问题不是本章的重点,本次我先提出这几个疑问,感兴趣的同学可以提前思考下,后续文章会详细讲解

订单是由购物车下单,多个商品来自多个商户

如果下单是来自多个商户的商品,那么订单的数据库接口应该这样设计

订单表

订单号用户
SN110小明

订单详情表

订单号SKU用户商户
SN110001小明官方
SN110002小明第三方

无论购买多少商品并且商品归属于多少个商户,我们都应把用户一次性购买的商品归属与一个订单,订单下再关联多个商品的详情。在售后操作上,也方便买家退换单个商品。

文末有详细数据结构设计

后台功能列表

这里提供下功能名称与URL为参考

菜单名称URL
商品管理/product
发布商品/product/create
商品类目/product/category
品牌管理/product/brand
规格管理/product/attribute
回收站/product/recycle
订单列表/order

后台的设计和操作套路我会单独拿一篇文章来介绍。这里只做一个大概的table。

数据表

order 订单表

CREATE TABLE `order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_no` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单编号',
  `order_sn` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '交易号',
  `member_id` int(11) NOT NULL COMMENT '客户编号',
  `supplier_id` int(11) DEFAULT '0' COMMENT '商户编码',
  `supplier_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商户名称',
  `order_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态 0未付款,1已付款,2已发货,3已签收,-1退货申请,-2退货中,-3已退货,-4取消交易 -5撤销申请',
  `after_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '用户售后状态 0 未发起售后 1 申请售后 -1 售后已取消 2 处理中 200 处理完毕',
  `product_count` int(11) NOT NULL DEFAULT '0' COMMENT '商品数量',
  `product_amount_total` decimal(12,4) NOT NULL COMMENT '商品总价',
  `order_amount_total` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT '实际付款金额',
  `logistics_fee` decimal(12,4) NOT NULL COMMENT '运费金额',
  `address_id` int(11) NOT NULL COMMENT '收货地址编码',
  `pay_channel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付渠道 0余额 1微信 2支付宝',
  `out_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单支付单号',
  `escrow_trade_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '第三方支付流水号',
  `pay_time` int(11) NOT NULL DEFAULT '0' COMMENT '付款时间',
  `delivery_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
  `order_settlement_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单结算状态 0未结算 1已结算',
  `order_settlement_time` int(11) NOT NULL DEFAULT '0' COMMENT '订单结算时间',
  `is_package` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '是否是套餐',
  `is_integral` enum('0','1') COLLATE utf8mb4_unicode_ci DEFAULT '0' COMMENT '是否是积分产品',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `order_order_sn_member_id_order_status_out_trade_no_index` (`order_sn`,`member_id`,`order_status`,`out_trade_no`(191))
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

order_detail 订单详情

CREATE TABLE `order_detail` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL COMMENT '订单编码',
  `product_id` int(11) NOT NULL COMMENT '商品编码',
  `product_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品名称',
  `product_price` decimal(12,4) NOT NULL COMMENT '商品价格',
  `product_sku` int(11) NOT NULL COMMENT '商品SKU',
  `product_picture_url` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `product_mode_desc` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品型号信息',
  `product_mode_params` int(11) DEFAULT NULL COMMENT '商品型号参数',
  `discount_rate` tinyint(4) NOT NULL DEFAULT '0' COMMENT '折扣比例',
  `discount_amount` decimal(12,4) NOT NULL DEFAULT '0.0000' COMMENT '折扣比例',
  `number` int(11) NOT NULL DEFAULT '1' COMMENT '购买数量',
  `subtotal` decimal(12,4) NOT NULL COMMENT '小计金额',
  `is_product_exists` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '商品是否有效 1失效',
  `remark` text COLLATE utf8mb4_unicode_ci COMMENT '客户商品备注',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `order_detail_order_id_index` (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

order_logistics 订单物流

CREATE TABLE `order_logistics` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL COMMENT '订单编码',
  `express_no` varchar(125) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发货快递单号',
  `consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货人姓名',
  `consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
  `consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备用联系电话',
  `consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货地址',
  `consignee_zip` int(11) NOT NULL COMMENT '邮政编码',
  `logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流方式',
  `logistics_fee` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '物流发货运费',
  `order_logistics_status` int(11) NOT NULL DEFAULT '0' COMMENT '物流状态',
  `logistics_settlement_status` int(11) NOT NULL DEFAULT '0' COMMENT '物流结算状态',
  `logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流最后状态描述',
  `logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流描述',
  `logistics_create_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间',
  `logistics_update_time` int(11) NOT NULL DEFAULT '0' COMMENT '物流更新时间',
  `logistics_settlement_time` int(11) NOT NULL DEFAULT '0' COMMENT '物流结算时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=114 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

order_returns 订单退换货

CREATE TABLE `order_returns` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `returns_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货编号 供客户查询',
  `order_id` int(11) NOT NULL COMMENT '订单编号',
  `express_no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流单号',
  `consignee_realname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货人姓名',
  `consignee_telphone` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话',
  `consignee_telphone2` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '备用联系电话',
  `consignee_address` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收货地址',
  `consignee_zip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮政编码',
  `logistics_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '物流方式',
  `logistics_fee` decimal(12,2) NOT NULL COMMENT '物流发货运费',
  `order_logistics_status` int(11) DEFAULT NULL COMMENT '物流状态',
  `logistics_settlement_status` int(11) DEFAULT NULL COMMENT '物流结算状态',
  `logistics_result_last` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流最后状态描述',
  `logistics_result` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '物流描述',
  `logistics_create_time` int(11) DEFAULT NULL COMMENT '发货时间',
  `logistics_update_time` int(11) DEFAULT NULL COMMENT '物流更新时间',
  `logistics_settlement_time` int(11) DEFAULT NULL COMMENT '物流结算时间',
  `returns_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0全部退单 1部分退单',
  `handling_way` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'PUPAWAY:退货入库;REDELIVERY:重新发货;RECLAIM-REDELIVERY:不要求归还并重新发货; REFUND:退款; COMPENSATION:不退货并赔偿',
  `returns_amount` decimal(8,2) NOT NULL COMMENT '退款金额',
  `return_submit_time` int(11) NOT NULL COMMENT '退货申请时间',
  `handling_time` int(11) NOT NULL COMMENT '退货处理时间',
  `remark` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退货原因',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

order_returns_apply 售后申请

退换货申请
CREATE TABLE `order_returns_apply` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `order_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单单号',
  `order_detail_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '子订单编码',
  `return_no` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '售后单号',
  `member_id` int(11) NOT NULL COMMENT '用户编码',
  `state` tinyint(4) NOT NULL COMMENT '类型 0 仅退款 1退货退款',
  `product_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '货物状态 0:已收到货 1:未收到货',
  `why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '退换货原因',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '审核状态 -1 拒绝 0 未审核 1审核通过',
  `audit_time` int(11) NOT NULL DEFAULT '0' COMMENT '审核时间',
  `audit_why` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核原因',
  `note` text COLLATE utf8mb4_unicode_ci COMMENT '备注',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

致谢

感谢你看完这篇文章,接下来会继续出一些电商相关的文章,例如交易系统的设计、订单系统的设计等等。感谢近期来关注我的童鞋们。作为一个程序员,我很荣幸能把我知道的分享给大家。

代码多变,初心不变

查看原文

赞 131 收藏 94 评论 19

我的内心毫无波动 关注了用户 · 11月9日

CrazyCodes @crazycodes

https://github.com/CrazyCodes... 我的博客
_
| |__ __ _
| '_ \| | | |/ _` |
| |_) | |_| | (_| |
|_.__/ \__,_|\__, |

         |___/   感谢生命可以让我成为一名程序员

                         CrazyCodes To Author

关注 4670

我的内心毫无波动 赞了文章 · 11月9日

电商系统设计之商品 (中)

clipboard.png

电商大伙每天都在用,类似某猫,某狗等。
电商系统设计看似复杂又很简单,看似简单又很复杂
本章适合初级工程师及中级工程师细看,大佬请随意

前言

上一篇文章我们讲了关于电商SPU,SKU的概念,以及为何要设计自定义属性与自定义规格并解释了何时可以用到它们。我一直在说电商是一个既简单又复杂的东西,本章我们再一次深度解析电商系统商品设计的更多逻辑与实现。

关联

SPU对应多个SKU,SPU实际就是主商品表,类似于iphonex这款手机,而SKU则是这个商品绑定的规格表,类似与iphonex 红色款,iphonex 黑色款等。

clipboard.png

而主表与规格表也关联了其他表

专辑

在淘宝的逻辑中,商家可为商品添加视频和图片,可为每个sku添加图片。我们称为专辑。将一组图片及视频类似歌手作家出专辑一样,绑定到商品表和sku表上

clipboard.png

product_album

CREATE TABLE `product_album` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL COMMENT '商品编号',
  `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '商品名称',
  `url` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '图片地址',
  `size` int(11) DEFAULT NULL COMMENT '视频大小',
  `intro` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '图片介绍',
  `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '图片状态',
  `state` tinyint(4) NOT NULL DEFAULT '0' COMMENT '资源类型 0=>图片 1=>视频',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

品牌

每个商品都归属与一个品牌,例如iphonex归属与苹果公司,小米8归属与小米公司一样。品牌无需关联到sku内,道理很简单,当前的sku是iphonex归属与苹果公司,自然而然iphonex下面的规格都属于苹果了。

clipboard.png

product_brand

CREATE TABLE `product_brand` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_category_id` int(11) NOT NULL COMMENT '商品类别编号',
  `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '品牌名称',
  `image_url` varchar(125) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '图片url',
  `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排列次序',
  `status` tinyint(4) NOT NULL COMMENT '状态',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `product_brand_name_unique` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

类目

有时品牌不仅仅归属与一个类目,还是以iphonex举例,他是一部手机又是苹果产品但他又是一个音乐播放器。注意,这个时候不要将当前品牌绑定到三个类目上,如果你这样做了,未来的可维护性会很低。应该每个类目中绑定相同的品牌名称,你一定会问那这样数据垃圾不就产生了吗?我没有具体数据给你展现这样做的好处。

但从业务说起,现在我需要统计每个类目下商品的购买数去做用户画像,你时你要如何区分当前这个商品到底是哪个类目下呢?无法区分,因为你将品牌绑定到了3个类目下,不知用户到底是通过哪个类目点击进去购买的。

再者很多品牌公司不仅仅是做一个商品,类似索尼做mp3也做电视,手机,游戏机等。所以类目对应多个品牌,品牌应对应多个类目并非关联多个类目

clipboard.png

product_category

CREATE TABLE `product_category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '分类表',
  `pid` int(11) NOT NULL COMMENT '父分类编号',
  `cover` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '封面图',
  `index_block_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '首页块级状态 1=>显示',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态 1=>正常',
  `sort` int(11) NOT NULL DEFAULT '999' COMMENT '排序',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

致谢

下一节我们讲用户购买商品后的商品设计及后台操作的设计,一个好的程序员应该考虑到自己人如何去添加商品及管理它们。不能乐了用户苦了运营把?😄

谢谢你看到这里,希望我的文章能够帮助到你。有什么问题可以在评论区留言,我看到会第一时间回复。谢谢

查看原文

赞 56 收藏 50 评论 9

我的内心毫无波动 关注了标签 · 11月9日

关注 65929

认证与成就

  • 获得 0 次点赞
  • 获得 0 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 0 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 11月9日
个人主页被 37 人浏览