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