From c0e0912eee88a64d682484b0d9d5beb7893c3e5b Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 19 Sep 2026 22:09:24 +0800 Subject: [PATCH] feat(admin): fully align the ban page with the reference theme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - submenu page title becomes 处理举报及禁封申诉 (menu title 举报&禁封申诉) - replicate the reference pagenavi: first/prev/numbered/next/last links with displaying-num (每页 20 共N) and paging-input (第X页共Y页) - report process form is now status-only like the reference theme: 被举报用户/举报信息/被举报用户禁封信息/处理说明 blocks, with a 点击此处 link to the restrictions tab (prefilled user_id) instead of an enforcement select - replicate reference row details (举报用户/举报内容, 正在处理 state, 此用户已解封 auto-close for stale appeals, 当前用户已解封 notice) and the table-box/preview-item style block - drop now-unused ReportCenter::get_report_row --- src/Admin/Native/UsersMenus.php | 29 +--- src/Admin/Native/UsersMenusTickets.php | 131 +++++++++++------- src/Messages/ReportCenter.php | 14 -- .../report-ban-contract.test.cjs | 24 ++-- 4 files changed, 100 insertions(+), 98 deletions(-) diff --git a/src/Admin/Native/UsersMenus.php b/src/Admin/Native/UsersMenus.php index 1c74dcef..5d7d4148 100644 --- a/src/Admin/Native/UsersMenus.php +++ b/src/Admin/Native/UsersMenus.php @@ -82,7 +82,7 @@ class UsersMenus { ); add_submenu_page( 'users.php', - __('举报&禁封申诉', 'aksrt'), + __('处理举报及禁封申诉', 'aksrt'), __('举报&禁封申诉', 'aksrt'), self::CAPABILITY, 'aksrt_user_ban', @@ -324,7 +324,7 @@ class UsersMenus { echo '
'; echo ''; wp_nonce_field('aksrt_users_add_restriction'); - echo '

'; + echo '

'; echo '

' . esc_html__('如举报事实清楚,可对用户执行处罚动作,处理结果会反馈给举报人。', 'aksrt') . '

'; + echo '' . esc_html__('被举报用户禁封信息', 'aksrt') . ''; + if (class_exists('\AKSRT\User\Restriction') && \AKSRT\User\Restriction::get_instance()->is_restricted($target_id)) { + echo $this->ticket_ban_info_html($target_id); + } else { + $ban_url = admin_url('users.php?page=aksrt_user_ban&tab=restrictions&user_id=' . $target_id); + echo '
' . esc_html__('用户状态正常', 'aksrt') . '
'; + echo '

' . esc_html__('请查阅相关资料以及举证,如举报事实清楚,可以', 'aksrt'); + echo ' ' . esc_html__('点击此处', 'aksrt') . ' '; + echo esc_html__('对用户做禁封处理,并将处理结果填写至下方', 'aksrt') . '

'; + } echo ''; - - echo '' . esc_html__('处罚动作', 'aksrt') . ''; - } else { - echo '' . esc_html__('内容处理', 'aksrt') . ''; } - echo '' . esc_html__('处理结果', 'aksrt') . ''; - echo '' . esc_html__('处理说明', 'aksrt') . ''; echo ''; echo '

' . esc_html__('此处内容会反馈给举报人', 'aksrt') . '

'; @@ -424,7 +455,7 @@ trait UsersMenusTickets { echo ''; echo ''; - echo '' . esc_html__('禁封信息', 'aksrt') . '' . $this->ticket_ban_info_html($uid) . ''; + echo '' . esc_html__('禁封信息', 'aksrt') . '' . $this->ticket_ban_info_html($uid, 'appeal_form') . ''; echo '' . esc_html__('申诉信息', 'aksrt') . ''; $payload = $row['payload']; diff --git a/src/Messages/ReportCenter.php b/src/Messages/ReportCenter.php index 9185e35c..60458867 100644 --- a/src/Messages/ReportCenter.php +++ b/src/Messages/ReportCenter.php @@ -159,20 +159,6 @@ class ReportCenter { return $result !== false; } - /** - * 获取单条举报原始行(ARRAY_A),不存在返回 null。 - */ - public function get_report_row(int $report_id): ?array { - $table = $this->table(); - if ($table === '' || $report_id <= 0) { - return null; - } - - global $wpdb; - $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$table} WHERE id = %d", $report_id), ARRAY_A); - return $row ?: null; - } - /** * 对举报目标执行处罚动作(REST 与原生后台共用入口)。 * diff --git a/tests/widget-system/report-ban-contract.test.cjs b/tests/widget-system/report-ban-contract.test.cjs index bec279d7..86699930 100644 --- a/tests/widget-system/report-ban-contract.test.cjs +++ b/tests/widget-system/report-ban-contract.test.cjs @@ -57,8 +57,7 @@ test('report processing delegates actions to the shared ReportCenter entry', () assert.ok(reportOps.includes(action), `missing action option: ${action}`) } assert.match(reportOps, /get_user_restriction_state/) - assert.match(reportCenter, /public function get_report_row\(/) - assert.match(usersMenus, /\$svc->apply_action\(/) + assert.ok(!usersMenus.includes('$svc->apply_action('), 'native page follows the reference theme flow (status-only update)') }) test('restriction class supports lifting and kicks sessions on ban', () => { @@ -105,12 +104,12 @@ test('admin report notification links to the real page', () => { test('native ban page mirrors the reference theme layout', () => { const tickets = read('src/Admin/Native/UsersMenusTickets.php') - // 菜单与页面标题对齐参考主题 - assert.ok(usersMenus.includes(`__('举报&禁封申诉', 'aksrt'),\n __('举报&禁封申诉', 'aksrt')`), 'submenu title should be 举报&禁封申诉') + // 菜单与页面标题对齐参考主题(page title=处理举报及禁封申诉,menu title=举报&禁封申诉) + assert.ok(usersMenus.includes(`__('处理举报及禁封申诉', 'aksrt'),\n __('举报&禁封申诉', 'aksrt')`), 'submenu titles should match the reference theme') assert.ok(usersMenus.includes('用户禁封申诉及用户举报管理'), 'page heading should match the reference theme') // 类型筛选按钮组 + 状态 subsubsub + 搜索 - for (const label of [`__('禁封申诉', 'aksrt')`, `__('用户举报', 'aksrt')`, `__('待处理', 'aksrt')`, `__('已批准', 'aksrt')`, `__('已拒绝', 'aksrt')`, `__('搜索记录', 'aksrt')`]) { + for (const label of [`__('禁封申诉', 'aksrt')`, `__('用户举报', 'aksrt')`, `__('待处理', 'aksrt')`, `__('已批准', 'aksrt')`, `__('已拒绝', 'aksrt')`, `__('搜索记录', 'aksrt')`, `__('查看全部', 'aksrt')`]) { assert.ok(tickets.includes(label), `missing reference-theme label: ${label}`) } @@ -121,22 +120,25 @@ test('native ban page mirrors the reference theme layout', () => { assert.match(tickets, /orderby-but/) assert.match(tickets, /dashicons-arrow-up/) - // 行内处理表单对齐参考主题 - for (const label of [`__('立即处理', 'aksrt')`, `__('申诉通过(解封该用户)', 'aksrt')`, `__('申诉拒绝(保持原禁封状态)', 'aksrt')`, `__('此处内容会反馈给举报人', 'aksrt')`, `__('确认提交', 'aksrt')`, `__('用户状态正常', 'aksrt')`, `__('暂无申请记录', 'aksrt')`]) { + // 行渲染与处理表单对齐参考主题 + for (const label of [`__('立即处理', 'aksrt')`, `__('正在处理', 'aksrt')`, `__('被举报用户', 'aksrt')`, `__('被举报用户禁封信息', 'aksrt')`, `__('申诉用户', 'aksrt')`, `__('禁封信息', 'aksrt')`, `__('申诉信息', 'aksrt')`, `__('处理方式', 'aksrt')`, `__('处理留言', 'aksrt')`, `__('申诉通过(解封该用户)', 'aksrt')`, `__('申诉拒绝(保持原禁封状态)', 'aksrt')`, `__('此处内容会反馈给举报人', 'aksrt')`, `__('确认提交', 'aksrt')`, `__('用户状态正常', 'aksrt')`, `__('当前用户已解封', 'aksrt')`, `__('此用户已解封', 'aksrt')`, `__('暂无申请记录', 'aksrt')`]) { assert.ok(tickets.includes(label), `missing process form label: ${label}`) } - // 分页(每页 20 条,与参考主题一致) + // 分页对齐参考主题 zibpay_admin_pagenavi(每页 20 条) assert.match(tickets, /TICKETS_PER_PAGE = 20/) - assert.match(usersMenus, /private function pagination\(int \$pages, int \$page_num\): void/) - assert.match(usersMenus, /paginate_links\(/) + assert.match(tickets, /ticket_pagenavi\(int \$total_count, int \$per_page\)/) + for (const label of ['前往第一页', '前往上一页', '前往下一页', '前往最后一页', 'displaying-num', 'paging-input', 'total-pages']) { + assert.ok(tickets.includes(label), `missing pagenavi part: ${label}`) + } - // 旧的三 tab 结构已收敛 + // 旧的三 tab 结构已收敛;举报处理表单不包含处罚下拉(对齐参考主题) assert.ok(!usersMenus.includes('tab=reports'), 'old reports tab is gone') assert.ok(!usersMenus.includes('tab=appeals'), 'old appeals tab is gone') assert.ok(!usersMenus.includes('render_reports_tab')) assert.ok(!usersMenus.includes('render_appeals_tab')) assert.match(usersMenus, /use UsersMenusTickets;/) + assert.ok(!tickets.includes('name="action_taken"'), 'report process form should be status-only like the reference theme') }) test('comments expose a report entry for other users when reporting is enabled', () => {