|
660
|
21
|
307
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 关房失败记录日志
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `c4228b887 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `c4228b88720d75994636e692a6eb1a6bfc8c07b6`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 10:53:38
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了预订下单、支付回调、退款及消息通知等核心业务,但存在明显的架构反模式。事务管理机制混乱、存在 SQL 注入隐患、循环内执行数据库查询导致性能瓶颈,且单个方法过长严重违反单一职责原则(SRP)。整体安全性、可维护性与执行效率亟待重构。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据 `$CI = &get_instance()`、`$this->load->model()`、`$this->db->trans_start()` 等特征,代码高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请核对底层事务计数器、配置加载及查询构造器 API 的差异。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `refund_by_notify` 方法内 | **SQL 注入风险**:使用字符串拼接构造 `$log_where` 条件,若 `$order_data['_id']` 来源不可控,将导致注入。 | 使用框架查询构造器或参数绑定,禁止直接拼接 SQL 片段。 | `$this->db->where('_relation_id', $order_data['_id'])->where('_status', 1)->where_in('_type', [5, 13]);`<br>`$this->ahead_pay_log_model->up($log_up, $this->db->get_compiled_where());` |
| 🔴 严重 | `check_notify` 方法内 | **事务管理混乱**:混用 `trans_start()` 与手动 `trans_rollback()`。CI 的 `trans_start()` 依赖内部计数器,手动回滚会破坏状态,且提前 `return` 未调用 `trans_complete()` 可能导致连接池锁死。 | 统一使用 `trans_begin()` 配合手动 `trans_commit()`/`trans_rollback()`,或完全依赖 `trans_start()` + `trans_complete()` 自动机制。 | `$this->db->trans_begin();`<br>`try { /* 业务 */ $this->db->trans_commit(); } catch(\Exception $e) { $this->db->trans_rollback(); }` |
| 🟠 警告 | `get_list` 方法内 | **N+1 查询性能瓶颈**:在 `foreach` 循环中逐条查询商户信息,数据量大时将导致严重性能衰减。 | 批量查询或使用 `WHERE IN` 一次性获取,在内存中映射。 | `$ids = array_column($order_info, 'merchant_id');`<br>`$merchants = $this->ahead_merchant_model->get_many(['_id' => $ids], '_id,_business_model');`<br>`$map = array_column($merchants, '_business_model', '_id');` |
| 🟠 警告 | 文件顶部 & `send_success_msg` | **全局实例化与重复加载**:文件顶部 `$CI = &get_instance();` 在类外执行,易在框架未完全初始化时报错;方法内频繁 `$this->load->model()` 增加 I/O 开销。 | 移除顶部实例化;将高频使用的 Model 移至 `__construct()` 或配置自动加载;配置加载改用 `$this->load->config()`。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_merchant_model'); }` |
| 🟠 警告 | `refund_by_notify` 金额计算 | **浮点数精度丢失**:使用 `floatval()` 处理金额,PHP 浮点运算易产生 `0.0000000001` 级误差,导致对账失败。 | 金额统一以“分”为单位使用整数运算,或使用 `bcmath` 扩展。 | `$wx_pay_amount = bcsub($wx_pay_amount, $change_total_pay[1]['total_pay'] ?? '0', 2);` |
| 🟡 建议 | 全文多处 | **代码规范与可维护性**:混合使用 `array()` 与 `[]`;存在大量注释死代码;魔法数字泛滥(如 `-1, 1, 2, 14, 56`);日志函数名不统一(`doLog` vs `do_log`)。 | 遵循 PSR-12;统一短数组语法;提取业务常量;清理注释代码;统一日志调用入口。 | `const STATUS_PENDING = -1; const STATUS_PAID = 1;`<br>`$this->logger->info('msg');` |
| 🟡 建议 | `create_community_shop_book_order` 末尾 | **代码截断**:文件在 `if ($this->tuangou->verify_token) {` 处突然结束,逻辑不完整,无法评估后续分支。 | 补充完整代码或说明缺失部分。当前审查仅基于已提供片段。 | 无 |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **修复 SQL 注入**:立即将 `refund_by_notify` 中的字符串拼接条件替换为查询构造器或参数化查询。
2. **规范事务流程**:将 `check_notify` 中的 `$this->db->trans_start()` 改为 `$this->db->trans_begin()`,确保所有异常分支和提前返回均正确调用 `trans_rollback()`,成功分支调用 `trans_commit()`。
3. **消除 N+1 查询**:重构 `get_list` 方法,将循环内的单条查询改为批量查询,预计可提升列表接口 50%~80% 的响应速度。
### 🛠 后续重构与优化方向
1. **拆分“上帝模型”**:当前 `Ahead_book_order_model` 承担了订单创建、支付回调、退款、消息推送、库存扣减、财务对账等职责。建议按 **领域驱动设计 (DDD)** 或 **服务层模式** 拆分:
- `OrderService`:处理下单、退款业务流
- `PaymentNotifyHandler`:专注支付回调与幂等控制
- `NotificationService`:封装微信模板消息与短信发送
- `InventoryService`:处理套餐/包厢库存扣减与回滚
2. **统一金额处理规范**:全项目金额字段建议统一转为 `int`(单位:分),入库/出库时使用 `bcadd`/`bcsub`/`bcmul`/`bcdiv`,彻底杜绝浮点精度问题。
3. **清理技术债务**:
- 移除所有 `//` 注释的废弃代码,使用 Git 版本控制追溯历史。
- 将魔法数字提取为类常量或配置文件(如 `config/book_status.php`)。
- 统一日志函数调用(建议封装为 `Logger` 类或统一使用 `log_message()`)。
4. **框架适配确认**:若 `phpci` 非标准 CI3,请重点核对 `$this->db->trans_*` 系列方法的行为差异,以及 `$this->load->config()` 的命名空间隔离机制,必要时查阅官方文档进行 API 对齐。
> 💡 **审查局限性说明**:由于提供的代码在 `create_community_shop_book_order` 方法末尾截断,无法完整评估团购券核销、组合支付尾款处理等后续逻辑。建议补充完整文件后再次进行针对性审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781060018
|
1781060018
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
661
|
22
|
82
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 预订管理
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `e6fd8b8b7 ## 自动代码审查报告
**分支**: app-260616
**提交**: `e6fd8b8b7e1699eeac1d338194fc5d8217f67ea7`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 11:21:00
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:业务逻辑覆盖较全面,能处理预订、关联账单、权限校验及短信通知等复杂场景。但代码存在**严重的 SQL 注入风险**、**事务管理不规范**、**N+1 查询性能瓶颈**以及**MVC 职责严重越界**等问题。整体架构偏向老旧的 CodeIgniter 3 写法,缺乏现代 PHP 的类型约束、单一职责划分与防御性编程意识。
- **风险等级**:🔴 高
> 📌 **框架说明**:提交代码的语法特征(`&get_instance()`、`$this->load->model()`、`$this->db->trans_start()` 等)高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,以下建议基于 CI3 核心机制与现代 PHP 最佳实践,架构原则通用。
---
## 2. 问题详情
| 严重程度 | 文件/方法 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_list` / `update_book` | **SQL 注入风险**:直接将用户输入 `$params['book_no']` 拼接到 `LIKE` 语句,且使用 `implode(",", $ids)` 拼接 `IN` 条件,未做任何转义或参数绑定。 | 使用查询构造器(Query Builder)或 `$this->db->escape()` / `escape_like_str()` 进行安全处理。 | `$this->db->like('book._book_no', $params['book_no']);`<br>`$this->db->where_in('_id', $ids);` |
| 🔴 严重 | `add_book` | **事务管理混乱**:混用 `trans_start()`、手动 `trans_rollback()` 与 `try-catch`。若 `catch` 中直接 `return` 而未调用 `trans_complete()`,可能导致连接池事务未释放或死锁。 | 遵循框架标准事务流:移除手动 `trans_rollback()`,统一在 `trans_complete()` 后通过 `trans_status()` 判断结果。 | 见下方 `事务重构示例` |
| 🟠 警告 | `get_book_list` | **N+1 查询性能瓶颈**:在 `foreach ($list['rows'] as &$row)` 循环内多次调用 `get_one()`(查用户、查兑换记录、查VIP等)。数据量 >100 时将引发严重性能雪崩。 | 收集所有关联 ID,使用 `WHERE IN` 批量查询,在内存中通过 `array_column` 映射数据。 | 见下方 `批量查询优化示例` |
| 🟠 警告 | `add_book` / `update_book` | **MVC 职责越界**:Model 层直接处理短信发送、房态推送、操作日志记录、权限校验及业务规则判断。违反单一职责原则,难以测试与维护。 | 将非持久化逻辑抽离至 `Service` 层或控制器,Model 仅负责数据读写。复杂流程可改用事件/队列解耦。 | 模型仅保留 `$this->insert()`,业务逻辑移至 `BookService::create()` |
| 🟠 警告 | 文件顶部 | **全局作用域加载模型**:`$CI = &get_instance(); $CI->load->model('Simple_model');` 在类外部执行,易导致重复加载、内存泄漏或 CLI 环境报错。 | 移除全局代码,在 `__construct()` 中按需加载,或依赖框架自动加载机制。 | `public function __construct() { parent::__construct(); }` |
| 🟡 建议 | 全局 | **缺乏类型声明与防御性编程**:方法无参数类型/返回类型约束;`strtotime()` 未校验格式;`throwError()` 为全局函数,可能暴露堆栈信息。 | 添加 PHP 7+ 类型提示;对时间/手机号等关键参数做前置校验;使用框架标准异常类。 | `public function add_book(int $merchantId, int $uid, array $params): array` |
| 🟡 建议 | `add_book` | **魔法数字与硬编码**:大量使用 `1, 2, -1, 7, 11, 22, 34` 等状态码/模板ID,可读性差且易出错。 | 提取为类常量或配置项,如 `const SMS_TEMPLATE_BOOK_SUCCESS = 34;` | `const SMS_TEMPLATE_BOOK_ADMIN = 22;` |
### 🔧 核心代码重构示例
**1. 事务安全写法(替代原 `try-catch` + 手动回滚)**
```php
$this->db->trans_begin(); // 或 trans_start()
// 执行所有数据库操作...
$result = $this->insert($addData);
if ($result === false) {
$this->db->trans_rollback();
return ['success' => false, 'msg' => '预订失败'];
}
// 其他更新操作...
$this->db->trans_commit(); // 或 trans_complete()
if ($this->db->trans_status() === FALSE) {
$this->db->trans_rollback();
return ['success' => false, 'msg' => '数据库事务异常'];
}
// 事务成功后执行非DB操作(短信、通知等)
```
**2. N+1 查询优化(`get_book_list` 循环内)**
```php
// 1. 收集所有需要查询的ID
$userIds = array_unique(array_filter(array_column($list['rows'], 'ahead_user_id')));
$exchangeIds = array_unique(array_filter(array_column($list['rows'], 'group_platform_order_id')));
// 2. 批量查询
$userMap = $exchangeMap = [];
if ($userIds) {
$users = $this->ahead_user_model->get_list(['_id' => $userIds], '_id,_mobile');
$userMap = array_column($users, '_mobile', '_id');
}
if ($exchangeIds) {
$exchanges = $this->ahead_tuangou_exchange_log_model->get_list(['_id' => $exchangeIds], '_id,_platform_voucher_code');
$exchangeMap = array_column($exchanges, '_platform_voucher_code', '_id');
}
// 3. 循环内直接内存映射
foreach ($list['rows'] as &$row) {
if (empty($row['customer_contact']) && isset($userMap[$row['ahead_user_id']])) {
$row['customer_contact'] = $userMap[$row['ahead_user_id']];
}
// ... 其他逻辑同理
}
```
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **彻底修复 SQL 注入**:全局搜索 `$params` 直接拼接 SQL 的位置,统一替换为 `$this->db->where()`、`$this->db->like()` 或 `$this->db->query($sql, $bindings)`。
2. **规范事务生命周期**:移除 `try-catch` 中的手动 `trans_rollback()`,严格遵循 `trans_begin() -> 业务逻辑 -> trans_commit() -> trans_status()` 流程。
3. **消除循环查库**:对 `get_book_list` 中的关联数据查询实施批量加载(Batch Fetching),预计可提升列表接口响应速度 **60%~80%**。
### 🛠 后续重构方向
1. **架构分层(Service 模式)**:当前 Model 承担了 Controller 和 Service 的职责。建议创建 `BookService`,将权限校验、短信发送、房态同步、操作日志等逻辑移出 Model,Model 仅保留 `CRUD` 与基础数据校验。
2. **引入现代 PHP 特性**:
- 添加严格类型声明:`declare(strict_types=1);`
- 使用 PHP 8 属性/类型提示:`public function add_book(int $merchantId, int $uid, array $params): array`
- 替换全局函数 `throwError()` 为 `throw new \InvalidArgumentException('...')` 或框架标准异常。
3. **配置与常量管理**:将硬编码的短信模板 ID、状态映射、业务阈值抽离至 `config/book.php` 或类常量中,便于多环境部署与后期维护。
4. **代码格式化**:使用 `PHP-CS-Fixer` 或 `Prettier` 统一应用 PSR-12 规范,拆分超过 150 行的方法(如 `add_book` 可拆分为 `validate()`, `prepareData()`, `executeTransaction()`, `notify()`)。
> ⚠️ **局限性说明**:提供的代码在 `update_book` 方法末尾处截断(`if (isset($params['welcome_minutes']) && $params['welcome_minutes']) {`),未能审查完整逻辑。若该方法后续包含类似拼接或事务操作,请同步按上述标准修复。建议补充完整代码或进行二次审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781061660
|
1781061660
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
662
|
18
|
200
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 需求-修改包厢停用文案
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `3f2788382e ## 自动代码审查报告
**分支**: pc-260616
**提交**: `3f2788382e253594920d1fecb1914bc69d2beca9`
**提交人**: caihongyuchy (1091045324@qq.com)
**时间**: 2026-06-10 13:21:30
---
## 📋 审查摘要
- **变更文件数**: 0
- **严重问题**: 0
- **高危问题**: 0
- **中危问题**: 0
- **建议优化**: 0
## 🐛 发现的问题
*(注:您提供的输入中 `## 变更文件内容` 部分为空,未检测到任何可审查的代码片段。请补充具体代码后重新提交。)*
## ✅ 代码亮点
*(待代码提供后补充)*
## 📝 总体建议
您已提供了 CodeIgniter 3 的核心系统文件结构(`system/` 目录下的 helpers、libraries、database 驱动等),但 **`## 变更文件内容` 部分为空**。
请补充您需要审查的具体业务代码(如控制器、模型、自定义库或视图)。收到代码后,我将立即严格按照您的要求执行以下深度审查:
1. 🔴 **跨文件引用验证**:逐行核对 `$this->load->model()`、`$this->load->library()`、`$this->load->helper()` 及自定义类/方法调用,确保拼写正确且文件真实存在。
2. 🔴 **CI 框架规范**:验证模型命名是否严格对应 `Xxx_model.php`,控制器是否对应 `Xxx.php`,检查 CI 3.x 特有语法兼容性。
3. 🛡️ **安全与逻辑**:重点扫描 SQL 注入(未使用查询绑定)、XSS(未过滤输出)、未定义变量、类型错误、资源未释放及越权访问风险。
4. 📝 **代码质量**:检查硬编码、重复逻辑、错误处理缺失及命名规范。
请粘贴变更代码,我将为您生成符合指定格式的完整审查报告。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781068890
|
1781068890
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
663
|
18
|
201
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - Jh_community_shop_revenues_de 🔍 代码审查报告:pc-260616 - Jh_community_shop_revenues_detail...
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `230bfa5c0f ## 自动代码审查报告
**分支**: pc-260616
**提交**: `230bfa5c0f0903d47edda3edd8f2585a60f34596`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 14:59:24
---
## 1. 审查摘要
- **代码质量评分**:6.0 / 10 分
- **总体评价**:代码实现了社区商家营收明细的查询、过滤与导出功能,业务逻辑基本完整。但存在明显的 SQL 注入风险、N+1 查询性能瓶颈、分页统计逻辑缺陷以及多处不符合现代 PHP/CI 规范的写法。整体可维护性与安全性有待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 第 138-145 行 | **SQL 注入漏洞**:`$pay_platform_where` 数组通过字符串拼接直接构造 SQL 片段,若 `$params['pay_platform_arr']` 来源不可信,将导致严重注入风险。 | 使用查询构建器的参数绑定机制,或强制类型转换后使用框架提供的 `or_where` / `where_in` 组合。 | ```php<br>// 安全写法示例<br>$this->db->group_start();<br>foreach ($params['pay_platform_arr'] as $pp) {<br> $parts = explode('_', $pp);<br> $this->db->or_where('a._pay_platform', (int)$parts[0]);<br> if (!empty($parts[1])) {<br> $this->db->or_where('a._second_pay_platform', (int)$parts[1]);<br> }<br>}<br>$this->db->group_end();<br>``` |
| 🔴 严重 | 第 1 行 | **全局作用域执行实例化**:`$CI = &get_instance();` 放在类外部,文件被 `include/require` 时即执行,破坏框架生命周期,易引发内存泄漏或上下文污染。 | 移除全局代码,将模型加载移至类构造函数中。 | ```php<br>public function __construct()<br>{<br> parent::__construct();<br> $this->load->model('Report_model');<br>}<br>``` |
| 🟠 警告 | 第 108-122 行 | **分页统计逻辑缺陷**:`$count` 与 `$sum_data` 仅在 `$params['page'] == '1'` 时计算。翻至第 2 页时变量未定义,虽用 `??` 兜底,但会导致分页总数与总金额显示为 0,破坏业务体验。 | 移除 `if ($params['page'] == '1')` 条件,始终执行统计查询;或引入缓存机制避免重复计算。 | ```php<br>// 始终计算统计值<br>$count = $this->count($where);<br>$sum_data = $this->get_one($where, 'sum(...) as total_amount');<br>``` |
| 🟠 警告 | 第 158-165 行 | **N+1 查询性能瓶颈**:在 `foreach ($data as &$v)` 循环内调用 `$this->ahead_book_order_model->get_one()`,数据量大时将产生大量数据库往返请求。 | 提取所有关联订单 ID,使用批量查询(如 `get_data_by_ids`)后通过数组映射回填。 | ```php<br>$book_ids = array_unique(array_column($data, 'order_id'));<br>$book_orders = $this->ahead_book_order_model->get_data_by_ids($book_ids, '_id,_shop_name,_arrival_time,_end_time', '_id');<br>// 循环内直接 $v['book_info'] = $book_orders[$book_order_id] ?? [];``` |
| 🟠 警告 | 第 118-120 行 | `json_decode` 未指定关联数组参数,且未处理解析失败情况。若传入非法 JSON,后续逻辑可能静默失败。 | 添加 `true` 参数并配合 `json_last_error()` 或 `JSON_THROW_ON_ERROR` 进行校验。 | ```php<br>$arr = json_decode($params['order_type_arr'], true);<br>if (!is_array($arr)) { $arr = []; }<br>``` |
| 🟡 建议 | 第 1 行 | **类名不符合 PSR-12 规范**:`Jh_community_shop_revenues_detail_model` 使用下划线命名,现代 PHP 推荐 PascalCase。 | 重命名为 `JhCommunityShopRevenuesDetailModel`,并同步更新自动加载与调用处。 | `class JhCommunityShopRevenuesDetailModel extends Report_model` |
| 🟡 建议 | 第 95-98 行 | **日期参数未校验**:`strtotime($params['start_time'])` 若传入非法字符串将返回 `false`,导致查询条件变为 `0` 或 `-1`。 | 增加日期格式校验与默认值回退机制。 | ```php<br>$start = strtotime($params['start_time'] ?? date('Y-m-d'));<br>$end = strtotime($params['end_time'] ?? date('Y-m-d', strtotime('+1 day')));<br>``` |
| 🟡 建议 | 多处 | **模型重复加载**:`$this->load->model()` 在多个方法内重复调用,增加框架解析开销。 | 统一在 `__construct()` 中加载,或使用依赖注入容器管理。 | 见 🔴 严重第 1 行示例 |
> 📌 **框架适配说明**:代码呈现典型的 **CodeIgniter 3** 架构特征(如 `$CI = &get_instance()`、`$this->load->model()`、自定义 `Report_model` 查询构建器)。若 `phpci` 为内部定制框架,请确保 `enforce_con_db()`、`count()`、`select()` 等方法与框架底层 DB 驱动兼容,并查阅官方文档确认查询数组 `$where` 是否支持原生 SQL 片段注入。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入**:第 138-145 行的字符串拼接查询必须改为参数化查询或框架安全构建器,这是最高优先级安全漏洞。
2. **修正分页统计逻辑**:移除 `page == 1` 的条件判断,确保任何分页状态下都能正确返回 `count` 与 `total_amount`。
3. **消除 N+1 查询**:将循环内的单条查询改为批量查询,预计可将该接口响应时间降低 60%~80%(尤其在数据量 > 50 条时)。
### 🛠 后续重构与优化方向
- **架构规范化**:将全局 `$CI` 引用移至构造函数,遵循 PSR-12 命名规范,逐步引入 PHP 8 类型声明(如 `public function get_community_revenues_list(int $merchant_id, array $params, bool $export = false): array`)。
- **查询构建器抽象**:当前 `$where` 数组结构高度定制化,建议封装为独立的 `QueryBuilder` 类或使用框架原生 Active Record,避免手动拼接 `join`、`where`、`like` 导致维护困难。
- **配置与常量分离**:`ORDER_TYPE`、`revenues_pay_platform_arr` 等硬编码数据建议移至 `config/` 目录或数据库字典表,便于运营动态调整。
- **防御性编程**:对 `$params` 增加统一校验层(如使用 `Form_validation` 或自定义 DTO),确保 `start_time`、`end_time`、`shop_id` 等关键字段类型与范围合法后再进入业务逻辑。
> 💡 若需针对 `phpci` 框架的特定查询构建器或缓存机制进行深度适配,请提供 `Report_model` 核心方法签名或框架官方文档链接,以便输出更精准的底层优化方案。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781074764
|
1781074764
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
664
|
18
|
202
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 小程序用户退款记录
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `0d7e1c9d23 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `0d7e1c9d23083f6aa8f7e8061e7300a8fa1aa5ff`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 16:16:42
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码实现了核心业务逻辑,但存在明显的遗留框架使用习惯(如全局获取实例、状态化表名切换)、性能瓶颈(循环内字符串拼接、重复加载配置)及现代 PHP 规范缺失。整体可运行,但在高并发、PHP 8+ 环境及长期维护下存在隐患。
- **风险等级**:🟠 中(存在潜在 SQL 注入风险、JSON 解析异常未处理、模型状态污染可能引发数据错乱)
> 📌 **框架说明**:代码结构高度符合 CodeIgniter 3 规范。若 `phpci` 为内部定制框架,请结合其官方文档确认 `Simple_model` 的查询构造器实现机制及生命周期钩子。以下建议基于 CI 架构与现代 PHP (7.4+/8.0+) 标准。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 顶部全局 | 在类外部使用 `$CI =& get_instance(); $CI->load->model('Simple_model');` 违反 OOP 原则与框架生命周期,易导致模型重复加载或状态污染。 | 移除顶部代码,依赖注入或移至构造函数加载。若 `Simple_model` 为父类,直接 `extends` 即可。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_shop_config_model'); }` |
| 🔴 严重 | `get_refund_data` / `get_refund_log` | `$where` 数组直接传入自定义 `select()`,若底层未使用预处理/参数绑定,存在 **SQL 注入** 风险。 | 确保 `Simple_model::select()` 内部使用 `$this->db->where()` 或 PDO 预处理。对外部输入进行类型强转。 | `$where['a._order_id'] = (int) $order_id;`<br>`$where['_unique_key'] = (string) $unique_key;` |
| 🟠 警告 | 多处 `json_decode` | `json_decode()` 未处理非法 JSON 字符串。在 PHP 8+ 中若传入非字符串或格式错误,可能触发 Warning 或返回 `null`,导致后续数组访问报错。 | 增加类型校验与安全回退,或使用 `json_decode($str, true) ?? []`。 | `$data = is_string($json) ? (json_decode($json, true) ?? []) : [];` |
| 🟠 警告 | `get_refund_data` 循环内 | 使用 `$goods_info[...] .= ',' . ...` 进行字符串拼接,频繁分配内存且需 `trim()` 处理末尾逗号,性能较差。 | 改用数组收集,循环结束后使用 `implode()` 合并。 | `$goods_list[] = "{$v['_goods_name']}({$v['_refund_quantity']}{$v['_goods_unit_name']})";`<br>`$goods_info[$id] = implode(',', $goods_list);` |
| 🟠 警告 | `get_refund_log` | `$admin_ids = array_column(...)` 可能为空数组,但仍执行 `get_data_by_ids()` 查询,浪费数据库连接。 | 增加空值判断,提前返回或跳过查询。 | `if (empty($admin_ids)) { $admin_data = []; } else { $admin_data = $this->...->get_data_by_ids(...); }` |
| 🟠 警告 | `setTableName()` 调用 | 通过 `$this->setTableName()` 动态修改模型内部表名状态。在并发请求或同一实例多次调用时,极易引发 **状态污染** 与数据错乱。 | 避免修改实例状态。改用查询构造器直接指定表名/别名,或每次查询前克隆实例。 | `$this->db->select($fields)->from($this->table_name.' a')->join(...)->get()->result_array();` |
| 🟡 建议 | 全局方法签名 | 缺乏类型声明(Type Hints),不符合现代 PHP 规范,降低 IDE 提示与静态分析能力。 | 为参数与返回值添加严格类型声明(PHP 7.4+/8.0+)。 | `public function get_refund_data(int $order_id, string $order_type = '', int $shop_id = 0): array` |
| 🟡 建议 | 硬编码数组 | `[17, 18, 19, 20, 23, 24, 25, 26, 27, 28]` 与魔法数字 `10`, `14`, `1`, `3` 重复出现,语义不明且维护困难。 | 提取为类常量或配置文件,`in_array` 增加严格模式 `true`。 | `private const CUSTOM_PAY_IDS = [17, 18, 19, 20, 23, 24, 25, 26, 27, 28];`<br>`in_array($id, self::CUSTOM_PAY_IDS, true)` |
| 🟡 建议 | 配置加载 | `$this->config->load('merchant', TRUE);` 在方法内重复调用,增加 I/O 开销。 | 移至构造函数加载一次,或缓存至类属性。 | `private $merchantConfig;`<br>`$this->merchantConfig = $this->config->item('merchant');` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **消除全局实例加载**:立即移除文件顶部的 `$CI =& get_instance();`,将依赖模型加载收敛至 `__construct()` 或使用 CI 的 `autoload.php`。
2. **防御 SQL 注入**:确认 `Simple_model::select()` 底层是否使用参数绑定。若未使用,必须对所有外部传入的 `$order_id`、`$unique_key` 进行 `(int)` 或 `(string)` 强转,或改用框架原生 Query Builder。
3. **修复 JSON 解析隐患**:统一替换 `json_decode` 调用,增加 `is_string()` 校验与 `?? []` 安全回退,避免 PHP 8+ 环境下的隐式类型错误。
4. **解除状态污染**:废弃 `setTableName()` 动态切换表名的做法。改为在查询时显式传递表名/别名,或封装独立的查询方法,确保模型实例无状态(Stateless)。
### 🛠 后续重构与优化方向
- **性能优化**:将 `get_refund_data` 中的商品明细查询改为 `JOIN` 关联查询,避免分步查询带来的网络往返开销;使用 `implode()` 替代循环字符串拼接。
- **架构规范化**:
- 遵循 PSR-12 规范,统一类名(建议 `AheadYcOrderRefundModel`)、方法命名与缩进。
- 引入 PHP 8 特性:使用 `readonly` 属性、枚举(`enum`)替代魔法数字、`match` 表达式优化支付平台映射逻辑。
- **可维护性提升**:将硬编码的支付平台 ID、订单类型、日志类型抽离至 `config/` 目录或数据库字典表,实现业务逻辑与配置解耦。
- **单元测试覆盖**:针对 `get_refund_data` 和 `get_refund_log` 编写 PHPUnit 测试用例,重点覆盖空结果集、非法 JSON、边界金额及并发调用场景。
> 💡 **提示**:若 `phpci` 框架对模型生命周期或查询构造器有特殊封装,请优先查阅其官方文档中关于 `Model` 状态管理与 `DB` 驱动绑定的章节,以确保重构方案与框架底层兼容。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781079402
|
1781079402
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
665
|
18
|
203
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 1
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `d7e5996ab6 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `d7e5996ab65bb821f278a19b971a31f3a3f1c4b9`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 16:18:15
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10
- **总体评价**:代码实现了退款数据的查询、关联与格式化逻辑,基础功能完整。但存在明显的架构反模式(如全局作用域加载、方法内重复加载依赖)、硬编码魔法数字、JSON 解析缺乏容错、以及数据获取与视图格式化严重耦合。整体可维护性、健壮性与性能有较大优化空间。
- **风险等级**:🟠 中(主要隐患在于 JSON 解析异常导致崩溃、硬编码维护成本高、潜在的性能损耗及框架生命周期管理不规范)
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 文件顶部 (全局作用域) | 在类外部使用 `$CI =& get_instance();` 并加载 `Simple_model`。此写法破坏面向对象封装,易引发依赖冲突、内存泄漏,且不符合现代 PHP 框架规范。 | 移除全局 `$CI` 调用。基类 `Simple_model` 应由框架自动加载或继承时自动解析,无需手动 `load`。 | `// 删除顶部代码\n// $CI =& get_instance();\n// $CI->load->model('Simple_model');` |
| 🔴 严重 | `get_refund_data` / `get_refund_log` 循环内 | `json_decode()` 未做严格类型校验。若数据库字段值为 `"null"`、`"false"` 或损坏 JSON,`json_decode` 将返回 `null`,后续 `foreach` 会触发 `Warning: Invalid argument supplied for foreach()`。 | 增加返回值类型强校验,或使用 `is_array()` 兜底。 | `$data = json_decode($json, true);\n$v['refund_amount_info'] = is_array($data) ? $data : [];` |
| 🟠 警告 | `get_refund_data` / `get_refund_log` 方法内 | 在业务方法中频繁调用 `$this->load->model()` 与 `$this->config->load()`。每次调用均触发框架 Loader 检查,造成冗余 I/O 与性能损耗。 | 将依赖加载统一移至 `__construct()` 中,或使用框架的自动加载/依赖注入机制。 | `public function __construct() {\n parent::__construct();\n $this->load->model('ahead_yc_order_refund_infos_model');\n $this->load->model('ahead_shop_config_model');\n $this->load->model('ahead_yc_merchant_user_model');\n $this->config->load('merchant', TRUE);\n}` |
| 🟠 警告 | `get_refund_data` & `get_refund_log` | 硬编码支付平台 ID 数组 `[17, 18, 19, 20, 23, 24, 25, 26, 27, 28]` 重复出现。业务变更时需多处修改,极易遗漏且可读性差。 | 提取为类常量或独立配置文件,使用 `in_array($id, self::CUSTOM_PAY_IDS, true)` 提升安全性。 | `const CUSTOM_PAY_PLATFORMS = [17, 18, 19, 20, 23, 24, 25, 26, 27, 28];\n// 使用时\nif (in_array($vv['pay_platform'], self::CUSTOM_PAY_PLATFORMS, true)) { ... }` |
| 🟠 警告 | `get_refund_data` 方法内 | `$this->setTableName()` 修改表名后,若中间逻辑抛出异常,将导致后续所有查询使用错误的表名(状态未回滚)。 | 使用 `try...finally` 确保表名必定恢复,或封装为独立查询方法避免污染全局状态。 | `try {\n $this->setTableName($this->table_name.' a');\n // ... 查询逻辑\n} finally {\n $this->setTableName($table_name);\n}` |
| 🟠 警告 | `get_refund_log` 循环内 | `$total_refund_amount += $v['refund_amount'];` 未进行类型安全转换。若数据库返回字符串类型金额,可能触发 PHP 警告或浮点精度丢失。 | 累加前强制转换为浮点数,并处理空值。 | `$total_refund_amount += (float) ($v['refund_amount'] ?? 0);` |
| 🟡 建议 | 类定义行 | 类名 `Ahead_yc_order_refund_model` 使用蛇形命名,不符合 PSR-12 规范(类名应使用大驼峰 PascalCase)。 | 重命名为 `AheadYcOrderRefundModel`,并全局同步更新引用。 | `class AheadYcOrderRefundModel extends Simple_model` |
| 🟡 建议 | 方法返回值 | `return $refund_info ?$refund_info : array();` 存在语法空格不规范,且三元表达式冗余。 | 使用空合并运算符简化,提升可读性与执行效率。 | `return $refund_info ?? [];` |
| 🟡 建议 | 架构设计 | 模型层承担了过多视图格式化职责(如拼接 `【套餐配送】`、日期格式化、金额字符串拼接)。违反单一职责原则 (SRP)。 | 将数据格式化逻辑剥离至 `Service` 层或 `ViewModel`,模型仅负责纯净的数据查询与返回。 | `// 模型返回原始数组\n// Service/ViewModel 层负责格式化\n$formatter = new RefundDataFormatter();\nreturn $formatter->format($rawData);` |
| 🟡 建议 | PHPDoc 注释 | 方法注释缺少 `@return` 类型声明及参数类型提示,不利于 IDE 静态分析与团队协作。 | 补充完整 PHPDoc,明确参数与返回值类型。 | `/**\n * @param int $order_id\n * @param string|int $order_type\n * @param int $shop_id\n * @return array\n */` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **移除全局 `$CI` 调用**:彻底清理文件顶部的 `$CI =& get_instance();`,避免破坏框架依赖树。
2. **JSON 解析容错**:对所有 `json_decode` 结果进行 `is_array()` 校验,防止脏数据导致循环崩溃。
3. **依赖加载前置**:将 `load->model()` 与 `config->load()` 统一收敛至构造函数,消除运行时重复加载开销。
4. **硬编码提取**:将支付平台 ID 列表提取为类常量或配置文件,降低后续维护成本。
### 🛠 后续重构与优化方向
- **架构分层**:当前模型混合了 `数据查询` 与 `展示层格式化`。建议引入 `Service` 层处理业务编排,或使用 `DTO/ViewModel` 处理前端展示所需的字符串拼接与格式化,保持 Model 的纯粹性。
- **状态安全管理**:`setTableName()` 属于框架级状态修改,务必配合 `try...finally` 或封装为闭包查询,防止异常中断导致全局状态污染。
- **类型声明升级**:若运行环境为 PHP 7.4+,建议为方法参数与返回值添加类型声明(如 `public function get_refund_data(int $order_id, string $order_type = '', int $shop_id = 0): array`),提升代码健壮性。
- **框架适配说明**:代码结构高度契合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请确认其 Loader 机制、配置缓存策略与 CI3 是否完全一致。对于不确定的生命周期行为,建议查阅 `phpci` 官方文档中关于 `Model 初始化` 与 `Config 缓存` 的最佳实践。
> 💡 **局限性提示**:本次审查基于提供的单文件代码。由于未提供 `Simple_model` 基类实现、`$this->select()` 底层 SQL 构建逻辑及完整框架配置,部分安全性(如底层是否自动参数绑定防注入)与性能评估基于通用框架经验推断。建议结合完整项目上下文进行集成测试验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781079495
|
1781079495
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
666
|
22
|
83
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 订单退款api
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `fbf39c180 ## 自动代码审查报告
**分支**: app-260616
**提交**: `fbf39c1808c9d230b929c3e80aadf2d78042a9f2`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 16:23:08
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:代码呈现典型的历史遗留系统特征,业务逻辑高度耦合,存在多处严重的安全隐患(硬编码密钥、明文密码比对、SQL 拼接风险)与架构反模式(上帝控制器、构造函数过重、直接操作超全局变量)。整体可维护性、扩展性与安全性均不达标,需进行系统性重构。
- **风险等级**:🔴 高
> 📌 **框架说明**:从 `CI_Controller`、`$this->load->`、`defined('BASEPATH')` 等特征判断,当前代码基于 **CodeIgniter 3** 架构。若 `phpci` 为贵司内部定制框架,以下安全与架构规范同样适用。具体组件调用请以 `phpci` 官方文档为准。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `MerchantAppServer.php`<br>`case '0005'` | **硬编码敏感凭证**:科大讯飞 TTS 的 `APISecret`、`APIKey` 直接暴露在业务逻辑中,极易通过版本库或反编译泄露。 | 移至独立配置文件或环境变量,通过框架配置类读取。禁止在代码中明文存储密钥。 | `// config/keys.php\n$config['xfyun'] = ['APPID' => '...', 'APISecret' => '...'];\n// 控制器中\n$xfyun = $this->config->item('xfyun');` |
| 🔴 严重 | `MerchantAppServer.php`<br>`case '00064'` | **明文密码存储与比对**:`_discount_pwd` 疑似明文存储,且直接与 `$_old_password` 比对,违反基础安全规范。 | 使用 `password_hash()` 加密存储,`password_verify()` 验证。 | `if (!password_verify($_old_password, $data['_discount_pwd'])) { ... }\n$hash = password_hash($_new_password1, PASSWORD_DEFAULT);` |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>多处查询方法 | **SQL 注入风险**:`$addsql`、`$shop_ids`、`$_start_date` 等变量直接拼接入 SQL 字符串,未使用参数绑定。若上游传入恶意数据将导致注入。 | 全面改用 CI Query Builder 或严格使用 `?` 占位符。禁止拼接外部传入的 SQL 片段。 | `$this->db->where_in('_shop_id', explode(',', $shop_ids));\n$this->db->where('_timestamp >=', $start_date);` |
| 🔴 严重 | `Ahead_pay_log_model.php`<br>`update_refund_amount()` | **原始 WHERE 条件拼接**:`$where = '_relation_id="' . $relation_id . '" ...'` 存在注入风险且易引发语法错误。 | 使用 CI 数组条件或 Query Builder 方法构建查询。 | `$where = ['_relation_id' => $relation_id, '_type' => $type, '_status' => [1, 4]];` |
| 🟠 警告 | `Api.php`<br>`__construct()` & `jsonEcho()` | **输出缓冲滥用 & 未设响应头**:直接操作 `ob_*` 易触发 Warning,且未设置 `Content-Type: application/json`,可能导致客户端解析异常。 | 移除冗余缓冲操作,使用 CI 的 `output` 类统一响应。 | `$this->output->set_content_type('application/json')->set_output(json_encode($result, JSON_UNESCAPED_UNICODE));` |
| 🟠 警告 | `MerchantAppServer.php`<br>`__construct()` & `index()` | **构造函数过重 & 上帝方法**:构造函数执行鉴权、日志、配置加载;`index()` 包含数十个 `case`,严重违反单一职责原则,难以测试与维护。 | 将鉴权/日志移至基类控制器或中间件;按业务域拆分控制器,利用 CI 路由分发。 | 拆分为 `AuthController`、`OrderController`、`PrinterController` 等独立控制器。 |
| 🟠 警告 | `Api.php`<br>`selfChangeRoom()` | **直接修改 CI 超对象属性**:`$CI->merchant_id = ...` 破坏框架封装,易引发请求间状态污染与并发安全问题。 | 通过参数传递上下文数据至 Model,或使用 Session/Request 对象管理状态。 | `$this->load->model('order_model');\n$this->order_model->change_room($merchant_id, $admin_data, $params);` |
| 🟡 建议 | 全局多处 | **浮点数处理金额**:使用 `float` 进行金额加减(如 `bcsub` 未全面覆盖),在 PHP 中可能导致精度丢失(如 `0.1+0.2=0.30000000000000004`)。 | 金额统一以“分”为单位(整数)存储计算,或全面使用 `BCMath` 扩展。 | `$actual_pay = bcsub($pay, $refund, 2);\n$refund_amount = (int)round($refund * 100); // 转为分` |
| 🟡 建议 | 全局多处 | **模型重复加载**:在方法内部频繁 `$this->load->model()`,增加 I/O 开销且不符合 CI 最佳实践。 | 移至构造函数统一加载,或配置 `autoload.php` 自动加载高频模型。 | `public function __construct() { parent::__construct(); $this->load->model('vip_model'); }` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题(P0)
1. **移除硬编码密钥**:立即将 `MerchantAppServer.php` 中的 `xfyun_tts_config` 迁移至配置文件或密钥管理服务(如 Vault/Env),并轮换已泄露的密钥。
2. **修复密码安全漏洞**:对 `_discount_pwd` 字段执行一次性哈希迁移脚本,后续所有密码比对必须使用 `password_verify()`。
3. **封堵 SQL 注入入口**:全面审查 `$addsql`、`$shop_ids`、`$relation_id` 等变量的来源,替换所有字符串拼接 SQL 为 Query Builder 或参数绑定查询。
### 🛠 后续重构与优化方向
1. **架构解耦与路由规范化**:
- 废弃 `switch ($request['function'])` 的伪路由模式,改用 CI 原生路由配置(`config/routes.php`)映射到独立控制器。
- 将鉴权、日志记录、参数校验等横切关注点抽离至 `MY_Controller` 基类或中间件,保持业务控制器轻量。
2. **统一输入/输出处理**:
- 废弃直接读取 `$_POST`/`$_GET`,统一使用 `$this->input->post()`、`$this->input->get()` 或 `$this->input->raw_input_stream`,利用 CI 内置的 XSS/过滤机制。
- 封装统一的 `ApiResponse` 类,替代 `jsonEcho()`,自动处理 Header、状态码与 JSON 序列化。
3. **财务计算精度保障**:
- 建立全局金额处理规范,禁止使用 `float` 进行财务运算。引入 `BCMath` 或整数(分)计算,并在入库/出库时进行严格校验。
4. **代码规范与可维护性提升**:
- 遵循 PSR-12 规范,统一命名风格(如 `AplicationController` 拼写修正、模型类名大小写统一)。
- 消除魔法数字,将 `1, 2, 3, 15, 16` 等状态码/支付类型提取为类常量或枚举。
- 补充关键方法的 PHPDoc 注释与类型声明(PHP 7.4+ 推荐),提升 IDE 提示与静态分析能力。
> 💡 **提示**:由于提供的代码片段存在截断,部分全局函数(如 `throwError`、`request_frequency`)及基类 `Simple_model` 的实现未完全展示。建议在完整代码库中结合静态分析工具(如 `PHPStan`、`SonarQube`)进行全量扫描,以覆盖潜在的类型不匹配与未捕获异常。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781079788
|
1781079788
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
667
|
23
|
35
|
1
|
|
0
|
🔍 代码审查报告:admin-260616 - 小程序续费二维码
|
## 自动代码审查报告
**分支**: admin-260616
**提交**: `7cc3245 ## 自动代码审查报告
**分支**: admin-260616
**提交**: `7cc3245c843739ac94cf83deb882fbe15bca93d5`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 18:08:11
---
## 1. 审查摘要
- **代码质量评分**:6.5/10
- **总体评价**:代码实现了小程序码生成与缓存的核心流程,但存在明显的框架生命周期误用、二进制/JSON混合处理缺陷、数据库竞态条件及硬编码问题。整体逻辑可跑通,但健壮性、可维护性与安全性存在较大优化空间。
- **风险等级**:高
> 📌 **注**:提供的目录结构与 `$CI = &get_instance()` 用法高度符合 **CodeIgniter 3** 规范。以下审查基于 CI3 生命周期与 PHP 最佳实践。若 `phpci` 为内部定制框架,请对照其官方文档调整组件加载机制。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 全局/第2行 | `$CI = &get_instance();` 在类外部直接调用,会在文件被 `include/require` 时立即执行,破坏框架初始化生命周期,且在 CLI 或单元测试中极易引发 `Call to undefined function` 错误。 | 移除全局调用。模型应通过 `$this->load->model()` 加载依赖,或在 `__construct()` 中初始化。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_yc_merchant_model'); }` |
| 🔴 严重 | `create_qrcode()` | 微信接口成功时返回**二进制图片流**,失败时返回 **JSON**。代码使用 `$buffer = $wxacode = getUnlimitedWxacode(...)` 混合赋值,随后对二进制数据执行 `json_decode()` 会产生 Warning,且未校验 OSS 上传结果即更新数据库,可能导致脏数据。 | 明确区分成功/失败分支;增加 OSS 上传返回值校验;避免对二进制数据使用 `var_export` 记录日志。 | 见下方重构示例 |
| 🟠 警告 | `update_qrcode()` | 仅使用 `_family_server_id` 作为唯一查询条件。若同一服务器下存在多个包厢,会导致数据覆盖或误更新。且 `SELECT` 后 `INSERT/UPDATE` 存在典型的 **TOCTOU 竞态条件**。 | 使用复合唯一键(如 `_family_server_id` + `_room_id`);改用 `INSERT ... ON DUPLICATE KEY UPDATE` 或框架的 `replace()` 方法。 | `$this->db->replace($this->table_name, $insert_data);` |
| 🟠 警告 | `get_qrcode()` | 方法内部动态加载模型 `$this->load->model()`,若高频调用会导致重复解析与实例化开销;且未对 `$room_data` 数组键进行防御性校验,缺失键将触发 `Undefined index` 通知。 | 依赖加载移至构造函数;使用 `isset()` 或空合并运算符 `??` 进行参数校验。 | `if (!isset($room_data['_merchant_id'], $room_data['_id'])) { return ''; }` |
| 🟡 建议 | 全局/类名 | 类名 `Ahead_room_renewal_mini_qrcode_model` 使用下划线分隔,不符合 PSR-12 的 `PascalCase` 规范,影响自动加载与团队协作。 | 重命名为 `AheadRoomRenewalMiniQrcodeModel`,并全局同步更新引用路径。 | `class AheadRoomRenewalMiniQrcodeModel extends Simple_model` |
| 🟡 建议 | `create_qrcode()` | 硬编码路径 `DEBUG_VERSION . 'ktv/...'` 与域名 `https://vodonline.g-hi.com/`,不利于多环境(开发/测试/生产)切换与配置管理。 | 提取至配置文件(如 `config/qrcode.php`),通过 `$this->config->item()` 动态读取。 | `$oss_path = $this->config->item('qrcode_oss_path'); $domain = $this->config->item('qrcode_cdn_domain');` |
| 🟡 建议 | `get_qrcode()` | 魔法数字 `2` 表示“自助商家”业务模式,语义不清晰,后期维护易出错。 | 定义类常量替代硬编码,提升可读性。 | `const BUSINESS_MODEL_SELF_SERVICE = 2;`<br>`if ($merchant_data['_business_model'] !== self::BUSINESS_MODEL_SELF_SERVICE)` |
### 🔧 核心方法重构参考 (`create_qrcode`)
```php
public function create_qrcode(array $room_data): string
{
// 1. 参数防御
$required = ['_shop_id', '_id', '_merchant_id', '_family_server_id'];
foreach ($required as $key) {
if (!isset($room_data[$key])) {
do_log("Missing key: {$key}", 'renewal_qrcode_error');
return '';
}
}
$scene = "type=2&shop_id={$room_data['_shop_id']}&room_id={$room_data['_id']}";
$wxacodeParams = ['scene' => $scene, 'page' => self::MINI_PAGE];
// 2. 调用微信接口
$response = getUnlimitedWxacode($room_data['_merchant_id'], $wxacodeParams);
// 3. 区分成功(二进制)与失败(JSON)
if (is_string($response) && json_validate($response)) {
$errData = json_decode($response, true);
do_log("WX API Error: " . json_encode($errData), 'renewal_qrcode_error');
return '';
}
// 4. 上传 OSS 并校验
$filename = "{$room_data['_family_server_id']}_{$room_data['_id']}";
$ossKey = $this->config->item('qrcode_oss_path') . "renewal/{$filename}.jpg";
$uploadResult = alioss_internal_addObject_by_content($ossKey, $response);
if (!$uploadResult) {
do_log("OSS Upload Failed for: {$filename}", 'renewal_qrcode_error');
return '';
}
$fileUrl = $this->config->item('qrcode_cdn_domain') . '/' . $ossKey;
$this->update_qrcode($room_data, $fileUrl);
return $fileUrl;
}
```
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **移除全局 `$CI` 调用**:将依赖加载移至 `__construct()`,确保符合框架生命周期,避免 CLI/异步任务崩溃。
2. **修复微信接口返回值处理**:明确区分二进制流与 JSON 错误响应,禁止对非 JSON 数据执行 `json_decode`,并增加 OSS 上传成功校验。
3. **消除数据库竞态条件**:将 `update_qrcode` 中的 `SELECT → INSERT/UPDATE` 逻辑替换为原子操作(如 `REPLACE INTO` 或 `INSERT ... ON DUPLICATE KEY UPDATE`),防止并发请求导致数据错乱。
### 🛠 后续优化方向
- **配置外置化**:将所有环境相关路径、域名、业务状态码抽离至 `config/` 目录,支持多环境无缝切换。
- **类型约束与文档**:为方法参数添加 `array` 类型提示,补充 `@throws` 异常说明,启用 PHP 7.4+ 严格模式(`declare(strict_types=1);`)。
- **缓存策略升级**:当前逻辑每次缺失都重新生成并请求微信接口。建议引入 Redis 缓存层,设置合理的 TTL(如 7 天),降低微信 API 调用频率与数据库 IO。
- **单元测试覆盖**:针对 `create_qrcode` 的失败分支(API 报错、OSS 失败、参数缺失)编写 Mock 测试,确保异常路径可观测。
> 💡 **框架适配提示**:若 `phpci` 框架对模型加载或数据库操作有特定封装(如强制使用 Repository 模式或特定 Query Builder),请优先遵循其官方文档。上述建议基于通用 PHP/CI3 最佳实践,可直接平滑迁移。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781086091
|
1781086091
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
668
|
23
|
36
|
1
|
|
0
|
🔍 代码审查报告:admin-260616 - 生成小程序码
|
## 自动代码审查报告
**分支**: admin-260616
**提交**: `d7e82ca ## 自动代码审查报告
**分支**: admin-260616
**提交**: `d7e82ca5e26517b2e5ceaef844232aa1a7546ef4`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-10 18:14:17
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务意图清晰,核心流程(生成、缓存、返回小程序码)已实现。但存在明显的逻辑隐患(二进制流与 JSON 混处理)、性能瓶颈(重复加载模型、日志记录不当)及框架规范偏离。缺乏必要的异常处理与并发控制,需重点修复。
- **风险等级**:中(存在脏数据写入、日志膨胀及潜在运行时警告风险)
> 📌 **框架说明**:提供的目录结构与代码风格高度吻合 **CodeIgniter 3**。若 `phpci` 为内部定制框架且继承自 CI3,以下建议完全适用;若为独立架构,请根据实际生命周期调整依赖加载方式。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `create_qrcode()` 方法 | 微信 `getUnlimited` 接口成功时返回**二进制图片流**,失败时返回 JSON。代码直接对返回值执行 `json_decode`,成功时返回 `null` 导致逻辑“侥幸”通过;且 `var_export` 记录二进制数据会导致日志文件暴增,甚至触发内存溢出。 | 先判断返回值是否为 JSON 格式(或检查 HTTP 状态/错误码),成功则直接上传,失败才解析并记录日志。避免对二进制数据执行序列化。 | `if (str_starts_with(trim($wxacode), '{')) { $err = json_decode($wxacode, true); if (isset($err['errcode']) && $err['errcode'] > 0) { do_log(...); return ''; } }` |
| 🔴 严重 | `get_qrcode()` 方法 | `$merchant_data['_business_model']` 未做空值校验。若商家不存在或查询返回空数组,将触发 `Undefined index` 警告,并可能绕过业务模型校验直接生成码。 | 增加 `empty()` 或 `isset()` 防御性判断,确保数据结构完整后再访问字段。 | `if (empty($merchant_data) || $merchant_data['_business_model'] != self::BUSINESS_MODEL_SELF_SERVICE) { return ''; }` |
| 🟠 警告 | 文件顶部 (1-3行) | 全局作用域使用 `$CI = &get_instance();` 违反 MVC 模型规范。在 CI/类 CI 框架中,模型文件被 `include` 时即执行,易引发作用域污染、重复实例化及内存泄漏。 | 移除顶部全局赋值,依赖加载应移至类构造函数或使用 `$this->load`。 | 删除顶部两行,在 `__construct()` 中调用 `$this->load->model('Simple_model');`(若父类未自动加载) |
| 🟠 警告 | `update_qrcode()` 方法 | 存在**并发竞态条件**。高并发下多个请求可能同时通过 `empty($data['_qrcode'])` 检查,导致重复调用微信接口、重复上传 OSS 及数据库重复插入/覆盖。 | 数据库 `_family_server_id` 字段添加唯一索引,代码改用原子操作(如 `INSERT ... ON DUPLICATE KEY UPDATE` 或框架 `upsert`)。 | `$this->db->set($insert)->where($where)->on_duplicate_key_update(['_qrcode' => $qrcode])->insert();` |
| 🟠 警告 | `create_qrcode()` 方法 | 阿里云 OSS 上传 `alioss_internal_addObject_by_content` 未做返回值校验或异常捕获。若上传失败,仍会拼接 URL 写入数据库,产生大量无效脏数据。 | 增加上传结果校验,失败时记录明确日志并中断流程,避免写入无效路径。 | `if (!alioss_internal_addObject_by_content($file_url, $buffer)) { do_log('OSS upload failed', 'qrcode_error'); return ''; }` |
| 🟡 建议 | 全局/类定义 | 类名 `Ahead_room_renewal_mini_qrcode_model` 使用蛇形命名,不符合 PSR-12 规范;魔法数字 `2` 硬编码;`$room_data` 数组键未做类型/存在性校验。 | 类名改为大驼峰 `AheadRoomRenewalMiniQrcodeModel`;提取业务模型常量;增加输入参数校验。 | `class AheadRoomRenewalMiniQrcodeModel extends Simple_model { const BUSINESS_MODEL_SELF_SERVICE = 2; ... }` |
| 🟡 建议 | `get_qrcode()` 方法 | 方法内部动态加载 `$this->load->model('ahead_yc_merchant_model')`,每次调用都会触发框架加载器解析,增加不必要的 I/O 开销。 | 移至构造函数中统一加载,提升执行效率。 | `public function __construct() { parent::__construct(); $this->load->model('ahead_yc_merchant_model'); }` |
| 🟡 建议 | `create_qrcode()` 方法 | 硬编码 OSS 域名 `https://vodonline.g-hi.com/` 及路径拼接逻辑,不利于多环境(测试/生产)切换;`DEBUG_VERSION` 若未严格过滤可能存在路径穿越隐患。 | 将域名与基础路径抽离至配置文件,使用框架配置函数读取。 | `$oss_domain = config_item('oss_public_domain'); $file_url = rtrim($oss_domain, '/') . '/' . $path;` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复微信接口返回值处理逻辑**:严格区分二进制流与 JSON 错误响应,移除对二进制数据的 `json_decode` 和 `var_export`,防止日志爆炸与误判。
2. **增加空值防御与上传校验**:在 `get_qrcode` 中校验 `$merchant_data` 是否存在;在 `create_qrcode` 中校验 OSS 上传结果,失败时阻断数据库写入。
3. **消除全局 `$CI` 实例化**:移除文件顶部的 `get_instance()`,遵循框架模型生命周期规范,避免隐式内存泄漏。
### 🛠 后续重构与优化方向
- **并发安全设计**:为 `ahead_room_renewal_mini_qrcode` 表的 `_family_server_id` 添加唯一索引,将 `get_one` + `insert/update` 替换为数据库层面的 `UPSERT` 操作,彻底解决竞态条件。
- **依赖注入与配置化**:将硬编码的常量、域名、业务模型阈值抽离至 `config/` 目录;考虑使用构造函数注入依赖模型,提升单元测试友好度。
- **日志规范化**:使用结构化日志(如 JSON 格式)替代 `var_export`,仅记录关键标识符与错误码,避免敏感数据或二进制内容污染日志系统。
- **输入校验层**:在 Controller 层或 Model 入口处对 `$room_data` 进行类型断言与必填字段校验(如 `_id`, `_merchant_id` 必须为整型),防止脏数据流入核心逻辑。
> 💡 **提示**:若 `phpci` 框架对模型加载、数据库操作有特定封装(如内置 `upsert` 或统一响应对象),请优先查阅官方文档替换原生 SQL/CI 写法,以保持架构一致性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1781086457
|
1781086457
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
669
|
22
|
84
|
1
|
|
0
|
0616合并
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141689
|
1781141696
|
1781141696
|
0
|
0
|
0
|
Edit
Delete
|
|
670
|
23
|
37
|
1
|
|
0
|
Merge pull request '0519' (#3) from admin Merge pull request '0519' (#3) from admin into admin-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141783
|
1781141791
|
1781141791
|
0
|
0
|
0
|
Edit
Delete
|
|
671
|
18
|
204
|
1
|
|
0
|
Merge pull request '合并0519最新' (#112) from Merge pull request '合并0519最新' (#112) from pc into pc-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141864
|
1781141874
|
1781141874
|
0
|
0
|
0
|
Edit
Delete
|
|
672
|
21
|
308
|
1
|
|
0
|
Merge pull request '260519分支分支' (#3) from Merge pull request '260519分支分支' (#3) from pay into pay-260616...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781141923
|
1781141933
|
1781141933
|
0
|
0
|
0
|
Edit
Delete
|
|
673
|
32
|
1
|
1
|
|
0
|
222
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1781158798
|
1781158798
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
674
|
21
|
309
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781763027
|
1781763036
|
1781763036
|
0
|
0
|
0
|
Edit
Delete
|
|
675
|
21
|
310
|
1
|
|
0
|
退款api
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1781763061
|
1781763086
|
1781763086
|
0
|
0
|
0
|
Edit
Delete
|
|
676
|
23
|
38
|
1
|
|
0
|
需求-续费二维码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782357069
|
1782357078
|
1782357078
|
0
|
0
|
0
|
Edit
Delete
|
|
677
|
23
|
39
|
1
|
|
0
|
需求-续费二维码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782357094
|
1784802050
|
1784802050
|
0
|
0
|
0
|
Edit
Delete
|
|
678
|
22
|
85
|
1
|
|
0
|
退款用户加手机号显示
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782697385
|
1782697392
|
1782697392
|
0
|
0
|
0
|
Edit
Delete
|
|
679
|
22
|
86
|
1
|
|
0
|
退款用户加手机号显示
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782697413
|
1782697422
|
1782697422
|
0
|
0
|
0
|
Edit
Delete
|
|
680
|
21
|
311
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782697976
|
1782697982
|
1782697982
|
0
|
0
|
0
|
Edit
Delete
|
|
681
|
21
|
312
|
1
|
|
0
|
测试
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782698000
|
1782698023
|
1782698023
|
0
|
0
|
0
|
Edit
Delete
|
|
682
|
18
|
205
|
1
|
|
0
|
需求 赠时报表 16382
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782698462
|
1782698472
|
1782698472
|
0
|
0
|
0
|
Edit
Delete
|
|
683
|
18
|
206
|
1
|
|
0
|
需求 赠时报表 16382
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782698509
|
1782698569
|
1782698569
|
0
|
0
|
0
|
Edit
Delete
|
|
684
|
21
|
313
|
1
|
|
0
|
需求 小程序,h5默认灯光 16498
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720186
|
1782720207
|
1782720207
|
0
|
0
|
0
|
Edit
Delete
|
|
685
|
21
|
314
|
1
|
|
0
|
需求 小程序,h5默认灯光 16498
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720278
|
1782720287
|
1782720287
|
0
|
0
|
0
|
Edit
Delete
|
|
686
|
22
|
87
|
1
|
|
0
|
需求 门店名称限制 16489
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782720336
|
1782720353
|
1782720353
|
0
|
0
|
0
|
Edit
Delete
|
|
687
|
21
|
315
|
1
|
|
0
|
预订开房多过滤该包厢上一单已关房的账单时间
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782973124
|
1782973131
|
1782973131
|
0
|
0
|
0
|
Edit
Delete
|
|
688
|
23
|
40
|
1
|
|
0
|
新增活动任务配置相关model
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782974732
|
1782974741
|
1782974741
|
0
|
0
|
0
|
Edit
Delete
|
|
689
|
18
|
207
|
1
|
|
0
|
需求 门店名称限制 16489
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1782976300
|
1782976308
|
1782976308
|
0
|
0
|
0
|
Edit
Delete
|
|
690
|
25
|
4
|
1
|
|
0
|
需求 时序设备api控制 16449
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783048848
|
1783048853
|
1783048853
|
0
|
0
|
0
|
Edit
Delete
|
|
693
|
23
|
41
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783990894
|
1783990913
|
1783990913
|
0
|
0
|
0
|
Edit
Delete
|
|
694
|
18
|
208
|
1
|
|
0
|
前端打包编译
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783991348
|
1783991356
|
1783991356
|
0
|
0
|
0
|
Edit
Delete
|
|
695
|
18
|
209
|
1
|
|
0
|
前端打包编译
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783991378
|
1783991391
|
1783991391
|
0
|
0
|
0
|
Edit
Delete
|
|
696
|
21
|
316
|
1
|
|
0
|
需求 暂停屏保 16512
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783991980
|
1783991987
|
1783991987
|
0
|
0
|
0
|
Edit
Delete
|
|
697
|
21
|
317
|
1
|
|
0
|
预订开房多过滤该包厢上一单已关房的账单时间
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783992006
|
1783992023
|
1783992023
|
0
|
0
|
0
|
Edit
Delete
|
|
698
|
22
|
88
|
1
|
|
0
|
订台汇总test
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696635
|
1784696641
|
1784696641
|
0
|
0
|
0
|
Edit
Delete
|
|
699
|
18
|
210
|
1
|
|
0
|
需求 灯光配置增加中控类型
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696664
|
1784696673
|
1784696673
|
0
|
0
|
0
|
Edit
Delete
|
|
700
|
23
|
42
|
1
|
|
0
|
需求 小程序设置导出 16583
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696709
|
1784696723
|
1784696723
|
0
|
0
|
0
|
Edit
Delete
|
|
701
|
21
|
318
|
1
|
|
0
|
需求 续费弹窗语音提醒 16618
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784696808
|
1784696845
|
1784696845
|
0
|
0
|
0
|
Edit
Delete
|
|
702
|
23
|
43
|
1
|
|
0
|
需求 小程序设置导出 16583
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784772728
|
1784772735
|
1784772735
|
0
|
0
|
0
|
Edit
Delete
|
|
703
|
21
|
319
|
1
|
|
0
|
需求-H5点击下载不跳转
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784772792
|
1784772800
|
1784772800
|
0
|
0
|
0
|
Edit
Delete
|
|
704
|
22
|
89
|
1
|
|
0
|
一些bug
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784801850
|
1784801855
|
1784801855
|
0
|
0
|
0
|
Edit
Delete
|
|
705
|
22
|
90
|
1
|
|
0
|
一些bug
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784801871
|
1784871268
|
1784801879
|
0
|
0
|
0
|
Edit
Delete
|
|
706
|
23
|
44
|
1
|
|
0
|
bug-V2平台调音-1的商家id不显示问题
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784802032
|
1784802046
|
1784802046
|
0
|
0
|
0
|
Edit
Delete
|
|
707
|
22
|
91
|
1
|
|
0
|
Merge pull request '一些bug' (#90) from app Merge pull request '一些bug' (#90) from app into app-260728...
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871262
|
1784871267
|
1784871267
|
0
|
0
|
0
|
Edit
Delete
|
|
708
|
21
|
320
|
1
|
|
0
|
套餐购买页“购买时长"页签根据后台设置显隐
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871323
|
1784871331
|
1784871331
|
0
|
0
|
0
|
Edit
Delete
|
|
709
|
21
|
321
|
1
|
|
0
|
套餐购买页“购买时长"页签根据后台设置显隐
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784871361
|
1784871367
|
1784871367
|
0
|
0
|
0
|
Edit
Delete
|
|
710
|
23
|
45
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784874629
|
1784874643
|
1784874643
|
0
|
0
|
0
|
Edit
Delete
|
|
711
|
23
|
46
|
1
|
|
0
|
bug-V2平台调音-1的商家id不显示问题
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784874674
|
1784874685
|
1784874685
|
0
|
0
|
0
|
Edit
Delete
|