|
790
|
116
|
1
|
5
|
|
0
|
fix(contracts): 注册中心规则补失败关闭与摘要规范化——三个入口此前抛 TypeErr fix(contracts): 注册中心规则补失败关闭与摘要规范化——三个入口此前抛 TypeError,同一摘要的两种写法此前分叉成两个复核键...
|
蓝图 docs/domain/registry-snapshot-blueprint.md 从迁入起 蓝图 docs/domain/registry-snapshot-blueprint.md 从迁入起就写着「失败关闭」与
「review key 仅用于人工复核幂等」两条不变量,实测三处不成立。本次按蓝图自己的口径补齐,
改动只在 contracts/src/domain/application-contract-registry/:不新增写入点、不新增宿主、
不动 Catalog 与 Schema,每条输出仍固定 activationAllowed=false / registryWriteAllowed=false /
humanApprovalRequired=true。
1. 失败关闭:assessRegistrySnapshot / assessRegistryTransition /
reviewCandidateSnapshotUpgrade 对畸形输入抛 TypeError(快照缺字段、now 不是 Date、
decisions 整个缺失都会抛),四个入口里只有 LocalManifestAdmissionPlanner.plan 是
失败关闭的。现四个入口一致返回 REJECT + 原因码。这不是洁癖:check-fixtures 把抛出当
配置错误处理,实测一次 TypeError 会让整套 15 例逐例判定塌成一条 configuration 失败。
2. 十六进制引用规范化:digest / commit 的正则带 /i 收大小写两种写法,比较与入键却
大小写敏感——同一摘要写成大写会得到另一个 reviewIdempotencyKey,同版本大小写翻转被判成
SAME_VERSION_DIGEST_CHANGED,大写回滚 pin 被判成 ROLLBACK_PIN_MUST_MATCH_CURRENT。
现一律规范化为小写后再比较、再入键,ACCEPT 回吐规范化后的值。
3. 版本文法收敛:一个模块三套(快照流与清单准入用 \d+\.\d+\.\d+,升级复核用严格 SemVer),
新增 registry-primitives.ts 作单一来源,含预发布序;DEC-009—012 此前在两份文件各写一份,
一并收敛。snapshot-upgrade-review.ts 因此净减约 60 行重复实现。
两处语义变化(蓝图新增一节已如实登记):
- 收紧:1.02.0 这类前导零版本此前被放行,现在拒;assessRegistrySnapshot 另开始拒 latest
这类可变标签——此前它能过体检却必然过不了迁移规则。
- 放宽:1.0.0-rc.1 这类预发布版本此前被快照流整条挡在外面,现在按 SemVer 序参与迁移。
平台自己发的就是 1.0.0-rc.N,升级复核那一侧本来就这么判。风险面有限:本模块所有出口
都不激活、不写 Registry,多进人工复核队列不等于多放行制品。
证据(本分支隔离工作树,clean):注册中心单测 44/44(原 34 + 加固 10);
contracts check:local 302/302;check:fixtures 九个契约域套件 100 例 0 失败,
其中本套件 15 例(正 4 / 反 11,原 8 例)。篡改必红实测两次:sameHexRef 退回大小写敏感
→ 单测 1 红 + 夹具 P03 红;去掉快照入口守卫 → 整套塌成 0 例 1 配置失败。
仍为仓内候选 sdk_e2,不代表正式 Registry、Snapshot 发布或跨仓 Required Check 已上线。
清单登记的 C01.04 / C01.06 是「接线」型缺口且前置 Q01 运行宿主未裁,本次未动。
reports/fixtures.latest.json 未回绑:它是 17 套件的聚合报告,只跑 9 个套件去覆盖会缩小结论面,
应在整批(含并行会话的 public-file / IM / 跨域流程改动)落定后统一重跑回绑。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789742918
|
1789744064
|
1789742925
|
0
|
0
|
0
|
Edit
Delete
|
|
773
|
85
|
8
|
4
|
|
0
|
按省市统计设备月度新增上线数量报表
|
## 功能概述
在 PC 管理后台「数据报表」模块,按省市统计各 KTV 设备每月新增上线数量,支 ## 功能概述
在 PC 管理后台「数据报表」模块,按省市统计各 KTV 设备每月新增上线数量,支持全国省份分布视图 + 城市下钻。
## 完整产物链路
| 阶段 | 产物 | 链接 | 状态 |
|------|------|------|------|
| 需求意图 | Intent 文档 | PR #1 | ✅ 已合并 |
| 设计原型 | Design 文档 | PR #3 | ✅ 已合并 |
| 技术方案(后台) | Plan 文档 | PR #6 | ✅ 已合并 |
| 开发实现(后台) | admin 仓库代码 | admin PR #1 | ✅ 已合并 |
| 开发实现(Web前端) | admin 仓库代码 | admin PR #2 | ✅ 已合并 |
| 测试验收 | — | 本 Issue | 🧪 待测试 |
## 验收标准
- 后台 API 返回省份/城市维度的月度新增上线设备数,分页正确
- PC 管理后台菜单「数据报表 > 设备上线分布」可正常点击进入
- 省份视图正常渲染(横向柱状图),点击下钻到城市视图
- 城市视图面包屑可返回全国
- 月份切换后数据刷新正确
- 无数据月份显示空状态,不报错...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1789379887
|
1789380277
|
0
|
0
|
2
|
0
|
Edit
Delete
|
|
770
|
85
|
7
|
4
|
|
0
|
[Skill] build-complete 新增接口文档归档步骤
|
Related to #8
## 说明
在 `build-complete` skill 里新增 Related to #8
## 说明
在 `build-complete` skill 里新增一步:Plan 阶段确定接口设计后、代码开发完成时,如涉及新增/修改接口,需要生成并归档接口文档:
- Apifox(规范化 OpenAPI 文档,Claude 通过 API 增量导入)
- `docs/frontend-specs/<功能名>.md`(面向其他端的对接说明文档,固定五章结构)
背景:issue #4 实现完成后发现接口文档一直没有归档,靠事后补做;这次把它固化成流程里的正式一步,插在"提交 plan.md"和"开代码 PR"之间。
同时补充了代码仓库与 jh-project 分离时的注意事项(milestone/label 可能不存在、Close #N 跨仓库不生效)。...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788247386
|
1789379900
|
1788247940
|
0
|
1
|
0
|
Edit
Delete
|
|
768
|
85
|
6
|
4
|
|
0
|
[Plan] 按省市统计设备月度新增上线数量报表 (后台管理)
|
Related to #8
## 关联 Issue
[#4 — [后台] 按省市统计设备月度新增 Related to #8
## 关联 Issue
[#4 — [后台] 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/issues/4)
## 说明
补交 Plan 阶段产物(此前误提交到已合并关闭的 design 分支,未能进入 main,见此 PR 重新提交)。
代码已实现并提交:[laiqiaojie/admin#1](https://gitea.g-hi.com/laiqiaojie/admin/pulls/1)
按 REVIEW.md「跳过评审的路径」,`plan/` 产物文件不需要 Tech Lead 单独审核,随此 PR 直接入库。...
|
0
|
0
|
1
|
1
|
1
|
|
0
|
1788245555
|
1789379899
|
1788245966
|
0
|
1
|
0
|
Edit
Delete
|
|
760
|
85
|
5
|
4
|
|
0
|
[Web] 按省市统计设备月度新增上线数量报表
|
> 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 De > 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 Design PR
[PR #3 — Design: 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/3)
## 工作范围
负责 Web 前端页面实现:
- 数据报表 → 设备上线分布 页面
- 月份筛选器 + 当月总数卡片 + 省份横向柱状图
- 点击省份下钻到城市视图,支持面包屑返回
## 产物
- plan/device-online-stats-by-region-web.md(实现前提交,Tech Lead 审核后开始 Build)
## 参考
- 需求说明:[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
- 在线原型:https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8...
|
1
|
0
|
1
|
0
|
3
|
|
0
|
1787909556
|
1789380193
|
1789380193
|
0
|
1
|
0
|
Edit
Delete
|
|
759
|
85
|
4
|
4
|
|
0
|
[后台] 按省市统计设备月度新增上线数量报表
|
> 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 De > 子任务,属于主 Issue #8「按省市统计设备月度新增上线数量报表」
## 关联 Design PR
[PR #3 — Design: 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/3)
## 工作范围
负责后台接口实现:
- 新增查询接口,按月份统计各省份新增上线设备数量
- 支持下钻查询:指定省份,返回城市级别数据
- 按权限过滤:超管返回全国数据,运营商返回自己区域
## 产物
- (实现前提交,Tech Lead 审核后开始 Build)
## 参考
- 需求说明:[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
- 在线原型:https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8...
|
1
|
0
|
1
|
0
|
2
|
|
0
|
1787909526
|
1789380193
|
1789380193
|
0
|
1
|
0
|
Edit
Delete
|
|
758
|
85
|
3
|
4
|
|
0
|
[Design] 按省市统计设备月度新增上线数量报表
|
Related to #8
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上 Related to #8
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/1)
---
## PM 确认原型
**需求说明文档:**
[design/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/design/device-online-stats-by-region.md)
**在线原型(点击直接打开,可交互,无需登录):**
https://claude.ai/code/artifact/b50eaa98-689b-4742-8024-cdf74f95d5c8
**页面状态:**
- 全国省份视图 — 月份筛选器 + 当月总数卡片 + 各省份横向柱状图
- 城市下钻视图 — 点击省份柱子进入,面包屑「全国 › 广东省」+ 城市排行
**交互流程:** 点击省份柱子进入城市视图,点击面包屑「全国」或「返回全国」按钮返回。
**审核 checklist:**
- [ ] 页面布局和组件符合预期?
- [ ] 交互路径(下钻、返回)正确?
- [ ] 数据定义(新增上线 = 首次上线,归属 = 门店注册地址)理解一致?
- [ ] 权限范围(超管看全国,运营商看自己区域)正确?
**确认方式:在本 PR 评论「原型确认 ✅」,然后 Approve + Merge**...
|
1
|
0
|
1
|
1
|
0
|
|
0
|
1787829439
|
1789379899
|
1787908921
|
0
|
7
|
0
|
Edit
Delete
|
|
757
|
85
|
2
|
4
|
|
0
|
[Design] 按省市统计设备月度新增上线数量报表
|
## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https:// ## 关联 Intent
[PR #1 — 按省市统计设备月度新增上线数量报表](https://gitea.g-hi.com/laiqiaojie/jh-project/pulls/1)
---
## 审核顺序:PM 先确认原型,再由 Tech Lead Approve
---
## 第一步:PM 确认原型
**原型文件:**
(从仓库拉取后浏览器直接双击打开,可点击交互)
页面状态:
- 全国省份视图 — 月份筛选器 + 当月总数卡片 + 各省份横向柱状图
- 城市下钻视图 — 点击省份柱子进入,面包屑「全国 › 广东省」+ 城市排行
交互流程:点击省份柱子进入城市视图,点击面包屑「全国」或「返回全国」按钮返回。
**PM 审核 checklist:**
- [ ] 页面布局和组件符合预期?
- [ ] 交互路径(下钻、返回)正确?
- [ ] 数据定义(新增上线 = 首次激活,归属 = 门店地址)理解一致?
- [ ] 权限范围(超管看全国,运营商看自己区域)正确?
**PM 确认方式:在本 PR 评论「原型确认 ✅」即可,无需 Approve**
---
## 第二步:Tech Lead 审核(PM 确认后进行)
**数据链路:**
> 待确认:ahead_family_servers._shop_id 是否关联 ahead_yc_shop._id,Build 阶段查库验证。
**新增接口(新建控制器 DeviceOnlineReport.php):**
- POST /DeviceOnlineReport/getStats — 省份排行 + 当月总数
- POST /DeviceOnlineReport/getCityStats — 城市下钻
**权限:** agent_id 从 session 取,= 0 为超管不过滤
**安全:** month 正则校验、province_id intval()、agent_id 不信任前端
**Tech Lead 审核 checklist:**
- [ ] 数据链路正确?表关联关系有无误判?
- [ ] 接口设计合理?参数和响应格式符合规范?
- [ ] 权限处理方式正确?
- [ ] 安全检查要点覆盖?
- [ ] 前端方案可行(ECharts 按需引入)?
**Tech Lead Approve → Merge → 评审会议(里程碑内所有需求一起)→ Plan 阶段**...
|
1
|
0
|
1
|
1
|
0
|
|
0
|
1787824027
|
1789379887
|
1787829412
|
0
|
3
|
0
|
Edit
Delete
|
|
756
|
85
|
1
|
4
|
|
0
|
[Intent] 按省市统计设备月度新增上线数量报表
|
Related to #8
## 需求摘要
在「数据报表 > 设备分析」下新增报表,按月筛 Related to #8
## 需求摘要
在「数据报表 > 设备分析」下新增报表,按月筛选展示各省份新激活上线设备数量柱状图排行,支持下钻到城市维度。
## 核心决策
- 统计口径:当月**新激活**上线设备(首次上线,取 ahead_authenticate_log 表的 create_time 字段)
- 地区归属:取设备绑定**门店地址**的省/市字段
- 交互方式:点击省份**下钻**到城市排行(非 Tab 切换)
- 权限:跟随现有 agent_id 角色体系,超管看全国,运营商看自己区域
## 不在范围内
- 不做 Excel 导出
- 不做地图热力图
- 不做区/县级别
- 不做跨月趋势
## 产物文件
[intent/device-online-stats-by-region.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/intent/device-online-stats-by-region/intent/device-online-stats-by-region.md)
## PM 审核清单(参考 REVIEW.md)
- [ ] 需求背景和问题描述是否准确反映了原始诉求?
- [ ] 期望结果是否可验证?
- [ ] 不在范围内的排除项是否合理?
- [ ] 受影响系统判断是否正确(admin / ahead_authenticate_log)?
- [ ] 本次是否接受排期,进入 Design 阶段?...
|
1
|
0
|
1
|
1
|
2
|
|
0
|
1787817232
|
1789379898
|
1787823622
|
0
|
5
|
0
|
Edit
Delete
|
|
720
|
67
|
1
|
5
|
|
0
|
治理: 关闭对抗性验收发现的假绿装置、导出层静默数据损坏与文档幽灵资产
|
<!--
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
|
1785285580
|
1785285593
|
1785285593
|
0
|
0
|
0
|
Edit
Delete
|
|
743
|
57
|
3
|
5
|
|
0
|
feat(script): 接入大语言模型——歌词/文案 → 拍摄脚本 → 角色确认 → 定格图
|
本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端
原型 本仓此前零 LLM 接入(全仓只有 DashScope 的图像调用),「歌词成图」屏是纯前端
原型(procedural.ts 画色块 + setTimeout 假装推理,不落库不接后端)。本轮把这条
动线升级为真链路 + 真持久化。
契约单源(packages/contracts/src/script.ts)
- 角色确认状态机 scriptRoleMachine、脚本状态机 shootingScriptMachine
- 景别/运镜用枚举而非自由文本:LLM 一旦自由发挥,下游 prompt 与统计就没有稳定口径
- scriptDraftSchema 是 LLM 输出的唯一判据;prompt 构造器单源,两后端禁止各拼一份
- evaluateRoleReadiness:本域核心不变量,双后端硬拦截 + 前端同源即时反馈
- 前端私有的 findBannedHits 上收为 contracts 的 findBannedWords(后端也要逐镜标记,
两份并行就是双真源)
LLM 不是权威
- sidecar /v1/script 只保证「返回长得像脚本的 JSON」,两个后端各自再 parse 一次才落库
- 模型引用未声明角色键 → 422 SCRIPT_ROLE_KEYS_DANGLING(幻觉护栏)
- 连续给不出合法 JSON → 502 LLM_OUTPUT_UNPARSEABLE,绝不返回占位脚本
- parse_json_object 只剥围栏、截首尾花括号,不做字段猜测或补齐
角色必须先确认才允许出定格图
- 判据 = status CONFIRMED 且有 referenceAssetId(没有参考图就没有一致性锚点)
- CONFIRMED --reset--> DRAFT 会解除参考图绑定:人确认的是那一张图,不是那个名字
- 出图时按 roleKeys 顺序喂参考图,与指令里「第 N 张参考图」编号严格对齐
写链纪律与物料链路同构:tenant 全覆盖、updateMany 带状态前置条件(0 行即 409)、
终态与 outbox 同 tx、能力不可用 → job BLOCKED + 诚实 reason,禁止静默降级。
品牌准绳只逐镜标记不拒绝整份脚本(脚本属创作内容),硬拦截点在出定格图这个受控出口,
显式放行需带参数且落审计事件。
顺带修掉三个既有缺陷
1. 合并遗留:sidecarEdit 用 sidecarGenerateResponseSchema 校验响应(要求 steps/
loadSeconds),但 run_hosted_edit 两个字段都不返回 —— 托管改字会在客户端边界
直接 Zod 抛错(本地路径返回这两个字段,所以一直没暴露)
2. check-migrations 的列检查只扫 CREATE TABLE,凡 ALTER TABLE ADD COLUMN 追加的
@map 列一律误报 drift(此前唯一的 ALTER 列 brand_kits.profile 没 @map 才没现形)
3. ktv-poster-master.png 血统在合并两侧打架,git log --all 证明该文件自初始化提交后
从未重新生成,取诚实标注 prototype-demo-master
验收
- 新增 pnpm check:script → reports/script-acceptance.latest.json(双后端各 8 passed
+ 1 skipped-live);own-tests floor 10→14,棘轮已收紧
- pnpm check / check:runtime 均 exit 0
- 浏览器实测:未确认角色 → 按钮 disabled 且提示缺哪个角色;绕过前端直打后端 → 422
ROLE_NOT_CONFIRMED;跨租户 404;无凭证生成 → UI 显示 503 且不产生占位脚本
诚实边界(已写入 CLAUDE.md)
- liveLlmAsserted=false:本机无 DASHSCOPE_API_KEY,真调 LLM 的 live 断言被 skip,
门禁成立 ≠ LLM 出脚本已验证
- check:inference 在本机为 failed(动手前即为 failed):本工作副本的模型权重是
git-lfs 指针存根,非本轮改动导致;基线表该行已从 GREEN 改为 OPEN
- ui-acceptance 报告早于本屏,未覆盖 script 屏,已标 STALE
- 新开缺口 G16(LLM 只做结构校验、无事实性校验)、G17(同步 HTTP 挂分钟级推理 /
render_jobs 索引非 CONCURRENTLY / 本地多图 I2I 未在本机验证)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
<!--
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
|
1787029791
|
1787032807
|
1787032807
|
0
|
0
|
0
|
Edit
Delete
|
|
731
|
57
|
2
|
5
|
|
0
|
chore: add material factory model weights
|
<!--
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
|
1786603028
|
1786603028
|
0
|
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
|
|
673
|
32
|
1
|
1
|
|
0
|
222
|
|
0
|
0
|
0
|
1
|
0
|
|
0
|
1781158798
|
1781158798
|
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
|
|
554
|
25
|
3
|
1
|
|
0
|
🔍 代码审查报告:api-260616 - 需求 时序设备api控制日志记录 16449
|
## 自动代码审查报告
**分支**: api-260616
**提交**: `7e447e7f3 ## 自动代码审查报告
**分支**: api-260616
**提交**: `7e447e7f32b5ff41344ec17d2fa199cbc015a5ae`
**提交人**: chenjunfeng (developer.jeff.c@gmail.com)
**时间**: 2026-06-05 13:27:14
---
⚠️ **重要提示**:您提供的输入中仅包含项目目录结构,**未包含具体的 `变更文件内容`**。根据约束要求,若代码片段缺失或过短,我将明确指出局限性并提供基于该架构的审查预案。请补充具体代码(Git Diff 或修改后的文件内容)后,我将立即输出精准到行号的深度审查报告。
以下为基于当前输入的标准审查报告模板:
## 1. 审查摘要
- **代码质量评分**:`N/A (待补充代码)`
- **总体评价**:当前输入仅展示项目结构,未提供实际变更代码。从目录特征判断,该系统采用典型的 MVC 架构(高度类似 CodeIgniter 3 或内部衍生的 `phpci` 框架),核心组件(数据库驱动、会话管理、缓存、辅助函数)划分清晰。待代码提交后,将立即开展五大维度的深度审查。
- **风险等级**:`待评估`
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| ⚪ 待补充 | 全局 | **未提供变更代码/Diff**,无法进行实质性逻辑、安全与性能审查。 | 请提交具体的修改文件路径、行号及变更代码片段。 | - |
| 🟠 警告 | `system/database/DB_driver.php` | *(架构通用预警)* 若新增查询逻辑使用字符串拼接而非参数绑定,将直接暴露 SQL 注入风险。 | 强制使用查询构造器或预处理语句,禁止直接拼接用户输入。 | `$this->db->query('SELECT * FROM users WHERE id = ?', [$id]);` |
| 🟠 警告 | `system/libraries/Session/Session.php` | *(架构通用预警)* 自定义会话驱动若未严格实现 `SessionHandlerInterface` 或未处理并发锁,可能导致会话覆盖或数据不一致。 | 完整实现标准接口,使用原子操作或文件/Redis 锁机制,避免直接 `unserialize` 不可信数据。 | `if (!flock($fp, LOCK_EX)) { throw new Exception('Session lock failed'); }` |
| 🟡 建议 | `system/helpers/*.php` | *(架构通用预警)* 辅助函数若依赖全局变量或隐式状态,将降低可测试性并可能引发内存泄漏。 | 遵循无状态设计,显式传参,避免使用 `global` 或静态缓存未清理的上下文。 | `function format_price($amount, $currency = 'USD') { return number_format($amount, 2); }` |
## 3. 总结与行动建议
- **优先修复**:请补充具体的变更代码内容。收到后我将立即输出包含精确行号、漏洞定位及可直接替换的修复代码的完整报告。
- **后续重构/优化方向**(基于当前架构预判):
1. **安全基线加固**:重点审查 `DB_driver.php`、`Form_validation.php`、`Security_helper.php` 中的输入过滤、输出转义(`htmlspecialchars`/`xss_clean`)及 CSRF Token 验证逻辑,确保符合 OWASP 防护标准。
2. **性能与资源管理**:针对 `Cache/` 与 `Session/` 驱动,建议引入连接复用、惰性加载与批量操作(如 `Cache::saveMany()`),避免在循环中重复建立数据库/缓存连接。
3. **规范与现代化**:若 `phpci` 为自研或 CI3 衍生框架,建议逐步对齐 PSR-12 规范,引入 PHP 7.4+ 类型声明(`declare(strict_types=1);`)、属性类型提示及命名空间,提升静态分析兼容性与可维护性。
4. **框架生命周期适配**:确保新增/修改的库或辅助函数正确接入框架的钩子(Hooks)或事件总线,避免破坏 `pre_system` → `post_controller` 的请求生命周期。
📥 **下一步**:请回复具体的变更代码(支持 Git Diff 格式或完整文件内容)。我将严格依照 PSR-12、安全编码规范及 `phpci` 框架最佳实践,为您生成精准、可落地的审查报告。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780637234
|
1780637234
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
412
|
25
|
2
|
1
|
|
0
|
🔍 代码审查报告:api-260616 - 需求 时序设备api控制 16449
|
## 自动代码审查报告
**分支**: api-260616
**提交**: `30d690ac9 ## 自动代码审查报告
**分支**: api-260616
**提交**: `30d690ac959cffb607e3e7aa6960476d839e5290`
**提交人**: chenjunfeng (developer.jeff.c@gmail.com)
**时间**: 2026-05-29 16:49:32
---
## 1. 审查摘要
- **代码质量评分**:5/10 分
- **总体评价**:代码实现了较为完整的包厢控制与状态管理业务,但存在多处**严重逻辑漏洞**(如响应重复输出、未定义变量、条件判断错位)、**数据一致性风险**(多表更新无事务)以及**代码规范问题**(命名混乱、魔法数字、死代码)。整体可维护性与生产环境稳定性较低,需优先修复核心逻辑缺陷并统一错误处理机制。
- **风险等级**:🔴 高
> 📌 **框架说明**:根据目录结构 (`system/`, `application/`, `$this->load->model()`, `FCPATH`) 判断,实际使用的应为 **CodeIgniter 3.x** 框架。若 `phpci` 为贵司内部定制/分支框架,请结合其官方文档对加载器、响应机制进行适配。以下审查基于 CI3 标准实践。
## 2. 问题详情
| 严重程度 | 文件/方法 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `showNotice()` / `closeNotice()` | **响应重复输出/不可达代码**:在 `if/else` 已调用 `success_response` 或 `error_response` 后,末尾又追加了 `$this->success_response([], "成功");`。若响应函数包含 `exit` 则死代码;若不含则会导致重复输出或 Header 已发送错误。 | 移除方法末尾的冗余响应调用,确保每个执行路径仅返回一次。 | `if ($success) { $this->success_response(); } else { $this->error_response(); } return;` |
| 🔴 严重 | `transferRoom()` | **逻辑错误/查询条件错位**:构建 `$new_room_data` 查询条件时,错误地使用了旧包厢变量 `$room_name` 和 `$family_server_id` 进行非空判断,导致新包厢可能查询失败或查错数据。 | 将判断条件修正为新包厢对应变量 `$new_room_name` 与 `$new_family_server_id`。 | `if (!empty($new_room_name)) { $where['_name'] = $new_room_name; }`<br>`if (!empty($new_family_server_id)) { $where['_family_server_id'] = $new_family_server_id; }` |
| 🔴 严重 | `upRoomQrcode()` | **未定义变量 & 死代码**:`$arr` 未定义即被访问;且 `$res` 赋值后未使用,直接调用了 `success_response`,后续 `if(isset($arr...))` 为无效逻辑。 | 删除未使用的 `$arr` 判断块,或正确解析 `$res` 结果后再响应。 | 移除末尾 `if (isset($arr['response'])...)` 整个代码块。 |
| 🔴 严重 | `updateRoomStatus()` / `transferRoom()` | **数据一致性风险**:涉及 `family_servers`、`open_room_log`、`bill` 等多表联动更新,但未使用数据库事务。若中途网络中断或逻辑报错,将产生脏数据(如已开房但无账单、状态不一致)。 | 使用 CI3 事务机制包裹核心写操作,失败时自动回滚。 | `$this->db->trans_start();`<br>`// 执行 insert/update`<br>`$this->db->trans_complete();`<br>`if ($this->db->trans_status() === FALSE) { $this->db->trans_rollback(); throwError("操作失败"); }` |
| 🟠 警告 | `updateRoomStatus()` | **死代码分支**:`elseif ($update_status == 3 && false)` 中的 `&& false` 导致该分支永远无法执行,疑似调试遗留。 | 移除 `&& false` 或根据业务需求恢复逻辑,清理无用代码。 | `elseif ($update_status == 3) { // 清扫逻辑 }` |
| 🟠 警告 | 全局多处 | **同步网络请求阻塞**:`send_web_socket()`、`send_room_msg()` 等为同步阻塞调用,未设置超时时间。若下游服务响应慢,将直接拖垮 PHP-FPM 进程池导致 API 超时。 | 为底层 Socket 请求添加 `timeout` 参数,或引入消息队列(如 Redis/RabbitMQ)异步下发指令。 | `send_room_msg($id, $data, $server, ['timeout' => 3]);` |
| 🟠 警告 | `RenewalReminder()` / `consumptionEnd()` 等 | **输入验证缺失**:直接信任 `$this->stream`,未对 `$params['title']`、`$params['img_url']` 等进行长度、格式或 XSS 过滤。 | 引入统一参数校验层(如 CI `form_validation` 或自定义 DTO),对字符串进行 `trim()`、`htmlspecialchars()` 或白名单校验。 | `$title = trim(htmlspecialchars($params['title'] ?? '', ENT_QUOTES, 'UTF-8'));` |
| 🟡 建议 | 全局方法命名 | **命名不规范**:方法名混用驼峰与下划线(如 `RenewalReminder`、`getSlefBill`、`reboot_room`),且存在拼写错误 (`Slef` -> `Self`)。 | 严格遵循 PSR-12,统一使用 `camelCase`,修正拼写错误。 | `public function renewalReminder()`<br>`public function getSelfBill()` |
| 🟡 建议 | 全局魔法数字 | **魔法数字泛滥**:`31`, `9063`, `0,1,2,3`, `86400`, `1440`, `100` 等硬编码散落在各处,降低可读性且易引发维护错误。 | 提取为类常量或配置文件,集中管理。 | `const STATUS_FREE = 0; const STATUS_OPEN = 1;`<br>`const MAX_VOICE_VOL = 100;` |
| 🟡 建议 | 全局模型加载 | **重复加载模型**:每个方法内部频繁调用 `$this->load->model()`,虽 CI 支持重复加载,但增加 I/O 开销且不符合最佳实践。 | 将高频使用的模型移至 `__construct()` 或 `config/autoload.php` 中预加载。 | `public function __construct() { parent::__construct(); $this->load->model('Ahead_family_servers_model'); }` |
## 3. 总结与行动建议
### 🚨 优先修复的关键问题(P0)
1. **修复响应逻辑漏洞**:立即清理 `showNotice`、`closeNotice`、`upRoomQrcode` 中的重复响应与未定义变量 `$arr`,避免 API 返回异常或触发 PHP Warning。
2. **修正 `transferRoom` 查询条件**:将新包厢查询的 `if (!empty($room_name))` 改为 `if (!empty($new_room_name))`,否则转房功能在特定参数组合下必然失败。
3. **引入数据库事务**:在 `updateRoomStatus` 和 `transferRoom` 的核心状态流转逻辑外层包裹 `$this->db->trans_start()` 与 `$this->db->trans_complete()`,保障业务数据强一致性。
### 🛠 后续重构与优化方向
1. **统一错误处理机制**:当前混用 `throwError()` 与 `$this->error_response()`。建议定义统一的 `ApiResponse` 基类或中间件,所有异常捕获后统一格式化为 JSON 输出,避免部分路径直接 `exit` 导致日志丢失或前端解析失败。
2. **构建参数校验层**:`$this->stream` 为自定义输入源,建议封装 `validateParams(array $rules)` 方法,集中处理类型转换(`intval`/`floatval`)、边界限制(`max/min`)与安全过滤,消除各方法中重复的 `if/empty` 校验块。
3. **异步化网络指令**:包厢控制指令(WebSocket/Socket)属于高延迟操作。建议将指令下发改为写入 Redis 队列,由独立 Worker 消费并处理重试/超时逻辑,API 仅返回“指令已接收”,大幅提升接口吞吐与稳定性。
4. **遵循 PSR-12 与 DRY 原则**:统一方法命名风格,提取重复的音量/倒计时校验逻辑为 `private function validateDuration()` 等私有方法;清理所有注释掉的废弃代码,保持代码库整洁。
> 💡 **提示**:若 `phpci` 框架对控制器生命周期、模型加载或响应机制有特殊约定,请优先查阅其官方文档。上述建议已兼容标准 PHP 生态与 CI3 架构,可直接平滑迁移。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780044572
|
1780044572
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
283
|
25
|
1
|
1
|
|
0
|
🔍 代码审查报告:api - 11
|
## 自动代码审查报告
**分支**: api
**提交**: `f1638c3adf2bcd34 ## 自动代码审查报告
**分支**: api
**提交**: `f1638c3adf2bcd34796a5bd8afe7ade89a6ec836`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-05-22 10:19:57
---
## 1. 审查摘要
- **代码质量评分**:4/10 分
- **总体评价**:代码实现了阿里云 MQTT 消息推送与基础 HTTP 请求封装,具备初步的业务可用性。但存在**严重的安全隐患**(硬编码云密钥)、**核心逻辑缺陷**(数组操作错误、异常吞没)、**规范缺失**(非标准函数调用、调试代码未清理、注释乱码)及**框架适配不足**。整体处于“可运行但不可投产”状态,需优先进行安全加固与逻辑修复。
- **风险等级**:🔴 高
## 2. 问题详情
| 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) |
| :--- | :--- | :--- | :--- | :--- |
| 🔴 严重 | `Mqttapi.php` L10-11 | 硬编码阿里云 `AccessKey` 与 `Secret`。一旦代码提交至版本库,将直接导致云账号资源泄露与被恶意调用。 | 移除硬编码,改用环境变量或框架配置中心动态读取。 | `self::$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID') ?: config('mqtt.ak');` |
| 🔴 严重 | `HttpRequest.php` L118 | `removeSignHeader` 使用 `unset($this->signHeaders[$value])`,但 `$signHeaders` 是索引数组(值数组),`unset` 会尝试删除不存在的键,导致静默失败或误删。 | 使用 `array_search` 定位真实索引后再 `unset`。 | `$key = array_search($value, $this->signHeaders, true); if ($key !== false) unset($this->signHeaders[$key]);` |
| 🔴 严重 | `Mqttapi.php` L8 | `import()` 非 PHP 原生函数。若 `phpci` 框架未全局注册该辅助函数,将直接触发 `Fatal Error`。 | 改用标准 `require_once` 或依赖 Composer 自动加载机制。 | `require_once COMMONCLASS . 'AliCloudPHPSDK/vendor/autoload.php';` |
| 🟠 警告 | `Mqttapi.php` L45-51 | `catch (Exception $error)` 未加全局命名空间前缀 `\`,在 `use` 命名空间下可能捕获不到异常;且直接 `return false` 掩盖了真实错误堆栈,极难排查。 | 捕获 `\Exception`,记录日志并抛出或返回结构化错误对象。 | `catch (\Exception $e) { log_message('error', $e->getMessage()); throw $e; }` |
| 🟠 警告 | `HttpClient.php` L15-16 | 超时值设为 `30000`/`80000`,注释却标注 `30 second`。底层若使用 cURL,默认单位为秒,数值过大会导致请求长时间挂起。 | 统一单位。若底层支持毫秒请明确注释,否则改为秒级整数。 | `private static $connectTimeout = 30; // 单位:秒` |
| 🟠 警告 | `Demo.php` L12, L48, L50 | 文件被 `include` 时直接实例化并执行请求,且残留 `var_dump` 和 `print_r`。违反库文件“只定义不执行”原则,且调试信息会污染生产环境输出。 | 移除顶层执行逻辑与调试输出,将调用移至 `phpci` 控制器或 CLI 入口。 | 删除 `include` 后的 `$demo = new Demo(); ...` 代码块 |
| 🟡 建议 | `HttpRequest.php` L33, L43, L53... | 多处 `if (null == $this->headers) { $this->headers = array(); }` 属冗余代码。属性已在声明时初始化,且 PHP 数组赋值不会自动变为 `null`。 | 直接移除冗余判断,保持代码简洁。 | 删除所有 `if (null == $this->xxx)` 块 |
| 🟡 建议 | `Constants.php` 全文 | 注释出现大量乱码(如 `ͨó`, `ǩ㷨`),表明文件保存编码与声明编码不一致(疑似 GBK 混入 UTF-8)。 | 使用编辑器统一转换为 `UTF-8 无 BOM` 编码,并修正注释内容。 | 无 |
| 🟡 建议 | `Mqttapi.php` L38 | `$args` 参数未声明类型,且直接作为 `payload` 传入 SDK。若传入非字符串/数组,SDK 可能抛出类型异常。 | 补充类型提示,并在内部进行 JSON 序列化或类型校验。 | `public static function main(string $mqttTopic, array|string $payload)` |
## 3. 总结与行动建议
### 🔑 优先修复项(P0)
1. **密钥安全治理**:立即将 `Mqttapi.php` 与 `Demo.php` 中的硬编码 AK/SK 迁移至 `phpci` 的配置文件(如 `config/mqtt.php`)或服务器环境变量中,严禁明文提交至代码库。
2. **修复数组操作 Bug**:修正 `HttpRequest::removeSignHeader()` 的删除逻辑,避免签名头清理失败导致 API 鉴权报错。
3. **替换非标准函数**:将 `import()` 替换为 `require_once` 或接入 Composer 自动加载,确保代码在标准 PHP 环境中可独立运行。
### 🛠 后续重构与优化方向
1. **框架适配规范**:
- `apitest/` 目录结构不符合常规 MVC 框架规范。建议将其迁移至 `phpci` 的 `app/` 或 `application/` 目录下,利用框架的路由、配置加载与日志组件。
- 避免在类文件中直接执行逻辑(如 `Demo.php` 的顶层调用),应通过框架控制器接收请求并分发。
2. **代码规范升级**:
- 全面补充 PHP 7.4+/8.x 类型声明(参数类型、返回值类型、属性类型),提升静态分析能力。
- 遵循 PSR-12 规范:统一缩进(4空格)、移除冗余空行、规范命名空间与 `use` 语句顺序。
3. **健壮性增强**:
- `Mqttapi::main()` 建议改为返回 `Result` 对象或抛出业务异常,而非简单返回 `false`,便于上层统一处理成功/失败/重试逻辑。
- 统一超时单位,并在 `HttpClient` 中增加对 `HttpUtil` 底层实现的依赖注入或配置化,避免硬编码网络参数。
> 📌 **局限性说明**:本次审查未提供 `HttpUtil.php` 源码及 `phpci` 框架的具体生命周期/配置加载机制。若 `HttpUtil` 内部对 cURL 选项或签名算法有特殊处理,请结合实际底层实现进行二次验证。建议查阅 `phpci` 官方文档中关于“第三方 SDK 集成”与“配置管理”的章节,以确保架构一致性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1779416397
|
1779416397
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
769
|
24
|
2
|
4
|
|
0
|
[Web前端] 按省市统计设备月度新增上线数量报表
|
## 关联 Issue
Related to laiqiaojie/jh-project#5
Re ## 关联 Issue
Related to laiqiaojie/jh-project#5
Related to laiqiaojie/jh-project#8 — 按省市统计设备月度新增上线数量报表(Web 前端)
## 变更说明
- 新增 页面组件
- 省份视图:横向柱状图展示各省份当月新增上线设备数,点击下钻城市
- 城市视图:横向柱状图展示选定省份各城市分布,面包屑返回全国
- 使用 CSS 自定义 bar(不引入 ECharts),保持项目依赖不变
- 更新 :注册 device_online_stats 组件
- 更新 :新增 路由规则
- **修复** : 在父菜单 为空时拼出 双斜杠,导致路由匹配失败
- **修复** : 同一根因的双斜杠问题
## 测试说明
- 月份切换后图表重新加载
- 点击省份柱子进入城市视图,面包屑显示「全国 › XX省」
- 点击「全国」/「返回全国」返回省份视图
- 无数据月份显示空状态
- 点击「数据」顶部菜单 → 侧栏「设备上线分布」→ 组件正常渲染(已端到端验证)
## DB 变更(需手动执行)
## 产物归档
- Plan:(在 jh-project 仓库)
- 设计文档:
🤖 Generated with [Claude Code](https://claude.com/claude-code)...
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788247154
|
1789379914
|
1789377273
|
0
|
3
|
0
|
Edit
Delete
|
|
767
|
24
|
1
|
4
|
|
0
|
[后台管理] 按省市统计设备月度新增上线数量报表
|
## 关联 Issue
Close #4 — [后台] 按省市统计设备月度新增上线数量报表
(I ## 关联 Issue
Close #4 — [后台] 按省市统计设备月度新增上线数量报表
(Issue 位于另一仓库 laiqiaojie/jh-project,Gitea 跨仓库 `Close #N` 不会自动关联,merge 后需手动去 jh-project 更新 Issue 状态)
## 变更说明
- 新增 `DeviceOnlineStats` 控制器,暴露 `getProvinceStats`(按月+省份汇总新增上线设备数)、`getCityStats`(指定省份后按城市下钻)两个接口
- `Ahead_authenticate_log_model` 新增对应查询方法:联表 `ahead_authenticate_log` → `ahead_family_servers` → `ahead_yc_shop`,权限过滤复用现有 `Ahead_manage_user_model::check_is_agent()`(超管看全国,运营商强制按 `shop._agent_id` 过滤)
- 与 plan.md 的偏差:实现与计划一致;另外在 `/code-review` 中发现并修复了两个问题(均已回归验证):
- `month` 参数只校验格式未校验取值范围,如 `2026-00` 会被 `strtotime` 静默接受为上一年 12 月而不报错 → 正则改为 `(0[1-9]|1[0-2])` 严格校验月份范围
- 未绑定门店的设备(`room._shop_id` 为 0/未匹配)会被计入 `total` 但在 `GROUP BY shop._province` 时产生一个 province 为 null 的脏分组 → 加 `room._shop_id > 0` 过滤
## 测试说明
- 本地起 PHPStudy,登录后手动调用两个接口验证:正常月份返回 `{code:0, result:{total, list}}`;缺 `month`/非法月份(`2026-00`、`2026-13`、`0000-00`)均正确返回 400
- 用只读 SQL 直接查了云端开发库确认 JOIN 链路正确——本地测试库 `ahead_authenticate_log` 表只有 1 条 2021 年的历史数据,所以当月查询返回空列表是预期行为,不是 bug
- `tests/api/smoke.mjs` 里补充了对应的自动化用例,但该冒烟测试框架整体依赖另一个尚未推送到 `admin` 分支的提交(`694e34c`,属于另一项未提交的工作,不在本 Issue 范围内),为保持本 PR 改动范围干净,本次未包含测试框架文件,仅代码改动
- 需要 Tech Lead 重点看:`check_is_agent()` 权限过滤范围是否符合预期;`room._shop_id > 0` 过滤是否会误伤合法数据
## 产物归档
- Plan:[plan/device-online-stats-by-region-admin.md](https://gitea.g-hi.com/laiqiaojie/jh-project/src/branch/design/device-online-stats-by-region/plan/device-online-stats-by-region-admin.md)(位于 laiqiaojie/jh-project 仓库)
...
|
0
|
0
|
1
|
1
|
1
|
|
0
|
1788244598
|
1788246926
|
1788245236
|
0
|
0
|
0
|
Edit
Delete
|
|
788
|
23
|
60
|
1
|
|
0
|
需求 回访任务批量作废 16852
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789718392
|
1789718403
|
1789718403
|
0
|
0
|
0
|
Edit
Delete
|
|
781
|
23
|
59
|
1
|
|
0
|
包厢续费小程序码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789436596
|
1789436624
|
1789436624
|
0
|
0
|
0
|
Edit
Delete
|
|
780
|
23
|
58
|
1
|
|
0
|
包厢续费小程序码
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1789436552
|
1789436571
|
1789436571
|
0
|
0
|
0
|
Edit
Delete
|
|
772
|
23
|
57
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788426774
|
1788426780
|
1788426780
|
0
|
0
|
0
|
Edit
Delete
|
|
771
|
23
|
56
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1788426740
|
1788426764
|
1788426764
|
0
|
0
|
0
|
Edit
Delete
|
|
753
|
23
|
55
|
1
|
|
0
|
编译
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787640140
|
1787640147
|
1787640147
|
0
|
0
|
0
|
Edit
Delete
|
|
752
|
23
|
54
|
1
|
|
0
|
编译
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1787640115
|
1787640123
|
1787640123
|
0
|
0
|
0
|
Edit
Delete
|
|
733
|
23
|
53
|
1
|
|
0
|
需求 增加包厢筛选参数 16722
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786672377
|
1786672401
|
1786672401
|
0
|
0
|
0
|
Edit
Delete
|
|
730
|
23
|
52
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786438614
|
1786438619
|
1786438619
|
0
|
0
|
0
|
Edit
Delete
|
|
729
|
23
|
51
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786438592
|
1786438597
|
1786438597
|
0
|
0
|
0
|
Edit
Delete
|
|
724
|
23
|
50
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339403
|
1786339409
|
1786339409
|
0
|
0
|
0
|
Edit
Delete
|
|
723
|
23
|
49
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1786339385
|
1786339390
|
1786339390
|
0
|
0
|
0
|
Edit
Delete
|
|
717
|
23
|
48
|
1
|
|
0
|
其他
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1785224288
|
1785224294
|
1785224294
|
0
|
0
|
0
|
Edit
Delete
|
|
716
|
23
|
47
|
1
|
|
0
|
其他
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1785224273
|
1785224279
|
1785224279
|
0
|
0
|
0
|
Edit
Delete
|
|
711
|
23
|
46
|
1
|
|
0
|
bug-V2平台调音-1的商家id不显示问题
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784874674
|
1784874685
|
1784874685
|
0
|
0
|
0
|
Edit
Delete
|
|
710
|
23
|
45
|
1
|
|
0
|
111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784874629
|
1784874643
|
1784874643
|
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
|
|
702
|
23
|
43
|
1
|
|
0
|
需求 小程序设置导出 16583
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1784772728
|
1784772735
|
1784772735
|
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
|
|
693
|
23
|
41
|
1
|
|
0
|
1111
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1783990894
|
1783990913
|
1783990913
|
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
|
|
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
|
|
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
|
|
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
|
|
625
|
23
|
34
|
1
|
|
0
|
🔍 代码审查报告:admin-260616 - 前端编译
|
## 自动代码审查报告
**分支**: admin-260616
**提交**: `edc5fef ## 自动代码审查报告
**分支**: admin-260616
**提交**: `edc5fef8b512cb8d5e939b749868ef812be8a762`
**提交人**: caihongyuchy (1091045324@qq.com)
**时间**: 2026-06-09 11:14:16
---
## 📋 审查摘要
- **变更文件数**: 2
- **严重问题**: 3
- **高危问题**: 4
- **中危问题**: 2
- **建议优化**: 5
## 🐛 发现的问题
### <font color="red">[语法错误] 代码文件不完整/截断导致解析失败</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: 末尾 (约 430 行)
- **问题描述**: 提供的代码在 `updateBlxScreen` 方法的 AJAX `success` 回调中突然中断 (`layer.msg(data.msg);` 后无闭合括号及后续代码)。这将直接导致 JavaScript/Vue 语法解析失败,项目无法编译或运行。
- **修复建议**: 补全缺失的 `}, error: function() {...} }); } });` 等闭合代码,确保文件结构完整。
### <font color="red">[语法错误] 条件判断误用赋值运算符</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: 约 285 行 (`mounted` 钩子内)
- **问题描述**: `if (_this.$route.params.bxl_name = 'shop')` 错误地使用了单等号 `=` 进行赋值,而非比较运算符 `==` 或 `===`。这会导致路由参数被意外覆盖,且条件永远为真,引发不可预知的逻辑分支执行和状态污染。
- **修复建议**: 改为严格相等判断:`if (_this.$route.params.bxl_name === 'shop')`
### <font color="red">[跨文件调用] 模板中调用了大量未定义的方法</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: 模板多处 (`@click` 绑定处)
- **问题描述**: `<template>` 中绑定了超过 30 个事件处理方法(如 `batchUpgrade`, `roomIniManage`, `multipleExport`, `addBlxLog`, `getBxlDet`, `updateBlxBox`, `listQrcode`, `bxlUnbind`, `getIni`, `onRemoteClick`, `configIntelCtrFile`, `refreshOnline`, `backupEffect`, `parameterSetting`, `addBxlPac`, `delBxlPac`, `addBxlRoom`, `delBxlRoom`, `addBxlDjp`, `delBxlDjp`, `backList`, `saveBxlSet`, `getShortcuts`, `executeRemote`, `getRemoteOptTable`, `executeControlLog`, `handleSelectAllRoom`, `handleRoomTypeSelect`, `handleRoomSelect`, `saveIntelCtrFileConfig`, `getIntelCtrFileList`, `handleIntelSelectChange`, `saveRoomIniInfo`, `scrollToParameterSection`, `saveParameterSetting`),但在 `<script>` 的 `methods` 对象中均未找到定义。运行时会直接抛出 `TypeError: this.xxx is not a function` 导致页面崩溃。
- **修复建议**: 请检查是否遗漏了代码提交,或在 `methods` 中补充完整实现。若这些方法定义在 Mixin 或父组件中,需确保正确引入或传递。
### <font color="red">[跨文件调用] 依赖未声明的全局变量/插件</font>
- **严重程度**: <font color="red">高危</font>
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: 全文多处
- **问题描述**: 代码中大量使用 `$` (jQuery), `layer` (Layui), `Vue.ctUrl`, `Vue.axios`, `Vue.timeoutfun`, `GLOBAL.PAGESIZE`,但未在文件顶部 `import` 或通过组件属性声明。强耦合全局环境,若构建工具未配置 `ProvidePlugin` 或全局挂载,将直接报 `ReferenceError`。
- **修复建议**:
1. `import $ from 'jquery'` 显式引入 jQuery。
2. 将 `layer` 封装为独立模块引入。
3. 将 `GLOBAL.PAGESIZE` 移至 `data` 或 Vuex 状态管理。
4. 避免直接修改 `Vue` 原型链,改用 `this.$axios` 或独立 API 请求模块。
### [安全隐患] 导出接口 URL 参数未进行编码
- **严重程度**: 高危
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: 约 360 行 (`bxlExport` 方法)
- **问题描述**: 拼接下载 URL 时直接使用字符串拼接 `+ _this.bxl_youc +` 等变量,未使用 `encodeURIComponent()`。若商家名称或门店名称包含 `&`, `=`, `#`, 空格或特殊字符,将导致 URL 结构破坏、参数丢失,甚至可能引发 XSS 或请求注入。
- **修复建议**: 使用 `encodeURIComponent(_this.bxl_youc)` 包裹所有动态查询参数。例如:`"&merchant_name=" + encodeURIComponent(_this.bxl_youc) +`
### [逻辑 BUG] Vue 与 jQuery/DOM 操作混用导致状态不同步
- **严重程度**: 高危
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: `mounted` 及 `getModel`/`getSkins` 方法
- **问题描述**: 在 Vue 组件中直接使用 `$(_this.$refs.xxx).select2()` 操作 DOM。Vue 的虚拟 DOM 响应式更新可能与 jQuery 插件的直接 DOM 修改冲突,导致数据不同步、事件绑定丢失或内存泄漏。
- **修复建议**: 建议使用 Vue 生态的 Select 组件(如 `vue-select` 或 Element UI 原生组件)。若必须使用 jQuery 插件,需在 `this.$nextTick()` 中调用,并在 `beforeDestroy` 生命周期中调用 `.select2('destroy')` 释放资源。
### [代码质量] 组件命名与文件名不一致
- **严重程度**: 中危
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: 约 10 行
- **问题描述**: `name: 'order_manage'`,但文件名为 `box_list_manage.vue`。不利于 Vue DevTools 调试、组件缓存及路由映射。
- **修复建议**: 改为与文件名一致的命名:`name: 'box_list_manage'`。
### [代码质量] 变量拼写错误
- **严重程度**: 低危
- **文件**: web/backstage_pc/src/views/box_manage/box_list_manage.vue
- **行号**: `data()` 定义处
- **问题描述**: `inclue_real_mac` 存在拼写错误,正确应为 `include_real_mac`。
- **修复建议**: 全局搜索并替换为正确拼写 `include_real_mac`,保持命名规范。
## ✅ 代码亮点
- **权限控制逻辑清晰**:通过 `getOperAuth` 遍历菜单树动态控制按钮显隐(如 `show_config_btn`, `show_box_update_btn`),符合 RBAC 模型实践,有效防止越权操作。
- **路由监听处理合理**:使用 `watch` 监听 `$route` 变化并自动触发 `getListTable(1)`,提升了页面跳转后的数据同步体验。
- **模块化弹窗设计**:将不同功能(配置、升级、远程、参数设置)拆分为独立区块,配合 `v-show` 控制显隐,结构清晰,易于维护。
## 📝 总体建议
1. **立即补全代码**:当前提供的 Vue 文件严重截断,缺失大量核心方法实现,无法直接运行。请确保提交完整代码后再进行集成测试。
2. **修复致命逻辑错误**:优先修正 `mounted` 中的 `=` 赋值错误,避免路由参数被意外污染导致全局状态异常。
3. **统一前端技术栈**:强烈建议逐步移除 jQuery 和 Layui (`layer`),全面转向 Vue + Element UI 生态。混用不仅增加打包体积,还会引发难以排查的 DOM 冲突和内存泄漏。
4. **规范依赖与 API 管理**:杜绝隐式全局变量,使用 ES6 `import` 显式声明依赖。建议将 `Vue.ctUrl` 等后端接口前缀抽离至独立的 `config.js` 或环境变量中,便于多环境部署。
5. **安全与健壮性加固**:所有拼接 URL 的参数必须经过 `encodeURIComponent` 处理;涉及“远程执行指令”、“解绑”、“批量升级”等高危操作,建议增加二次确认弹窗及操作日志审计机制。
*(注:提供的 `index.3a48e000.js` 为 Webpack 打包后的压缩产物,不具备可读性,本次审查未纳入分析范围。建议后续提交源码文件 `*.vue` 或 `*.js` 源文件。)*
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780974856
|
1780974856
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
613
|
23
|
33
|
1
|
|
0
|
🔍 代码审查报告:admin-260616 - 合并0519
|
## 自动代码审查报告
**分支**: admin-260616
**提交**: `3fd65ca ## 自动代码审查报告
**分支**: admin-260616
**提交**: `3fd65ca0e0b082b02e9ceb425ed49e7f183851ee`
**提交人**: zhangjunnan (121158035@qq.com)
**时间**: 2026-06-09 10:33:18
---
## 📋 审查摘要
- **变更文件数**: 4 (其中1个为压缩混淆JS,1个Vue文件被截断,实际有效审查文件为2个PHP文件)
- **严重问题**: 1
- **高危问题**: 4
- **中危问题**: 3
- **建议优化**: 5
## 🐛 发现的问题
### <font color="red">[逻辑BUG] connectSSH 方法验证逻辑被硬编码永久绕过</font>
- **严重程度**: <font color="red">严重</font>
- **文件**: `application/controllers/Room.php`
- **行号**: 约 345 行
- **问题描述**: `if ($is_success || true) {//临时打开` 中的 `|| true` 导致无论 `wb_login` 返回什么结果,条件永远为真。这将导致未经验证的请求直接创建 SSH 会话,存在严重的越权访问风险。
- **修复建议**: 移除临时调试代码,严格依赖验证结果:
```php
// 修复前
if ($is_success || true) {//临时打开
// 修复后
if ($is_success) {
```
### <font color="red">[安全隐患] update_version 方法存在 SQL 注入风险</font>
- **严重程度**: 高危
- **文件**: `application/models/Ahead_family_servers_model.php`
- **行号**: 约 375~395 行
- **问题描述**: `update_version` 方法通过字符串拼接直接构造 `UPDATE` SQL 语句。`$up` 和 `$where` 变量由外部传入的数组遍历拼接而成,未使用 CI 查询构建器或参数绑定。若传入的键名或值包含恶意字符,将导致 SQL 注入。
- **修复建议**: 废弃原生 SQL 拼接,改用 CodeIgniter 查询构建器:
```php
// 推荐重构逻辑
$this->db->set($up);
$this->db->where($where); // CI会自动处理数组或字符串条件
if (!empty($join_table)) {
foreach ($join_table as $join) {
$this->db->join($join[0], $join[1], $join[2] ?? 'inner');
}
}
$this->db->update($this->table_name);
return $this->db->affected_rows();
```
### <font color="red">[安全隐患] executeSSHCommand 存在命令注入风险</font>
- **严重程度**: 高危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 430 行
- **问题描述**: `$port` 参数直接拼接到 `shell_exec` 执行的 SSH 命令中:`-p $port`。虽然 `$command` 使用了 `escapeshellarg`,但 `$port` 未转义。攻击者可传入 `22; rm -rf /` 等恶意值执行任意系统命令。
- **修复建议**: 对 `$port` 进行严格类型转换或转义:
```php
$port = (int) $port; // 强制转为整型,杜绝注入
$ssh_command = "ssh $ssh_options -i " . escapeshellarg($key_file) . " -p $port $username@$host $escaped_command 2>&1";
```
### <font color="red">[跨文件调用] 调用了未定义的全局函数/Helper</font>
- **严重程度**: 高危
- **文件**: `application/controllers/Room.php`, `application/models/Ahead_room_renewal_mini_qrcode_model.php`
- **行号**: 多处
- **问题描述**: 代码中大量调用了未在变更文件中定义的全局函数,如 `throwError()`, `get_page_suit()`, `do_log()`, `getUnlimitedWxacode()`, `alioss_internal_addObject_by_content()`, `turn_array_key()`, `formatBytes()` 等。若对应 Helper 未自动加载或拼写错误,将导致 `Fatal Error: Call to undefined function`。
- **修复建议**:
1. 确认 `application/config/autoload.php` 中已加载包含这些函数的 Helper(如 `common_helper.php`)。
2. 建议在文件头部添加 `@function` 注释或显式 `require_once` 辅助文件,提高可维护性。
### <font color="red">[跨文件调用] 模型命名拼写错误与大小写不一致</font>
- **严重程度**: 高危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 268, 295 行
- **问题描述**:
1. `$this->load->model('Ahead_famaily_version_model');` 中 `famaily` 疑似拼写错误(应为 `family`)。若实际文件名为 `Ahead_family_version_model.php`,在区分大小写的 Linux 服务器上会加载失败。
2. 同一控制器中混用 `Ahead_family_servers_model` 与 `ahead_family_servers_model`,虽 CI 默认不区分大小写,但极易引发缓存或自动加载器解析异常。
- **修复建议**: 统一使用 `PascalCase` 命名规范,修正拼写:
```php
$this->load->model('Ahead_family_version_model'); // 修正拼写
$this->load->model('Ahead_family_servers_model'); // 统一首字母大写
```
### [安全隐患] 直接使用原生 $_SESSION 替代 CI Session 库
- **严重程度**: 高危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 350~365 行
- **问题描述**: `connectSSH` 和 `executeCommand` 中直接使用 `$_SESSION['ssh_sessions']`。CodeIgniter 默认使用加密/数据库/Redis 驱动管理 Session,直接操作原生 `$_SESSION` 可能导致数据不同步、未加密存储敏感信息(如 SSH 路径/端口),且在 CI 配置 `sess_driver` 为 `files` 或 `database` 时可能失效。
- **修复建议**: 使用 CI 官方 Session 库:
```php
$this->load->library('session');
$sessions = $this->session->userdata('ssh_sessions') ?: [];
$sessions[$session_id] = [...];
$this->session->set_userdata('ssh_sessions', $sessions);
```
### [逻辑BUG] upRoomVersion 中 $where 类型混用导致潜在查询异常
- **严重程度**: 中危
- **文件**: `application/controllers/Room.php`
- **行号**: 约 115~125 行
- **问题描述**: 当 `$room_id` 为数组时,`$where` 被赋值为字符串 `"_id in (...)"`。后续逻辑中又尝试以数组形式追加条件 `$where['_shop_id'] = ...`,会导致 PHP 警告 `Illegal offset type` 或覆盖原有字符串条件,使批量更新逻辑失效。
- **修复建议**: 统一使用数组或字符串构建条件,避免类型混用:
```php
$where = [];
if (is_array($room_id)) {
$where['where_in'] = ['_id', $room_id];
} else {
$where['_id'] = $room_id;
}
// 后续统一使用 CI 数组条件语法追加
```
### [代码质量] 模型外部加载与硬编码表名
- **严重程度**: 中危
- **文件**: `application/models/Ahead_family_servers_model.php`
- **行号**: 第 2~3 行, 约 185 行
- **问题描述**:
1. `$CI = &get_instance(); $CI->load->model('Simple_model');` 写在类定义外部。在 CI 中,模型应在构造函数或方法内加载,外部加载可能在自动加载器未初始化时引发错误。
2. `get_list` 中硬编码表名 `'ahead_room_renewal_mini_qrcode as renewal_mini_qrcode'`,破坏了模型封装性,若表名变更需多处修改。
- **修复建议**: 将 `Simple_model` 加载移至 `__construct()`;使用模型对象获取表名:
```php
$this->load->model('Ahead_room_renewal_mini_qrcode_model');
$qrcode_table = $this->Ahead_room_renewal_mini_qrcode_model->table_name;
$where['join'][] = [$qrcode_table . ' as renewal_mini_qrcode', 'a._family_server_id=renewal_mini_qrcode._family_server_id', 'left'];
```
## ✅ 代码亮点
1. **版本升级前置校验**:在 `upRoomVersion` 等方法中,对 `new_ktv_song_version` 和 `new_ktv_singer_version` 进行了存在性校验,避免了无效版本下发导致终端异常。
2. **SSH 命令执行安全加固**:`executeSSHCommand` 中对 `$command` 使用了 `escapeshellarg()`,并添加了 `StrictHostKeyChecking=no` 等安全选项,降低了基础命令注入风险。
3. **业务逻辑分层清晰**:控制器负责参数校验与路由,模型负责数据组装与查询,符合 MVC 规范。`Ahead_room_renewal_mini_qrcode_model` 独立封装了小程序码生成与 OSS 上传逻辑,职责单一。
## 📝 总体建议
1. **立即修复逻辑绕过漏洞**:`connectSSH` 中的 `|| true` 必须第一时间移除,否则将暴露服务器 SSH 访问权限。
2. **全面替换原生 SQL 拼接**:`update_version` 等核心数据操作方法应全面迁移至 CI Query Builder (`$this->db->set()`, `$this->db->where()`),从根本上杜绝 SQL 注入。
3. **统一 Helper 与模型加载规范**:建议建立 `application/helpers/common_helper.php` 集中管理 `throwError`, `get_page_suit` 等全局函数,并在 `autoload.php` 中配置。模型加载严格遵循 `PascalCase` 规范,避免大小写混用。
4. **Session 管理规范化**:废弃 `$_SESSION` 直写,全面接入 `$this->session`。敏感操作(如 SSH 会话创建)建议增加 IP 白名单校验与会话超时清理机制。
5. **补充单元测试**:针对 `update_version`、`connectSSH`、`getRoomIniData` 等核心接口补充 PHPUnit 测试用例,覆盖正常路径、异常参数及越权场景,提升代码健壮性。
---
*此 Issue 由代码审查服务自动创建*...
|
0
|
0
|
0
|
0
|
0
|
|
0
|
1780972398
|
1780972398
|
0
|
0
|
0
|
0
|
Edit
Delete
|
|
612
|
23
|
32
|
1
|
|
0
|
门店管理充值
|
|
0
|
0
|
1
|
1
|
0
|
|
0
|
1780971913
|
1780972100
|
1780972100
|
0
|
0
|
0
|
Edit
Delete
|