# 祈盟SDK Go重构 - 决策确认清单 > **使用方法**: 每个条目都有【决策选项】,请在你的选择处标记 `[x]`,未确认的标记 `[?]` > 确认完成后,基于此文档开始实施 --- ## 一、需要确认的业务问题 这些直接影响重构范围,需要你找业务方或自己确认。 ### Q1. 渠道回调 - 哪些还在用? `application/complex/controller/` 下有19个渠道控制器,请确认哪些还有业务流量: | 渠道 | 文件 | 状态 | |------|------|------| | 爱豆 | Aidou.php | `[?]在用` `[?]已废弃` | | 飞腾 | Fengteng.php | `[?]在用` `[?]已废弃` | | 沪维 | Huwei.php | `[?]在用` `[?]已废弃` | | 聚思达 | Juside.php | `[?]在用` `[?]已废弃` | | 奇信 | Qixin.php | `[?]在用` `[?]已废弃` | | 顺游安卓 | Shunyouanr.php | `[?]在用` `[?]已废弃` | | 顺游IOS | Shunyouios.php | `[?]在用` `[?]已废弃` | | 思默 | Simo.php | `[?]在用` `[?]已废弃` | | 思默快 | Simoquick.php | `[?]在用` `[?]已废弃` | | 微游 | Vyou.php | `[?]在用` `[?]已废弃` | | 小智 | Xiaozhi.php | `[?]在用` `[?]已废弃` | | 西谷 | Xigu.php | `[?]在用` `[?]已废弃` | | 鑫客源 | Xkhyn.php | `[?]在用` `[?]已废弃` | | 翼牛 | Yiniu.php | `[?]在用` `[?]已废弃` | | 自游 | Ziyou.php | `[?]在用` `[?]已废弃` | | 邹boom | Zoulboom.php | `[?]在用` `[?]已废弃` | | 第一 | Diyi.php | `[?]在用` `[?]已废弃` | | 奥游 | Aoyou.php | `[?]在用` `[?]已废弃` | | 爱豆(另一版) | Aidou.php | `[?]在用` `[?]已废弃` | > **决策**: 废弃的渠道不迁移,只迁移在用的 --- ### Q2. 旧版接口 - 客户端还能升级吗? 以下接口有新旧版本并存,确认是否可以只保留新版: | 旧接口 | 新接口 | 可否只保留新版? | |--------|--------|-----------------| | `/v2.game_notify/index_v2`(标记"准备弃用") | `/v2.game_notify/index_v3` | `[?]可以` `[?]不行,要兼容` | | `/gh/channel_data_summary`(弃用) | `/gh/channel_data_summary_v2` | `[?]可以` `[?]不行,要兼容` | | `/v2.complex_authentication/query`(弃用) | 无替代 | `[?]可以` `[?]不行,要兼容` | | `/v1.complex_login/index.html` | 无替代(保持v1) | `[?]保持v1` `[?]升级到v2风格` | > **决策**: 不能升级的接口需要在Go中保留兼容路由 --- ### Q3. 数据表 - 哪些还在用? 项目有151个Model,但很多可能已废弃。请用以下SQL查一下哪些表还有近期写入: ```sql -- 在MySQL中执行,查看最近30天有写入的表 SELECT TABLE_NAME, UPDATE_TIME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = '你的数据库名' AND UPDATE_TIME > DATE_SUB(NOW(), INTERVAL 30 DAY) ORDER BY UPDATE_TIME DESC; ``` > **决策**: 只迁移有业务流量的表对应的Model --- ## 二、接口重构决策 ### A. 可以直接废弃的接口 以下接口已明确标记弃用或功能已被替代: | 接口 | 废弃原因 | 确认废弃? | |------|----------|-----------| | `/v2.game_notify/index_v2` | 已有v3替代 | `[?]是` `[?]否` | | `/v2.complex_authentication/query` | 已标记弃用 | `[?]是` `[?]否` | | `/gh/channel_data_summary` | 已有v2替代 | `[?]是` `[?]否` | | `/index/notidy` | 仅为示例 | `[?]是` `[?]否` | --- ### B. 路径风格统一方案 现有路径风格混乱,需要统一。请选择新系统的路径风格: | 方案 | 示例 | 优点 | 缺点 | |------|------|------|------| | **A. RESTful风格** | `POST /api/v1/users/login` | 业界标准,语义清晰 | 改动大,客户端需适配 | | **B. 保持现有风格** | `POST /v1.login/index.html` | 客户端零改动 | 继续混乱 | | **C. 折中:保留方法名,去掉`.html`** | `POST /api/v1/login` | 改动小,相对规范 | 不够RESTful | > **决策**: `[?]方案A` `[?]方案B` `[?]方案C` `[?]其他:______` --- ### C. 版本策略 现有v1/v2混用,新系统如何处理? | 方案 | 说明 | |------|------| | **A. 全部v1重来** | 新系统统一用 `/api/v1/`,不区分旧v1/v2 | | **B. 保持v1/v2分离** | 旧v1接口映射到新v1,旧v2映射到新v2 | | **C. 只迁移v2** | 旧v1接口如果是早期版本,直接废弃 | > **决策**: `[?]方案A` `[?]方案B` `[?]方案C` --- ## 三、代码层面的优化决策 ### D. common.php 函数迁移清单 90+全局函数,逐个确认迁移方式: #### HTTP请求类(9个 → 1个统一客户端) | 原函数 | 迁移方案 | 确认 | |--------|----------|------| | `getCurlContent` | → `HttpClient.Get/Post` | `[?]保留` `[?]合并` | | `getCurl` | → `HttpClient.Get` | `[?]保留` `[?]合并` | | `curl` | → `HttpClient.Post` | `[?]保留` `[?]合并` | | `apipost` | → `HttpClient.PostForm` | `[?]保留` `[?]合并` | | `getHttp` | → `HttpClient.Do` | `[?]保留` `[?]合并` | | `getHttpGet` | → `HttpClient.Get` | `[?]保留` `[?]合并` | | `getHttpException` | → `HttpClient.PostJSON` | `[?]保留` `[?]合并` | | `curlHeader` | → `HttpClient.Do` | `[?]保留` `[?]合并` | | `timingCurl` | → `HttpClient.WithTimeout` | `[?]保留` `[?]合并` | > **建议**: 全部合并为一个 `HttpClient` 结构体,统一超时、重试、日志 > **决策**: `[?]同意合并` `[?]保留原有风格` --- #### 数据脱敏类(6个 → 1个通用函数) | 原函数 | 迁移方案 | 确认 | |--------|----------|------| | `stringObfuscation` | → `util.Mask(s, keepStart, keepEnd)` | `[?]合并` | | `idcardObfuscation` | → `util.MaskIDCard(s)` | `[?]合并` | | `passwordObfuscation` | → `util.Mask(s, 3, 3)` | `[?]合并` | | `mobileObfuscation` | → `util.MaskMobile(s)` | `[?]合并` | | `usernameObfuscation` | → `util.Mask(s, 1, 1)` | `[?]合并` | | `mailObfuscation` | → `util.MaskEmail(s)` | `[?]合并` | > **决策**: `[?]同意合并` `[?]保留各自独立函数` --- #### 渠道查询类(8个 → 1个ChannelService) | 原函数 | 问题 | 迁移方案 | |--------|------|----------| | `get_top_channel` | while循环N次SQL | → `ChannelService.GetTop(channelId)` | | `get_union_channel` | 同上 | → `ChannelService.GetUnion(channelId)` | | `get_channel_level` | 查整条记录只为取level | → `ChannelService.GetLevel(channelId)` | | `get_top_second_channel_name` | 80行复杂逻辑 | → `ChannelService.GetAncestors(channelId)` 派生 | | `get_top_second_channel_name_v2` | 优化版,2次SQL | → 以此为基础实现 | | `get_channel_top_by_aggregate` | 重复逻辑 | → `ChannelService.GetTop(channelId)` 复用 | | `get_channel_name` | 简单查询 | → `ChannelService.GetName(channelId)` | | `get_complex_channel_name` | 简单查询 | → `ChannelService.GetName(channelId)` 复用 | > **决策**: `[?]以v2为基础统一实现` `[?]保留各自函数` --- #### 安全相关 - 必须修改 | 问题 | 原代码 | Go方案 | 确认 | |------|--------|--------|------| | 硬编码密钥 | `$key = 'ukN3KYVdI2sPtjpL'` | 配置文件/环境变量 | `[?]同意` | | dd()调试函数 | `echo Db::getLastSql(); die;` | 删除 | `[?]同意` | | die()暴露信息 | `die('签名校验失败 '.$thisSign)` | 统一错误码,不暴露细节 | `[?]同意` | | unserialize反序列化 | `$param = unserialize($param)` | 改用JSON存储 | `[?]同意` `[?]需要兼容旧数据` | --- #### 可以直接删除的函数 | 函数 | 删除理由 | |------|----------| | `dd()` | 调试函数 | | `arrayColumnByObject()` | PHP7.0已有array_column | | `is_mobile_request()` | UA检测已不可靠 | | `priceFormat()` | 就是number_format的包装 | | `dump()` | 调试函数 | > **决策**: `[?]同意删除` `[?]保留某些:______` --- ### E. 支付回调重构方案 现有19个渠道控制器,每个都有 `pay()` 方法。重构方案: | 方案 | 说明 | 优点 | 缺点 | |------|------|------|------| | **A. 策略模式** | 定义 `ChannelAdapter` 接口,每个渠道实现 `ParseParams` + `VerifySign` | 代码最干净,新增渠道只需加一个适配器 | 需要梳理每个渠道的差异 | | **B. 配置驱动** | 将参数映射和签名规则存DB/配置,通用解析器读取配置执行 | 不用为每个渠道写代码 | 签名算法可能无法完全配置化 | | **C. 保持独立文件** | 继续每个渠道一个文件 | 改动最小 | 代码继续膨胀 | > **决策**: `[?]方案A(推荐)` `[?]方案B` `[?]方案C` --- ## 四、Go项目结构决策 ### F. 框架选择 | 框架 | 说明 | 适合场景 | |------|------|----------| | **GoFrame v2** | 全栈框架,内置ORM/配置/日志/路由 | 快速开发,类似ThinkPHP的开发体验 | | **Gin + GORM** | 轻量路由 + 独立ORM | 灵活度高,社区生态丰富 | | **Kratos** | B站开源微服务框架 | 如果将来要拆微服务 | > **决策**: `[?]GoFrame v2` `[?]Gin+GORM` `[?]Kratos` `[?]其他:______` --- ### G. 项目模块划分 基于现有接口,建议的Go模块划分: ``` new_sdk_go/ ├── module/ │ ├── user/ # 用户:登录、注册、实名、绑定手机、忘记密码 │ ├── pay/ # 支付:下单、支付、充值、回调 │ ├── order/ # 订单:列表、详情、取消 │ ├── coupon/ # 代金券:领取、兑换、列表 │ ├── gift/ # 礼包:列表、领取 │ ├── channel/ # 渠道:查询、聚合渠道对接 │ ├── game/ # 游戏:角色上传、公告、更新 │ ├── thirdparty/ # 第三方:抖音、支付宝、微信 │ └── system/ # 系统:配置、验证码、客服 ├── pkg/ │ ├── httpclient/ # 统一HTTP客户端(替代9个curl函数) │ ├── sign/ # 签名验证(替代散落各处的签名逻辑) │ ├── auth/ # 认证:Token、签名中间件 │ └── util/ # 工具:脱敏、格式化等 └── config/ └── config.yaml # 配置文件(密钥、数据库、Redis等) ``` > **决策**: `[?]同意此划分` `[?]调整为:______` --- ## 五、实施顺序决策 ### H. 分期计划 | 阶段 | 内容 | 预估工作量 | 优先级 | |------|------|-----------|--------| | **第1期** | 项目脚手架 + 公共组件(HttpClient/签名/认证) | 2-3天 | P0 | | **第2期** | 支付核心(下单/支付/回调) | 3-5天 | P0 | | **第3期** | 用户体系(登录/注册/实名) | 3-4天 | P1 | | **第4期** | 订单 + 充值 + 代金券 + 礼包 | 2-3天 | P1 | | **第5期** | 渠道对接(聚合渠道 + 第三方) | 3-5天 | P2 | | **第6期** | 辅助功能(公告/客服/数据查询) | 2-3天 | P3 | > **决策**: `[?]同意此顺序` `[?]调整优先级:______` --- ## 六、确认完成后 请将确认好的文档发给我,我会根据你的决策: 1. 生成Go项目脚手架 2. 编写核心模块的接口定义(API struct) 3. 实现公共组件(HTTP客户端、签名验证、认证中间件) 4. 按优先级逐步实现各模块 --- ## 快速决策汇总(填写这里) | 编号 | 决策项 | 你的选择 | |------|--------|----------| | Q1 | 哪些渠道还在用? | | | Q2 | 弃用接口能否直接删除? | | | Q3 | 还在写的表有多少? | | | B | 路径风格 | | | C | 版本策略 | | | D | common.php函数 | | | E | 支付回调方案 | | | F | Go框架选择 | | | G | 模块划分 | | | H | 实施顺序 | |