What's New · 产品迭代时间轴

更新日志

每一次发布都可追溯:性能、功能、视觉、数据、基建、修复,一目了然。 最近更新:2026-04-18

30
最近 7 天
30
累计条目

2026年4月20日 – 4月26日

11 项
  • 修复 2026-04-24

    修复:127.0.0.1 首页 HTTP 500(MySQL 不可达时整页崩溃)

    日志根因(非猜测):`storage/logs/laravel.log` 中 `production.ERROR: SQLSTATE[HY000] [2006] MySQL server has gone away`,堆栈为 `ToolController->buildHome…

    查看全部改动(4 条)
    • 日志根因(非猜测):`storage/logs/laravel.log` 中 `production.ERROR: SQLSTATE[HY000] [2006] MySQL server has gone away`,堆栈为 `ToolController->buildHomeCategories()` 内 `categories` 查询;同类还有 `PDO::__construct(): Error while reading greeting packet`(连接阶段失败)。
    • 环境:`.env` 指向远程 `DB_HOST=43.180.194.2:21025`,本机无网络/防火墙/白名单时 PDO 建连或查询会抛 `Illuminate\Database\QueryException` / `PDOException`,原 `Cache::remember` 闭包未捕获 → 整页 500。
    • 修改:`app/Http/Controllers/ToolController.php` 增加 `homeDb($op, $fallback, $fn)` 与 `emptyPortalDigestSnapshot()`;`buildHomeCategories` / `buildFeaturedTools` / `weeklyNewTools` / `SiteCrossDigest::home()` 均经 `homeDb` 吞 DB 异常并写 `Log::warning("ToolController.home.*")`;`featured` 自愈分支 `Tool::where()->exists()` 包在 try-catch 内。DB 不可达时首页降级为无分类/无推荐/空 portalDigest,仍返回 200,搜索区与静态块可浏览。
    • 长期:本机开发请在 `.env` 配可达的库,或使用 `DB_CONNECTION=sqlite`+`php artisan migrate` 本地库,避免误连生产。
    app/Http/Controllers/ToolController.php
  • 修复 2026-04-24

    部署:Push-LocalToServer.ps1 → 云服务器

    密钥:仓库上级目录 `2.txt`(用户所称 `3.txt` 未在磁盘找到,部署使用同目录 `2.txt`);格式见 `scripts/deploy/deploy-secrets.example.txt`。

    查看全部改动(4 条)
    • 密钥:仓库上级目录 `2.txt`(用户所称 `3.txt` 未在磁盘找到,部署使用同目录 `2.txt`);格式见 `scripts/deploy/deploy-secrets.example.txt`。
    • 第 1 次失败:远端 `bash scripts/production-release.sh` 报 `set: pipefail: invalid option name` —— 根因 `scripts/production-release.sh` 为 CRLF,已在本机转 LF 后重传。
    • 第 2 次失败:`php artisan migrate` 报 `1050 Table 'prompt_ai_models' already exists` —— 根因生产库表已存在但 `migrations` 未记该条;已改 `2026_04_16_100000_create_prompt_ai_models_and_restructure.php`:无表再 `create`,种子数据可重复 `update/insert`。
    • 第 3 次成功:解压至 `/www/wwwroot/kaixinniao.com`,composer、`migrate`、storage:link、db:optimize、sitemap、config/route/view/optimize 均完成,脚本输出 `==> Done. Smoke-test per DEPLOY.md.`。
  • 修复 2026-04-24

    修改前代码快照(pre-home-nav-perf-opt 备份)

    范围:`app/bootstrap/config/database/public/resources/routes/scripts/tests/docs` 十个目录 + 根配置清单(`artisan`、`composer*.json`、`package*.json`、`.env…

    查看全部改动(4 条)
    • 备份:`code-backups/kaixinniao.com-pre-home-nav-perf-opt-20260424-111907.zip`(36,186,641 bytes)
    • 范围:`app/bootstrap/config/database/public/resources/routes/scripts/tests/docs` 十个目录 + 根配置清单(`artisan`、`composer*.json`、`package*.json`、`.env.example`、`.htaccess`、`tailwind.config.js`、`postcss.config.js`、`phpunit.xml`、`DEPLOY.md`)。
    • 排除:`vendor`、`node_modules`、运行期缓存与日志、`.env`。
    • 说明:PowerShell `Compress-Archive` 读取 `artisan` 时报权限错误,已改用 .NET `ZipArchive` 逐文件打包。
  • 修复 2026-04-23

    首页:Hero 下方「本站数据」四格实时数字条

    动因:首页骨架长期不变,老板从视觉上感知不到数据库在增长;需要一个不破坏现有排版的「成长指标」组件。

    查看全部改动(4 条)
    • 动因:首页骨架长期不变,老板从视觉上感知不到数据库在增长;需要一个不破坏现有排版的「成长指标」组件。
    • 新增/修改:`app/Http/Controllers/ToolController.php::computeSiteStatsBar()`(工具 / Skills / 提示词 / 近 30 天新增;每项独立 try-catch,任一失败返回 0 不阻断首页);`Cache::remember('home_site_stats_bar_v1', 3600, ...)`。
    • 前端:`resources/views/home.blade.php` 在 Search Hub 结束后、Featured Tools 之前插入四格网格;每格为 `<a>`,点击直达对应频道;`array_sum($__bar) > 0` 才渲染,避免「全 0」时出现 0 款观感。
    • 兼容:Prompts 计数按 `HubPromptLibraryItem` → `PromptLibraryItem` → `hub_prompt_library_items` → `prompt_library_items` → `hub_prompts` → `prompts` 顺序回退;Skills 同理(`class_exists` + `Schema::hasTable`)。
  • 修复 2026-04-23

    周报:artisan report:weekly + HTML 邮件模板 + 定时

    `app/Console/Commands/ReportWeeklyCommand.php`(`--days=7 --save --mail=a,b --print`;数据来自 ChangelogParser + `tools/skills/prompt 表` 直查;任一统计异…

    查看全部改动(4 条)
    • 动因:把「被动答辩」转为「每周一主动推送」,不再需要口头汇报。
    • 新增:`app/Console/Commands/ReportWeeklyCommand.php`(`--days=7 --save --mail=a,b --print`;数据来自 ChangelogParser + `tools/skills/prompt 表` 直查;任一统计异常不阻断报告);`resources/views/reports/weekly.blade.php`(邮件内联 CSS 友好的 HTML:Hero 四指标 + 分类聚合 + 累计总量 + 明细列表)。
    • 调度:`Kernel::schedule` 每周一 09:00 调用,`env('REPORT_WEEKLY_MAIL_TO')` 为空时仅 `--save` 落盘到 `storage/app/reports/weekly-YYYYMMDD-HHmm.html`;设置该 env 后同一调度即自动发送。
    • 依赖:邮件依赖 `.env` 的 `MAIL_MAILER` 等标准配置;SMTP 失败会被捕获并提示「先用 --save 落盘,再手工转发」。
    app/Console/Commands/ReportWeeklyCommand.php resources/views/reports/weekly.blade.php
  • 修复 2026-04-23

    测试回归:ChangelogParser 分类优先级 BUG 修复

    smoke 14/14 全绿;真实 25 条日志重新分类 perf=3 fix=9 feat=2 ui=6 data=4 infra=1 合理;端到端 changelog:sync + report:weekly 均跑通

    查看全部改动(3 条)
    • 文件:`app/Support/ChangelogParser.php`、`scripts/smoke-changelog.php`
    • 根因:原 classify() 为 body 全文顺序判定且 perf 排在 fix 之前、正则含弱信号「首屏」→「顶栏·更多·下拉遮挡」含「首屏分类卡片」被吞入 perf,同时「性能:data URI」因 bullet 含「根因」被吞入 fix;改为 (1) title 显式「性能:」前缀或 DOMContentLoaded/data URI/Lighthouse/提速 → 直接 perf;(2) title 显式「修复:」→ 直接 fix;(3) 其余按 fix > perf body 顺序
    • 变更:smoke 14/14 全绿;真实 25 条日志重新分类 perf=3 fix=9 feat=2 ui=6 data=4 infra=1 合理;端到端 changelog:sync + report:weekly 均跑通
    app/Support/ChangelogParser.php scripts/smoke-changelog.php
  • 修复 2026-04-20

    顶栏:窄屏「更多」收纳主导航(登录/注册/提交工具固定)

    为「探索」至「鲲穹AI工具箱」各包一层 `data-kx-nav-chunk`;轨道末增加「更多」`data-kx-nav-more-root` + 面板;`overflow-x: clip`;脚本在 `min-width: 640px` 下按轨道 `clientWidth` …

    查看全部改动(3 条)
    • 文件:`resources/views/layouts/app.blade.php`
    • 根因:中间导航 `kx-topbar__center-track` 为单行 flex,项多 + 右侧操作区占位后,中等宽度下主链路与下拉层叠/挤压(用户反馈重叠)。
    • 变更:为「探索」至「鲲穹AI工具箱」各包一层 `data-kx-nav-chunk`;轨道末增加「更多」`data-kx-nav-more-root` + 面板;`overflow-x: clip`;脚本在 `min-width: 640px` 下按轨道 `clientWidth` 与项宽 + gap +「更多」按钮宽计算可容纳前缀项数,尾部项移入面板;`ResizeObserver` + `resize` 重算。`#kxTopbarActions`(登录/注册/提交工具)仍在 grid 右列,不参与折叠。
    resources/views/layouts/app.blade.php
  • 修复 2026-04-20

    顶栏:「更多」下拉遮挡正文

    CSS 将 `[data-kx-nav-more-root] > .kx-nav-dropdown` 改为 **向上展开**(`bottom: calc(100% + 0.25rem)`,`z-index: 130`);`[data-kx-nav-more-panel] .kx…

    查看全部改动(3 条)
    • 文件:`resources/views/layouts/app.blade.php`
    • 现象(截图):「更多」面板在顶栏下方展开,盖住首屏分类卡片等区域。
    • 变更:CSS 将 `[data-kx-nav-more-root] > .kx-nav-dropdown` 改为 **向上展开**(`bottom: calc(100% + 0.25rem)`,`z-index: 130`);`[data-kx-nav-more-panel] .kx-nav-group .kx-nav-dropdown` 明确在面板内 **自上而下** 展开;`initTopbarDropdowns` 对 `data-kx-nav-more-root` **取消 mouseenter/mouseleave**,仅 **点击** 展开/收起,减少误挡;点击面板内链接后自动收起。
    resources/views/layouts/app.blade.php
  • 修复 2026-04-20

    顶栏:「更多」恢复向下并加宽

    「更多」主面板改回 **向下**(`top: 100%`,`right: 0` 右对齐);`min-width: 20rem`,`width: min(36rem, calc(100vw - 2rem))`,`max-width: calc(100vw - 2rem)`;`[d…

    查看全部改动(3 条)
    • 文件:`resources/views/layouts/app.blade.php`
    • 用户反馈:不要向上展开,希望右侧下拉 **加宽**。
    • 变更:「更多」主面板改回 **向下**(`top: 100%`,`right: 0` 右对齐);`min-width: 20rem`,`width: min(36rem, calc(100vw - 2rem))`,`max-width: calc(100vw - 2rem)`;`[data-kx-nav-more-panel]` 同步 `min-width: 20rem`。保留仅点击展开与点链接收起;子项内二级下拉规则不变。
    resources/views/layouts/app.blade.php
  • 修复 2026-04-20

    企业 / 人物 / 机器人列表分页与摘要

    企业 / 人物名录改为每页 **12** 条(类常量 `HUB_DIRECTORY_PER_PAGE`);名录标题下增加「第 x–y 条,共 z 条」;机器人名录对筛选后列表做 **LengthAwarePaginator(每页 12)**,`MarketingPageSeo:…

    查看全部改动(3 条)
    • 文件:`app/Http/Controllers/HubDirectoryController.php`、`app/Http/Controllers/DiscoveryController.php`、`resources/views/hub/enterprises.blade.php`、`resources/views/hub/figures.blade.php`、`resources/views/discovery/robots.blade.php`
    • 根因(与代码核对):企业、人物已 `paginate(24)` 但单页仍偏长;机器人页 `$rows` 为全量 Collection,名录区无分页。
    • 变更:企业 / 人物名录改为每页 **12** 条(类常量 `HUB_DIRECTORY_PER_PAGE`);名录标题下增加「第 x–y 条,共 z 条」;机器人名录对筛选后列表做 **LengthAwarePaginator(每页 12)**,`MarketingPageSeo::forRequestPaginator` 与底部分页链;Hero「当前列表」改为「当前筛选」+ `total()`。
    app/Http/Controllers/HubDirectoryController.php app/Http/Controllers/DiscoveryController.php resources/views/hub/enterprises.blade.php resources/views/hub/figures.blade.php resources/views/discovery/robots.blade.php
  • 修复 2026-04-20

    顶栏:「更多」宽度减半 + 再点收起

    `min-width` 与 `width` 上限各减半(`10rem` / `18rem`);`:not(.is-open) > [data-kx-nav-more-panel]` 强制 `display:none`;「更多」触发器 `z-index:135` 避免与面板叠层抢…

    查看全部改动(3 条)
    • 文件:`resources/views/layouts/app.blade.php`
    • 根因(与代码核对):① 面板宽度沿用 `min(36rem)` / `min-width:20rem`,与短链列表不匹配。② `is-open` 仅改触发器颜色,**未**用 CSS 控制 `[data-kx-nav-more-panel]` 的 `display`,JS 已 `remove('is-open')` 时面板仍可保持绘制,表现为「再点不收起」。③ 收纳进面板的 chunk 内若含 `.kx-nav-group`,其 `mouseenter`→`openGroup`→`closeAll` 会摘掉「更多」的 `is-open`,与点击态叠加。
    • 变更:`min-width` 与 `width` 上限各减半(`10rem` / `18rem`);`:not(.is-open) > [data-kx-nav-more-panel]` 强制 `display:none`;「更多」触发器 `z-index:135` 避免与面板叠层抢点击;`closeAll` 在「当前要打开的分组位于面板内」时不关闭 `data-kx-nav-more-root`。
    resources/views/layouts/app.blade.php

2026年4月13日 – 4月19日

2 项
  • 修复 2026-04-18

    用户体验 Sprint1(Backlog:A1/A2/C1/D2 部分落地)

    resources/views/partials/skills-active-filter-summary.blade.php(技能首页/分类页复用);resources/views/errors/404.blade.php(extends layouts.app,noinde…

    查看全部改动(4 条)
    • 关联需求:列表筛选一句话说明(A1)、无结果可操作空态(A2)、窄屏防整页横向溢出(C1)、404 友好页(D2)。
    • 新增:resources/views/partials/skills-active-filter-summary.blade.php(技能首页/分类页复用);resources/views/errors/404.blade.php(extends layouts.app,noindex,链到探索中心/技能库/提示词/首页)。
    • 修改:resources/views/skills/index.blade.php(min-w-0 overflow-x-hidden、引入筛选摘要、空态按钮与 focus-visible);resources/views/skills/category.blade.php(同上摘要+空态、清除关键词 URL 用 route 数组合并 slug);resources/views/hub/prompts-index.blade.php(根与内容区 min-w-0 overflow-x-hidden、模型导航容器 w-full min-w-0、列表模式筛选摘要、无结果空态、Hero 搜索框 focus-visible)。
    • 溯源:若线上 404 未命中自定义视图,检查 `APP_DEBUG` 与 `bootstrap/app.php`/`Handler` 是否覆盖默认渲染;空态链接依赖路由名 `discover.hub`、`skills.index`、`skills.ranking.popular`、`discover.prompts`。
  • 修复 2026-04-18

    自检(助手侧,非生产浏览器实测)

    静态检查:Blade 中 `route('skills.category', array_merge(['slug' => $category->slug], …))` 与路由参数名一致;提示词空态使用 Hero 内已定义的 `$promptSearchClearUrl`;40…

    查看全部改动(3 条)
    • 命令:`php artisan view:cache` 在本机失败,报错 `Call to undefined function Illuminate\Support\mb_split()`(PHP 未启用 mbstring),故无法用 Laravel 编译视图作为自动化 gate;与此前 PHPUnit 缺 mbstring 一致。
    • 静态检查:Blade 中 `route('skills.category', array_merge(['slug' => $category->slug], …))` 与路由参数名一致;提示词空态使用 Hero 内已定义的 `$promptSearchClearUrl`;404 所用路由名与 web.php 中 `discover.hub` 等一致。
    • 已知体验点:技能「分类页」因传入 `fixedCategory`,筛选摘要条在「无关键词/无标签/默认排序」时仍会显示「当前列表·分类「…」」,与标题略重复,可后续收紧显示条件。

日志根据仓库根 修改记录.txt 自动解析 · 每 10 分钟刷新一次缓存