sqlite-web 0.7.2
gitea.db
issue
Create
Query
access
access_token
action
action_artifact
action_run
action_run_index
action_run_job
action_runner
action_runner_token
action_schedule
action_schedule_spec
action_task
action_task_output
action_task_step
action_tasks_version
action_variable
app_state
attachment
auth_token
badge
branch
collaboration
comment
commit_status
commit_status_index
commit_status_summary
commit_sync_log
commit_sync_status
dbfs_data
dbfs_meta
deploy_key
email_address
email_hash
external_login_user
follow
gpg_key
gpg_key_import
hook_task
issue
issue_assignees
issue_content_history
issue_dependency
issue_index
issue_label
issue_pin
issue_user
issue_watch
label
language_stat
lfs_lock
lfs_meta_object
login_source
milestone
mirror
notice
notification
oauth2_application
oauth2_authorization_code
oauth2_grant
org_user
package
package_blob
package_blob_upload
package_cleanup_rule
package_file
package_property
package_version
project
project_board
project_issue
protected_branch
protected_tag
public_key
pull_auto_merge
pull_request
push_mirror
reaction
release
renamed_branch
repo_archiver
repo_hidden_file
repo_indexer_status
repo_license
repo_redirect
repo_topic
repo_transfer
repo_unit
repository
review
review_state
secret
session
sqlite_sequence
star
stopwatch
system_setting
task
team
team_invite
team_repo
team_unit
team_user
topic
tracked_time
two_factor
upload
user
user_badge
user_blocking
user_open_id
user_redirect
user_setting
version
watch
webauthn_credential
webhook
Toggle helper tables
Structure
Content
Query
Insert
Drop
Import
Export
Delete row 638 from issue
id
638
repo_id
21
index
289
poster_id
1
original_author
original_author_id
0
name
🔍 代码审查报告:pay-260616 - 因修改支付页优惠券获取逻辑,加跳转参数shop_id
content
## 自动代码审查报告 **分支**: pay-260616 **提交**: `7b94e6c0f
## 自动代码审查报告 **分支**: pay-260616 **提交**: `7b94e6c0f68a32b12c7f66e15871e848b797edf0` **提交人**: linyangrui (yangruilin888@gmail.com) **时间**: 2026-06-09 15:50:21 --- ## 📋 审查摘要 - **变更文件数**: 6 - **严重问题**: 3 - **高危问题**: 5 - **中危问题**: 4 - **建议优化**: 6 ## 🐛 发现的问题 ### <font color="red">[语法错误] 未定义的变量 qrcode 导致运行时崩溃</font> - **严重程度**: <font color="red">严重</font> - **文件**: `web/Hi-Zan/Hi-Zan/pages/table-tennis/scan-order/scan-order.js` - **行号**: 约 238 行 - **问题描述**: 在 `openRoomCheckPackageTime` 的回调中,使用了 `this.exchange('qr_code', qrcode)`,但变量 `qrcode` 并未定义。此处应为 `qr_code`(函数参数或 `this.data.qr_code`)。该错误将直接导致 `ReferenceError`,阻断后续兑换流程。 - **修复建议**: ```javascript // 错误代码 if(qr_code) { this.exchange('qr_code', qrcode) } // 修正为 if(qr_code) { this.exchange('qr_code', qr_code) } ``` ### <font color="red">[跨文件调用] 调用了可能存在拼写错误的方法 getRoomPackgeTimePriceInfo</font> - **严重程度**: <font color="red">高危</font> - **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/shop-detail/shop-detail.js` - **行号**: 约 860 行 - **问题描述**: 调用 `reserveModel.getRoomPackgeTimePriceInfo(...)`,方法名中 `Packge` 疑似为 `Package` 的拼写错误。若后端/模型层实际命名为 `getRoomPackageTimePriceInfo`,此处将报 `TypeError: reserveModel.getRoomPackgeTimePriceInfo is not a function`。 - **修复建议**: 核对 `ReserveModel` 实际定义的方法名,统一修正为正确拼写(通常为 `getRoomPackageTimePriceInfo`)。 ### <font color="red">[语法错误] 未安全访问可能为空的 userInfo 对象属性</font> - **严重程度**: <font color="red">高危</font> - **文件**: `web/Hi-Zan/Hi-Zan/pages/community-reserve/open-result/open-result.js` (约 318 行) & `pay-success.js` (约 285 行) - **行号**: 约 318 / 285 - **问题描述**: `let uid = wx.getStorageSync('userInfo').uid` 直接链式访问。若用户未登录或 `userInfo` 缓存为空/结构异常,将抛出 `TypeError: Cannot read properties of undefined (reading 'uid')`,导致批量点歌功能崩溃。 - **修复建议**: ```javascript const userInfo = wx.getStorageSync('userInfo') || {}; const uid = userInfo.uid || ''; if (!uid) { wx.showToast({ title: '请先登录', icon: 'none' }); return; } ``` ### [逻辑 BUG] 模块级变量导致 WebSocket/定时器状态共享与内存泄漏 - **严重程度**: 高危 - **文件**: `open-result.js`, `pay-success.js` - **行号**: 文件顶部 (约 8-10 行) - **问题描述**: `let SocketTask = null`、`let socketOpen = false`、`let countdownTimer = null` 定义在页面模块作用域。微信小程序页面实例会被缓存,多次进入或快速切换页面时,这些变量会被所有页面实例共享,极易引发 WebSocket 连接冲突、重复重连死循环或定时器未清理导致的内存泄漏。 - **修复建议**: 将状态移至页面实例 `this` 或 `data` 中,例如 `this.socketTask = null`,并在 `onUnload` 中确保清理。 ### [逻辑 BUG] 数组索引为 -1 时直接访问属性导致崩溃 - **严重程度**: 高危 - **文件**: `continue-packages.js` (约 148 行), `package.js` (约 158 行) - **行号**: 约 148 / 158 - **问题描述**: `toPayPage` 中直接访问 `this.data.package_list[this.data.packageIndex].id`。初始化时 `packageIndex` 为 `-1`,若用户未点击选择直接触发下一步,将访问 `undefined.id` 报错。 - **修复建议**: 增加边界校验: ```javascript const selectedPackage = this.data.package_list[this.data.packageIndex]; if (!selectedPackage) { wx.showToast({ title: '请选择套餐', icon: 'none' }); return; } ``` ### [安全隐患] URL 参数未编码直接拼接可能导致 XSS 或路由解析异常 - **严重程度**: 高危 - **文件**: `open-result.js`, `pay-success.js`, `shop-detail.js` 等多处 - **行号**: 多处 `wx.navigateTo` 拼接处 - **问题描述**: 部分跳转链接直接拼接 `this.data.book_time`、`this.data.msg` 等来自 URL 参数或接口返回的字符串。若内容包含 `&`、`=` 或特殊字符,会破坏 URL 结构;若渲染至 `rich-text` 组件,存在 XSS 注入风险(如 `open-result.js` 的 `confirmContent` 插值)。 - **修复建议**: 统一使用 `encodeURIComponent()` 包裹动态参数,并在展示富文本前进行 HTML 实体转义或使用小程序安全 API 过滤。 ### [代码质量] 核心业务逻辑(WebSocket、点歌、授权)严重重复 - **严重程度**: 中危 - **文件**: `open-result.js`, `pay-success.js`, `scan-order.js` - **行号**: 跨文件 - **问题描述**: `initWebsocket`、`batchSong`、`importUserSongs`、手机号授权流程在三个页面中几乎完全复制。违反 DRY 原则,后期维护成本极高,且一处修复需同步多处。 - **修复建议**: 提取为全局 `Behavior`(如 `behaviors/websocketBehavior.js`)或工具类,通过 `this.triggerEvent` 或回调注入业务差异逻辑。 ### [代码质量] data 对象中存在重复键名 - **严重程度**: 中危 - **文件**: `continue-packages.js` - **行号**: 约 18 行 - **问题描述**: `data` 对象中 `operational_scene: ''` 被声明了两次。JS 引擎会静默覆盖,但属于明显的代码冗余,易引发维护困惑。 - **修复建议**: 删除重复声明,保留一处即可。 ### [代码质量] Promise 调用缺少 .catch() 错误捕获 - **严重程度**: 中危 - **文件**: `shop-detail.js` - **行号**: 约 630, 730, 790 行 - **问题描述**: `getTuanGouBookMethod` 返回 Promise,但在 `toExchangeCoupon`、`useTuangouCoupon` 中仅使用 `.then()`。若模型层请求失败或网络异常,将触发 `Unhandled Promise Rejection`,导致页面白屏或静默失败。 - **修复建议**: 补充 `.catch(err => { wx.hideLoading(); wx.showToast({title: '请求失败', icon:'none'}); })`。 ### [代码质量] 魔法数字与硬编码值过多 - **严重程度**: 低危 - **文件**: 全局 - **行号**: 多处 - **问题描述**: 如 `case '7'`、`function == '9001'`、`expire: '-1'`、倒计时 `8`、重连延迟 `3000` 等直接硬编码。缺乏语义化常量,降低可读性。 - **修复建议**: 在文件顶部或独立 `constants.js` 中定义枚举/常量,如 `const WS_FUNC_SONG_CONTROL = '9001';`。 ## ✅ 代码亮点 1. **动态 Tab 渲染逻辑清晰**:`continue-packages.js` 和 `package.js` 中根据 `package_list` 和 `hour_list` 是否为空动态生成 `tab_list` 的逻辑健壮,考虑了多种边界情况。 2. **防抖与状态管理意识**:`shop-detail.js` 中 `onPageScroll` 使用局部变量 `updateData` 收集变更,仅在数据真正变化时调用 `setData`,有效减少了渲染开销。 3. **模块化导入规范**:整体采用了 ES6 `import` 语法,模型实例化在模块顶层,符合小程序最佳实践。 ## 📝 总体建议 1. **架构层面**:当前代码为典型的小程序前端项目,提供的 `system/` PHP 结构为后端 CodeIgniter 框架,两者无直接交叉引用关系。建议将前端公共逻辑(WebSocket 管理、授权流程、点歌协议)抽离为 `Behavior` 或 `Utils`,彻底解决代码重复问题。 2. **健壮性提升**:所有来自 `options`、`wx.getStorageSync`、接口回调的数据,在访问深层属性前必须进行空值校验(Optional Chaining `?.` 或逻辑与 `&&`)。 3. **安全规范**:严格区分“展示数据”与“路由参数”。涉及用户输入或外部返回的字符串,跳转前必须 `encodeURIComponent`,渲染前必须做 XSS 过滤。 4. **调试与监控**:建议移除或封装 `console.log`,接入小程序错误监控(如 Sentry 或微信官方 `wx.onError`),便于线上排查 `Unhandled Promise Rejection` 和 WebSocket 断连问题。 --- *此 Issue 由代码审查服务自动创建*
...
milestone_id
0
priority
0
is_closed
0
is_pull
0
num_comments
0
ref
deadline_unix
0
created_unix
1780991421
updated_unix
1780991421
closed_unix
0
is_locked
0
content_version
0
time_estimate
0
Delete
Cancel