mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-28 21:40:50 +00:00
11 KiB
11 KiB
端渠道模块(channel)架构说明
一、模块定位
modules/channel/ 是端渠道容器模块,统一管理商城各客户端(公众号、小程序、H5、App)的渠道适配能力,包括:
- OAuth 登录:各端的授权登录与用户标识获取
- 消息模板通知:公众号模板消息、小程序订阅消息等
- 端专属业务:公众号关注回复/菜单/素材/渠道码、小程序外链/URL Scheme 等
channel 自身是容器目录(与 trade、marketing、agent 同级且性质相同),不直接承载业务表,真正的端能力分散在各端子目录中。
二、目录结构
modules/channel/
├── App.php # 容器入口:注册并调度各端 App
├── MIGRATION.md # 本文档
│
├── wechat_mp/ # 微信公众号端(有数据表 + 后台菜单 + Installer)
│ ├── App.php
│ ├── Installer.php # ★ 安装/卸载器(自有 9 张表 + 公众号菜单)
│ ├── auth/ # OAuth 登录(storage/Wechat.php)
│ ├── controller/ # admin: Menus/Reply/WechatNewsCategory/WechatQrcode/WechatTemplate
│ ├── dao/ model/ service/ # 关键词回复、素材、行为记录、图文、渠道码、关注用户
│ ├── route/ # admin.php / user.php
│ ├── sdk/ # WechatService.php
│ └── template/ # 模板消息(storage/Wechat.php)
│
├── wechat_mini/ # 微信小程序端(有数据表 + 后台菜单 + Installer)
│ ├── App.php
│ ├── Installer.php # ★ 安装/卸载器(自有 1 张表 routine_scheme + 小程序菜单)
│ ├── auth/ # code2Session 登录(storage/MiniProgram.php、TouTiao.php)
│ ├── controller/ # admin: RoutineCI/RoutineScheme/RoutineTemplate
│ ├── dao/ model/ service/ # 小程序外链、CI 上传、订阅消息
│ ├── route/
│ ├── sdk/ # MiniProgramService.php
│ └── template/ # 订阅消息(storage/Subscribe.php)
│
├── h5/ # H5 端(仅 OAuth,无数据表,无 Installer)
│ ├── App.php
│ └── auth/
│
└── app/ # App 端(仅 OAuth,无数据表,无 Installer)
├── App.php
└── auth/
说明:
h5、app两端的 C 端业务接口与全端通用代码(app/api/controller/v1等)耦合,无法独立剥离,故 channel 下仅保留 OAuth 授权骨架,同样不提供 Installer。两端消息通知均通过系统消息(站内信)走,不走微信模板消息。- 仅
wechat_mp、wechat_mini两端有自有数据表与后台菜单,需要安装/卸载(见第四章)。
三、容器调度机制
modules/channel/App.php 维护各端 App 类映射,按端名取实例:
protected static $channels = [
'wechat_mp' => \modules\channel\wechat_mp\App::class,
'wechat_mini' => \modules\channel\wechat_mini\App::class,
'h5' => \modules\channel\h5\App::class,
'app' => \modules\channel\app\App::class,
];
每个端 App 提供 register() / boot() 钩子,用于注册端内服务绑定与启动路由/监听器。
四、安装与卸载
channel 各端复用全局模块安装框架 crmeb\module\BaseModuleInstaller,安装器位于端子目录根部 modules/channel/{端}/Installer.php。
4.1 与其它模块安装器的关系
| 维度 | 产品类型 / 营销活动 | 端渠道(channel) | 独立业务模块(agent) |
|---|---|---|---|
| Installer 位置 | modules/product/type/{type}/Installer.php、modules/activity/{type}/Installer.php |
modules/channel/{端}/Installer.php |
modules/{module}/Installer.php |
| 命名空间 | modules\product\type\{type}\Installer 等 |
modules\channel\{端}\Installer |
modules\agent\Installer |
| getKey() | product/hotel、activity/seckill |
channel/wechat_mp、channel/wechat_mini |
agent |
| getType() | product_type / activity |
channel |
business |
| 调度器扫描 | modules/product/type/*/Installer.php、modules/activity/*/Installer.php |
modules/channel/*/Installer.php |
modules/*/Installer.php(排除容器目录) |
crmeb\module\ModuleInstaller::getInstallers()已新增对modules/channel/*/Installer.php的扫描,因此 channel 端会被一并纳入module:list、安装/卸载 API。容器目录 channel 仍保留在独立业务模块扫描的excludeDirs中,避免对modules/channel/App.php误判。
4.2 已实现的端 Installer
| 端 | getKey | 自有表 | 后台菜单 | 种子数据 |
|---|---|---|---|---|
| 微信公众号 wechat_mp | channel/wechat_mp |
wechat_key、wechat_media、wechat_message、wechat_news_category、wechat_qrcode、wechat_qrcode_cate、wechat_qrcode_record、wechat_reply、wechat_user |
公众号 / 微信菜单 / 自动回复 / 图文管理 / 渠道码 | 3 条默认渠道码分类 |
| 微信小程序 wechat_mini | channel/wechat_mini |
routine_scheme |
小程序 / 小程序外链 | 无 |
4.3 安装 / 卸载约定
- 建表:
runMigrate()用hasTable()幂等建表,v6 已存在则跳过,新部署时创建。 - 卸载:
rollbackMigrate()用DROP TABLE IF EXISTS删除本端自有表;removeMenus()移除对应后台菜单;cleanData()在删表前清理业务数据。 - 核心表保护:公众号粉丝表
wechat_user.uid关联核心表eb_user,安装/卸载只操作本端自有表,绝不删除或修改核心eb_user。
4.4 安装 / 卸载入口
通过后台模块管理 API(app\adminapi\controller\setting\ModuleController)调用:
GET /adminapi/setting/module/list?type=channel # 查看端渠道安装状态
POST /adminapi/setting/module/install # body: module_key=channel/wechat_mp
POST /adminapi/setting/module/uninstall # body: module_key=channel/wechat_mp
getStatusListByType('channel') 可单独筛出端渠道模块列表。
五、命名空间映射
| 文件 | 命名空间 |
|---|---|
| modules/channel/App.php | modules\channel |
| modules/channel/wechat_mp/**/*.php | modules\channel\wechat_mp\* |
| modules/channel/wechat_mini/**/*.php | modules\channel\wechat_mini\* |
| modules/channel/h5|app/**/*.php | modules\channel\{端}\* |
六、控制器命名规范
【强制】
modules/下所有控制器类名与文件名统一以Controller结尾。
- 公众号端(wechat_mp)后台控制器:
MenusController、ReplyController、WechatNewsCategoryController、WechatQrcodeController、WechatTemplateController。 - 小程序端(wechat_mini)后台控制器:
RoutineCIController、RoutineSchemeController、RoutineTemplateController。 - OAuth / 消息回调入口控制器
AuthController(wechat_mini)、WechatController(wechat_mp)本身已带后缀,无需调整。 - 路由引用统一使用
XxxController::class形式。
七、变更记录
-
2026-06-30
- 移除已废弃的旧
wechat/目录与未落地的alipay_mini/端,channel/App.php同步清理alipay_mini引用。 - 新增
wechat_mp/Installer.php、wechat_mini/Installer.php,为两端补齐安装/卸载能力。 crmeb\module\ModuleInstaller新增modules/channel/*/Installer.php扫描,端渠道纳入统一安装框架。- PC 端业务代码归位:将
app/api/controller/pc(7 个控制器)、app/services/pc(7 个服务)、app/api/route/pc.php迁入modules/channel/pc/(controller/service/route/user.php),命名空间改为modules\channel\pc\*,路由 URL 前缀pc/保持不变(由app/api/route/v1.php的glob('modules/channel/*/route/user.php')自动加载)。 - 统一控制器命名规范:wechat_mp、wechat_mini 两端后台控制器类名与文件名均补齐
Controller后缀,route/admin.php引用同步更新。
- 移除已废弃的旧
-
2026-08-22
- PC 端渠道模块彻底删除:移除
modules/channel/pc/整个目录(controller/service/auth/route/App.php/Installer.php/plugin.json);backend/route/route.php删除home分支及public/home目录判断;app/api/route/v1.php删除custom_pc_js路由,app/api/controller/v1/PublicController.php删除customPcJs()方法。 - 数据库清理:
eb_module_install_log删除channel/pc记录、eb_system_group删除pc_home_banner/pc_home_menus/pc_home_links、eb_system_route删除pc/%21 条、eb_system_route_cate删除 PC 分类 145/146/147/148。 - 安装 SQL 清理:
crmeb_data.sql删 21 条 PC 路由、crmeb_data.sql删 4 条 PC 分类、crmeb_data.sql删custom_pc_js配置并修正 4 处含"PC"文案、crmeb.sql.bak基线同步清理(pc_logo/wechat_open_app_id~first_number/custom_pc_js/PC站点配置 tab(75)/pc 控制器与服务/菜单 903/1008/1010/路由 1428-1448/route_category 145-148)。 app/command/ChannelMenuCheck.php的CHANNELS常量移除pc;modules/README.md、modules/channel/README.md同步移除 PC 引用。- admin 前端 PC 残留清理:删除
pages/system/group/pc.vue(PC商城装修页)、router/modules/setting.js的system_group_data/pc/:id、pc_group_data两条路由;api/setting.js删pcHomeMenus/pcHomeMenusSave、api/system.js删pcLogoApi/pcLogoSave;pages/cms/article/index.vue移除"PC端链接"复制项;pages/system/onlineUpgrade/index.vue移除"PC端源码"按钮;pages/driver/pay/index.vue渠道列表移除pc;filters/index.jssourceType移除0=>PC端;商品添加(product/plugin-normal)OtherSetting.vue两处 SEO 文案移除"PC端"字样。 - 删除过期 PC 端 API 文档
public/web/api.md(由 tarslib 生成,记录已删除的/pc/*接口)。 - 核心 app 层 PC 残留清理:
OrderPayServices::afterPay移除支付宝platform === 'pc'死分支(PlatformDetector 已不再返回 pc);UpgradeServices移除 PC 端源码包下载/进度/解压/状态检测逻辑(_pc_package缓存键、pc_package_link、PC端解压);UserServices/OutUserServices移除user_type == 'pc'显示映射;LoginServices/UserLoginListener/UserLogoutListener登录渠道注释移除 pc。保留:Request::isPc()终端检测 helper、支付驱动plugin.json的pc平台声明及eb_pay_channel预置数据(PC 扫码支付为通用支付能力)、StoreCouponIssueDao::getPcIssueCouponList(移动端商品详情通用调用,注释已修正)。
- PC 端渠道模块彻底删除:移除