480万商品,如何架构商品治理平台?
说在前面
在40岁老架构师 尼恩的读者交流群(50+)中,很多小伙伴拿高薪,完成架构的升级,进入架构师赛道,打开薪酬天花板。
最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架构师,遇到一些很重要的面试题:
- 一个系统,如何进行 技术架构演进,你的方法论是什么?
- 一个系统,如何进行 服务边界划分,你的方法论是什么?
现在,40岁老架构师尼恩,站在京东如何架构商品治理平台的巨人肩膀,给大家提供一份比较全面的参考答案。使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让你的面试官爱到 “不能自已、口水直流”。
也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V113版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取
文章目录
- 说在前面
- 480 万商品,京东如何架构商品治理平台?
- 背景
- 系统架构介绍
- 早期的治理系统
- 治理系统架构升级
- 抽象思维显神威
- 难点问题巧手破
- 业务难点问题
- 技术难点问题
- 治理触达终落地
- 治理业务全景图
- 未来规划
- 总结
- 说在最后:有问题可以找老架构取经
- 推荐阅读
480 万商品,京东如何架构商品治理平台?
注意,此文作者不是尼恩, 作者:京东到家技术团队/达达集团技术柯贤铭
此文,仅仅是作为架构师的重要学习材料,供大家参考。
同时,希望此文也能给京东到家的产品多做点宣传, 建议大家多用用京东到家的 服务和商品。
背景
作为一家即时零售电商平台,京东到家致力于在一小时内将各类优质商品送达消费者手中,同时也在努力提升商品的价值和平台的满意度。
京东到家商品管理系统,其主要职责:
对商品的创建、修改和展示的全流程进行干预和审核,旨在发现并解决商品信息中如:敏感词、虚假宣传、错误信息等不符合平台规范和质量要求的问题,确保商品与实物的一致性,以及信息的准确性。
系统架构介绍
京东到家的各个业务线都采用了标准化的微服务架构设计,各个系统在迭代过程中只需按需申请对应的组件。
以下是治理系统所使用的技术组件:
- 日志服务:提供日志采集和查询服务。
- RPC调用:利用京东的 JSF 平台,实现服务间注册、服务间调用和服务治理等功能,支持请求超时自动阻断。
- 服务监控:使用统一监控与告警服务平台,实现秒级监控、多方位监控、服务告警、全链路追踪等功能。
- 分布式调度引擎:基于 TBSchedule 分布式调度引擎框架构建的服务,负责定时任务的执行和分发。
- 高性能存储:使用 Redis 集群、MySQL 集群等。
- 消息中间件:采用京东的 MQ 中间件,实现业务解耦。
系统架构如下

注意:请点击图像以查看清晰的视图!
早期的治理系统
第一个需求与大多数业务系统相似,即基于数据的增删改查,构建一套敏感词管理模块,同时为商品主系统提供敏感词的校验能力。
第二个需求是为运营团队提供一个核验结果的报表,主要逻辑是通过上传 Excel,内部解析后调用接口获取相应的数据结果,基于 MySQL 进行存储,然后提供查询和展示功能,方便运营人员使用。
然而,由于缺乏设计和长远的考虑,因此当时的治理系统与商品主系统耦合严重,早期治理系统业务架构图示如下:

