feat: wire admin workflows to real APIs

This commit is contained in:
hectorzhao
2026-07-02 13:50:09 +08:00
parent f8c9b78c21
commit ab421cf8a7
42 changed files with 2596 additions and 250 deletions
+60 -26
View File
@@ -1,10 +1,8 @@
import { useState } from 'react';
import {
AlertCircle,
Building2,
Check,
ChevronRight,
CreditCard,
Landmark,
ShieldCheck,
Upload,
@@ -12,8 +10,9 @@ import {
} from 'lucide-react';
import { Button, Input, Select, Textarea } from '@/components/ui';
type AuthStep = 'overview' | 'profile' | 'method' | 'recharge' | 'face' | 'faceScan' | 'success' | 'failed';
type AuthStep = 'overview' | 'profile' | 'method' | 'recharge' | 'face' | 'faceScan' | 'pending' | 'success' | 'failed';
type AuthMethod = 'face' | 'recharge';
type CertificationStatus = 'uncertified' | 'pending' | 'approved' | 'rejected';
const companyInfo = {
name: '上海闪联九玖信息通信技术有限公司',
@@ -56,14 +55,21 @@ function EnterpriseStepper({ current }: { current: number }) {
);
}
function AuthHeader({ onCertified }: { onCertified: () => void }) {
function AuthHeader({ status }: { status: CertificationStatus }) {
const statusText: Record<CertificationStatus, string> = {
uncertified: '未认证',
pending: '审核中',
approved: '已通过',
rejected: '未通过',
};
return (
<div className="system-page-toolbar">
<div className="sms-send-title">
<span className="sms-send-title__icon"><ShieldCheck size={22} /></span>
<h1></h1>
</div>
<Button onClick={onCertified} variant="secondary"></Button>
<span className={`enterprise-review-status enterprise-review-status--${status}`}>{statusText[status]}</span>
</div>
);
}
@@ -71,26 +77,39 @@ function AuthHeader({ onCertified }: { onCertified: () => void }) {
export function ClientEnterpriseAuthPage() {
const [step, setStep] = useState<AuthStep>('overview');
const [method, setMethod] = useState<AuthMethod>('face');
const [status, setStatus] = useState<CertificationStatus>('uncertified');
const currentStep = step === 'profile' ? 1 : step === 'method' ? 2 : step === 'recharge' || step === 'face' || step === 'faceScan' ? 3 : step === 'success' || step === 'failed' ? 4 : 1;
const currentStep = step === 'profile' ? 1 : step === 'method' ? 2 : step === 'recharge' || step === 'face' || step === 'faceScan' ? 3 : step === 'pending' || step === 'success' || step === 'failed' ? 4 : 1;
if (step === 'overview') {
const overviewCopy = status === 'approved'
? '企业认证已审核通过,可正常使用发送、签名报备等能力。'
: status === 'pending'
? '企业认证资料已提交,平台运营将在 1 个工作日内完成审核。'
: status === 'rejected'
? '企业认证未通过,请根据驳回原因修改资料后重新提交。'
: '您还未进行企业认证';
return (
<section className="page-stack enterprise-page">
<AuthHeader onCertified={() => setStep('success')} />
<AuthHeader status={status} />
<div className="surface enterprise-status-card">
<strong></strong>
<button type="button" onClick={() => setStep('profile')}> &gt;</button>
<div className={`surface enterprise-status-card enterprise-status-card--${status}`}>
<strong>{overviewCopy}</strong>
{status === 'approved' ? null : (
<button type="button" onClick={() => setStep(status === 'pending' ? 'pending' : 'profile')}>
{status === 'pending' ? '查看审核进度 >' : '企业认证 >'}
</button>
)}
</div>
<div className="surface enterprise-info-card">
<dl>
<div><dt></dt><dd></dd></div>
<div><dt></dt><dd></dd></div>
<div><dt></dt><dd></dd></div>
<div><dt></dt><dd></dd></div>
<div><dt></dt><dd></dd></div>
<div><dt></dt><dd>{status === 'approved' ? companyInfo.name : '待认证'}</dd></div>
<div><dt></dt><dd>{status === 'approved' ? companyInfo.certifiedAt : '待审核完成'}</dd></div>
<div><dt></dt><dd>{status === 'approved' ? companyInfo.code : '待认证'}</dd></div>
<div><dt></dt><dd>{status === 'approved' ? companyInfo.address : '待认证'}</dd></div>
<div><dt></dt><dd>{status === 'approved' ? companyInfo.legalPerson : '待认证'}</dd></div>
</dl>
</div>
</section>
@@ -202,7 +221,7 @@ export function ClientEnterpriseAuthPage() {
</div>
<div className="enterprise-actions enterprise-actions--center">
<Button onClick={() => setStep('success')}></Button>
<Button onClick={() => { setStatus('pending'); setStep('pending'); }}></Button>
<Button onClick={() => setStep('method')} variant="secondary"></Button>
</div>
</div>
@@ -235,20 +254,36 @@ export function ClientEnterpriseAuthPage() {
<h2></h2>
<p>使<em>5957</em></p>
<div className="enterprise-qr"></div>
<span></span>
<span></span>
<div className="enterprise-actions enterprise-actions--center">
<Button onClick={() => setStep('face')} variant="secondary"></Button>
<Button onClick={() => setStep('success')} className="enterprise-success-test"></Button>
<Button onClick={() => setStep('failed')} variant="danger"></Button>
<Button onClick={() => { setStatus('pending'); setStep('pending'); }}></Button>
</div>
</div>
</div>
) : null}
{step === 'pending' ? (
<div className="enterprise-result enterprise-result--pending">
<span><ShieldCheck size={70} /></span>
<h2></h2>
<p></p>
<dl>
<div><dt></dt><dd>{companyInfo.name}</dd></div>
<div><dt></dt><dd>20260702 09:58:00</dd></div>
<div><dt></dt><dd>1 </dd></div>
<div><dt></dt><dd></dd></div>
</dl>
<div className="enterprise-actions enterprise-actions--center">
<Button onClick={() => setStep('overview')} variant="secondary"></Button>
</div>
</div>
) : null}
{step === 'success' ? (
<div className="enterprise-result enterprise-result--success">
<span><Check size={70} /></span>
<h2></h2>
<h2></h2>
<dl>
<div><dt></dt><dd>{companyInfo.name}</dd></div>
<div><dt></dt><dd>{companyInfo.code}</dd></div>
@@ -256,19 +291,18 @@ export function ClientEnterpriseAuthPage() {
<div><dt></dt><dd>{companyInfo.certifiedAt}</dd></div>
<div><dt></dt><dd>{companyInfo.address}</dd></div>
</dl>
<Button onClick={() => setStep('overview')} variant="secondary"></Button>
<Button onClick={() => setStep('overview')} variant="secondary"></Button>
</div>
) : null}
{step === 'failed' ? (
<div className="enterprise-result enterprise-result--failed">
<span>!</span>
<h2></h2>
<p></p>
<strong>22359</strong>
<button type="button" onClick={() => setStep('method')}> <ChevronRight size={18} /></button>
<h2></h2>
<p></p>
<button type="button" onClick={() => setStep('profile')}> <ChevronRight size={18} /></button>
<div className="enterprise-actions enterprise-actions--center">
<Button onClick={() => setStep('method')} variant="secondary"></Button>
<Button onClick={() => setStep('profile')}></Button>
<Button onClick={() => setStep('overview')} variant="secondary"></Button>
</div>
</div>