diff --git a/.zcode/plans/plan-sess_9dedb041-3430-4063-9835-8825229111bc.md b/.zcode/plans/plan-sess_9dedb041-3430-4063-9835-8825229111bc.md new file mode 100644 index 00000000..00546345 --- /dev/null +++ b/.zcode/plans/plan-sess_9dedb041-3430-4063-9835-8825229111bc.md @@ -0,0 +1,34 @@ +## 背景结论(回答"为什么没接入") + +Toast 系统(notyf)其实已在所有前台页面全局加载(handle `aksrt-notyf`,`assets/js/notyf.js` 暴露 `window.notyf(message, type)`),公开主页上举报、面板加载失败也都在用。真正的缺口: + +1. **关注/取消关注成功时零反馈**:`assets/js/follow.js:40-42` 成功后只翻转按钮状态,不调用 `notyf()`(对比文章页点赞/收藏 `article.js:225/250` 成功失败都有提示)——这是"页面没接 Toast"观感的来源。 +2. **依赖声明不规范**:`author.js` 调用了 7 处 `notyf()`,但 handle `aksrt-author`(`ScriptsPart1b.php:335`)只声明 `['loader_js']`,靠全局加载碰巧可用。 +3. **相邻 bug**:`data-aksrt-follow` 按钮在文章页作者栏(`single-author-bar.php:116`、`aksrt-single-render.php:442`)、WidgetSystem 用户卡(`UserRenderer.php:102`)、身份铭牌(`aksrt-identity.php:226`)等多处渲染,但 `follow.js` 只在用户中心/公开主页路由注册 → 这些位置按钮是死的(用户已确认一并修复)。 + +## 改动内容 + +### 1. `assets/js/follow.js` — 补齐成功 Toast(核心) +成功分支(`updateFollowButton(...)` 之后)增加: +```js +notyf(isFollowing ? '关注成功' : '已取消关注', 'success'); +``` +遵循 article.js 点赞/收藏既有惯例:客户端写死文案、两种状态都用 `success`(后端 `follow_toggle` 不返回 message,与点赞/收藏接口一致)。 + +### 2. `src/Core/ScriptsPart1b.php` + `src/Core/ScriptsPart1c.php` — follow.js 提升为全局注册 +- 删除 `ScriptsPart1b.php:318-328` `$is_profile_page` 块内的 `aksrt-follow` 注册; +- 在 `ScriptsPart1c.php` 全局栈(`aksrt-runtime` 注册之后,约 165 行处)全局注册,依赖 `['aksrt-notyf', 'aksrt-runtime']`——显式声明依赖 `aksrt-runtime` 是因为 `aksrtData`(REST 地址 + nonce,follow.js IIFE 解析期就要读)localize 在该 handle 上,把目前"靠 footer 打印顺序碰巧正确"变为确定的依赖顺序。 +- 效果:文章页作者栏、任意位置的用户卡片关注按钮恢复可用,并获得同样的 Toast 反馈。脚本仅 ~100 行、单个委托点击监听,全局加载成本可忽略(与已全局加载的 notyf/runtime/core modules 一致)。 + +### 3. `src/Core/ScriptsPart1b.php:335` — aksrt-author 显式声明 notyf 依赖 +`['loader_js']` → `['loader_js', 'aksrt-notyf']`。 + +## 验证 + +- `php -l` 检查两个改动的 PHP 文件。 +- 浏览器实测(桌面 + 移动):公开主页关注/取消关注弹出 success Toast、按钮翻转、粉丝数更新;未登录/网络失败路径弹 danger Toast;文章页作者栏关注按钮可点击且有提示;Tab 无刷新切换不受影响。 +- `node --test tests/widget-system/post-visual-contract.test.cjs` 确认无回归(未改标记,应通过)。 + +## 提交 + +单条提交,遵循仓库 Conventional Commit 风格:`fix(frontend): 关注操作接入 notyf 成功提示并将关注脚本改为全局加载`。 \ No newline at end of file diff --git a/assets/js/follow.js b/assets/js/follow.js index cff5027d..8ffc7704 100644 --- a/assets/js/follow.js +++ b/assets/js/follow.js @@ -40,6 +40,7 @@ if (result.success && result.data) { var isFollowing = result.data.is_following; updateFollowButton(btn, isFollowing, result.data.follower_count); + notyf(isFollowing ? '关注成功' : '已取消关注', 'success'); } else { notyf(result.message || '操作失败', 'danger'); } diff --git a/src/Core/ScriptsPart1b.php b/src/Core/ScriptsPart1b.php index bc4e96f8..662687bf 100644 --- a/src/Core/ScriptsPart1b.php +++ b/src/Core/ScriptsPart1b.php @@ -315,24 +315,15 @@ trait ScriptsPart1b { ); } - // 关注脚本 - $follow_js_path = get_template_directory() . '/assets/js/follow.js'; - if (file_exists($follow_js_path)) { - wp_enqueue_script( - 'aksrt-follow', - $base_uri . '/assets/js/follow.js', - ['aksrt-notyf'], - filemtime($follow_js_path) ?: $version, - true - ); - } + // 关注脚本已在全局栈注册(ScriptsPart1c),data-aksrt-follow 按钮 + // 也渲染于文章页作者栏与各处用户卡片,不能仅限本路由加载。 $author_js_path = get_template_directory() . '/assets/js/author.js'; if (file_exists($author_js_path)) { wp_enqueue_script( 'aksrt-author', $base_uri . '/assets/js/author.js', - ['loader_js'], + ['loader_js', 'aksrt-notyf'], (string) filemtime($author_js_path), true ); diff --git a/src/Core/ScriptsPart1c.php b/src/Core/ScriptsPart1c.php index 489218bd..c77ec539 100644 --- a/src/Core/ScriptsPart1c.php +++ b/src/Core/ScriptsPart1c.php @@ -164,6 +164,21 @@ trait ScriptsPart1c { ); } + // Follow toggle: delegated [data-aksrt-follow] handler; the buttons render on + // user home / user center / single author bar and user cards anywhere. + // Depends on aksrt-runtime because aksrtData (REST root + nonce) is localized + // onto that handle and follow.js reads it at parse time. + $follow_js = get_template_directory() . '/assets/js/follow.js'; + if (file_exists($follow_js)) { + wp_enqueue_script( + 'aksrt-follow', + $base_uri . '/assets/js/follow.js', + ['aksrt-notyf', 'aksrt-runtime'], + (string) filemtime($follow_js), + true + ); + } + // Core modules (split from main.js) — register with AksrtFrontend $core_modules = [ 'aksrt-core-article' => 'article.js',