注意:请点击图像以查看清晰的视图!
随着平台对商品信息合规性的规定日益严谨,针对商品分类、净重、图片等各项治理需求也相继出现。
然而,在上图的设计之中,我们可以明显看出,治理系统是基于具体业务来构建对外接口的。
因此,随着业务需求的持续扩大,两个系统之间交互的接口数量也会急剧增长,这是我们不愿意看到的。
另外,治理的最终目标是期望商品问题能够得到解决,而不仅仅是发现,因此,将问题暴露给运营或商家是必要的。然而,目前存在两个问题:
- 商品系统在其主要流程中过度依赖治理的核验功能,且随着业务的扩展,依赖程度会逐步增加。
- 商品系统只能将前置拦截的核验结果告知商家,业务覆盖面不足。
再加上许多问题属于弱合规性(不需要强制拦截但仍需要解决),因此,需要将商品治理业务的核心从商品系统转向治理系统。
为了实现商品治理的高效率,对治理系统的设计和定位进行了调整,提出了两个基本原则:
- 治理系统需要完成整个治理业务的闭环,作为商品问题发现和解决的总入口和总出口。
- 治理系统需要具备高扩展性,当增加特定化治理需求时能够迅速响应。
治理系统架构升级
抽象思维显神威
在理清治理系统的业务架构升级思路之后,我们首先需要确定的一个问题就是:治理系统最基础的原子能力是什么?
以各个主系统为例,‘
商品系统最基础的原子能力即:商品的创建、修改和提供查询能力、
库存系统最基础的原子能力即:商品库存信息的维护及查询能力。
根据治理业务的发展规划,我们也基本确定出治理系统的原子能力,即:发现商品存在的合规问题,并向外提供查询和辅助解决的能力。
对于合规问题的定义,我们做出了如下解释,即:不符合电商平台商品展示规范的如敏感词、虚假渲传等问题。
例如商品名称中包含敏感词,会被视为敏感词问题,需要说明的是:在编码阶段,一种可量化的具体规则可以对应一种合规问题,且同一商品可能同时存在多个不同的合规问题。
目前到家治理系统所涉猎的合规问题主要有:
| 合规问题大类 | 对外描述 | 问题细节 |
|---|---|---|
| 商品毛重问题 | 商品毛重不准确 | 商品毛重与实际商品不符、商品毛重超过最大运力限制等 |
| 商品信息不正确 | 商品信息不正确,请检查具体内容 | 商品名称包含敏感词、商品分类与实际商品不符、虚假宣传等 |
| 商家商品经营范围问题 | 当前售卖商品超出商家经营范围 | 当前售卖商品超出商家经营范围等 |
| 图片信息问题 | 商品图片信息存在问题 | 商品无主图、商品主图为默认图、商品主图为黑底图等 |
| 未来计划 | ||
商品价格问题 | – | – |
商品画像问题 | – | – |
... |
为了方便理解,我们可以将每一种合规问题看作是一种策略,而针对策略的顶层接口又定义了四个核心方法:
- 核验方法:根据业务规则实现的具体核验逻辑
- 自定义过滤能力:根据业务特点,减少无用处理
- 问题关联的字段:每一个问题都需要关联具体的影响字段或被影响字段
- 映射关联的枚举:每一个问题都需要关联具体的问题原因
具体的实现逻辑如下图所示:

注意:请点击图像以查看清晰的视图!
以商品毛重信息填写错误为例,下图为处理前后的展示结果:


关于毛重的问题,我们可以将其与相关的枚举和文案映射联系起来,即:当商品毛重出现偏差(问题类型)时,建议的毛重为 XXX(文案映射)。其关联的字段包括商品的重量和名称。通过结合一定的过滤逻辑和验证算法,我们可以完成对毛重问题的抽象处理。以此方式,我们在处理新的治理问题时,可以借鉴这种做法。
熟悉设计模式的读者可能已经发现,这个设计方案实际上是策略模式和模板方法模式的混合体。在编码阶段,我们也会用到工厂模式,在编码层面整体的变化如下图所示:

注意:请点击图像以查看清晰的视图!
上述方案落地之后,产研团队对治理业务的未来发展有了基本的共识,同时,需求的实现也变得更加简单。我们不再需要关注其他系统的逻辑,而是专注于合规问题的业务规则实现。
业务部门和产品团队能够通过数据分析来确定未来的治理重点和需求规划,研发人员也通过优雅的方式解决了系统间耦合和业务代码重复的问题。
难点问题巧手破
在我们初步设定治理系统的业务架构设计后,后续迭代过程中,我们遇到了两个比较棘手的问题,一个是业务问题,一个是技术问题。
业务难点问题
业务部门要求 APP 展示的商品主图不能与默认图(如空白图、品牌商标图等不能体现商品信息的图片)相同,然而商品图片的校验逻辑一直由图片核验系统承接。
这就引起了一个问题:治理系统是否需要集成图片核验逻辑,如果不集成,那又该如何将其图片违规问题纳入至治理体系中?
有经验的开发者可能会建议使用消息队列(MQ)的方式,由图片核验系统将校验结果发送至治理系统,以解决此问题。
实际上,我们也是这么做的,只是做得更加彻底。
在设计模式中,我们通常会将一系列类似业务整合成一个公共接口向外提供能力,我们将其称为:门面模式或外观模式。
针对上述类似问题,我们找到了一个通用的处理方法,即:将治理系统作为门面,其他系统作为组件,各系统都可以主动的向治理系统提供需要治理的内容。
该方案确定后,各种棘手的业务场景也变得简单起来,同时,此举还扩大了治理系统的边界,例如商品无图合规问题,商品差评率高的问题,只需要对应系统将相关数据/结果以消息队列(MQ)的形式发送至治理系统,然后由治理系统为其绑定具体的合规问题即可。
在编码层面,我们采用最简单的消息队列(MQ)解耦方式实现,示意图如下:

