kate522
039fa6d863
feat(after-sale): 处理记录时间线改为「节点 + 状态 + 时间」同一行
...
原实现把状态与时间竖排在节点右侧的 88px 固定列里,状态文字一长就折行、
时间被挤到第三行,和右侧备注也对不齐。改为节点独占一列,状态与时间包在
head 里紧随其后,处理备注另起一行:
- [节点][处理状态][时间] 一行,状态色仍按工单状态走 --as-accent
- 竖线改挂到条目的 ::before(原来是 aside 的),top 从 12px 调到 14px,
与加了 4px 上边距的节点底部对齐,绳子依旧穿过每个节且末项不收口
- head 用 flex + baseline + gap:8px,状态过长时时间自然换行而不重叠
- 售后详细弹窗与订单详情弹窗共用同一套标记,两侧同步改
验证:tests/widget-system/ 462 项、tests/admin/ 76 项通过;用 node 分别抽取
两个 JS 里的时间线构造函数跑样例载荷,确认输出为
[节点][状态][时间] + 另起一行的备注;重建 public.css / public.min.css,
diff 仅限时间线规则。未做浏览器视觉验收。
2026-10-09 18:01:16 +08:00
kate522
26ce9a5904
feat(after-sale): 售后处理记录改为每次提交留痕并新增时间线
...
工单行内新增 handling_log 列,用户申请、用户撤销与后台每次改状态都落一条
「状态 + 备注 + 来源 + 时间」,按时间正序存放、上限 50 条(对齐
MetaAssetService::MAX_RECORDS)。set_status 因此变成读-改-写,补上
GET_LOCK/RELEASE_LOCK 包裹,并在锁内重读工单快照——锁外取快照仍会被并发
追加覆盖。
三处界面由「只显示最后一条」改为回放整条处理链路:
- 后台订单明细「售后记录」按工单渲染头部(状态/金额/申请时间)+ 原因 +
完整处理记录
- 售后面板手风琴「处理备注」单独占整行并置于「申请说明」上方,删掉已无
意义的「审核时间」
- 前台售后详细弹窗与订单详情弹窗的售后记录改为时间线:左列绳结状态条
(节点 + 状态 + 时间),右列处理备注;样式只在 modal-runtime.css 定义
一份,两个弹窗共用
清理随之失效的死代码:工单的 admin_note / reviewed_at / completed_at,以及
全仓库无写入方的 gateway_request_id / gateway_refund_id / gateway_result;
连带删掉 gatewayResultText()、uninstall 里从未存在过的 aksrt_after_sale
表项,并把两处后台页面重复的状态标签数组收成 after_sale_status_labels()、
重复的 .aksrt-as-log 样式收成 after_sale_log_css()。
顺带修复 88669f69 重构退款流水线时误删 refund_amount()、却仍在 create()
里调用的问题——此前任何用户提交售后都会直接 fatal。
验证:tests/widget-system/ 462 项、tests/admin/ 76 项通过;新增
after-sale-log-harness.php 驱动真实 AfterSaleService,覆盖首条日志、空备注
也留痕、撤销记录、50 条上限与畸形行规范化;两个后台页面经 dev harness
渲染校验「处理备注」宽行位于「申请说明」之前;未做浏览器视觉验收。
2026-10-09 13:59:50 +08:00
kate522
31e6ba00af
fix(after-sale): 售后举证缩略图去掉原生 loading 属性
...
lazyload 契约测试全仓库禁 loading=lazy/eager,售后服务 accordion 详情里的
举证缩略图带着该属性,是唯一一处违规(80373746 引入,早于本次分页改造)。
去掉它:后台页面不加载 lazySizes 运行时,原生 loading 也不会被主题那套
接管;与 UsersMenusVerify 的后台缩略图保持一致(光 <img src>)。
验证:tests/widget-system/ 459/459 通过(此前 458/459)。
2026-10-09 12:04:48 +08:00
kate522
89ae462610
Merge pull request 'fix(admin): 支付中心分页条改回四按钮式' ( #39 ) from worktree/pay-pages-pagination-style into main
...
Reviewed-on: #39
2026-10-09 03:56:25 +00:00
kate522
afd08885fc
fix(admin): 支付中心分页条改回四按钮式
...
AdminListPagination 的输出标记从 WP 原生 paginate_links() 换回「卡密管理」
原版的四按钮式:`« ‹ 第 X 页,共 Y 页 › »` +「每页 X 共Y」计数,没有数字页码
链接。七个页面调用点不变,外观统一为卡密管理那一套。
- 删除 $total_pages <= 1 早退:只要总数 > 0 就渲染分页条,单页时四枚按钮全
disabled —— 与原版 render_pagenavi 行为一致
- 基准 URL 与页码夹取沿用现有实现(显式拼装、夹到 [1, total_pages]),
这两处缺陷修复不动
- 标题属性由 esc_attr_e() 改为 esc_attr__():输出相同,且同文件与 dev harness
都只用后者
- 新增私有静态 print_assets(),由 render() 调用并以 $assets_printed 保证每页
只输出一次;内容只有 .tablenav-pages a.disabled { pointer-events: none; }
及其注释。这些原生后台页面不加载主题 CSS,故随标记内联
清理 harness 中已无人调用的 number_format_i18n() 与 paginate_links() stub。
验证:tests/admin/ 76 项通过;tests/widget-system/ 458/459(仅剩与本次无关的
lazyload-contract 既有失败);用 git show HEAD~1 取出原 render_pagenavi() 与
新助手在 8 组输入(含单页、总数为 0、per_page 为 0、页码越界)下比对,规范化
空白后输出逐字节一致;harness 渲染售后面板确认四按钮标记与内联样式就位。
2026-10-09 11:49:16 +08:00
kate522
536ac67f3c
Merge pull request 'feat(admin): 支付中心列表页统一为 WP 原生分页' ( #38 ) from worktree/pay-pages-pagination into main
...
Reviewed-on: #38
2026-10-08 14:23:19 +00:00
kate522
7b83893cf6
feat(admin): 支付中心列表页统一为 WP 原生分页
...
七个支付中心列表页(订单明细 / 售后服务 / 付费文章 / 优惠码 / 创作分成 /
提现审核 / 卡密管理)的分页收敛到共享助手 AdminListPagination,改用 WP 原生
paginate_links() 渲染。
- 基准 URL 显式以 page 参数 + 当前筛选参数拼装,不再让两个参数的
add_query_arg('paged', ...) 退回 $_SERVER['REQUEST_URI']:链接不再随当前
请求形态漂移,列条件也不再丢失
- 售后服务从写死的 limit => 100 改为 limit/offset 分页,总数接上原本零调用的
AfterSaleService::count();after_sale_status 先按状态常量归一,保证 count()
与 admin_list() 口径一致,分页条不说谎
- 每页 20 条,统一来自 AdminListPagination::DEFAULT_PER_PAGE
- 每页在查询前夹取页码,越界时回退到最后一页并重查,杜绝「空表且没有分页条」
的死胡同;页码夹取与早退也一并收敛到助手
- 提现审核的翻页链接排除 retry_id / retry_key 两个一次性动作参数
- 订单明细的标签页与翻页链接共用同一份筛选参数,不再各写一份
清理死代码:五个页面里近乎复制的 render_pagination()(其中订单明细与提现审核
两份从未被调用)、两页重复的内联 paginate_links 块、卡密管理的 render_pagenavi()
及其 docblock、PayChargeCards::DEFAULT_PER_PAGE 常量,以及只服务自定义禁用
按钮的 .tablenav-pages a.disabled 规则。
验证:tests/admin/ 76 项通过(新增 pay-pages-pagination.test.cjs,重写
charge-cards-pagination.test.cjs);用 git show HEAD 取出原文件对比,订单明细
与售后服务两页在新旧实现下渲染输出逐字节相同。
2026-10-08 22:22:08 +08:00
kate522
83c164a427
feat(admin): 订单明细页已支付订单新增「退款」按钮
...
操作栏「详情」右侧为已支付订单渲染「退款」按钮:点击经 aksrt_pay_refund_order 把订单推到已退款。
退款沿既有的受闸路径执行:OrderRepository::update_status 要求 allow_refund,且 can_finalize_order_refund 要求该售后工单仍为待审核/处理中。因此工单号由服务端按订单号反查 find_active 得到,客户端只提交订单号;没有进行中的工单时整次操作中止并给出可操作提示,不会出现订单已退款但无工单依据的状态。
按钮仅在已支付订单上渲染——已退款是已支付的唯一后继状态,其他状态点击也只会在服务端被拒。附带清理 AfterSaleService::find_active 上方一处早已错配的 @param 文档注释(描述的是 \,与该函数签名无关)。
2026-10-08 21:14:56 +08:00
kate522
5fd8c6fc31
feat(after-sale): 售后面板新增「标记订单已退款」勾选项
...
展开的操作面板在状态下拉与备注旁新增「标记订单已退款」勾选框:勾选后点击确认,会先把关联订单推到已退款,再更新售后工单状态。订单本已退款时勾选框呈现为不可改的已选状态,且不提交该标记。
顺序不能反:OrderRepository::update_status 的退款闸门要求售后工单仍为待审核/处理中,一旦 set_status 先执行就不再放行。因此退款失败时整次操作中止,避免出现「工单已关、订单未退」的半完成状态。订单号由服务端按 after_sale_id 反查,不经客户端传递。
AfterSaleService::get() 由 private 改为 public 以支撑该反查。dev harness 扩展为可驱动 handler 的六个场景,覆盖勾选/未勾选、重复退款、非已支付订单、已关闭工单与非法状态。
2026-10-08 21:03:23 +08:00
kate522
b733e41993
fix(admin): 售后展开面板删除渠道结果并铺满状态面板宽度
...
展开详情去掉「渠道结果」字段,并清理其已无人读取的 gateway_result / gateway_text 解析。详情字段栅格由 auto-fill 改为按断点固定列数:普通字段 10 项可被 2 / 5 整除,配合整行的「申请说明」,行尾不再留白。状态面板去掉 max-width:720px,改为整行 flex——售后状态下拉与备注横向排布占满左侧,取消/确认贴右端,消除右侧大片空白。
2026-10-08 19:01:56 +08:00
kate522
88669f6989
refactor(after-sale): replace review decisions with direct status panel
...
售后面板改为状态下拉(待审核/处理中/已完成/已拒绝/已取消)加确认/取消按钮:取消仅收起手风琴,确认为纯状态更新;删除已通过状态、review() 决策机制及其专用退款流水线,无双路无迁移;举证图片并入申请说明列与详情整行。
2026-10-08 11:05:08 +08:00
kate522
80373746f8
feat(admin): 售后列表改为手风琴展开详情并内联审核表单
2026-10-07 23:38:30 +08:00
kate522
d2034f5031
test(admin): 契约覆盖点击展开的操作面板与批量操作
2026-10-07 08:46:43 +00:00
kate522
ad2290cbb7
feat(admin): 售后操作列改为点击「操作」展开快捷面板;新增顶部批量通过/批量拒绝(含复选框与全选)
2026-10-07 08:46:41 +00:00
kate522
c870f08395
test(admin): 契约覆盖售后快捷操作
2026-10-07 08:42:09 +00:00
kate522
80fb4068d1
feat(admin): 售后操作列改为 WP 文章列表式 row-actions 悬停快捷操作(JS POST 提交,拒绝时 prompt 填备注)
2026-10-07 08:42:07 +00:00
kate522
01cd734989
test(admin): 契约覆盖举证图片列
2026-10-07 08:36:05 +00:00
kate522
f44180d06c
feat(admin): 售后服务表格新增「举证图片」列,展示申请上传的图片缩略图
2026-10-07 08:36:03 +00:00
kate522
c7d18d426c
test(admin): 契约覆盖售后表格新列与策略摘要
2026-10-07 08:32:16 +00:00
kate522
0ec405f566
fix(admin): 售后服务页表头对齐售后策略配置项:原因/申请资料/申请说明分列,页头展示策略摘要
2026-10-07 08:32:14 +00:00
kate522
dd320c99c1
test(admin): 契约测试同步菜单结构调整(无 Tab/独立售后菜单)
2026-10-07 08:28:30 +00:00
kate522
fc75d7b810
chore(admin): 删除统计页专用的 get_admin_order_stats(已无调用)
2026-10-07 08:28:27 +00:00
kate522
b3012b3133
feat(admin): 订单明细页去掉 Tab 分页;售后独立为「售后服务」子菜单;删除统计页
2026-10-07 08:28:25 +00:00
kate522
ab6c2339a0
feat(admin): 支付中心新增「售后服务」子菜单
2026-10-07 08:28:23 +00:00
kate522
3eb9cc739c
style(modal): 售后与订单弹窗底部按钮满幅化并优化悬停反馈
2026-10-07 10:18:48 +08:00
kate522
e9a1a75259
fix(styles): 还原弹窗 footer 相邻按钮分界线并补悬停阴影
...
被平铺规则的 border:0 抹掉的 legacy 分隔线按家族色还原,售后四弹窗与订单详情同款;更新构建产物与契约测试。
2026-10-07 09:53:10 +08:00
kate522
d69e1d33c3
fix(orders): 修复再次申请售后被 has_application 分流回售后详细的问题并对齐底部按钮观感
2026-10-07 09:43:22 +08:00
kate522
8023e2e472
feat(after-sale): 支持撤销售后工单并接入人机验证
2026-10-07 09:20:59 +08:00
kate522
918ca371be
chore(repo): 行尾规范化,恢复索引 LF 契约
...
远端 9 个文件以 CRLF 入库,违反 .gitattributes「索引一律 LF」声明,
在 autocrlf=true 的工作区产生永久假脏并阻塞合并。仅行尾变化,无内容改动。
2026-10-07 09:13:42 +08:00
kate522
9e3267fef4
test(payment): 契约测试同步弹窗底部与记录卡片新行为
2026-10-06 23:50:33 +00:00
kate522
6081e8dcc9
style(payment): 订单详情底部适配主题按钮网格;记录卡片新增样式
2026-10-06 23:50:31 +00:00
kate522
c801ff5047
feat(payment): 订单详情底部改用主题按钮样式;记录卡片加查看详细与原因/申请理由
2026-10-06 23:50:30 +00:00
kate522
8460132feb
feat(payment): 售后详细弹窗底部精简为单个主按钮,去掉阻断文案
2026-10-06 23:50:28 +00:00
kate522
732f615a09
style(payment): 炫彩标题区样式扩展到订单详情弹窗
2026-10-06 18:27:27 +00:00
kate522
738abe5102
style(payment): 订单详情弹窗 modal-mini 几何(400px)
2026-10-06 18:27:25 +00:00
kate522
915311dcb6
feat(payment): 订单详情弹窗统一为 modal-mini + 蓝色炫彩标题区
2026-10-06 18:27:23 +00:00
kate522
c200427358
test(payment): 售后契约测试同步结构化表单与可再次申请新行为
2026-10-06 18:08:08 +00:00
kate522
7b5dcf16a1
style(payment): 订单详情弹窗售后记录卡片样式
2026-10-06 18:08:06 +00:00
kate522
2db2414270
style(payment): 订单详情弹窗售后记录改为卡片式 UI
2026-10-06 18:08:04 +00:00
kate522
365b2eafe5
feat(payment): 售后详细弹窗申请表单分行展示(原因/申请资料/申请说明)
2026-10-06 18:08:02 +00:00
kate522
ea88499996
feat(payment): schema 版本升至 2.5.2(apply_form 列迁移)
2026-10-06 18:08:00 +00:00
kate522
f4ff3e16d4
feat(payment): schema 2.5.2 新增 order_aftersale.apply_form 列
2026-10-06 18:07:58 +00:00
kate522
c67d5ae4bc
feat(payment): 可再次申请售后按工单状态判定(rejected/cancelled 可再次申请)
2026-10-06 18:07:56 +00:00
kate522
00a087b1a4
feat(payment): 售后申请表单结构化入库(预置原因/申请资料/申请说明独立存储)
2026-10-06 18:07:53 +00:00
kate522
a0f59826fe
fix(payment): 售后弹窗滚动容器改用 no-scrollbar,消除弹窗边缘滚动栏
...
mini-scrollbar 是 3px 可见细滚动条(举报弹窗 600px 宽弹窗用的写法);
modal-mini 这类带炫彩横幅的表单弹窗,主题统一走禁封申诉/记录弹窗的口径:
scroll-y + no-scrollbar 完全隐藏滚动条(含细滚动条)+ 50vh 内层滚动。
申请与售后详细两个滚动容器一并切换,滚动行为不变、只是不再露出滚动栏。
2026-10-06 23:38:18 +08:00
kate522
e7e281f10c
fix(payment): 售后入口监听改为脚本加载即挂载,去掉 auto_fun 时序依赖
...
入口本就是 document 级委托、不需要 DOM 扫描,此前只挂在 auto_fun 上等于
多依赖一次全局重扫的触发时机;脚本加载时立即挂载(auto_fun 钩子保留作幂等
重扫),任何时刻的首次点击都能同步弹窗。
2026-10-06 23:32:19 +08:00
kate522
93579cbc9f
fix(payment): 售后弹窗改为按钮载荷同步弹出,修复首次点击无反馈
...
原实现是「点击 → 先请求 /orders/{n} → 再弹窗」,与项目里所有可用弹窗
(含举报链路 report.js)不同构:举报弹窗把数据放在按钮 data-* 属性里同步
弹出。前置请求会让首次点击在请求返回前毫无反应,体感就是"得二次点击"。
- 按钮 data-aksrt-after-sale-apply / -detail 携带订单与售后状态载荷
(PHP 模板与 order-center.js 的 actionHtml 同构生成),点击当拍即开
对应弹窗:申请表单 / 超时效提示 / 售后详细,零前置请求
- 「再次申请售后」同样使用已渲染载荷,不再重新拉取订单
- 提交与图片上传仍走 REST,服务端校验不变;列表刷新后载荷随之更新
- jsdom 多脚本环境实测:三种入口均在点击同一拍弹出且 fetch 计数为 0
2026-10-06 23:29:59 +08:00
kate522
4ea02f25ac
fix(payment): 补升 schema 版本使售后举证图片列在已安装站点生效
...
order_aftersale 新增 images 列时未同步升 SCHEMA_VERSION,而 dbDelta 只在版本
变化时重跑,已安装站点不会执行 ALTER TABLE,提交售后申请直接报
Unknown column 'images'。SCHEMA_VERSION 2.5.0 -> 2.5.1,并在契约测试中
锁定「列变更必须同步升版本」,部署后进入一次 wp-admin 即自动补列。
2026-10-06 22:37:32 +08:00
kate522
1a9a2762f3
feat(payment): 新增「售后策略」配置与前台售后弹窗链路
...
- 后台「支付&付费 → 售后策略」:售后功能开关、申请时效、超时效提示(HTML)、
预置原因、申请售后说明、所需材料、申请说明占位文案、可上传图片开关;
PHP schema 与 SPA schema 1:1 对齐,group 字段支持拖拽排序
- PaymentRuntime 新增售后设置解析(缺键回退 schema 默认、HTML 走 kses、
中文原因稳定 slug)与 after_sale_expired 时效判定(支付时间起算)
- 售后工单支持举证图片(order_aftersale.images 列,最多 3 张,
复用评论图片上传校验)与上传路由;订单视图模型输出 after_sale 按钮状态
- 前台申请 / 超时效提示 / 售后详细三个独立弹窗(modal-mini + 蓝色炫彩头),
订单详情弹窗不再内嵌售后表单并清理相关死代码
- 新增 after-sale-policy 契约测试与运行时 harness,527 项契约测试通过
2026-10-06 22:21:47 +08:00
kate522
b447c41f13
refactor(admin): 清理付费 meta 死字段并补齐商品介绍渲染
...
延续上一轮 pay_count「只写不读」的排查,把其余写而不读的字段一次
性处理完。按字段性质分两类处理,不是一律删。
【删除】纯数据垃圾,无界面入口、无消费方:
- card_keys / purchase_limit / stock:只有 DomainModel 的默认值与
sanitize,全仓零引用。契约测试原本还断言它们不得出现在 metabox 上。
- 随 card_keys 一并删除 sanitle_card_keys() 助手。
- video_scale_height「固定长宽比例」:参考主题里这是轮播组件 widget
的参数,不属于付费视频字段,当初误搬到付费 metabox 上且从未被消费。
连默认值、sanitize、metabox 保存项一起移除,并同步修正契约测试。
【补齐】有界面入口、管理员填了但不显示的四个字段:
pay_title / pay_doc / pay_details / pay_extra_hide 此前只有 metabox
输入框和 sanitize,前端一个都不读。按参考主题 pages/download.php
的结构接到单篇资源下载页:
- pay_title 有值则替代文章标题作商品标题(回退 get_the_title);
- pay_doc 商品简介、pay_details 更多详情渲染在标题区下方;
- pay_extra_hide 额外隐藏内容只在有下载权限时渲染在下载盒之后。
三处 HTML 输出均走 wp_kses_post,与 sanitize 侧的安全 HTML 口径一致。
同时把 pay_extra_hide 接进文章页付费盒
(aksrt_get_paid_box_html):该函数本身只在有付费权限时执行,天然
就是「付费后才可见」的位置,复用已有的 .pay-extra-hide 样式。
验证:php -l 四个 PHP 文件无语法错误;
node --test tests/widget-system/*.test.cjs 449 项全部通过。
2026-10-06 20:17:58 +08:00
kate522
8e1fd0a30f
fix(admin): 让后台「销量浮动」设置真正生效
...
资源 metabox 和快捷编辑都能设置「销量浮动」(pay_count),但设了完全
不起作用——所有读取方用的是另一个键 virtual_sales(§3.8 电商的虚拟
销量加成),pay_count 只被写、从未被读。
新增统一读取口径 aksrt_get_content_sales_count($post, $pay_meta):
真实订单销量 + pay_count,并把四处各自拼装销量的地方全部接到这个
口径上:
- aksrt_get_download_box_meta() 的 sales_count(内容帖)
- aksrt_get_resource_meta() 的 sales_count(资源帖)
- 付费墙 aksrt_get_paywall_html() 的已售徽标
- 付费盒 aksrt_get_paid_box_html() 的已售徽标
- 后台「所有文章」销售数据列的销量
此前资源帖的 sales_count 走的是「虚拟销量 + 下载量」这条与内容帖
不一致的口径,现统一。
快捷编辑的 pay_count 运算本是整数加减 + max(0,...) 归零,与读取口径
一致,无需改动。
_aksrt_sales_volume 保持不变,它仍是订单流水累加的副本;列表列取
订单表统计与 meta 副本的较大值再加浮动量,避免两条链路数字打架。
新增 sales-volume-float-contract.test.cjs 4 项,锁住「pay_count 必须
被销量读取方消费」这一契约,防止以后又被改成摆设。
验证:node --test tests/widget-system/*.test.cjs 449 项全部通过
(原有 445 项 + 新增 4 项);php -l 三个 PHP 文件无语法错误。
2026-10-06 19:52:03 +08:00
kate522
cf6dc24193
fix(admin): 互动数据列移除下载量统计
...
「互动数据」列此前有浏览/点赞/收藏/下载四项,现按要求去掉下载量,
只保留前三项。
配套清理:
- render_stats_column() 去掉下载读取、历史 download_count 键回退,
以及 fa-download 渲染分支;
- apply_query_args() 的排序白名单去掉 download_count;
- stats_meta_key() 映射去掉该维度。
核对参考主题:其互动列(all_count)本来就只有阅读、点赞、收藏三项,
下载量是从 AKSRT 旧实现里搬过来的,不属于参考主题能力,去掉后
与 1:1 复刻目标一致。
_aksrt_res_download_count / RESOURCE_DOWNLOAD_COUNT_KEY 本身保留,
它们仍被资源相关功能使用;此处只是不再在列表列里展示。
契约测试改为断言下载项已消失,并删掉因此不再使用的 domain 变量。
验证:node --test tests/widget-system/*.test.cjs 445 项全部通过;
php -l 无语法错误。
2026-10-06 19:41:25 +08:00
kate522
c8fdd81d6a
fix(admin): 修复快捷编辑组描述被 esc_html 转义成可见标签
...
「付费参数」组的说明文字 `<div class="c-yellow">…</div>` 整段被显示
成了纯文本标签。原因:fields_html() 对 $desc 做了 esc_html(),而该
参数传入的是一段自带 <div> 的 HTML,转义后标签就变成了可见字符。
改为按参考主题的做法原样输出 $desc,责任前移到调用方:
- pay 组:esc_html__() 转义文字,外层 div 由模板给出;
- filter 组:同样自带 <div class="px12 aksrt-bulk-edit-desc"> 包裹,
以保住原有样式(此前样式靠 fields_html 里的外层 div 提供)。
字段标题仍保持 esc_html(),因为 filter 那组的标题来自设置项。
新增契约断言锁住这个契约:不得再 esc_html($desc),两个调用点必须
各自转义/包裹;同时保留「字段标题仍转义」的断言。
验证:node --test tests/widget-system/*.test.cjs 445 项全部通过
(原有 444 项 + 新增 1 项);php -l 无语法错误。
2026-10-06 19:35:56 +08:00
kate522
27868b6131
fix(admin): 修复销售数据排序图标错位与快捷编辑控件被剥成文本
...
P1 排序图标跑到「销售数据」文字前面:
原因是注册了 manage_edit-post_sortable_columns。注册后 WordPress 会给
该列套上自己的排序指示器与 <a>,而列头 label 里已经自带一个 <a>,
浏览器解析嵌套 <a> 时把内层内容抛出,箭头因而显示到文字之前。
参考主题不注册该钩子,靠 label 链接 + pre_get_posts 落地排序,现改为
同一做法,同时删掉因此变成死代码的钩子与方法。
P2 快捷/批量编辑新增的配置项不可用,只显示为纯文本:
render_edit_boxes() 用 wp_kses_post() 包裹面板输出。该函数按「文章
内容」白名单过滤,select/option/input/fieldset/legend/label 均不在
白名单内,标签被剥掉只剩文字,于是所有控件退化成纯文本。改为原样
输出,字段值在生成时已逐个 esc_attr/esc_html 转义。
同步更新两份契约测试:sales 列表头排序改为断言「不注册 sortable」,
并为快捷编辑新增一条防回归断言,锁住不得再用 wp_kses_post 包裹面板。
验证:node --test tests/widget-system/*.test.cjs 444 项全部通过
(原有 443 项 + 新增 1 项);php -l 无语法错误。
2026-10-06 19:19:08 +08:00
kate522
ef718042d2
feat(admin): 新增后台文章列表销售数据列与快捷编辑配置项
...
「所有文章」列表此前只有互动数据列,缺少销售数据表头;快捷/批量编辑
展开后也只有原生三项。本次对照参考主题补齐这两处,不含专题链路。
- 新增 PostListEnhance:统管 sale/stats 两列、付费类型筛选、
orderby=sales_volume 排序,以及四组快捷编辑字段的渲染与保存
- 新增 PostListEditFields:单独承载字段定义,主类职责保持单一
- 新增 admin-post-list.js:按 pay_type/pay_modo 勾选切换字段显隐
- 从 inc/core-hooks.php 迁出原有列实现(删 74 行),不再保留旧闭包
- 清理 admin-main.css 中确认无引用的 .aksrt-tab-pane 与 .aksrt-modal* 死块
- 新增 post-list-quick-edit-contract 测试,更新 stats/icon-picker 契约
快捷编辑锚点列用互动数据列而非参考主题的专题分类法列(本项目无专题)。
真实销量改为页面级批量查询,避免逐行查库。金额运算统一走 Ledger 的
「分」单位,不用裸浮点。保存走 edit_post 钩子,一次覆盖快捷与批量两条路径。
2026-10-06 15:54:47 +08:00
kate522
194280af72
feat(admin): 移除支付中心的“下载记录”子菜单页面
...
下载不做记录,支付中心下的“下载记录”页面及相关链路整体删除。
删除的内容:
- src/Admin/Native/PayDownloadLogs.php(页面渲染、批量删除、
令牌查询)整文件移除。
- PayMenus 中的 download_logs 子菜单注册(概览页快捷入口由同一
份 pages() 数组生成,随之消失)。
- functions.php 中的 PayDownloadLogs::init() 接线。
- 各入口跳转链接:付费文章列表的操作按钮、用户列表“积分分成”
列的操作链接、用户列表行操作。
- “保存用户下载记录(条) / 保存文章下载记录(条)”两个设置项及其
消费链:SchemaPayment.php、assets/admin 侧 knowledge.js 的字段
与默认值、PaymentRuntime.php 的 user_log / post_log。
- 前台下载中心登录提示里的“管理下载记录”文案(该处本就没有
可跳转的管理页面)。
未改动内容:
- aksrt_dl_token 数据表仍由 DBMigrator 创建、uninstall.php 仍会
删除:存量站点可能留有历史令牌行,属数据而非功能,迁移风险
高于收益。
- 独立下载页面开关(down_alone_page)与远程文件转本地等下载
行为配置保留。
- 资源下载量(_aksrt_res_download_count)仍是只读口径:下载走
普通外链,主题内没有写入方,本次不新增下载统计。
download-direct-contract.test.cjs 中原有“下载记录页面展示历史
令牌”用例反向改写为三项断言:页面与接线已删除、记录数设置项
已注销、下载仍不做记录。
验证:node --test "tests/*/*.test.cjs" 517 项全部通过;
php -l 全部改动文件无语法错误;重新构建 admin SPA,确认产物
中不含被移除的字段与菜单。
2026-10-06 14:35:14 +08:00
kate522
50fac36169
fix(admin): 修复后台文章列表互动数据列无数据
...
后台「文章 → 所有文章」列表的「互动数据」列四项计数(浏览/点赞/
收藏/下载)恒为 0。原因是列回调读取的 meta key 与主题实际写入的
键不一致:读取用的是 'views' / 'like' / 'favorite' /
'download_count',而全仓库的写入方只写 aksrt_post_views /
_aksrt_like_count / _aksrt_favorite_count / _aksrt_res_download_count,
'views' / 'like' / 'favorite' 从未被任何代码写过。
改为复用既有的 aksrt_get_post_views() / aksrt_get_post_likes() /
aksrt_get_post_favorites() 读取(helpers 在 bootstrap 中先于
core-hooks.php 加载,仍保留 function_exists 兜底与原始键回退),
下载量走 DomainModel::RESOURCE_DOWNLOAD_COUNT_KEY,并对历史
download_count 键做一次回退读取。
同时修正两个相邻问题:
- 缩写口径与前台不一致:列内用的是前台从未使用的「万」后缀,
改为统一的 aksrt_format_number()(≥10000 → 1.2W+,
≥1000 → 1.5K),与前台列表、文章详情页保持同一套。
- pre_get_posts 的按计数排序同样拿用户可见的排序键当 meta_key
使用,现映射到真实存储键。
资源下载走普通外链,主题内没有下载计数的写入方,下载项仍只在
>0 时出现,此为现状而非本次回归。
新增 tests/widget-system/admin-stats-column-contract.test.cjs
(7 项)锁定列注册、读取键与写入键一致、缩写口径、排序键映射,
以及下载键的写入方状态,避免再次改名时静默失效。
验证:node --test "tests/*/*.test.cjs" 515 项全部通过
(原有 508 项 + 新增 7 项);php -l inc/core-hooks.php 无语法错误。
2026-10-06 14:28:44 +08:00
kate522
2595bb02db
fix(frontend): 统一计数缩写口径并将流水号改为订单号
...
前台各处评论、浏览、点赞、收藏、已售数量统一走
aksrt_format_number() 缩写(≥10000 → 1.2W+,≥1000 → 1.5K),
缩写后缀统一为大写 K,与既有 W+ 保持一致。PHP 渲染缩写文本的
同时保留 data-base-count 原始整数,JS 增量计算不受影响;
article.js / comment-ajax.js 内的 formatStatCount / formatCount
与 PHP 规则保持同一套,避免点赞收藏后文本回跳成全量数字。
文章详情页购买信息卡、用户中心创作者收益明细、后台分成与提现
管理页、支付设置页以及四封订单/提现邮件模板中,面向用户展示的
「流水号」字样统一改为「订单号」;代码注释、内部错误码与
WP_Error 文案保留原表述。
验证:node --test "tests/*/*.test.cjs" 508 项全部通过;
php -l 检查全部改动文件无语法错误;重新构建 admin SPA 与
前台 runtime bundle。
2026-10-06 14:13:51 +08:00
kate522
fe57022550
fix(frontend): remove duplicate select arrow and show the WordPress brand icon
2026-10-06 13:23:05 +08:00
kate522
962ab5c290
fix(frontend): match the reference post format options in the page set modal
...
参考主题把文章格式固定为标准/图像/画廊/视频四项,动态读取
get_theme_support('post-formats') 会让本站多出 aside/quote/link
等注册格式,选项集偏离参考主题,故改为固定列表。
2026-10-06 12:55:04 +08:00
kate522
6dbe1fe4c6
fix(frontend): align page-set hint bar and FA5 icons with the reference
...
- 齿轮提示横条改为参考主题的 .abs-right 垂直居中几何(top:50% +
right:.7em + translateY(-50%)),本站 legacy .abs-right 是 top:0/right:0
导致横条贴到按钮顶角
- 新增 front-page-admin-set.js:横条 2 秒后淡出 1 秒消失(对齐参考
主题 js/page-edit.js),开关关闭时不出队脚本
- 齿轮与弹窗内图标统一为 FA5 惯例 fa fas fa-*,并采用 FA5 的 glyph
重命名(sliders→sliders-h、pie-chart→chart-pie)
2026-10-06 12:50:20 +08:00
kate522
12f60897d9
fix(frontend): 修复前台页面编辑弹窗并 1:1 复刻参考主题
...
远端加载的弹窗在 admin-ajax 上下文里拿不到查询对象,enabled()
恒为假,直接返回 success:false;而 AksrtRequest.responseError
只读 message/data.message,读不到 msg,遂报「请求失败(HTTP 200)」。
改为参考主题原生架构:wp_footer 直出 #modal_admin_set,提交走
vendored main.js 的 aksrt_ajax 契约,不再有 AJAX 取 HTML。
对齐参考主题 zib-frontend-set.php:
- 弹窗补齐 aria-hidden=false、win-ajax-replace、role=document
- 隐藏字段改用 taxonomy + post_type
- 字段顺序与 is_page 分支(标题样式、widgets_register、容器位置)
- 多选 checkbox 改 name="id[]",描述允许富文本
- 模块布局指向定制器小工具面板
- term 保存使用 POST 的 taxonomy 字段
清理不再使用的 assets/js/page-admin-set.js。
新增 frontend-page-edit-harness.php 覆盖门禁、渲染与各保存分支。
2026-10-06 12:22:43 +08:00
kate522
b75bf197a3
feat(extensions): 新增系统工具页面与前台投稿分片上传
2026-10-06 11:09:05 +08:00
kate522
613b8a57a3
style(user-center): 优化手机号脱敏数字框与前缀后缀一体呈现
2026-10-06 09:41:11 +08:00
kate522
af72364078
feat(security): 新增网站安全扩展模块并支持修改手机脱敏验证
2026-10-06 09:26:55 +08:00
kate522
224f86ec08
fix(profile): mask bound phone display
2026-10-06 02:16:22 +08:00
kate522
fc9bf27560
fix(profile): anchor verification code buttons
2026-10-06 02:07:13 +08:00
kate522
d8d0b5f290
test(profile): cover account modal styling
2026-10-06 01:51:02 +08:00
kate522
ce429e1caf
fix(profile): align account modal UI
2026-10-06 01:46:48 +08:00
kate522
248912f610
fix(profile): align account dialogs and contracts
2026-10-06 01:09:04 +08:00
kate522
f646fa8573
fix(user): repair phone binding and profile fields
2026-10-05 20:55:20 +08:00
kate522
0cf4639d95
fix(profile): match account submit buttons
2026-10-05 19:54:00 +08:00
kate522
0a52bf36f9
fix(profile): refine settings modal actions
2026-10-05 19:21:42 +08:00
kate522
346146b4fa
feat(profile): rebuild account settings page
2026-10-05 18:58:49 +08:00
kate522
f00c3faeaa
fix(sms): accept empty HTTP 200 responses
2026-10-05 17:25:33 +08:00
kate522
59e9bbf8a6
fix(payment): restore order statistics cards
2026-10-05 17:25:33 +08:00
kate522
1af51ab172
fix(sms): handle empty Smsbao responses
2026-10-05 16:54:12 +08:00
kate522
7b55cfb190
feat(payment): rebuild order details and asset records
2026-10-05 16:42:25 +08:00
kate522
476e2f961d
fix(rewards): load and strengthen amount styles
2026-10-05 11:36:39 +08:00
kate522
979639342a
feat(rewards): add toast and captcha flow
2026-10-05 03:51:18 +08:00
kate522
356f7fe5bd
fix(frontend): align reward modal with shared runtime
2026-10-05 03:24:42 +08:00
kate522
6037ca184b
fix(sms): collapse provider settings by default
2026-10-05 02:29:42 +08:00
kate522
8ef2f7e49f
fix(sms): remove obsolete init call
2026-10-05 02:17:25 +08:00
kate522
5091da6a60
feat(sms): align provider and verification flow
2026-10-05 02:13:52 +08:00
kate522
d0a3972ca7
fix(identity): surface real sideload failure reason
2026-10-04 23:26:52 +08:00
kate522
2ae2b2fd07
fix(identity): validate evidence by file content
2026-10-04 23:13:48 +08:00
kate522
90c1f7a62b
fix(identity): normalize bare li markers in apply intro
2026-10-04 22:54:58 +08:00
kate522
8fcb136d55
fix(identity): draw intro list markers inside list items
2026-10-04 22:51:21 +08:00
kate522
d6e3b377b4
fix(identity): apply safe list styles in modal runtime
2026-10-04 22:25:15 +08:00
kate522
2b3e325d63
fix(identity): keep modal list markers inside scroll area
2026-10-04 22:15:42 +08:00
kate522
4caf81c9e2
fix(identity): keep intro list markers visible
2026-10-04 22:10:18 +08:00
kate522
88661e1574
fix(identity): preserve HTML in application intro
2026-10-04 22:02:20 +08:00
kate522
67ec3c8aeb
fix(identity): align application modal with reference
2026-10-04 21:49:39 +08:00
kate522
59901b9e10
feat(identity): align auth flow with reference theme
2026-10-04 21:10:12 +08:00
kate522
5a17b399a0
fix(user-home): add reference tab loading skeletons
2026-10-04 19:40:24 +08:00
kate522
4c6b02a6b9
fix(user-home): restore desktop comment columns
2026-10-04 19:19:29 +08:00
kate522
56bbb63afd
fix(user-home): align profile comments with reference theme
2026-10-04 19:11:27 +08:00
kate522 and Claude Fable 5
00817766a6
fix(author): keep the follow sub-tab state out of the other panels
...
uhSub(粉丝/关注)只属于粉丝面板,loadPanelBody 却把它写在每一个面板上,
翻页时又从被点面板自身读回,于是分组状态跨面板串味:先点粉丝 tab 切到
「关注」,再点文章 tab 翻页,#panel-posts 会被永久打上 data-uh-sub=
"following",之后粉丝面板的翻页读到的是文章面板残留的分组。
翻页改为只读**当前面板内**的 .is-active 子页签,读不到就回落默认分组;
uhPage / uhSub 也只在粉丝面板写入,文章 / 收藏 / 评论面板一次都不碰。
目标面板本身仍由被点面板的 id 反解,跨面板跳转这条路径不存在,本次不动。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 14:28:43 +08:00
kate522 and Claude Fable 5
16d67c8a87
fix(user-home): hide the old panel content while the tab skeleton loads
...
翻页 / 切 tab 是整页替换语义(author.js 最终就是 panel.innerHTML = html),
但加载态只做了骨架的显示,旧卡片与旧页码仍留在屏上,于是先看到
「第 1 页卡片 + 脚下一摞骨架」,等接口返回才换页。
加载期收起 .aksrt-user-home__post-list 的直接子级 .posts-item 与旧翻页控件,
让骨架独占内容区;对齐参考主题 post_ajax() 的 beforeSend(replace 时
$item.remove() + find(pag).remove())。显隐仍走纯类切换,不写 inline display。
两点刻意的收窄:
- 只收直接子级 .posts-item 而非后代:骨架内层同样带 .posts-item,
后代选择器会把骨架自己也藏掉,占位就永远出不来。
- 旧页码用 :has(.post_ajax_loader) 限定:关注 / 评论面板没有骨架,
无条件隐藏会让它们加载时只剩一片空白。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 13:58:09 +08:00
kate522 and Claude Fable 5
45dc909e4c
fix(user-home): span the tab pagination skeleton across the post grid
...
The posts/favorites tabs turn the article list into a 2-column grid at
>=992px. The AJAX pagination skeleton .post_ajax_loader is a direct
child of that grid, so with no grid-column it was laid out as a single
half-width card and the whole placeholder stack collapsed into one
column while paging or switching tabs.
Span the loader across every column and, while loading, give it the
same 2-column template the real cards use so placeholders line up with
them. The skeleton shape now follows the resolved render mode instead
of a hardcoded 'list', so card mode no longer renders list blocks.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-10-04 13:17:02 +08:00