feat(users): rewrite medal catalog + verify apply SPA contract

Replace user_badge_dictionary textarea with structured user_medal_*
catalog (categories/items/get_type). Expand verify SPA/PHP to Zibll
apply fields. Reader derives badge.dictionary from medal catalog for
existing AKSRT_User_Badges wear/grant runtime. No dual-read of old
pipe dictionary. audit-admin-contracts: 0 errors.
This commit is contained in:
2026-07-17 01:00:05 +08:00
parent cab132a536
commit e80d8ea45d
7 changed files with 572 additions and 154 deletions
@@ -580,7 +580,7 @@ class AKSRT_Admin_Schema_Users {
'verify' => [
'key' => 'verify',
'title' => '身份认证',
'version' => '1.0.0',
'version' => '1.1.0',
'option_key' => 'aksrt_settings',
'groups' => [
['key' => 'display', 'title' => '公开展示', 'fields' => [
@@ -591,12 +591,13 @@ class AKSRT_Admin_Schema_Users {
['key' => 'workflow', 'title' => '审核流程', 'fields' => [
['key' => 'user_verify_accept_email_verified', 'label' => '邮箱验证通过视为已认证', 'type' => 'switch', 'default' => true],
['key' => 'user_verify_require_manual_review', 'label' => '保留人工审核位', 'type' => 'switch', 'default' => false],
['key' => 'user_verify_apply_option', 'label' => '申请选项', 'type' => 'textarea', 'default' => "real_name|实名认证\norganization|企业认证"],
['key' => 'user_verify_apply_option', 'label' => '申请类型选项', 'type' => 'textarea', 'default' => "real_name|实名认证\norganization|企业认证", 'desc' => '每行:slug|显示名称'],
]],
['key' => 'restrict', 'title' => '限制设置', 'fields' => [
['key' => 'user_verify_disable_desc', 'label' => '未认证限制说明', 'type' => 'textarea', 'default' => ''],
['key' => 'user_verify_limit_level', 'label' => '限制等级', 'type' => 'number', 'default' => 0, 'min' => 0, 'max' => 100],
['key' => 'user_verify_desc', 'label' => '认证说明', 'type' => 'textarea', 'default' => ''],
['key' => 'apply', 'title' => '申请设置', 'fields' => [
['key' => 'user_verify_allow_apply', 'label' => '允许用户前台申请', 'type' => 'switch', 'default' => true],
['key' => 'user_verify_disable_desc', 'label' => '停用申请说明', 'type' => 'textarea', 'default' => "由于系统正在维护,暂时无法申请身份认证\n详情请联系管理员"],
['key' => 'user_verify_limit_level', 'label' => '申请要求等级', 'type' => 'number', 'default' => 2, 'min' => 0, 'max' => 99, 'desc' => '0 表示不限制;依赖用户等级'],
['key' => 'user_verify_desc', 'label' => '申请介绍', 'type' => 'textarea', 'default' => '认证用户会在昵称后显示认证徽章,同时享受多种优先待遇。申请请确保信息属实。'],
]],
],
],
@@ -639,21 +640,56 @@ class AKSRT_Admin_Schema_Users {
'badge' => [
'key' => 'badge',
'title' => '用户徽章',
'version' => '1.0.0',
'version' => '2.0.0',
'option_key' => 'aksrt_settings',
'groups' => [
['key' => 'display', 'title' => '徽章展示', 'fields' => [
['key' => 'user_badge_enabled', 'label' => '启用徽章系统', 'type' => 'switch', 'default' => false],
['key' => 'user_badge_public_display', 'label' => '公开页显示徽章', 'type' => 'switch', 'default' => true],
['key' => 'user_badge_limit', 'label' => '最多显示数量', 'type' => 'number', 'default' => 3, 'min' => 1, 'max' => 8],
['key' => 'user_medal_s', 'label' => '启用徽章/勋章系统', 'type' => 'switch', 'default' => false],
['key' => 'user_medal_public_display', 'label' => '公开页显示徽章', 'type' => 'switch', 'default' => true],
['key' => 'user_medal_limit', 'label' => '最多显示数量', 'type' => 'number', 'default' => 3, 'min' => 1, 'max' => 8],
]],
['key' => 'dictionary', 'title' => '徽章字典', 'fields' => [
['key' => 'catalog', 'title' => '徽章明细', 'fields' => [
[
'key' => 'user_badge_dictionary',
'label' => '徽章列表',
'type' => 'textarea',
'default' => "founder|创始成员|warning\nstaff|站务团队|info",
'help' => '每行:slug|显示文案|色调(neutral/info/success/warning/brand)|图标URL(可选)。配置 icon_url 后前台显示勋章图;用户 meta aksrt_wear_badge 指定当前佩戴。',
'key' => 'user_medal_args',
'label' => '分类与条目',
'type' => 'json',
'default' => [
[
'cat_name' => '成长',
'items' => [
[
'slug' => 'rookie',
'name' => '初出茅庐',
'desc' => '注册时间超过30天',
'icon' => '',
'get_type' => 'registration_time',
'get_val' => 30,
],
[
'slug' => 'checkin-30',
'name' => '签到达人',
'desc' => '累计签到30天',
'icon' => '',
'get_type' => 'checkin_all_day',
'get_val' => 30,
],
],
],
[
'cat_name' => '限定',
'items' => [
[
'slug' => 'annual-star',
'name' => '年度人气达人',
'desc' => '活动限定徽章',
'icon' => '',
'get_type' => 'manually_add',
'get_val' => 0,
],
],
],
],
'help' => '结构化目录:分类 → 条目(slug/name/desc/icon/get_type/get_val)。由 SPA UsersBadge 编辑。',
],
]],
],