小优化

This commit is contained in:
2026-08-23 15:25:39 +08:00
parent 0ffd045576
commit 2c1f08deb1
4 changed files with 53 additions and 12 deletions
@@ -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 成功提示并将关注脚本改为全局加载`。
+1
View File
@@ -40,6 +40,7 @@
if (result.success && result.data) { if (result.success && result.data) {
var isFollowing = result.data.is_following; var isFollowing = result.data.is_following;
updateFollowButton(btn, isFollowing, result.data.follower_count); updateFollowButton(btn, isFollowing, result.data.follower_count);
notyf(isFollowing ? '关注成功' : '已取消关注', 'success');
} else { } else {
notyf(result.message || '操作失败', 'danger'); notyf(result.message || '操作失败', 'danger');
} }
+3 -12
View File
@@ -315,24 +315,15 @@ trait ScriptsPart1b {
); );
} }
// 关注脚本 // 关注脚本已在全局栈注册(ScriptsPart1c),data-aksrt-follow 按钮
$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
);
}
$author_js_path = get_template_directory() . '/assets/js/author.js'; $author_js_path = get_template_directory() . '/assets/js/author.js';
if (file_exists($author_js_path)) { if (file_exists($author_js_path)) {
wp_enqueue_script( wp_enqueue_script(
'aksrt-author', 'aksrt-author',
$base_uri . '/assets/js/author.js', $base_uri . '/assets/js/author.js',
['loader_js'], ['loader_js', 'aksrt-notyf'],
(string) filemtime($author_js_path), (string) filemtime($author_js_path),
true true
); );
+15
View File
@@ -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 (split from main.js) — register with AksrtFrontend
$core_modules = [ $core_modules = [
'aksrt-core-article' => 'article.js', 'aksrt-core-article' => 'article.js',