注意:请点击图像以查看清晰的视图!
在进行治理迭代的过程中,有一系列的需求是针对平台商品的图片进行治理,以破损图逻辑为例。
在最开始的处理逻辑中,大家查询资料整合信息,发现平台偶尔出现的破损图是由于图片在下载过程中未下载完整后流中断,触发上传引起的。
因此在第一版的逻辑中,我们查阅资料作出了如下逻辑判断:当图片下载完成触发上传前,对比请求体中的ContentLength与实际图片字节大小,问题初步解决。
技术难点问题
然而,不久之后,问题再次爆发,我们发现事情并非想象中那么简单。
由于我们的平台对接了众多的商家系统,各个系统的图片服务器和后台逻辑都不尽相同,因此我们无法对所有图片都采用文件大小比对的方式进行处理。’
因此,我们重新进行了调研,并实现了针对破损图的核验能力。

注意:请点击图像以查看清晰的视图!
即通过下载后的图片内容进行处理和分析,利用算法与目标问题的业务特征进行识别,从而基本解决了这个问题。
同时,基于该思路我们也衍生出针对黑底图、默认图的处理方式,在图片问题的治理上更进一步。
治理触达终落地
基于上述的方案和设计,治理系统在问题发现的流程上已经趋于完善,
接下来,产品提出了新的要求,即:部分问题实现自动治理及问题触达商家。
机器学习的模型,大致可分为两种:分类模型和生成模型。
抛开它们的具体含义,我们可以借鉴这种设计理念,将治理系统划分为两个部分,即:发现和解决。
上述的业务提取和技术问题、业务问题都是用于侦测问题的,当我们将解决问题的目标纳入治理体系,只需要对现有架构进行适度的扩展就能满足需求。
以商品毛重信息填写错误为例,我们只需要在上述的提取中添加两个待实现方法:
- 是否需要自动处理:毛重问题需要自动处理
- 自动处理的具体实现规则:当实际毛重大于某一阈值时,将商品系统下架处理(依托于商品对外接口能力)
在核验结果存储前,依据具体的执行逻辑以及数据反馈结果来判断是人工处理还是系统处理即可。
对于触达需求,其实现更加简单,因为在初始阶段我们就定义了治理业务交流的基本元素是具体的治理问题,我们只需要将已存储的数据通过接口或消息队列的形式展示即可。
至此,整个治理体系从编码层面也就建设完成,其核心逻辑在三个环节:
- 商品变动MQ/其他系统治理内容通知触发具体合规问题核验。
- 针对核验结果进行判断:人工处理或系统自动处理(处理的能力需借助于商品对外接口)。
- 核验结果对外露出。
下图为治理系统当前整体业务结构图:

注意:请点击图像以查看清晰的视图!
治理业务全景图
自从治理平台业务框架升级以来,已经连续稳定运行了九个多月。
在此期间,我们已成功治理了 480 万以上的平台商品,构建了 8 种识别能力、3 种处理方式和 2 种触达方式。
同时,我们依托商品和标品系统,为商品快速建品、基础信息建设和治理审核等方面提供了有力保障。
以下是到家治理的全景图:

治理业务全景图
注意:请点击图像以查看清晰的视图!
未来规划
现行的治理体系主要围绕商品系统的核心环节进行设计和构建,其影响范围相对较小。
实际上,我们可以将商品治理的成果扩展应用到商品体系之外的其他系统。
例如下图中的各个业务场景:

