feat: 合并 Docker Compose、标注表格优化与部署文档

将 platform + CVAT 合并为单文件 docker-compose.yml,完善 .env 与 init/dev_up 脚本;
新增 docs/DEPLOY.md 与更新 README 以支持新机器部署;含数据湖示例、车队地图、
紧凑表格 UI、ADAS det_7cls 路径与批次台账等近期改动。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-16 17:06:31 +08:00
parent 0b8ade048e
commit 483e027482
117 changed files with 5933 additions and 1499 deletions

View File

@@ -0,0 +1,72 @@
import React from "react";
import { Button } from "@/components/ui/Button";
type DeliveryIntakePanelProps = {
total: number;
inLake: number;
pending: number;
scanPending?: number;
scanning: boolean;
canCreate: boolean;
onScan: () => void;
onCreate: () => void;
};
export const DeliveryIntakePanel: React.FC<DeliveryIntakePanelProps> = ({
total,
inLake,
pending,
scanPending,
scanning,
canCreate,
onScan,
onCreate,
}) => (
<div className="grid grid-cols-1 md:grid-cols-4 gap-3 mb-4">
<div className="card p-4 border-blue-100 bg-blue-50/40">
<div className="text-xs text-blue-600 font-medium mb-1"></div>
<div className="text-2xl font-semibold text-blue-900 tabular-nums">{total}</div>
<div className="text-xs text-gray-500 mt-1"> {inLake} · {pending}</div>
</div>
<button
type="button"
onClick={onScan}
className="card p-4 text-left border-emerald-100 bg-emerald-50/40 hover:border-emerald-300 transition-colors"
>
<div className="text-xs text-emerald-700 font-medium mb-1"> </div>
<div className="text-sm font-semibold text-emerald-900">inbox </div>
<div className="text-xs text-gray-500 mt-2">
{scanPending != null ? `待登记 ${scanPending}` : "发现 inbox 新批次"}
</div>
<Button size="small" variant="primary" className="mt-3" loading={scanning} onClick={(e) => { e.stopPropagation(); onScan(); }}>
</Button>
</button>
<button
type="button"
disabled={!canCreate}
onClick={onCreate}
className="card p-4 text-left border-amber-100 bg-amber-50/40 hover:border-amber-300 transition-colors disabled:opacity-50"
>
<div className="text-xs text-amber-700 font-medium mb-1"> NAS </div>
<div className="text-sm font-semibold text-amber-900"> </div>
<div className="text-xs text-gray-500 mt-2"></div>
{canCreate && (
<Button size="small" variant="default" className="mt-3" onClick={(e) => { e.stopPropagation(); onCreate(); }}>
</Button>
)}
</button>
<div className="card p-4 border-purple-100 bg-purple-50/40">
<div className="text-xs text-purple-700 font-medium mb-1"> </div>
<div className="text-sm font-semibold text-purple-900"></div>
<div className="text-xs text-gray-500 mt-2"> </div>
<a href="/labeling/workbench" className="inline-block mt-3">
<Button size="small" variant="default"> </Button>
</a>
</div>
</div>
);