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
Update row 222 in issue
id
Primary key.
INTEGER NOT NULL
repo_id
INTEGER
index
INTEGER
poster_id
INTEGER
original_author
TEXT
original_author_id
INTEGER
name
🔍 代码审查报告:pay-260519 - 1
TEXT
content
## 自动代码审查报告 **分支**: pay-260519 **提交**: `2c6af8c190553919e523b9424e729bed1fd986f7` **提交人**: LITTLEMAIDI (11833999+littlemaidi@user.noreply.gitee.com) **时间**: 2026-05-19 17:40:23 --- ## 1. 审查摘要 - **代码质量评分**:6.5 / 10 分 - **总体评价**:代码实现了复杂的包厢预订时段计算逻辑,涵盖了营业时间、团购券规则、跨天逻辑、清扫时间及多房间状态等场景。但存在**严重的静态缓存串扰**与**实例状态污染**问题,核心方法过长且职责混杂,大量使用魔法值与全局辅助函数,可维护性与性能存在较大隐患。代码末尾被截断,部分逻辑未能完整评估。 - **风险等级**:🔴 高(存在数据串扰与状态累加缺陷,可能直接导致线上预订错乱) ## 2. 问题详情 | 严重程度 | 文件/行号 | 问题描述 | 建议修改方案 | 代码示例 (可选) | | :--- | :--- | :--- | :--- | :--- | | 🔴 严重 | `get_book_days_info()` 开头 | **静态缓存未区分参数导致数据串扰**:`self::$book_days_info` 作为静态属性缓存结果,但方法签名包含 `$merchant_id`, `$shop_id`, `$check_date`, `$add_day`。首次调用后,后续不同门店/日期的请求将直接返回错误缓存。 | 移除静态缓存,或改用带唯一键的缓存机制(如 Redis/CI Cache),键名需包含所有入参。若仅限单次请求内复用,应使用实例属性而非静态属性。 | ```php\n// 错误做法\nif (!empty(self::$book_days_info)) { return self::$book_days_info; }\n\n// 建议做法(请求级缓存)\n$cache_key = md5(implode('_', func_get_args()));\nif (isset($this->cache['book_days'][$cache_key])) {\n return $this->cache['book_days'][$cache_key];\n}\n// ... 计算逻辑 ...\n$this->cache['book_days'][$cache_key] = $result;\nreturn $result;\n``` | | 🔴 严重 | `get_book_days_info()` 内部 | **实例属性被永久修改**:`if ($add_day) { $this->book_days += 1; }` 会直接修改实例属性。若该方法在同一次请求中被调用多次,天数会持续累加,导致后续逻辑计算错误。 | 使用局部变量进行计算,绝不修改实例配置属性。 | ```php\n$days_to_check = $this->book_days;\nif ($add_day) {\n $days_to_check += 1;\n}\nfor ($i = 0; $i < $days_to_check; $i++) { ... }\n``` | | 🟠 警告 | `get_book_day_time_info()` 全文 | **方法过长且违反单一职责原则**:该方法超过 300 行,混合了数据查询、时间区间计算、团购券校验、状态标记、数组过滤等逻辑,极难测试与维护。 | 拆分为独立方法:`getShopBusinessHours()`, `calculateUnbookableSlots()`, `applyVoucherRules()`, `filterAvailableSlots()`。主方法仅负责流程编排。 | 见下方重构建议 | | 🟠 警告 | `get_book_day_time_info()` 约第 180 行 | **多房间交集逻辑存疑**:`$un_book_time = array_intersect(...array_values($all_room_book_time));` 使用展开运算符求交集,意为“所有房间同时被占用的时间”。若业务为“智能推荐任一可用包厢”,此处应求**并集**或采用其他推荐算法。且空数组展开会触发 `ArgumentCountError`。 | 明确业务意图。若为求并集,改用 `array_merge` + `array_unique`。增加空值保护。 | ```php\nif (count($room_type_room_ids) > 1) {\n // 安全求并集示例\n $un_book_time = array_unique(array_merge(...array_values($all_room_book_time)));\n} else {\n $un_book_time = $all_room_book_time[$this->book_room_id] ?? [];\n}\n``` | | 🟠 警告 | 全局多处 | **频繁调用 `&get_instance()` 与重复加载模型**:在多个方法中重复调用 `$CI = &get_instance();` 及 `$this->load->model()`,增加开销且破坏框架生命周期规范。 | 在 `__construct()` 中统一初始化 CI 实例与依赖模型,或使用 CI 的自动加载机制。 | ```php\npublic function __construct()\n{\n parent::__construct();\n $this->ci = &get_instance();\n $this->load->model([\n 'ahead_shop_config_second_model',\n 'ahead_family_servers_model',\n 'ahead_room_discontinue_rule_model'\n ]);\n // 其他初始化...\n}\n``` | | 🟡 建议 | 全局属性定义 | **大量使用 `public` 属性暴露内部状态**:如 `$book_time_limit`, `$now_room_book_time` 等均为 `public`,易被外部意外覆盖,破坏封装性。 | 改为 `protected` 或 `private`,通过 Getter/Setter 访问。复杂数据结构建议使用 DTO 或 Value Object 封装。 | ```php\nprotected $book_time_limit = 3600;\npublic function getBookTimeLimit(): int { return $this->book_time_limit; }\n``` | | 🟡 建议 | 全局多处 | **魔法数字/字符串硬编码**:大量使用 `'1'`, `'2'`, `'3'`, `86400`, `3600`, `'merchantApp'` 等字面量,降低可读性且易引发拼写错误(如 `opreational_scene`)。 | 提取为类常量,统一拼写。 | ```php\nclass Ahead_shop_book_time_info_model extends Simple_model\n{\n const SCENE_KTV = '1';\n const SCENE_BILLIARDS = '2';\n const SCENE_CARD = '3';\n const SECONDS_PER_DAY = 86400;\n const REQUEST_SOURCE_MERCHANT_APP = 'merchantApp';\n // ...\n}\n``` | | 🟡 建议 | `get_book_day_time_info()` 约第 220 行 | **遍历中修改数组**:`foreach ($time_info as $k => &$v) { ... unset($time_info[$k]); }` 在遍历时直接 `unset` 当前数组元素,在 PHP 中虽可行但易引发指针错乱或不可预期行为。 | 收集需移除的键,遍历结束后统一删除;或改用 `array_filter`。 | ```php\n$keys_to_remove = [];\nforeach ($time_info as $k => $v) {\n if ($date == $today && $v['time'] <= $now_hour_time) {\n $keys_to_remove[] = $k;\n }\n}\nforeach ($keys_to_remove as $k) {\n unset($time_info[$k]);\n}\n``` | > ⚠️ **局限性说明**:您提供的代码在 `$next_first_hour_range = reset($next_` 处被截断,导致 `_get_un_book_time` 方法后半段及后续逻辑无法审查。若截断部分包含核心时间推算或数据库写入逻辑,请补充完整代码以便进行二次深度审查。 ## 3. 总结与行动建议 ### 🔑 优先修复的关键问题 1. **立即修复静态缓存串扰**:`self::$book_days_info` 必须改为带参数维度的缓存或移除,否则多租户/多门店环境下将产生严重的数据错乱。 2. **消除实例状态污染**:禁止在业务方法中修改 `$this->book_days` 等配置属性,全部改用局部变量计算。 3. **修复多房间数组交集隐患**:确认 `array_intersect(...)` 是否符合“智能推荐”业务预期,并增加空数组保护防止 `ArgumentCountError`。 ### 🛠 后续重构与优化方向 1. **方法拆分与职责分离**:将 `get_book_day_time_info` 拆分为 4~5 个私有方法,分别负责: - 获取基础配置与营业时间 - 计算不可预订时间段(含跨天、清扫、锁定) - 应用团购券/套餐规则过滤 - 生成最终可用时段列表 2. **引入时间处理组件**:当前大量依赖字符串拼接(`YmdHi`)与 `strtotime`,极易受时区/DST影响。建议引入 `Carbon` 或 `DateTimeImmutable` 进行标准化时间运算,提升精度与可读性。 3. **框架规范对齐**: - 代码呈现典型的 CodeIgniter 3 风格。若 `phpci` 为 CI 的定制分支或现代重构版,请确认 `$this->load->model()` 与 `&get_instance()` 的官方推荐用法。建议查阅 `phpci` 官方文档中关于 **依赖注入(DI)** 与 **服务容器** 的章节,逐步替换全局实例获取方式。 - 输入参数 `$params` 建议接入框架的验证器(如 CI 的 `Form_validation` 或自定义 DTO 验证),避免直接信任外部传入数组。 4. **性能优化**: - `ahead_shop_config_second_model->get_shop_setting` 被多次调用,建议改为批量获取或引入请求级缓存。 - 时间区间合并/交集计算可考虑使用位图或区间树算法替代多次 `array_intersect`/`array_merge`,降低 O(N²) 复杂度。 如需对截断部分进行补充审查,或需要针对某个子逻辑(如团购券跨天计算)提供完整重构示例,请随时提供完整代码。 --- *此 Issue 由代码审查服务自动创建*
TEXT
milestone_id
INTEGER
priority
INTEGER
is_closed
INTEGER
is_pull
INTEGER
num_comments
INTEGER
ref
TEXT
deadline_unix
INTEGER
created_unix
INTEGER
updated_unix
INTEGER
closed_unix
INTEGER
is_locked
INTEGER NOT NULL (default 0
content_version
INTEGER NOT NULL (default 0
time_estimate
INTEGER NOT NULL (default 0
Update
Cancel