|
432
|
22
|
46
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `2cbeb8c33 ## 自动代码审查报告
**分支**: app-260616
**提交**: `2cbeb8c33a65d65046e103dc44a6abcac4ac25c0`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 17:25:50
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:该模型文件承担了极其繁重的数据查询与报表统计职责,属于典型的“上帝类(God Class)”。代码整体呈现早期 CodeIgniter 3 风格,存在大量原生 SQL 拼接、硬编码密钥、返回值类型不一致及未清理的调试代码。核心业务逻辑(如退款、报表)缺乏安全防护与边界校验,存在较高的安全与稳定性风险。
- **风险等级**:🔴 高
- **⚠️ 局限性说明**:您提供的代码在末尾 `get_goods_sales` 方法处被截断(`$privShopIds = $this->ahead_yc_merchant_user_model->get_one(['_id' => $para`),本次审查仅基于已提供部分。若截断处包含关键权限校验或 SQL 逻辑,请补充后重新评估。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 全局多处方法 | **SQL 注入漏洞**:`$addsql` 变量被直接拼接到 SQL 字符串中(如 `where a." . $addsql . "`)。若该参数源自前端或外部接口,攻击者可轻易闭合引号执行恶意 SQL。 | 彻底废弃字符串拼接。统一使用 CI Query Builder 的数组条件传入,或在 Model 内部构建白名单过滤逻辑。 | `// ❌ 危险<br>$sql = "... WHERE a." . $addsql . " ...";`<br>`// ✅ 安全<br>$this->db->where($addsql_array);` |
| 🔴 严重 | `refund()` 方法 | **硬编码密钥与弱加密**:退款签名使用硬编码字符串 `'1441600902'` 等结合 `md5()` 生成。MD5 已不具备抗碰撞性,且密钥硬编码极易泄露,导致伪造退款请求。 | 将密钥迁移至 `config.php` 或环境变量。使用 `hash_hmac('sha256', ...)` 替代 `md5()`。 | `$secret = config_item('refund_sign_key');`<br>`$data['refund_key'] = hash_hmac('sha256', $payload, $secret);` |
| 🔴 严重 | `get_consumption_trend_data` 等多处 | **动态 IN 子句注入风险**:`_shop_id in (" . $shop_ids . ")` 直接拼接逗号分隔字符串。未做类型强转与过滤,存在注入风险且无法利用索引。 | 将字符串转为整型数组,使用 `$this->db->where_in()` 安全绑定。 | `$ids = array_map('intval', explode(',', $shop_ids));`<br>`$this->db->where_in('_shop_id', $ids);` |
| 🟠 警告 | `get_new_add_people_trend_data` | **SQL 语法错误/逻辑缺陷**:`NOT IN (select DISTINCT(_ahead_user_id))` 子查询缺失 `FROM` 表名,执行将直接报错。且 `COUNT(DISTINCT)` 在大数据量下性能极差。 | 补全子查询表名,或改用 `LEFT JOIN ... IS NULL` 优化执行计划。 | `NOT IN (SELECT _ahead_user_id FROM ahead_user WHERE 1=1)` |
| 🟠 警告 | 全局顶部 | **全局实例化反模式**:文件顶部 `$CI =& get_instance(); $CI->load->model('Simple_model');` 会在文件被 `include` 时立即执行,破坏框架生命周期,易引发内存泄漏与依赖混乱。 | 移至 `__construct()` 中,或依赖框架自动加载。 | `public function __construct() { parent::__construct(); }` |
| 🟠 警告 | 多处查询方法 | **返回值类型不一致**:部分方法返回 `json_encode()` 字符串,部分返回数组,部分返回 `false`。增加 Controller 层处理负担,易引发 `TypeError`。 | Model 层统一返回结构化数组/对象。JSON 序列化严格交由 Controller 或 API 响应层处理。 | `return ['status' => true, 'data' => $rows, 'total' => $count];` |
| 🟠 警告 | `set_select_db()` 调用 | **非标准数据库切换**:`$this->set_select_db(1/2)` 非 CI3 原生方法,疑似自定义读写分离扩展。频繁切换可能引发连接池耗尽或事务状态不一致。 | 查阅 `phpci` 官方文档确认连接池机制。若为读写分离,建议使用 `$this->load->database('read_group')` 显式指定。 | 建议封装为独立的数据源路由服务,避免在业务 Model 中硬编码切换。 |
| 🟡 建议 | 全文件 | **违反 PSR-12 与可维护性规范**:变量命名带冗余前缀(如 `$_merchant_id`)、缺乏 PHP 7+ 类型声明、大量注释掉的代码、魔法数字散落。 | 遵循 PSR-12,添加严格类型提示,清理死代码,提取业务常量。 | `public function get_order_info(int $merchantId, string $orderId = '', ...): array` |
| 🟡 建议 | `get_business` 等方法 | **重复的权限校验逻辑**:子账号门店权限校验代码在多个方法中重复出现,违反 DRY 原则。 | 提取为私有方法 `checkUserShopPermission($uid, $userType)` 或使用中间件/基类统一拦截。 | `protected function filterByUserPermission(array &$where, int $uid, int $type) { ... }` |
---
## 3. 总结与行动建议
### 🚨 优先修复的关键问题(P0/P1)
1. **立即阻断 SQL 注入路径**:全局搜索 `$addsql` 与 `" . $shop_ids . "` 的拼接点。在未完成参数化改造前,必须在入口 Controller 层对传入的 `$addsql` 进行严格的正则白名单过滤(仅允许 `字段名 = 值` 格式),或临时关闭相关报表接口。
2. **修复退款签名逻辑**:将 `refund()` 中的硬编码字符串移至 `application/config/` 或 `.env`,并将 `md5()` 升级为 `hash_hmac('sha256', ...)`。同时增加退款金额校验(如 `refund_amount <= actual_pay` 且 `refund_amount > 0`)。
3. **修正语法错误**:修复 `get_new_add_people_trend_data` 中缺失 `FROM` 的子查询,避免线上 500 错误。
### 🛠 后续重构与优化方向
1. **架构拆分(上帝类解耦)**:当前 Model 承载了订单查询、报表统计、分页计算、退款调用等 20+ 个职责。建议按业务域拆分为:
- `OrderQueryModel`(基础查询)
- `OrderReportModel`(数据魔方/报表聚合)
- `OrderRefundService`(支付退款逻辑,建议移至 Service 层而非 Model)
2. **统一数据访问层规范**:
- 废弃原生 SQL 拼接,全面拥抱 Query Builder 或 Doctrine/ORM。
- 统一返回类型:`Model` 永远返回 `array` 或 `object`,由 `Response` 类统一处理 JSON/HTTP 状态码。
3. **性能调优**:
- 报表类查询涉及大量 `GROUP BY`、`COUNT(DISTINCT)` 与 `SUM()`,建议在 `_timestamp`、`_merchant_id`、`_shop_id` 上建立复合索引。
- 对于 `get_consumption_trend_data` 等高频统计接口,强烈建议引入 Redis 缓存或定时任务预计算(ClickHouse/物化视图),避免实时全表扫描拖垮主库。
4. **框架适配确认**:代码中大量使用 `$this->set_select_db()`、`$this->setTablename()` 等非标准 CI3 方法。请核对 `phpci` 框架文档,确认这些方法是否已封装连接池复用与事务管理。若为自研扩展,建议补充单元测试覆盖。
> 💡 **专家提示**:该文件历史包袱较重(注释显示最早可追溯至 2016 年)。建议采用“绞杀者模式(Strangler Fig Pattern)”逐步替换:先为新增接口编写符合现代规范的 Service/Repository,再逐步迁移旧报表逻辑,避免一次性重写引发业务中断。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780305950
|
1780305950
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
433
|
22
|
47
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `d902d4fde ## 自动代码审查报告
**分支**: app-260616
**提交**: `d902d4fdef9704aefae650e66d50f6945216c525`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 17:28:47
---
## 1. 审查摘要
- **代码质量评分**:4/10 分
- **总体评价**:代码实现了订单查询、报表统计、退款等核心业务,但存在严重的架构与安全缺陷。大量使用字符串拼接 SQL、模型职责过重、混合原始 SQL 与 Query Builder、敏感信息硬编码。部分 SQL 语法错误将直接导致运行时崩溃,整体可维护性与安全性较低。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 全局多处 (`$addsql` 拼接) | **SQL 注入漏洞**:`$addsql` 参数直接拼接入 SQL 字符串。若该参数由前端或外部接口传入,攻击者可构造恶意条件绕过权限或拖库。 | 彻底废弃 `$addsql` 拼接模式。统一使用 CI3 Query Builder 或参数化查询 (`$this->db->query($sql, $params)`)。将动态条件转为数组传入。 | `$this->db->where($conditions)->get('ahead_yc_order');` |
| 🔴 严重 | `get_new_add_people_trend_data` | **SQL 语法错误/崩溃**:子查询 `NOT IN (select DISTINCT(_ahead_user_id))` 缺失表名,执行必报 `SQLSTATE[42000]` 错误。 | 补全子查询表名,或改用 `LEFT JOIN` + `IS NULL` 提升性能。 | `... AND _ahead_user_id NOT IN (SELECT _ahead_user_id FROM ahead_user WHERE _merchant_id = ?)` |
| 🔴 严重 | `refund()` | **超额退款/资损风险**:未校验 `$refund_amount` 是否合法(如负数、大于实付金额 `_actual_pay`),直接调用支付网关退款。 | 增加金额边界校验,确保退款金额在合理区间内,并记录操作日志。 | `if ($refund_amount <= 0 || $refund_amount > $order_info['_actual_pay']) { return ['status'=>false, 'msg'=>'退款金额无效']; }` |
| 🟠 警告 | `get_consumption_trend_data` 等 | **模型层越权序列化**:在 Model 中直接调用 `json_encode()` 返回数据,破坏 MVC 分层,导致 Controller 无法二次处理或统一格式化。 | Model 仅返回原生数组/对象。序列化、格式化逻辑移至 Controller 或 Service 层。 | 移除 `json_encode()`,直接 `return $this->db->query(...)->result_array();` |
| 🟠 警告 | 类属性 `$encrypt` | **敏感信息硬编码**:加密串 `"Vs!Fs7VT"` 直接暴露在类属性中,违反安全基线,易随代码库泄露。 | 移至 `application/config/config.php` 或环境变量,通过 `$this->config->item()` 读取。 | `protected $encrypt_key; public function __construct() { parent::__construct(); $this->encrypt_key = $this->config->item('order_encrypt_key'); }` |
| 🟠 警告 | `cjy_get_other_order_info` | **不安全的转义处理**:使用 `addslashes()` 防御注入已过时且不可靠,且正则校验后仍手动拼接 SQL。 | 使用 CI3 内置的 `$this->db->like()` 或参数绑定,移除 `addslashes()`。 | `$this->db->like('_id', $_order_id, 'after');` |
| 🟠 警告 | `get_order_manage_by_page` | **强制索引滥用**:硬编码 `force index(_merchant_id)` 可能在数据分布变化后导致查询计划劣化,且未处理索引不存在的情况。 | 移除硬编码 `force index`,依赖数据库优化器。通过 `EXPLAIN` 验证实际执行计划,必要时在 DBA 层面优化复合索引。 | 删除 `force index` 片段,确保 `_merchant_id, _timestamp` 已建立联合索引。 |
| 🟡 建议 | 全局 | **违反 PSR-12 与单一职责**:命名混乱(`$_merchant_id` vs `$merchantId`),模型承担查询、报表、退款、分页等多重职责,文件过长。 | 拆分模型(如 `OrderQueryModel`, `OrderReportModel`, `RefundService`),统一使用 `camelCase`,移除 `// echo $this->db->last_query();` 等调试注释。 | 提取公共分页逻辑至 `BaseModel`,统一参数命名规范。 |
| 🟡 建议 | 文件头部 | **冗余的实例化调用**:`$CI =& get_instance(); $CI->load->model('Simple_model');` 在 CI 模型中无需手动加载,且父类应在 `extends` 时自动解析。 | 移除头部冗余代码,依赖框架自动加载机制。 | 直接 `class Ahead_yc_order_model extends Simple_model { ... }` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **阻断 SQL 注入路径**:立即审查所有传入 `$addsql` 的调用链,确保其来源绝对可信。短期内可使用 `$this->db->escape_str()` 过滤,中长期必须重构为 Query Builder 或预处理参数数组。
2. **修复致命 SQL 语法错误**:修正 `get_new_add_people_trend_data` 中缺失表名的子查询,避免线上 500 错误。
3. **增加退款金额校验**:在 `refund()` 方法入口增加 `0 < $refund_amount <= _actual_pay` 校验,防止资损。
### 🛠 后续重构与优化方向
1. **架构分层与职责拆分**:当前模型严重违反单一职责原则(SRP)。建议按业务域拆分为:
- `OrderRepository`:负责基础 CRUD 与复杂查询
- `OrderReportService`:负责数据魔方、营收统计等聚合逻辑
- `RefundService`:封装退款网关调用、状态机与日志记录
2. **统一数据访问层 (DAL)**:全面迁移至 CI3 Query Builder。避免原始 SQL 与 Builder 混用,提升可读性与可维护性。对于极复杂的报表 SQL,建议移至数据库视图 (View) 或存储过程,并在 PHP 层仅做参数绑定。
3. **性能优化策略**:
- 移除 Model 层的 `json_encode()`,减少内存开销。
- 针对高频查询(如 `_merchant_id`, `_shop_id`, `_timestamp`)建立复合索引。
- 对统计类接口引入 Redis 缓存(如 `Cache::remember()`),设置合理的 TTL。
4. **规范与安全基线**:
- 严格遵循 PSR-12,统一变量命名、方法命名与注释规范。
- 敏感配置(加密串、支付密钥、DB 切换标识)全部外置至 `config/` 或 `.env`。
- 清理所有 `// echo $this->db->last_query();` 及历史注释。
> 📌 **注**:您提供的代码在末尾处被截断(`$this->ahead_yc_merchant_user_model->get_one(['_id' => $para`),本次审查基于已提供内容。若需完整评估,请补充完整代码。此外,代码语法特征高度符合 **CodeIgniter 3** 规范,若实际运行环境为其他框架(如 phpci/Laravel),请同步调整数据库组件调用方式。建议查阅对应框架官方文档中的 `Query Builder` 与 `Security` 章节进行适配。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780306127
|
1780306127
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
434
|
21
|
151
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `458a39729 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `458a3972979ee6f5c5f24a92d7fa12a2688dc780`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 17:32:08
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该 Model 承载了订单查询、详情组装、账单计算、状态流转等核心业务,功能覆盖全面。但存在明显的架构设计问题:方法职责过重(如 `get_bill_goods_info` 超 300 行)、循环内重复加载模型、硬编码魔法数字泛滥、缺乏事务控制与安全签名机制。代码整体可维护性较低,存在数据不一致与潜在注入风险。
- **风险等级**:🔴 高
- **⚠️ 局限性说明**:代码在 `get_timing_order()` 方法末尾被截断(`return ['success' => false, 'msg' => '订单`),无法对该方法及后续逻辑进行完整评估。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_detail()` ~L150 | **变量赋值错误/数据丢失**:`$order_data['before_payment']` 赋值给了未定义的 `$order_data` 数组,且未合并至最终返回的 `$data['order_info']` 中,导致转房前金额无法展示。 | 修正目标数组为 `$order_info`,并确保在返回前正确赋值。 | `$order_info['before_payment'] = $before_order_info_data['_actual_pay'] ?? '';` |
| 🔴 严重 | `get_bill_goods_info()` ~L200 | **SQL 注入隐患**:使用字符串拼接构建 `$sql` 条件(`'_unique_key="' . $unique_key . '"...'`),若底层 `select()` 未做严格转义,将直接暴露注入风险。 | 废弃字符串拼接,改用框架查询构建器或参数化数组条件。 | `$where['_unique_key'] = $unique_key; $where['_timestamp >'] = time() - 7 * 86400;` |
| 🟠 警告 | `confirm_receipt()` ~L250 | **缺乏事务控制**:连续插入状态 `7` 和 `8` 两条流程记录。若第二条插入失败,第一条已落库,导致订单状态不一致。 | 使用数据库事务包裹连续写入操作,失败时自动回滚。 | `$this->db->trans_start(); /* 两次 insert */ $this->db->trans_complete();` |
| 🟠 警告 | `get_list()` / `get_detail()` 多处 | **循环内加载模型**:在 `foreach` 中频繁调用 `$this->load->model()`,CI 框架会重复解析与实例化,造成严重性能损耗。 | 将模型加载统一移至方法开头或类的 `__construct()` 中。 | `$this->load->model(['ahead_room_package_model', 'ahead_wares_package_model']);` |
| 🟠 警告 | 类属性 `$encrypt` | **硬编码敏感密钥**:`public $encrypt = "Vs!Fs7VT";` 直接暴露在源码中,易随版本库泄露,违反安全基线。 | 移至配置文件或环境变量,通过配置项读取。 | `protected $encrypt; public function __construct(){ $this->encrypt = config_item('order_sign_key'); }` |
| 🟠 警告 | `encode_group_buying_order()` | **弱签名算法**:使用 `md5()` 进行订单签名验证,易受彩虹表与碰撞攻击,不符合现代安全规范。 | 改用 `hash_hmac` 或框架内置加密组件,并使用 `hash_equals` 防时序攻击。 | `return hash_equals(hash_hmac('sha256', $order_id, $this->encrypt), $sign);` |
| 🟡 建议 | 全局/多处 | **魔法数字泛滥**:大量使用 `1, 2, 9, 10` 等硬编码数字判断业务类型,虽已定义常量但未统一替换,可读性差。 | 全面替换为已定义的 `self::CONST_NAME`,提升语义化与后期维护效率。 | `if ($order_info['pay_platform'] == self::ORDER_EXCHANGE_PAYPLATFORM)` |
| 🟡 建议 | `get_bill_goods_info()` | **严重违反单一职责原则**:超 300 行,混合了数据查询、金额聚合、商品合并、格式化展示等逻辑,难以测试与扩展。 | 拆分为独立私有方法(如 `calculateBillTotals()`, `mergeGoodsList()`, `formatGoodsDisplay()`)。 | 主方法仅负责流程编排,具体计算逻辑下沉至独立方法。 |
| 🟡 建议 | `binding_order_check()` | **隐式依赖未定义属性**:直接使用 `$this->uid` 但未在类中声明或初始化,依赖外部隐式上下文,易引发 `Undefined property` 警告。 | 明确通过参数传入 `$uid`,或从 Session/父类安全获取。 | `public function binding_order_check($order_id, $sign, $uid = null)` |
| 🟡 建议 | 类定义顶部 | **破坏封装的实例化**:`$CI = &get_instance();` 放在类外部,违反面向对象设计原则,且 CI 推荐在类内部按需获取。 | 移除顶部全局代码,在需要时使用 `$this->ci =& get_instance();` 或依赖注入。 | 删除顶部 `$CI = &get_instance();` 及 `$CI->load->model()` 调用。 |
| 🟡 建议 | 常量定义区 | **拼写错误与命名不一致**:`ORDRE_WARES_TPE` 拼写错误;`ORDER_CASH_PAYPLATFORM` 缺少下划线分隔;部分使用 `array()` 部分使用 `[]`。 | 修正拼写,统一使用 `[]` 语法,遵循 PSR-12 常量命名规范。 | `const ORDER_WARES_TYPE = 2;` |
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **修复数据丢失 Bug**:立即修正 `get_detail()` 中 `$order_data` 误赋值问题,确保转房前金额正确返回。
2. **消除 SQL 拼接风险**:将 `get_bill_goods_info()` 中的 `$sql` 字符串替换为框架安全的数组条件或 Query Builder 链式调用。
3. **引入事务机制**:为 `confirm_receipt()` 及涉及多表写入的操作添加 `trans_start()/trans_complete()` 事务控制,保障数据一致性。
4. **密钥与签名升级**:将 `$encrypt` 移至配置中心,并将 `md5` 签名升级为 `HMAC-SHA256`,防止伪造订单请求。
### 🛠 后续重构与优化方向
1. **拆分巨型方法**:`get_bill_goods_info()` 建议按职责拆分为:
- `fetchBillOrders()`:负责查询与过滤
- `aggregateBillAmounts()`:负责金额计算与汇总
- `mergeAndFormatGoods()`:负责商品去重、合并与展示格式化
2. **统一常量与魔法值治理**:建立全局订单状态/支付类型枚举类(或集中常量文件),全面替换硬编码数字。修复 `ORDRE_WARES_TPE` 等拼写错误。
3. **模型加载优化**:遵循 CI 规范,将频繁使用的关联 Model 在 `__construct()` 中预加载,或使用自动加载配置,杜绝循环内 `load->model()`。
4. **框架适配说明**:注:根据目录结构(`system/helpers/`, `application/models/`)及语法特征(`$this->load->model()`, `get_instance()`),该代码高度符合 **CodeIgniter 3.x** 规范。若 `phpci` 为内部定制框架,请确保 `Simple_model` 的 `select()`/`get_one()` 底层已实现参数化查询,否则上述 SQL 注入风险需由框架层兜底。建议查阅 `phpci` 官方文档确认查询构建器的安全实现方式。
> 💡 **审查提示**:代码整体业务逻辑复杂度高,建议在重构前补充单元测试(尤其是账单计算与状态流转逻辑),并引入静态分析工具(如 PHPStan / Psalm)进行类型与边界条件校验。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780306328
|
1780306328
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
435
|
22
|
48
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `13307d5ff ## 自动代码审查报告
**分支**: app-260616
**提交**: `13307d5ffe87f702f2bada4dc34c0d48716ff419`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 17:34:22
---
## 1. 审查摘要
- **代码质量评分**:4 / 10 分
- **总体评价**:代码整体具备基础的业务实现能力,但存在严重的架构缺陷与安全隐患。模型层大量使用字符串拼接 SQL、类外部直接执行加载逻辑、控制器直接操作超全局变量,严重违背 MVC 分层原则与 CI 框架最佳实践。部分 SQL 语法存在明显错误,且输出缓冲与 JSON 响应处理不规范,易引发运行时异常。
- **风险等级**:🔴 高(存在 SQL 注入、硬编码密钥、未定义函数调用及语法错误)
> 📌 **框架说明**:根据目录结构(`system/`、`CI_Controller`、`$this->load->` 等)判定为 **CodeIgniter 3.x** 架构。若 `phpci` 为内部定制框架,请对照其官方文档调整组件调用方式,以下建议基于 CI3 标准规范。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_yc_order_model.php` 全局/多处 | `$addsql` 参数直接拼接至 SQL 字符串中,未做参数化或白名单过滤,存在 **高危 SQL 注入漏洞**。 | 废弃 `$addsql` 拼接模式,全面改用 CI Query Builder 或 `$this->db->query($sql, $binds)` 参数化查询。 | `$this->db->where($conditions)->get('ahead_yc_order')->result_array();` |
| 🔴 严重 | `Ahead_yc_order_model.php` 文件顶部 (L3-L5) | 在类外部执行 `$CI =& get_instance();` 及加载模型。PHP 每次 `include` 该文件都会执行,导致状态污染、重复加载或致命错误。 | 移除全局代码,将依赖加载移至 `__construct()` 或通过 CI `autoload.php` 配置。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🔴 严重 | `Ahead_yc_order_model.php` ~L238 | `get_new_add_people_trend_data` 子查询语法错误:`NOT IN (select DISTINCT(_ahead_user_id))` 缺少 `FROM` 表名,执行必报 SQL 语法错误。 | 补全子查询表名,并明确业务逻辑(如对比历史用户表)。 | `NOT IN (SELECT _ahead_user_id FROM ahead_user WHERE _status=1)` |
| 🟠 警告 | `Api.php` L28-L32 | `jsonEcho` 滥用输出缓冲 (`ob_end_clean`, `ob_start`, `flush`)。若无活跃缓冲会触发 Notice,且 `flush()` 在 CLI/部分 SAPI 下无效,易导致 Headers 冲突。 | 移除缓冲操作,直接设置响应头并输出 JSON,保持控制器职责单一。 | `header('Content-Type: application/json; charset=utf-8'); echo json_encode($result, JSON_UNESCAPED_UNICODE); exit;` |
| 🟠 警告 | `Api.php` L15-L16 | 直接读取 `$_POST` 与 `php://input`,绕过 CI `Input` 类的全局 XSS 过滤与路由安全机制。 | 使用 CI 提供的 `$this->input->raw_input_stream` 或 `$this->input->post()`。 | `$raw = $this->input->raw_input_stream; $this->params = json_decode($raw, true) ?: [];` |
| 🟠 警告 | `Ahead_yc_order_model.php` L30 | 硬编码加密串 `$encrypt = "Vs!Fs7VT";`,违反安全规范,源码泄露即导致密钥暴露。 | 移至 `config/config.php` 或 `.env` 环境变量中,通过 `$this->config->item()` 读取。 | `protected $encrypt_key; public function __construct() { $this->encrypt_key = $this->config->item('encryption_key'); }` |
| 🟠 警告 | `Api.php` L63 | `throwError('参数异常')` 为未定义函数,非 CI 标准方法,若未全局声明将触发 Fatal Error。 | 改用控制器内置的 `$this->error_response()` 或 CI 的 `show_error()`。 | `if (empty($_GET['state']) || empty($_GET['code'])) { $this->error_response('参数异常'); }` |
| 🟡 建议 | `Ahead_yc_order_model.php` 多处 | 模型层直接调用 `json_encode()` 返回数据,违反 MVC 分层原则,降低模型复用性。 | 模型仅返回数组/对象,由 Controller 统一负责序列化与响应格式化。 | `return $result['data'];` (在 Controller 中 `echo json_encode(...)`) |
| 🟡 建议 | `Ahead_yc_order_model.php` L267 | `force index(_merchant_id)` 通过 `strpos` 硬编码触发,缺乏索引评估依据,可能导致查询计划退化。 | 移除硬编码 `FORCE INDEX`,通过 `EXPLAIN` 分析实际执行计划,依赖数据库优化器或添加复合索引。 | 建议添加索引:`ALTER TABLE ahead_yc_order ADD INDEX idx_merchant_shop_time (_merchant_id, _shop_id, _timestamp);` |
| 🟡 建议 | `Api.php` & Model 多处 | 命名风格不统一(如 `getBillDetail` 驼峰 vs CI 常用下划线),注释含冗余/过期信息(如 `caiwl`、`20161013修改`)。 | 遵循 PSR-12 与 CI 规范统一方法命名,清理无效注释,补充 PHPDoc 类型声明。 | `public function get_bill_detail(): void` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **彻底修复 SQL 注入风险**:全局排查 `$addsql` 拼接逻辑,替换为 CI Query Builder (`$this->db->where()`, `$this->db->select()`) 或严格参数化查询。
2. **移除模型顶层执行代码**:将 `get_instance()` 和 `load->model()` 移入 `__construct()`,避免文件包含时的副作用。
3. **修复语法错误**:修正 `get_new_add_people_trend_data` 中缺失 `FROM` 的子查询,确保 SQL 可执行。
4. **规范输入输出**:替换 `$_POST/$_GET` 为 `$this->input->`,移除 `ob_*` 缓冲操作,统一使用 `$this->error_response()` 处理异常。
### 🛠 后续重构方向
1. **架构分层优化**:
- **Model**:仅负责数据查询与组装,禁止 `json_encode`、`exit`、`redirect` 等表现层逻辑。
- **Controller**:负责参数校验、调用 Model、格式化响应。建议引入 `Form_validation` 或自定义 DTO 进行入参校验。
- **Service/Repository**:当前 Model 过于臃肿(超 500 行),建议按业务域拆分(如 `OrderQueryService`, `ReportService`),提升可测试性。
2. **性能与数据库优化**:
- 移除硬编码 `FORCE INDEX`,通过慢查询日志定位瓶颈,合理设计复合索引。
- 分页逻辑高度重复,建议封装为 `BaseModel::paginate($builder, $page, $limit)` 或集成 CI `Pagination` 库。
- 避免在循环或高频查询中重复调用 `strtotime()`,可在入口处统一转换为时间戳。
3. **安全与规范落地**:
- 敏感配置(加密串、支付密钥)全部迁移至环境变量或加密配置文件。
- 启用 CI 的 `csrf_protection`(若为 Web 端)或实现 API Token 鉴权机制。
- 统一代码风格:使用 `php-cs-fixer` 或 `PHP_CodeSniffer` 强制对齐 PSR-12,清理历史注释。
> 💡 **提示**:若需进一步审查 `Simple_model` 基类实现、数据库索引结构或支付回调逻辑,请提供对应文件。当前审查基于已提交片段,部分业务上下文可能存在未暴露的依赖。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780306462
|
1780306462
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
436
|
22
|
49
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `2862c341e ## 自动代码审查报告
**分支**: app-260616
**提交**: `2862c341e1b1477c2b8b263a94dce3580c17cfc2`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 17:34:41
---
## 1. 审查摘要
- **代码质量评分**:`待评估` (0-10 分)
- **总体评价**:当前输入仅提供了项目目录结构,**未包含具体的变更代码内容**。该目录结构高度符合传统 CodeIgniter 3 架构特征。受限于缺失实际代码,暂无法执行逻辑、安全、性能及规范维度的深度审查。
- **风险等级**:`未知` (需补充代码后判定)
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 全局/未提供 | **缺失变更代码**:未提供 `## 变更文件内容` 的具体实现,无法进行实质性审查。 | 请补充具体的代码变更片段(推荐使用 Git Diff 格式,或明确标注 `文件路径:行号` 及完整上下文)。 | 无 |
| 🟠 警告 | `system/` 目录下任意文件 | **直接修改框架核心文件**:若变更直接修改了 `system/helpers/` 或 `system/libraries/` 等核心文件,将导致框架升级冲突、全局副作用及难以追踪的 Bug。 | 采用框架扩展机制:通过 `application/core/` 或 `app/` 目录创建前缀类(如 `MY_`),或使用 Hooks/Events 拦截,避免覆盖源码。 | `class MY_Email extends CI_Email { public function __construct() { parent::__construct(); } }` |
| 🟡 建议 | `system/database/` & `system/helpers/` | **编码规范与现代化适配**:目录结构呈现传统 PHP 风格(无命名空间、下划线命名)。若为现代项目,建议逐步对齐 PSR-12 与 PSR-4。 | 新增代码请严格遵循 PSR-12;若为遗留系统维护,请保持内部命名一致性,避免新旧规范混用导致可读性下降。 | 无 |
## 3. 总结与行动建议
- **优先修复的关键问题**:
1. **补充代码上下文**:请提供具体的变更文件内容(Diff 或完整代码块),以便我按照逻辑、安全、性能、规范、框架适配五个维度输出精准审查。
2. **规避核心目录修改**:若您的变更涉及 `system/` 目录,请立即评估是否可通过继承、钩子或配置覆盖实现,以保障系统可维护性。
- **后续重构或优化方向**:
- **安全基线**:针对数据库操作,确保全面使用查询构建器(Query Builder)或 PDO 预处理语句;针对用户输入输出,严格使用 `htmlspecialchars()` 或框架内置的 XSS 过滤;敏感操作需校验 CSRF Token 与权限中间件。
- **性能优化**:重点排查循环内的数据库查询(N+1 问题)、大数组/对象的内存泄漏、未合理使用的缓存驱动(Redis/Memcached),以及重复的 I/O 操作。
- **框架适配说明**:您提及的 `phpci` 框架在公开生态中较少见,当前目录结构与 **CodeIgniter 3** 完全一致。若确为 CI3,请确保遵循其生命周期规范(如构造函数中加载资源、使用 `$this->load->`、正确调用 `$this->db->` 等);若为自研/定制框架,请补充其核心加载机制、路由规则与生命周期钩子说明,以便我进行更精准的架构级审查。
- **下一步**:请粘贴具体的代码变更内容,我将立即基于上述维度输出完整的深度审查报告与可直接落地的优化代码。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780306481
|
1780306481
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
437
|
21
|
152
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 切换支付方式时更新页面优惠券列表
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `f32131c65 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `f32131c65de891d3fc755a6e9511b716d7eec12d`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 18:07:49
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了较为完整的小程序首页、包厢预订、订单支付等核心业务链路,但存在明显的架构耦合、安全漏洞与逻辑隐患。大量硬编码、全局实例属性污染、未严格校验的输入参数以及原始 SQL 拼接降低了系统的可维护性与安全性。整体处于“能跑但脆弱”的状态,亟需安全加固与规范化重构。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_yc_order_model.php`<br>`get_bill_goods_info` 方法内 | **SQL 注入漏洞**:使用字符串拼接构造查询条件 `$sql = '_unique_key="' . $unique_key . '" ...'`,若 `$unique_key` 未严格过滤,将导致数据库被恶意查询或篡改。 | 废弃手动拼接 SQL,全面改用 CI Query Builder 或预处理语句。 | `$this->db->where('_unique_key', $unique_key)->where_in('_status', [1,4])->get($this->table_name)->result_array();` |
| 🔴 严重 | `Index.php`<br>`getRoomInfo` 方法 | **逻辑分支未终止**:`if (empty($open_room_log))` 块内调用 `$this->success_response()` 后未 `return` 或 `exit`。若响应函数未中断脚本,后续代码将尝试访问空数组键值导致 `Fatal Error`。 | 在条件分支末尾显式添加 `return;`,确保控制流正确终止。 | `if (empty($open_room_log)) { ... $this->success_response(); return; }` |
| 🔴 严重 | `Index.php`<br>`__construct` 方法 | **横向越权风险 (IDOR)**:直接信任客户端传入的 `$this->param['spe_merchant_id']` 并赋值给核心业务变量,未校验当前用户是否有权访问该商家数据。 | 增加权限校验中间件或模型层校验,确保 `spe_merchant_id` 与当前登录用户/会话绑定。 | `if (!$this->auth->check_merchant_access($this->spe_merchant_id)) { throwError('无权访问该商家'); }` |
| 🟠 警告 | `Index.php`<br>`getConfig` 方法 | **重复加载模型**:构造函数已加载 `ahead_merchant_wx_min_set_model`,方法内再次 `$this->load->model()` 造成冗余调用(虽 CI 会缓存,但违背规范)。 | 移除方法内的重复加载,直接使用构造函数已加载的实例。 | 删除 `$this->load->model('Ahead_merchant_wx_min_set_model');` |
| 🟠 警告 | `Ahead_billiards_model.php`<br>`check_room` 方法 | **全局实例属性污染**:直接修改 `$CI->merchant_id`、`$CI->operational_scene` 等全局属性,破坏封装性,易引发并发请求下的状态串扰。 | 将状态数据封装至 Model 自身属性或通过方法参数/返回值传递,避免污染 CI 超全局实例。 | `private $merchant_id; private $operational_scene; // 使用 $this->merchant_id 替代 $CI->xxx` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php`<br>多处静态属性 | **静态缓存生命周期风险**:大量使用 `self::$book_days_info`、`self::$shop_data` 等静态变量缓存数据。在 PHP-FPM 长连接或 CLI 模式下可能导致跨请求脏数据,且难以清理。 | 改用 CI 内置缓存组件 `$this->cache->save()` 或实例属性,并在请求结束时重置。 | `if (empty($this->cache->get('book_days_'.$merchant_id))) { ... $this->cache->save(...); }` |
| 🟡 建议 | 全局多处 | **魔法数字/硬编码泛滥**:大量使用 `'-1'`、`'1'`、`'2'`、`33424` 等字面量,业务含义不透明,后期维护成本极高。 | 提取为类常量或独立配置类,统一命名管理。 | `class OrderStatus { const PENDING = -1; const PAID = 1; }` |
| 🟡 建议 | `Index.php` / `Ahead_billiards_model.php` | **命名规范不一致**:方法名混用驼峰 (`getRoomInfo`)、下划线 (`get_room_info`) 及自定义前缀 (`public_getIndex`),不符合 PSR-12。 | 统一采用驼峰命名法,路由前缀建议通过路由配置文件处理,而非硬编码在方法名中。 | `public function getIndex()`, `public function getRoomInfo()` |
| 🟡 建议 | 全局 | **框架适配说明**:代码特征(`get_instance()`, `$this->load->model()`, `BASEPATH`)高度符合 **CodeIgniter 3** 架构。若 `phpci` 为内部定制框架或笔误,请确认其生命周期与 CI3 是否一致。 | 建议查阅 `phpci` 官方文档确认模型加载、路由解析及请求生命周期差异,必要时适配对应框架的依赖注入容器。 | 无 |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入**:替换 `Ahead_yc_order_model.php` 中所有手动拼接的 `$sql` 字符串,全面启用 CI Query Builder (`$this->db->where()`, `$this->db->select()`) 或 PDO 预处理。
2. **阻断逻辑穿透**:在 `Index.php::getRoomInfo` 的空结果判断块末尾补充 `return;`,防止空指针异常。
3. **实施商家权限校验**:在控制器层或中间件层增加 `spe_merchant_id` 的归属权校验,严禁直接信任前端传入的商户标识。
### 🛠 后续重构与优化方向
1. **解耦全局状态**:将 `Ahead_billiards_model` 中对 `$CI` 实例属性的直接读写改为依赖注入或方法参数传递。Model 应保持无状态或仅维护自身实例属性,提升单元测试可行性。
2. **统一配置与常量管理**:建立 `config/constants.php` 或独立 `Enum` 类,集中管理订单状态、支付场景、运营场景等魔法值。例如:`const SCENE_KTV = '1'; const SCENE_BILLIARDS = '2';`。
3. **规范模型加载与缓存策略**:
- 将频繁使用的 Model 移至控制器 `__construct` 中加载。
- 替换 `self::$` 静态缓存为 CI 原生缓存驱动(Redis/Memcached/File),并设置合理的 TTL,避免内存泄漏或脏读。
4. **强化输入验证层**:在控制器入口统一使用 CI 的 `form_validation` 或自定义 `RequestValidator` 对 `$this->param` 进行类型转换、范围校验与 XSS 过滤,避免业务代码中散落 `intval()`、`empty()` 判断。
5. **框架适配确认**:若项目确为 `phpci` 框架,请核对其是否兼容 CI3 的 `load` 机制。若为自研框架,建议逐步迁移至现代 PHP 架构(如 PSR-4 自动加载、依赖注入容器、中间件管道),以提升长期可维护性。
> 💡 **提示**:本次审查基于提供的代码片段。若涉及核心支付、用户鉴权或高并发预订场景,建议补充单元测试覆盖率,并引入静态分析工具(如 PHPStan / Psalm)进行自动化质量门禁。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780308469
|
1780308469
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
438
|
21
|
153
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `a4715b3e4 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `a4715b3e4dca441726b9b4a85548ee4e09643643`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 18:39:34
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码整体实现了核心业务流转,但存在明显的**测试代码与生产逻辑混杂**、**参数处理不规范**、**事务与响应机制偏离框架最佳实践**等问题。部分方法直接暴露敏感测试接口,且缺乏统一的安全校验与性能优化设计,技术债务较重。
- **风险等级**:🔴 高(存在硬编码凭证、未过滤的输入源、事务状态不一致风险及潜在的性能瓶颈)
> 📌 **框架说明**:提交代码的语法特征(`BASEPATH`、`get_instance()`、`$this->load->model()`、`$this->db->trans_begin()` 等)高度符合 **CodeIgniter 3** 架构规范。本次审查将基于 CI3 最佳实践进行,若 `phpci` 为内部定制分支,请结合其官方文档微调适配建议。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `TestHlj.php` 多处 | 生产控制器中混入大量调试接口(如 `niubilityTest`、`jhGiftTest`、`pushTest`),且硬编码敏感数据(`uid=66`、完整团购券 JSON、固定商户 ID)。若误部署将导致越权测试、数据污染或凭证泄露。 | 1. 将测试代码剥离至独立 `DebugController` 或 CLI 脚本,并强制添加 IP 白名单/Token 鉴权。<br>2. 移除所有硬编码业务值,改为从配置或动态请求中获取。 | `// 移除或添加鉴权中间件<br>if (!in_array($_SERVER['REMOTE_ADDR'], ['127.0.0.1'])) exit('Forbidden');` |
| 🔴 严重 | `TestHlj.php` / `Book.php` | 直接使用 `$_GET`、`$_REQUEST` 获取参数并透传至 Model,缺乏类型校验与安全过滤。虽 CI3 Query Builder 会转义,但逻辑层未做边界检查,易引发越权或异常崩溃。 | 在基类或方法入口处统一进行参数清洗与类型强转,关键 ID 使用 `intval()`,字符串使用 `trim()`,必要时引入 `form_validation`。 | `$order_id = isset($_GET['order_id']) ? intval($_GET['order_id']) : 0;` |
| 🔴 严重 | `Ahead_family_servers_model.php` `activation_data()` | 混用 `trans_begin()` 与 `try-catch` 手动回滚/提交,未使用 CI3 推荐的 `trans_start()`/`trans_complete()` 自动事务管理机制,异常分支易导致事务悬挂或连接池泄漏。 | 统一改用 CI3 标准事务写法,利用 `trans_complete()` 自动判断执行状态。 | `$this->db->trans_start();<br>try { /* 业务逻辑 */ } catch(\Exception $e) { $this->db->trans_rollback(); throw $e; }<br>$this->db->trans_complete();` |
| 🟠 警告 | `TestHlj.php` `jsonEcho()` | 使用 `ob_end_clean(); ob_start(); ... ob_end_flush(); flush(); die();` 强制控制输出缓冲,破坏框架生命周期,且 `flush()` 在部分 SAPI(如 PHP-FPM)下无效,易引发 Headers 冲突。 | 使用 CI3 标准输出组件,移除冗余缓冲操作,交由框架统一处理响应头。 | `$this->output->set_content_type('application/json')<br> ->set_output(json_encode($result, JSON_UNESCAPED_UNICODE))<br> ->_display(); exit;` |
| 🟠 警告 | `Ahead_family_servers_model.php` `get_community_shop_room_show_list()` | `foreach` 循环内频繁调用模型方法(如 `get_now_price`、`get_shop_setting`、`get_package_list_in_time`),极易引发 **N+1 查询** 与 Redis 重复连接,导致高并发下响应超时。 | 提前批量查询所需数据(价格、配置、套餐),在循环外构建 `[$room_id => $data]` 映射数组,循环内仅做数据组装。 | `// 循环外批量获取<br>$prices = $this->ahead_room_timing_model->get_batch_price($all_room_id_arr, $date);<br>foreach ($room_data as &$v) { $v['price'] = $prices[$v['room_id']] ?? 0; }` |
| 🟠 警告 | `TestHlj.php` / `Book.php` | 参数属性命名不一致(`$this->params` vs `$this->param`),且未声明属性直接赋值,在严格模式下会触发 `Undefined property` 警告,增加维护成本。 | 在父类控制器中统一定义并初始化参数容器,子类仅做读取或覆盖。 | `// BaseController.php<br>protected $param = [];<br>public function __construct() { $this->param = $this->input->get_post(); }` |
| 🟡 建议 | 全局多处 | 大量使用魔法数字与字符串(如 `66`、`2333`、`'1'`、`'2'`、`'xxxx'`),业务语义不清晰,后续修改易遗漏。 | 提取为类常量或独立配置文件(如 `config/booking_constants.php`),使用枚举或语义化命名。 | `const STATUS_SUCCESS = 0;<br>const STATUS_ERROR = 2333;<br>const DEFAULT_UID = 66;` |
| 🟡 建议 | `TestHlj.php` `updateShopShiftTurnoverCount()` | 使用 JS `window.location.href` 实现服务端循环批处理,强依赖客户端环境,易被拦截或中断,且无法记录服务端执行日志。 | 改为异步任务队列(如 Redis Queue + Supervisor/Cron)或 CLI 脚本执行长耗时批处理。 | `// CLI: php index.php cli batch update_shift_turnover --merchant_id=1` |
> ⚠️ **局限性说明**:`Ahead_family_servers_model.php` 代码在末尾被截断,未能完整审查 `get_community_shop_room_show_list()` 后续逻辑及类尾部结构。若存在未闭合的 `foreach` 或事务块,请补充完整代码以便二次评估。
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **清理测试与调试代码**:立即将 `TestHlj.php` 中的 `niubilityTest`、`jhGiftTest`、`pushTest`、`unsetSessionTest` 等接口移出生产环境,或添加严格的 IP/Token 鉴权中间件。
2. **统一参数校验机制**:禁止直接透传 `$_GET`/`$_REQUEST`。建议在基类控制器中封装 `validateParams()` 方法,对 `merchant_id`、`shop_id`、`order_id` 等关键参数进行类型强转与范围校验。
3. **修复事务处理规范**:将 `activation_data()` 及其他涉及多表写入的方法统一改为 `$this->db->trans_start()` + `$this->db->trans_complete()` 模式,避免手动 `trans_begin/commit/rollback` 导致的状态不一致。
### 🛠 后续重构方向
1. **响应层标准化**:废弃 `jsonEcho()` 中的 `ob_*` 操作,统一使用基类提供的 `success_response()` / `error_response()` 返回数组,由框架自动序列化并设置 `Content-Type`。
2. **性能优化(N+1 治理)**:针对 `get_community_shop_room_show_list()` 等列表接口,采用 `WHERE IN` 批量查询替代循环内单条查询。对高频读取的配置项(如门店设置、包厢状态)引入 Redis 缓存,设置合理 TTL。
3. **常量与配置抽离**:建立 `config/constants.php` 或 `config/booking.php`,集中管理业务状态码、场景标识(KTV/台球/棋牌)、默认值等。消除魔法数字,提升代码可读性与可维护性。
4. **安全加固**:
- 对涉及金额、订单状态变更的接口增加 **幂等性校验**(如基于 `order_id` + `token` 的 Redis 锁)。
- 敏感操作(如退款、开房、关房)记录操作日志,并校验当前用户权限与订单归属关系,防止水平越权。
如需针对特定方法(如 `activation_data` 事务重构或 `get_community_shop_room_show_list` 批量查询优化)提供完整可替换代码片段,可提供完整文件内容,我将为您输出精准的重构方案。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780310374
|
1780310374
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
439
|
21
|
154
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `1548e48b4 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `1548e48b428bbaff5484712a4c296b313bf4c25b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 18:43:20
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:代码整体呈现“测试调试接口与生产业务逻辑混杂”的状态。`TestHlj.php` 存在大量硬编码、越权风险及不规范的输出控制;`Book.php` 业务逻辑相对完整但存在冗余与框架误用;`Ahead_family_servers_model.php` 数据库操作基本规范,但存在潜在 SQL 语法错误与循环内查询隐患。整体可维护性、安全性与框架适配度亟待提升。
- **风险等级**:🔴 高(若未做环境隔离直接部署,将导致严重越权、数据泄露及 SQL 报错)
> 📌 **框架说明**:代码实际基于 **CodeIgniter 3.x** 架构开发(特征:`BASEPATH`、`$this->load->`、`get_instance()`)。若 `phpci` 为贵司内部定制框架,请对照官方文档调整组件调用方式。以下建议基于 CI3 最佳实践。
> ⚠️ **局限性提示**:`TestHlj.php` 与 `Ahead_family_servers_model.php` 文件末尾被截断,部分深层逻辑未完全展示,审查仅基于可见代码。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `TestHlj.php` 多处 | **缺乏鉴权与越权风险**:硬编码 `uid=66`、`merchant_id=1281`,且未校验请求身份。若部署至生产环境,攻击者可伪造参数直接操作任意商户数据。 | 1. 移除硬编码,统一从 Session/Token 解析用户身份。<br>2. 测试控制器应通过 `ENVIRONMENT` 限制访问,或添加 IP/Token 白名单。 | `if (ENVIRONMENT !== 'development') { show_error('接口已关闭'); }`<br>`$this->uid = $this->session->userdata('uid') ?? 0;` |
| 🔴 严重 | `Ahead_family_servers_model.php` `getMerchantShopByFamily` | **SQL 语法错误隐患**:`$field` 字符串末尾存在多余逗号 `shop._logo_url as shop_img, '`,直接传入 `$this->db->select()` 会生成非法 SQL 导致查询失败。 | 移除字段定义末尾的逗号,或使用 CI 数组格式传参。 | `$field = 'servers._family_server_id as family_server_id, ..., shop._logo_url as shop_img';` |
| 🟠 警告 | `TestHlj.php` `jsonEcho` | **输出缓冲控制混乱**:连续调用 `ob_end_clean()` → `ob_start()` → `ob_end_flush()` → `flush()` → `die()`,易引发 `Headers already sent` 或重复输出,且绕过 CI 生命周期。 | 移除冗余 OB 操作,直接使用 CI 输出类或标准 `exit()`。 | `$this->output->set_status_header($code)<br> ->set_content_type('application/json')<br> ->set_output(json_encode($result, JSON_UNESCAPED_UNICODE))<br> ->_display(); exit;` |
| 🟠 警告 | `TestHlj.php` `getCommunityShopBookHours` | **敏感数据硬编码与性能浪费**:方法内直接粘贴超长 JSON 字符串(含 `verify_token` 等敏感信息),每次请求均执行 `json_decode`,浪费内存且易泄露凭证。 | 将测试数据移至 `application/config/test_data.php` 或独立 JSON 文件,按需加载。 | `$voucher_info = $this->config->item('test_voucher_info');`<br>`$data = json_decode($voucher_info, true);` |
| 🟠 警告 | `TestHlj.php` / `Book.php` 多处 | **未使用 CI 输入过滤**:直接使用 `$_GET`、`$_REQUEST`、`php://input` 获取参数,未启用 XSS 过滤与类型校验,存在注入风险。 | 统一使用 `$this->input->get('key', true)` 或 `$this->input->post()`,关键参数配合 `form_validation`。 | `$order_id = $this->input->get('order_id', true);`<br>`if (!ctype_digit($order_id)) { $this->error_response('订单号格式错误'); }` |
| 🟠 警告 | `TestHlj.php` `updateShopShiftTurnoverCount` | **服务端逻辑依赖浏览器环境**:使用 JS `window.location.href` 实现分页/循环处理,无法兼容 CLI 定时任务或 API 调用。 | 改为服务端游标/分页逻辑,返回 JSON 状态供前端轮询或 CLI 脚本处理。 | `return $this->success_response(['next_url' => site_url('TestHlj/updateShopShiftTurnoverCount?last_id='.$res['last_id'])]);` |
| 🟡 建议 | `Book.php` `__construct` 及多处 | **重复的场景映射逻辑**:多次出现 `if ($operational_scene == '2') { $shop_config_scene = 'billiards_'; } ...`,违反 DRY 原则。 | 提取为私有方法或使用配置数组映射。 | `private function getShopConfigScene($scene) { return ['2'=>'billiards_', '3'=>'card_', '4'=>'tavern_'][$scene] ?? ''; }` |
| 🟡 建议 | `Ahead_family_servers_model.php` `get_community_shop_room_show_list` | **潜在 N+1 查询**:`foreach ($room_data as $k => &$v)` 内部多次调用模型方法(如 `get_now_price`、`get_package_list_in_time`),数据量大时性能骤降。 | 提前批量查询价格/套餐数据,或使用静态缓存/Redis 缓存热点数据。 | `$room_ids = array_column($room_data, 'room_id');`<br>`$prices = $this->ahead_room_timing_model->get_batch_price($room_ids, $book_time);` |
| 🟡 建议 | 全局 | **代码规范与魔法数字**:类名 `TestHlj`、方法名 `niubilityTest` 不符合 PSR-12;大量 `'1'`、`'2'`、`66` 等魔法数字散落,降低可读性。 | 1. 统一驼峰命名,移除不雅命名。<br>2. 提取业务常量/枚举。<br>3. 补充标准 PHPDoc。 | `const SCENE_KTV = '1'; const SCENE_BILLIARDS = '2';`<br>`const TEST_UID = 66;` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **安全隔离**:立即将 `TestHlj.php` 标记为调试专用,通过 `ENVIRONMENT` 或 `.htaccess` 限制公网访问。移除所有硬编码的 `uid`、`merchant_id` 及敏感 Token。
2. **修复 SQL 语法**:修正 `Ahead_family_servers_model::getMerchantShopByFamily` 中 `$field` 字符串末尾的逗号,避免线上 500 错误。
3. **规范输入输出**:全面替换 `$_GET`/`$_REQUEST` 为 `$this->input->get()`,重构 `jsonEcho` 使用 CI 原生输出机制,避免缓冲区污染。
### 🛠 后续重构与优化方向
- **架构分层**:将测试/调试接口与生产业务接口物理分离(如 `application/controllers/debug/` 与 `application/controllers/api/`)。生产控制器应继承统一的 `BaseController` 处理鉴权、参数过滤、统一响应格式。
- **框架适配优化**:
- 避免在控制器中 `include FCPATH...` 加载 Library,统一使用 `$this->load->library()`。
- 避免直接操作 `$CI->property`,改用 `$this->config->set_item()` 或 Session 传递上下文。
- 事务处理建议结合 `try-catch` 与 `$this->db->trans_start()`,确保异常时自动回滚。
- **性能提升**:
- 对高频查询的包厢状态、价格、套餐数据引入 Redis 缓存(TTL 5~10分钟)。
- 批量操作使用 `where_in` 替代循环单条查询,减少 DB 连接开销。
- **规范落地**:引入 `PHP_CodeSniffer` 配置 PSR-12 规则,配合 CI/CD 流水线进行静态扫描;建立业务常量字典,逐步替换魔法数字。
> 💡 **提示**:若需对截断部分(如 `TestHlj::get_room_info` 及 Model 末尾循环)进行深度审查,请提供完整代码片段。当前建议已覆盖可见代码的核心风险点,按优先级修复后可显著提升系统稳定性与安全性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780310600
|
1780310600
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
440
|
21
|
155
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `db9455197 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `db94551970c84e1423f30ec7f4ae272a73e73a4f`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 18:45:41
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码覆盖了包厢管理、扫码登录、激活注册、智能控制等核心业务,逻辑链路相对完整。但存在明显的架构反模式:模型职责过重(God Object)、频繁重复加载组件、事务控制与异常中断机制不匹配、循环内查询导致 N+1 性能瓶颈。同时存在多处拼写错误、魔法数字硬编码及未声明的全局函数依赖,可维护性与健壮性有待提升。
- **风险等级**:🔴 高(事务回滚隐患、性能雪崩风险、强依赖未定义全局函数)
> 📌 **框架适配说明**:提交代码呈现典型的 **CodeIgniter 3** 架构特征(如 `get_instance()`、`$this->load->model()`、Query Builder 链式调用等)。若实际项目确为 `phpci` 框架,请核对两者在生命周期、组件加载及事务管理上的差异。以下审查基于 CI3 规范与通用 PHP 最佳实践。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `activation_data` (约 230-280 行) | **事务控制与异常中断不匹配**。使用 `trans_begin()` 配合 `try-catch`,但业务校验依赖 `throwError()`。若该函数内部执行 `exit/die` 或 `show_error()`,将直接跳过 `catch` 块,导致事务无法显式回滚,在并发或复杂流程下极易产生脏数据。 | 改用 CI 推荐的自动事务管理 `$this->db->trans_start()` / `$this->db->trans_complete()`,或确保 `throwError()` 抛出 `\Exception`。在 `catch` 中必须显式回滚。 | `$this->db->trans_start();<br>// 业务逻辑...<br>if ($this->db->trans_status() === FALSE) {<br> $this->db->trans_rollback();<br> return ['status'=>false, 'msg'=>'系统繁忙'];<br>}<br>$this->db->trans_commit();` |
| 🔴 严重 | 全文件多处 (`scan_screen_url`, `activation_data` 等) | **强依赖未声明的全局函数**。如 `throwError()`, `get_mac_by_url()`, `aliOssTurnCdn()`, `hourToTime()` 等。若这些函数未正确加载或内部直接终止脚本,将导致流程中断、内存泄漏或安全绕过。 | 将全局函数收敛至 Helper 或 Service 类,通过 `$this->load->helper()` 或依赖注入规范引入。对核心函数补充类型声明与单元测试。 | `// 替换前<br>throwError("参数错误");<br>// 替换后<br>$this->load->helper('common');<br>throw_error('参数错误', 400);` |
| 🟠 警告 | `get_community_shop_room_show_list` (约 550-600 行) | **N+1 查询性能瓶颈**。在 `foreach ($room_data as $k => &$v)` 循环中调用 `get_now_price()` 和 `get_lowest_price()`。若门店包厢数 >50,将触发数十次独立 DB 查询,严重拖慢接口响应。 | 将价格查询逻辑下沉至模型层,使用 `WHERE IN` 批量获取,或在应用层构建内存映射表。 | `$room_ids = array_column($room_data, 'room_id');<br>$price_map = $this->ahead_room_timing_model->get_batch_prices($merchant_id, $shop_id, $room_ids, $date);<br>// 循环内直接读取 $price_map[$v['room_id']]` |
| 🟠 警告 | 全文件多处 (`update_room_status`, `scan_screen_url` 等) | **重复加载模型/库**。在多个方法内部频繁调用 `$this->load->model()` 和 `$this->load->library()`。CI 框架虽会缓存实例,但重复调用仍消耗 CPU 解析开销,且破坏代码可读性。 | 将高频依赖的模型/库统一移至 `__construct()` 中加载,或配置 `config/autoload.php`。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model(['Ahead_shop_model', 'Ahead_open_room_log_model', 'Ahead_switch_control_model']);<br>}` |
| 🟠 警告 | `close_power`, `open_power`, `check_room_consume` | **魔法数字与硬编码错误码**。大量使用 `1`, `2`, `3`, `2333`, `4403`, `4404` 等字面量,缺乏语义化,后期维护极易混淆或误改。 | 定义类常量或枚举(PHP 8.1+)集中管理状态与错误码。 | `const STATUS_CONSUMING = 1;<br>const STATUS_FREE = 0;<br>const ERR_PARAM_MISSING = 4403;` |
| 🟡 建议 | 全文件 | **拼写错误与命名不规范**。如 `contorl_data` (应为 `control_data`)、`fileds` (应为 `fields`)、`Ahead_famaily_version_model` (应为 `family`)。数组语法 `array()` 与 `[]` 混用,未遵循 PSR-12。 | 全局检索修正拼写错误。统一使用短数组语法 `[]`。遵循 PSR-12 缩进、命名与注释规范。 | `protected $control_data = [];`<br>`protected $fields = '';` |
| 🟡 建议 | `scan_screen_url` (约 120-200 行) | **单一职责原则(SRP)违背**。该方法混合了二维码解析、房态判断、好友关系更新、埋点统计、页面路由分发等 5+ 个职责,代码超 100 行,难以测试与复用。 | 拆分为独立的私有方法或提取至 `RoomScanService` 类。主方法仅负责流程编排。 | `private function handleRoomScanLogic($param, $uid) { ... }`<br>`private function updateFriendRelation($uid, $openData) { ... }` |
| 🟡 建议 | `get_list_by_ids` | **非标准 Query Builder 用法**。`$where['where_in'] = array("_id", $ids);` 依赖自定义 `select` 方法兼容。若底层未处理,将导致 SQL 语法错误或注入风险。 | 使用 CI 标准链式调用,确保类型安全。 | `$this->db->where_in('_id', (array)$ids);<br>$res = $this->db->get($this->table_name)->result_array();` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **事务一致性保障**:立即将 `activation_data` 等涉及多表写入的方法改为 `$this->db->trans_start()` / `$trans_complete()` 模式,或确保所有中断点均抛出 `\Exception`,杜绝脏数据风险。
2. **消除 N+1 查询**:重构 `get_community_shop_room_show_list` 中的价格获取逻辑,采用批量查询(`WHERE IN`)+ 内存映射,预计可将接口耗时降低 60% 以上。
3. **全局函数治理**:梳理 `throwError`、`get_mac_by_url` 等全局函数的定义位置与行为,统一封装为 Helper 或 Service,避免隐式依赖与不可控的脚本终止。
### 🛠 后续重构与优化方向
- **架构分层**:当前 Model 承担了过多业务逻辑(扫码、激活、开关电、预订计算)。建议引入 `Service` 层处理复杂业务流程,Model 仅保留数据访问与基础校验,Controller 负责参数接收与响应组装。
- **输入校验与类型安全**:在方法入口补充参数类型声明(PHP 7.4+ 支持属性类型提示)与基础校验(如 `filter_var`、`ctype_digit`),避免非法数据穿透至 DB 层。
- **配置与常量集中化**:将房态枚举、错误码、业务开关(如 `intelligent_control`)抽离至 `config/room_constants.php`,提升多环境部署与后期迭代的灵活性。
- **代码规范自动化**:接入 `PHP_CodeSniffer` (PSR-12) 与 `PHPStan` 静态分析工具,在 CI/CD 流水线中拦截拼写错误、未定义变量与类型不匹配问题。
> ⚠️ **局限性说明**:提供的代码片段在 `get_community_shop_room_show_list` 方法末尾截断,未能完整审查该方法后续逻辑及类末尾结构。建议补充完整文件后再次进行深度审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780310742
|
1780310742
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
441
|
21
|
156
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `5d6471809 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `5d64718097ef068b041584656af3d3a783e63391`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 19:17:49
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算与状态过滤逻辑,业务覆盖全面,但代码结构严重臃肿。存在明显的状态管理缺陷、硬编码泛滥、方法过长及潜在的性能瓶颈。整体可读性与可维护性较差,需进行系统性重构。
- **风险等级**:🔴 高
## 2. 问题详情
> 注:因原始代码未提供行号,下表以 `方法名/代码块` 定位。代码末尾存在截断,部分逻辑未完整审查。
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info()` 方法内 | `$this->book_days += 1;` 直接修改类属性。若该方法被多次调用,天数会持续累加,导致后续查询范围错误。 | 使用局部变量进行计算,禁止直接修改实例属性。 | `$days = $add_day ? $this->book_days + 1 : $this->book_days;`<br>`for ($i = 0; $i < $days; $i++) { ... }` |
| 🔴 严重 | 全局静态属性 `self::$xxx` | 静态缓存变量(如 `self::$book_days_info`)未设置失效机制。在 PHP-FPM 长连接或 CLI 环境下,会导致脏数据跨请求污染,引发严重业务错乱。 | 增加缓存键隔离(如按商户/日期),或在请求生命周期结束/关键节点提供 `clearStaticCache()` 清理方法。 | `public static function clearCache(): void { self::$book_days_info = []; self::$shop_data = []; ... }` |
| 🔴 严重 | `get_book_day_time_info()` 内 `array_intersect(...)` | `array_intersect(...array_values($all_room_book_time))` 使用展开运算符。若数组为空或仅含1个元素,PHP 8+ 会抛出 `ArgumentCountError`,PHP 7 行为不可控。 | 增加元素数量判断,安全调用。 | `if (count($all_room_book_time) > 1) { $un_book_time = array_intersect(...array_values($all_room_book_time)); }` |
| 🟠 警告 | `get_book_day_time_info()` 方法体 | 方法体超 300 行,嵌套层级深,混合了时间计算、状态过滤、套餐校验、营业时间判断等职责。违反单一职责原则,极易产生边界 Bug。 | 拆分为多个私有方法,如 `calculatePackageAvailability()`, `checkBusinessHoursOverlap()`, `filterUnbookableTimes()`。 | *(见下方重构建议)* |
| 🟠 警告 | 全局多处 | 大量使用魔法字符串/数字(如 `'1'`, `'2'`, `'merchantApp'`, `'-1'`, `'7'`),缺乏语义化,后期维护极易出错。 | 提取为类常量,统一状态与场景枚举。 | `const SCENE_KTV = '1'; const SCENE_BILLIARDS = '2'; const STATUS_AVAILABLE = '1'; const STATUS_UNAVAILABLE = '-1';` |
| 🟠 警告 | 构造函数 & `set_shop_config()` | `$CI = &get_instance();` 被重复调用 4 次以上;模型/库在构造函数和配置方法中重复加载。增加不必要的开销。 | 在构造函数顶部统一获取实例并赋值给 `$this->ci`;利用 CI 的自动加载或懒加载机制。 | `protected $ci; public function __construct() { parent::__construct(); $this->ci =& get_instance(); }` |
| 🟡 建议 | 类属性定义区 | 30+ 个属性全部声明为 `public`,外部可直接篡改内部状态,破坏封装性,且 IDE 无法提供类型提示。 | 改为 `private`/`protected`,按需暴露 `getter/setter`,并补充 PHP 7+ 类型声明。 | `private int $book_room_id = 0; public function getBookRoomId(): int { return $this->book_room_id; }` |
| 🟡 建议 | 时间处理逻辑 | 频繁使用 `date()`、`strtotime()` 进行字符串与时间戳互转,易受服务器时区/DST 影响,且循环内调用性能较差。 | 引入 `DateTime` 对象或 `nesbot/carbon` 库,统一时间计算与格式化。 | `$dt = new DateTime($date); $ts = $dt->getTimestamp();` |
| 🟡 建议 | 输入参数 `$params` | 直接使用 `$params['date']`、`$params['merchant_id']` 等,未做类型校验或空值防御。若上游传入非法值,将导致 `strtotime` 警告或 SQL 异常。 | 在方法入口增加基础校验,或使用 DTO 对象接收参数。 | `if (empty($params['date']) || !preg_match('/^\d{8}$/', $params['date'])) { throwError('日期格式错误'); }` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复状态累加 Bug**:立即将 `get_book_days_info()` 中的 `$this->book_days += 1;` 改为局部变量计算,避免多调用场景下的数据污染。
2. **防御静态缓存泄漏**:为所有 `self::$xxx` 静态属性增加请求级清理机制(如注册 `register_shutdown_function` 或在控制器基类中统一清理),防止 PHP-FPM 环境下的跨请求脏数据。
3. **修复数组展开异常**:对 `array_intersect(...)` 及类似展开操作增加 `count() > 1` 的前置判断,兼容 PHP 7/8 运行环境。
### 🛠 后续重构与优化方向
1. **拆分巨型方法(SRP 原则)**:`get_book_day_time_info()` 承担了数据获取、时间计算、规则过滤、状态标记等 5 种以上职责。建议提取为独立的 `BookingTimeCalculator` 服务类,模型仅负责数据读写。
2. **统一时间处理策略**:废弃散落的 `strtotime`/`date` 字符串操作,封装 `TimeRange` 值对象,使用 `DateTimeImmutable` 进行区间交集/差集计算,彻底解决时区与跨天逻辑隐患。
3. **规范化与类型安全**:
- 遵循 PSR-12 规范,统一缩进、命名与括号风格。
- 全面启用 PHP 7.4+ 类型声明(属性类型、参数类型、返回值类型)。
- 将魔法值替换为 `const` 枚举,提升代码自解释能力。
4. **框架适配说明**:代码结构高度符合 **CodeIgniter 3** 规范(`$CI =& get_instance()`、`system/` 目录、`$this->load->`)。若 `phpci` 为内部定制框架,请核对:
- 是否支持依赖注入(DI)替代 `get_instance()`?
- 模型基类 `Simple_model` 是否已实现查询缓存或防 SQL 注入的预处理机制?
- 建议查阅 `phpci` 官方文档确认生命周期钩子,将静态缓存清理移至框架请求结束阶段。
> ⚠️ **局限性提示**:提供的代码在 `$this->next_date_room_book_time` 赋值处截断,后续可能存在的数据库写入、事务控制或最终返回逻辑未纳入审查。建议补充完整文件后再次进行深度审计。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780312669
|
1780312669
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
442
|
21
|
157
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `49815ee06 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `49815ee063afc9e9ce372297e070928d101fe75d`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 19:24:58
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:代码承载了复杂的门店预订时间计算与配置读取逻辑,业务覆盖全面。但整体呈现典型的“上帝类/上帝方法”特征,大量业务规则、时间计算、数据查询耦合在单一方法中。存在**实例状态污染**、**静态缓存失效**、**文件级非法代码**等严重缺陷。注:代码实际使用的是 `CodeIgniter 3` 语法架构(如 `$CI = &get_instance()`、`$this->load->model()`),而非 `phpci`,以下审查将基于 CI3 最佳实践与通用 PHP 规范进行。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_shop_book_time_info_model.php` 顶部 | 文件顶部在类定义外直接执行 `$CI = &get_instance();` 和 `$CI->load->model()`。在 PHP/CI3 中,模型文件不应包含类外可执行代码,会导致 Fatal Error 或加载时序异常。 | 移除文件顶部代码,将实例获取与依赖加载移至 `__construct()` 方法内。 | `// 删除顶部代码<br>class Ahead_shop_book_time_info_model extends Simple_model {<br> public function __construct() {<br> parent::__construct();<br> $this->load->model('Simple_model');<br> // ...<br> }<br>}` |
| 🔴 严重 | `get_book_days_info` 方法内 | `$this->book_days += 1;` 直接修改了类的公共属性。若模型实例被复用(CI3 默认单例复用),多次调用会导致天数无限累加,引发严重业务逻辑错误。 | 使用局部变量计算,禁止修改类属性。若需扩展天数,应通过参数传递或返回新数组。 | `$days = $this->book_days + ($add_day ? 1 : 0);<br>for ($i = 0; $i < $days; $i++) { ... }` |
| 🔴 严重 | `get_book_days_info` 方法内 | `self::$book_days_info` 静态缓存未区分 `$add_day` 参数。首次以 `$add_day=true` 调用后,缓存被写入;后续 `$add_day=false` 调用将直接返回错误缓存,导致日期状态错乱。 | 缓存 Key 需包含参数特征,或仅在 `$add_day=false` 时缓存。 | `$cache_key = 'book_days_' . ($add_day ? '1' : '0');<br>if (!empty(self::$book_days_info[$cache_key])) return self::$book_days_info[$cache_key];<br>// ...<br>self::$book_days_info[$cache_key] = $result;` |
| 🟠 警告 | `get_book_day_time_info` 方法 | 方法体超 300 行,混合了 DB 查询、时间区间计算、套餐规则校验、状态标记、数组过滤等。违反单一职责原则,极难单元测试与维护。 | 按职责拆分:1. `fetchBookingData()` 2. `calculateTimeRanges()` 3. `applyVoucherRules()` 4. `formatResponse()`。引入独立的时间计算服务类。 | *(架构级建议,见第3节)* |
| 🟠 警告 | `_get_un_book_time` 方法 | 频繁调用 `get_one()` 查询前一天/后一天数据,且未使用批量查询。在高并发预订场景下易引发 N+1 查询瓶颈。 | 使用 `where_in` 批量查询前后日期数据,或在内存中一次性加载多日缓存。 | `$dates = [$prev_date, $date, $next_date];<br>$this->db->where_in('_date', $dates);<br>$all_data = $this->get();` |
| 🟠 警告 | `Ahead_shop_config_second_model.php` `get_shop_setting` | `switch` 语句超 200 行,大量分支逻辑高度重复(如 KTV/台球/棋牌/酒馆的退款、变更、时长限制)。违反开闭原则,新增场景需修改核心方法。 | 提取配置映射表或使用策略模式。将重复逻辑抽象为 `get_scene_setting($scene_prefix, $field, $default)`。 | `private function get_scene_setting($prefix, $field, $default) {<br> $key = $prefix . $field;<br> return $this->data[$key] ?? $default;<br>}` |
| 🟠 警告 | 全局辅助函数依赖 | 大量使用 `throwError()`, `timeToHour()`, `hourToTime()`, `minToStr()` 等未声明命名空间的全局函数。若环境未加载对应 helper,将直接崩溃。 | 明确引入 `helper('custom_time')`,或封装为 `TimeHelper` 静态类。对关键函数添加 `function_exists()` 防御或依赖注入。 | `if (!function_exists('throwError')) { throw new \RuntimeException('Helper not loaded'); }` |
| 🟡 建议 | 两个模型文件 | 属性全部声明为 `public`,且缺乏类型声明(PHP 7.4+ 支持)。外部可直接篡改 `$book_time_limit`、`$tuangou` 等核心状态,破坏封装性。 | 改为 `protected`/`private`,提供 `get/set` 方法。为属性添加类型提示(如 `public int $book_time_limit = 3600;`)。 | `protected int $book_time_limit = 3600;<br>public function getBookTimeLimit(): int { return $this->book_time_limit; }` |
| 🟡 建议 | `Ahead_shop_config_second_model.php` | `case 'book_trial_time': $result = 0;//$data['book_trial_time'] ?? 0;` 存在注释掉的旧逻辑。`deal_audio_content_params` 中 `$params_map` 末尾有多余分号 `;;`。 | 清理死代码与语法冗余。遵循 PSR-12 规范,移除无用注释。 | `case 'book_trial_time':<br> $result = 0; // 251021版本已废弃<br> break;` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复状态污染**:移除 `get_book_days_info` 中的 `$this->book_days += 1;`,改用局部变量。修复静态缓存 Key 未区分参数的问题,防止跨请求数据串扰。
2. **清理非法文件头代码**:将 `Ahead_shop_book_time_info_model.php` 顶部的 `$CI = &get_instance();` 及 `load->model()` 移入构造函数,确保符合 PHP 类加载规范。
3. **防御性编程**:对 `$this->tuangou` 等动态加载的库增加 `if (property_exists($this, 'tuangou'))` 或 `instanceof` 校验,避免未加载时触发 `Call to a member function on null` 致命错误。
### 🛠 后续重构与优化方向
1. **架构拆分(SRP 原则)**:
- 将 `get_book_day_time_info` 拆分为 **数据层**(查询预订记录、门店配置)、**规则层**(时长限制、套餐校验、跨天逻辑)、**表现层**(状态标记、格式化输出)。
- 建议引入 `BookingTimeCalculator` 服务类,专门处理时间区间交集、差集、合并算法(当前大量使用 `array_intersect`/`array_merge` 处理时间字符串,性能与可读性均不佳)。
2. **配置读取优化**:
- `Ahead_shop_config_second_model` 的 `switch` 可重构为配置映射数组。例如:
```php
protected $config_map = [
'book_refund_time_limit' => ['status_field' => 'book_refund_time_limit_status', 'default' => 2],
// ...
];
```
- 利用 CI3 的 `Cache` 驱动(如 Redis/Memcached)缓存门店配置,替代仅存在于请求生命周期的 `static $shop_config`,降低 DB 压力。
3. **安全与规范**:
- 所有外部传入的 `$params` 数组应在入口处进行类型校验与过滤(可使用 CI3 的 `Form_validation` 或自定义 DTO)。
- 统一时间处理:建议全局使用 `DateTimeImmutable` 或统一转换为 Unix 时间戳进行计算,避免 `YmdHi` 字符串比较带来的边界错误(如 `23:59` 与 `00:00` 跨天问题)。
- 若项目确需迁移至 `phpci` 或现代 PHP 框架,建议逐步将 `$CI = &get_instance()` 替换为依赖注入(DI)容器,并启用严格类型模式 `declare(strict_types=1);`。
> 💡 **局限性说明**:本次审查基于提供的两个模型文件。由于时间计算强依赖未提供的全局 Helper(如 `timeToHour`, `mergeTimeRanges`)及 `Tuangou` 库的内部实现,部分边界条件(如跨天套餐时长计算、并发锁机制)的准确性需结合完整上下文进行集成测试验证。建议补充单元测试覆盖核心时间区间算法。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780313098
|
1780313098
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
443
|
21
|
158
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 标记清扫时间,可预订
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `31998ab2f ## 自动代码审查报告
**分支**: pay-260616
**提交**: `31998ab2f5cd19ac60553c26f5a43358634419e8`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 19:26:32
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务逻辑覆盖较全面(涵盖跨天、套餐、最低时长、清扫时间、停用规则等),但核心方法过于臃肿,存在静态缓存污染风险,且大量混合数据查询、时间计算与状态判定逻辑。代码可维护性与性能有较大优化空间。
- **风险等级**:🟠 中(存在逻辑隐患与性能瓶颈,暂无直接高危安全漏洞)
> 📌 **框架说明**:根据目录结构(`system/`, `application/`)及 `$CI = &get_instance()` 语法,判定该代码基于 **CodeIgniter 3.x** 架构。若 `phpci` 为贵司内部定制框架,请确认以下 CI3 规范是否适用。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` 开头 | **静态缓存未区分参数**:`if (!empty(self::$book_days_info)) { return self::$book_days_info; }` 会忽略后续传入的 `$check_date` 与 `$add_day`,导致不同请求返回脏数据。 | 将缓存键改为参数组合的哈希值,或移除静态缓存改用实例属性/Redis缓存。 | `private static $book_days_info = [];<br>public function get_book_days_info(...) {<br> $cache_key = md5($merchant_id . '_' . $shop_id . '_' . $check_date . '_' . (int)$add_day);<br> if (isset(self::$book_days_info[$cache_key])) {<br> return self::$book_days_info[$cache_key];<br> }<br> // ... 计算逻辑 ...<br> self::$book_days_info[$cache_key] = $result;<br> return $result;<br>}` |
| 🔴 严重 | `get_book_day_time_info` | **违反单一职责原则**:该方法超 300 行,混合了数据拉取、时间区间计算、套餐规则校验、状态标记与 UI 提示生成。极易引发逻辑冲突与回归 BUG。 | 将时间计算与规则校验剥离至独立的 `BookingTimeCalculatorService`,Model 仅负责数据存取与基础组装。 | *(见第3节重构建议)* |
| 🟠 警告 | 多处方法内 | **频繁调用 `&get_instance()`**:在 `__construct`、`set_shop_config`、`_get_un_book_time` 等位置重复获取 CI 实例,增加开销且不符合 CI 最佳实践。 | 在 `__construct` 中统一获取并赋值给实例属性,后续直接使用 `$this->ci`。 | `protected $ci;<br>public function __construct() {<br> parent::__construct();<br> $this->ci = &get_instance();<br> // ...<br>}` |
| 🟠 警告 | `set_shop_config` & `set_room_info` | **逻辑高度重复**:场景判断 (`billiards_`, `card_`, `tavern_`) 与配置加载代码在两个方法中几乎完全一致。 | 提取为私有方法 `_resolve_shop_config_scene($scene)` 统一调用。 | `private function _resolve_shop_config_scene(string $scene): string {<br> return match($scene) {<br> '2' => 'billiards_',<br> '3' => 'card_',<br> '4' => 'tavern_',<br> default => ''<br> };<br>}` |
| 🟠 警告 | 类属性定义 | **拼写错误**:`$opreational_scene` 存在拼写错误(应为 `operational`),易导致后续维护或前端对接时字段不一致。 | 全局搜索替换为 `$operational_scene`,并在属性声明处添加类型提示。 | `/** @var string 1:ktv, 2:billiards, 3:card, 4:tavern */<br>public string $operational_scene = '1';` |
| 🟡 建议 | 全局 | **大量魔法数字与硬编码**:`86400`, `3600`, `'1'`, `'-1'` 等散落在代码中,降低可读性且易引发状态误判。 | 定义为类常量,如 `const STATUS_AVAILABLE = '1'; const STATUS_UNAVAILABLE = '-1'; const SECONDS_PER_DAY = 86400;` | `const STATUS_AVAILABLE = '1';<br>const STATUS_UNAVAILABLE = '-1';<br>// 替换所有 '1' / '-1' 状态赋值` |
| 🟡 建议 | `get_book_day_time_info` 循环内 | **循环内高频数组操作**:`array_intersect`, `array_merge`, `array_unique`, `sort` 在 `foreach ($time_info)` 中反复执行,时间复杂度偏高。 | 预计算不可用时间区间树(Interval Tree)或使用位图标记;将重复的 `strtotime`/`date` 计算移至循环外。 | *(建议引入 `DatePeriod` 或区间合并算法预处理 `$un_book_time`,循环内仅做 O(1) 范围比对)* |
| 🟡 建议 | 全局 | **缺乏现代 PHP 类型声明**:未使用 PHP 7.4+/8.x 的类型提示,不利于 IDE 静态分析与团队协作。 | 为方法参数、返回值及类属性添加严格类型声明。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存污染**:立即修改 `get_book_days_info` 的缓存键生成逻辑,否则在多条件并发请求下必现数据错乱。
2. **拆分巨型方法**:`get_book_day_time_info` 已超出合理维护边界。建议按职责拆分为:
- `fetchBookingData()`:负责拉取门店、包厢、历史预订数据。
- `calculateAvailableSlots()`:负责时间区间计算、规则过滤。
- `formatSlotStatus()`:负责最终状态标记与 UI 提示组装。
3. **统一 CI 实例获取**:消除冗余的 `&get_instance()` 调用,提升运行效率与代码整洁度。
### 🛠 后续重构与优化方向
1. **引入服务层(Service Layer)**:将复杂的业务规则(套餐时长校验、跨天逻辑、最低开房时长限制)从 Model 中剥离,放入 `app/services/BookingTimeService.php`。Model 仅保留 `get_one`, `insert`, `update` 等数据操作。
2. **时间计算算法优化**:当前使用 `array_intersect` 判断时间交集,在时间片粒度较细(如 5 分钟)时数组体积庞大。建议改用 **区间重叠算法** 或 **时间轴位图**,将复杂度从 `O(N*M)` 降至 `O(N log N)`。
3. **配置集中化管理**:将 `book_time_limit`, `minute_unit`, `book_days` 等硬编码默认值移至配置文件或数据库配置表,通过 `config()` 函数读取,避免代码级修改。
4. **补充输入校验**:在方法入口处对 `$params` 进行严格校验(如 `ctype_digit`, `preg_match('/^\d{8}$/', $date)`),防止非法参数穿透至底层模型引发 SQL 异常或逻辑崩溃。
5. **代码规范对齐**:使用 `php-cs-fixer` 或 `PHP_CodeSniffer` 配置 PSR-12 规则集进行自动化格式化,补充缺失的 `@throws`、`@return` 注释,并统一错误处理机制(建议统一抛出 `InvalidArgumentException` 或自定义 `BookingException`,替代全局 `throwError`)。
> ⚠️ **局限性说明**:提供的代码在 `get_book_day_time_info` 末尾处截断,未包含完整的方法闭合与后续逻辑。若截断部分包含关键的状态回写或事务处理,请补充完整代码以便进行闭环审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780313192
|
1780313192
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
444
|
21
|
159
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 预订消息新增包厢信息
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `8e299d5dd ## 自动代码审查报告
**分支**: pay-260616
**提交**: `8e299d5ddd437524ee365ab1fc794cbbc5f549a5`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 19:40:30
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务逻辑覆盖完整,实现了支付回调、退款、消息通知及订单创建等核心流程。但存在事务控制不规范、N+1 查询性能瓶颈、全局变量滥用、硬编码魔法值及潜在的数据安全风险。部分核心方法(如 `refund_by_notify`)过于臃肿,可维护性与扩展性较弱。
- **风险等级**:🔴 高(涉及资金流转、支付回调与数据库事务,逻辑瑕疵易导致资损、数据不一致或接口阻塞)
> 📌 **框架说明**:根据目录结构、`$CI =& get_instance()`、`$this->load->model()` 等特征,判定项目基于 **CodeIgniter 3.x**(或高度兼容其规范的自研框架 `phpci`)。以下建议均基于 CI3 最佳实践与 PHP 现代编码规范。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`check_notify` 方法 | **事务状态机混乱**:使用 `$this->db->trans_start()` 后,在失败分支手动调用 `$this->db->trans_rollback()` 并直接 `return`,导致 CI 事务状态未正确重置。后续 DB 操作可能脱离事务或引发锁残留。 | 改用 `$this->db->trans_begin()` 配合显式 `trans_commit()`/`trans_rollback()`,或统一使用 `trans_start()` + `trans_complete()` 且不在内部手动回滚。 | ```php<br>$this->db->trans_begin();<br>try {<br> // 业务逻辑<br> if (!$success) {<br> $this->db->trans_rollback();<br> return ['status'=>false];<br> }<br> $this->db->trans_commit();<br>} catch (\Exception $e) {<br> $this->db->trans_rollback();<br> throw $e;<br>}``` |
| 🔴 严重 | `Ahead_yc_notice_model.php`<br>`after_order` 方法 | **未定义变量直接访问**:`$data['_nickname'] = $admin_data['_admin_name'] ?? '';` 中 `$admin_data` 从未定义,将触发 `PHP Warning/Notice`,导致通知内容异常或日志报错。 | 明确 `$admin_data` 来源(如从参数传入或查询数据库),或提供安全的默认值。 | ```php<br>// 假设从调用方传入或查询<br>$admin_data = $this->get_admin_info($order_data['_admin_id'] ?? 0);<br>$data['_nickname'] = $admin_data['_admin_name'] ?? '系统';``` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`refund_by_notify` 方法 | **SQL 注入与并发覆盖风险**:`$log_where = '_relation_id="' . $order_data['_id'] . '" and _status=1...'` 使用字符串拼接构造条件。若底层 `up()` 未严格转义,存在注入风险;且直接更新状态易在并发退款时产生覆盖。 | 使用 CI Query Builder 或参数化查询;增加乐观锁或状态前置校验。 | ```php<br>$this->db->where('_relation_id', $order_data['_id'])<br> ->where('_status', 1)<br> ->where_in('_type', [5, 13])<br> ->update('pay_log_table', $log_up);``` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`get_list` 方法 | **N+1 查询性能瓶颈**:在 `foreach` 循环中逐条查询商户信息 `$this->ahead_merchant_model->get_one()`,数据量增大时数据库压力呈指数级上升。 | 提取所有 `merchant_id` 后使用 `WHERE IN` 批量查询,或使用 `JOIN` 一次性获取。 | ```php<br>$merchant_ids = array_column($order_info, 'merchant_id');<br>$merchants = $this->ahead_merchant_model->get_batch(['_id' => $merchant_ids], '_id,_business_model');<br>$merchant_map = array_column($merchants, '_business_model', '_id');<br>// 循环中直接 $merchant_map[$v['merchant_id']]``` |
| 🟠 警告 | `Ahead_yc_notice_model.php`<br>`push_notice` 方法 | **同步阻塞第三方请求**:`curlRequest()` 同步调用推送接口,若第三方服务响应慢或超时,将直接拖垮支付回调/下单接口,导致请求堆积。 | 将非核心推送逻辑(微信模板消息、短信、App推送)剥离至消息队列(Redis/RabbitMQ)异步处理。 | ```php<br>// 控制器/模型中<br>$this->load->library('queue');<br>$this->queue->push('push_notice', $notice_data);<br>// 消费者中执行 curlRequest()``` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>全局/多处 | **全局作用域滥用 CI 实例**:文件顶部 `$CI = &get_instance();` 在类外赋值,在 CLI 脚本、单元测试或某些 Swoole 环境下会引发致命错误。 | 遵循 CI 规范,在模型构造函数中获取实例,或优先使用 `$this->ci`。 | ```php<br>class Ahead_book_order_model extends Simple_model {<br> protected $ci;<br> public function __construct() {<br> parent::__construct();<br> $this->ci =& get_instance();<br> }<br>}``` |
| 🟡 建议 | 全局多处 | **魔法数字散落**:状态码 `-1,1,2,3,4,5`、支付平台 `1,3,14`、短信模板 `58,56` 等硬编码遍布逻辑,极易误改且难以维护。 | 提取为类常量或独立配置类,提升可读性与可维护性。 | ```php<br>class Ahead_book_order_model extends Simple_model {<br> const STATUS_PENDING = -1;<br> const STATUS_PAID = 1;<br> const PAY_SCENE_WECHAT = '5';<br> // ...<br>}``` |
| 🟡 建议 | 全局多处 | **日志敏感数据泄露**:`doLog(var_export($input, true) . var_export($res, true))` 打印完整支付请求/响应对象,可能包含商户密钥、用户手机号等敏感信息。 | 仅记录关键字段,或对敏感字段进行脱敏处理。 | ```php<br>doLog('RefundReq: txn_id='.$input->GetTransaction_id().', res_code='.$res['result_code'], 'BookOrderWxRefund');``` |
| 🟡 建议 | 全局多处 | **代码规范与模型加载**:混用 `array()` 与 `[]`;频繁在方法内 `$this->load->model()`。 | 统一使用 `[]` 符合 PSR-12;依赖模型建议在 `__construct()` 中集中加载。 | `// 构造函数中统一加载:<br>$this->load->model(['ahead_book_model', 'ahead_vip_model', ...]);` |
> ⚠️ **局限性说明**:`create_community_shop_book_order` 方法末尾代码被截断(`if ($this->tuangou->verify_token) {` 后缺失),无法完整评估该分支的事务提交、异常处理及返回值逻辑。请补充完整代码以便二次审查。
## 3. 总结与行动建议
### 🔑 优先修复项(P0)
1. **修正事务控制逻辑**:统一使用 `$this->db->trans_begin()` + `trans_commit()`/`trans_rollback()`,确保支付回调与退款流程的原子性,避免资损或脏数据。
2. **修复未定义变量**:立即处理 `Ahead_yc_notice_model::after_order` 中的 `$admin_data` 引用,防止线上 Notice 报错污染日志。
3. **消除 SQL 拼接隐患**:将 `refund_by_notify` 中的字符串条件改为 CI Query Builder 链式调用或参数化查询,杜绝注入风险。
### 🛠 性能与架构优化方向
1. **解决 N+1 查询**:重构 `get_list` 方法,采用批量查询或关联查询,预计可降低 70%+ 的数据库交互次数。
2. **异步化非核心链路**:将微信模板消息、短信发送、日志记录等从主流程剥离,引入消息队列异步消费,提升核心接口(支付回调/下单)的响应速度与吞吐量。
3. **拆分超长方法**:`refund_by_notify` 超过 200 行,职责过重。建议按支付渠道(微信、银联、组合支付)拆分为独立策略类(Strategy Pattern),通过工厂方法路由,符合开闭原则。
### 📐 规范与可维护性提升
1. **常量/枚举化管理**:建立 `OrderStatus`、`PayPlatform`、`SmsTemplate` 等常量类,替换散落各处的魔法数字。
2. **统一 CI 实例获取**:移除文件顶部的全局 `$CI`,改为构造函数注入或按需 `$this->ci =& get_instance()`,提升代码在 CLI/测试环境的兼容性。
3. **类型声明与 PSR-12**:逐步为方法签名添加 PHP 7+ 类型提示(如 `array`, `string`, `int`),统一数组语法为 `[]`,完善 PHPDoc 注释。
> 💡 **后续建议**:若项目计划长期维护,建议引入静态分析工具(如 `PHPStan` 或 `Psalm`)与 CI/CD 自动化代码检查流水线,在合并前拦截低级语法错误与潜在逻辑漏洞。支付与资金相关模块务必补充单元测试(PHPUnit)覆盖核心分支。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780314031
|
1780314031
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
445
|
21
|
160
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `07ec3b591 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `07ec3b59147682933f558d7b84f1de5ec605c784`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 20:03:20
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码业务逻辑完整,覆盖了预订、支付回调、退款、消息推送等核心链路,具备较强的工程落地能力。但存在**事务管理不规范、SQL 拼接注入风险、循环内查询(N+1)、魔法数字泛滥**等典型问题。部分支付回调逻辑缺乏安全校验,静态缓存使用方式在特定运行环境下存在隐患。
- **风险等级**:🟠 中高风险(主要源于 SQL 注入隐患、支付回调安全缺失及事务状态机冲突)
> 📌 **框架说明**:根据目录结构(`system/`、`application/models/`)及 `$CI =& get_instance()`、`$this->load->model()` 等特征,判定该项目实际基于 **CodeIgniter 3.x** 框架。以下审查将基于 CI3 最佳实践进行。若实际为其他框架,请补充说明。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`refund_by_notify` 方法 | **SQL 注入风险**:使用字符串拼接构造 `WHERE` 条件与 `UPDATE` 字段(如 `$log_where = '_relation_id="' . $order_data['_id'] . '"...'`),若上游数据未严格过滤,将导致注入。 | 废弃字符串拼接,全面改用 CI 查询构建器(Query Builder)或参数绑定。 | `$this->ahead_pay_log_model->where('_relation_id', $order_data['_id'])<br> ->where('_status', 1)<br> ->where_in('_type', [5, 13])<br> ->update(['_status' => 4, '_refund_amount' => '_actual_pay', ...]);` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`check_notify` 方法 | **事务状态机冲突**:CI3 的 `trans_start()` 与 `trans_complete()` 为配对设计,内部已自动处理回滚。在 `try` 块中手动调用 `trans_rollback()` 会破坏 CI 事务状态机,可能导致后续 `trans_complete()` 误提交或抛出异常。 | 改用 `trans_begin()` 显式控制,或移除 `try-catch` 中的手动回滚,依赖 `trans_complete()` 自动回滚机制。 | `$this->db->trans_begin();<br>try {<br> // 业务逻辑...<br> if (!$success) { $this->db->trans_rollback(); return [...]; }<br> $this->db->trans_commit();<br>} catch (\Exception $e) {<br> $this->db->trans_rollback();<br> return [...];<br>}` |
| 🔴 严重 | `Ahead_book_order_model.php`<br>`check_notify` 方法 | **支付回调缺乏签名校验**:直接处理 `$order_id` 和 `$transaction_id` 并执行退款/入库,未体现支付平台签名验证逻辑,易受伪造回调攻击导致资损。 | 在方法入口处增加支付网关签名校验,校验失败直接返回并记录日志。 | `if (!$this->verify_pay_sign($this->input->post())) {<br> doLog('支付回调签名验证失败', 'pay_callback');<br> return ['status' => false, 'msg' => '签名错误'];<br>}` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`get_list` 方法 | **N+1 查询性能瓶颈**:在 `foreach` 循环中调用 `$this->ahead_merchant_model->get_one()`,订单量增大时将导致数据库连接数飙升与响应延迟。 | 提取所有 `merchant_id`,使用 `where_in` 批量查询后构建映射数组。 | `$ids = array_column($order_info, 'merchant_id');<br>$merchants = $this->ahead_merchant_model->where_in('_id', $ids)->get()->result_array();<br>$merchant_map = array_column($merchants, '_business_model', '_id');<br>foreach ($order_info as &$v) { $v['business_model'] = $merchant_map[$v['merchant_id']] ?? '1'; }` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php`<br>全局静态属性 | **静态缓存潜在内存泄漏/脏数据**:大量使用 `self::$shop_data`、`self::$date_room_book_time_info` 等静态属性缓存。在 PHP-FPM 下虽随请求重置,但在 CLI 任务、Swoole/Workerman 长连接或单元测试中极易引发内存溢出或数据串扰。 | 改为实例属性(`private $xxx = []`),或统一使用 CI Cache 驱动(Redis/Memcached)管理。 | `private $shop_data = [];<br>// 在方法中通过 $this->shop_data 读写,避免跨请求污染。` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`send_success_msg` 方法 | **敏感信息日志泄露**:`doLog('支付失败' . json_encode($e->getTrace(), 256), 'book_order')` 会打印完整堆栈,可能暴露服务器路径、数据库结构或内部配置。 | 仅记录异常消息与关键业务标识,堆栈信息应脱敏或仅输出到调试环境。 | `doLog('支付失败: ' . $e->getMessage() . ' | OrderID: ' . ($order_data['_id'] ?? 'unknown'), 'book_order');` |
| 🟡 建议 | 全局 | **魔法数字泛滥**:状态码 `-1, 1, 2, 3, 4, 5`、支付平台 `1, 3, 14`、时间常量 `3600, 86400` 硬编码在业务逻辑中,可读性与可维护性差。 | 提取为类常量或独立配置文件,统一维护。 | `const STATUS_PENDING = -1; const STATUS_PAID = 1; const REFUND_LIMIT_HOURS = 1;` |
| 🟡 建议 | `Ahead_book_order_model.php`<br>文件顶部 | **CI 实例获取位置不当**:`$CI = &get_instance();` 放在类外部,每次 `include` 该文件都会执行一次,违反 CI 生命周期规范且浪费性能。 | 移至构造函数或具体方法内部按需获取。 | `public function __construct() {<br> parent::__construct();<br> $this->ci = &get_instance();<br>}` |
| 🟡 建议 | 全局 | **冗余代码与过时注释**:存在大量注释掉的代码块(如 `send_success_msg` 中的旧版短信逻辑)及带人名的历史注释(`//add by nan 18.1.22`)。 | 使用 Git 管理历史,清理无用注释,保持代码库整洁。 | 直接删除 `/* ... */` 及 `//add by...` 注释块。 |
---
## 3. 总结与行动建议
### 🔑 优先修复项(P0/P1)
1. **修复 SQL 拼接漏洞**:立即将 `refund_by_notify` 中的 `$log_where` 和 `$log_up` 字符串拼接替换为 CI Query Builder 链式调用,彻底阻断注入路径。
2. **规范事务管理**:统一使用 `$this->db->trans_begin()` / `trans_commit()` / `trans_rollback()` 显式控制事务,避免与 CI 自动事务机制冲突导致数据不一致。
3. **补充支付回调验签**:在 `check_notify` 入口增加支付平台签名校验逻辑,确保回调请求来源合法后再执行订单状态变更。
### 🛠 后续重构与优化方向
1. **架构解耦**:当前 Model 承载了过多业务逻辑(支付、退款、短信、微信模板消息、库存扣减)。建议将支付网关交互、消息推送、库存校验抽离至独立的 `Service` 层,Model 仅负责数据持久化。
2. **性能治理**:
- 消除 `get_list` 等方法的循环查询,全面采用批量查询+内存映射。
- `Ahead_shop_book_time_info_model` 中的时间区间计算逻辑极其复杂,建议引入 `DateInterval` 或专业时间处理库(如 `nesbot/carbon`),并将高频计算结果缓存至 Redis。
3. **规范与可维护性**:
- 建立项目级常量文件(如 `application/config/constants.php`)统一管理状态码、支付渠道、时间阈值。
- 统一错误处理机制,避免混用 `return ['status'=>false]` 与 `throwError()`,建议封装统一的 `ApiResponse` 类。
4. **框架适配提示**:若项目计划升级至 CI4 或迁移至现代框架(如 Laravel/Symfony),当前大量依赖 `$CI =& get_instance()` 和全局静态缓存的代码将面临较大重构成本。建议尽早向依赖注入(DI)与实例化设计模式靠拢。
> ⚠️ **局限性说明**:提供的代码片段在 `create_community_shop_book_order` 与 `get_book_day_time_info` 方法末尾被截断,部分边界条件处理、异常捕获及完整事务链路未能全面评估。建议补充完整代码或提供对应方法的上下文以便进行深度复核。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780315401
|
1780315401
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
446
|
21
|
161
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `5d1687ffb ## 自动代码审查报告
**分支**: pay-260616
**提交**: `5d1687ffb7e751baa60b13d4a503086d9ee7e658`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-01 20:03:38
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了较为复杂的包厢预订时间窗口计算逻辑,业务覆盖全面。但存在**严重的状态管理缺陷**(静态缓存未区分参数、实例属性被意外污染)、**方法职责过重**(单方法超 300 行)、**性能隐患**(重复加载模型、数组操作冗余)及**规范缺失**(魔法值硬编码、缺乏类型声明)。整体可维护性与健壮性较低,需重点重构。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info()` 方法开头 | **静态缓存键缺失**:`self::$book_days_info` 未将 `$merchant_id`、`$shop_id`、`$check_date` 等参数纳入缓存键。首次调用后,后续不同商户/门店的请求将直接返回脏数据,导致业务逻辑错乱。 | 使用参数组合生成唯一缓存键,或移除静态缓存改为实例级/Redis缓存。 | `private static $book_days_info = [];`<br>`$cache_key = "{$merchant_id}_{$shop_id}_{$check_date}_{$add_day}";`<br>`if (isset(self::$book_days_info[$cache_key])) return self::$book_days_info[$cache_key];`<br>`// ... 计算逻辑 ...`<br>`return self::$book_days_info[$cache_key] = $result;` |
| 🔴 严重 | `get_book_days_info()` 方法内 | **实例状态污染**:`$this->book_days += 1;` 直接修改了类属性。在 CI 等框架中模型对象常被复用,多次调用 `$add_day=true` 会导致天数无限累加,引发后续时间计算越界。 | 使用局部变量进行计算,严禁在业务方法中直接修改核心配置属性。 | `$calc_days = $this->book_days + ($add_day ? 1 : 0);`<br>`for ($i = 0; $i < $calc_days; $i++) { ... }` |
| 🔴 严重 | `get_book_day_time_info()` 方法内 | **空数组展开致命错误**:`array_intersect(...array_values($all_room_book_time))` 当 `$all_room_book_time` 元素数量 `<2` 时,PHP 8+ 会抛出 `ArgumentCountError` 致命错误。 | 增加元素数量校验,或使用 `array_reduce` 安全求交集。 | `$room_times = array_values($all_room_book_time);`<br>`if (count($room_times) >= 2) {`<br>` $un_book_time = array_intersect(...$room_times);`<br>`} else {`<br>` $un_book_time = $room_times[0] ?? [];`<br>`}` |
| 🟠 警告 | `get_book_day_time_info()` 方法 | **违反单一职责原则**:该方法超 300 行,混合了日期校验、配置加载、时间区间计算、套餐规则校验、状态标记等逻辑。极难单元测试,且后续迭代极易引入回归 Bug。 | 拆分为独立的服务类(如 `BookingTimeCalculator`),按职责分离:数据获取、时间计算、规则校验。 | 提取 `calculateAvailableTimeSlots()`, `validatePackageRules()`, `mergeUnavailableRanges()` 等私有方法或独立类。 |
| 🟠 警告 | 全局多处 | **依赖重复加载与性能损耗**:频繁调用 `$CI = &get_instance();` 及 `$this->load->model()`。在循环或高频请求中会造成不必要的 I/O 开销与内存分配。 | 在 `__construct()` 中统一预加载依赖,或使用依赖注入容器。若 `phpci` 支持,建议通过构造函数注入。 | `public function __construct() {`<br>` parent::__construct();`<br>` $this->load->model(['ahead_shop_config_second_model', 'ahead_family_servers_model', 'ahead_room_discontinue_rule_model']);`<br>`}` |
| 🟠 警告 | 类属性定义区 | **内部状态暴露**:大量计算中间态属性(如 `$book_time_limit_un_book_time`, `$next_un_book_time`)声明为 `public`,易被外部控制器意外覆盖,破坏封装性。 | 改为 `private` 或 `protected`,必要时提供只读 `getter` 方法。 | `private $book_time_limit_un_book_time = [];`<br>`public function getBookTimeLimitUnBookTime(): array { return $this->book_time_limit_un_book_time; }` |
| 🟡 建议 | 全局多处 | **魔法值硬编码**:大量使用 `'1'`, `'-1'`, `'merchantApp'`, `'7'` 等字符串/数字,降低可读性且易出错。 | 使用类常量或 PHP 8.1+ 枚举(Enum)定义业务状态。 | `const STATUS_AVAILABLE = '1';`<br>`const STATUS_UNAVAILABLE = '-1';`<br>`const REQUEST_SOURCE_MERCHANT_APP = 'merchantApp';` |
| 🟡 建议 | `set_shop_config()` 与 `set_room_info()` | **代码重复**:两个方法中场景判断 (`billiards_`, `card_`, `tavern_`) 与配置加载逻辑高度一致。 | 提取私有辅助方法复用逻辑。 | `private function getScenePrefix($scene): string {`<br>` return match($scene) { '2' => 'billiards_', '3' => 'card_', '4' => 'tavern_', default => '' };`<br>`}` |
| 🟡 建议 | 全局方法签名 | **缺乏类型声明**:未使用 PHP 7+ 类型提示,降低 IDE 支持度与静态分析能力。 | 为参数和返回值添加严格类型声明,开启 `declare(strict_types=1);`。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **修复缓存与状态污染**:立即修正 `self::$book_days_info` 的缓存键逻辑,并将 `$this->book_days += 1` 改为局部变量计算。这两个问题在生产环境中极易引发**数据错乱与越界预订**。
2. **防御性编程**:为 `array_intersect(...)`、`explode('-')`、`json_decode()` 等易崩溃操作增加前置校验与默认值处理,避免线上 Fatal Error。
3. **依赖预加载**:将分散在方法中的 `$this->load->model()` 收敛至构造函数,减少运行时开销。
### 🛠 后续重构与优化方向
1. **架构拆分(SRP 落地)**:将 `get_book_day_time_info` 拆分为 `DataFetcher`(获取门店/包厢/预订数据)、`TimeCalculator`(计算可用/不可用时间窗)、`RuleValidator`(校验套餐/营业/停用规则)。通过组合模式或策略模式注入,提升可测试性。
2. **缓存策略升级**:当前静态缓存仅适用于单次请求。建议引入 Redis 缓存层,以 `book_time:{merchant_id}:{shop_id}:{date}` 为键,设置合理 TTL,避免长连接/CLI 环境下的内存泄漏。
3. **规范与现代化**:
- 全面启用 PHP 8 特性(类型声明、Match 表达式、命名参数)。
- 遵循 PSR-12 规范,统一缩进、空格与注释格式。
- 使用常量/枚举替代魔法值,提升代码自解释能力。
4. **框架适配说明**:代码呈现典型的 CodeIgniter 3 风格(`$CI = &get_instance()`、`$this->load->model()`)。若 `phpci` 为定制框架或已升级至 CI4,建议逐步迁移至**依赖注入(DI)与服务容器**模式,移除全局实例引用,以符合现代 PHP 框架最佳实践。具体组件加载方式请查阅 `phpci` 官方文档。
> 💡 **局限性说明**:本次审查基于提供的单文件代码片段。部分全局函数(如 `throwError`, `mergeTimeRanges`, `timeToHour` 等)及父类 `Simple_model` 的实现未提供,可能影响对完整调用链与异常处理机制的评估。建议补充相关上下文以便进行更精准的静态分析与性能剖析。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780315418
|
1780315418
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
447
|
22
|
50
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `968ac094f ## 自动代码审查报告
**分支**: app-260616
**提交**: `968ac094f22bcb20643193e3370a6e503bce9135`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 10:01:39
---
## 1. 审查摘要
- **代码质量评分**:4/10 分
- **总体评价**:该模型类承载了大量核心订单查询、报表统计与分页逻辑,业务覆盖面广。但代码存在**严重的 SQL 注入风险**、**硬编码敏感信息**、**分页逻辑重复造轮子**及**模型职责过重**等问题。整体风格偏向早期 PHP 开发模式,未遵循现代 PSR-12 规范与框架最佳实践,可维护性与安全性亟待提升。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据代码结构(`$CI =& get_instance()`、`$this->load->model()`、`system/` 目录规范等),该代码实际基于 **CodeIgniter 3** 框架。若确为内部定制版 `phpci` 框架,请对照其官方文档调整底层组件调用方式。以下审查基于 CI3 标准及通用 PHP 最佳实践。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 多处(如 `get_order_manage`, `get_consumption_trend_data`, `cjy_get_other_order_info` 等) | **SQL 注入漏洞**:大量使用 `$addsql`、`$shop_ids` 直接拼接 SQL 字符串,未做参数绑定或白名单过滤。攻击者可传入恶意闭合语句执行任意 SQL。 | 1. 废弃字符串拼接,全面改用 CI3 Query Builder (`$this->db->where()`, `where_in()`)。<br>2. 若必须使用原生 SQL,严格使用 `?` 占位符。<br>3. 在 Controller 层对传入参数进行类型强校验。 | `$this->db->where_in('_shop_id', array_map('intval', explode(',', $shop_ids)));`<br>`$this->db->where($validated_addsql_array);` |
| 🔴 严重 | 第 23 行 | **敏感信息硬编码**:加密串 `public $encrypt = "Vs!Fs7VT";` 直接暴露在类属性中,易随代码库泄露或被反编译获取。 | 移至 `application/config/config.php` 或环境变量,通过配置项读取。 | `// config.php<br>$config['order_encrypt_key'] = 'Vs!Fs7VT';`<br>`// Model内<br>$this->config->item('order_encrypt_key');` |
| 🟠 警告 | `get_business` 方法 | **除零异常风险**:`$sum = array_sum(...)` 可能为 `0`,后续 `$tmp['actual_pay'] / $sum` 将触发 `DivisionByZeroError` 或返回 `NaN`。 | 增加安全除法判断,或使用 `bcdiv` 处理浮点精度。 | `if ($sum > 0) { $tmp['percent'] = number_format($tmp['actual_pay'] / $sum, 4) * 100; } else { $tmp['percent'] = 0; }` |
| 🟠 警告 | 文件顶部 & 全局 | **框架生命周期误用**:文件顶部直接调用 `$CI =& get_instance(); $CI->load->model('Simple_model');` 违反 CI 依赖加载规范,易导致内存泄漏或实例冲突。 | 移除全局 `$CI` 调用,在 `__construct()` 中按需加载依赖。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟠 警告 | `set_page_info`, `get_page_info`, `cjy_get_page_info` | **重复造轮子(分页逻辑)**:多处手写分页计算,状态判断(`over_page`/`last_page`)不一致,且未利用框架内置组件,维护成本极高。 | 统一使用 CI3 `Pagination` 库,或封装独立 `PaginationService`。 | `$this->load->library('pagination'); $this->pagination->initialize($config); $data['links'] = $this->pagination->create_links();` |
| 🟡 建议 | 全文 | **返回类型不一致**:部分方法返回 `array`,部分返回 `false`,部分返回 `-1`,部分直接返回 `json_encode()` 字符串。增加调用方处理成本。 | 统一返回结构化数组,**JSON 序列化应移至 Controller/View 层**。 | `return ['status' => true, 'data' => $result, 'msg' => ''];` |
| 🟡 建议 | `get_consumption_trend_data` 等 | **日期处理缺乏边界校验**:直接使用 `strtotime()` 转换外部日期,若格式非法将返回 `false`,导致 SQL 语法错误或逻辑异常。 | 增加日期格式校验,或使用 `DateTimeImmutable` 处理。 | `if (!strtotime($start_date)) { throw new InvalidArgumentException('Invalid start_date format'); }` |
| 🟡 建议 | 全文 | **不符合 PSR-12 规范 & 违反单一职责**:方法过长(如 `cjy_get_other_order_info` 超 80 行),变量命名混用下划线与驼峰,注释陈旧。 | 遵循 PSR-12,拆分大方法为独立私有方法,使用 PHP 7.4+ 类型声明。 | `public function getOrderInfo(int $merchantId, string $orderId = ''): array` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即修复 SQL 注入**:全局排查 `$addsql`、`$shop_ids`、`$_order_id` 等外部参数拼接点,替换为 Query Builder 或参数化查询。这是当前最高危的安全漏洞。
2. **移除硬编码密钥**:将 `$encrypt` 迁移至配置文件或环境变量,避免敏感信息随版本控制系统泄露。
3. **统一数据返回格式**:废除模型层直接返回 `json_encode()` 或混合返回 `false/-1` 的做法,统一使用 `['code' => 0, 'data' => [], 'msg' => '']` 结构,由 Controller 层负责序列化。
### 🛠 后续重构与优化方向
1. **模型职责拆分(SRP)**:当前 `Ahead_yc_order_model` 承担了订单查询、报表统计、分页计算、退款调用、权限校验等职责。建议拆分为:
- `OrderRepository`:专注数据查询与构建
- `OrderReportService`:专注统计与聚合逻辑
- `OrderRefundService`:专注支付退款流程
2. **全面拥抱 Query Builder**:逐步替换原生 SQL。CI3 的 Query Builder 已足够应对复杂查询,且能自动防注入、支持缓存、便于单元测试。
3. **性能优化策略**:
- 移除手动 `force index`,通过 `EXPLAIN` 分析慢查询并建立复合索引。
- 报表类查询建议引入读写分离或定时任务预聚合(如 ClickHouse/ES 或 MySQL 汇总表),避免实时 `GROUP BY` 拖垮主库。
- 避免在循环或高频方法中重复调用 `strtotime()` 或 `load->model()`。
4. **代码规范升级**:
- 启用 PHP-CS-Fixer 自动格式化至 PSR-12。
- 为所有公开方法添加 `@param`、`@return` 类型声明,逐步迁移至 PHP 8.1+ 的强类型语法。
- 清理 2016 年遗留注释,改用 PHPDoc 规范。
> ⚠️ **局限性说明**:您提供的代码在 `get_goods_sales` 方法末尾被截断(`$this->ahead_yc_merchant_user_model->get_one(['_id' => $para`)。若该方法涉及复杂联表或动态条件拼接,可能存在与上述相同的注入或逻辑隐患,建议补充完整代码后二次审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780365699
|
1780365699
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
448
|
21
|
162
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `b6a3e45d9 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `b6a3e45d9d19643b2f7e246d9fb2b6ff14c40f18`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 10:04:48
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该 Model 承载了复杂的订单查询、账单聚合与状态流转逻辑,业务覆盖全面。但存在明显的 **SQL 注入风险**、**N+1 查询性能瓶颈**、**方法职责过重** 以及 **框架使用不规范** 等问题。硬编码与魔法数字泛滥,可维护性与扩展性较低。
- **风险等级**:🔴 高
> 📌 **框架适配说明**:代码中大量使用 `get_instance()`、`$this->load->model()`、`select()`、`get_one()` 等语法,高度符合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,请确保以下优化建议与框架底层兼容。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_bill_goods_info` (~L285) | **SQL 注入风险**:直接拼接 `$unique_key` 与时间戳到 SQL 字符串中,未做转义或参数绑定。 | 使用框架查询构造器或参数绑定,严禁字符串拼接。 | `$this->db->where('_unique_key', $unique_key)->where_in('_status', [1,4])->where('_timestamp >', time() - 7*86400)->get($this->table_name)->result_array();` |
| 🔴 严重 | `get_list` / `get_detail` (~L115-145, L190-210) | **N+1 查询性能瓶颈**:在 `foreach` 循环中反复 `load->model()` 并执行 `get_one()`,数据量稍大即导致数据库连接耗尽与响应超时。 | 收集所有关联 ID 后使用 `WHERE IN` 批量查询,或在主查询中使用 `JOIN`,再在内存中映射关联数据。 | `$ids = array_column($order_info, 'package_id'); $packages = $this->db->where_in('_id', $ids)->get('ahead_room_package')->result_array(); $map = array_column($packages, null, '_id');` |
| 🔴 严重 | `encode_group_buying_order` (~L435) | **弱加密与密钥硬编码**:使用已淘汰的 `md5()` 生成签名,且加密串直接写在类属性中,易被逆向或碰撞伪造。 | 改用 `hash_hmac('sha256', ...)`,密钥移至配置文件或环境变量。 | `return hash_hmac('sha256', $order_id, config_item('order_sign_key'));` |
| 🟠 警告 | 文件顶部 (~L4-L5) | **框架生命周期违规**:在类外部直接调用 `get_instance()` 并加载模型。文件被 `include` 时即执行,破坏框架单例与自动加载机制。 | 移除顶部代码,将模型加载移至构造函数或按需调用。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟠 警告 | `get_bill_goods_info` (~L260-L450) | **上帝方法/逻辑臃肿**:单方法超 300 行,混合了金额计算、商品聚合、退款处理、特殊平台判断,违反单一职责原则。 | 拆分为独立计算类(如 `OrderBillCalculator`),按订单类型提取私有方法处理。 | 创建 `class OrderBillAggregator`,将 `price_total`、`goods_merge` 等逻辑抽离,Model 仅负责数据获取。 |
| 🟠 警告 | 全局多处 | **魔法数字泛滥**:大量直接使用 `1`, `10`, `14` 等数字判断状态/支付方式,虽定义了部分常量但未统一使用。 | 全面替换为类常量,提升可读性与防错能力。 | `if ($order['_pay_platform'] == self::ORDER_AFTER_PAY_PAYPLATFORM) { ... }` |
| 🟡 建议 | `get_bill_goods_info` (~L295) | **调试残留代码**:存在 `if (1) {` 死代码块,影响代码整洁度。 | 移除无用条件判断,保留核心逻辑。 | 直接删除 `if (1) {` 及对应闭合括号。 |
| 🟡 建议 | 类属性定义 (~L15-L45) | **常量与属性重复**:`$pay_platform_arr` 与 `const ORDER_PAY_PLATFORM_ARR` 内容高度重合,且命名风格不统一(下划线 vs 驼峰)。 | 统一使用 `const` 定义映射表,或移至 `config/order.php` 配置文件中。 | `const PAY_PLATFORM_MAP = [1 => '微信支付', 2 => '支付宝', ...];` |
| 🟡 建议 | `confirm_receipt` / `binding_order_check` | **错误处理不规范**:依赖全局函数 `throwError()`,且各方法返回格式不一致(部分返回数组,部分直接中断)。 | 采用标准 `Exception` 或框架统一响应格式,保持接口契约一致。 | `throw new \InvalidArgumentException('订单不存在');` |
## 3. 总结与行动建议
### 🔑 优先修复项(P0/P1)
1. **修复 SQL 注入漏洞**:立即将 `get_bill_goods_info` 中的原始 SQL 拼接替换为查询构造器或参数绑定,这是最高安全风险。
2. **消除 N+1 查询**:重构 `get_list` 与 `get_detail` 中的循环查询逻辑,改为批量查询或 `JOIN`,预计可提升列表接口性能 5~10 倍。
3. **升级签名算法**:废弃 `md5`,采用 `hash_hmac` + 配置化密钥,防止团购核销接口被恶意伪造。
### 🛠 后续重构方向
1. **拆分巨型方法**:`get_bill_goods_info` 已严重超出合理长度。建议引入 **策略模式** 或 **计算服务类**,按 `pay_platform` 和 `type` 拆分账单聚合逻辑,降低圈复杂度。
2. **统一数据契约**:定义统一的 `OrderDTO` 或返回结构,规范 `code/msg/data` 格式,避免前端适配混乱。
3. **配置化管理**:将订单状态、支付方式、场景映射等硬编码数组全部迁移至 `config/` 目录或数据库字典表,便于运营动态调整。
4. **框架规范对齐**:遵循 CI/PHP 最佳实践,模型仅负责数据访问,业务逻辑应下沉至 `Service` 层;构造函数中统一加载依赖模型。
> ⚠️ **局限性说明**:提供的代码在 `get_timing_order` 方法末尾被截断,未能审查完整逻辑。若该方法涉及敏感数据查询或状态更新,请补充完整代码以便进行二次深度审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780365888
|
1780365888
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
449
|
21
|
163
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 自助转房
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `cca7cf312 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `cca7cf312430664913047350139e806b3f97f518`
**提交人**: linyangrui (yangruilin888@gmail.com)
**时间**: 2026-06-02 10:12:16
---
## 📋 审查摘要
- **变更文件数**: 4
- **严重问题**: 1
- **高危问题**: 3
- **中危问题**: 3
- **建议优化**: 4
## 🐛 发现的问题
### <font color="red">[跨文件调用] 调用了不存在的 OrderModel 和 CabinetModel 类</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 第 3-4 行
- **问题描述**: 代码中通过 `import {OrderModel} from '../../../models/order.js'` 和 `import {CabinetModel} from '../../../models/cabinet.js'` 引入了两个模型,但在提供的项目结构及变更文件中均未找到这两个文件的定义。若文件实际不存在,将直接导致模块加载失败、页面白屏。
- **修复建议**: 确认 `order.js` 和 `cabinet.js` 是否已存在于 `models/` 目录下。若未创建,需补充对应文件;若已废弃,请移除相关 `import` 及实例化代码。
### <font color="red">[语法错误] 未处理空值导致潜在 TypeError 崩溃</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 第 38 行
- **问题描述**: `const uid = wx.getStorageSync('userInfo').uid || ''` 直接访问了 `userInfo` 的 `uid` 属性。当本地缓存中不存在 `userInfo`(返回 `null` 或 `undefined`)时,会抛出 `TypeError: Cannot read properties of null (reading 'uid')`,导致 `onLoad` 生命周期中断。
- **修复建议**: 使用可选链操作符或安全取值:`const uid = wx.getStorageSync('userInfo')?.uid || ''`
### [安全隐患] URL 参数未编码导致路由解析错误
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 第 118、155、188、205 行等多处
- **问题描述**: 多处 `wx.navigateTo` 拼接路由 URL 时,直接使用字符串拼接动态参数(如 `voucher_name`, `msg`, `shelf_name` 等)。若参数值中包含 `&`、`?`、`#`、`=` 或特殊字符/中文,会导致 URL 参数截断、键值对错位或路由解析失败。
- **修复建议**: 对所有动态参数使用 `encodeURIComponent()` 进行编码。例如:
```javascript
url: `/pages/community-reserve/apply-refund/apply-refund?order_id=${this.data.order_id}&actual_pay=${this.data.order_detail.actual_pay}&voucher_name=${encodeURIComponent(this.data.order_detail.voucher_name)}&voucher_can_refund=${this.data.order_detail.voucher_can_refund}`
```
### [逻辑 BUG] API 响应未做空值防御导致潜在崩溃
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 第 58-60 行、第 135-140 行
- **问题描述**: `getOrderDetail` 和 `handleOpenMachineResult` 方法中直接访问 `res.result.xxx`。若后端接口异常、网络超时或返回格式不符合预期(如 `res` 为 `{code: 500, msg: 'error'}`),`res.result` 将为 `undefined`,后续的属性访问(如 `res.result.refund_time_limit`)会直接抛出 TypeError 导致页面崩溃。
- **修复建议**: 在访问 `res.result` 前增加安全校验,或使用可选链:
```javascript
if (!res || !res.result) {
wx.showToast({ title: '数据加载失败', icon: 'none' });
return;
}
// 或统一使用 res?.result?.xxx
```
### [跨文件调用] 后端接口 URL 存在拼写错误风险
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/models/reserve.js`
- **行号**: 第 385 行、第 398 行
- **问题描述**: `getRoomPackgeTimePriceInfo` 和 `openRoomCheckPackageTime` 方法请求的 URL 分别为 `hz/Book/getRoomPackgeTimePriceInfo` 和 `hz/Book/openRoomCheckPakcageTime`。其中 `Packge` 和 `Pakcage` 明显为 `Package` 的拼写错误。若后端路由未做兼容,将直接返回 404。
- **修复建议**: 与后端开发确认接口路径。若确为拼写错误,请统一修正为 `Package`;若后端已按此错误路径发布,建议在代码注释中明确标注“历史遗留拼写,需与后端保持一致”。
### [代码质量] data 对象中存在重复定义的属性
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 第 28 行
- **问题描述**: 在 `Page` 的 `data` 对象中,`showCancelBtn: false` 被连续定义了两次。虽然 JavaScript 引擎会以后面的值覆盖前面的值,但这属于冗余代码,容易在后续维护中引发状态覆盖的误解。
- **修复建议**: 删除重复的 `showCancelBtn: false` 定义,保持 `data` 结构清晰。
### [逻辑 BUG] 异常情况下 Loading 状态未正确关闭
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 第 55、70 行
- **问题描述**: 在调用 `wx.showLoading()` 后,完全依赖 `reserveModel` 内部封装的 `complete` 回调来执行 `wx.hideLoading()`。若请求在 `complete` 触发前发生同步异常,或 `HTTP` 基类未正确捕获所有错误路径,Loading 遮罩将永久停留在页面上,阻塞用户操作。
- **修复建议**: 建议在发起请求前使用 `try...catch`,或在 `reserve.js` 的 `HTTP` 基类中确保 `fail` 和 `complete` 逻辑能覆盖所有异常分支。也可在页面层增加兜底逻辑。
## ✅ 代码亮点
1. **模块化设计良好**:`reserve.js` 将网络请求高度封装,业务逻辑与数据请求分离,符合 MVVM 架构规范,便于后续维护和单元测试。
2. **状态管理清晰**:`order-detail.js` 的 `data` 对象对弹窗状态(如 `showScanPop`, `showConfirm`, `showChangeRoomPop`)进行了集中管理,配合 `setData` 更新,符合微信小程序最佳实践。
3. **用户体验细节到位**:针对“未清扫开房”、“提前开机”、“碎片时段推荐”等复杂业务场景,提供了完整的交互分支和提示文案,逻辑闭环较为完整。
## 📝 总体建议
1. **强化防御性编程**:小程序端极易受网络波动和后端数据结构变更影响。建议在所有 API 回调入口处统一增加 `if (!res || res.code !== 200) return;` 的校验逻辑,避免空指针异常。
2. **统一路由参数处理**:建议封装一个全局的 `navigateTo` 工具函数,自动对传入的 `query` 对象进行 `encodeURIComponent` 处理,彻底杜绝 URL 拼接带来的安全隐患。
3. **完善错误边界**:当前代码在 `error` 回调中仅做了 `console.log(err)`。建议接入全局错误上报系统(如 Sentry 或自研监控),并在 UI 层给予用户明确的“网络异常/重试”提示,提升产品健壮性。
4. **依赖文件核对**:请重点确认 `models/order.js` 和 `models/cabinet.js` 的实际存在性。跨文件引用是本次审查中最高优先级的风险点,务必在构建/发布前验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780366336
|
1780366336
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
450
|
22
|
51
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 1
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `900258a12 ## 自动代码审查报告
**分支**: app-260519
**提交**: `900258a1291f0558e08644cef69b1313517a8ea8`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 10:14:39
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务逻辑覆盖较完整,能处理复杂的预订、退款、开房及多支付渠道场景。但代码存在明显的“上帝类”倾向,方法冗长、职责混杂;事务边界管理不严谨,存在 SQL 拼接隐患与 N+1 查询性能瓶颈;魔法数字泛滥,可维护性与扩展性较弱。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 文件顶部 (1-3行) | 在类外部直接执行 `$CI = &get_instance();` 并加载模型。每次 `include/require` 该文件都会执行,易导致重复加载、上下文污染或内存泄漏。 | 移至类的 `__construct()` 构造函数中,或使用框架的自动加载机制。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🔴 严重 | `refund_by_notify` 约第108行 | `$log_where` 使用字符串拼接构造 SQL 条件:`'_relation_id="' . $order_data['_id'] . '" and ...'`。若 `_id` 未严格校验,存在 SQL 注入风险,且违背框架查询构建器规范。 | 使用框架提供的查询构建器或参数绑定,彻底杜绝字符串拼接 SQL。 | `$this->db->where('_relation_id', $order_data['_id'])->where('_status', 1)->where_in('_type', [5, 13]);` |
| 🔴 严重 | `invalid_book` / `openRoomByCommunityOrder` / `notifyCommunityBookOrder` | **事务嵌套与手动回滚冲突**。CI 架构下事务通过计数器管理,在已开启事务的方法中调用含 `trans_start/rollback` 的子方法,或手动调用 `trans_rollback()`,极易破坏事务计数器,导致数据不一致或提前提交。 | 统一事务边界。仅在顶层业务方法开启事务,子方法仅返回状态或抛出异常,不直接操作事务生命周期。 | 顶层使用 `try { $this->db->trans_start(); ... $this->db->trans_complete(); } catch(\Exception $e) { $this->db->trans_rollback(); throw $e; }` |
| 🟠 警告 | `get_list` / `get_detail` 循环体 | **N+1 查询性能瓶颈**。在 `foreach` 中循环调用 `$this->ahead_yc_order_model->get_one()` 获取关联数据,数据量增大时将引发严重数据库压力。 | 收集所有关联 ID,使用 `where_in` 批量查询,或在主查询中使用 `JOIN` 一次性拉取,再在内存中映射。 | `$ids = array_column($order_info, 'relation_order_id'); $orders = $this->ahead_yc_order_model->where_in('_id', $ids)->get()->result_array();` |
| 🟠 警告 | 全局多处 | **魔法数字泛滥**。大量使用 `1,2,3,4,5,8,9,14,17` 等硬编码表示状态、支付渠道、业务模式,可读性差且极易因版本迭代引发逻辑错乱。 | 提取为类常量或独立配置类,统一命名管理。 | `const STATUS_PAID = 1; const PAY_PLATFORM_WX = 1; const BUSINESS_MODEL_COMMUNITY = 2;` |
| 🟡 建议 | `refund_by_notify` / `openRoomByCommunityOrder` | **违反单一职责原则 (SRP)**。单个方法超过 150 行,混合了状态更新、外部 API 调用、日志记录、消息推送、打印机控制等逻辑,难以测试与维护。 | 按业务域拆分。将退款、订单创建、通知推送、硬件交互等抽取为独立 Service 类或私有方法。 | 创建 `RefundService::process()`, `OrderNotifyService::send()`, `PrinterService::print()` 等。 |
| 🟡 建议 | 全局多处 | **松散比较与类型不严谨**。如 `$is_refund == '1'`、`$invalid_type != '4'`,PHP 松散比较易引发隐式类型转换漏洞。 | 统一使用严格比较 `===`,并在方法入口进行类型断言或强制转换。 | `if ((int)$is_refund === 1)` 或 `if ($invalid_type !== '4')` |
| 🟡 建议 | 全局多处 | **模型重复加载**。多处重复调用 `$this->load->model(...)`,增加框架解析开销。 | 高频依赖模型在构造函数中统一加载,或配置自动加载。 | `public function __construct() { parent::__construct(); $this->load->model(['model_a', 'model_b']); }` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复 SQL 拼接隐患**:立即将 `refund_by_notify` 中的 `$log_where` 字符串拼接替换为查询构建器或参数绑定,杜绝注入风险。
2. **重构事务管理**:梳理 `invalid_book`、`openRoomByCommunityOrder` 及其调用链的事务边界。移除子方法中的 `trans_start/rollback`,统一在顶层使用 `try-catch` 包裹事务,确保异常时能正确回滚。
3. **消除 N+1 查询**:对 `get_list` 和 `get_detail` 中的循环查询进行批量优化,使用 `JOIN` 或 `where_in` 批量获取关联数据,降低数据库 IO 压力。
### 🛠 后续重构与优化方向
1. **架构拆分**:当前 Model 承担了过多 Controller/Service 的职责。建议引入 Service 层处理复杂业务流(如退款、开房、通知),Model 层仅负责数据持久化与基础查询。
2. **常量/枚举化**:建立全局状态字典或配置类,替换所有魔法数字。可结合 PHP 8.1+ 的 `enum` 特性(若环境支持)提升类型安全。
3. **统一异常处理**:当前混用 `throwError()` 与 `try-catch`。建议统一使用标准 `Exception` 或框架内置异常类,配合全局异常处理器返回标准化错误响应。
4. **代码规范对齐**:严格遵循 PSR-12,统一方法命名(如 `setTablename` 与 `set_table_name` 混用)、缩进与注释规范。
> 📌 **框架适配说明**:代码呈现典型的 CodeIgniter 架构特征(如 `get_instance()`、`$this->load->model()`、`$this->db->trans_start()`)。若 `phpci` 为内部定制框架,其事务计数器机制或模型加载策略可能与原生 CI 存在差异,请务必查阅 `phpci` 官方文档中关于 **事务嵌套** 与 **模型生命周期** 的说明,并据此调整上述建议。
>
> ⚠️ **局限性提示**:提供的代码在 `_add_order_data` 方法末尾截断,未能完整审查该辅助方法及后续逻辑。建议补充完整代码以便进行全链路数据流与边界条件验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780366479
|
1780366479
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
451
|
21
|
164
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `473df92ce ## 自动代码审查报告
**分支**: pay-260519
**提交**: `473df92ce3abc56c6dcc8b61b18f91afcca7a540`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 10:14:47
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:该文件承载了核心订单计价与组装逻辑,业务场景复杂。但代码存在**财务精度计算隐患、SQL注入风险、调试代码残留、重复赋值覆盖**等严重问题。方法体极度臃肿,违反单一职责原则,且大量使用魔法数字与不规范命名,可维护性与扩展性较差。
- **风险等级**:🔴 高
> 📌 **框架说明**:代码中 `defined('BASEPATH')`、`get_instance()`、`$this->CI->load->model()` 等特征高度符合 **CodeIgniter 3** 架构规范,与提示中的 `phpci` 框架可能存在差异。以下审查基于 CI3 最佳实践及现代 PHP 标准。代码末尾存在截断(`$result['have_good`),部分逻辑未完全展示,审查基于已提供内容。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | ~第380行 | **生产环境残留调试输出**:`echo $vip_upgrade_data_actual_pay;` 会破坏 HTTP 响应流,导致 JSON/XML 解析失败或前端白屏。 | 立即移除 `echo`,改用框架日志记录。 | `log_message('debug', 'VIP升级计算金额: ' . $vip_upgrade_data_actual_pay);` |
| 🔴 严重 | 全文多处 | **浮点数精度丢失风险**:金额计算直接使用 `* / +`(如 `$goods_actual_pay * $vip_discount_rate`),PHP 浮点运算易产生 `0.0000000001` 误差,财务场景致命。 | 统一使用 `bcmath` 扩展函数,并在累加/返回前严格保留2位小数。 | `$actual_pay = bcadd($actual_pay, $goods_actual_pay, 2);`<br>`$discounted = bcmul($price, $rate, 2);` |
| 🔴 严重 | ~第265行 | **SQL 注入隐患**:`"wares_package._package_id in (" . implode(",", $id_array['package_id']) . ")"` 未对输入做类型强转,恶意构造可注入 SQL。 | 强制转为整型数组,或使用 CI3 查询构造器 `where_in()`。 | `$ids = array_map('intval', $id_array['package_id']);`<br>`$pack_goods_where = "wares_package._package_id IN (" . implode(',', $ids) . ")";` |
| 🟠 警告 | ~第225-227行 | **逻辑覆盖错误**:`$order['_prime_service_charge']` 被连续赋值两次,后者 `$service_charge` 覆盖前者 `$prime_after_paid_service_charge`,导致业务数据错乱。 | 核对业务意图,删除冗余赋值,保留正确变量。 | `$order['_prime_service_charge'] = $prime_after_paid_service_charge;`<br>`// 删除下方重复的 $order['_prime_service_charge'] = $service_charge;` |
| 🟠 警告 | 全文多处 | **重复加载模型**:在循环/分支内频繁调用 `$this->CI->load->model()`,增加不必要的 I/O 与内存开销。 | 统一在 `__construct()` 或方法入口处加载,CI3 模型加载本身具备懒加载特性,无需重复调用。 | `public function __construct() {`<br>` $this->CI =& get_instance();`<br>` $this->CI->load->model(['Ahead_vip_level_model', 'Ahead_merchant_goods_model', 'Ahead_goods_price_rooms_model']);`<br>`}` |
| 🟠 警告 | ~第130行 | **魔法数字泛滥**:`100`, `-1`, `1`, `7`, `9999999999999` 等硬编码散落各处,业务规则变更时极易遗漏。 | 提取为类常量,增强语义与可维护性。 | `private const DISCOUNT_BASE = 100;`<br>`private const STATUS_DISABLED = -1;`<br>`private const MAX_REWARD_AMOUNT = 9999999999999;` |
| 🟡 建议 | 全文 | **违反 PSR-12 规范**:属性命名混用驼峰与下划线(`$supermarketRoomName` vs `$room_id`),方法带 `_` 前缀,大量 `public` 属性暴露内部状态。 | 统一使用驼峰命名,将非接口属性改为 `private/protected`,移除方法名前缀。 | `private $supermarketRoomName = '自助扫码厅';`<br>`private $roomId = 0;`<br>`private function createInsertInfosData(...)` |
| 🟡 建议 | `getOrderTypeInfo` | **方法过长且职责混杂**:单方法超 500 行,混合了商品查询、套餐计算、VIP折扣、服务费、优惠券抵扣、免单逻辑等,违反 SRP。 | 按业务域拆分为独立私有方法或策略类,如 `calculateGoodsPrice()`, `applyVipDiscount()`, `computeServiceCharge()`。 | 使用提取方法重构(Extract Method),保持单方法行数 < 80。 |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题(P0)
1. **立即删除 `echo` 调试语句**,避免线上接口响应污染。
2. **修复 SQL 注入风险**:对所有动态拼接的 `IN` 条件执行 `array_map('intval', $ids)` 过滤。
3. **修正重复赋值逻辑**:确认 `$order['_prime_service_charge']` 的正确业务含义,删除覆盖代码。
4. **引入 `bcmath` 金额计算规范**:所有涉及价格的乘除加减必须使用 `bcmul`/`bcadd`/`bcsub`,并在最终返回前统一 `round($val, 2)`。
### 🛠 后续重构与优化方向
1. **架构拆分(策略模式/职责分离)**:
- 将 `getOrderTypeInfo` 拆分为 `OrderCalculator` 服务类。
- 使用策略模式处理不同订单类型(`case '1'`, `case '2'` 等),避免巨型 `switch`。
- 示例结构:
```php
interface OrderTypeStrategy { public function calculate(array $params): array; }
class GoodsOrderStrategy implements OrderTypeStrategy { ... }
class RoomPackageStrategy implements OrderTypeStrategy { ... }
```
2. **数据校验与异常处理**:
- 使用 CI3 的 `Form_validation` 或自定义 DTO 对 `$id_array`, `$goods_quantity` 进行强类型校验。
- 将 `throwError()` 替换为抛出标准异常(如 `throw new \InvalidArgumentException(...)`),便于全局捕获与日志追踪。
3. **框架规范对齐**:
- 若确为 CI3 环境,建议将模型加载移至 `config/autoload.php` 或构造函数中。
- 数据库查询优先使用 `$this->CI->db->where_in()` 等 Query Builder 方法,彻底杜绝字符串拼接。
4. **代码规范升级**:
- 逐步引入 PHP 7+ 类型声明(如 `public function getOrderTypeInfo(string $type, array $idArray, array $goodsQuantity, int $getActualPay = -1, array &$goodsReward = []): array`)。
- 清理历史注释(如 `//add by nan 22.07.11`),改用 Git 提交记录追溯变更。
> 💡 **提示**:由于代码在末尾被截断,部分订单组装逻辑(如 `have_goods` 字段赋值、最终返回结构)未完整展示。建议在修复上述高危问题后,补充完整代码进行二次审查,并补充单元测试覆盖核心计价分支。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780366487
|
1780366487
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
452
|
21
|
165
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616 🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616' of https://gitea.g-hi.co...
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `51396af20 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `51396af20d63f5ecaa946dff708621123f051ed2`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 10:53:56
---
## 📋 审查摘要
- **变更文件数**: 5
- **严重问题**: 2
- **高危问题**: 5
- **中危问题**: 3
- **建议优化**: 4
## 🐛 发现的问题
### <font color="red">[语法错误] 模型文件顶部直接执行代码,可能导致致命错误</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 第 2-3 行
- **问题描述**: 在 PHP 类定义外部直接执行 `$CI = &get_instance();` 和 `$CI->load->model('Simple_model');`。在 CodeIgniter 框架中,模型文件被 `include/require` 时会立即执行顶层代码。如果此时 CI 核心尚未完全初始化,或该文件被自动加载器提前解析,将直接抛出 `Fatal error: Call to undefined function get_instance()` 或加载失败。
- **修复建议**: 移除文件顶层的这两行代码。模型加载应放在类的 `__construct()` 方法中,或通过 CI 的自动加载配置完成。
```php
// 删除顶部这两行:
// $CI = &get_instance();
// $CI->load->model('Simple_model');
// 在 __construct 中按需加载(如果 Simple_model 是基类,直接 extends 即可,无需 load)
public function __construct()
{
parent::__construct();
// 其他初始化逻辑...
}
```
### <font color="red">[跨文件调用] 引用了未定义的基类 Simple_model</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 第 6 行
- **问题描述**: 类声明为 `class Ahead_shop_book_time_info_model extends Simple_model`,但在提供的项目结构及变更文件中均未发现 `Simple_model.php` 或 `Simple_model` 类的定义。若该类不存在,将导致 `Class 'Simple_model' not found` 致命错误。
- **修复建议**: 确认 `application/models/Simple_model.php` 是否存在。若存在,请确保文件路径正确且命名符合 CI 规范;若不存在,请改为继承 CI 核心模型 `CI_Model`。
### <font color="red">[跨文件调用] 调用了多个未定义的全局辅助函数</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 多处(如 `throwError`, `returnWeek`, `timeToHour`, `hourToTime`, `mergeTimeRanges`, `shiftTimeRange`, `minutesToUnits`, `minToStr`, `mintoStr`, `getPrevUnitTime`)
- **问题描述**: 代码中大量使用了自定义全局函数,但提供的项目结构 `system/helpers/` 中并未包含这些函数对应的 Helper 文件。若未正确加载或定义,将触发 `Call to undefined function` 错误。
- **修复建议**:
1. 检查 `application/helpers/` 或 `system/helpers/` 中是否存在包含这些函数的自定义 Helper 文件。
2. 在控制器或自动加载配置中通过 `$this->load->helper('your_custom_helper')` 显式加载。
3. 建议将全局函数重构为静态工具类方法,提高可测试性和命名空间隔离性。
### <font color="red">[跨文件调用] 加载了未定义的 Tuangou 类库</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 第 118 行
- **问题描述**: `$this->load->library('Tuangou');` 尝试加载 `Tuangou` 类库,但项目结构 `system/libraries/` 中不存在该文件。后续代码大量调用 `$this->tuangou->...` 属性与方法,若类库缺失将导致运行时崩溃。
- **修复建议**: 确认 `application/libraries/Tuangou.php` 是否存在。若存在,请检查文件名大小写是否与 CI 加载规则一致(CI3 对大小写敏感)。若不存在,需补充该类库或移除相关调用。
### [逻辑 BUG] 静态缓存与实例属性修改产生状态污染
- **严重程度**: 高危
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 第 138-140 行 (`get_book_days_info` 方法)
- **问题描述**: 方法开头使用 `if (!empty(self::$book_days_info)) { return self::$book_days_info; }` 进行静态缓存拦截,但在后续逻辑中执行了 `$this->book_days += 1;`。静态缓存会跳过实例属性的修改,导致多次调用时 `$this->book_days` 状态不一致,且缓存返回的数据可能未包含 `add_day` 逻辑。
- **修复建议**: 移除静态缓存,或改为基于参数(如 `$check_date`, `$add_day`)的缓存键。若需保留实例状态,不应在缓存命中后直接返回。
```php
// 建议改为实例级缓存或移除静态缓存
if (empty($this->_book_days_info_cache)) {
// 计算逻辑...
$this->_book_days_info_cache = $result;
}
return $this->_book_days_info_cache;
```
### [逻辑 BUG] 前端可能触发空指针/类型错误
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 第 68 行
- **问题描述**: `const uid = wx.getStorageSync('userInfo').uid || ''`。若本地存储中 `userInfo` 为 `null`、`undefined` 或非对象类型,直接访问 `.uid` 会抛出 `TypeError: Cannot read properties of null (reading 'uid')`,导致页面白屏。
- **修复建议**: 使用可选链或安全取值。
```javascript
const userInfo = wx.getStorageSync('userInfo') || {};
const uid = userInfo.uid || '';
```
### [安全隐患] 前端 URL 参数拼接未完全过滤
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/order-detail/order-detail.js`
- **行号**: 多处 `wx.navigateTo` URL 拼接
- **问题描述**: 使用字符串拼接构建跳转 URL,如 `url: '/pages/...?order_id=' + this.data.order_id`。虽然部分参数使用了 `encodeURIComponent`,但如 `shop_id`、`room_id` 等未编码。若数据源被恶意注入特殊字符(如 `&`、`#`、`/`),可能破坏路由结构或引发参数覆盖。
- **修复建议**: 统一使用 `encodeURIComponent()` 包裹所有动态参数,或使用小程序官方推荐的 URL 构建工具函数。
### [代码质量] PHP 核心方法过长且嵌套过深
- **严重程度**: 中危
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: `get_book_day_time_info` 方法(约 150 行以上)
- **问题描述**: 该方法承担了数据查询、时间计算、状态过滤、套餐校验、跨天逻辑等过多职责。嵌套的 `if/else` 和 `foreach` 超过 5 层,圈复杂度过高,极难维护和单元测试。
- **修复建议**: 遵循单一职责原则(SRP),将逻辑拆分为独立私有方法:
- `_calculate_business_hours()`
- `_filter_unavailable_times()`
- `_validate_tuangou_constraints()`
- `_merge_time_ranges()`
## ✅ 代码亮点
1. **前端模型封装规范**:`reserve.js` 采用了清晰的 ES6 Class 继承结构,将 HTTP 请求统一封装,回调处理(success/error/complete)结构一致,便于维护。
2. **参数安全处理意识**:在 `order-detail.js` 中跳转 URL 时,对部分文本参数使用了 `encodeURIComponent`,体现了基础的安全防范意识。
3. **业务逻辑注释详细**:PHP 模型中对 `operational_scene`、`book_model` 等业务枚举值添加了清晰的注释,降低了后续开发者的理解成本。
## 📝 总体建议
1. **严格遵循 CI 框架规范**:PHP 模型文件**绝对禁止**在类外部执行框架核心方法(如 `get_instance()`、`load->model()`)。所有依赖加载必须收敛至 `__construct()` 或具体业务方法内。
2. **完善依赖与辅助函数管理**:当前代码强依赖多个未在结构中体现的类库(`Tuangou`、`Simple_model`)和全局函数。建议建立 `composer.json` 或统一的 `helpers/autoload.php` 进行依赖声明,避免“隐式依赖”导致线上崩溃。
3. **重构超长方法**:`get_book_day_time_info` 是典型的“上帝方法”。建议按“数据获取 -> 规则计算 -> 状态过滤 -> 结果格式化”的流程拆分为 4-5 个独立方法,并补充单元测试覆盖边界条件(如跨天、24小时营业、套餐时长不足等)。
4. **前端防御性编程**:小程序端对 `wx.getStorageSync`、API 返回的 `res.result` 等外部数据必须进行类型校验和空值兜底,避免弱类型语言特性引发的运行时异常。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780368836
|
1780368836
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
453
|
21
|
166
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `a06788a8f ## 自动代码审查报告
**分支**: pay-260616
**提交**: `a06788a8fe4f2bc3ce849b73dd1f28c0be458120`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 10:55:36
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的门店预订时间计算逻辑,业务覆盖全面(含跨天、套餐、团购券、清扫时间、包厢锁定等)。但代码存在**严重的静态缓存缺陷**、**实例状态污染**、**时间计算脆弱性**以及**方法过长违反单一职责原则**等问题。整体可维护性与健壮性亟待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` 方法开头 | **静态缓存未区分参数**:`self::$book_days_info` 作为静态缓存,未考虑 `$merchant_id`、`$shop_id`、`$check_date`、`$add_day` 的差异,会导致不同门店/日期请求返回脏数据。<br>**实例属性污染**:`$this->book_days += 1;` 直接修改类属性,后续调用将基于错误的基础天数计算。 | 1. 移除静态缓存或改用参数哈希作为 Key。<br>2. 禁止在方法内修改 `$this->book_days`,改用局部变量 `$days = $this->book_days + ($add_day ? 1 : 0);`。 | `private static $cache = [];<br>$key = md5(implode('_', func_get_args()));<br>if (isset(self::$cache[$key])) return self::$cache[$key];` |
| 🔴 严重 | `get_book_day_time_info` 中 `array_intersect(...array_values($all_room_book_time))` | **PHP 8+ 兼容性崩溃**:`array_intersect` 至少需要传入两个数组。当 `$room_type_room_ids` 数量为 1 时,解包操作会抛出 `ValueError` 或 `Warning`,导致接口 500。 | 增加数组数量判断,为 1 时直接赋值,大于 1 时才使用解包求交集。 | `if (count($all_room_book_time) === 1) {<br> $un_book_time = reset($all_room_book_time) ?? [];<br>} else {<br> $un_book_time = array_intersect(...array_values($all_room_book_time));<br>}` |
| 🟠 警告 | 全局多处 `strtotime`/`date` 及 `86400` 硬编码 | **跨天时间计算隐患**:大量使用 `+86400`、`-86400` 处理跨天逻辑,未考虑夏令时(DST)、闰秒或时区切换,极易在边界时间(如 23:55-00:05)产生计算偏差。 | 废弃手动秒数偏移,全面改用 `DateTime` 或 `Carbon` 进行时间运算,利用 `modify()` 和 `diff()` 保证准确性。 | `$end = (new DateTime($date))->modify('+1 day')->setTime(0,0);<br>$diff = $start->diff($end)->getTimestamp();` |
| 🟠 警告 | `json_decode($book_time_info['_time_info_new'], 1)` | **未校验 JSON 有效性**:若数据库字段损坏或为空,`json_decode` 返回 `null`,后续 `['room_book_time']` 访问将触发 `TypeError` 或 `Warning`。 | 增加 JSON 解析错误处理,或使用 PHP 7.3+ 的 `JSON_THROW_ON_ERROR` 标志。 | `$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);<br>// 或兼容写法:<br>$data = json_decode($json, true);<br>if (json_last_error() !== JSON_ERROR_NONE) { $data = []; }` |
| 🟠 警告 | `set_shop_config` / `_get_un_book_time` 中多次调用 `get_shop_setting` | **重复查询性能损耗**:同一方法内多次调用 `get_shop_setting` 获取不同配置,增加数据库/Redis 往返开销。 | 改为批量获取配置,或在模型层引入配置缓存层(如 `get_shop_settings_batch`)。 | `$keys = ['book_minute_unit', 'book_hour_options', 'book_max_days'];<br>$configs = $this->ahead_shop_config_second_model->get_shop_settings_batch($merchant_id, $shop_id, $keys);` |
| 🟡 建议 | 整个文件 | **缺乏类型声明与封装**:大量 `public` 属性暴露内部状态,方法参数无类型提示,违反 PSR-12 及现代 PHP 规范。 | 为属性添加 `private/protected` 修饰符并提供 Getter/Setter;为方法参数和返回值添加 PHP 7.4+ 类型声明。 | `private int $book_time_limit = 3600;<br>public function getBookDaysInfo(int $merchantId, int $shopId, string $checkDate = '', bool $addDay = false): array` |
| 🟡 建议 | 多处硬编码 `'1'`, `'-1'`, `'7'`, `'2'` 等 | **魔法值泛滥**:状态码、场景码、业务规则硬编码在逻辑中,可读性差且极易引发维护错误。 | 提取为类常量或枚举(PHP 8.1+),统一状态管理。 | `const SCENE_KTV = '1';<br>const SCENE_BILLIARDS = '2';<br>const STATUS_AVAILABLE = '1';<br>const STATUS_UNAVAILABLE = '-1';` |
| 🟡 建议 | `get_book_day_time_info` 方法(超 300 行) | **违反单一职责原则 (SRP)**:该方法同时负责:日期校验、营业时间计算、包厢锁定查询、套餐时间过滤、不可用时间合并、状态标记等,圈复杂度过高。 | 拆分为多个私有方法,如 `calculateBusinessHours()`, `mergeUnavailableTimes()`, `applyPackageRules()`, `markTimeSlotStatus()`。 | 见下方重构建议 |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存与属性污染**:立即移除 `self::$book_days_info` 的无参缓存逻辑,并将 `$this->book_days += 1` 改为局部变量计算。此问题会导致多租户/多日期请求数据串扰,属于线上高危缺陷。
2. **修复 `array_intersect` 解包崩溃**:在 PHP 8 环境下,单数组解包会直接中断执行。需增加 `count()` 判断分支。
3. **增强 JSON 解析容错**:所有 `json_decode` 调用必须增加 `json_last_error()` 校验或 `try-catch`,防止脏数据引发连锁崩溃。
### 🛠 后续重构与优化方向
1. **时间计算现代化**:全面替换 `strtotime` + `86400` 的原始计算方式。建议引入 `nesbot/carbon` 库,利用 `Carbon::parse()->addHours()->isBetween()` 等语义化 API,彻底解决跨天、夏令时边界问题。
2. **方法拆分与职责收敛**:`get_book_day_time_info` 已演变为“上帝方法”。建议按业务阶段拆分为:
- `resolveBaseTimeSlots()`:生成基础时间段
- `applyBusinessRules()`:应用营业/清扫/最低时长限制
- `applyPackageVoucherRules()`:应用团购券/套餐规则
- `mergeAndMarkStatus()`:合并不可用区间并标记最终状态
3. **依赖注入替代全局获取**:当前大量使用 `$CI = &get_instance()` 和 `$this->load->model()`。若 `phpci` 框架支持 DI 容器,建议通过构造函数注入核心依赖(如 `ConfigService`, `RoomLockService`, `VoucherService`),提升可测试性。
4. **补充单元测试**:该模型逻辑分支极多,强烈建议针对 `get_book_days_info` 和 `_get_un_book_time` 编写 PHPUnit 用例,覆盖:跨天、空数据、单包厢、多包厢交集、套餐时长不足、静态缓存隔离等场景。
> 📌 **框架适配说明**:当前代码大量使用 `get_instance()`、`$this->load->model()` 等典型 **CodeIgniter 3** 模式。若您实际使用的是内部定制版 `phpci` 框架,请确认其是否兼容 CI3 生命周期。若 `phpci` 已转向现代 DI/Service 架构,建议逐步将 `load->` 调用替换为构造函数注入,以符合现代 PHP 框架最佳实践。
>
> ⚠️ **局限性提示**:您提供的代码在 `_get_un_book_time` 方法末尾被截断,未能完整审查该方法的后续逻辑(如次日时间计算、最终返回结构)。建议补充完整代码以便进行闭环审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780368936
|
1780368936
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
454
|
21
|
167
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `961209555 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `96120955537949907abcd3c939ded9d03fea8ed1`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 11:10:34
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算逻辑,涉及多场景、跨天、团购券、清扫时间、最低时长等多重规则交织。代码能实现业务目标,但存在严重的**职责过载、全局状态依赖、静态缓存未隔离、循环内修改数组**等问题。可维护性、健壮性与性能均有较大优化空间。
- **风险等级**:🟠 中高(存在运行时异常隐患、数据串扰风险及性能瓶颈)
> 📌 **框架说明**:根据 `get_instance()`、`$this->load->model()`、`system/` 目录结构判断,该代码实际基于 **CodeIgniter 3** 架构。若 `phpci` 为贵司内部定制框架,请结合其特定生命周期调整以下建议。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_day_time_info()` 循环内 | `foreach ($time_info as $k => &$v)` 中直接使用 `unset($time_info[$k])`。在引用遍历中修改原数组会导致内部指针错乱,可能跳过元素或引发未定义行为。 | 移除循环内的 `unset`,改用 `array_filter` 或在循环结束后统一过滤无效时间段。 | `// 循环结束后统一过滤<br>$time_info = array_filter($time_info, function($v) {<br> return $v['status'] !== '-1';<br>});` |
| 🔴 严重 | 全局静态缓存属性 | `self::$book_days_info`、`self::$shop_data` 等静态属性未做商户/门店隔离。同一 PHP 进程复用该模型实例时,会返回其他商户的缓存数据,导致**严重的数据串扰**。 | 为静态缓存增加复合键(如 `merchant_id_shop_id`),或改为实例属性缓存。 | `self::$book_days_info["{$merchant_id}_{$shop_id}"] ??= $result;` |
| 🟠 警告 | `get_book_day_time_info()` 中段 | `array_intersect(...array_values($all_room_book_time))` 当 `$all_room_book_time` 元素数量 `< 2` 时,PHP 8+ 会抛出 `ArgumentCountError`。 | 增加数组长度判断,安全处理交集计算。 | `$count = count($all_room_book_time);<br>$un_book_time = $count >= 2 ? array_intersect(...array_values($all_room_book_time)) : ($count === 1 ? $all_room_book_time[0] : []);` |
| 🟠 警告 | 多处方法内部 | 频繁重复调用 `$CI = &get_instance();`。违反 DRY 原则,且在 CI3 中多次获取实例会增加微小开销,降低可读性。 | 在构造函数中统一获取并赋值给实例属性,后续统一使用 `$this->ci`。 | `protected $ci;<br>public function __construct() {<br> parent::__construct();<br> $this->ci =& get_instance();<br>}` |
| 🟠 警告 | 全文件 | 大量魔法数字与硬编码状态值(如 `86400`, `3600`, `'1'`, `'-1'`, `'2'`, `'7'`)。可读性差,后期维护极易出错。 | 提取为类常量,明确业务语义。 | `const SECONDS_PER_DAY = 86400;<br>const STATUS_AVAILABLE = '1';<br>const STATUS_UNAVAILABLE = '-1';` |
| 🟡 建议 | `get_book_day_time_info()` | 方法长度超 300 行,混合了数据查询、时间计算、券规则校验、营业时间过滤、状态标记等。严重违反单一职责原则(SRP)。 | 拆分为多个私有方法,如 `calculateAvailableSlots()`, `applyVoucherConstraints()`, `checkBusinessHours()`。 | 将 `foreach` 内的多段 `if` 逻辑抽离为独立方法,主方法仅负责流程编排。 |
| 🟡 建议 | 类属性定义区 | 所有业务属性均为 `public`,破坏封装性,外部可随意篡改内部状态。 | 改为 `protected` 或 `private`,通过 Getter/Setter 或构造参数注入。 | `protected $book_time_limit = 3600;<br>protected $book_days = 7;` |
| 🟡 建议 | 全局函数依赖 | 依赖 `throwError`, `returnWeek`, `timeToHour`, `mergeTimeRanges` 等全局函数。未命名空间化,易产生命名冲突且不利于单元测试。 | 将通用工具函数迁移至 `application/libraries/` 或 `application/helpers/` 并封装为静态类方法。 | `TimeHelper::toHour($time);<br>ArrayHelper::mergeRanges($ranges);` |
## 3. 总结与行动建议
### 🔑 优先修复项(P0/P1)
1. **修复静态缓存串扰**:立即为 `self::$book_days_info`、`self::$shop_data` 等静态属性添加 `merchant_id` 与 `shop_id` 作为缓存键,或改为实例级缓存。否则在多租户/批量处理场景下必现数据错乱。
2. **修复循环内 `unset` 与 `array_intersect` 报错**:替换为安全的数组过滤逻辑,并增加参数数量校验,避免 PHP 8+ 环境直接崩溃。
3. **统一 CI 实例获取**:在 `__construct` 中初始化 `$this->ci`,移除方法内冗余的 `&get_instance()` 调用。
### 🛠 后续重构与优化方向
1. **方法拆分与职责解耦**:`get_book_day_time_info` 是典型的“上帝方法”。建议按业务规则拆分为:
- `fetchBookingData()`:负责查库、解析 JSON、获取前后天数据。
- `calculateTimeWindows()`:负责生成基础时间段数组。
- `applyConstraints()`:负责依次应用营业时间、券规则、清扫时间、最低时长等过滤器。
2. **引入强类型与常量**:利用 PHP 7.4+ 类型声明规范属性,将状态码、时间单位提取为 `const`,提升 IDE 提示与静态分析能力。
3. **性能优化**:
- 前后天预订数据查询可合并为一次 `WHERE IN` 查询,减少 DB 往返。
- 避免在 `foreach` 中重复调用 `strtotime`、`date`,可预先计算基准时间戳。
4. **安全与输入校验**:对 `$params` 中的 `merchant_id`、`shop_id`、`date` 增加类型强转与格式校验(如 `ctype_digit`、`DateTime::createFromFormat`),防止非法输入穿透至底层查询。
> ⚠️ **局限性说明**:您提供的代码在 `get_book_day_time_info()` 方法末尾被截断,未包含完整逻辑与类闭合。若截断部分包含关键的状态提交、事务处理或异常捕获逻辑,请补充完整代码以便进行更精准的闭环审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780369834
|
1780369834
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
455
|
21
|
168
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `0ac5959e9 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `0ac5959e97ad1556e54d98b526577ae626e2d2f1`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 11:11:09
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型实现了复杂的多场景(KTV/台球/棋牌/酒馆)包厢预订时间计算逻辑,业务覆盖全面。但存在典型的“上帝方法”、状态管理混乱、硬编码泛滥及数组操作性能隐患。代码片段在末尾截断,部分边界逻辑无法完整评估。整体可维护性较低,需进行结构化重构。
- **风险等级**:🔴 高(逻辑耦合度高、静态缓存潜在污染、复杂时间计算易引发线上预订冲突或超时)
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_day_time_info` (~L200-L500) | **上帝方法 (God Method)**:该方法超 300 行,混合了数据查询、时间区间计算、套餐规则校验、营业逻辑判断等。违反单一职责原则,极难测试与维护。 | 拆分为独立方法:`fetchBookingData()`、`calculateTimeSlots()`、`applyPackageConstraints()`、`filterUnavailableRanges()`。通过依赖注入或参数传递状态。 | `// 拆分后结构示意<br>public function getBookDayTimeInfo($params) {<br> $slots = $this->generateBaseSlots($params);<br> $slots = $this->applyBusinessHours($slots);<br> return $this->applyPackageRules($slots);<br>}` |
| 🔴 严重 | `self::$book_days_info` 等静态属性 (~L115) | **静态缓存跨请求污染风险**:在 PHP-FPM 或长驻进程(如 Swoole/CLI Worker)中,静态变量会跨请求残留,导致不同商户/门店数据串扰。 | 改用实例级缓存或引入 Redis/Cache 驱动。若必须使用静态缓存,需在请求生命周期结束时清理,或增加 `merchant_id`+`shop_id` 作为缓存 Key。 | `// 推荐:使用框架缓存组件<br>$cacheKey = "book_days:{$merchant_id}:{$shop_id}";<br>$data = $this->cache->get($cacheKey);<br>if (!$data) { $data = $this->calculateDays(); $this->cache->save($cacheKey, $data, 300); }` |
| 🟠 警告 | 多处 (`__construct`, `set_shop_config` 等) | **频繁调用 `get_instance()`**:每次调用都会触发全局实例查找,增加不必要的开销。 | 在构造函数中统一获取并赋值给实例属性,后续直接复用。 | `class Ahead_shop_book_time_info_model extends Simple_model {<br> protected $ci;<br> public function __construct() {<br> parent::__construct();<br> $this->ci =& get_instance();<br> }<br>}` |
| 🟠 警告 | 全文多处 (`'1'`, `'2'`, `'merchantApp'`, `'7'`) | **魔法值泛滥**:场景标识、请求来源、支付场景等硬编码散落在业务逻辑中,极易因拼写错误或业务变更引发 Bug。 | 提取为类常量,提升可读性与可维护性。 | `const SCENE_KTV = '1';<br>const SCENE_BILLIARDS = '2';<br>const REQUEST_MERCHANT_APP = 'merchantApp';<br>// 使用:if ($this->ci->request_source === self::REQUEST_MERCHANT_APP)` |
| 🟠 警告 | `get_book_day_time_info` (~L280) | **数组展开运算符性能隐患**:`array_intersect(...array_values($all_room_book_time))` 在数组较大时易触发内存溢出或 `ArgumentCountError`。 | 改用迭代交集算法或专用区间计算库。避免一次性展开未知长度的数组。 | `// 安全迭代求交集<br>$result = array_shift($all_room_book_time);<br>foreach ($all_room_book_time as $arr) { $result = array_intersect($result, $arr); }` |
| 🟠 警告 | `_get_un_book_time` (~L620) | **硬编码时间边界判断**:`if ($prev_last_start_hour == '23:55')` 强依赖分钟单位,若商家配置变更(如改为 15 分钟),逻辑将失效。 | 基于动态时间单位计算,或使用 `DateTime` 对象进行精确比较。 | `// 动态判断<br>$maxTime = date('H:i', strtotime('23:59') + $this->min_minute_unit_time);<br>if ($prev_last_start_hour >= $maxTime) { ... }` |
| 🟡 建议 | 类属性定义 (~L10-L100) | **属性可见性设计不当**:大量业务状态属性声明为 `public`,外部可直接篡改,破坏封装性。 | 改为 `protected` 或 `private`,通过方法参数或 Setter 传递状态。 | `protected $book_room_id = 0;<br>protected $shop_business_from = 0;<br>// 提供只读访问器<br>public function getBookRoomId(): int { return $this->book_room_id; }` |
| 🟡 建议 | 时间处理逻辑 (全文) | **时间处理依赖字符串拼接**:大量使用 `date('YmdHi')`、字符串加减,缺乏时区控制,易在跨天/夏令时场景出错。 | 统一使用 `DateTimeImmutable` 或框架日期辅助类,明确时区。 | `// 推荐<br>$dt = new DateTimeImmutable($date . ' ' . $time, new DateTimeZone('Asia/Shanghai'));<br>$timestamp = $dt->getTimestamp();` |
| 🟡 建议 | `throwError()` 调用 (~L210) | **非标准错误处理**:`throwError()` 为全局函数,不符合现代 PHP 异常处理规范,不利于上层捕获与统一响应。 | 改用 PHP 原生异常或框架标准错误抛出机制。 | `if (!$date) {<br> throw new \InvalidArgumentException('请选择预订日期');<br>}` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **拆分核心大方法**:立即将 `get_book_day_time_info` 拆分为职责单一的私有方法,降低圈复杂度(Cyclomatic Complexity),便于编写单元测试。
2. **消除静态缓存隐患**:将 `self::$xxx` 静态缓存替换为带业务维度的实例缓存或 Redis 缓存,防止多租户/多门店数据串扰。
3. **统一魔法值为常量**:提取所有场景标识、状态码、请求来源为 `const`,并在逻辑判断中全面替换。
4. **优化数组区间计算**:替换 `array_intersect(...$arr)` 展开操作,改用安全的迭代交集或引入 `nesbot/carbon` + 区间计算库处理时间重叠逻辑。
### 🛠 后续重构与优化方向
- **引入策略模式 (Strategy Pattern)**:当前 `book_room_operational_scene` 分支逻辑(KTV/台球/棋牌/酒馆)高度耦合。建议为每个场景创建独立的策略类(如 `KtvBookingStrategy`, `BilliardsBookingStrategy`),通过工厂类动态加载,彻底解耦核心计算逻辑。
- **时间区间值对象化**:将 `start_time`、`end_time`、`status` 封装为 `TimeSlot` 值对象,提供 `overlaps()`, `merge()`, `subtract()` 等方法,替代散落的数组操作。
- **配置加载优化**:`ahead_shop_config_second_model->get_shop_setting` 被多次调用。建议在初始化阶段一次性批量拉取配置,或使用配置缓存层,减少 DB 查询次数。
- **补充边界测试**:重点覆盖跨天营业(如 08:00-次日 02:00)、24小时营业、套餐时长不足、最低预订时长与清扫时间叠加、并发预订冲突等场景。
### 📌 框架适配说明
> 注:当前代码结构、`get_instance()`、`$this->load->model()` 等用法高度符合 **CodeIgniter 3** 规范。若贵司使用的 `phpci` 为 CI3 的定制分支或内部框架,请确认其模型生命周期、缓存驱动及错误处理机制是否与上述建议兼容。若 `phpci` 为全新架构,建议逐步迁移至现代 PHP 依赖注入容器(如 PSR-11)与标准异常处理机制。
*注:由于提供的代码在 `_get_un_book_time` 方法末尾截断,部分后续逻辑(如下一天不可用时间合并、最终结果返回)未能完整审查。建议补充完整文件后再次进行深度复核。*
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780369869
|
1780369869
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
456
|
21
|
169
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `da5f37938 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `da5f379382fb71fa01d0340a7f3ec62b05f240ae`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 11:14:37
---
## 1. 审查摘要
- **代码质量评分**:5.5/10
- **总体评价**:代码实现了复杂的包厢预订时间计算逻辑,但存在严重的状态管理缺陷、方法职责过重、静态缓存污染风险及性能隐患。整体可维护性较低,在并发或多租户场景下极易引发数据错乱。
- **风险等级**:🔴 高
> **注**:`phpci` 通常指 PHP 持续集成服务器,而非 PHP 开发框架。从代码特征(`$CI = &get_instance()`、`$this->load->model()`、`load->library()`)判断,实际使用的是 **CodeIgniter 3**。以下审查基于 CI3 架构与 PHP 最佳实践。若为自研框架,请对照其生命周期规范调整。
> **局限性说明**:代码在 `_get_un_book_time` 方法末尾截断,未包含完整逻辑。以下审查基于已提供部分,若截断处包含关键事务提交或状态回滚逻辑,请补充后复核。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` | **静态缓存未区分参数**:`self::$book_days_info` 首次赋值后全局生效。不同商户/门店/日期请求会直接复用脏数据,导致严重业务错乱。 | 移除静态缓存或改用带参数哈希的内存缓存键。若需缓存,应使用 `private static $cache = []` 并以参数组合作为 Key。 | `private static $book_days_cache = [];<br>$cache_key = md5(serialize([$merchant_id, $shop_id, $check_date, $add_day]));<br>if (isset(self::$book_days_cache[$cache_key])) return self::$book_days_cache[$cache_key];<br>// ... 计算逻辑 ...<br>self::$book_days_cache[$cache_key] = $result;` |
| 🔴 严重 | `get_book_days_info` | **实例状态被意外修改**:`$this->book_days += 1;` 直接修改对象属性。多次调用会导致天数无限累加,破坏后续所有依赖该属性的逻辑。 | 使用局部变量替代属性修改,保持对象状态不可变性。 | `$calc_days = $this->book_days + ($add_day ? 1 : 0);<br>for ($i = 0; $i < $calc_days; $i++) { ... }` |
| 🟠 警告 | `get_book_day_time_info` | **方法职责过重(God Method)**:单方法超 300 行,混合了数据查询、时间区间计算、业务规则过滤、UI 状态标记。违反单一职责原则,极难单元测试。 | 拆分为独立私有方法或抽离为 `BookingTimeCalculator` 服务类:`fetchRoomData()`、`calculateAvailableSlots()`、`applyVoucherRules()`、`formatTimeSlots()`。 | (建议按数据流拆分,保持单方法 < 80 行) |
| 🟠 警告 | 全局/多处 | **安全隐患:输入未校验**:`$params` 数组直接传入模型,缺乏类型与边界检查(如日期格式、ID 合法性)。恶意构造参数可能导致时间计算溢出或越权查询。 | 在 Controller 层使用 CI 表单验证或 PHP 8 类型声明;模型入口处增加基础校验。 | `if (!preg_match('/^\d{8}$/', $params['date'] ?? '')) { throwError('日期格式错误'); }<br>$params['merchant_id'] = filter_var($params['merchant_id'], FILTER_VALIDATE_INT);` |
| 🟠 警告 | `_get_un_book_time` | **性能瓶颈:参数展开求交集**:`array_intersect(...array_values($all_room_book_time))` 使用 `...` 展开,当包厢数较多时可能触发 `ArgumentCountError` 或内存飙升。 | 改用迭代方式求交集,或使用 `array_reduce`。 | `$intersection = array_shift($all_room_book_time);<br>foreach ($all_room_book_time as $arr) {<br> $intersection = array_intersect($intersection, $arr);<br>}` |
| 🟠 警告 | 构造函数/多处 | **框架开销:重复获取实例与加载**:多处重复 `$CI = &get_instance();` 及重复 `load->model()`。CI 虽会去重,但增加解析开销且破坏代码整洁度。 | 在构造函数中统一赋值 `$this->ci = &get_instance();`,利用 CI 的自动加载机制。 | `public function __construct() {<br> parent::__construct();<br> $this->ci = &get_instance();<br> $this->load->model('Simple_model');<br> // 其他初始化...<br>}` |
| 🟡 建议 | 类属性定义 | **封装性不足**:大量 `public` 属性暴露内部状态,外部可直接篡改业务规则(如 `$book_time_limit`、`$ignore_tuangou_time_limit`)。 | 改为 `protected` 或 `private`,通过 `getter/setter` 控制访问,并在 setter 中增加合法性校验。 | `protected $book_time_limit = 3600;<br>public function setBookTimeLimit(int $seconds): void {<br> $this->book_time_limit = max(300, $seconds);<br>}` |
| 🟡 建议 | 全局函数依赖 | **隐式依赖全局辅助函数**:大量使用 `timeToHour`、`mergeTimeRanges`、`shiftTimeRange` 等未声明的全局函数,降低可测试性与 IDE 静态分析能力。 | 将时间计算逻辑封装为独立的 `TimeRangeHelper` 类或 Service,通过依赖注入或静态方法调用。 | `class TimeRangeHelper { public static function merge(array $ranges): array { ... } }` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存污染与状态突变**:立即移除 `self::$book_days_info` 的无差别缓存,并删除 `$this->book_days += 1` 的副作用代码。这是当前导致多租户数据串扰的核心隐患。
2. **拆分巨型方法**:将 `get_book_day_time_info` 按数据流向拆分为 `获取基础数据` → `计算不可用区间` → `应用业务规则(团购/营业/锁定)` → `格式化输出` 四个独立步骤,提升可读性与可测试性。
3. **输入参数强校验**:在模型入口或 Controller 层对 `$params['date']`、`$params['merchant_id']`、`$params['shop_id']` 进行严格类型与格式校验,防止非法数据流入核心计算逻辑。
### 🛠 后续重构与优化方向
- **架构升级建议**:若项目允许,建议逐步迁移至 **CodeIgniter 4** 或现代 PHP 框架(Laravel/Symfony)。CI4 原生支持依赖注入、命名空间、类型声明与更安全的 Query Builder,可大幅减少 `$CI = &get_instance()` 的滥用。
- **时间计算服务化**:当前时间区间合并、偏移、交集判断逻辑高度耦合。建议抽离为独立的 `BookingTimeService`,使用值对象(Value Object)如 `TimeSlot`、`DateRange` 替代裸数组,提升类型安全。
- **缓存策略优化**:静态数组缓存仅适用于单次请求生命周期。若需跨请求复用,应改用 CI Cache 驱动(Redis/Memcached)并设置合理的 TTL;若仅用于单次请求内复用,请使用 `private static $cache = []` 并严格绑定参数哈希。
- **性能监控**:在 `_get_un_book_time` 中涉及多次 `json_decode` 与数据库查询。建议对 `_time_info_new` 字段建立合理索引,或考虑将高频查询的预订状态同步至 Redis 位图/集合中,降低 MySQL 压力。
> 如需针对截断部分或特定业务场景(如团购券跨天逻辑、包厢锁定机制)进行深度逻辑推演,请提供完整代码片段。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780370077
|
1780370077
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
457
|
21
|
170
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616 🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616' of https://gitea.g-hi.co...
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `b3e6dcf46 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `b3e6dcf46bee5866a10229a671616ec8e0c5b8e5`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 11:54:00
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码承载了复杂的订单计价、支付回调、退款及时间预订逻辑,业务覆盖面广。但存在明显的“上帝类”与“面条代码”特征,方法过长、职责混杂、大量魔法数字硬编码。财务计算缺乏精度控制,事务处理与框架规范存在偏差,整体可维护性与安全性亟待提升。
- **风险等级**:🔴 高(涉及资金计算精度、潜在 SQL 注入、事务状态机破坏)
> 📌 **框架适配说明**:您提供的代码结构(`BASEPATH`、`get_instance()`、`$this->CI->load->`、`Simple_model` 等)高度符合 **CodeIgniter 3** 规范,而非 `phpci`。以下审查将基于 CI3 最佳实践进行,若实际运行环境为 `phpci`,请核对底层加载器与事务机制的差异。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Neworderservice.php` (多处) | **浮点数精度丢失**:订单金额、折扣、服务费计算直接使用 `*` 和 `/`,未做精度处理,极易导致财务对账出现 `0.01` 元差异。 | 所有货币计算必须使用 `round($val, 2)` 或 `bcmath` 扩展。建议在累加后立即取整。 | `$actual_pay = round($goods['_actual_amount'] * $goods['_quantity'], 2);`<br>`$service_charge = round($actual_pay * $rate / 100, 2);` |
| 🔴 严重 | `Neworderservice.php` ~L330 | **SQL 注入隐患**:`$pack_goods_where = "wares_package._package_id in (" . implode(",", $id_array['package_id']) . ")";` 直接拼接用户可控数组。 | 使用 CI 查询构建器或严格过滤。若必须拼接,需强制转为整型数组。 | `$ids = array_map('intval', $id_array['package_id']);`<br>`$this->db->where_in('_package_id', $ids);` |
| 🔴 严重 | `Ahead_book_order_model.php` ~L75 | **事务状态机破坏**:在 `try` 块中手动调用 `$this->db->trans_rollback()` 后直接 `return`,会破坏 CI3 的 `trans_start()/trans_complete()` 自动提交/回滚机制,导致后续查询报错。 | 移除 `try` 内的手动 rollback,统一交由 `trans_complete()` 处理,或在 `catch` 中抛出异常。 | `try { ... } catch (Exception $e) { $this->db->trans_rollback(); log_message('error', $e->getMessage()); return ['status'=>false, 'msg'=>'支付异常']; }` |
| 🟠 警告 | `Neworderservice.php` ~L480 | **生产环境遗留调试代码**:`echo $vip_upgrade_data_actual_pay;` 会直接输出到响应流,破坏 API JSON/XML 结构。 | 立即移除 `echo`,改用框架日志记录。 | `// echo ...;`<br>`doLog("VIP升级金额累加: {$vip_upgrade_data_actual_pay}", 'vip_upgrade');` |
| 🟠 警告 | `Neworderservice.php` / `Ahead_book_order_model.php` (多处) | **模型重复加载**:在业务方法内部频繁调用 `$this->CI->load->model()`,每次调用都会触发文件包含与实例化,影响性能。 | 将依赖模型移至构造函数初始化,或配置 `autoload.php` 自动加载。 | `public function __construct() { parent::__construct(); $this->load->model(['Ahead_vip_level_model', 'Ahead_merchant_goods_model']); }` |
| 🟠 警告 | `Ahead_book_order_model.php` ~L310 | **原始 SQL 更新风险**:`$log_up = '_status=4,_refund_amount=_actual_pay'; $this->ahead_pay_log_model->up($log_up, $log_where);` 使用字符串拼接更新条件,缺乏参数绑定。 | 使用 CI 的 `update()` 方法或查询构建器,确保字段与值分离。 | `$this->db->set('_status', 4)->set('_refund_amount', '_actual_pay', FALSE)->where($log_where)->update('ahead_pay_log');` |
| 🟡 建议 | `Neworderservice.php` ~L105 | **方法命名拼写错误**:`rest_goods_price_by_un_vip` 中 `rest` 应为 `reset`。 | 修正命名以符合语义规范。 | `public function reset_goods_price_by_un_vip($data, $price_key = '_discount_price')` |
| 🟡 建议 | 全局多处 | **魔法数字泛滥**:`100`, `-1`, `1`, `2`, `3`, `7`, `13`, `14`, `22`, `58`, `56` 等状态值与配置值硬编码,可读性差且易改错。 | 提取为类常量或独立配置文件(如 `config/order_status.php`)。 | `const STATUS_DISABLED = -1;`<br>`const PAY_PLATFORM_WECHAT = 1;`<br>`const VIP_DISCOUNT_BASE = 100;` |
| 🟡 建议 | `Ahead_shop_book_time_info_model.php` | **静态属性缓存风险**:大量使用 `self::$book_days_info` 等静态变量缓存数据。在 PHP-FPM 长连接或 CLI 脚本中可能引发请求间状态污染。 | 改为实例属性 `$this->`,或使用 CI Cache 驱动(Redis/Memcached)进行跨请求缓存。 | `private $book_days_info = [];`<br>`public function get_book_days_info() { if (empty($this->book_days_info)) { ... } return $this->book_days_info; }` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **财务精度控制**:立即全局替换浮点数直接运算,引入 `round($val, 2)` 或 `bcmath`。建议在数据库层使用 `DECIMAL(10,2)`,并在 PHP 层统一封装 `MoneyCalculator` 工具类。
2. **事务机制规范化**:CI3 的事务是状态机模式。请严格遵循 `trans_start() -> 业务逻辑 -> trans_complete()` 范式,**禁止**在 `try` 块中手动 `trans_rollback()` 后直接返回。若需手动控制,请改用 `trans_begin()` / `trans_rollback()` / `trans_commit()`。
3. **SQL 安全加固**:清理所有字符串拼接的 `WHERE` 条件,全面转向 `$this->db->where()`、`$this->db->where_in()` 或参数化查询。
### 🛠 后续重构与优化方向
1. **拆分“上帝类”**:
- `Neworderservice::getOrderTypeInfo()` 超过 400 行,混合了价格计算、优惠券校验、服务费计算、订单组装。建议按职责拆分为:
- `PriceCalculatorService`(纯计算逻辑,无 DB 依赖)
- `CouponValidatorService`(优惠券规则校验)
- `OrderAssemblerService`(数据组装与持久化)
2. **统一异常与日志处理**:
- 代码中混用 `throwError()`、`doLog()`、`do_log()`。建议统一使用 CI 的 `show_error()` / `log_message()`,或引入 Monolog 等现代日志组件。
- 错误码与提示信息应集中管理,避免硬编码散落在业务逻辑中。
3. **时间计算规范化**:
- `Ahead_shop_book_time_info_model` 中大量使用 `strtotime()`、字符串拼接与 `date()` 进行时间区间计算。建议引入 `Carbon` 或 `DateTimeImmutable` 对象,避免跨天、夏令时、时区导致的边界 BUG。
4. **框架规范对齐**:
- 遵循 PSR-12:类名使用 `PascalCase`(如 `NewOrderService`),方法名使用 `camelCase`,添加类型声明(PHP 7.4+ 支持 `array`, `int`, `bool` 等)。
- 若实际框架确为 `phpci`,请核对底层是否兼容 CI3 的 `load->model()` 与事务 API,必要时适配框架提供的 Service Container 与 ORM。
> 💡 **提示**:当前代码片段在末尾被截断,部分逻辑(如 `create_community_shop_book_order` 结尾、`_get_un_book_time` 结尾)未能完整审查。建议补充完整文件后再次进行静态扫描与边界用例测试。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780372440
|
1780372440
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
458
|
21
|
171
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `86c4ad47f ## 自动代码审查报告
**分支**: pay-260519
**提交**: `86c4ad47ffe62ac1ed36e7dfc000b075636d8d47`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 13:35:51
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了复杂的多场景(KTV/台球/棋牌/酒馆)包厢预订时间计算逻辑,业务覆盖较全。但存在严重的**状态管理混乱**、**方法职责过重**、**静态缓存设计缺陷**及**潜在运行时错误**。代码结构偏向“上帝类”,违反单一职责原则(SRP),可维护性与测试性较差。
- **风险等级**:🔴 高
- **框架说明**:注:从目录结构、`$CI = &get_instance()`、`load->model()` 等特征判断,该代码实际基于 **CodeIgniter 3 (CI3)** 架构。以下审查基于 CI3 最佳实践,若 `phpci` 为内部定制版本,核心 PHP 规范与逻辑建议依然适用。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_days_info` / `self::$shop_data` 等静态属性 | 静态缓存未区分商户/门店ID。同一请求周期内若传入不同 `merchant_id`/`shop_id`,将直接返回错误缓存数据,导致严重业务串扰。 | 移除静态缓存或改用复合键缓存。建议改为实例属性或使用请求级缓存(如 CI 的 `$this->cache`)。 | `$key = "shop_{$merchant_id}_{$shop_id}"; if (!isset(self::$shop_data[$key])) { self::$shop_data[$key] = $this->ahead_shop_model->get_one(...); }` |
| 🔴 严重 | `get_book_day_time_info` / `foreach` 循环内 | 在 `foreach ($time_info as $k => &$v)` 中直接使用 `unset($time_info[$k])` 会破坏数组内部指针,导致后续元素跳过或遍历异常。 | 改用 `array_filter` 过滤,或收集待删除键后统一 `unset`。 | `$time_info = array_filter($time_info, fn($v) => $date != $today || $v['time'] > $now_hour_time);` |
| 🔴 严重 | `get_book_day_time_info` / `array_intersect` | `array_intersect(...array_values($all_room_book_time))` 在数组为空或元素不足时,PHP 8+ 会抛出 `Argument unpacking` 警告/错误,导致脚本中断。 | 增加元素数量校验,或使用 `call_user_func_array` 安全解包。 | `if (count($all_room_book_time) > 1) { $un_book_time = array_intersect(...array_values($all_room_book_time)); }` |
| 🟠 警告 | `get_book_days_info` | `$this->book_days += 1;` 直接修改类属性状态。若该方法被多次调用,天数会持续累加,造成不可预期的逻辑污染。 | 使用局部变量计算,保持实例状态不可变。 | `$days = $this->book_days + ($add_day ? 1 : 0); for ($i = 0; $i < $days; $i++) { ... }` |
| 🟠 警告 | `__construct` 及多处方法 | 频繁调用 `$CI = &get_instance()` 且未复用,增加不必要的函数调用开销。 | 在构造函数中统一赋值给 `$this->ci`,后续统一使用。 | `protected $ci; public function __construct() { parent::__construct(); $this->ci =& get_instance(); }` |
| 🟠 警告 | `get_book_day_time_info` | 方法体超 300 行,嵌套层级深,混合了时间计算、套餐校验、营业时间判断、DB查询等逻辑,违反单一职责原则。 | 拆分为独立私有方法或提取至 `BookingTimeService` 服务层。模型仅保留数据访问。 | 将 `_check_package_time()`, `_check_business_hours()`, `_merge_unavailable_times()` 拆分为独立方法。 |
| 🟠 警告 | 全局 `$params` 使用 | 直接使用 `$params['date']`, `$params['merchant_id']` 等,缺乏类型校验与白名单过滤,存在越权或非法参数注入风险。 | 引入显式类型转换或 CI 表单验证库,关键参数需做合法性校验。 | `$merchant_id = filter_var($params['merchant_id'], FILTER_VALIDATE_INT); if (!$merchant_id) throwError('商户ID无效');` |
| 🟡 建议 | 全局多处 | 存在大量魔法数字/字符串(如 `86400`, `'1'`, `'2'`, `'7'`, `'3600'`),降低可读性且易引发维护错误。 | 提取为类常量或配置文件枚举。 | `const SECONDS_PER_DAY = 86400; const SCENE_KTV = '1'; const SCENE_BILLIARDS = '2';` |
| 🟡 建议 | `get_book_day_time_info` | 变量名拼写错误:`opreational_scene`(应为 `operational_scene`)。 | 全局搜索替换修正拼写,避免后续维护混淆。 | 统一修正为 `operational_scene`。 |
| 🟡 建议 | 全局方法签名 | 缺少 PHP 7+ 类型声明(参数类型、返回类型),不符合现代 PHP 编码规范。 | 补充 `int`, `string`, `array`, `bool` 等类型提示,提升静态分析能力。 | `public function get_book_days_info(int $merchant_id, int $shop_id, string $check_date = '', bool $add_day = false): array` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **修复静态缓存串扰**:立即将 `self::$shop_data`、`self::$date_time_info` 等静态属性改为带业务主键的数组缓存,或彻底移除静态缓存改用实例属性。这是当前最高风险点。
2. **修复 `foreach` 中的 `unset` 与数组解包**:替换为 `array_filter` 并增加 `count()` 判断,避免 PHP 8+ 环境下的致命错误。
3. **消除状态污染**:将 `$this->book_days += 1` 等直接修改实例属性的操作改为局部变量计算,确保对象可复用。
### 🛠 架构与重构方向
1. **模型瘦身(Model-Service 分离)**:当前模型承担了过多业务逻辑。建议将时间计算、套餐规则校验、不可用时间合并等逻辑抽离至独立的 `BookingTimeCalculatorService` 或 `PackageRuleValidator`。模型仅保留 `get_one()`, `get_shop_setting()` 等数据访问方法。
2. **统一 CI 实例引用**:在 `__construct` 中缓存 `$this->ci = &get_instance()`,避免重复调用。
3. **引入配置常量**:将 `86400`、`3600`、场景标识 `'1'/'2'/'3'` 等提取为类常量或独立配置文件,提升代码可读性与可维护性。
4. **补充输入校验**:在方法入口处对 `$params` 进行类型强转与合法性校验,避免脏数据流入核心计算逻辑。
### 📝 局限性说明
提供的代码片段在 `_get_un_book_time` 方法末尾被截断(`$this->next_date_room_book_time = [...]` 后无闭合),未能审查完整逻辑。建议补充完整文件后,重点检查跨天时间计算、数据库事务处理及异常回滚机制。若需进一步深度审查完整文件,可提供全量代码。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780378551
|
1780378551
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
459
|
21
|
172
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 1
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `33cf68b8e ## 自动代码审查报告
**分支**: pay-260519
**提交**: `33cf68b8eed08573f0ad52ebc59f46f33e002b6c`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 13:42:33
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:该模型承载了极其复杂的预订时间计算与状态判定逻辑,业务覆盖全面。但核心方法过长、职责边界模糊、大量依赖全局 `$CI` 对象传递状态,且存在多处逻辑交叉覆盖风险。代码风格偏向传统 PHP 5/7 早期写法,未遵循现代 PSR 规范,可维护性与性能存在明显瓶颈。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据代码结构(`$CI = &get_instance()`、`system/` 目录、`$this->load->model()` 等),该代码实际基于 **CodeIgniter 3** 架构。以下审查基于 CI3 最佳实践。若确为内部自研 `phpci` 框架,请对照其官方文档调整组件加载与生命周期调用方式。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_book_day_time_info()` 核心循环 | 方法超 300 行,`$v['status']` 在多个 `if` 分支中被反复覆盖修改。条件交叉重叠(如套餐限制、营业时间、不可用时间、跨天逻辑等),极易因执行顺序导致状态误判或漏判。 | **拆分职责**:将校验逻辑抽离为独立方法(如 `checkVoucherTime()`, `checkBusinessHours()`, `checkLockedTime()`),采用**责任链模式**或**策略模式**依次校验,任一失败则提前返回或标记状态,避免嵌套覆盖。 | `foreach ($time_info as &$v) { $v['status'] = $this->validateTimeSlot($v, $constraints); }` |
| 🔴 严重 | `__construct()` & `set_shop_config()` | 频繁调用 `$CI = &get_instance()` 并直接读写 `$CI->operational_scene`、`$CI->request_source` 等属性。破坏 MVC 封装,易引发全局状态污染,且在并发或 CLI 环境下可能导致数据串扰。 | 移除对 `$CI` 属性的直接赋值。改为通过方法参数传递上下文,或使用 `$this->ci = &get_instance()` 在构造函数中缓存一次,仅通过 `$this->ci->config->item()` 读取配置。 | `protected $ci; public function __construct() { parent::__construct(); $this->ci = &get_instance(); }` |
| 🟠 警告 | `_get_un_book_time()` & `get_book_day_time_info()` | 多次重复调用 `ahead_shop_config_second_model->get_shop_setting()` 获取相同配置项,未做请求级缓存,增加数据库 I/O 压力。 | 使用 CI 缓存驱动或请求级静态数组缓存配置。若配置变更不频繁,建议接入 Redis/文件缓存。 | `protected function getShopConfig($key) { static $cache = []; return $cache[$key] ??= $this->ci->ahead_shop_config_second_model->get_shop_setting(...); }` |
| 🟠 警告 | `get_book_day_time_info()` 数据解析 | `json_decode($book_time_info['_time_info_new'], 1)` 未校验 JSON 格式。若数据库字段损坏或包含非法字符,将触发 Warning 并返回 `null`,导致后续 `foreach` 报错。 | 增加 `json_last_error()` 校验,并提供安全降级默认值。 | `$data = json_decode($json, true); if (json_last_error() !== JSON_ERROR_NONE) { $data = []; }` |
| 🟠 警告 | 全局时间计算 | 大量使用字符串时间(如 `'202407010800'`)进行 `array_intersect`、`strtotime` 转换。字符串比较易受时区、格式不一致影响,且性能低于整型时间戳。 | **统一使用 Unix 时间戳(int)**进行区间计算与交集判断,仅在最终输出时格式化为字符串。可封装 `TimeRange` 值对象。 | `class TimeRange { public int $start; public int $end; public function intersects(self $other): bool { ... } }` |
| 🟡 建议 | 全局常量与魔法值 | 大量硬编码魔法值:`'1'`, `'-1'`, `'2'`, `'3'`, `'4'`, `86400`, `3600`。可读性差,后期维护易出错。 | 定义类常量或枚举(PHP 8.1+),集中管理业务状态与时间单位。 | `const STATUS_AVAILABLE = '1'; const STATUS_UNAVAILABLE = '-1'; const SECONDS_PER_DAY = 86400;` |
| 🟡 建议 | 辅助函数依赖 | 依赖大量未命名空间的全局函数(`timeToHour`, `mergeTimeRanges`, `throwError` 等),不符合 PSR-4/12 规范,难以进行单元测试。 | 封装为独立的服务类(如 `BookingTimeCalculator`、`ValidationHelper`),通过依赖注入或静态方法调用,便于 Mock 测试。 | `class TimeUtils { public static function mergeRanges(array $ranges): array { ... } }` |
| 🟡 建议 | `set_shop_config()` 与 `set_room_info()` | 两个方法逻辑高度重复(获取场景、加载配置、计算分钟单位),违反 DRY 原则。 | 合并为单一受保护方法,通过参数区分调用场景,或提取为 `SceneConfigLoader` 组件。 | `protected function loadSceneConfig(?int $roomId = null): void { ... }` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **消除 `$v['status']` 状态覆盖风险**:当前 `get_book_day_time_info()` 的 `foreach` 循环是系统核心,状态被多次覆盖极易引发线上客诉(如“明明可订却显示不可订”)。请立即将校验逻辑拆分为独立方法,采用**短路返回**或**状态累加器**模式。
2. **收敛全局 `$CI` 对象滥用**:禁止在 Model 中直接修改 `$CI->xxx` 属性。所有上下文数据(如 `request_source`, `operational_scene`)应通过方法参数传入,或使用 `$this->ci->session->userdata()` 等标准方式获取。
3. **增强 JSON 解析与输入校验**:对 `$params` 增加类型强转与基础校验(如 `ctype_digit($params['merchant_id'])`),对 `json_decode` 增加错误捕获,防止脏数据导致白屏或逻辑中断。
### 🛠 后续重构与优化方向
1. **架构分层**:当前 Model 承担了 `数据查询`、`业务规则计算`、`状态组装` 三重职责。建议引入 **Service 层**(如 `BookingAvailabilityService`)处理复杂时间计算,Model 仅负责数据持久化与基础查询。
2. **时间计算引擎化**:将 `mergeTimeRanges`、`shiftTimeRange`、`minutesToUnits` 等函数抽象为独立的 `TimeRangeCalculator` 类。内部统一使用 `int` 时间戳运算,彻底告别字符串时间拼接,提升计算精度与性能。
3. **配置缓存策略**:门店配置(`book_minute_unit`, `book_hour_options` 等)变更频率低,建议接入 CI 缓存驱动(`$this->ci->cache->save()`)或 Redis,设置合理 TTL(如 30 分钟),减少高频查询对 DB 的冲击。
4. **单元测试覆盖**:该模块逻辑分支极多,强烈建议使用 PHPUnit 编写核心校验逻辑的单元测试。通过 Mock 数据库与 `$CI` 对象,验证不同场景(跨天、套餐限制、最低时长、清扫时间)下的时间槽输出是否符合预期。
> 💡 **提示**:若需进一步审查 `Simple_model` 基类实现、`Tuangou` 库逻辑或控制器层调用方式,请提供相关代码片段。当前审查仅基于已提交的 Model 文件,部分全局函数与框架生命周期细节可能存在上下文盲区。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780378954
|
1780378954
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
460
|
22
|
52
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `b81fc07a2 ## 自动代码审查报告
**分支**: app-260616
**提交**: `b81fc07a2830943f9142c042f75df2aace449b54`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 13:45:48
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了门店包厢时间预订的核心业务逻辑,但存在明显的架构设计缺陷。方法职责过重、时间处理逻辑脆弱、频繁加载模型与重复的 JSON 序列化操作导致性能与维护成本较高。部分边界条件与异常处理缺失,存在潜在的运行时报错风险。
- **风险等级**:🟠 中(存在逻辑隐患、性能瓶颈及不规范用法,需优先重构核心方法)
> ⚠️ **局限性说明**:提供的代码在 `get_shop_book_info_v2` 方法中截断,本次审查仅基于可见部分。若截断处包含关键逻辑(如数据库事务、最终返回结构),请补充后二次审查。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 文件顶部 / 全局作用域 | `$CI = &get_instance();` 定义在类外部,且 `$CI->load->model('Simple_model');` 写法错误。会导致作用域污染、内存泄漏,且在 CLI 或单元测试中直接报错。 | 移除全局 `$CI` 声明。模型加载应统一在 `__construct()` 中完成,或直接继承基类。 | `// 删除顶部代码<br>class Ahead_shop_book_time_info_model extends Simple_model {<br> public function __construct() {<br> parent::__construct();<br> $this->load->model('ahead_family_servers_model');<br> // 其他模型按需加载<br> }<br>}` |
| 🔴 严重 | `_update_un_book_time` 方法内 | `array_intersect(...array_values($all_room_book_time))` 当 `$all_room_book_time` 为空数组时,解包后 `array_intersect()` 接收 0 个参数,PHP 8.0+ 会抛出 `ArgumentCountError`。 | 增加数组元素数量判断,或使用 `array_reduce` 安全求交集。 | `if (count($all_room_book_time) === 0) {<br> $time_info['un_book_time'] = [];<br>} elseif (count($all_room_book_time) === 1) {<br> $time_info['un_book_time'] = array_values($all_room_book_time)[0];<br>} else {<br> $time_info['un_book_time'] = array_intersect(...array_values($all_room_book_time));<br>}` |
| 🟠 警告 | `update_day_book_info` / 时间循环 | 时间步长循环 `for ($i = $start; $i <= $end; $i += $this->min_minute_unit_time)` 未对齐时间单位。若 `$start` 不是 300 秒的整数倍,会导致时间段错位或遗漏,且跨天时 `strtotime($end_date . ' 00:00:00')` 依赖服务器时区。 | 使用 `DateTime` 与 `DateInterval` 生成时间片,或强制对齐起始时间。避免硬编码时区依赖。 | `$start = new DateTime('@' . $book_order['_arrival_time']);<br>$end = new DateTime('@' . $book_order['_end_time']);<br>$interval = new DateInterval('PT5M');<br>while ($start <= $end) {<br> $book_time_arr[] = $start->format('H:i');<br> $start->add($interval);<br>}` |
| 🟠 警告 | `_update_un_book_time` / JSON解析 | `json_decode($data['_time_info'], true)` 未校验返回值。若数据库字段损坏或为空字符串,将返回 `null`,后续 `isset($time_info['room_book_time'])` 会触发 `Warning` 或逻辑异常。 | 增加类型校验与默认值兜底。 | `$time_info = json_decode($data['_time_info'], true);<br>if (!is_array($time_info)) {<br> $time_info = ['room_book_time' => [], 'un_book_time' => []];<br>}` |
| 🟠 警告 | `get_shop_book_info` 方法 | 方法长度超 250 行,混合了数据查询、时间计算、状态过滤、清扫时间叠加、跨天合并等逻辑。违反单一职责原则(SRP),极难测试与维护。 | 拆分为独立方法:`fetchRoomList()`, `calculateBusinessSlots()`, `mergeBookingData()`, `applyCleaningBuffer()`。 | *(架构重构建议,见第3部分)* |
| 🟡 建议 | 多处 | 硬编码魔法数字与字符串(如 `300`, `256`, `'CYD'`, `'ZD'`, `'00:00'`, `'23:55'`)。降低可读性且不利于后续配置化。 | 提取为类常量或配置文件。`256` 应替换为 `JSON_THROW_ON_ERROR`。 | `const MIN_UNIT_SECONDS = 300;<br>const ORDER_TYPE_BOOK = 'CYD';<br>const ORDER_TYPE_BILL = 'ZD';<br>// 使用 json_encode($data, JSON_THROW_ON_ERROR)` |
| 🟡 建议 | 全局/方法内 | 频繁使用 `$this->load->model()` 在业务方法内部动态加载。CI/类CI框架中,模型加载有开销,且破坏依赖可见性。 | 统一在构造函数加载,或使用依赖注入(DI)容器。若 `phpci` 支持懒加载,请确认其性能损耗。 | `// 构造函数中预加载<br>$this->load->model(['ahead_family_servers_model', 'ahead_book_order_model', 'ahead_bill_model']);` |
| 🟡 建议 | `update_day_time_info_by_bill` | 直接访问 `$CI->add_order_by_refund` 全局属性。该属性未定义且易被外部篡改,破坏封装性。 | 通过方法参数传入状态标识,或从 Session/Request 对象中安全获取。 | `public function update_day_time_info_by_bill($bill_data, $type, $is_refund = false) {<br> // 使用 $is_refund 替代 $CI->add_order_by_refund<br>}` |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **移除全局 `$CI` 实例化**:立即将 `$CI = &get_instance();` 从文件顶部移除,改为在类方法内按需使用 `$this->load` 或 `$this->db`。
2. **修复 `array_intersect` 解包崩溃风险**:在 `_update_un_book_time` 中增加数组判空逻辑,防止 PHP 8+ 环境直接 Fatal Error。
3. **JSON 解析安全加固**:所有 `json_decode` 调用必须配合 `is_array()` 校验,并设置合理的默认结构,避免脏数据导致后续逻辑断裂。
### 🛠 后续重构与优化方向
1. **时间处理现代化**:
- 废弃 `date()` / `strtotime()` 字符串拼接,全面迁移至 `DateTimeImmutable` 与 `DatePeriod`。
- 将时间片生成逻辑抽离为独立的 `TimeSlotGenerator` 工具类,支持时区、步长、边界对齐配置。
2. **方法职责拆分(SRP)**:
- `get_shop_book_info` 建议拆分为:
- `getBusinessTimeConfig()`:获取营业时间与跨天标识
- `fetchRawBookingData()`:批量查询预订单与账单(避免 N+1)
- `calculateAvailability()`:计算可预订状态与清扫缓冲
- 使用 DTO(数据传输对象)替代深层嵌套数组,提升类型安全。
3. **性能优化**:
- **批量查询**:`_update_un_book_time` 中多次 `get_one` 可合并为 `where_in` 批量查询。
- **缓存策略**:门店营业时间、清扫时间、包厢列表等低频变动数据应引入 Redis/文件缓存,避免每次请求重复查库。
- **JSON 字段优化**:若 `_time_info` 数据量持续增长,建议评估是否拆分为独立的 `room_time_slots` 关联表,利用数据库索引替代 PHP 内存数组运算。
4. **框架适配提示**:
- 若 `phpci` 为内部定制框架,请确认其是否支持 **Repository 模式** 或 **Service 层**。当前 Model 承担了过多业务逻辑,建议将时间计算、状态流转移至 `ShopBookingService`,Model 仅负责数据持久化。
- 代码中大量使用 `do_log()`、`roundTime()`、`hourToTime()` 等未定义函数,请确保这些 Helper 已正确加载且无全局状态污染。
> 💡 **下一步建议**:建议先编写针对 `update_day_book_info` 与 `_update_un_book_time` 的单元测试,覆盖同天、跨天、边界时间、脏 JSON 等场景。通过测试用例驱动重构,可大幅降低线上回归风险。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780379148
|
1780379148
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
461
|
22
|
53
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 1
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `31456ab28 ## 自动代码审查报告
**分支**: app-260519
**提交**: `31456ab2853fc7a9a5abd0f0496e6cb8f06c4ee4`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 13:46:58
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:代码实现了门店包厢时间预订的核心业务逻辑,功能完整但架构耦合度较高。时间计算、JSON 序列化与数据库交互混杂在单一 Model 中,违反单一职责原则。存在明显的框架误用、潜在的性能瓶颈及容错缺失,在并发或数据异常场景下易引发系统级问题。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 文件顶部 / 全局 | `$CI = &get_instance();` 在类外部直接调用,严重违反框架生命周期。在 CLI 环境、单元测试或异步任务中会直接抛出 `Fatal Error`,且造成全局状态污染。 | 移除文件顶部的 `$CI` 引用。依赖注入或模型加载应在类构造函数中完成,或交由框架自动加载器管理。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🔴 严重 | `_update_un_book_time` / `update_day_book_info` | `json_decode($data['_time_info'], true)` 未做异常容错。若数据库字段被意外修改或存储非法 JSON,将返回 `null`,后续数组操作会触发 `Warning/Fatal Error` 导致流程中断。 | 增加 JSON 解析校验与降级策略,确保始终返回结构化数组。 | `$decoded = json_decode($data['_time_info'], true);<br>$time_info = is_array($decoded) ? $decoded : ['room_book_time' => [], 'un_book_time' => []];` |
| 🟠 警告 | `_update_un_book_time` / `get_shop_book_info` | 方法内部频繁调用 `$this->load->model()`。每次执行都会重新实例化模型类,造成不必要的内存分配与性能损耗。 | 将常用模型移至类属性,在 `__construct()` 中统一加载,或使用框架的依赖注入容器。 | `protected $bill_model; public function __construct() { $this->bill_model = $this->load->model('ahead_bill_model', '', true); }` |
| 🟠 警告 | `get_shop_book_info` / `v2` | 存在大量重复逻辑(跨天处理、订单状态映射、时间格式化),单方法超 300 行。且隐式存在 N+1 查询风险(循环内调用 `get_one` 或关联查询)。 | 抽取公共逻辑至独立 Service 类(如 `BookingTimeCalculator`)。使用 `WHERE IN` 批量查询替代循环单查,构建内存 Map 进行关联。 | `$ids = array_column($orders, '_id');<br>$map = $this->model->get_data_by_ids($ids, '*', '_id');` |
| 🟠 警告 | 多处时间处理逻辑 | 大量使用 `date()`、`strtotime()` 及硬编码 `86400`、`'00:00'`。未处理时区问题,且 `for` 循环按固定秒数步进,若起始时间戳未对齐 `min_minute_unit_time`,可能导致死循环或时间漏算。 | 统一使用 `DateTime` 对象处理时间,明确业务时区。将步进逻辑改为 `while` 循环配合 `modify()` 或严格对齐算法。 | `$dt = new DateTime('@' . $start, new DateTimeZone('Asia/Shanghai'));<br>while ($dt < $end) { $times[] = $dt->format('H:i'); $dt->modify('+5 minutes'); }` |
| 🟡 建议 | 全局多处 | 魔法数字/字符串泛滥(如 `1`, `2`, `'CYD'`, `'ZD'`, `256`, `'-1'`)。降低可读性,后续业务规则变更时极易遗漏修改点。 | 在类顶部定义语义化常量,替换所有硬编码值。`json_encode` 的 `256` 应替换为 `JSON_UNESCAPED_SLASHES` 等命名常量。 | `const TYPE_ADD = 1; const TYPE_DEL = 2; const PREFIX_BOOK = 'CYD'; const JSON_OPTS = JSON_UNESCAPED_UNICODE \| JSON_UNESCAPED_SLASHES;` |
| 🟡 建议 | `_update_un_book_time` | `array_intersect(...array_values($all_room_book_time))` 使用展开运算符 `...`。当房间数较多或时间段数组较大时,可能超出 PHP 函数参数数量限制(默认 10000+)或引发内存溢出。 | 改用循环逐步求交集,或使用 `array_reduce` 安全计算。 | `$common = array_shift($all_room_book_time);<br>foreach ($all_room_book_time as $arr) { $common = array_intersect($common, $arr); }` |
| 🟡 建议 | `update_day_book_info` | `@return true` 类型声明不规范。PHPDoc 应使用 `@return bool`。且方法直接返回 `true` 掩盖了底层数据库操作失败的可能(如 `insert`/`update` 返回 `false`)。 | 修正 PHPDoc 类型。增加数据库操作结果校验,失败时抛出异常或返回 `false`,便于上层捕获。 | `if (!$this->insert($where)) { throw new RuntimeException('Insert failed'); } return true;` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **移除全局 `$CI = &get_instance();`**:立即将其迁移至类构造函数或依赖注入容器中,避免在 CLI/测试/异步场景下引发致命崩溃。
2. **加固 JSON 解析容错**:所有 `json_decode` 处必须增加 `is_array()` 校验并提供默认空结构,防止脏数据导致服务雪崩。
3. **消除隐式 N+1 查询**:在 `get_shop_book_info` 及相关方法中,将循环内的单条查询改为批量 `WHERE IN` 查询,并在内存中构建索引映射,预计可降低 60%~80% 的数据库交互耗时。
### 🛠 后续重构与优化方向
1. **架构分层(SRP 拆分)**:当前 Model 承担了数据持久化、复杂时间计算、JSON 组装、看板数据格式化等多重职责。建议拆分为:
- `Ahead_shop_book_time_info_model`:仅负责 CRUD 与基础数据映射。
- `BookingTimeService`:处理时间步进、跨天切割、可用时间交集计算。
- `BookingDashboardFormatter`:负责看板数据组装、状态映射与前端格式转换。
2. **时间处理标准化**:废弃裸 `strtotime`/`date` 混用模式。引入 `Carbon` 或原生 `DateTimeImmutable`,统一时区配置(如 `Asia/Shanghai`),并封装 `TimeSlotGenerator` 工具类处理 `5分钟` 步进对齐逻辑。
3. **框架适配说明**:代码呈现典型的 **CodeIgniter 3** 架构特征。若 `phpci` 为内部定制框架,请查阅其官方文档确认:
- 是否支持构造函数依赖注入(推荐替代 `$this->load->model()`)。
- 模型基类 `Simple_model` 是否已封装事务处理(当前多处更新未包裹事务,跨天/跨表更新存在数据不一致风险)。
4. **引入事务保护**:`update_day_book_info` 与 `update_day_time_info_by_bill` 涉及多表/多日期状态联动,建议包裹在 `$this->db->trans_start()` / `$this->db->trans_complete()` 中,确保原子性。
> 💡 **提示**:以上建议代码均符合 PHP 7.4+ / 8.x 语法规范。重构前建议补充单元测试覆盖边界时间(如 `23:55`、跨天 `00:00`、夏令时切换)及异常 JSON 场景,以验证逻辑健壮性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780379218
|
1780379218
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
462
|
21
|
173
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616 🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616' of https://gitea.g-hi.co...
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `bf1edff88 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `bf1edff88440429c70c62cec00506846bb56d7e2`
**提交人**: linyangrui (yangruilin888@gmail.com)
**时间**: 2026-06-02 13:52:49
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了复杂的订单计价、预订校验与支付退款逻辑,业务覆盖较全。但存在明显的**财务精度隐患**、**遗留调试代码**、**事务控制不规范**及**大量魔法数字**。代码结构偏向“过程式堆砌”,缺乏面向对象封装,且未遵循现代 PHP 编码规范。
- **风险等级**:🟠 中(涉及资金计算与支付回调,精度与事务问题可能引发资损或数据不一致)
> 📌 **框架说明**:根据代码结构(`BASEPATH`、`get_instance()`、`system/` 目录规范),当前项目实际基于 **CodeIgniter 3** 框架,而非 `phpci`。以下审查将严格基于 CI3 架构与 PHP 最佳实践进行。
---
## 2. 问题详情
| 严重程度 | 文件/位置 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Neworderservice.php`<br>`getOrderTypeInfo` 方法内 | **遗留调试代码**:循环中存在 `echo $vip_upgrade_data_actual_pay;`。在 API/Service 层直接输出会破坏 JSON/XML 响应结构,导致前端解析失败或支付回调异常。 | 立即删除 `echo`,如需排查请改用 `log_message('debug', ...)` 或框架日志组件。 | `// 删除该行<br>log_message('debug', '升级金额: ' . $vip_upgrade_data_actual_pay);` |
| 🔴 严重 | `Neworderservice.php`<br>多处价格计算逻辑 | **浮点数精度丢失风险**:金额计算直接使用 `float` 运算,仅用 `sprintf("%.2f")` 格式化。PHP 浮点数运算存在固有精度问题(如 `0.1+0.2=0.30000000000000004`),长期运行易导致账目不平。 | 财务计算必须统一转为**整数(分)**或使用 `bcmath` 扩展。所有加减乘除使用 `bcadd`, `bcmul`, `bcsub` 等。 | `$actual_pay = bcmul($price, $quantity, 2);<br>$total = bcadd($total, $actual_pay, 2);` |
| 🟠 警告 | `Ahead_book_order_model.php`<br>`check_notify` 方法 | **事务控制不规范**:使用 `$this->db->trans_start()` 配合 `try-catch` 手动 `trans_rollback()`。CI3 的 `trans_start()` 已内置自动回滚机制,混合使用可能导致状态混乱或重复回滚。 | 改用显式事务控制:`trans_begin()` → 业务逻辑 → `trans_status()` 判断 → `trans_commit()` / `trans_rollback()`。 | 见下方重构示例 |
| 🟠 警告 | 多个文件<br>业务方法内部 | **模型重复加载**:在循环或方法体内频繁调用 `$this->CI->load->model()`。CI3 的 Loader 虽支持重复加载不报错,但会增加不必要的 I/O 与内存开销。 | 将依赖模型统一移至 `__construct()` 中加载,或配置 `config/autoload.php`。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model('Ahead_vip_level_model');<br>}` |
| 🟠 警告 | `Ahead_shop_book_time_info_model.php` | **静态缓存脏数据风险**:大量使用 `public static $xxx = []` 缓存门店/日期数据。在 PHP-FPM 长连接或 CLI 守护进程下,静态变量不会随请求释放,易引发内存泄漏或跨请求数据污染。 | 改为实例属性 `private $cache = []`,或引入 Redis/Memcached。若必须用静态缓存,需在请求结束或关键节点 `unset()`。 | `private static $cache = [];<br>// 使用完后清理<br>self::$cache = [];` |
| 🟡 建议 | `Neworderservice.php`<br>`Ahead_book_order_model.php` | **魔法数字泛滥**:大量使用 `-1, 1, 2, 3, 4, 5, 7, 13, 14, 22` 表示状态、支付渠道、业务类型。可读性极差,后期维护极易出错。 | 定义类常量或独立配置类集中管理。 | `const PAY_WECHAT = 1;<br>const PAY_VIP = 3;<br>const STATUS_DISABLED = -1;` |
| 🟡 建议 | 全部文件 | **未遵循 PSR-12 规范**:缩进不一致、混用 `array()` 与 `[]`、单行过长、注释风格老旧(如 `//add by nan 210317`)。 | 使用 `PHP-CS-Fixer` 或 IDE 自动格式化。统一短数组语法、4空格缩进、移除过时注释。 | 全局替换 `array()` → `[]`<br>统一注释为 `/** ... */` 或 `// ` |
| 🟡 建议 | `Ahead_book_order_model.php`<br>`send_success_msg` | **敏感信息日志泄露**:`doLog(var_export($order_data, true))` 可能记录用户手机号、支付流水号等敏感信息,违反数据安全规范。 | 日志输出前进行脱敏处理(如手机号掩码、流水号截断)。 | `doLog('退款请求: ' . json_encode($safe_data), 'refund');` |
### 🔧 事务控制重构示例(CI3 推荐写法)
```php
$this->db->trans_begin();
try {
// 1. 执行数据库操作
$this->db->insert('table', $data);
$this->db->update('table', $data, ['id' => $id]);
// 2. 检查事务状态
if ($this->db->trans_status() === FALSE) {
$this->db->trans_rollback();
return ['status' => false, 'msg' => '数据库操作失败'];
}
// 3. 提交事务
$this->db->trans_commit();
return ['status' => true, 'msg' => '成功'];
} catch (Exception $e) {
$this->db->trans_rollback();
log_message('error', '事务异常: ' . $e->getMessage());
return ['status' => false, 'msg' => '系统异常'];
}
```
---
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **立即移除 `echo` 调试代码**,防止破坏 API 响应流。
2. **全面替换浮点数运算为 `bcmath` 或整数分计算**,财务模块必须保证精度绝对安全。
3. **规范数据库事务写法**,采用 `trans_begin()` + `trans_status()` 显式控制,避免隐式回滚导致的状态不一致。
4. **模型依赖前置**,将 `load->model()` 移至构造函数,提升执行效率。
### 🛠 后续重构方向
1. **架构分层优化**:当前 `Neworderservice` 承担了过多职责(价格计算、优惠券校验、套餐组装、状态映射)。建议拆分为:
- `PriceCalculator`(纯计算逻辑,无副作用)
- `OrderAssembler`(数据组装与持久化)
- `CouponValidator`(优惠券规则校验)
2. **常量与配置抽离**:建立 `config/order_constants.php`,集中管理支付渠道、订单状态、业务类型等魔法数字。
3. **引入 DTO/VO 模式**:使用数组传递大量业务数据极易出现键名拼写错误或类型不一致。建议定义 `OrderDTO`、`GoodsDTO` 等数据结构类,提升类型安全与 IDE 提示体验。
4. **静态缓存治理**:评估 `Ahead_shop_book_time_info_model` 中的静态缓存必要性。高频查询建议接入 Redis,低频数据使用实例级缓存即可。
> ⚠️ **局限性说明**:提供的 `Neworderservice.php` 与 `Ahead_shop_book_time_info_model.php` 代码在末尾被截断,部分循环逻辑、边界条件处理及辅助函数(如 `mergeTimeRanges`、`throwError`)无法完整评估。建议补充完整代码以便进行更精准的边界测试与安全审计。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780379569
|
1780379569
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
463
|
21
|
174
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 续费时长不足提醒
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `3d5c038c4 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `3d5c038c406ce0d175afd9afe9d642d16466a5e8`
**提交人**: linyangrui (yangruilin888@gmail.com)
**时间**: 2026-06-02 13:55:36
---
## 📋 审查摘要
- **变更文件数**: 1
- **严重问题**: 2
- **高危问题**: 2
- **中危问题**: 1
- **建议优化**: 1
## 🐛 发现的问题
### <font color="red">[跨文件调用] 引用的模块文件在提供的项目结构中不存在</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: 2-4
- **问题描述**: 代码顶部通过 `import` 引入了 `../../../config`、`../../../models/package` 和 `../../../models/billiards`。但提供的项目结构仅包含 PHP/CodeIgniter 系统文件,**未包含任何 JavaScript 模块或模型文件**。无法验证 `PackageModel`、`BilliardsModel` 及其方法 `getTimePackageList()`、`getHourPriceInfo()` 是否存在,若文件缺失或路径错误将直接导致页面白屏或模块加载失败。
- **修复建议**: 确认实际项目目录结构,补充缺失的 JS 配置文件与模型文件,或修正相对路径。若为微信小程序项目,需确保 `models/` 和 `config.js` 存在于正确的相对路径下。
### <font color="red">[语法错误] data 对象中存在重复键名 operational_scene</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: 18, 25
- **问题描述**: `data` 对象中 `operational_scene: ''` 被定义了两次(第18行和第25行)。在 JavaScript 中,后定义的键值会静默覆盖前者,但这属于明显的复制粘贴错误,在严格模式或某些构建工具下会抛出语法警告,且极易引发后续数据绑定混乱。
- **修复建议**: 删除第 25 行的重复定义,保留一处即可。
```javascript
// 修复后
data: {
img_baseurl: config.img_baseurl,
order_type: '',
order_id: '',
operational_scene: '', // 仅保留一处
room_id: '',
// ... 其他字段
}
```
### [逻辑 BUG] toPayPage 方法中未校验索引导致潜在的越界/空指针异常
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: 118, 124
- **问题描述**: `toPayPage()` 中直接通过 `this.data.package_list[this.data.packageIndex].id` 和 `this.data.hour_list[this.data.hourIndex].hour` 获取数据。初始状态下 `packageIndex` 和 `hourIndex` 均为 `-1`。若用户在未点击选择任何套餐或时长时直接触发“下一步”,将抛出 `TypeError: Cannot read properties of undefined`,导致页面崩溃。
- **修复建议**: 在跳转前增加索引有效性校验:
```javascript
toPayPage() {
if (this.data.tabId === 'package') {
if (this.data.packageIndex === -1 || !this.data.package_list[this.data.packageIndex]) {
return wx.showToast({ title: '请选择套餐', icon: 'none' });
}
wx.navigateTo({ url: `...&package_id=${this.data.package_list[this.data.packageIndex].id}&from=renew` });
} else {
if (this.data.hourIndex === -1 || !this.data.hour_list[this.data.hourIndex]) {
return wx.showToast({ title: '请选择时长', icon: 'none' });
}
wx.navigateTo({ url: `...&hour=${this.data.hour_list[this.data.hourIndex].hour}&from=renew` });
}
}
```
### [安全隐患] URL 参数拼接未进行编码处理
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: 118, 124
- **问题描述**: 使用字符串拼接构造 `wx.navigateTo` 的 `url`。若 `order_id`、`order_type` 或动态获取的 `package_id`/`hour` 中包含特殊字符(如 `&`, `?`, `#`, 空格或中文字符),会导致 URL 解析错误、参数截断或路由跳转失败。
- **修复建议**: 使用 `encodeURIComponent()` 对所有动态参数进行安全编码:
```javascript
const params = `order_id=${encodeURIComponent(this.data.order_id)}&order_type=${encodeURIComponent(this.data.order_type)}&package_id=${encodeURIComponent(this.data.package_list[this.data.packageIndex].id)}&from=renew`;
wx.navigateTo({ url: `/pages/community-reserve/pay/pay?${params}` });
```
### [代码质量] 生产环境遗留 console.log 调试代码
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: 108
- **问题描述**: `console.log('getHourPriceInfo', res)` 未移除。在正式环境中输出完整响应对象可能泄露敏感业务数据(如价格策略、用户标识等),且频繁打印会影响小程序性能。
- **修复建议**: 移除该行,或替换为项目统一的日志上报工具(如仅在开发环境输出)。
### [代码质量] 回调风格嵌套较深,建议改用 Promise/async-await
- **严重程度**: 低危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: 45, 105
- **问题描述**: `packageModel.getTimePackageList` 和 `billiardsModel.getHourPriceInfo` 采用传统回调函数风格。在复杂业务逻辑中易导致回调地狱,且错误处理(如网络超时、接口报错)不够直观。
- **修复建议**: 将底层模型请求改造为返回 `Promise`,页面层使用 `async/await` 重构,提升可读性与异常捕获能力。
## ✅ 代码亮点
1. **动态 Tab 渲染逻辑清晰**:`getPackageList` 中根据 `time_package` 和 `hour_list` 的数据状态动态生成 `tab_list`,并自动选中默认项,用户体验设计合理。
2. **状态管理集中**:使用 `this.setData` 统一更新视图状态,符合微信小程序数据驱动的开发规范。
3. **防御性编程意识**:在 `onHourTap` 中对 `item.status == '-1'` 进行了拦截,避免了无效请求。
## 📝 总体建议
1. **框架环境对齐**:提供的项目结构为 PHP/CodeIgniter 后端目录,但变更文件为微信小程序前端 JS。请确保前后端项目目录隔离清晰,或在审查时提供完整的前端目录树,以便准确验证跨文件引用。
2. **强化空值与边界校验**:前端直接依赖后端返回的数组索引极易引发崩溃。建议在数据赋值后统一进行类型/长度校验,或使用可选链操作符 `?.` 提升代码健壮性。
3. **统一请求封装**:建议将 `packageModel` 和 `billiardsModel` 的底层请求统一封装为支持 `Promise` 的 HTTP 客户端,集中处理 Loading 状态、Token 注入、全局错误拦截与重试机制。
4. **代码规范**:建议接入 ESLint + Prettier 进行自动化检查,避免重复键名、未编码参数等低级问题流入生产环境。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780379736
|
1780379736
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
464
|
21
|
175
|
1
|
|
0
|
🔍 代码审查报告:pay-260519 - 定位弹窗bug修复,锁逻辑优化
|
## 自动代码审查报告
**分支**: pay-260519
**提交**: `b65ecaaf1 ## 自动代码审查报告
**分支**: pay-260519
**提交**: `b65ecaaf1ca6e9661d5f83a54a98f597c6b923e3`
**提交人**: linyangrui (yangruilin888@gmail.com)
**时间**: 2026-06-02 14:01:45
---
## 📋 审查摘要
- **变更文件数**: 1
- **严重问题**: 1
- **高危问题**: 2
- **中危问题**: 2
- **建议优化**: 2
## 🐛 发现的问题
### <font color="red">[跨文件调用] 引用了项目中未定义的 config 及 Model 类</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `web/Hi-Zan/Hi-Zan/pages/coupon/shop-list/shop-list.js`
- **行号**: 第 2-4 行
- **问题描述**: 代码中导入了 `../../../config`、`../../../models/public.js` 和 `../../../models/reserve.js`,并实例化了 `PublicModel` 和 `ReserveModel`。但根据提供的项目结构,仅包含 PHP 系统文件,**未包含任何 JS 配置文件或 models 目录**。若这些文件不存在或导出方式不匹配(如未使用 `export class` 或 `module.exports`),将直接导致页面白屏或 `ReferenceError`。
- **修复建议**:
1. 确认 `config.js`、`models/public.js`、`models/reserve.js` 是否真实存在于对应路径。
2. 确保模型文件使用正确的 ES6 模块导出语法,例如:
```javascript
// models/public.js
export class PublicModel { ... }
```
3. 若使用 CommonJS,需改为 `const { PublicModel } = require('../../../models/public.js')`。
### [逻辑 BUG] 未校验数组类型直接调用 includes 方法可能导致运行时崩溃
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/coupon/shop-list/shop-list.js`
- **行号**: 第 238-239 行 (`tuanGouVerify` 方法内)
- **问题描述**: `book_operational_scene.includes(...)` 和 `open_room_operational_scene.includes(...)` 直接假设 `this.data.oper_shop.book_operational_scene` 为数组。若后端返回 `null`、`undefined` 或字符串,调用 `.includes()` 会抛出 `TypeError: Cannot read properties of undefined (reading 'includes')`,导致核销流程中断。
- **修复建议**: 增加类型安全校验或使用可选链:
```javascript
const bookScene = Array.isArray(this.data.oper_shop.book_operational_scene) ? this.data.oper_shop.book_operational_scene : [];
if (bookScene.includes(Number(this.data.operational_scene))) { ... }
```
### [逻辑 BUG] 拨打电话前未校验手机号有效性
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/coupon/shop-list/shop-list.js`
- **行号**: 第 212 行 (`handleCancel` 方法内)
- **问题描述**: `wx.makePhoneCall({ phoneNumber: this.data.oper_shop.shop_phone_number })` 直接读取门店数据。若 `oper_shop` 未正确加载或 `shop_phone_number` 字段为空/非数字字符串,微信 API 会静默失败或弹出错误提示,影响用户体验。
- **修复建议**: 调用前增加有效性校验:
```javascript
const phone = this.data.oper_shop.shop_phone_number;
if (phone && /^1[3-9]\d{9}$/.test(phone)) {
wx.makePhoneCall({ phoneNumber: phone });
} else {
wx.showToast({ title: '门店电话无效', icon: 'none' });
}
```
### [代码质量] 频繁使用 wx.redirectTo 可能导致页面导航栈断裂
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/coupon/shop-list/shop-list.js`
- **行号**: 第 168-203 行 (`onShopClick` 方法内)
- **问题描述**: 多个分支大量使用 `wx.redirectTo` 关闭当前页并跳转。若用户从深层页面(如订单详情)进入此页,`redirectTo` 会销毁当前页,导致用户点击“返回”时直接跳回首页或上一页,破坏预期的导航层级。
- **修复建议**: 根据业务场景区分使用 `wx.navigateTo`(保留当前页,允许返回)或 `wx.redirectTo`。对于“选择门店后返回上一页”的场景,推荐使用 `wx.navigateBack()` 配合页面通信(`getCurrentPages()` 或全局事件总线)传递数据。
### [代码质量] 定位防重入锁状态变量未初始化
- **严重程度**: 中危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/coupon/shop-list/shop-list.js`
- **行号**: 第 78-81 行 (`getLocation` 方法内)
- **问题描述**: `this._locating` 和 `this._locatingTimer` 作为实例属性使用,但未在 `data` 或 `onLoad` 中初始化。虽然 JS 允许动态添加属性,但在严格模式或某些小程序基础库版本中可能引发不可预期的状态残留。
- **修复建议**: 在 `data` 中显式声明或在 `onLoad` 初始化:
```javascript
data: {
// ... 其他字段
_locating: false,
_locatingTimer: null
}
// 使用时改为 this.data._locating 或保持实例属性但统一初始化
```
## ✅ 代码亮点
1. **防重入与超时兜底设计优秀**:`getLocation` 中通过 `this._locating` 防重入,并配合 `setTimeout` 15秒强制释放锁,有效避免了定位 API 异常回调缺失导致的永久阻塞问题。
2. **箭头函数保留上下文**:所有 `wx` API 回调均使用箭头函数 `(res) => {}`,正确绑定了 `this` 指向,避免了传统回调中 `this` 丢失的常见陷阱。
3. **状态分离清晰**:将 UI 展示状态(如 `oper_scene_list_show`)与业务数据(`oper_scene_list`)分离,符合小程序数据驱动视图的最佳实践。
## 📝 总体建议
1. **跨文件依赖强校验**:当前代码强依赖外部 Model 和 Config,建议在项目根目录补充 `jsconfig.json` 或配置 ESLint 路径别名,并在 CI/CD 流程中加入静态依赖检查,防止路径拼写错误或文件遗漏。
2. **异步流程现代化**:当前大量使用回调函数嵌套,建议逐步迁移至 `Promise` + `async/await` 语法(微信基础库已全面支持),可大幅提升代码可读性与错误捕获能力(配合 `try...catch`)。
3. **框架规范说明**:审查要求中提及了 PHP CodeIgniter 规范,但本文件为微信小程序原生 JS。若项目为前后端分离架构,请确保后端 CI 模型命名规范(如 `Xxx_model.php`)与前端 JS 模型调用逻辑解耦,避免命名混淆。
4. **安全加固**:`getCityByLocation` 中腾讯地图 API Key 直接暴露在前端。建议将逆地理编码请求移至后端代理,或配置微信域名白名单及 Key 的 Referer/IP 限制,防止 Key 被恶意盗刷。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780380105
|
1780380105
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
465
|
21
|
176
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616 🔍 代码审查报告:pay-260616 - Merge branch 'pay-260616' of https://gitea.g-hi.co...
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `e6cbddd66 ## 自动代码审查报告
**分支**: pay-260616
**提交**: `e6cbddd666642acd220fe95c1d43a33018e53773`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 14:41:28
---
## 📋 审查摘要
- **变更文件数**: 3
- **严重问题**: 2
- **高危问题**: 5
- **中危问题**: 4
- **建议优化**: 3
## 🐛 发现的问题
### <font color="red">[语法错误] 类定义外部调用 get_instance() 与 load_model()</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 1-3
- **问题描述**: 在 PHP 类定义外部直接执行 `$CI = &get_instance();` 和 `$CI->load->model('Simple_model');`。在 CodeIgniter 框架中,文件被 `require/include` 时框架核心尚未完全初始化,此时调用 `get_instance()` 会返回 `NULL` 或触发致命错误,且破坏了 CI 的模型加载生命周期。
- **修复建议**: 删除文件顶部的全局代码。将基类加载移至构造函数内,或直接继承 CI 标准基类:
```php
class Ahead_shop_book_time_info_model extends CI_Model { // 或 Simple_model
public function __construct() {
parent::__construct();
$this->load->model('Simple_model'); // 如需显式加载
}
}
```
### <font color="red">[跨文件调用] 未加载的自定义 Helper 函数将导致致命错误</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 多处(如 `throwError`, `timeToHour`, `hourToTime`, `mergeTimeRanges`, `shiftTimeRange`, `minutesToUnits`, `minToStr`, `mintoStr`, `getPrevUnitTime` 等)
- **问题描述**: 代码中大量调用了自定义辅助函数,但当前文件及构造函数中均未使用 `$this->load->helper()` 加载对应文件。若未在 `config/autoload.php` 中全局配置,运行时会直接抛出 `Call to undefined function` 致命错误。
- **修复建议**: 在 `__construct()` 中统一加载所需 Helper,或确认已加入自动加载配置:
```php
public function __construct() {
parent::__construct();
$this->load->helper(['custom_time', 'custom_array', 'custom_string']); // 替换为实际文件名
}
```
### <font color="red">[跨文件调用] 依赖的模型/基类未在提供的项目结构中验证</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 类定义行及多处 `$this->load->model()`
- **问题描述**: 代码继承 `Simple_model`,并动态加载 `ahead_family_servers_model`, `ahead_shop_config_second_model`, `ahead_room_discontinue_rule_model`, `ahead_shop_model`, `ahead_room_timing_model`, `ahead_book_time_lock_model`。提供的「项目结构」中未包含这些文件。若文件不存在或命名不符合 CI 规范(如 `Xxx_model.php` 对应类 `Xxx_model`),将触发 `Unable to locate the model you have specified` 错误。
- **修复建议**: 核对 `application/models/` 目录,确保所有被引用的模型文件存在,且文件名与类名严格匹配(CI3 推荐首字母大写或全小写,但需与 `$this->load->model('xxx_model')` 参数一致)。
### [安全隐患] 前端未校验数据直接调用系统 API 可能导致崩溃
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/coupon/shop-list/shop-list.js`
- **行号**: ~238 (`handleCancel` 方法)
- **问题描述**: `wx.makePhoneCall({ phoneNumber: this.data.oper_shop.shop_phone_number })` 未对 `oper_shop` 对象及 `shop_phone_number` 字段进行非空校验。若用户未选择门店或数据未正确回显即触发取消操作,将传入 `undefined`,导致微信 API 报错并中断后续逻辑。
- **修复建议**: 增加防御性判断:
```javascript
handleCancel() {
this.setData({ showConfirm: false });
const phone = this.data.oper_shop?.shop_phone_number;
if (!phone) return wx.showToast({ title: '暂无联系电话', icon: 'none' });
wx.makePhoneCall({ phoneNumber: phone });
}
```
### [逻辑 BUG] JS 对象字面量键名重复导致数据覆盖
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: ~20, ~26
- **问题描述**: `data` 对象中 `operational_scene: ''` 被定义了两次。在 JS 中,后定义的键会静默覆盖前者,可能导致初始状态混乱,且增加后期维护排查成本。
- **修复建议**: 删除重复的 `operational_scene: ''` 定义,保留一处即可。
### [逻辑 BUG] 数组索引越界风险未做拦截
- **严重程度**: 高危
- **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/continue-packages/continue-packages.js`
- **行号**: ~105, ~110 (`toPayPage` 方法)
- **问题描述**: 直接通过 `this.data.package_list[this.data.packageIndex].id` 和 `this.data.hour_list[this.data.hourIndex].hour` 拼接 URL。若 `packageIndex` 或 `hourIndex` 仍为初始值 `-1`,或对应数组为空,将抛出 `Cannot read properties of undefined` 异常导致页面白屏。
- **修复建议**: 跳转前增加有效性校验:
```javascript
toPayPage() {
if (this.data.tabId === 'package') {
if (this.data.packageIndex < 0 || !this.data.package_list[this.data.packageIndex]) {
return wx.showToast({ title: '请选择套餐', icon: 'none' });
}
// ... 跳转逻辑
} else {
if (this.data.hourIndex < 0 || !this.data.hour_list[this.data.hourIndex]) {
return wx.showToast({ title: '请选择时长', icon: 'none' });
}
// ... 跳转逻辑
}
}
```
### [代码质量] 多处拼写错误可能导致逻辑分支失效
- **严重程度**: 中危
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: 多处
- **问题描述**: 存在明显的拼写不一致或错误,若前端或下游逻辑依赖这些字段名将导致数据匹配失败:
- `mintoStr` (应为 `minToStr`,与同文件其他调用不一致)
- `v['opreational_scene']` (应为 `operational_scene`)
- `cross_day_emd_time` (应为 `cross_day_end_time`)
- **修复建议**: 使用 IDE 全局搜索替换功能统一修正拼写,并建立提交前拼写检查规范。
### [代码质量] 核心方法过长,违反单一职责原则
- **严重程度**: 中危
- **文件**: `application/models/Ahead_shop_book_time_info_model.php`
- **行号**: `get_book_day_time_info` 方法 (约 350+ 行)
- **问题描述**: 该方法同时承担了时间计算、套餐可用性校验、门店营业时间判断、不可用时间合并、跨天逻辑处理、价格信息获取等过多职责。代码嵌套深、状态变量多,极难进行单元测试和后续迭代维护。
- **修复建议**: 按业务边界拆分为多个私有方法,例如:
- `_calculate_business_time_range()`
- `_check_package_time_availability()`
- `_merge_unavailable_time_slots()`
- `_apply_voucher_restrictions()`
主方法仅负责流程编排,提升可读性与可测试性。
## ✅ 代码亮点
1. **定位防重入机制优秀**:`shop-list.js` 中的 `getLocation` 使用了 `_locating` 锁配合 `15秒` 超时兜底释放,有效避免了并发请求和异常回调导致的永久阻塞,体现了扎实的异步编程功底。
2. **动态 Tab 渲染逻辑清晰**:`continue-packages.js` 根据 `package_list` 和 `hour_list` 的实际数据动态生成 `tab_list` 并自动选中默认项,交互体验流畅。
3. **静态缓存优化查询**:PHP 模型中合理使用 `self::$book_days_info`、`self::$shop_data` 等静态变量缓存高频查询结果,有效降低了数据库 IO 压力。
## 📝 总体建议
1. **严格遵循 CI 生命周期**:立即修复模型文件顶部的全局 `$CI` 调用,确保所有依赖加载在 `__construct()` 或方法内部执行。建议统一在 `autoload.php` 中配置常用 Helper/Model,避免遗漏。
2. **强化前端防御性编程**:小程序端在调用 `wx.navigateTo`、`wx.makePhoneCall` 或访问数组元素前,务必进行非空与边界校验,防止因后端数据延迟或异常导致前端崩溃。
3. **重构巨型方法**:`get_book_day_time_info` 是典型的“上帝方法”,建议尽快按职责拆分。可引入策略模式或工厂模式处理不同场景(如团购券、普通预订、跨天预订)的时间计算逻辑。
4. **建立跨文件引用检查流程**:建议在 CI/CD 或本地提交钩子中加入静态分析工具(如 PHPStan、ESLint),自动拦截未定义的函数、类及拼写错误,降低运行时风险。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780382488
|
1780382488
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
466
|
21
|
177
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 优惠券可用,0元判断
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `3f39beffe ## 自动代码审查报告
**分支**: pay-260616
**提交**: `3f39beffef0899eed9db6cbf300ea1c7978dff1b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 14:55:53
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了较为完整的优惠券/奖励券业务逻辑,包含状态映射、场景过滤、批量数据组装等功能。但存在明显的 **SQL 注入风险**、**循环内 N+1 查询性能瓶颈**、**异常吞没** 以及 **拼写/命名不规范** 问题。代码末尾存在截断,导致语法不完整。整体可维护性与安全性需重点优化。
- **风险等级**:🔴 高(存在 SQL 注入隐患与未处理的语法截断)
> 📌 **框架说明**:根据目录结构(`system/`, `application/`)及 `$this->load->model()` 等特征,推断实际框架为 **CodeIgniter 3.x**。以下审查基于 CI3 最佳实践。若 `phpci` 为自研框架,请对照其官方文档调整组件调用方式。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_valid_coupon` 末尾 | **代码截断与语法错误**:方法在 `continue` 处中断,缺少分号及闭合大括号,直接导致解析失败。 | 补全逻辑分支、闭合 `foreach`、`if` 及方法体。确保所有控制流完整。 | `continue;`<br>`}`<br>`}`<br>`return [...];` |
| 🔴 严重 | `get_my_reward_list`<br>`get_reward_list` | **SQL 注入漏洞**:`$params['name']` 与 `$shopIds` 直接拼接至 `LIKE` 和 `REGEXP` 语句中,未做转义或参数绑定。 | 使用 CI Query Builder 的 `like()` 方法,或对输入进行严格类型校验与 `escape()` 处理。 | `$this->db->like('reward._name', $params['name']);`<br>`$shopIds = array_map('intval', $shopIds);` |
| 🟠 警告 | `build_reward_data` | **N+1 查询性能瓶颈**:在 `foreach` 循环中调用 `get_package_shop_ids()` 和 `get_one()`,数据量大时将引发严重数据库压力。 | 提前收集所有 `relation_id`,使用 `WHERE IN` 批量查询,构建映射数组后再循环赋值。 | 见下方重构示例 |
| 🟠 警告 | `add_reg_reward`<br>`add_reg_gift` | **异常吞没**:`catch (Exception $e)` 仅返回固定提示,未记录错误堆栈,导致线上问题难以排查。 | 使用 `log_message('error', $e->getMessage());` 记录日志,或向上抛出异常交由全局错误处理。 | `catch (\Exception $e) { log_message('error', $e->getMessage()); return ['success'=>false, 'msg'=>'系统异常']; }` |
| 🟠 警告 | 文件头部 | **错误使用 `get_instance()`**:在 Model 文件顶部直接调用 `$CI = &get_instance();` 违反 CI 生命周期,且 Model 内部应直接使用 `$this`。 | 删除全局 `$CI` 赋值。若需调用其他组件,应在方法内使用 `$this->load->...` 或 `$this->...`。 | `// 删除此行:<br>// $CI = &get_instance();` |
| 🟡 建议 | 全文多处 | **拼写与命名不规范**:`$fileds` → `$fields`,`$from_palce` → `$from_place`,`TYPR_DADA` → `TYPE_DATA`。违反 PSR-12。 | 全局搜索替换修正拼写,常量使用大写下划线,变量使用小驼峰或蛇形。 | `const TYPE_DATA = [...];<br>public $fields = "...";` |
| 🟡 建议 | 各方法内部 | **重复加载 Model/Library**:`$this->load->model()` 在多个方法中重复调用,增加框架解析开销。 | 将公共依赖移至 `__construct()` 中加载,CI 会自动缓存已加载组件。 | `public function __construct() { parent::__construct(); $this->load->model('Ahead_shop_model'); }` |
| 🟡 建议 | `build_reward_data` | **时间计算逻辑脆弱**:`strtotime(date("Ymd") . " +1 day")` 依赖字符串拼接,易受时区影响。 | 使用 `strtotime('today')` 与 `strtotime('tomorrow')` 或 `DateTime` 对象提升可读性与准确性。 | `$today_start = strtotime('today');<br>$tomorrow_start = strtotime('tomorrow');` |
---
## 3. 总结与行动建议
### 🔑 优先修复项(P0/P1)
1. **修复 SQL 注入**:立即替换所有手动拼接的 `LIKE`、`REGEXP`、`FIND_IN_SET` 语句。CI3 推荐使用 `$this->db->like()`、`$this->db->where_in()` 或 `$this->db->query($sql, $bindings)` 进行参数绑定。
2. **补全代码截断**:检查 `get_valid_coupon` 方法末尾逻辑,确保 `continue;` 语法完整,并闭合所有控制块。
3. **消除 N+1 查询**:将 `build_reward_data` 中的循环内查询改为批量查询。示例:
```php
// 优化前(循环内查询)
foreach ($reward_data as &$row) {
$row['shop_ids'] = $this->model->get_package_shop_ids($row['relation_id']);
}
// 优化后(批量查询+映射)
$relation_ids = array_column($reward_data, 'relation_id');
$shop_map = $this->model->get_package_shop_ids_batch($relation_ids); // 返回 [id => shop_ids]
foreach ($reward_data as &$row) {
$row['shop_ids'] = $shop_map[$row['relation_id']] ?? [];
}
```
### 🛠 后续重构方向
1. **统一数据访问层**:当前 Model 承担了过多业务逻辑(如 URL 拼接、前端展示字段组装)。建议将 `build_reward_data` 中的视图渲染逻辑剥离至 `Service` 层或 `Helper`,保持 Model 专注数据读写。
2. **引入类型声明**:若运行环境为 PHP 7.4+,建议为方法参数和返回值添加类型提示(如 `public function add_reg_reward(int $merchantId, int $shopId, int $uid, array $params = []): array`),提升静态分析能力与代码健壮性。
3. **配置化魔法值**:将硬编码的状态码、场景映射、图片 URL 等抽离至配置文件(如 `config/reward.php`),便于运营动态调整,减少代码修改频率。
4. **规范异常处理**:建立统一的业务异常类(如 `RewardException`),在 Controller 层捕获并格式化返回,避免 Model 层直接返回 `['success'=>false, 'msg'=>...]` 混合结构。
> 💡 **提示**:若需针对 `get_valid_coupon` 截断部分进行完整审查,请提供完整代码。当前审查已覆盖核心风险点,建议按优先级逐步落地修复。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780383353
|
1780383353
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
467
|
22
|
54
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 订单详情返回用户的会员卡号
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `7136a48c5 ## 自动代码审查报告
**分支**: app-260519
**提交**: `7136a48c5358a221cdd324dfa2658ccab6831642`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 15:48:11
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:该控制器承载了路由分发、身份鉴权、多业务逻辑处理及响应格式化,属于典型的“上帝控制器”。代码中存在敏感信息硬编码、明文密码比对、绕过框架输入过滤等高危安全隐患;架构上严重违背单一职责原则,维护成本极高。整体符合早期 CI3 遗留系统的常见写法,但距离现代 PHP 安全与工程规范差距较大。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据目录结构(`system/`、`application/`)、常量 `BASEPATH` 及 `$this->load->` 等语法,该代码实际运行于 **CodeIgniter 3.x** 框架。下文审查将基于 CI3 最佳实践与 PSR-12 规范进行。若 `phpci` 为内部定制框架,核心安全与架构建议依然适用。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 约 L340-L346 | **敏感配置硬编码**:科大讯飞 TTS 的 `APPID`、`APISecret`、`APIKey` 直接暴露在源码中,极易通过版本库泄露。 | 移至独立配置文件(如 `config/xfyun.php`)或服务器环境变量,通过 `$this->config->item()` 读取。 | `// config/xfyun.php<br>$config['xfyun'] = [<br> 'APPID' => getenv('XFYUN_APPID'),<br> 'APISecret' => getenv('XFYUN_SECRET'),<br> 'APIKey' => getenv('XFYUN_KEY')<br>];` |
| 🔴 严重 | 约 L280 | **明文密码存储与比对**:`$data['_discount_pwd'] != $_old_password` 疑似明文比对,违反密码安全基线。 | 数据库必须存储 `password_hash()` 结果,验证时使用 `password_verify()`。 | `if (!password_verify($_old_password, $data['_discount_pwd'])) {<br> $this->error_response('旧密码不正确');<br>}` |
| 🔴 严重 | L45, L18 | **绕过框架输入过滤**:直接使用 `$_POST` 与 `php://input`,未使用 CI 的 `$this->input` 类,丧失 XSS 过滤与全局过滤机制。 | 统一使用 `$this->input->raw_input_stream` 或 `$this->input->post()`,并开启全局 XSS 过滤。 | `$raw = $this->input->raw_input_stream;<br>$this->stream = json_decode($raw, true) ?: [];` |
| 🟠 警告 | L1-L100+ | **上帝控制器/路由耦合**:`__construct` 与 `index()` 混合了鉴权、配置加载、业务路由、数据组装,代码超千行,难以测试与维护。 | 将鉴权逻辑抽离至 `BaseController` 或 CI Hook;将 `switch` 分支拆分为独立方法;业务逻辑下沉至 Service/Model。 | 使用 CI 路由配置映射 `function` 到独立方法,或采用命令模式分发。 |
| 🟠 警告 | 多处 `error_response` | **破坏框架生命周期**:错误处理疑似直接 `exit/die`,导致 CI 的 `post_controller`、Session 写入、日志记录等钩子无法执行。 | 改为抛出标准异常,或使用 CI 的 `show_error()`;若必须返回 JSON,应在统一输出层处理。 | `throw new \RuntimeException('token参数错误', 401);`<br>配合全局异常处理器统一输出 JSON。 |
| 🟠 警告 | L105, L115, L200+ | **重复加载模型/配置**:在 `switch` 各分支中频繁 `load->model()` 与 `load->config()`,增加 I/O 开销。 | 在 `__construct` 中统一加载高频模型;低频模型按需加载但需避免重复调用。 | `$this->load->model(['ahead_yc_merchant_model', 'ahead_yc_shop_model']);` |
| 🟡 建议 | L12, L14 | **拼写与命名不一致**:`AplicationController` 拼写错误;`$current_vresion` 拼写错误;属性命名混合驼峰与下划线。 | 修正拼写,统一使用 `camelCase` 命名类属性,遵循 PSR-12。 | `class MerchantAppServer extends ApplicationController`<br>`public $currentVersion = '2.0';` |
| 🟡 建议 | L118, L300+ | **魔法数字/硬编码泛滥**:如 `23142`、`600`、`533`、`10` 等无业务语义的常量散落各处。 | 提取为类常量或配置文件,添加明确注释。 | `const MERCHANT_CAMBODIA_ID = 23142;`<br>`const PAY_TYPE_MEMBER = 10;` |
| 🟡 建议 | 全文 | **PSR-12 规范缺失**:缩进不统一、超长行未换行、缺少类型声明、注释风格混杂。 | 使用 `PHP-CS-Fixer` 自动格式化;添加 `declare(strict_types=1);` 及参数类型提示。 | 配置 `.php-cs-fixer.php` 并执行 `php-cs-fixer fix`。 |
---
## 3. 总结与行动建议
### 🔑 优先修复的关键问题(P0/P1)
1. **立即移除硬编码密钥**:将 `xfyun_tts_config` 迁移至环境变量或加密配置,并执行密钥轮换。
2. **修复密码验证逻辑**:全面排查 `_discount_pwd` 等密码字段,实施 `password_hash`/`password_verify` 迁移脚本。
3. **统一输入获取方式**:替换所有 `$_POST`/`php://input` 为 `$this->input->raw_input_stream`,确保全局 XSS 过滤生效。
4. **规范错误响应机制**:避免在控制器中直接 `exit`,改用异常机制或统一 JSON 响应中间件,保障 CI 生命周期完整。
### 🛠 后续重构与优化方向
1. **架构拆分(SRP 原则)**:
- 将 `index()` 中的 `switch` 逻辑改造为 **路由分发器** 或 **命令模式**。每个 `function` 对应一个独立的 Service 类方法。
- 鉴权、Token 解析、权限校验抽离至 `BaseController::initAuth()` 或 CI `pre_controller` Hook。
2. **性能优化**:
- 合并重复的模型加载与配置读取。
- 针对 `array_merge` 频繁操作大数组的场景,改用引用传递或按需构建。
- 对高频查询(如门店配置、权限列表)引入 CI Cache 或 Redis 缓存。
3. **工程规范落地**:
- 引入 `PHP-CS-Fixer` 与 `PHPStan` 进行静态检查与格式化。
- 为关键业务方法补充单元测试(PHPUnit),覆盖鉴权失败、参数异常、权限越权等边界条件。
- 若项目允许,建议逐步向 CI4 或现代 PHP 框架迁移,利用其内置的依赖注入、路由分组、中间件等特性降低耦合。
> ⚠️ **局限性说明**:由于提供的代码在 `case "1001"` 处截断,未能完整审查结账取消逻辑、数据库事务处理及并发控制部分。建议补充完整文件后,针对 `bill_frequency`、`open_room_log` 状态机流转进行二次专项审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780386491
|
1780386491
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
468
|
22
|
55
|
1
|
|
0
|
🔍 代码审查报告:app-260519 - 1
|
## 自动代码审查报告
**分支**: app-260519
**提交**: `cba73c16a ## 自动代码审查报告
**分支**: app-260519
**提交**: `cba73c16a1126fa6360fe68b6349e638ce336128`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 15:51:41
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了商家端核心业务路由与鉴权逻辑,但存在严重的安全硬编码、密码明文比对隐患、控制器职责过重(God Class)及大量魔法数字。整体架构偏向过程式堆砌,缺乏面向对象封装与配置化管理,可维护性与扩展性较差。
- **风险等级**:🔴 高
> 📌 **框架说明**:代码结构、加载方式(`$this->load->`、`$this->db->`、`defined('BASEPATH')`)高度契合 **CodeIgniter 3** 规范。若 `phpci` 为内部定制框架,部分生命周期与组件行为请以官方文档为准。本审查基于 CI3 最佳实践进行。
> ⚠️ **局限性说明**:代码在 `case "1001"` 处被截断,后续逻辑无法评估。以下审查基于已提供片段。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `~330行` | **敏感信息硬编码**:科大讯飞 TTS 的 `APISecret`、`APIKey` 直接写在控制器中,极易随代码库泄露。 | 移至环境变量或受保护的配置文件(如 `application/config/secrets.php`),通过 `getenv()` 或 `$this->config->item()` 读取。 | `// config/secrets.php<br>'xfyun' => [<br> 'app_id' => getenv('XFYUN_APPID'),<br> 'api_key' => getenv('XFYUN_APIKEY'),<br> 'api_secret' => getenv('XFYUN_APISECRET')<br>]<br>// 控制器中<br>$config = $this->config->item('xfyun');` |
| 🔴 严重 | `~480行` | **密码明文比对**:`$data['_discount_pwd'] != $_old_password` 暗示密码可能以明文或弱哈希存储,违反安全基线。 | 数据库必须存储 `password_hash()` 生成的哈希值,验证时使用 `password_verify()`。 | `if (!password_verify($_old_password, $data['_discount_pwd'])) {<br> $this->error_response('旧密码不正确');<br>}<br>$new_hash = password_hash($_new_password1, PASSWORD_DEFAULT);<br>$this->ahead_yc_merchant_user_model->update(['_discount_pwd' => $new_hash], ['_id' => $uid]);` |
| 🔴 严重 | `全局` | **响应方法未终止执行**:`$this->error_response()` / `$this->success_response()` 调用后未 `exit` 或 `return`,导致后续代码继续执行,可能引发重复响应或逻辑越权。 | 确保响应方法内部调用 `exit()`,或在调用处使用 `return $this->error_response(...)`。 | `// 推荐写法<br>return $this->error_response("参数错误");<br>// 或在 error_response 方法末尾添加<br>exit(json_encode($response));` |
| 🟠 警告 | `~35行` | **CORS 策略过于宽松**:`Access-Control-Allow-Origin: *` 允许任意域名跨域请求商家接口,易被恶意站点利用。 | 根据实际业务限制来源域名,或使用动态白名单校验 `Origin` 头。 | `$origin = $_SERVER['HTTP_ORIGIN'] ?? '';<br>$allowed = ['https://merchant.yourdomain.com'];<br>if (in_array($origin, $allowed)) {<br> header("Access-Control-Allow-Origin: $origin");<br>}` |
| 🟠 警告 | `__construct` | **条件跳过初始化导致状态不一致**:`if ($this->router->fetch_method() !== "uploadPic")` 跳过了数据库、配置、模型的加载。若 `uploadPic` 依赖这些组件将直接报错。 | 将公共初始化移至 `__construct` 顶部,仅将鉴权逻辑放入条件判断,或为 `uploadPic` 单独创建控制器。 | `parent::__construct();<br>$this->load->database('default');<br>$this->config->load('config_talent');<br>// 鉴权逻辑独立<br>if ($this->router->fetch_method() !== 'uploadPic') {<br> $this->_check_auth();<br>}` |
| 🟠 警告 | `index()` | **巨型路由方法违反单一职责**:`index()` 方法超千行,包含登录、个人中心、打印机、支付配置等数十个业务分支,难以测试与维护。 | 按业务模块拆分为独立控制器(如 `AuthController`, `ProfileController`, `PrinterController`),或使用框架路由映射。 | `// 路由配置示例<br>$route['merchant/(:any)'] = 'MerchantApp/$1';<br>// 拆分后<br>class AuthController extends AplicationController { public function login() { ... } }` |
| 🟠 警告 | `~380,410行` | **冗余获取 CI 实例**:在控制器内部使用 `$CI = &get_instance();` 赋值属性,控制器本身已是实例,此操作多余且易引发作用域混淆。 | 直接使用 `$this` 访问属性或方法。 | `// 移除<br>$CI = &get_instance();<br>$CI->token = $result['token'];<br>// 改为<br>$this->token = $result['token'];` |
| 🟡 建议 | `全局` | **大量魔法数字与硬编码 ID**:如 `'0005'`, `694`, `849`, `533` 等散落在代码中,业务规则变更时需全局搜索替换。 | 提取为类常量或独立配置文件(如 `config/menu_ids.php`)。 | `const FUNC_LOGIN = '0005';<br>const MENU_FILTER_IDS = [694, 849, 824, 1250];<br>if (in_array($v['id'], self::MENU_FILTER_IDS)) { ... }` |
| 🟡 建议 | `类属性` | **属性全部声明为 `public`**:破坏封装性,外部可直接修改内部状态,增加不可预知的副作用风险。 | 改为 `protected` 或 `private`,通过 getter/setter 或构造函数初始化。 | `protected $stream;<br>protected $expire_sms_time = 600;<br>protected $current_version = "2.0";` |
| 🟡 建议 | `~35行` | **拼写错误**:基类名 `AplicationController` 缺少字母 `p`,若为框架核心类名不一致将导致致命错误。 | 修正为 `ApplicationController`(需确认框架实际基类名称)。 | `class MerchantAppServer extends ApplicationController` |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **移除硬编码密钥**:立即将 `xfyun_tts_config` 中的 `APISecret` 和 `APIKey` 迁移至环境变量或服务器安全配置中,并检查 Git 历史是否已泄露。
2. **修复密码验证逻辑**:全面排查 `_discount_pwd` 字段存储方式,强制实施 `password_hash()` / `password_verify()` 标准流程。
3. **阻断响应后代码执行**:全局检查 `error_response()` 与 `success_response()` 实现,确保输出 JSON 后立即 `exit`,或统一改为 `return` 模式。
### 🛠 重构与优化方向
1. **控制器瘦身(SRP 原则)**:当前 `MerchantAppServer` 承担了路由分发、鉴权、登录、个人中心、打印机管理、支付配置等职责。建议按业务域拆分为 4~5 个独立控制器,`index()` 仅保留路由分发或废弃改用框架原生路由。
2. **配置与常量集中化**:将菜单过滤 ID、权限 ID、支付平台映射、API 版本号等提取至 `application/config/merchant_rules.php`,避免业务逻辑与配置耦合。
3. **性能优化**:
- `case '0005'` 中存在大量串行 DB 查询(`get_admin_menu`, `get_one`, `get_modules` 等)。建议对高频读取的配置类数据引入 Redis 缓存(框架已提供 `Cache` 组件)。
- 菜单过滤逻辑使用 `foreach` + `unset` + `array_values` 效率较低,可改用 `array_filter` 或预定义白名单映射。
4. **规范与可维护性**:
- 统一属性可见性为 `protected`。
- 清理过期注释(如 `//edit by nan 17.10.25`),改用 Git 提交记录追溯变更。
- 补充输入校验:`json_decode` 后应检查 `json_last_error()`,防止畸形 JSON 导致后续数组访问报错。
> 💡 **后续建议**:在重构前,建议为当前核心接口补充 PHPUnit 单元测试或集成测试,确保拆分与优化过程中业务逻辑不发生退化。若需针对 `case "1001"` 截断部分进行深度审查,请提供完整代码片段。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780386701
|
1780386701
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
469
|
22
|
56
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `67f40bda4 ## 自动代码审查报告
**分支**: app-260616
**提交**: `67f40bda4fe54e9ed5e8f551606cdea0973b268b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 15:52:23
---
## 1. 审查摘要
- **代码质量评分**:4.5 / 10 分
- **总体评价**:该控制器实现了商家端 App 的核心路由与业务分发功能,业务覆盖较广。但存在明显的架构反模式(巨型 `switch` 充当路由器、构造函数职责过重)、严重的安全隐患(硬编码密钥、CORS 通配符、疑似明文密码比对)以及大量重复逻辑。代码可维护性、安全性与扩展性均处于较低水平,亟需重构。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | ~380-385 | **硬编码第三方服务密钥**:科大讯飞 TTS 的 `APPID`、`APISecret`、`APIKey` 直接写死在代码中,极易随版本库泄露,导致服务被盗刷或数据泄露。 | 将敏感凭证移至 `application/config/` 独立配置文件或服务器环境变量中,通过 `$this->config->item()` 读取。 | `'xfyun_tts_config' => $this->config->item('xfyun_tts')` |
| 🔴 严重 | ~100-105 | **CORS 通配符配置**:`Access-Control-Allow-Origin: *` 允许任意域名跨域请求,结合 Token 鉴权机制,极易遭受 CSRF 攻击或敏感接口被恶意调用。 | 限制为可信域名白名单,或通过配置项动态输出,禁止使用 `*`。 | `header("Access-Control-Allow-Origin: " . $this->config->item('allowed_origins'));` |
| 🔴 严重 | ~450-455 | **密码校验与存储不规范**:`if ($data['_discount_pwd'] != $_old_password)` 疑似直接比对明文密码;且更新时未进行哈希处理,违反现代密码安全规范。 | 使用 `password_hash()` 存储,`password_verify()` 校验。若历史数据为明文,需规划平滑迁移方案。 | `if (!password_verify($_old_password, $data['_discount_pwd'])) { $this->error_response('旧密码不正确'); }`<br>`$this->ahead_yc_merchant_user_model->update(['_discount_pwd' => password_hash($_new_password1, PASSWORD_DEFAULT)], ['_id' => $uid]);` |
| 🟠 警告 | ~15-20 | **构造函数职责过重**:`__construct` 中混合了请求解析、CORS 设置、鉴权、权限校验、配置加载、日志记录等,严重违反单一职责原则(SRP),且影响单元测试。 | 将鉴权、日志、配置初始化抽离至中间件或基类控制器(如 `BaseApiController`);构造函数仅保留核心依赖注入。 | 提取 `AuthMiddleware::handle()`、`ApiLogger::log()` |
| 🟠 警告 | ~200-350 | **巨型 Switch 充当路由器**:`index()` 方法使用超长 `switch` 分发 30+ 个接口,导致方法膨胀、难以维护,且每次请求都会加载大量未使用的 Model。 | 采用 CI3 原生路由配置,或改为动态方法调用(如 `$this->{$method}()`),将每个 `case` 拆分为独立方法。 | `public function func_0005() { /* 登录逻辑 */ }`<br>`$method = 'func_' . $request['function']; if (method_exists($this, $method)) { return $this->$method(); }` |
| 🟠 警告 | ~250-260 | **重复的权限校验与菜单过滤**:登录接口中多次调用 `check_priv`,且硬编码菜单 ID(Magic Numbers),业务规则与代码强耦合。 | 将菜单过滤规则配置化(如 `config/menus.php`);提取独立的 `MenuService` 或 `PermissionService` 处理组装逻辑。 | `$this->menu_service->filterByPriv($menus, $user_type, $role_id);` |
| 🟠 警告 | ~500-530 | **支付方式过滤逻辑冗余**:`00066` 接口中针对 `api_type` 的过滤存在大量重复的 `if` 与 `array_diff`,违反 DRY 原则。 | 使用映射数组统一管理排除规则,通过循环批量处理。 | `$exclude_map = ['bill_pay' => [10], 'vip_recharge' => [3,7,8...]];`<br>`$exclude = $exclude_map[$api_type] ?? [];`<br>`$data['paytype'] = array_values(array_diff($data['paytype'], $exclude));` |
| 🟡 建议 | ~10 | **基类拼写错误**:`extends AplicationController` 疑似拼写错误,可能导致类继承失败或 IDE 无法识别。 | 修正为正确的基类名称(如 `CI_Controller` 或 `ApplicationController`)。 | `class MerchantAppServer extends CI_Controller` |
| 🟡 建议 | ~30-40 | **JSON 解析缺乏容错**:`json_decode($this->stream, true)` 未校验解析结果,若客户端传入非法 JSON 会导致后续逻辑崩溃或返回 500 错误。 | 增加 `json_last_error()` 校验,并统一使用 `php://input` 读取请求体。 | `$raw = file_get_contents('php://input');`<br>`$data = json_decode($raw, true);`<br>`if (json_last_error() !== JSON_ERROR_NONE) { $this->error_response('请求数据格式错误'); }` |
| 🟡 建议 | 全文 | **代码规范与可读性**:缩进不一致、长行未换行、变量命名混杂(如 `$this->stream` 与 `$this->get_stream`)、缺少类型声明与注释,不符合 PSR-12。 | 使用 `PHP-CS-Fixer` 或 IDE 自动格式化;统一使用驼峰/蛇形命名;为复杂逻辑添加 PHPDoc。 | 略(建议接入 CI/CD 静态检查流水线) |
> 📝 **注**:代码在 `case "1001":` 处被截断,无法评估该分支的完整逻辑与潜在风险。若该分支涉及订单状态变更或资金操作,请补充完整代码以便进行深度审查。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **立即移除硬编码密钥**:将 `xfyun_tts_config` 等敏感信息迁移至配置文件或 `.env`,并检查 Git 历史是否已泄露。
2. **修复密码安全逻辑**:全面排查 `_discount_pwd` 及其他密码字段的存储与校验方式,强制引入 `password_hash`/`password_verify`。
3. **收敛 CORS 策略**:将 `Access-Control-Allow-Origin: *` 替换为业务域名白名单,避免接口被恶意跨域调用。
4. **增加输入校验容错**:对 `json_decode`、`file_get_contents('php://input')` 增加异常捕获与格式校验,防止恶意请求导致服务崩溃。
### 🛠 后续重构与优化方向
1. **架构解耦(核心)**:
- 废弃 `index()` 巨型 `switch` 路由,改用 **CI3 原生路由** 或 **命令模式/动态方法分发**。
- 将鉴权、日志、配置加载等横切关注点抽离至 **中间件** 或 **基类控制器**,保持业务方法纯净。
2. **服务层拆分**:
- 将菜单组装、权限校验、支付方式过滤等复杂逻辑下沉至独立的 `Service` 类,控制器仅负责参数接收、调用服务、返回响应。
- 消除硬编码的 Magic Numbers(如菜单 ID、支付平台 ID),统一收敛至配置中心或数据库字典表。
3. **性能与规范提升**:
- 模型加载统一移至构造函数或按需懒加载,避免在 `switch` 分支中重复调用 `$this->load->model()`。
- 引入 PSR-12 代码规范检查工具(如 `php-cs-fixer`),统一命名风格,补充关键方法的 PHPDoc 注释。
- 针对高频接口(如登录、个人中心)考虑引入 Redis 缓存菜单/配置数据,降低 DB 查询压力。
> 💡 **框架适配提示**:当前代码特征与 **CodeIgniter 3** 高度吻合。若 `phpci` 为内部定制框架,请确认其是否支持中间件机制与动态路由。若不支持,建议优先采用 `BaseController` 继承模式与 `call_user_func_array` 实现轻量级分发,逐步向现代 MVC 架构演进。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780386743
|
1780386743
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
470
|
18
|
177
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - Merge remote-tracking branch 🔍 代码审查报告:pc-260616 - Merge remote-tracking branch 'origin/pc-260616' in...
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `71ebc9a81e ## 自动代码审查报告
**分支**: pc-260616
**提交**: `71ebc9a81e26e7d1caa646d4031160c759ae06d9`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 17:05:44
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了丰富的报表查询与导出功能,以及多项定时任务逻辑。但整体存在**严重的架构规范偏离、安全隐患及性能瓶颈**。大量重复的导出逻辑、直接操作超全局变量、非标准的事务处理、硬编码配置及全局函数滥用,显著降低了系统的可维护性与安全性。
- **风险等级**:🔴 高
> 📌 **框架说明**:提交代码的底层特征(如 `BASEPATH`、`$this->load->model`、`$this->db->trans_start`、`$this->input` 等)高度符合 **CodeIgniter 3/4** 规范。若 `phpci` 为贵司基于 CI 深度定制的框架,请确保以下优化建议与底层核心兼容。
---
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `FinanceReport2.php` / `TimedTask.php` 多处 | **直接读写 `$_GET` 超全局变量**且未做过滤,部分方法直接修改 `$_GET`(如 `$_GET['admin_id'] = ...`),存在参数污染与注入风险。 | 统一使用框架输入类获取参数,禁止直接操作 `$_GET`。导出参数应通过新数组合并传递。 | `$params = $this->input->get(NULL, TRUE);`<br>`$exportParams = array_merge($params, ['admin_id' => $this->admin_id]);` |
| 🔴 严重 | `TimedTask.php` `checkServerTable` / `platformMatchReu` | **原生 SQL 拼接查询**,未使用查询构造器或预处理绑定。若表名/库名受外部影响,将导致 SQL 注入。 | 使用 CI 查询构造器或参数化查询。避免在业务层直接执行 `SET @var` 等 MySQL 特有语法。 | `$this->db->where('TABLE_SCHEMA', $db)->where('TABLE_NAME', $table)->get('INFORMATION_SCHEMA.TABLES');` |
| 🔴 严重 | `FinanceReport2.php` 导出方法 | **滥用 `exit()` 中断执行**。在控制器中直接 `exit` 会破坏框架生命周期、拦截器执行及标准 JSON 响应流。 | 改为抛出异常或调用框架标准错误响应。文件下载应在设置 Header 后由框架统一输出。 | `if (!$exportRes['success']) { return $this->error_response($exportRes['msg']); }` |
| 🟠 警告 | `RoomTiming.php` `edit()` | **事务处理机制混用**。同时使用 `trans_start()/trans_complete()` 与手动 `trans_rollback()`,在 CI 中易导致事务状态冲突或重复回滚。 | 统一使用显式事务控制 `trans_begin()` / `trans_commit()` / `trans_rollback()`,或完全依赖 CI 自动事务。 | `if ($this->db->trans_status() === FALSE) { $this->db->trans_rollback(); $this->error_response('操作失败'); }` |
| 🟠 警告 | `FinanceReport2.php` 多处 | **导出逻辑高度重复**(字段映射、表头组装、Excel/PDF 分支、设置保存)。违反 DRY 原则,后续新增报表需复制大量代码。 | 抽取为独立 `ExportService` 或基类方法,通过配置数组驱动导出流程,控制器仅负责参数组装与调用。 | *(见下方重构建议)* |
| 🟠 警告 | `FinanceReport2.php` 导出方法 | `json_decode` 未处理解析失败情况,非法 JSON 将导致 `null` 或触发 Warning,后续 `empty()` 判断可能失效。 | 增加 `json_last_error()` 校验或使用 `JSON_THROW_ON_ERROR` 标志。 | `$exportFields = json_decode($param['export_fields'], true, 512, JSON_THROW_ON_ERROR);` |
| 🟠 警告 | `RoomTiming.php` `edit()` | 价格负数校验使用 `strpos` 循环匹配字符串,效率低且易误判(如匹配到 `_vip_price_extra`)。 | 预定义需校验的键名白名单,或使用正则/数组交集过滤。 | `$priceKeys = ['_price', '_vip_price', '_minimum_consumption'];`<br>`foreach ($priceKeys as $k) { if (($data[$k] ?? 0) < 0) throwError('...'); }` |
| 🟡 建议 | `RoomTiming.php` 类定义 | 类名 `roomTiming` 不符合 PSR-12 大驼峰命名规范。 | 改为 `class RoomTiming extends PcServer`。 | `class RoomTiming extends PcServer` |
| 🟡 建议 | 全局文件头部 | 使用 `include` 引入父控制器,未使用 `require_once` 或依赖自动加载,可能导致重复声明或致命错误。 | 移除 `include`,依赖框架类加载机制;若必须手动引入,请改用 `require_once`。 | `// 删除 include 语句` |
| 🟡 建议 | `TimedTask.php` `pushAlmostExpireDeposit` | **循环内重复加载配置/模型**(如 `$this->config->load('wx', TRUE)`),严重浪费 I/O 与内存。 | 将配置/模型加载移至方法顶部或构造函数,确保仅执行一次。 | `$this->config->load('wx', TRUE); // 移至 foreach 外部` |
---
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **输入安全与超全局变量隔离**:全局替换 `$_GET` / `$_POST` 为 `$this->input->get()` / `$this->input->post()`,并开启 XSS 过滤。严禁在业务逻辑中直接修改 `$_GET`。
2. **事务控制标准化**:统一 `RoomTiming::edit()` 中的事务写法,推荐显式使用 `trans_begin()` → 业务逻辑 → `trans_commit()`,异常捕获中执行 `trans_rollback()`。
3. **阻断流修复**:移除所有导出方法中的 `exit('...')`,改为返回标准错误响应或抛出 `RuntimeException`,确保框架能正确记录日志与返回 HTTP 状态码。
4. **SQL 注入防御**:将 `TimedTask` 中的原生 `SELECT`、`UPDATE ... SET @var` 替换为 CI 查询构造器或预处理语句。若必须使用 MySQL 变量,请确保参数绝对不可控。
### 🛠 后续重构与优化方向
1. **导出逻辑服务化 (DRY 重构)**
当前 `FinanceReport2` 中 6+ 个导出方法结构高度一致。建议抽取为 `ExportService`:
```php
// 示例:统一导出驱动
class ExportService {
public function generate(array $config, array $data, array $sumFields = []) {
// 1. 字段过滤与映射
// 2. 组装 Header/Table
// 3. 调用 Export_model 生成 Excel/PDF
// 4. 保存导出配置记录
// 5. 返回文件流或下载响应
}
}
```
控制器仅保留:参数校验 → 调用 Model 获取数据 → 调用 `ExportService::generate()`。
2. **全局函数依赖解耦**
代码中大量使用 `get_page_suit()`, `throwError()`, `do_log()`, `send_wx_tmplmsg()` 等全局函数。建议:
- 迁移至 `Helper` 类或 `Service` 类中。
- 使用依赖注入或静态方法调用,提升可测试性与 IDE 提示支持。
3. **定时任务架构优化**
- `TimedTask` 方法过长(如 `pushAlmostExpireDeposit` 超 150 行),违反单一职责原则。建议拆分为:`FetchData` → `ProcessTemplate` → `SendNotification` → `LogResult`。
- 移除 `exit("废弃转移到python")` 等死代码,保持仓库整洁。
- 为 CLI 任务添加 `defined('STDIN')` 或 `$this->input->is_cli_request()` 校验,防止 Web 端误触发。
4. **代码规范对齐 (PSR-12)**
- 统一类名、方法名、属性名命名风格(大驼峰/小驼峰)。
- 补充类型声明(PHP 7.4+):`public function getManagerDiscountReport(): void`
- 移除冗余注释(如 `//时间的检测`),改用有意义的变量名或 PHPDoc。
> ⚠️ **局限性说明**:由于 `FinanceReport2.php` 与 `TimedTask.php` 在末尾被截断,部分导出方法的结尾逻辑、异常处理及父类 `FinanceReport`/`PcServer`/`KtvAplicationController` 的具体实现未完全可见。建议补充完整文件后,可进一步审查响应封装、权限拦截及模型层数据过滤逻辑。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780391144
|
1780391144
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
471
|
18
|
178
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - revert 71ebc9a81e26e7d1caa646 🔍 代码审查报告:pc-260616 - revert 71ebc9a81e26e7d1caa646d4031160c759ae06d9
r...
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `4d9ad20551 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `4d9ad2055104c89b673a5fed8b1717b64f24034c`
**提交人**: huangliujian (hlj@g-hi.com)
**时间**: 2026-06-02 17:07:27
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了完整的报表查询与导出、定时任务及业务配置功能,业务逻辑基本闭环。但存在大量重复代码、直接操作超全局变量 `$_GET`、N+1 查询性能瓶颈、事务处理不规范等问题。整体架构偏向传统 CI3 写法,缺乏现代 PHP 的输入过滤、依赖注入与 DRY 原则实践。
- **风险等级**:🔴 高(存在 SQL 注入隐患、性能瓶颈及事务状态异常风险)
> 📌 **框架说明**:根据代码特征(`BASEPATH`、`$this->load->model()`、`get_instance()`、`$this->db->trans_start()` 等),当前项目实际基于 **CodeIgniter 3 (CI3)** 架构。以下审查建议将严格遵循 CI3 最佳实践与 PSR-12 规范。若确为 `phpci` 定制版,请核对底层加载器是否兼容。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `FinanceReport2.php` (多处) | 直接使用 `$_GET` 获取参数,未做任何过滤或类型校验。若参数直接拼接至 SQL 或输出至前端,极易引发 SQL 注入与 XSS 攻击。 | 统一使用 CI3 输入类 `$this->input->get()` 进行 XSS 过滤,并对关键参数(如时间、ID、导出字段)进行白名单/类型强校验。 | `$params = $this->input->get(null, true);`<br>`$exportFields = array_intersect($exportFields, array_keys($columnArr));` |
| 🔴 严重 | `Ahead_book_order_model.php` (~L45) | `get_list()` 循环内调用 `$this->ahead_user_model->get_one()` 查询用户手机号,导致典型的 **N+1 查询**,数据量稍大即拖垮数据库。 | 提取所有 `ahead_user_id`,使用 `WHERE IN` 批量查询,或在主 SQL 中 `LEFT JOIN` 用户表。 | 见下方优化示例 |
| 🟠 警告 | `RoomTiming.php` (~L115) | 事务处理不规范:`trans_start()` 后在 `catch` 中手动调用 `trans_rollback()`,随后又调用 `trans_complete()`。CI3 事务状态机可能因此产生冲突或重复提交。 | 统一使用 `trans_start()` + `trans_complete()`(自动回滚),或改用 `trans_begin()` + `trans_commit()`/`trans_rollback()` 显式控制。 | 见下方优化示例 |
| 🟠 警告 | `FinanceReport2.php` (导出方法) | 多个导出方法(如 `getWaresCountExport`、`getSaleWaresExport`、`standLogExport`)逻辑高度重复,违反 DRY 原则,维护成本极高。 | 抽取公共导出基类或 Trait,将标题、字段映射、宽度配置、模型方法名作为参数传入,统一处理表头、合计行与文件生成。 | 建议重构为 `BaseExportController::doExport($config)` |
| 🟠 警告 | `TimedTask.php` (L2, L18) | `set_time_limit(0);` 在 Web 控制器中直接调用,若被恶意请求触发将长期占用 PHP-FPM 进程。定时任务应通过 CLI 模式运行。 | 移除 `set_time_limit`,通过 CI3 CLI 路由执行(如 `php index.php timedtask upStockByOrder`),并在基类中限制仅 CLI 可访问。 | `if (is_cli() === FALSE) exit('CLI only');` |
| 🟡 建议 | `RoomTiming.php` (L10) | 类名 `roomTiming` 首字母未大写,违反 PSR-12 规范;`FinanceReport2` 类名含数字,不利于自动加载与语义化。 | 重命名为 `RoomTiming`,移除类名数字,采用语义化版本控制或路由分组替代。 | `class RoomTiming extends PcServer` |
| 🟡 建议 | `Ahead_book_order_model.php` (L4) | 文件顶部直接执行 `$CI = &get_instance(); $CI->load->model(...);`,在文件被 `include` 时即触发加载,非标准做法且可能引发依赖时序问题。 | 移至 `__construct()` 中,或依赖 CI3 自动加载机制。 | `public function __construct() { parent::__construct(); $this->load->model('Simple_model'); }` |
| 🟡 建议 | `FinanceReport2.php` (L4) | 使用 `include FCPATH . 'application' . DIRECTORY_SEPARATOR ...` 引入父控制器,路径硬编码且未使用 `require_once`,易导致重复声明。 | 使用 CI3 常量 `APPPATH` 并配合 `require_once`,或配置自动加载。 | `require_once APPPATH . 'controllers/FinanceReport.php';` |
### 🔍 关键代码优化示例
**1. 修复 N+1 查询 (`Ahead_book_order_model.php`)**
```php
// 优化前:循环内查询
foreach ($order_info as &$v) {
if (empty($v['book_mobile'])) {
$user_data = $this->ahead_user_model->get_one(['_id' => $v['ahead_user_id']], '_mobile');
// ...
}
}
// 优化后:批量查询 + 内存映射
$missingMobileIds = array_filter(array_column($order_info, 'ahead_user_id'), function($id) use ($order_info) {
// 实际应结合业务逻辑筛选,此处简化
return true;
});
if (!empty($missingMobileIds)) {
$users = $this->ahead_user_model->get_user_by_ids($missingMobileIds, '_id,_mobile', true);
foreach ($order_info as &$v) {
if (empty($v['book_mobile']) && isset($users[$v['ahead_user_id']])) {
$v['book_mobile'] = $users[$v['ahead_user_id']]['_mobile'];
$this->update_book_mobile($v['book_id'], $v['id'], $v['book_mobile']);
}
}
}
```
**2. 规范事务处理 (`RoomTiming.php`)**
```php
// 推荐写法:利用 CI3 自动回滚机制
$this->db->trans_start();
try {
// 业务逻辑...
if ($id) {
$res = $this->ahead_room_timing_model->update($update_data, $where);
} else {
$res = $this->ahead_room_timing_model->insert($add_data);
}
if (!$res) {
throw new Exception('操作失败');
}
$this->db->trans_complete(); // 自动检测异常并回滚
$this->success_response('操作成功');
} catch (Exception $e) {
$this->db->trans_complete(); // 触发回滚
$this->error_response($e->getMessage());
}
```
## 3. 总结与行动建议
### 🚨 优先修复项(P0/P1)
1. **输入安全加固**:全局替换 `$_GET` / `$_POST` 为 `$this->input->get()` / `$this->input->post()`,开启 CI3 的 XSS 过滤配置。对 `json_decode` 增加 `json_last_error()` 校验,防止非法 JSON 导致解析崩溃。
2. **消除 N+1 查询**:立即重构 `Ahead_book_order_model::get_list()` 中的循环查询逻辑,改用批量查询或 SQL `JOIN`,预计可提升列表接口 5~10 倍响应速度。
3. **统一事务控制**:修正 `RoomTiming.php` 及其他控制器中的事务写法,避免 `trans_rollback()` 与 `trans_complete()` 混用导致数据库连接状态不一致。
### 🛠 后续重构与优化方向
1. **导出逻辑抽象化**:当前导出代码重复率 >70%。建议创建 `ExportService` 或 `BaseExportController`,将字段配置、合计计算、Excel/PDF 渲染、文件流输出封装为可复用组件。支持分块查询(Chunk)与流式写入(如 `PhpSpreadsheet` 的 `Writer\Xlsx` 流模式),彻底移除 `ini_set('memory_limit', '500M')` 的暴力解法。
2. **定时任务 CLI 化**:`TimedTask.php` 中的方法应通过 CI3 CLI 路由调用,移除 `set_time_limit(0)` 和 `exit('OK')`,改用 `$this->output->set_status_header(200)` 或标准 CLI 输出。增加任务锁机制(如 Redis `SETNX`)防止并发重复执行。
3. **规范与可维护性**:
- 严格遵循 PSR-12:类名 `PascalCase`,方法名 `camelCase`,移除类名数字。
- 清理注释掉的代码与 `exit()` 硬中断,改用框架标准响应方法。
- 将硬编码的魔法数字(如 `86400`、`50`、`610`)提取为常量或配置文件。
- 建议引入静态分析工具(如 `PHPStan` 或 `Psalm`)与代码规范检查(`PHP_CodeSniffer`)纳入 CI 流程。
> 💡 **提示**:若代码片段因截断未能完整展示部分逻辑(如 `FinanceReport2.php` 末尾、`TimedTask.php` 后半段),建议补充完整文件以便进行更精准的边界条件与异常流审查。当前建议已覆盖可见代码的核心风险点,可直接落地实施。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780391247
|
1780391247
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
472
|
18
|
179
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 冲突解决
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `31c585c660 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `31c585c6601f5fee99019ff548d37564f5354324`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 17:19:52
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码整体业务逻辑清晰,能够完成社区商家营收明细的查询、过滤与数据组装。但存在多处典型架构与编码隐患:全局作用域执行初始化破坏 OOP 封装、动态拼接 SQL 存在注入风险、循环内单条查询导致 N+1 性能瓶颈、JSON 解析参数遗漏导致逻辑失效。需优先修复安全与性能问题,并统一代码规范。
- **风险等级**:🔴 高(存在潜在 SQL 注入与数据库连接状态泄漏风险)
> 💡 **框架说明**:从 `$CI = &get_instance()`、`$this->load->model()` 及目录结构判断,该代码实际基于 **CodeIgniter 3/4** 架构。若 `phpci` 为内部定制框架,以下审查原则依然适用;若为笔误,建议后续统一使用 CI 官方命名与生命周期规范。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 顶部全局作用域 | 在类外部执行 `$CI = &get_instance();` 和模型加载。每次文件被 `include/require` 都会执行,破坏封装性,易引发全局状态污染或重复加载。 | 将初始化逻辑移入类构造函数 `__construct()`,或依赖框架自动加载机制。 | `public function __construct() { parent::__construct(); $this->load->model('Report_model'); }` |
| 🔴 严重 | `get_community_revenues_list` 约第 115-125 行 | `$pay_platform_where` 数组直接拼接字符串生成 SQL 条件 `'(a._pay_platform=' . $pay_platform . ' ...)'`。若 `$params` 来源不可控,存在 **SQL 注入** 风险。 | 严格类型转换 `(int)`,并优先使用框架查询构建器的安全方法(如 `or_where`/`group_start`)。 | `$pay_platform = (int)$pay_platform_arr[0];`<br>`$this->db->group_start()->where('a._pay_platform', $pay_platform)->group_end();` |
| 🔴 严重 | `get_community_revenues_list` 约第 85、105 行 | `json_decode($params['xxx_arr'])` 未传递 `true` 参数,默认返回 `stdClass` 对象。后续 `is_array()` 判断必然失败,导致查询条件被清空。 | 补充 `true` 参数强制解析为关联数组。 | `$params['order_type_arr'] = json_decode($params['order_type_arr'], true);` |
| 🟠 警告 | `get_community_revenues_list` 约第 155-175 行 | 在 `foreach ($data as &$v)` 循环中,当 `order_type == '1'` 时逐条调用 `$this->ahead_book_order_model->get_one()`。数据量超过 50 条时将引发严重的 **N+1 查询** 性能问题。 | 收集所有需查询的 `order_id`,使用 `where_in` 批量获取,再在内存中通过键值映射组装。 | 见下方重构示例 |
| 🟠 警告 | `get_community_revenues_list` 约第 128-130 行 | `$this->enforce_con_db()` 切换数据库连接后,若中间逻辑抛出异常,未恢复原连接状态。可能导致后续请求持续使用错误数据源。 | 使用 `try...finally` 确保连接状态必定回滚。 | `try { $this->enforce_con_db(); ... } finally { $this->enforce_con_db(2); }` |
| 🟠 警告 | `get_community_revenues_list` 约第 132 行 | `$params['page'] == '1'` 使用弱类型比较。若传入 `'01'`、`1` 或空字符串可能引发逻辑偏差。且仅首页计算总数,需明确是否为缓存/分页优化策略。 | 使用严格类型比较,并补充注释说明设计意图。 | `if ((int)$params['page'] === 1) { ... }` |
| 🟡 建议 | 全局/类定义 | 类名 `Jh_community_shop_revenues_detail_model` 不符合 PSR-12 PascalCase 规范。方法内频繁调用 `$this->load->model()` 增加 I/O 开销。 | 类名改为驼峰;将依赖模型统一在构造函数中加载。 | `class JhCommunityShopRevenuesDetailModel extends Report_model` |
| 🟡 建议 | `get_search_params` 约第 58 行 | `explode(',', $shop_data['_operational_scene'] ?? '')` 当值为空字符串时会生成 `['']`,遍历可能产生无效过滤条件。 | 使用 `array_filter` 清理空元素。 | `$operational_scene = array_filter(explode(',', $shop_data['_operational_scene'] ?? ''));` |
| 🟡 建议 | 多处 | 缺少 PHP 7.4+ 类型声明(参数类型、返回类型)。现代 PHP 项目应充分利用类型系统提升可维护性。 | 为方法签名添加 `array`, `string`, `int`, `bool` 等类型提示。 | `public function get_search_params(int $merchant_id, int $shop_id): array` |
### 🛠 N+1 查询优化示例(替换原 `foreach` 逻辑)
```php
// 1. 收集需要查询预订信息的订单ID
$book_order_ids = [];
foreach ($data as $v) {
if ($v['order_type'] == '1') {
$oid = $v['order_id'];
if ($v['type'] == '2') {
$oid = preg_replace('/\(退款单号:.*\)$/', '', $oid);
}
$book_order_ids[] = $oid;
}
}
// 2. 批量查询并建立索引映射
$book_orders_map = [];
if (!empty($book_order_ids)) {
$book_orders = $this->ahead_book_order_model->get_data_by_ids(
array_unique($book_order_ids),
'_id,_shop_name,_arrival_time,_end_time',
'_id'
);
foreach ($book_orders as $bo) {
$book_orders_map[$bo['_id']] = $bo;
}
}
// 3. 循环内直接读取内存数据,消除 DB 查询
foreach ($data as &$v) {
// ... 其他逻辑 ...
if ($v['order_type'] == '1') {
$book_order_id = $v['order_id'];
if ($v['type'] == '2') {
$book_order_id = preg_replace('/\(退款单号:.*\)$/', '', $book_order_id);
}
if (isset($book_orders_map[$book_order_id])) {
$bo = $book_orders_map[$book_order_id];
$v['book_info'] = [
'book_order_id' => $book_order_id,
'shop_name' => $bo['_shop_name'],
'room_name' => $v['room_name'],
'start_time' => date('Y-m-d H:i', $bo['_arrival_time']),
'end_time' => date('Y-m-d H:i', $bo['_end_time']),
'time_str' => minToStr(0, $bo['_arrival_time'], $bo['_end_time']),
'user_name' => filter_emoji(filterExcelSpecialChars($v['user_name']))
];
}
}
// ...
}
unset($v);
```
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **移除全局初始化代码**:将 `$CI = &get_instance()` 及模型加载移入 `__construct()`,避免文件级副作用。
2. **修复 JSON 解析缺陷**:所有 `json_decode` 必须追加 `true` 参数,否则多条件过滤将静默失效。
3. **消除 SQL 拼接风险**:对 `$pay_platform_where` 等动态条件强制类型转换 `(int)`,或改用框架提供的参数绑定/查询构建器方法。
### 📈 性能与架构优化方向
1. **解决 N+1 查询**:按上方示例改为批量查询+内存映射,预计可将该接口响应时间降低 60%~80%(尤其在导出或大数据量场景)。
2. **数据库连接安全切换**:使用 `try...finally` 包裹 `enforce_con_db()` 调用,确保异常发生时连接池状态可恢复。
3. **模型依赖集中管理**:将 `load->model()` 统一收敛至构造函数,减少运行时 I/O 开销,符合依赖注入思想。
### 📝 规范与长期维护建议
- **命名规范**:逐步将类名重构为 `JhCommunityShopRevenuesDetailModel`(PSR-12),方法名可保留 CI 风格的 `snake_case` 但需团队统一。
- **类型声明**:逐步为所有公开方法添加参数与返回值类型提示,启用 PHP 严格模式(`declare(strict_types=1);`)。
- **框架适配确认**:若项目确为 `phpci` 定制框架,请核对 `$where` 数组结构是否原生支持 `where_in` 与 `or` 组合。若不支持,建议封装安全的条件构建器,避免直接字符串拼接。
> 本次审查已覆盖逻辑、安全、性能、规范与框架适配五大维度。建议按 `P0 -> P1 -> P2` 顺序迭代修复,修复后可使用 `phpstan` 或 `phpcs` 进行静态扫描验证。如需针对特定框架组件(如自定义 Query Builder)进行深度适配审查,可提供基类 `Report_model` 源码以便进一步分析。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780391993
|
1780391993
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
473
|
18
|
180
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 库存盘点新增支持选择时分、包厢停用报表
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `11113b0d64 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `11113b0d648e0cdb3764a54764a6d002d3cbeb53`
**提交人**: caihongyuchy (1091045324@qq.com)
**时间**: 2026-06-02 17:47:41
---
### 1. 总体评价
> **综合评分:4/10**
> **优点**:业务模块划分清晰,路由结构完整,具备基础的权限拦截与组件化意识;部分功能(如导出、多选联动)已实现闭环。
> **缺点**:代码呈现典型的 **“jQuery 时代遗留 + Vue 外壳”** 混合架构。严重违反现代 Vue 开发规范:大量绕过 Vue 响应式系统直接操作 DOM;路由组件全部静态引入导致首屏体积巨大;存在多处拼写错误、命名不规范及逻辑陷阱(如 `$.map` 中断失效、全选逻辑注释反转)。整体可维护性、性能与类型安全均不达标,亟需现代化重构。
---
### 2. 问题详情清单
| 严重等级 | 位置/行号 | 问题分类 | 问题描述 | 建议修改方案 |
| :---: | :---: | :---: | :---: | :---: |
| 🔴 严重 | `pages.js` 全文件 | 规范/性能 | 所有路由组件使用静态 `import`,未启用路由懒加载,导致首屏 JS 包体积膨胀,严重拖慢加载与解析速度。 | 移除 `pages.js`,在 `index.js` 中改为动态导入:`component: () => import('@/views/xxx.vue')`。 |
| 🔴 严重 | `stock_checks.vue` 全文件 | 规范/可维护性 | 严重混用 jQuery (`$`, `$.ajax`, `$(this.$refs.xxx)`) 与 Vue,直接操作 DOM 破坏虚拟 DOM 机制;存在多处拼写错误 (`getMunu`, `innitDate`, `getDeteil`)。 | 彻底移除 jQuery 依赖,改用 `axios`/`fetch`;使用 `v-model`、`computed`、`watch` 管理状态与 UI;修正方法命名。 |
| 🔴 严重 | `stock_checks.vue` L230-L245 | 逻辑 | `saveGoods` 与 `getChecksGoods` 中使用 `$.map` 遍历,内部 `return` 仅跳出当前回调,无法中断外层逻辑;重复校验逻辑混乱。 | 改用 `Array.prototype.find()` 或 `Set` 进行去重,使用 `for...of` 配合 `break` 控制流程。 |
| 🟡 警告 | `router/index.js` L5-L8 | 规范/逻辑 | 重写 `VueRouter.prototype.push` 时直接吞掉异常 `.catch(err => err)`,掩盖真实路由错误,不利于生产环境排查。 | 改为过滤导航重复错误并记录日志:`.catch(err => { if (err.name !== 'NavigationDuplicated') console.error(err) })`。 |
| 🟡 警告 | `router/index.js` L158-L160 | 逻辑/安全 | `!store.state.usermobile` 判断不严谨(空字符串、`0` 均会触发跳转);未配置路由白名单,易导致死循环或误拦截。 | 使用明确布尔值 `!!store.state.usermobile`,并维护 `whiteList` 数组进行路径匹配。 |
| 🟡 警告 | `stock_checks.vue` L460-L470 | 逻辑 | `typeCheckAll` 方法逻辑与注释完全相反:`if(!_this.type_all)` 执行全选,注释却写“实现反选”,极易引发维护误解。 | 修正注释与逻辑,或直接使用 `v-model` 绑定全选状态,通过 `watch` 同步子项数组。 |
| 🟢 建议 | `stock_checks.vue` L1 | 规范 | 组件 `name` 属性定义为 `'procurement_return'`,与当前文件名及业务功能不符。 | 修改为符合 PascalCase 规范的 `name: 'StockChecks'`。 |
| 🟢 建议 | `stock_checks.vue` 多处 | 性能 | 频繁调用 `$(...).bootstrapTable('destroy')` 和 `$(...).select2()`,未清理旧实例,易造成内存泄漏与事件重复绑定。 | 在 `beforeDestroy`/`unmounted` 中统一销毁第三方插件实例,或迁移至 Vue 生态组件(如 `vue-tables-2`)。 |
---
### 3. 优化代码示例
#### 示例 1:路由懒加载与守卫规范化 (`router/index.js`)
```javascript
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '../store/index'
Vue.use(VueRouter)
// ✅ 优化:仅忽略重复导航错误,保留其他异常追踪
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => {
if (err.name !== 'NavigationDuplicated') {
console.warn('[Router] 导航异常:', err)
}
return err
})
}
// ✅ 优化:动态导入替代 pages.js 静态引入,按需加载
const routes = [
{ path: '/', name: 'index', component: () => import('../views/index.vue') },
{ path: '/login', name: 'login', component: () => import('../views/login.vue') },
// 其他路由同理...
]
const router = new VueRouter({ routes })
// ✅ 优化:明确白名单与登录态判断,避免死循环
const whiteList = ['/login']
router.beforeEach((to, from, next) => {
const isLoggedIn = !!store.state.usermobile // 强制转为布尔值
if (whiteList.includes(to.path) || isLoggedIn) {
next()
} else {
next({ name: 'login', query: { redirect: to.fullPath } })
}
})
export default router
```
#### 示例 2:Vue 响应式重构核心逻辑 (`stock_checks.vue` Script)
```javascript
<script>
import axios from 'axios' // 替代 $.ajax
import XLSX from 'xlsx'
export default {
name: 'StockChecks', // ✅ 修正组件名
data() {
return {
checksGoodsList: [], // ✅ 响应式数组替代手动 DOM 操作
typeItem: [],
shopOptions: [],
// ... 其他状态
}
},
methods: {
// ✅ 优化:使用 async/await 替代回调地狱,统一错误处理
async fetchShopList() {
try {
const { data } = await axios.post(`${this.$ctUrl}/PublicData/api_getShopListByPurview`, {
header: this.$requestHeader,
request: { version: this.$version, param: {} }
})
if (data.response.result_code === 'true') {
this.shopOptions = data.response.result.map(v => ({ id: v.id, text: v.name }))
}
} catch (error) {
this.$layer.msg('网络请求失败')
}
},
// ✅ 优化:使用 Set 高效去重,移除 $.map 陷阱
addGoodsToChecks(newGoods) {
const existingIds = new Set(this.checksGoodsList.map(g => g.merchant_goods_id))
const validGoods = newGoods.filter(g => {
if (existingIds.has(g.merchant_goods_id)) {
this.$layer.msg(`商品 ${g.goods_name} 已存在`)
return false
}
return true
})
validGoods.forEach(g => {
this.checksGoodsList.push({
...g,
actual_stock: g.system_stock,
profit_loss: 0,
remark: ''
})
})
this.checksTotal()
}
}
}
</script>
```
---
### 4. 总结与行动建议
#### 🚀 最优先改进建议(Top 3)
1. **剥离 jQuery,全面拥抱 Vue 响应式**:当前代码约 60% 的逻辑依赖 `$(this.$refs.xxx)` 和 `$.ajax`。建议逐步替换为 `axios` 请求封装、`v-model` 表单绑定、`computed` 派生状态,彻底消除直接 DOM 操作。
2. **实施路由懒加载与模块化拆分**:删除 `pages.js`,将 `routes` 数组按业务模块(如 `sale.js`, `stock.js`, `report.js`)拆分,并使用 `() => import()` 动态加载,预计可减少首屏体积 70% 以上。
3. **统一第三方插件生命周期管理**:`bootstrapTable`、`select2`、`daterangepicker` 等插件需在 `mounted` 初始化,并在 `beforeDestroy`/`unmounted` 中调用 `.destroy()` 清理,防止内存泄漏与事件重复绑定。
#### 🛠 推荐 Lint 规则与配置
建议在项目根目录配置 `.eslintrc.js` 与 `.prettierrc`,强制规范落地:
```javascript
// .eslintrc.js 核心规则推荐
module.exports = {
extends: ['plugin:vue/essential', 'eslint:recommended', '@vue/prettier'],
rules: {
'vue/multi-word-component-names': 'error', // 强制多词组件名
'no-unused-vars': ['error', { varsIgnorePattern: '^_' }], // 忽略 _this 等占位符
'prefer-const': 'error', // 优先使用 const
'vue/no-mutating-props': 'error', // 禁止直接修改 props
'vue/require-v-for-key': 'error', // v-for 必须带 key
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
}
}
```
配合 `husky` + `lint-staged` 在提交前自动执行 `eslint --fix` 与 `prettier --write`,可从根本上杜绝格式混乱与低级语法错误。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780393661
|
1780393661
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
474
|
18
|
181
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - Revert "revert 71ebc9a81e 🔍 代码审查报告:pc-260616 - Revert "revert 71ebc9a81e26e7d1caa646d4031160c759a...
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `7cf8c370f7 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `7cf8c370f792c95b70830032ca4d585b519c3b99`
**提交人**: chenjunfeng (developer.jeff.c@gmail.com)
**时间**: 2026-06-02 17:55:24
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10 分
- **总体评价**:代码实现了丰富的报表查询、导出与定时任务功能,业务覆盖较全。但整体呈现“脚本化”开发特征,大量使用原生超全局变量、硬编码配置与 `exit()` 中断流程,未充分利用框架生命周期。存在明显的并发安全隐患、内存瓶颈与重复代码,可维护性与扩展性较弱。
- **风险等级**:🔴 高
- **⚠️ 框架说明**:提交代码实际基于 **CodeIgniter 3** 架构(如 `BASEPATH`、`$this->load->model()`、`$this->db->trans_start()` 等),并非 `phpci`。以下审查将严格基于 CI3 规范与通用 PHP 最佳实践进行。若确需迁移至 `phpci`,请补充对应文档以便调整建议。
## 2. 问题详情
| 严重程度 | 文件/方法 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `FinanceReport2.php` / 所有导出方法 | 直接使用 `$_GET` 获取参数,未进行 XSS 过滤与类型校验,易受注入攻击。 | 使用 CI3 输入类 `$this->input->get('key', TRUE)` 替代,并对关键参数做类型/范围校验。 | `$param = $this->input->get(NULL, TRUE);`<br>`$exportType = isset($param['export_type']) ? (int)$param['export_type'] : 1;` |
| 🔴 严重 | `FinanceReport2.php` / `getWaresCountExport` 等 | 使用 `exit('导出字段不能为空')` 直接终止脚本,破坏 CI 响应流,无法记录日志或触发统一错误处理。 | 替换为框架标准错误响应方法,或抛出异常由全局异常处理器捕获。 | `if (empty($exportFields)) { return $this->error_response('导出字段不能为空'); }` |
| 🔴 严重 | `TimedTask.php` / `pushAlmostExpireDeposit` | 循环内手动扣减余额 `$balance = $balance - $sms_total_amount;`。多实例并发执行时会导致余额超扣或数据不一致。 | 改为数据库原子操作,利用 `WHERE balance >= ?` 保证并发安全。 | `$this->db->where('_merchant_id', $merchant_id)<br>->where('_shop_id', $shop_id)<br>->where('balance >=', $sms_total_amount)<br>->set('balance', 'balance - ' . (float)$sms_total_amount, FALSE)<br>->update('shop_account');` |
| 🟠 警告 | `FinanceReport2.php` / `getWaresCountExport` 等 | `ini_set("memory_limit", "500M")` 硬编码在控制器中。治标不治本,且大数据导出仍可能 OOM。 | 移除硬编码。大数据导出应改用游标查询、分块处理(Chunk)或异步队列任务。 | `// 移除 ini_set<br>// 改用模型分块查询:<br>foreach ($this->Model->chunk($param, 1000) as $chunk) { ... }` |
| 🟠 警告 | `RoomTiming.php` / `edit` | `throwError('所有的价格设置不能为负数')` 非 PHP/CI 内置函数。若未提前加载对应 Helper 将引发 Fatal Error。 | 使用标准异常或控制器错误响应,确保错误处理链路稳定。 | `if ($value < 0) { throw new InvalidArgumentException('所有的价格设置不能为负数'); }` |
| 🟠 警告 | `RoomTiming.php` / 类定义 | `class roomTiming` 类名首字母小写,违反 PSR-12 及 CI3 控制器命名规范,可能导致路由或自动加载异常。 | 重命名为 `class RoomTiming extends PcServer`,并同步调整路由与引用。 | `class RoomTiming extends PcServer { ... }` |
| 🟡 建议 | `FinanceReport2.php` / 多个导出方法 | 导出逻辑高度重复(字段映射、表头构建、Excel/PDF 切换、设置保存)。违反 DRY 原则。 | 提取抽象基类 `BaseReportExportController` 或使用策略模式,子类仅实现数据获取与字段配置。 | `abstract class BaseReportExport extends CI_Controller {<br> abstract protected function getExportData($params);<br> public function export() { /* 统一导出流程 */ }<br>}` |
| 🟡 建议 | `Ahead_goods_log_model.php` / 文件顶部 | `$CI = &get_instance(); $CI->load->model('Simple_model');` 在模型文件中加载模型是反模式,易引发递归加载或性能损耗。 | 移除手动加载。通过 `application/config/autoload.php` 配置自动加载,或在控制器中按需加载。 | `// 删除顶部两行<br>// 在 autoload.php 添加: $autoload['model'] = array('Simple_model');` |
| 🟡 建议 | `TimedTask.php` / `mUpStockByOrder` | 方法首行直接 `exit();`,导致后续所有业务代码成为死区,无法执行且增加维护成本。 | 清理废弃代码。若需保留测试逻辑,应移至独立测试脚本或使用环境变量控制。 | `// 删除 exit(); 或改为:<br>if (ENVIRONMENT !== 'development') { return; }` |
| 🟡 建议 | `TimedTask.php` / `platformMatchReu` | 使用原生 SQL 拼接用户变量 `@platformrank`,虽当前 `$v['_id']` 来自 DB,但存在潜在 SQL 注入与维护风险。 | 优先使用 CI3 Query Builder 或预处理语句;若必须用原生 SQL,务必强制类型转换。 | `$matchId = (int)$v['_id'];<br>$sql = "UPDATE ahead_platform_match_play_log a ... WHERE _match_id = {$matchId} ...";` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题
1. **安全与输入过滤**:全局替换 `$_GET` 为 `$this->input->get()`,对金额、ID、分页等参数强制类型转换,杜绝越权与注入风险。
2. **并发余额扣减**:`TimedTask` 中的短信余额扣减必须改为数据库原子更新,否则在高并发定时任务下极易出现资损。
3. **流程中断规范**:全面清理控制器中的 `exit()` 与 `echo`,统一使用 `$this->success_response()` / `$this->error_response()` 或抛出异常,确保日志记录、事务回滚与框架生命周期完整。
4. **清理死代码**:移除 `mUpStockByOrder` 等方法的 `exit();` 阻断语句,避免后续维护人员误判逻辑。
### 🛠 后续重构与优化方向
- **架构分层与 DRY 重构**:当前 `FinanceReport2` 包含 30+ 个高度相似的导出方法。建议引入 **模板方法模式** 或 **策略模式**,将“获取数据 → 格式化 → 生成文件 → 记录日志”抽离为通用服务,控制器仅负责参数校验与路由分发。
- **大数据导出优化**:放弃 `ini_set` 暴力扩容。采用 `LIMIT/OFFSET` 分块查询、PHP 生成器 (`yield`) 逐行写入 Excel,或引入消息队列(如 RabbitMQ/Redis)将导出转为异步任务,前端通过轮询或 WebSocket 获取下载链接。
- **框架规范对齐**:严格遵循 PSR-12 命名规范(类名大驼峰、方法名小驼峰、常量全大写)。模型文件禁止包含业务逻辑或加载其他模型,保持单一职责。
- **技术债评估**:代码基于 CodeIgniter 3(官方已停止安全更新)。建议在业务稳定期规划向现代框架(如 Laravel、Symfony 或 CI4)迁移,或引入静态分析工具(PHPStan、Psalm)与自动化测试覆盖核心报表逻辑。
> 💡 **提示**:若需针对特定导出方法或定时任务进行深度性能剖析(如 SQL 执行计划分析、内存峰值监控),可提供对应 Model 层的查询实现或服务器环境配置,以便给出更精准的调优方案。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780394125
|
1780394125
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
475
|
18
|
182
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 其他
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `c11b7058b3 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `c11b7058b3d315da90b1a82cf4fb60358419403d`
**提交人**: chenjunfeng (developer.jeff.c@gmail.com)
**时间**: 2026-06-02 17:57:55
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码实现了核心业务逻辑,具备基本的分页、导出与数据聚合能力。但存在**严重的 SQL 注入风险**与**JSON 解析逻辑缺陷**,且类外部调用 `get_instance()` 违反面向对象规范。多处模型重复加载、缺乏输入校验及硬编码魔法值,影响了可维护性与执行效率。
- **风险等级**:🔴 高(存在直接可利用的安全漏洞与逻辑阻断点)
> 📌 **框架说明**:代码结构高度类似 `CodeIgniter 3`。若 `phpci` 为内部定制框架,请结合其官方文档对查询构建器、模型加载机制进行适配。以下建议基于通用 PHP 最佳实践与 CI 架构规范。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 约 145-155 行 | **SQL 注入漏洞**:`$pay_platform_where` 数组拼接时直接使用了未过滤的用户输入 `$pay_platform` 与 `$pay_platform_arr[1]`。攻击者可通过构造恶意参数闭合引号执行任意 SQL。 | 严禁字符串拼接。若框架支持参数绑定请使用占位符;否则必须强制类型转换或使用 `$this->db->escape()`。 | `$pay_platform_where[] = '(a._pay_platform=' . (int)$pay_platform . ' AND a._second_pay_platform=' . (int)$pay_platform_arr[1] . ')';` |
| 🔴 严重 | 约 118, 138 行 | **JSON 解析逻辑缺陷**:`json_decode()` 未传入 `true` 参数,默认返回 `stdClass` 对象。后续 `is_array()` 判断恒为 `false`,导致参数被错误重置为空数组,筛选功能失效。 | 添加 `true` 参数强制返回关联数组,并增加 JSON 格式校验。 | `$decoded = json_decode($params['order_type_arr'], true);`<br>`$params['order_type_arr'] = is_array($decoded) ? $decoded : [];` |
| 🟠 警告 | 第 3 行 | **反模式:全局 `get_instance()`**:在类外部直接调用 `get_instance()` 违反 OOP 封装原则,且在非标准加载流程或单元测试中极易引发 `Fatal Error`。 | 移除全局调用,将依赖模型统一移至 `__construct()` 中加载。 | `public function __construct() { parent::__construct(); $this->load->model('Report_model'); }` |
| 🟠 警告 | 约 105-106 行 | **时间参数未校验**:`strtotime()` 直接处理 `$params['start_time']` 和 `$params['end_time']`。若传入非法格式将返回 `false`,导致查询条件异常或数据库报错。 | 增加时间格式校验,或使用框架验证器。失败时提前返回明确错误。 | `if (!strtotime($params['start_time'] ?? '') || !strtotime($params['end_time'] ?? '')) { return ['error' => '时间格式无效']; }` |
| 🟠 警告 | 约 168 行 | **类型比较隐患**:`$params['page'] == '1'` 使用弱类型比较,若传入整数 `1` 或字符串 `'1'` 虽能匹配,但缺乏严谨性,且未处理非数字/空值情况。 | 使用严格类型判断,并设置默认值。 | `if ((int)($params['page'] ?? 1) === 1) { ... }` |
| 🟡 建议 | 第 6 行 | **命名规范不符 PSR-12**:类名 `Jh_community_shop_revenues_detail_model` 使用下划线命名,不符合 PSR-12 的 `PascalCase` 规范。 | 重命名为 `JhCommunityShopRevenuesDetailModel`,并同步更新项目中的引用路径。 | `class JhCommunityShopRevenuesDetailModel extends Report_model` |
| 🟡 建议 | 全文多处 | **重复加载模型**:在多个方法中重复调用 `$this->load->model()`,增加 I/O 开销且不符合框架最佳实践。 | 将高频使用的模型统一在 `__construct()` 中加载,或使用依赖注入(若框架支持)。 | `__construct() { parent::__construct(); $this->load->model(['ahead_yc_shop_model', 'ahead_user_model', 'ahead_book_order_model']); }` |
| 🟡 建议 | 约 218 行 | **循环内调用复杂函数**:`minToStr()` 在 `foreach` 循环中频繁调用。若内部涉及复杂计算或 DB 查询,将显著拖慢列表/导出性能。 | 评估 `minToStr` 实现,考虑批量计算、结果缓存或移至 SQL 层(如 `TIMESTAMPDIFF`)处理。 | *(视具体实现优化,建议提取至独立服务层或添加静态缓存)* |
## 3. 总结与行动建议
### 🚨 优先修复项(P0)
1. **修复 SQL 注入**:立即对 `$pay_platform_where` 拼接逻辑进行类型强转 `(int)` 或改用框架查询构建器。这是最高优先级的安全红线。
2. **修正 JSON 解析**:全局替换 `json_decode($str)` 为 `json_decode($str, true)`,并增加 `json_last_error()` 校验,防止脏数据导致业务中断。
3. **移除全局 `get_instance()`**:将模型加载迁移至构造函数,确保类实例化符合面向对象生命周期。
### 🛠 后续重构方向
- **输入校验层**:建议在 Controller 层或独立 Validator 中对 `$params` 进行统一校验(时间格式、数组结构、枚举值范围),避免脏数据渗透至 Model 层。
- **查询构建器标准化**:当前 `$where` 数组结构为自定义实现,建议逐步迁移至框架原生 Query Builder(如 `$this->db->where()`, `$this->db->join()`),以提升可读性并自动防御注入。
- **常量与配置抽离**:将 `ORDER_TYPE`、`revenues_pay_platform_arr` 等硬编码数组移至独立配置类或数据库字典表,便于后续动态扩展与多语言适配。
- **性能优化**:若导出量级较大,建议将 `get_community_revenues_list` 拆分为 `getList()` 与 `getExportData()`,导出时采用游标查询(`unbuffered query`)或分块写入,避免内存溢出。
> 💡 **局限性说明**:本次审查基于提供的单文件代码。由于强依赖父类 `Report_model` 的自定义 `$where` 解析逻辑、`enforce_con_db()` 连接切换机制及全局辅助函数(如 `filter_emoji`, `minToStr`),部分性能与框架适配细节需结合完整项目上下文进一步验证。建议补充父类核心方法实现以便进行深度链路分析。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780394275
|
1780394275
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
476
|
18
|
183
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 1
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `f954ecb712 ## 自动代码审查报告
**分支**: pc-260616
**提交**: `f954ecb712f639d10ad639cb3c6491c588f9e5f1`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 18:08:22
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务逻辑覆盖较全,报表查询、过滤与导出流程完整。但存在明显的 **N+1 查询性能瓶颈**、**SQL 条件拼接注入风险** 以及 **非面向对象的全局变量调用**。代码风格偏向传统 CodeIgniter 3 写法,部分逻辑依赖隐式类型转换与未声明的全局函数,可维护性与健壮性有待提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | L2-L3 / 全局 | `$CI = &get_instance();` 在类外部直接执行。若文件在框架未完全初始化时被 `include/require`,将触发致命错误。且模型加载不应放在全局作用域。 | 移除全局代码,将依赖模型加载移至类构造函数中,遵循 OOP 规范。 | ```php<br>public function __construct()<br>{<br> parent::__construct();<br> $this->load->model('Report_model');<br> // 其他常用模型可在此预加载<br>}<br>``` |
| 🔴 严重 | `get_community_revenues_list()` ~L158-165 | **SQL 注入风险**:`$pay_platform_where` 使用字符串拼接构造 `OR` 条件,并直接传入 `$where['where'][]`。若底层 Query Builder 未做严格转义,恶意构造的 `pay_platform_arr` 可突破过滤。 | 放弃手动拼接 SQL 字符串,改用框架查询构建器的参数绑定(Prepared Statements)或分组条件方法。 | ```php<br>// 推荐改用框架原生分组查询<br>$this->db->group_start();<br>foreach ($params['pay_platform_arr'] as $item) {<br> $parts = explode('_', $item);<br> $this->db->or_group_start()<br> ->where('a._pay_platform', $parts[0])<br> ->where('a._second_pay_platform', $parts[1] ?? null)<br> ->group_end();<br>}<br>$this->db->group_end();<br>``` |
| 🟠 警告 | `get_community_revenues_list()` ~L130-133 | **N+1 查询性能瓶颈**:在 `foreach ($data as &$v)` 循环中,针对 `order_type == '1'` 的每条记录都执行一次 `ahead_book_order_model->get_one()`。数据量大时将导致数据库连接耗尽与响应超时。 | 采用 **批量查询 + 内存映射** 策略。先收集所有需要查询的 `book_order_id`,一次性查出结果,再在循环中通过键值匹配赋值。 | ```php<br>$book_ids = array_unique(array_filter(array_map(function($v) {<br> return $v['order_type'] == '1' ? preg_replace('/\(退款单号:.*\)$/', '', $v['order_id']) : null;<br>}, $data)));<br>$book_orders = $this->ahead_book_order_model->get_data_by_ids($book_ids, '_id,_shop_name,_arrival_time,_end_time', '_id');<br>// 循环内直接 $book_orders[$book_order_id] 取值<br>``` |
| 🟠 警告 | `get_community_revenues_list()` ~L108 | **分页统计逻辑缺陷**:仅当 `$params['page'] == '1'` 时计算 `$count` 与 `$sum_data`,其他页码变量未定义。虽用 `??` 兜底,但违背分页常规设计,且 `== '1'` 为弱类型比较。 | 统计查询应与分页解耦,或明确约定前端传参逻辑。使用严格类型比较 `(int)$params['page'] === 1`。 | ```php<br>$is_first_page = (int)($params['page'] ?? 1) === 1;<br>if ($is_first_page) {<br> $count = $this->count($where);<br> $sum_data = $this->get_one($where, 'SUM(IF(a._type = 1, a._amount, -a._amount)) as total_amount');<br>}<br>``` |
| 🟠 警告 | `get_community_revenues_list()` ~L145 | **数组越界风险**:`explode('_', $params['pay_platform'])` 后直接访问 `$pay_platform[1]`。若传入值不含 `_`,将触发 `Undefined offset` 警告并导致逻辑错乱。 | 使用 `list()` 解构或 `isset()` 安全取值。 | ```php<br>$parts = explode('_', $params['pay_platform']);<br>$where['a._pay_platform'] = $parts[0];<br>if (isset($parts[1]) && $parts[1] !== '') {<br> $where['a._second_pay_platform'] = $parts[1];<br>}<br>``` |
| 🟡 建议 | L10 | **类名不符合 PSR-12**:使用蛇形命名 `Jh_community_shop_revenues_detail_model`,不符合 PHP 标准类名大驼峰规范。 | 重命名为 `JhCommunityShopRevenuesDetailModel`,并同步更新所有引用处。 | `class JhCommunityShopRevenuesDetailModel extends Report_model` |
| 🟡 建议 | L17-L38 | **常量键类型不一致**:`ORDER_TYPE` 数组键使用字符串 `'1'`、`'2'`,后续逻辑中又与字符串/整型混用比较。 | 统一使用整型键,或在类顶部添加 `declare(strict_types=1);` 强制类型安全。 | `const ORDER_TYPE = [1 => '在线预订', 2 => '卡券核销兑换', ...];` |
| 🟡 建议 | 全局多处 | **依赖未声明的全局函数**:`two_dimensional_arr_sort()`、`filter_emoji()`、`change_number_format()` 等未通过 `use` 或 `require` 显式引入。若未自动加载,将导致 `Fatal Error`。 | 将通用函数封装为静态工具类(如 `App\Utils\StringHelper`)或确保已正确加载对应 Helper。避免污染全局命名空间。 | `use App\Utils\ExcelHelper;`<br>`$v['user_name'] = ExcelHelper::filterSpecialChars($name);` |
> 📌 **框架适配说明**:代码呈现典型的 CodeIgniter 3 语法特征(如 `$CI = &get_instance()`、`$this->load->model()`、数组型 `$where` 构建器)。若 `phpci` 为基于 CI 的定制框架,请核对底层 `DB_driver.php` 是否完整支持该 `$where` 数组语法及自动转义机制;若为独立框架,请严格参照 `phpci` 官方文档调整模型加载、查询构建与分页组件的调用方式。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **消除 SQL 拼接隐患**:立即重构 `$pay_platform_where` 的拼接逻辑,全面改用框架提供的参数化查询或 Query Builder 分组方法,杜绝注入风险。
2. **解决 N+1 查询**:将循环内的单条 `get_one()` 替换为批量查询,预计可降低 70% 以上的数据库交互耗时,显著提升报表加载速度。
3. **规范模型加载与作用域**:移除文件顶部的全局 `$CI` 调用,统一在 `__construct()` 中加载依赖模型,确保框架生命周期安全。
### 🛠 后续重构与优化方向
- **查询构建器标准化**:当前 `$where` 数组结构(如 `'join' => [...]`、`'where_in' => [...]`)属于高度定制化的封装。建议逐步迁移至框架原生 Query Builder 链式调用,提升代码可读性与跨版本兼容性。
- **输入校验与类型安全**:对 `$params['start_time']`、`$params['end_time']` 增加日期格式校验(如 `DateTime::createFromFormat`),避免 `strtotime()` 返回 `false` 导致查询异常。建议开启 `declare(strict_types=1);` 并规范参数类型声明。
- **配置与常量抽离**:将硬编码的表名(如 `ktv_online.ahead_merchant_room_type`)、支付平台映射、运营场景字典等抽离至配置文件或枚举类中,便于后续多租户/多环境切换。
- **单元测试覆盖**:针对 `get_community_revenues_list()` 的复杂过滤条件与分页逻辑,编写 PHPUnit 测试用例,重点覆盖边界条件(空数组、非法 JSON、跨页查询、退款单号解析等)。
> 💡 **提示**:若当前项目处于快速迭代期,建议先完成 🔴 与 🟠 级别问题的修复,再逐步推进 🟡 级别的重构。所有修改请务必在测试环境验证数据库执行计划(`EXPLAIN`)与内存占用情况。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780394903
|
1780394903
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
477
|
18
|
184
|
1
|
|
0
|
🔍 代码审查报告:pc-260616 - 1
|
## 自动代码审查报告
**分支**: pc-260616
**提交**: `bd3330752c ## 自动代码审查报告
**分支**: pc-260616
**提交**: `bd3330752ce9ecce765904957b4de347d25b21f0`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 18:13:07
---
## 1. 审查摘要
- **代码质量评分**:5.5 / 10
- **总体评价**:代码实现了核心报表查询与数据组装逻辑,但存在明显的架构设计缺陷(全局实例获取位置错误)、严重的 N+1 查询性能瓶颈、潜在的 SQL 注入风险以及多处逻辑边界处理不严谨。整体可维护性与安全性需大幅提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 顶部 1-2 行 | `$CI = &get_instance();` 置于类定义外部。PHP 会在文件被 `include` 时立即执行,此时框架可能未完成初始化,极易引发 `Fatal Error` 或 `$CI` 为空。且类内部未复用该变量。 | 移除顶部代码。在 `__construct()` 中统一加载依赖模型,或使用 `$this->load->model()` 按需加载。 | `public function __construct() { parent::__construct(); $this->load->model(['Report_model', 'ahead_yc_shop_model', ...]); }` |
| 🔴 严重 | `get_community_revenues_list` 约 115-125 行 | `$pay_platform_where` 数组直接拼接用户输入参数 `$pay_platform` 与 `$pay_platform_arr[1]`。若底层 `select()` 未做严格转义,将导致 **SQL 注入**。 | 禁止手动拼接 SQL 片段。改用框架查询构建器的 `or_where`/`where_in`,或对参数进行严格类型转换与转义。 | `$this->db->group_start(); foreach(...) { $this->db->or_where('a._pay_platform', (int)$p); ... } $this->db->group_end();` |
| 🔴 严重 | `get_community_revenues_list` 约 155-175 行 | `foreach ($data as &$v)` 循环内,当 `order_type == '1'` 时逐行调用 `get_one()` 查询预订信息。数据量 >100 时将引发严重的 **N+1 查询**,拖垮数据库。 | 提取所有需查询的 `order_id`,使用 `where_in` 批量查询,在内存中通过 `order_id` 映射关联数据。 | `$ids = array_filter(array_column($data, 'order_id')); $books = $this->ahead_book_order_model->get_data_by_ids($ids, ...); $bookMap = array_column($books, null, '_id');` |
| 🟠 警告 | `get_community_revenues_list` 约 135-140 行 | `$count` 与 `$sum_data` 仅在 `$params['page'] == '1'` 时赋值。请求第 2 页及以上时,变量未定义,虽被 `??` 掩盖,但违背业务语义(分页应始终返回总数与合计)。 | 移除 `if ($params['page'] == '1')` 限制,或初始化默认值。分页统计应在第一页或独立接口计算。 | `$count = 0; $sum_data = ['total_amount' => 0]; if ((int)$params['page'] === 1) { ... }` |
| 🟠 警告 | `get_community_revenues_list` 约 85-88 行 | `strtotime($params['start_time'])` 未校验时间格式。非法字符串返回 `false`,导致数据库查询条件变为 `a._create_time >= 0`,可能查出全量历史数据。 | 增加时间格式校验,失败时抛出异常或返回空结果。 | `if (!preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $params['start_time'])) { return ['count'=>0, 'data'=>[]]; }` |
| 🟠 警告 | `get_search_params` 约 65 行 | `json_decode($params['order_type_arr'])` 未传第二个参数 `true`,默认返回 `stdClass` 对象。后续 `is_array()` 判断恒为 `false`,导致参数被强制置空。 | 补充 `true` 参数,或使用 `json_decode($str, true) ?? []`。 | `$params['order_type_arr'] = json_decode($params['order_type_arr'], true) ?? [];` |
| 🟡 建议 | 全局 | 类名 `Jh_community_shop_revenues_detail_model` 不符合 PSR-12 大驼峰命名规范。CI3 传统为下划线,若项目强制 PSR-12 需统一。 | 改为 `JhCommunityShopRevenuesDetailModel`,并确保 Composer 自动加载或框架路由兼容。 | `class JhCommunityShopRevenuesDetailModel extends Report_model` |
| 🟡 建议 | `get_community_revenues_list` 约 105-110 行 | `join` 条件中 `if/else` 分支未统一指定连接类型(默认 `INNER` vs 显式 `LEFT`),可能导致运营场景过滤时数据丢失或冗余。 | 显式声明连接类型,保持逻辑一致性。 | `$where['join'][] = ['ktv_online.ahead_merchant_room_type b', 'b._id=a._room_type', 'left'];` |
| 🟡 建议 | 全局 | 频繁调用 `$this->load->model()`。CI 框架虽有缓存,但重复调用仍增加 I/O 开销。 | 将模型加载收敛至构造函数,或使用 `$this->load->model('xxx', '', TRUE)` 避免重复实例化。 | 见 🔴 严重第 1 条示例 |
> ⚠️ **框架适配说明**:代码结构高度类似 **CodeIgniter 3**。若 `phpci` 为自研或定制框架,请重点核对底层 `select($where)`、`enforce_con_db()` 及 `where_in` 的实现机制是否与 CI 一致。若底层未对 `$where` 数组做自动转义,🔴 SQL 注入风险将直接生效。
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **移除全局 `$CI` 实例获取**:改为构造函数依赖注入或按需加载,避免文件加载期致命错误。
2. **修复 SQL 注入隐患**:彻底废弃手动拼接 `WHERE` 字符串,全面改用框架查询构建器或参数化绑定。
3. **解决 N+1 查询**:将循环内的单条 `get_one()` 替换为批量 `where_in` 查询 + 内存映射,预计可降低 80%+ 数据库交互次数。
4. **修正 JSON 解析与分页统计逻辑**:`json_decode` 补充 `true` 参数;确保 `$count` 与 `$sum_data` 在任意分页下均有合理默认值。
### 🛠 后续重构与优化方向
- **参数校验层前置**:建议在 Controller 或独立 Validator 中统一校验 `$params`(时间格式、数组类型、分页范围),Model 层仅负责纯净的数据查询。
- **消除魔法值**:将 `'1'`, `'2'`, `'8'`, `'9'` 等硬编码提取为类常量(如 `const PAY_PLATFORM_DOUYIN = '9_1';`),提升可读性与后期维护效率。
- **类型声明与 PSR-12 规范**:若运行环境为 PHP 7.4+,建议为属性与方法参数添加类型提示(如 `public function get_search_params(int $merchant_id, int $shop_id): array`),并统一使用大驼峰命名。
- **依赖解耦**:`filter_emoji`、`change_number_format` 等全局函数建议封装为 `Helper` 或 `Service` 类,通过依赖注入调用,避免隐式全局依赖导致的测试困难。
- **数据库连接切换安全**:`enforce_con_db()` 与 `enforce_con_db(2)` 疑似读写分离或分库切换。建议增加 `try-finally` 块确保连接状态恢复,防止异常中断导致后续请求路由错乱。
> 📝 **局限性说明**:本次审查基于提供的单文件代码。由于未包含 `Report_model` 基类实现、全局 Helper 函数定义及框架底层查询构建器源码,部分安全与性能评估基于 CI3 标准实践推断。建议结合完整项目上下文进行集成测试验证。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780395187
|
1780395187
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
478
|
22
|
57
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 自助报表
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `6c1575fa3 ## 自动代码审查报告
**分支**: app-260616
**提交**: `6c1575fa3fcb52898b64e380e2fc77cf85718a86`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 18:50:14
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:业务逻辑覆盖较全,报表统计与多维度聚合功能实现完整。但存在明显的 **SQL 注入隐患**、**N+1 查询性能瓶颈** 以及 **面向对象设计不规范** 问题。部分查询构造器使用方式偏离现代 PHP 安全规范,需优先修复。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Ahead_songs_sales_pay_log_model.php`<br>约第 268 行 (`refund` 方法) | **SQL 注入风险**:`$refund_reason` 与 `$CI->admin_data` 直接字符串拼接进 `UPDATE` 语句,未做转义或参数绑定。若输入含双引号或特殊字符将导致语法错误或注入。 | 使用框架查询构造器的参数绑定机制,或调用内置的 `escape()` 方法。避免手动拼接 SQL。 | ```php<br>// 推荐写法<br>$this->db->set('_refund_reason', $refund_reason)<br> ->set('_refund_admin_id', $CI->admin_data['_id'] ?? 0)<br> ->set('_refund_admin_name', $CI->admin_data['_name'] ?? '')<br> ->where($where)<br> ->update($this->table_name);<br>``` |
| 🔴 严重 | `Ahead_songs_sales_pay_log_model.php`<br>约第 200 行<br>`Jh_community_shop_revenues_detail_model.php`<br>约第 150 行 | **SQL 注入/语法错误**:`$pay_platform_where` 循环中直接拼接 `$params['pay_platform_arr']`,且**未添加引号**。若值为字符串将引发 SQL 语法报错;若未做类型过滤则存在注入风险。 | 强制类型转换 `(int)`,或改用框架提供的 `or_where()` 链式调用,由底层驱动处理转义。 | ```php<br>// 推荐写法<br$this->db->group_start();<br>foreach ($params['pay_platform_arr'] as $p) {<br> $parts = explode('_', $p);<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>``` |
| 🟠 警告 | `Ahead_songs_sales_pay_log_model.php`<br>约第 115 行 (`get_shop_incomes_statement_trend`) | **N+1 查询性能瓶颈**:在 `foreach ($result as &$v)` 循环中逐段执行 `$this->select()`。若查询跨度为 30 天,将产生 30+ 次独立 SQL 请求,严重拖慢接口响应。 | 改为**单次查询**拉取全量时间段数据,利用 `GROUP BY` 时间表达式,在 PHP 层按 Key 映射填充;或引入 Redis 缓存趋势数据。 | ```php<br>// 优化思路:一次性查询<br>$where['_consume_time >='] = $min_start;<br>$where['_consume_time <'] = $max_end;<br>$all_data = $this->select($where, $fields, $group_by);<br>// 在 PHP 中按 create_hour/date 建立索引映射<br>$mapped = array_column($all_data, 'amount', $group_by);<br>``` |
| 🟠 警告 | 两文件顶部 | **反模式:全局 `$CI` 实例化**:在类外部声明 `$CI = &get_instance();` 违反 OOP 原则。在文件被 `include` 时即执行,易在 CLI/多进程环境下引发状态污染或内存泄漏。 | 移除文件顶部全局声明。在类内部通过 `$this->load->model()` 按需加载,或在 `__construct()` 中统一初始化。 | 删除顶部 `$CI = &get_instance();`,方法内直接使用 `$this->load->model('xxx');` |
| 🟠 警告 | `Jh_community_shop_revenues_detail_model.php`<br>多个统计方法 | **重复聚合逻辑**:`get_community_revenues_data`、`get_community_revenues_sum_data` 中计算 `wx_amount`、`tuangou_amount` 等逻辑高度重复,违反 DRY 原则。 | 抽取私有方法 `private function aggregate_revenue_stats(array $data): array` 统一处理收入/退款分类汇总。 | ```php<br>private function aggregate_revenue_stats($data) {<br> $stats = ['wx'=>0, 'tuangou'=>0, 'other'=>0];<br> foreach($data as $v) { /* 统一分类累加 */ }<br> return $stats;<br>}<br>``` |
| 🟡 建议 | 全局多处 | **魔法数字/字符串泛滥**:大量使用 `'1'`, `'4'`, `'8'`, `'9'` 表示状态与支付渠道,缺乏语义化,后期维护成本高。 | 定义类常量或 PHP 8.1+ 枚举(Enum)。如 `const STATUS_PAID = 1; const PAY_WECHAT = '1';`。 | ```php<br>class Ahead_songs_sales_pay_log_model {<br> const PAY_WECHAT = '1';<br> const PAY_VIP = '3';<br> // 替换代码中的硬编码<br>}<br>``` |
| 🟡 建议 | `Jh_community_shop_revenues_detail_model.php`<br>约第 240 行 (`get_date_type_info`) | **静态缓存潜在风险**:`self::$date_type_info` 在 PHP-FPM 下安全,但若项目未来迁移至 Swoole/Workerman 等常驻进程,将导致跨请求数据污染。 | 改为实例属性 `$this->date_type_info`,或增加请求级重置逻辑。若确定仅运行于 FPM 可保留。 | `private $date_type_info = [];` 替代 `public static $date_type_info = [];` |
| 🟡 建议 | `Ahead_songs_sales_pay_log_model.php`<br>约第 140 行 | **频繁加载模型**:同一方法内多次调用 `$this->load->model()`。虽 CI 有内部缓存,但影响代码整洁度与可读性。 | 将高频依赖模型移至构造函数或父类中预加载,或使用依赖注入容器管理。 | 在 `__construct()` 中集中加载 `ahead_shop_group_model` 等。 |
## 3. 总结与行动建议
### 🔑 优先修复项(P0/P1)
1. **彻底修复 SQL 拼接漏洞**:立即替换 `refund()` 方法中的字符串拼接,以及所有 `$pay_platform_where` 的 `implode(' or ', ...)` 逻辑。务必使用框架提供的参数绑定或查询构造器链式方法。
2. **消除 N+1 查询**:重构 `get_shop_incomes_statement_trend()`,将循环内的数据库查询改为**单次范围查询 + PHP 内存映射**。预计可降低 70% 以上的数据库 I/O 开销。
3. **移除全局 `$CI` 声明**:将文件顶部的 `get_instance()` 调用清理,改为标准的模型内部加载机制,避免潜在的状态泄漏。
### 🛠 后续重构与优化方向
- **统一查询构造器规范**:确认 `phpci` 框架底层 `DB_driver` 是否支持 `?` 占位符或命名参数绑定。若不支持,建议封装一层安全查询辅助类,强制拦截未转义的输入。
- **业务常量集中管理**:将支付渠道、订单状态、时间类型等硬编码提取至独立的 `Config` 类或 `Enum` 文件中,提升代码自解释能力。
- **报表计算逻辑抽象**:当前多个模型中存在相似的 `type=1(收入)` 与 `type=2(退款)` 分类汇总逻辑。建议抽象为 `RevenueCalculator` 服务类,通过策略模式或简单工厂处理不同维度的统计,降低模型耦合度。
- **异常处理规范化**:代码中使用了全局函数 `throwError()`。建议逐步替换为 PHP 原生 `throw new \InvalidArgumentException()` 或自定义业务异常类,配合全局异常处理器统一返回格式。
> 💡 **框架适配提示**:代码呈现典型的 CodeIgniter 3 架构特征(如 `get_instance()`、`load->model()`、`select()` 等)。若 `phpci` 为内部定制框架,请重点核对 `system/database/DB_driver.php` 中 `select()`、`up()` 等方法的底层实现是否默认开启参数绑定。若未开启,上述安全修复必须手动调用 `$this->db->escape()` 或 `(int)` 强转。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780397414
|
1780397414
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
479
|
22
|
58
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `6de5af6e3 ## 自动代码审查报告
**分支**: app-260616
**提交**: `6de5af6e35f472ac5142d043b227de4326e9fda9`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 18:54:48
---
## 1. 审查摘要
- **代码质量评分**:6.0 / 10 分
- **总体评价**:代码业务逻辑完整,覆盖了营业额统计、趋势分析、详情查询及流水记录等核心场景。但存在**严重的 SQL 注入隐患**、**循环内查询(N+1)性能瓶颈**以及**框架上下文滥用**问题。代码风格偏向传统 CI3 写法,缺乏现代 PHP 类型声明与常量管理,可维护性与安全性需重点提升。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `refund()` 方法 | **SQL 注入漏洞**:`$refund_reason` 与 `$order_data['_id']` 直接拼接至 SQL 字符串,未做任何转义或预处理。攻击者可构造恶意输入破坏数据或提权。 | 废弃字符串拼接,改用框架查询构造器(Query Builder)或预处理语句。若 `Simple_model::up()` 不支持绑定参数,需重写该方法或改用原生 `$this->db->update()`。 | ```php<br>// 安全写法<br>$this->db->set('_status', 4)<br> ->set('_refund_time', time())<br> ->set('_refund_amount', '_actual_pay', FALSE)<br> ->set('_other_pay_refund_amount', '_other_pay_amount', FALSE)<br> ->set('_refund_reason', $refund_reason)<br> ->set('_refund_admin_id', $CI->admin_data['_id'] ?? 0)<br> ->set('_refund_admin_name', $CI->admin_data['_name'] ?? '')<br> ->where('_merchant_id', $order_data['_merchant_id'])<br> ->where('_shop_id', $order_data['_shop_id'])<br> ->where('_order_id', $order_data['_id'])<br> ->where('_type', $type)<br> ->where('_status', 1)<br> ->update($this->table_name);<br>``` |
| 🔴 严重 | `get_shop_incomes_statement_detail()` | **SQL 注入漏洞**:`$pay_platform_where` 数组通过字符串拼接构造 `OR` 条件,用户传入的 `$params['pay_platform_arr']` 未过滤直接入 SQL。 | 使用查询构造器的分组条件语法替代手动拼接,确保参数自动转义。 | ```php<br>$this->db->group_start();<br>foreach ($params['pay_platform_arr'] as $pp) {<br> $arr = explode('_', $pp);<br> $this->db->or_where('a._pay_platform', $arr[0]);<br> if (!empty($arr[1])) {<br> $this->db->where('a._second_pay_platform', $arr[1]);<br> }<br>}<br>$this->db->group_end();<br>``` |
| 🟠 警告 | `get_shop_incomes_statement_trend()` | **N+1 查询性能瓶颈**:在 `foreach ($result as &$v)` 循环中反复调用 `$this->select()`。若 `$result` 有 30 个时间段,将触发 30 次独立 DB 查询,高并发下极易拖垮数据库。 | 改为**单次查询**拉取全量数据,在 PHP 层按时间维度聚合;或使用 `IN` 条件一次性查询后分组。 | 建议将时间范围合并为单次查询,返回后使用 `array_reduce` 或循环按 `create_hour/date/month` 映射填充 `$result`。 |
| 🟠 警告 | 文件顶部第 2 行 | **框架生命周期违规**:`$CI = &get_instance();` 在类定义外全局执行。文件被 `include` 时即触发,可能引发上下文污染、内存泄漏或单元测试失败。 | 移除顶部代码,将依赖加载移至 `__construct()` 或具体业务方法中。 | ```php<br>public function __construct()<br>{<br> parent::__construct();<br> // 按需加载模型或保持延迟加载<br>}<br>``` |
| 🟠 警告 | `get_shop_incomes_statement_detail()` | **模型状态污染**:使用 `$this->set_table_name($table_name . ' a')` 修改了模型内部表名状态,虽在末尾恢复,但在并发请求或链式调用中易引发别名冲突。 | 避免修改全局模型状态,建议实例化临时查询对象或使用框架提供的 `from()`/`join()` 链式语法。 | 使用 `$this->db->from($this->table_name . ' a')` 替代全局状态修改。 |
| 🟠 警告 | `add_data()` 方法 | **未初始化变量**:`$second_pay_platform` 仅在 `if` 分支中赋值,末尾依赖 `?? 0` 兜底。在 PHP 严格模式或旧版本中会触发 `Notice`,且逻辑分支遗漏时易产生脏数据。 | 方法开头显式初始化:`$second_pay_platform = 0;`,并确保所有分支均有明确赋值。 | `$second_pay_platform = 0; // 初始化` |
| 🟡 建议 | 全局多处 | **魔法数字/字符串泛滥**:状态值 `1, 4`、平台值 `8, 9, 17~28` 等硬编码散落各处,业务变更时需全局搜索替换,极易遗漏。 | 提取为类常量(`const`),集中管理业务字典。 | ```php<br>const STATUS_PAID = 1;<br>const STATUS_REFUNDED = 4;<br>const PAY_PLATFORM_GROUP = '8';<br>``` |
| 🟡 建议 | 类名/方法名 | **不符合 PSR-12 规范**:类名与方法名使用下划线分隔(如 `Ahead_songs_sales_pay_log_model`、`get_shop_incomes_statement_sum`)。 | 逐步重构为 `StudlyCaps` 类名与 `camelCase` 方法名。若受历史包袱限制,至少保持项目内统一。 | `class AheadSongsSalesPayLogModel extends Simple_model` |
| 🟡 建议 | `get_shop_incomes_statement_trend()` | **非标准异常处理**:使用自定义 `throwError()` 函数中断流程,不利于全局异常捕获与日志追踪。 | 改用标准 PHP 异常或框架异常类。 | `throw new \InvalidArgumentException('营业额走势查询时间错误');` |
## 3. 总结与行动建议
### 🔑 优先修复项(P0)
1. **彻底修复 SQL 注入**:`refund()` 与 `get_shop_incomes_statement_detail()` 中的字符串拼接必须立即替换为查询构造器或参数绑定。这是当前最高危的安全漏洞。
2. **消除 N+1 查询**:重构 `get_shop_incomes_statement_trend()`,将循环查询改为单次批量查询 + PHP 内存聚合。可预期性能提升 5~10 倍。
3. **清理全局上下文**:移除文件顶部的 `$CI = &get_instance();`,遵循框架依赖注入或构造函数初始化规范。
### 🛠 后续重构与优化方向
1. **引入类型声明与常量管理**:
- 为所有方法参数与返回值添加 PHP 7.4+/8.0+ 类型提示(如 `array`, `int`, `string`)。
- 将 `$type_arr`、`$incomes_pay_platform_arr` 等硬编码数组迁移至配置类或数据库字典表,提升可配置性。
2. **统一数据格式化策略**:
- `change_number_format()` 被高频调用,建议在数据库层使用 `ROUND()` 或 `FORMAT()`,或在返回前统一批量处理,减少函数调用开销。
3. **框架适配说明**:
- 代码特征高度匹配 **CodeIgniter 3** 架构。若 `phpci` 为内部定制框架,请确认 `Simple_model::up()`、`$this->select()` 是否底层已实现 PDO 预处理。若未实现,上述 SQL 注入修复方案必须落地。
- 建议查阅 `phpci` 官方文档中关于 `Query Builder` 与 `Model 生命周期` 的章节,确保状态隔离与事务安全。
> 💡 **专家提示**:当前代码业务耦合度较高,建议后续将“数据聚合逻辑”与“数据查询逻辑”拆分。可引入 `Repository` 模式或 `Service` 层处理复杂统计,保持 Model 仅负责基础 CRUD,以提升代码的可测试性与扩展性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780397688
|
1780397688
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
480
|
22
|
59
|
1
|
|
0
|
🔍 代码审查报告:app-260616 - 1
|
## 自动代码审查报告
**分支**: app-260616
**提交**: `16e0ec6e3 ## 自动代码审查报告
**分支**: app-260616
**提交**: `16e0ec6e3e25170a5a84b90be2523bb5f302c81b`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 19:04:29
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码整体业务逻辑清晰,覆盖了多种营收场景的日志记录与报表查询。但存在**静态缓存未区分门店导致的数据错乱**、**手动拼接 SQL 条件引发注入风险**、**循环内执行数据库查询**等严重问题。同时,模型加载分散、重复代码较多,未充分利用框架特性,可维护性与性能有较大优化空间。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据目录结构(`system/`, `application/models/`)及 `$CI = &get_instance()`、`$this->load->model()` 等语法特征,判定为 **CodeIgniter 3.x** 架构。若 `phpci` 为内部定制框架,请结合其底层实现酌情调整框架适配建议。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `get_date_type_info` (~L405) | **静态缓存未区分 `$shop_id`**。`self::$date_type_info` 仅在首次调用时初始化,后续传入不同门店 ID 时仍返回首个门店的时间范围,导致报表数据严重错乱。 | 移除静态缓存,或改为以 `$shop_id` 为键的多维缓存数组;建议直接使用 CI Cache 驱动或按需计算。 | `if (!isset(self::$date_type_info[$shop_id])) { /* 初始化逻辑 */ } return self::$date_type_info[$shop_id];` |
| 🔴 严重 | `get_community_revenues_sum_data` / `detail_data` (~L235, L335) | **SQL 注入风险**。手动拼接字符串 `'(a._pay_platform=' . $pay_platform . ' ...)'` 并传入查询条件,绕过框架参数绑定与转义机制。若 `$params` 来自用户输入,极易被注入。 | 使用 CI 查询构造器的分组条件方法,或确保输入严格白名单过滤。 | `$this->db->group_start()->where('a._pay_platform', $p1)->where('a._second_pay_platform', $p2)->group_end();` |
| 🟠 警告 | `get_community_revenues_trend` (~L385) | **循环内执行 DB 查询**。在 `foreach ($result as &$v)` 中反复调用 `$this->select()`,若时间维度较多或并发高,将引发严重的 N+1 查询性能瓶颈。 | 改为单次范围查询拉取所有数据,在 PHP 层按时间键聚合映射;或使用 `WHERE IN` / 范围条件一次性获取。 | 一次性查询 `_business_date` 在起止范围内的数据,使用 `array_reduce` 或哈希表在内存中分组累加。 |
| 🟠 警告 | 多处方法内部 (`_add_log`, `get_room_info_by_order` 等) | **频繁动态加载模型**。在业务方法中反复调用 `$this->load->model()`,增加文件 I/O 与内存开销,违反 CI 最佳实践。 | 将依赖模型统一移至 `__construct()` 中加载,或通过 CI `autoload.php` 配置预加载。 | `public function __construct() { parent::__construct(); $this->load->model(['ahead_yc_merchant_model', 'ahead_family_servers_model']); }` |
| 🟠 警告 | `get_community_revenues_data` vs `sum_data` (~L160 vs L200) | **高度重复的聚合逻辑**。两个方法 80% 以上的数据计算与格式化代码完全一致,违反 DRY 原则,后期维护成本高。 | 提取私有聚合方法 `private function format_revenue_stats(array $data): array`,统一处理计算与格式化。 | 将 `foreach` 累加与 `change_number_format` 逻辑抽离,主方法仅负责构建 `$where` 并调用聚合器。 |
| 🟡 建议 | 全局类定义 (~L10) | **类名不符合 PSR-12 规范**。当前为蛇形命名 `Jh_community_shop_revenues_detail_model`,应使用大驼峰(PascalCase)。 | 重命名为 `JhCommunityShopRevenuesDetailModel`,并同步更新所有引用处。 | `class JhCommunityShopRevenuesDetailModel extends Report_model` |
| 🟡 建议 | `add_by_vip_recharge_refund` 等 (~L480) | **循环逐条插入**。在 `foreach` 中调用 `_add_log` 执行单条 `INSERT`,数据量大时数据库交互频繁,性能低下。 | 收集完整数据数组后,使用 `$this->db->insert_batch()` 批量写入。 | `$this->db->insert_batch($this->table_name, $batch_insert_data);` |
| 🟡 建议 | 全局 PHPDoc | **类型声明不准确**。多处 `@return true` 不符合 PHPDoc 规范,应使用 `bool`;魔法数字(如 `1,2,8,9`)硬编码降低可读性。 | 修正注释类型;将业务状态码定义为类常量(如 `const TYPE_INCOME = 1;`)。 | `/** @return bool */` <br> `const PAY_PLATFORM_WX = '1';` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复静态缓存门店隔离问题**:立即调整 `get_date_type_info` 的缓存策略,避免跨门店数据污染。这是当前最可能导致线上报表数据错误的逻辑缺陷。
2. **消除 SQL 注入隐患**:全面审查 `$where` 数组中手动拼接字符串的逻辑,替换为 CI 查询构造器的 `group_start()` / `group_end()` 或 `or_where()` 链式调用,确保参数自动转义。
3. **优化趋势图查询性能**:将 `get_community_revenues_trend` 中的循环查询重构为**单次范围查询 + 内存聚合**。可大幅降低数据库连接压力与响应延迟。
### 🛠 后续重构与优化方向
- **统一模型加载策略**:在 `__construct()` 中集中加载所有依赖模型,或使用 CI 的自动加载机制。避免在高频调用的业务方法中重复 `load->model()`。
- **抽离公共聚合逻辑**:`get_community_revenues_data` 与 `get_community_revenues_sum_data` 的统计逻辑高度重合,建议封装为独立的私有方法,通过参数控制返回结构,提升代码复用率。
- **引入批量操作与事务控制**:对于 `_add_log` 相关的写入场景,若存在批量调用,应改用 `insert_batch()`。同时,建议在 `enforce_con_db()` 切换连接时包裹 `try...finally` 块,确保异常发生时数据库连接状态能正确恢复,防止连接泄漏。
- **规范化与常量管理**:逐步将硬编码的订单类型、支付平台标识提取为类常量,并统一类名与方法命名风格。修正 PHPDoc 类型声明,为后续接入静态分析工具(如 PHPStan/Psalm)打下基础。
> 💡 **提示**:若 `enforce_con_db()` 为自定义多数据源切换方法,请确保其底层已处理连接池复用与异常回滚。建议在核心写入路径添加基础的事务包裹(`$this->db->trans_start()` / `trans_complete()`)以保障财务数据一致性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780398269
|
1780398269
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
481
|
21
|
178
|
1
|
|
0
|
🔍 代码审查报告:pay-260616 - 1
|
## 自动代码审查报告
**分支**: pay-260616
**提交**: `41b064f1a ## 自动代码审查报告
**分支**: pay-260616
**提交**: `41b064f1a2ca5eb68fad1ed685d9f6e6491d11e5`
**提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com)
**时间**: 2026-06-02 19:21:26
---
## 1. 审查摘要
- **代码质量评分**:6.5 / 10 分
- **总体评价**:代码整体业务逻辑完整,覆盖了包厢状态管理、扫码登录、设备激活、智能控制及预订展示等核心场景。但存在明显的架构反模式(如文件级 `get_instance()`)、事务安全风险、严重的 N+1 查询性能瓶颈,以及大量硬编码魔法数字。代码风格在 PSR-12 规范上存在不一致,部分长方法职责过重,可维护性有待提升。
- **风险等级**:🟠 中高风险(主要源于事务回滚隐患、循环内高频 DB 查询及类型松散比较)
> 📌 **框架说明**:从 `$CI =& get_instance()`、`system/` 目录结构、Query Builder 调用方式判断,该代码高度符合 **CodeIgniter 3 (CI3)** 架构特征。若 `phpci` 为内部定制框架,以下审查原则与 CI3 最佳实践完全兼容。
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | 文件顶部 (全局作用域) | 在类外部执行 `$CI = &get_instance(); $CI->load->model('Simple_model');`。每次请求无论是否实例化该 Model 都会执行,浪费资源且违反 MVC 生命周期。 | 移除文件顶部代码。若 `Simple_model` 为基类,应通过 CI 自动加载或 `__construct` 中加载。 | `// 删除顶部两行<br>class Ahead_family_servers_model extends Simple_model {<br> public function __construct() {<br> parent::__construct();<br> // 基类加载逻辑应移至父类或 CI autoload.php<br> }<br>}` |
| 🔴 严重 | `activation_data()` | `try...catch` 中混用自定义 `throwError()`。若 `throwError` 内部调用 `exit/die` 或未抛出 `Exception`,将导致 `trans_rollback()` 无法执行,引发数据库事务泄漏与脏数据。 | 统一使用原生异常机制,或确保 `throwError` 抛出 `Exception`。 | `// 替换 throwError 为:<br>throw new Exception("该手机号已被注册,请联系客服:4006123989");<br>// 或确保全局 throwError 实现为:<br>function throwError($msg, $code=0) { throw new Exception($msg, $code); }` |
| 🔴 严重 | `get_community_shop_room_show_list()` | `foreach ($room_data as $k => &$v)` 循环内调用 `$this->ahead_room_timing_model->get_now_price()` 与 `get_lowest_price()`。若门店有 50 个包厢,将触发 100+ 次独立查询,严重拖慢响应。 | 改为批量查询。让定价 Model 接收 `room_id` 数组,一次性返回映射表,或在循环外预加载。 | `$room_ids = array_column($room_data, 'room_id');<br>$price_map = $this->ahead_room_timing_model->get_batch_prices($merchant_id, $shop_id, $room_ids, $book_time);<br>foreach ($room_data as &$v) {<br> $v['price'] = $price_map[$v['room_id']] ?? 0;<br>}` |
| 🟠 警告 | `update_room_status()` | 参数 `$status` 声明为 `int`,但 `switch` 中使用字符串 `"0"`, `"1"` 进行松散比较。PHP 8+ 对类型要求更严格,易引发隐式转换 Bug。 | 统一类型转换并使用严格比较,或直接使用整型 `case 0:`。 | `$status = (int)$status;<br>switch ($status) {<br> case 0: $msg = "空闲0小时0分"; break;<br> // ...<br>}` |
| 🟠 警告 | 全局多处 | 大量使用 `0, 1, 2, 3, -1` 等魔法数字表示包厢状态、设备类型、操作类型等。可读性差,后期维护极易出错。 | 在类顶部定义语义化常量,全局替换硬编码。 | `const STATUS_FREE = 0;<br>const STATUS_CONSUMING = 1;<br>const STATUS_REPAIRING = 2;<br>const STATUS_CLEANING = 3;<br>const STATUS_UNCONNECTED = -1;` |
| 🟠 警告 | `scan_screen_url()` | 变量 `$open_data` 仅在 `if ($room_data['_status'] == 1)` 分支内定义,后续直接使用 `$open_data ?? []`。虽 PHP 7+ 兼容,但逻辑分支耦合度高,易产生未定义变量警告。 | 在方法顶部初始化 `$open_data = [];`,明确变量作用域。 | `$open_data = []; // 方法开头初始化<br>// 后续逻辑保持不变` |
| 🟠 警告 | 多个方法 | 频繁在方法内部调用 `$this->load->model()` 与 `$this->load->library()`。CI3 虽支持,但重复加载会累积开销,且不利于依赖管理。 | 将常用 Model/Library 移至 `__construct` 中加载,或配置 `config/autoload.php`。 | `public function __construct() {<br> parent::__construct();<br> $this->load->model(['Ahead_open_room_log_model', 'Ahead_user_extension_model']);<br>}` |
| 🟡 建议 | 全局 | 数组语法混用 `array()` 与 `[]`。不符合 PSR-12 规范。 | 全局统一使用短数组语法 `[]`。 | `public $cache_data = [];`<br>`$redis_data = ['status' => $status, 'create_time' => time()];` |
| 🟡 建议 | `close_business()` | 营业时间跨天判断逻辑冗长且易错(`$shop_data['_business_end'] > 86400` 等)。缺乏边界条件测试,易因时区/夏令时引发误判。 | 抽取为独立工具方法 `is_in_business_hours($start, $end, $current)`,并补充单元测试。 | `// 建议封装至 helpers/business_helper.php<br>function is_in_business_hours($start_sec, $end_sec, $now_sec) { ... }` |
| 🟡 建议 | `get_room_scene_graph()` | 使用 `self::$room_scene_graph` 静态缓存。在 PHP-FPM 下安全,但若未来迁移至 Swoole/Workerman 等常驻内存环境,将导致内存泄漏与数据串扰。 | 改用 CI Cache 驱动或 Redis 缓存,设置合理 TTL。 | `if (!$scene = $this->cache->get("room_scene_{$room_id}")) {<br> // 查询并处理<br> $this->cache->save("room_scene_{$room_id}", $scene, 3600);<br>}` |
## 3. 总结与行动建议
### 🔑 优先修复的关键问题
1. **修复事务泄漏风险**:立即检查全局 `throwError()` 实现。若其不抛出 `Exception`,必须重构为 `throw new Exception()` 或改用 CI 的 `show_error()` 配合 `trans_rollback()` 显式处理。
2. **消除 N+1 查询**:`get_community_shop_room_show_list()` 中的循环查价是性能瓶颈。请重构定价 Model 支持批量查询(`WHERE IN`),将 O(N) 查询降为 O(1)。
3. **清理文件级副作用**:删除文件顶部的 `$CI = &get_instance();`,将依赖加载收敛至构造函数或框架自动加载机制,避免请求级资源浪费。
### 🛠 后续重构与优化方向
- **状态机与常量管理**:将散落的 `0/1/2/3/-1` 状态码统一提取为类常量或枚举(PHP 8.1+)。可考虑引入轻量级状态机模式管理包厢生命周期(空闲→消费→清扫→空闲),降低 `if/else` 分支复杂度。
- **方法职责拆分**:`scan_screen_url()` 与 `get_community_shop_room_show_list()` 均超过 150 行,违反单一职责原则。建议将“扫码鉴权逻辑”、“用户加入包厢逻辑”、“套餐过滤逻辑”抽离至独立的 `Service` 层(如 `RoomScanService`、`BookingService`),Model 仅负责数据持久化。
- **异步化外部 I/O**:`update_room_status()` 中同步调用 `get_aliyun_redis_conn()` 与 `room_update_mqtt_notify()`。若 MQTT 推送或 Redis 写入耗时,将阻塞主流程。建议引入消息队列(如 RabbitMQ/Redis Stream)或 CI 的 `Cron` 任务进行异步解耦。
- **规范与测试**:全面对齐 PSR-12(短数组、严格类型声明、方法注释标准化)。为核心业务方法(如 `activation_data`、`close_business` 跨天逻辑)补充 PHPUnit 测试用例,确保边界条件(如跨天营业、并发扫码、事务回滚)稳定可靠。
> ⚠️ **局限性说明**:提供的代码片段在 `get_community_shop_room_show_list()` 末尾处截断,未能审查完整逻辑。若后续方法包含更多循环查询、未过滤的用户输入或复杂事务,请补充完整代码以便进行二次深度审查。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780399287
|
1780399287
|
0
|
0
|
0
|
0
|
Edit
Delete
|