From f9ec4964f7555e46dc94cd5bdfee03d717236fee Mon Sep 17 00:00:00 2001 From: kate522 Date: Mon, 28 Sep 2026 00:11:11 +0000 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=9B=AE=E5=BD=95=E3=80=8C.z?= =?UTF-8?q?code/plans=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ss_059db36c-c073-4407-b8d4-b4f76e848ab1.md | 60 ------- ...ss_196341fd-884c-4169-ba45-a896a6f0fd69.md | 31 ---- ...ss_23082cba-edb8-4cf5-9842-07e57ac15e1f.md | 163 ------------------ ...ss_618c6a75-f949-4ad5-9440-eb9e01b542f8.md | 56 ------ ...ss_624e69d1-0139-4583-9979-fd787b532bb1.md | 16 -- ...ss_6a4919a3-3e3a-4f5f-b85e-9e3706a33f34.md | 142 --------------- ...ss_6a5711b4-7c56-4453-a8c1-805094668edc.md | 95 ---------- ...ss_6d07f1d1-0495-4d41-b29a-3c611a4eeab5.md | 47 ----- ...ss_72ae2697-306c-467a-8269-53caeb827381.md | 53 ------ ...ss_72cfffa1-b656-4c03-b570-656cee11787a.md | 72 -------- ...ss_89734dfe-5f98-4990-a139-6123fa850516.md | 51 ------ ...ss_9a435e5a-de87-4d0d-9a80-4da27ea60fea.md | 51 ------ ...ss_9dedb041-3430-4063-9835-8825229111bc.md | 33 ---- ...ss_b00c85f4-499c-4183-a5b5-4baf7a69aa0d.md | 48 ------ ...ss_b0cb1f55-5cfd-4620-9375-d1a8971ad205.md | 46 ----- ...ss_c373fb29-30ab-4cd5-8649-5347223b88e2.md | 51 ------ ...ss_c9ca98f3-5ff7-43eb-a99a-534e80b09c65.md | 42 ----- ...ss_ca260372-4464-45b6-9b12-89d77cf89137.md | 34 ---- ...ss_e1b7a731-938b-41a6-9e4c-bb973c7dc8b5.md | 65 ------- ...ss_f2f2d2d9-4d0c-497b-8524-0276e62cbe96.md | 23 --- 20 files changed, 1179 deletions(-) delete mode 100644 .zcode/plans/plan-sess_059db36c-c073-4407-b8d4-b4f76e848ab1.md delete mode 100644 .zcode/plans/plan-sess_196341fd-884c-4169-ba45-a896a6f0fd69.md delete mode 100644 .zcode/plans/plan-sess_23082cba-edb8-4cf5-9842-07e57ac15e1f.md delete mode 100644 .zcode/plans/plan-sess_618c6a75-f949-4ad5-9440-eb9e01b542f8.md delete mode 100644 .zcode/plans/plan-sess_624e69d1-0139-4583-9979-fd787b532bb1.md delete mode 100644 .zcode/plans/plan-sess_6a4919a3-3e3a-4f5f-b85e-9e3706a33f34.md delete mode 100644 .zcode/plans/plan-sess_6a5711b4-7c56-4453-a8c1-805094668edc.md delete mode 100644 .zcode/plans/plan-sess_6d07f1d1-0495-4d41-b29a-3c611a4eeab5.md delete mode 100644 .zcode/plans/plan-sess_72ae2697-306c-467a-8269-53caeb827381.md delete mode 100644 .zcode/plans/plan-sess_72cfffa1-b656-4c03-b570-656cee11787a.md delete mode 100644 .zcode/plans/plan-sess_89734dfe-5f98-4990-a139-6123fa850516.md delete mode 100644 .zcode/plans/plan-sess_9a435e5a-de87-4d0d-9a80-4da27ea60fea.md delete mode 100644 .zcode/plans/plan-sess_9dedb041-3430-4063-9835-8825229111bc.md delete mode 100644 .zcode/plans/plan-sess_b00c85f4-499c-4183-a5b5-4baf7a69aa0d.md delete mode 100644 .zcode/plans/plan-sess_b0cb1f55-5cfd-4620-9375-d1a8971ad205.md delete mode 100644 .zcode/plans/plan-sess_c373fb29-30ab-4cd5-8649-5347223b88e2.md delete mode 100644 .zcode/plans/plan-sess_c9ca98f3-5ff7-43eb-a99a-534e80b09c65.md delete mode 100644 .zcode/plans/plan-sess_ca260372-4464-45b6-9b12-89d77cf89137.md delete mode 100644 .zcode/plans/plan-sess_e1b7a731-938b-41a6-9e4c-bb973c7dc8b5.md delete mode 100644 .zcode/plans/plan-sess_f2f2d2d9-4d0c-497b-8524-0276e62cbe96.md diff --git a/.zcode/plans/plan-sess_059db36c-c073-4407-b8d4-b4f76e848ab1.md b/.zcode/plans/plan-sess_059db36c-c073-4407-b8d4-b4f76e848ab1.md deleted file mode 100644 index 1f4c3d70..00000000 --- a/.zcode/plans/plan-sess_059db36c-c073-4407-b8d4-b4f76e848ab1.md +++ /dev/null @@ -1,60 +0,0 @@ -# 用户公开主页通知按钮改为纯图标+未读角标 - -## 现状 -- 目标按钮: `templates/parts/user/author-hero.php:144-149`(仅 `$is_own` 查看自己主页时输出),当前为铃铛图标 + "消息" 文字,无角标。 -- 参照实现: 用户中心头部 `inc/helpers/user-center-renderers/profile-header.php:87-94` — `btn-ghost btn-sm btn-icon` 纯图标按钮,带 `aria-label`/`title`,未读数 > 0 时输出角标 `N`(不封顶 99)。 -- 未读数函数: `aksrt_get_user_unread_notification_count($user_id)`(`inc/modules/user-notifications.php:387`),模块经 `inc/bootstrap.php:78` 无条件加载,可直接调用。 -- hero 卡片仅由 `page-user-home.php` 服务端静态渲染一次(DOM 无刷新只作用于 tab 面板),角标为静态服务端渲染,与用户中心行为一致。 -- `.btn-icon` / `.btn-icon.btn-sm` 样式已存在于 `assets/css/core/buttons.css:129-136`,全局可用;但 `.uc-header__action-badge` 样式在 user-center 路由 CSS 中,不会在公开主页加载,需在 `assets/css/routes/user-home.css`(该页直接入队,无构建步骤)新增。 - -## 修改内容 - -### 1. `templates/parts/user/author-hero.php` -- 在第 58 行 `$messages_url` 之后新增: - ```php - $unread_count = $is_own ? aksrt_get_user_unread_notification_count($user_id) : 0; - ``` -- 将消息按钮(144-149 行)整体替换为与用户中心一致的纯图标形式,类名沿用本文件 BEM 前缀: - ```php - - - 0) : ?> - - - - ``` -- 删除原 `消息` 文字输出,不保留旧结构。 - -### 2. `assets/css/routes/user-home.css` -在 `.aksrt-author-hero__follow-btn` 样式附近(约 167 行后)新增,视觉与用户中心角标(`user-center/shell.css:136-157`)完全一致: -```css -.aksrt-author-hero__message-btn { - position: relative; -} - -.aksrt-author-hero__action-badge { - position: absolute; - top: -5px; - right: -5px; - display: inline-flex; - align-items: center; - justify-content: center; - min-width: 16px; - height: 16px; - margin: 0; - padding: 0 4px; - border-radius: 999px; - background: var(--color-error, #ef4444); - color: #fff; - font-size: 11px; - font-weight: 700; - line-height: 1; -} -``` - -## 验证 -- `php -l templates/parts/user/author-hero.php` -- 运行 `node --test tests/widget-system/page-display-contract.test.cjs tests/widget-system/post-visual-contract.test.cjs`(已确认两者均未断言该按钮标记,应保持通过) -- 桌面/移动端检查: 图标按钮为 28px 方形(`.btn-icon.btn-sm`),角标绝对定位右上角,移动端居中布局不受影响(角标不占布局空间) - -不写 function_exists 兜底、不保留文字版本、不添加迁移逻辑。 \ No newline at end of file diff --git a/.zcode/plans/plan-sess_196341fd-884c-4169-ba45-a896a6f0fd69.md b/.zcode/plans/plan-sess_196341fd-884c-4169-ba45-a896a6f0fd69.md deleted file mode 100644 index 476d703f..00000000 --- a/.zcode/plans/plan-sess_196341fd-884c-4169-ba45-a896a6f0fd69.md +++ /dev/null @@ -1,31 +0,0 @@ -修复文章详情页分割线右侧三点图标不居中的问题 - -## 根因 - -三点按钮(`inc/helpers/aksrt-single-components.php:131-146`)为 ``,位于 `templates/parts/single-author-bar.php` 中 `.single-meta-row` 分割线右端。`.but.cir` 是 `inline-flex; justify-content: center`,flex 居中的是子元素的 margin box。`assets/css/core/buttons.css` 中存在特异性冲突: - -- 第 183 行 `.but > i[class*="fa-"]:not(.fa-angle-right) { margin-right: 0.25em; }` 特异性 (0,3,1) -- 第 225 行 `.but.cir > .fa { margin: 0; }`(本意的重置规则)特异性 (0,3,0),被压掉 - -导致图标右侧残留 0.25em 外边距(15px 字号下约 3.75px),三点整体左偏约 1.9px。这是全局 bug,所有 `.but.cir` 图标按钮都受影响。 - -## 修改内容 - -1. **`assets/css/core/buttons.css:224-225`** — 加强重置规则的特异性到 (0,4,0),稳定压过 (0,3,1) 的 margin 规则(不依赖源码顺序): - ```css - .but.cir svg.icon, - .but.cir > .fa, - .but.cir > .fa:not(.fa-angle-right), - .but.cir > i[class*="fa-"]:not(.fa-angle-right) { margin: 0; } - ``` - 附一行注释说明 `:not()` 变体是为压过 `.but > i[class*="fa-"]:not(.fa-angle-right)` 的 margin 规则。保留原 `.but.cir > .fa` 选择器以继续覆盖 fa-angle-right 图标。不改 main.css(旧的手工捆绑副本):public 捆绑包中 core/buttons.css 副本排在 main.min.css 之后,高特异性重置必然胜出。 - -2. **重建捆绑包** — 运行 `node tools/build-public-assets.mjs`(esbuild 已就绪),重新生成 `assets/css/build/public.css/.min.css` 等捆绑文件。 - -3. **新增契约测试** `tests/widget-system/circular-button-icon-margin-contract.test.cjs`:断言源文件 buttons.css 与构建产物 public.min.css 中包含加强后的重置选择器(防止特异性回归),沿用现有 `*.test.cjs` 契约测试模式。 - -## 验证 - -- `node --test tests/widget-system/circular-button-icon-margin-contract.test.cjs` 通过 -- 在构建后的 `public.min.css` 中确认重置规则存在且位于 margin 规则之后 -- 刷新文章详情页目视确认三点图标在圆形按钮内水平居中(同时全站其他 `.but.cir` 图标按钮居中恢复正常) \ No newline at end of file diff --git a/.zcode/plans/plan-sess_23082cba-edb8-4cf5-9842-07e57ac15e1f.md b/.zcode/plans/plan-sess_23082cba-edb8-4cf5-9842-07e57ac15e1f.md deleted file mode 100644 index 198ef438..00000000 --- a/.zcode/plans/plan-sess_23082cba-edb8-4cf5-9842-07e57ac15e1f.md +++ /dev/null @@ -1,163 +0,0 @@ -## 目标与边界 - -将“全局功能 → Email邮件”收敛为一套真正可用的邮件系统:后台完整展示 SMTP、发件品牌、认证/账号、内容互动、审核、私信、身份/账号处理、举报,以及订单、支付、提现、返佣、分成、转账等商城/资金类邮件;模板主题和正文默认直接显示,不再用空值加 placeholder 代替;所有真实发送统一由同一服务渲染和发送。 - -明确排除: - -- 不实现论坛、版主、论坛帖子审核、回答采纳等论坛专属邮件。 -- 不实现邮箱回滚、撤销链接、回滚令牌或旧邮箱恢复流程;邮箱变更邮件只做安全通知。 -- 不做旧 option 的数据迁移,不保留新旧双路,不写兼容 adapter。 -- 不做浏览器或真实视觉验收,只做代码、契约、语法和构建验证。 - -## 1. 建立唯一邮件配置与模板目录 - -- 以 `aksrt_settings` 的 Email section 作为唯一配置来源;SMTP、品牌、通知开关和模板都通过 `/settings/schema/global/email` 读写。 -- 在邮件域建立集中式模板目录,统一声明每个非论坛事件的事件键、后台名称、默认开关、默认主题、默认 HTML 正文、占位符及说明。 -- 邮件运行时和后台 Schema 均从该目录生成,避免默认文案继续散落在业务调用点。 -- 对每个事件同时声明“开关、主题模板、正文模板”;模板正文在后台直接显示为非空默认值。数据库中已有空主题/正文时,仅在读取响应和表单初始化时解析为目录默认值,不执行迁移。 -- HTML 模板和 `mail_more_content` 使用 `wp_kses_post()` 清理;主题、SMTP host/username/name 等按文本清理;邮箱地址使用 `sanitize_email()`;端口限制到合法范围;加密方式只允许 `ssl`、`tls` 或空值;SMTP 密码使用 secret 掩码/清除机制。 - -## 2. 完整重做 Email 后台 Schema - -在 `src/Admin/Schema/GlobalSchema.php` 中由集中目录生成 Email section;让 `SchemaPage.vue` 对 `global.email` 使用服务端 Schema,删除前端重复的静态 Email schema 定义,避免 PHP/JS 两份字段漂移。 - -页面分组与事件如下: - -1. **管理员邮件推送** - - 友情链接提交 - - 新订单 - - 提现申请 - - 投稿待审核 - - 身份认证申请 - - 账号封禁申诉 - - 举报提交 - -2. **用户邮件推送** - - 注册验证码 - - 注册成功 - - 免密登录验证码 - - 密码重置验证码 - - 邮箱/敏感操作验证码 - - 邮箱变更安全通知 - - 新订单/支付结果 - - 提现处理结果 - - 返佣到账 - - 创作分成到账 - - 收到积分/余额转账 - - 评论通过审核 - - 评论回复 - - 投稿发布/驳回结果 - - 手机号修改通知 - - 身份认证审核结果 - - 账号封禁/解封通知 - - 举报处理结果 - - 私信通知 - - 私信邮件用户组限制 - - 所有用户 - - 所有会员 - - 二级会员及以上 - - 仅管理员 - -3. **自定义发件人/品牌** - - `mail_showname`,默认站点名 - - `mail_title_prefix`,默认 `[站点名]` - - `mail_description`,默认“此信为系统邮件,请不要直接回复。” - - `mail_more_content`,默认显示“访问网站 / 联系站长”等基础 HTML 链接 - -4. **SMTP 配置**(沿用参考主题语义,但使用当前主题唯一字段契约) - - `mail_smtps` - - `mail_name` - - `mail_passwd` - - `mail_smtp_name` - - `mail_host` - - `mail_port` - - `mail_smtpauth` - - `mail_smtpsecure` - - SMTP 风险提示和依赖显示 - -5. **测试邮件** - - Email 页面内提供测试收件地址和发送操作。 - - 有未保存修改时禁止测试并提示先保存,确保测试当前生效配置。 - - 测试邮件走统一 HTML 包装、品牌和 SMTP 主线。 - -每个事件组直接显示“启用开关 + 主题模板 + HTML 正文模板 + 可用占位符说明”。论坛事件不进入 Schema、模板目录、默认值或运行时注册。 - -## 3. 实现参考主题式统一邮件渲染 - -重构 `src/Settings/Mail.php` 和 `inc/core-hooks/part-2.php`: - -- 集中服务完成事件查询、开关判断、占位符替换、主题前缀、HTML 安全处理、品牌包装和 `wp_mail()` 调用。 -- 复刻参考主题邮件信封:站点 Logo、主体内容、站点名称、底部说明、附加链接及现有 `assets/img/mail-bg.png` 背景图。 -- 主题前缀只添加一次,并清除 WordPress 默认重复 `[站点名]` 前缀。 -- 发件人名称保留明确优先级:`mail_showname` → 站点名;SMTP 发件地址和 SMTPAuth 使用同一 Email section 的 `mail_*` 字段。 -- 将 `send_event_email()` 统一为事件键、收件人、占位符(必要时允许结构化上下文),默认模板不再由调用方重复传入。 -- 未知事件失败关闭;无效收件地址不发送;事件关闭时不发送。 -- 统一管理员收件人获取、去重和有效邮箱过滤。 - -## 4. 接通所有非论坛真实业务发送点 - -新增聚合通知注册类,基于当前主题已有 WordPress/AKSRT action 注册邮件发送;不凭空添加论坛功能。每个事件都复用集中模板目录和统一发送服务。 - -### 认证与账号 - -- 改造 `UserControllerAuthPhoneOperations.php`:注册验证码、免密登录验证码、密码重置验证码按独立事件发送;失败时删除验证码 transient,维持现有频率限制和安全行为。 -- 注册成功在用户创建成功且用户对象有效时发送,提供用户名、站点名、个人中心/站点链接等占位符。 -- 改造 `account-ajax.php`:敏感操作验证码、邮箱变更通知走统一服务;删除直接 `wp_mail()` fallback;不增加邮箱回滚。 -- 手机号绑定/换绑成功后向有效邮箱发送通知。 - -### 内容互动与审核 - -- 评论通过审核、评论回复:接入 WordPress 评论状态/回复钩子,避免重复状态流转、自己回复自己和无效邮箱。 -- 投稿待审核与发布/驳回结果:接入现有 `aksrt_new_posts_pending` 与文章状态转换,只处理当前主题实际支持的投稿内容,防止重复通知。 -- 友情链接提交:接入当前友情链接写入成功动作,向有效管理员邮箱发送。 - -### 身份、账号、举报和私信 - -- 身份认证申请/审核、封禁申诉/处理、举报提交/处理:接入现有成功动作;若成功路径缺少动作,只在事务成功点增加明确的 `aksrt_*` action。 -- 私信通知:接入现有消息/通知主线,只处理 private 类型;实现参考主题的用户组限制,并过滤无效或占位邮箱。 - -### 订单与资金业务(保留) - -- 订单创建/支付成功/支付失败或状态变化:接入当前支付订单状态 action,分别通知管理员、买家及适用的订单关联用户。 -- 提现申请与处理结果:接入当前提现申请、审核/完成/拒绝路径,通知管理员和申请用户。 -- 返佣通知:接入当前 referral/佣金到账 action,向推荐人发送订单和佣金信息。 -- 创作分成通知:接入当前 ledger/收益分配成功 action,向分成作者发送到账明细。 -- 积分/余额转账通知:接入当前资产转账完成 action,向收款用户发送转账信息。 -- 上述商城/资金事件只使用仓库中已存在的订单、支付、ledger、referral、资产动作和数据结构;若某事件没有可直接监听的成功动作,在对应现有事务完成点补充 action,不复制业务逻辑、不新建第二套交易流程。 - -论坛/版主/回答采纳动作不注册任何邮件监听器,也不产生对应模板字段。 - -## 5. 删除旧接口、旧存储与绕路代码 - -- 删除 `GlobalController` 的 `/settings/mail` 路由和 `rest_handle_mail()`,不再使用 `aksrt_mail_config`。 -- 保留 `/mail/test` 作为动作接口,但重写为统一邮件服务测试;配置读写只有 Schema 路由。 -- 删除前端 `getMailSettings()` / `saveMailSettings()`,只保留测试邮件 API 方法。 -- 删除 `UserController` 的 `/settings/mail-templates` 路由、`handle_mail_templates()` 和 `aksrt_mail_templates` 契约。 -- 删除 `Settings::get_smtp()` 对 `aksrt_mail_smtp` 的读取,并从 standalone/secret option 注册表移除该旧 option;SMTP 只读 Email section 的统一字段。 -- 删除认证、账号和各业务模块中邮件服务不存在时的直接 `wp_mail()` fallback;正常业务只允许集中邮件服务内部调用 `wp_mail()`。 -- 删除旧六事件空模板回退参数、重复前端 Email Schema 及不再使用的旧字段;不读取、不转换旧 option 值。 -- 不删除数据库中的旧 option 值,但代码完全停止消费它们;不执行迁移脚本或双写。 - -## 6. 契约测试与构建验证 - -新增邮件系统契约测试/harness,覆盖: - -- 后端 Email Schema 包含认证、账号、内容互动、审核、私信、身份/账号处理、举报、订单、支付、提现、返佣、分成、转账等事件。 -- Schema 明确不包含 `bbs`、moderator、answer-adopted 及其它论坛字段。 -- 每个主题和正文默认值非空;空存储读取时后台仍返回可见模板;模板占位符替换后无未知占位符。 -- HTML 邮件信封包含品牌说明、附加内容、Logo 和背景图;主题前缀不重复;发件人和 SMTP 字段优先级稳定。 -- SMTP 开关、认证、host、port、encryption、secret 掩码/清除行为正确。 -- 事件关闭、未知事件、无效收件地址均不发送。 -- 注册/登录/重置/邮箱变更路径不再绕过集中服务,发送失败时验证码缓存处理正确;不出现邮箱回滚入口或令牌。 -- 评论、投稿、友情链接、身份认证、封禁、举报、私信及所有订单/资金事件分别绑定真实 action,并覆盖去重、无效邮箱和边界条件。 -- 论坛事件不注册、不发送、不出现在后台;订单/支付/提现/返佣/分成/转账事件必须存在并可配置。 -- 旧 `/settings/mail`、`/settings/mail-templates`、`aksrt_mail_config`、`aksrt_mail_templates`、`aksrt_mail_smtp` 和旧前端 API 不再存在。 -- 全仓库业务代码中的 `wp_mail()` 只剩集中邮件服务内部调用。 - -执行验证: - -1. 对所有变更 PHP 文件运行 `php -l`。 -2. 运行新增邮件契约测试及受影响的 admin/UI 契约测试。 -3. 在 `assets/admin` 执行 `npm run build`,由 Vite 清理旧 chunk 并更新完整 `assets/admin/build/`。 -4. 使用 `rg` 做最终静态检查:无论坛邮件字段、无旧 option/API、无散落直接 `wp_mail()`,且订单/支付/提现/返佣/分成/转账事件均有 Schema、模板目录和发送入口。 -5. 不启动浏览器、不截图、不做真实视觉效果验收。 \ No newline at end of file diff --git a/.zcode/plans/plan-sess_618c6a75-f949-4ad5-9440-eb9e01b542f8.md b/.zcode/plans/plan-sess_618c6a75-f949-4ad5-9440-eb9e01b542f8.md deleted file mode 100644 index dd9d2b80..00000000 --- a/.zcode/plans/plan-sess_618c6a75-f949-4ad5-9440-eb9e01b542f8.md +++ /dev/null @@ -1,56 +0,0 @@ -## 目标与口径 - -将 AKSRT 小工具系统中 12 个小工具对照 Zibll(仅参考"(新)"模块,忽略一切"旧版即将删除")做全量 1:1 复刻:后台配置项(字段、类型、选项、默认值、依赖、min/max/step、分组小标题)与前端 DOM/样式/状态全部对齐参考主题。已确认口径: -- **专题全部移除**:本项目无 topics 分类法,12 个小工具范围内所有"专题限制"字段与 `PostQuery` 的 topics 查询分支一并删除,测试同步更新。 -- **修正参考源码明显 bug 的文案**(如排序 label 颠倒、最近评论 style 默认值 'card' 不在选项中),数据值与行为保持一致。 -- **省略 AKSRT 无法支撑的排序选项**(销售价格/积分售价/销售数量),排序值域 = views/like/comment_count/favorite/modified/date/rand。 -- **新增"搜索式多选+拖拽排序"分类选择字段**(terms 类型)。 -- 不写双路/迁移;清理被替换的死代码;不做 Docker 视觉验收;不改 37 个 slug 与 REST 路由形态。 - -## 复用基础(已核实) - -- 文章 item DOM 契约已在 `inc/helpers/posts-renderer/markup.php`(posts-item/posts-mini/badges/meta,9.0 契约);`main.css` 已含 `.zci-*`、`.zps-*`、`.graphic*` 等 Zibll 同款 CSS(76 处命中);`frontend.css:179-228` 已有 tab/slider 的 Zibll 契约块;runtime `main.js` 已有 `.swiper-scroll`/`.new-swiper` 初始化。复刻 = 补齐缺失部分并对齐 markup,而非从零移植。 -- 前次复刻先例:tab_posts/slider/buttons/notice 走 `FrontendRenderer` "特殊壳"路径(before_widget + reference_title + 内容自闭环),本次 12 个中需要 Zibll 壳的一并加入该列表。 - -## 实施步骤 - -### Phase A 基础设施 -1. `FieldSchema.php`/`FormRenderer.php`:新增 `terms` 字段类型(动态 get_terms 分类选项、搜索过滤、拖拽排序、按选择顺序保存 int 数组;支持 taxonomy 参数以供合作伙伴的链接分类复用);spinner/slider 渲染 `unit` 后缀(此前 unit 是死键)。 -2. `PostQuery.php`:删除 topics 分支;tabs 段支持 `zibpay_type`(数组,沿用 apply_pay_type 映射 1/2/5/6);orderby 值域与 allowlist 对齐。 -3. `PostRenderer.php`:分页三态对齐 Zibll —— `''`→隐藏 `.ajax-pag.hide` 占位、`ajax`→"加载更多" `.ajax-pag .next-page.ajax-next`、`number`→`.pagenav.ajax-pag` 数字页码(全部带 `ajaxpager-target=".widget-ajaxpager"` 契约,REST 数据属性保留);`mini_opt` 应用于 posts;热榜从通用分支拆出专用渲染。 -4. `FrontendRenderer.php`:特殊壳列表加入 `posts, oneline_posts, hot_posts, term_cards, term_aggregation, media_cards, combo_info, partners, recent_comments, posts_toc`。 -5. `frontend.js`:移植/新增 ①IAS IntersectionObserver 懒加载(列表 `load_mode=ajax` 与加载更多自动触发,替代 Zibll lazysizes ias);②合作伙伴滚动初始化(测量 seed 组宽→克隆→`--zps-duration`,resize 重算,Zibll main.js:4204-4296);③幻灯片组合卡 footer 重算 `--cover-ratio`(widget-slider.php:848-875);④目录树逻辑(section-navs 移植:h1-h4 抓取、排除 `.item-heading`/`.no-nav`、`wznav_{i}`、scrollspy offset 105、>380px 折叠、hash 定位);保持 role=status/aria-busy/reduced-motion a11y 契约。 -6. `admin.js`/`admin-core.js`/`admin.css`:terms 字段交互(搜索、拖拽排序、选序同步)。 - -### Phase B 逐个小工具(schema+render+CSS+JS+空态,均以参考文件为准逐字段移植) - -| # | AKSRT slug | 参考定义(行号) | 要点 | -|---|---|---|---| -| 1 | posts 文章列表 | widget-posts.php:1881-2006 | load_mode radio(detail/ajax 默认 ajax)、cat(reference_ids)、zibpay_type checkbox、limit_day、orderby、order、style(list/card/mini)+mini_opt、count 4..20 默认 12、paginate radio ''/ajax/number;壳 `widget-main-post mb20 style-X`(mini 加 `zib-widget posts-mini-lists`);删旧 tag_ids/paginate select | -| 2 | tab_posts 多栏目文章 | widget-posts.php:2008-2155 | tabs 子字段 title/cat/zibpay_type/limit_day/orderby/order;移除 topics;**删除现有 legacy `post_ajax_trigger` 双路**,翻页三态;mini 骨架含缩略图变体 | -| 3 | oneline_posts 横向滚动文章 | widget-posts.php:2157-2234 | cat/zibpay_type/orderby/order/style 默认 card/count;移除 limit_day/paginate/autoplay(参考无);swiper-scroll DOM 已对齐,清 data-autoplay | -| 4 | hot_posts 热榜文章 | widget-posts.php:1803-1851 + zib-posts-list.php:769-888 | orderby radio 4 榜单、limit_day、count 默认 6、target_blank;`zib-widget hot-posts`、TOP1 大图+linear-mask+TOP 徽章(jb-red/jb-yellow/b-gray)、行布局与计数文案(人收藏/人点赞/条讨论/人已阅读);删 show_thumbnail/通用样式字段 | -| 5 | term_cards 分类图文卡片 | widget-posts.php:1565-1694 + functions.php:1939-2046 | 模块级 obs_animation/animation_repeat(common.animation 关)、terms 选择器、type style-1..4、height_scale、pc_row(1/2/3/4/6/12 默认 2)/m_row、mask_opacity 默认 10、target_blank;`row gutters-5` + `graphic hover-zoom-img` + `--cover-height-scale` + graphic-mask,style-2/3/4 文案差异与 tooltip;新建共享助手 `aksrt_graphic_card()`(inc/helpers),term 分类默认封面回退 | -| 6 | term_aggregation → 改名"分类聚合卡片" | widget-posts.php:1696-1801 + zib-category.php:606-751 | 仅分类(去标签/专题):模块级动画、pc_row slider 1..2 默认 2、terms、orderby/order、count 1..20 默认 4、target_blank;移植 `zib-widget term-aggregation`(term-img+img-badge 浏览合计、term-title/meta/更多文章、按 orderby 的行内 meta、--delay 交错);Catalog 名称/描述/共同字段更新;服务端仅 category | -| 7 | media_cards 图文视频封面卡片 | widget-more.php:2005-2191 | 模块级动画、pc_row/m_row(1..12,默认 4/2)、mask_opacity、height_scale 默认 30、font_size_pc/m、font_bold、font_color、covers group{image,video,hide,title,link};`widget-graphic-cover` + this-font 变量 + 移动端回退图片;删旧 description/image_dark 卡片字段 | -| 8 | slider_media_combo 幻灯片加图文视频卡片 | widget-slider.php:361-887 | 模块级动画;补 5 个 subheading 分组;option 默认值逐项核对(源文件为准);m_layout_type=default 时 m_row=pc_row;clamp 上限 4/6 修正;footer 重算 JS 接入 | -| 9 | partners 横向滚动合作伙伴 | widget-more.php:2317-2581 | rows/m_rows 1..6 默认 3、style_type card/logo/chip、card_width/height(依赖)、card_bg/card_radius、speed slider 0.1..10 步 0.1、direction/pause_hover/show_widget_bg/go_link/end_fade、link_type(link 类别多选用 terms 类型 taxonomy=link_category/link_limit/link_orderby/page_links_order)、partners group{title,desc,image,link};zps-* DOM、round-robin 行分配、get_bookmarks 来源、go_link 走 aksrt_go_link、CSS 动画(已有)+JS 初始化 | -| 10 | combo_info 复合信息卡片 | widget-more.php:2583-2833 | 模块级动画、pc_row 2/3/4/6 默认 4、m_row 1/2、pc_gap/m_gap(gutters)、card_radius、top_band/top_band_height、go_link、cta_text/cta_color、cards group{title,icon,icon_image,tags 嵌套 group{text,color},desc,link,cta_text,cta_color,band_color auto/7色};zci-* DOM + band auto 循环 + --delay 交错;markup 改挂到已有 `.aksrt-combo-info-card` CSS;删 aksrt-combo-card 死代码 | -| 11 | recent_comments 最近评论 | widget-more.php:3315-3363 + zib-comments-list.php:340-407 | limit 1..50 默认 8、outer/outpost、show_source 默认 false、style radio(''简约/style_2 风格2,默认修正为 '');`box-body comment-mini-lists zib-widget` + comment-widget-item(avatar box、昵称+icon-spot 时间、点赞、con-link text-ellipsis-5、style_2 盒装、来源行);复用 inc/helpers/aksrt-comments.php 时间/头像,内容过滤图片→[图片] | -| 12 | posts_toc 文章目录树 | widget-more.php:445-532 | 改旧式字段:title 默认"文章目录"、mini_title、in_affix(删 min_headings/collapsed/offset);渲染空占位 `.posts-nav-box[data-title]`;目录构建/scrollspy/折叠全部移入 frontend.js;`.posts-nav-lists` CSS 若缺则从 main.css:4835-4946 补 | - -### Phase C 死代码清理 -- 删除被替换的渲染分支与 CSS:aksrt-term-cards、aksrt-term-aggregation、aksrt-combo-card、aksrt-widget-partners 旧轨、aksrt-widget-media-cards/comments/toc/pagination/load-more 旧标记、tab_posts legacy trigger、hot_posts 的 show_thumbnail、oneline 的 autoplay;`media_card_fields()` 仍被 knowledge_product 组使用故保留,仅解除 12 个目标对它的引用。 - -### Phase D 测试与校验 -- `tests/widget-system/run.php`:query_contract 移除 topics、加 tab zibpay_type;modern_widget_contract 扩充 12 个的 schema/DOM 断言;保持既有断言全绿。 -- 新增 `tests/widget-system/zibll-parity-widgets-contract.test.cjs`(node --test 源码 token 契约:每 widget 的字段 id 清单、关键 DOM 类、CSS token、frontend.js 行为、死类负向断言)。 -- 更新受影响的 zibll-modern-widgets / post-visual / a11y 契约测试(保持 aria-busy、role=status、reduced-motion)。 -- 重新生成 `tests/fixtures/widget-golden-v1.json`(php tools/generate-widget-golden-fixture.php)并跑 php tools/validate-widget-golden.php(不带 --require-results)。 -- 验证:`php -l` 全部改动 PHP;`node --test tests/widget-system/` 全量;`composer dump-autoload -o`(优先不新增类,仅改现有文件)。 - -### 明确不做 -不做旧设置迁移与双路渲染;不做真实视觉/Docker 验收;不参考"(旧版即将删除)"模块;不改 37 slug 顺序、REST 路由形态、其他 25 个小工具。 - -### 主要参考文件 -zibll:`inc/widgets/widget-posts.php`、`widget-more.php`、`widget-slider.php`、`inc/functions/{zib-posts-list,zib-category,functions}.php`、`js/section-navs.js`、`js/main.js`、`css/main.css`;AKSRT:`src/WidgetSystem/*`、`inc/helpers/*`、`assets/widgets/*`、`tests/widget-system/*`。 \ No newline at end of file diff --git a/.zcode/plans/plan-sess_624e69d1-0139-4583-9979-fd787b532bb1.md b/.zcode/plans/plan-sess_624e69d1-0139-4583-9979-fd787b532bb1.md deleted file mode 100644 index 5240ac1e..00000000 --- a/.zcode/plans/plan-sess_624e69d1-0139-4583-9979-fd787b532bb1.md +++ /dev/null @@ -1,16 +0,0 @@ -诊断结论(已核实): - -`video-player.js:177` 是 `toggle()` 中的 `this.video.play()`。播放器进入“无可播放源”状态后,点击封面/遮罩触发 `toggle()`,该 Promise 没有 catch,于是抛出 `Uncaught (in promise) NotSupportedError: The element has no supported sources`。播放器进入无源状态有四条已确认路径: -1. `.m3u8` 在 Chrome:hls.js 从 `cdn.jsdelivr.net` 懒加载(video-player.js:22),CDN 不可达时 `loadScript` 静默失败(promise 也未 catch),`