+
+
+ {query.isError ? (
+
+ void query.refetch()}>
+ 重新加载
+
+ }
+ />
+
+ ) : (
+
}
+ loading={query.isFetching}
+ onClick={() => void query.refetch()}
+ >
+ 刷新
+
+ }
+ >
+
+
+
+ {meta.label}
+
+ {query.data?.masked_name || '—'}
+
+ {query.data?.masked_id_no || '—'}
+
+
+ {formatDateTime(query.data?.verified_at)}
+
+ {query.data?.fail_reason ? (
+
+ {query.data.fail_reason}
+
+ ) : null}
+
+
+ {status === 'verified' ? (
+
}
+ message="已完成实名认证,无需重复提交。"
+ />
+ ) : null}
+
+ {status === 'unverified' || status === 'rejected' ? (
+
+ 填写实名信息
+
+ 姓名与身份证号必须与证件一致。
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 证件信息由后端加密保存,页面仅展示脱敏结果;如实名服务暂时不可用,可稍后重试或联系客服。
+
+
+ ) : null}
+
+ )}
+
+ )
+}
diff --git a/frontend/src/layouts/StorefrontLayout.tsx b/frontend/src/layouts/StorefrontLayout.tsx
index 735ba0b..f8c15d2 100644
--- a/frontend/src/layouts/StorefrontLayout.tsx
+++ b/frontend/src/layouts/StorefrontLayout.tsx
@@ -44,6 +44,16 @@ export function StorefrontLayout() {
menu={{
items: [
{ key: 'phone', label: `已登录:${user.phone}`, disabled: true },
+ {
+ key: 'profile',
+ label: '个人中心',
+ onClick: () => navigate('/profile'),
+ },
+ {
+ key: 'realname',
+ label: '实名认证',
+ onClick: () => navigate('/realname'),
+ },
{
key: 'orders',
label: '我的订单',
diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css
index 270ffd3..a40e1e0 100644
--- a/frontend/src/styles/global.css
+++ b/frontend/src/styles/global.css
@@ -18,6 +18,7 @@
@import './mobile-messages.css';
@import './mobile-chat.css';
@import './pc-messages.css';
+@import './pc-account.css';
@import './seller.css';
@import './mobile-seller.css';
@import './components.css';
diff --git a/frontend/src/styles/pc-account.css b/frontend/src/styles/pc-account.css
new file mode 100644
index 0000000..4325cff
--- /dev/null
+++ b/frontend/src/styles/pc-account.css
@@ -0,0 +1,139 @@
+/* PC 个人中心与实名认证 */
+.pc-account-page {
+ max-width: 1180px;
+ margin: 0 auto;
+ padding: 32px 24px 56px;
+}
+
+.pc-account-hero {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 24px;
+ padding: 28px 32px;
+ margin-bottom: 20px;
+ border: 1px solid var(--line);
+ border-radius: 18px;
+ background: linear-gradient(135deg, rgba(30, 77, 66, 0.06), rgba(176, 138, 74, 0.08));
+}
+
+.pc-account-hero__eyebrow {
+ display: inline-block;
+ font-size: 12px;
+ letter-spacing: 0.24em;
+ color: var(--ink-muted);
+}
+
+.pc-account-hero h2 {
+ margin: 6px 0 4px;
+}
+
+.pc-account-card {
+ height: 100%;
+ border-radius: 16px;
+ border-color: var(--line);
+ background: var(--paper-warm);
+}
+
+.pc-account-avatar {
+ background: var(--brand-ink);
+ color: #fff;
+ font-size: 26px;
+}
+
+.pc-account-balance {
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+ margin: 20px 0 14px;
+ padding: 14px 16px;
+ border-radius: 12px;
+ background: rgba(30, 77, 66, 0.05);
+}
+
+.pc-account-balance span {
+ font-size: 12px;
+ color: var(--ink-muted);
+}
+
+.pc-account-balance strong {
+ font-size: 26px;
+ color: var(--brand-ink-deep);
+ letter-spacing: 0.02em;
+}
+
+.pc-account-balance__frozen {
+ color: var(--ink-secondary) !important;
+}
+
+.pc-account-quick {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 12px;
+}
+
+.pc-account-quick__item {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding: 16px 18px;
+ text-align: left;
+ border: 1px solid var(--line);
+ border-radius: 14px;
+ background: #fff;
+ cursor: pointer;
+ transition:
+ border-color 0.18s ease,
+ transform 0.18s ease,
+ box-shadow 0.18s ease;
+}
+
+.pc-account-quick__item:hover {
+ border-color: var(--brand-brass);
+ transform: translateY(-2px);
+ box-shadow: 0 10px 24px rgba(30, 77, 66, 0.08);
+}
+
+.pc-account-quick__icon {
+ font-size: 20px;
+ color: var(--brand-ink);
+}
+
+.pc-account-quick__hint {
+ font-size: 12px;
+ color: var(--ink-muted);
+}
+
+.pc-account-quick__arrow {
+ position: absolute;
+ top: 18px;
+ right: 16px;
+ color: var(--ink-muted);
+}
+
+.pc-account-login {
+ max-width: 460px;
+ margin: 64px auto;
+ text-align: center;
+ border-radius: 18px;
+ border-color: var(--line);
+ background: var(--paper-warm);
+}
+
+.pc-account-form {
+ margin-top: 20px;
+ padding-top: 16px;
+ border-top: 1px dashed var(--line);
+}
+
+@media (max-width: 640px) {
+ .pc-account-page {
+ padding: 20px 16px 40px;
+ }
+
+ .pc-account-hero {
+ flex-direction: column;
+ padding: 22px;
+ }
+}