工作台 8 项指标全部改为明确中文标题。

ISO 8601 时间统一转换为北京时间,例如 2026/07/23 22:29。
审计日志、缴费确认时间、通知发布时间统一使用时间格式化。
管理员层级、流程类型、录取状态等建立统一中文映射。
工作台、流程设计、学校管理等管理页面的装饰性英文标题改为中文。
历史审计记录中的 plan、draft 等枚举也会自动翻译。
更新静态资源版本号,避免浏览器继续使用旧缓存。
This commit is contained in:
biss committed 2026-07-23 22:46:45 +08:00
1 parent 9931c8e0d3
commit ef8222c138
15 files changed
+860 -3627

No files matched your search

@@ -196,6 +196,7 @@ internal static class AdminPublicationProjector
["summary"] = summary, ["summary"] = summary,
["author"] = "系统自动发布", ["author"] = "系统自动发布",
["publishedAt"] = publishedAt, ["publishedAt"] = publishedAt,
["publicVisible"] = visible,
["visible"] = visible, ["visible"] = visible,
["status"] = visible ? "visible" : "hidden" ["status"] = visible ? "visible" : "hidden"
}; };
@@ -82,13 +82,13 @@ async function copyCodes() {
<div class="security-stack"> <div class="security-stack">
<div v-if="error" class="form-error">{{ error }}</div> <div v-if="error" class="form-error">{{ error }}</div>
<section v-if="recoveryCodes.length" class="recovery-code-panel"> <section v-if="recoveryCodes.length" class="recovery-code-panel">
<div><p>RECOVERY CODES</p><h2>立即保存恢复码</h2><span>每个恢复码只能使用一次,关闭页面后系统不会再次展示本组代码。</span></div> <div><p>账户恢复</p><h2>立即保存恢复码</h2><span>每个恢复码只能使用一次,关闭页面后系统不会再次展示本组代码。</span></div>
<div class="recovery-code-grid"><code v-for="code in recoveryCodes" :key="code">{{ code }}</code></div> <div class="recovery-code-grid"><code v-for="code in recoveryCodes" :key="code">{{ code }}</code></div>
<button class="app-button app-button--primary" type="button" @click="copyCodes">复制全部恢复码</button> <button class="app-button app-button--primary" type="button" @click="copyCodes">复制全部恢复码</button>
</section> </section>
<form class="business-form security-card" @submit.prevent="changePassword"> <form class="business-form security-card" @submit.prevent="changePassword">
<header><div><p>LOGIN PASSWORD</p><h2>修改登录密码</h2></div><StatusBadge value="active" /></header> <header><div><p>登录安全</p><h2>修改登录密码</h2></div><StatusBadge value="active" /></header>
<span>账号:{{ sessionStore.state.user?.username || sessionStore.state.user?.candidateNumber }}。新密码至少 8 位,并应与当前密码不同。</span> <span>账号:{{ sessionStore.state.user?.username || sessionStore.state.user?.candidateNumber }}。新密码至少 8 位,并应与当前密码不同。</span>
<label><span>当前密码</span><input v-model="password.currentPassword" type="password" autocomplete="current-password" required></label> <label><span>当前密码</span><input v-model="password.currentPassword" type="password" autocomplete="current-password" required></label>
<label><span>新密码</span><input v-model="password.newPassword" type="password" autocomplete="new-password" minlength="8" required></label> <label><span>新密码</span><input v-model="password.newPassword" type="password" autocomplete="new-password" minlength="8" required></label>
@@ -97,7 +97,7 @@ async function copyCodes() {
</form> </form>
<section class="business-form security-card"> <section class="business-form security-card">
<header><div><p>TWO-STEP VERIFICATION</p><h2>TOTP 二次验证</h2></div><StatusBadge :value="status.enabled ? 'active' : 'disabled'" /></header> <header><div><p>二次验证</p><h2>动态验证码(TOTP)</h2></div><StatusBadge :value="status.enabled ? 'active' : 'disabled'" /></header>
<template v-if="!status.enabled && !setup"> <template v-if="!status.enabled && !setup">
<span>使用验证器应用生成的动态验证码,为账号增加独立于密码的第二层保护。</span> <span>使用验证器应用生成的动态验证码,为账号增加独立于密码的第二层保护。</span>
<form class="inline-security-form" @submit.prevent="beginSetup"><label><span>确认当前密码</span><input v-model="setupPassword" type="password" autocomplete="current-password" required></label><button class="app-button app-button--primary" :disabled="busy">开始绑定验证器</button></form> <form class="inline-security-form" @submit.prevent="beginSetup"><label><span>确认当前密码</span><input v-model="setupPassword" type="password" autocomplete="current-password" required></label><button class="app-button app-button--primary" :disabled="busy">开始绑定验证器</button></form>
@@ -1,13 +1,9 @@
<script setup> <script setup>
import { statusLabel } from '@/lib/business-labels';
const props = defineProps({ value: { type: [String, Boolean, Number], default: '' } }); const props = defineProps({ value: { type: [String, Boolean, Number], default: '' } });
const labels = {
approved: '已通过', pending: '待处理', rejected: '已退回', draft: '草稿', published: '已发布',
open: '开放中', upcoming: '即将开放', closed: '已结束', archived: '已归档', completed: '已完成',
active: '正常', disabled: '已停用', unpaid: '未缴费', paid: '已缴费', final: '正式录取',
school_review: '学校审核', withdrawal_pending: '退档待审', reported: '已报到', not_reported: '未报到'
};
</script> </script>
<template> <template>
<span :class="['status-badge', `is-${String(props.value).replaceAll('_', '-')}`]">{{ labels[props.value] || props.value || '—' }}</span> <span :class="['status-badge', `is-${String(props.value).replaceAll('_', '-')}`]">{{ statusLabel(props.value) }}</span>
</template> </template>
Loaded 3 of 15 files, more files were not shown because too many files have changed in this diff. Show more