fix: 修复前端构建问题 - 恢复 develop 分支配置

- develop 分支已包含完整的 package.json、tsconfig.json、vite.config.ts
- develop 分支已包含完整的路由、useAuth、api/tasks 实现
- @/ 路径别名已在 tsconfig 和 vite 配置中正确设置

额外修复:
- 删除 Next.js 残留文件 (next.config.js, next-env.d.ts)
- 删除死代码:workspaceStore.ts(从未被引用)、QuotaDisplay.tsx(从未被使用)
- 删除 Vite 脚手架残留:App.tsx、App.css
- Header.tsx 添加 Header.css 导入,修复顶部导航无样式问题

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Audit Bot
2026-06-27 18:16:43 +08:00
parent 48d3754956
commit bad52fd1d0
7 changed files with 1 additions and 329 deletions
@@ -1,99 +0,0 @@
/**
* 配额使用展示组件 - V21 UI
*/
import React from 'react';
import { Card, Progress, Row, Col, Tag, Space } from 'antd';
import { ProjectOutlined, CloudOutlined, WarningOutlined } from '@ant-design/icons';
import './business.css';
interface QuotaStatus {
projects: {
used: number;
limit: number;
status: string;
};
storage: {
used_gb: number;
limit_gb: number;
status: string;
};
}
interface QuotaDisplayProps {
quota: QuotaStatus;
}
const QuotaDisplay: React.FC<QuotaDisplayProps> = ({ quota }) => {
const getStatusTag = (status: string) => {
const config: Record<string, { color: string; text: string; className: string }> = {
normal: { color: 'success', text: '正常', className: 'xx-tag-success' },
warning: { color: 'warning', text: '接近上限', className: 'xx-tag-warning' },
critical: { color: 'error', text: '即将超限', className: 'xx-tag-error' },
exceeded: { color: 'error', text: '已超限', className: 'xx-tag-error' },
};
const item = config[status] || config.normal;
return (
<Tag color={item.color} icon={<WarningOutlined />} className={`xx-tag ${item.className}`}>
{item.text}
</Tag>
);
};
const getProgressColor = (status: string) => {
const colorMap: Record<string, string> = {
normal: '#16a34a',
warning: '#d97706',
critical: '#dc2626',
exceeded: '#dc2626',
};
return colorMap[status] || '#4f46e5';
};
return (
<Card title="配额使用情况" className="xx-card">
<Space direction="vertical" style={{ width: '100%' }} size="large">
<div className="xx-quota-item">
<Row justify="space-between" align="middle" style={{ marginBottom: 12 }}>
<Col>
<Space>
<ProjectOutlined style={{ fontSize: 18, color: '#4f46e5' }} />
<span style={{ fontWeight: 600, color: '#0f172a', fontSize: 15 }}>项目数量</span>
</Space>
</Col>
<Col>{getStatusTag(quota.projects.status)}</Col>
</Row>
<div style={{ marginBottom: 8, color: '#64748b', fontSize: 14 }}>
{quota.projects.used} / {quota.projects.limit} 个项目
</div>
<Progress
percent={Math.round((quota.projects.used / quota.projects.limit) * 100)}
strokeColor={getProgressColor(quota.projects.status)}
trailColor="#f1f5f9"
/>
</div>
<div className="xx-quota-item">
<Row justify="space-between" align="middle" style={{ marginBottom: 12 }}>
<Col>
<Space>
<CloudOutlined style={{ fontSize: 18, color: '#4f46e5' }} />
<span style={{ fontWeight: 600, color: '#0f172a', fontSize: 15 }}>存储空间</span>
</Space>
</Col>
<Col>{getStatusTag(quota.storage.status)}</Col>
</Row>
<div style={{ marginBottom: 8, color: '#64748b', fontSize: 14 }}>
{quota.storage.used_gb.toFixed(2)} / {quota.storage.limit_gb} GB
</div>
<Progress
percent={Math.round((quota.storage.used_gb / quota.storage.limit_gb) * 100)}
strokeColor={getProgressColor(quota.storage.status)}
trailColor="#f1f5f9"
/>
</div>
</Space>
</Card>
);
};
export default QuotaDisplay;
@@ -5,6 +5,7 @@ import { useLocation, useNavigate } from 'react-router-dom';
import { useAuthStore } from '@/store/authStore';
import { useLogout } from '@/hooks/useAuth';
import type { MenuProps } from 'antd';
import './Header.css';
const extractProjectId = (pathname: string) => {
const match = pathname.match(/^\/projects\/([^/]+)/);