注意:请点击图像以查看清晰的视图!
以搜索推荐为例,我们可以针对各种合规问题制定相应的扣分规则,在搜索侧构建数据时,将商品的合规分数纳入其中,并根据分数大小进行排序,以满足搜索条件。
同时,我们也需要将一些算法无法识别的问题纳入治理体系,例如:商品差评率高、退货率高等。
总结
随着业务的不断发展,对商品信息质量的要求将越来越高。到家治理系统需要与各上下游系统紧密联动,提供更加精细化的商品管控能力。
我们期待在未来,我们的治理能力能够更加优秀,为用户提供更真实、贴近实际的商品数据和更优质的服务。
说在最后:有问题可以找老架构取经
架构之路,充满了坎坷
架构和高级开发不一样 , 架构问题是open/开发式的,架构问题是没有标准答案的
正由于这样,很多小伙伴,尽管耗费很多精力,耗费很多金钱,但是,遗憾的是,一生都没有完成架构升级。
所以,在架构升级/转型过程中,确实找不到有效的方案,可以来找40岁老架构尼恩求助.
前几天一个小伙伴,他们要进行 电商网站的黄金链路架构, 开始找不到思路,但是经过尼恩 10分钟语音指导,一下就豁然开朗。
推荐阅读
《百亿级访问量,如何做缓存架构设计》
《多级缓存 架构设计》
《消息推送 架构设计》
《阿里2面:你们部署多少节点?1000W并发,当如何部署?》
《美团2面:5个9高可用99.999%,如何实现?》
《网易一面:单节点2000Wtps,Kafka怎么做的?》
《字节一面:事务补偿和事务重试,关系是什么?》
《网易一面:25Wqps高吞吐写Mysql,100W数据4秒写完,如何实现?》
《亿级短视频,如何架构?》
《炸裂,靠“吹牛”过京东一面,月薪40K》
《太猛了,靠“吹牛”过顺丰一面,月薪30K》
《炸裂了…京东一面索命40问,过了就50W+》
《问麻了…阿里一面索命27问,过了就60W+》
《百度狂问3小时,大厂offer到手,小伙真狠!》
《饿了么太狠:面个高级Java,抖这多硬活、狠活》
《字节狂问一小时,小伙offer到手,太狠了!》
《收个滴滴Offer:从小伙三面经历,看看需要学点啥?》
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓
相关文章:
480万商品,如何架构商品治理平台?
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿高薪,完成架构的升级,进入架构师赛道,打开薪酬天花板。 最近有小伙伴拿到了一线互联网企业如京东、网易、微博、阿里、汽车之家、极兔、有赞、希音、百度、滴滴的架…...
【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?
【C入门指南】C如何过渡到C?祖师爷究竟对C做了什么? 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…...
简易磁盘自动监控服务
本文旨在利用crontab定时任务(脚本请参考附件)来监控单个服务节点上所有磁盘使用情况,一旦超过既定阈值则会通过邮件形式告警相关利益人及时介入处理。 1. 开启SMTP服务 为了能够成功接收告警信息,需要邮件接收客户都安开启SMTP服务。简要流程请参考下…...
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
1 mpl_toolkits.mplot3d 功能介绍 mpl_toolkits.mplot3d 是 Matplotlib 库中的一个子模块,用于绘制和可视化三维图形,包括三维散点图、曲面图、线图等。它提供了丰富的功能来创建和定制三维图形。以下是 mpl_toolkits.mplot3d 的主要功能和功能简介&am…...
十六,镜面IBL--预滤波环境贴图
又到了开心的公式时刻了。 先看看渲染方程 现在关注第二部分,镜面反射。 其中 这里很棘手,与输入wi和输出w0都有关系,所以,再近似 其中第一部分,就是预滤波环境贴图,形式上与前面的辐照度图很相似&#…...
信息安全:恶意代码防范技术原理.
信息安全:恶意代码防范技术原理. 恶意代码的英文是 Malicious Code, 它是一种违背目标系统安全策略的程序代码,会造成目标系统信息泄露、资源滥用,破坏系统的完整性及可用性。 目录: 恶意代码概述: (1&a…...
开源媒体浏览器Kyoo
什么是 Kyoo ? Kyoo 是一款开源媒体浏览器,可让您流式传输电影、电视节目或动漫。它是 Plex、Emby 或 Jellyfin 的替代品。Kyoo 是从头开始创建的,它不是一个分叉。一切都将永远是免费和开源的。 软件特性: 管理您的电影、电视剧…...
人脸解锁设备时出现相机报错
(1)背景分析 这是项目当中实际遇到的问题,如下代码仅用作分析和记录。 现在问题的现象是:刚亮屏大概在2s以内对着人脸一般是能解锁的,但是超过2s之后在对着人脸,是无法解锁成功的。 (2&#…...
【广州华锐互动】利用VR开展工业事故应急救援演练,确保救援行动的可靠性和有效性
在工业生产中,事故的突发性与不可预测性常常带来巨大的损失。传统的应急演练方式往往存在场地限制、成本高、效果难以衡量等问题。然而,随着虚拟现实(VR)技术的快速发展,VR工业事故应急救援演练应运而生,为…...
还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(二)
续接上文:还不知道数据类岗位的相关技能和职责吗?涤生大数据告诉你(一) 1.数据治理工程师 工作职责 数据治理工程师的工作职责主要包括以下几个方面: 1. 数据管理策略制定:制定和实施数据管理策略&#…...
常见应用层协议
一.HTTP(超文本传输协议) HTTP 和 HTTPS 二.FTP(文件传输协议) 三.SMTP(简单邮件传输协议) 四.POP3(邮局协议版本3) 五.IMAP(互联网消息访问协议) 六.DNS&am…...
解决docker容器无法关闭的问题
一般正常关闭: docker stop 容器ID解决方法 方法1:强制停止docker kill 容器ID方法2:直接重启dockersudo service docker stop方法3:直接删除容器,重新创建docker rm -f my_container...
2023-09-27 LeetCode每日一题(餐厅过滤器)
2023-09-27每日一题 一、题目编号 1333. 餐厅过滤器二、题目链接 点击跳转到题目位置 三、题目描述 给你一个餐馆信息数组 restaurants,其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息…...
梯度下降法(SGD)原理
目录 梯度下降法(SGD)原理:求偏导 1. 梯度(在数学上的定义) 2. 梯度下降法迭代步骤 BGD批量梯度下降算法 BGD、SGD在工程选择上的tricks 梯度下降法(SGD)原理:求偏导 1. 梯度(在数学上的定义) 表示某一函数在该点处的方向导数沿着该方向取得最大值…...
QQ表情包存储位置解析
一些常见的设备和系统的QQ表情包存储位置: Windows系统: 路径:C:\Users[用户名]\Documents\Tencent Files[QQ号码]\Image\Image\CustomFace 在这个文件夹中,您可以找到所有自定义的QQ表情包。 Android系统: 路径&am…...
软件架构的演化和维护
软件架构的演化和维护 定义 定义 顶不住了,刷题去了,不搞这个了,想吐。。。...
C语言数组和指针笔试题(四)(一定要看)
目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个人主页 🥸🥸🥸C语言 🐿️…...
FragmentManager is already executing transactions
本文解决问题: java.lang.IllegalStateException: FragmentManager is already executing transactions 问题背景描述: 在Fragment中 用tablayoutviewpagerfragment,即Fragment嵌套Fragment场景、或者ViewPager2嵌套ViewPager2时。 执行生命…...
Matlab中clear,close all,clc功能详细说明
背景: 我们在写matlab程序时,首行总是先敲入:clear; close all; clc;,但你真的知道这三句话的具体作用嘛,下面进行详细说明和演示。 一、clear的功能 clear的功能:清理工作区变量,不清理前是…...
Typora安装无需破解免费使用
Typora简介: 在介绍Typora软件之前,需要先介绍一下MARKDOWN。 MARKDOWN是一种轻量型标记语言,它具有“极简主义”、高效、清晰、易读、易写、易更改纯文本的特点。 Typora 是一款支持实时预览的 Markdown 文本编辑器。它有 OS X、Windows、…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
