feat: 本次提交更新内容如下

场景获客列表搞定
This commit is contained in:
笔记本里的永平
2025-07-07 17:08:27 +08:00
parent 6543da9167
commit 5ff15472f5
352 changed files with 24040 additions and 18575 deletions

View File

@@ -0,0 +1,32 @@
import { Card, CardContent, CardHeader } from "@/components/ui/card"
export default function ComponentsDocsLoading() {
return (
<div className="container mx-auto py-8 space-y-8">
<div className="space-y-4">
<div className="h-8 bg-gray-200 rounded animate-pulse" />
<div className="h-4 bg-gray-200 rounded animate-pulse w-2/3" />
</div>
<div className="space-y-6">
<div className="flex space-x-1">
{Array.from({ length: 5 }).map((_, i) => (
<div key={i} className="h-10 bg-gray-200 rounded animate-pulse flex-1" />
))}
</div>
<Card>
<CardHeader>
<div className="h-6 bg-gray-200 rounded animate-pulse" />
<div className="h-4 bg-gray-200 rounded animate-pulse w-3/4" />
</CardHeader>
<CardContent className="space-y-4">
{Array.from({ length: 8 }).map((_, i) => (
<div key={i} className="h-4 bg-gray-200 rounded animate-pulse" />
))}
</CardContent>
</Card>
</div>
</div>
)
}

View File

@@ -0,0 +1,375 @@
"use client"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Badge } from "@/components/ui/badge"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Separator } from "@/components/ui/separator"
/**
* 组件文档页面
* 提供详细的组件使用文档和API说明
*/
export default function ComponentsDocs() {
return (
<div className="container mx-auto py-8 space-y-8">
<div className="space-y-4">
<h1 className="text-3xl font-bold"></h1>
<p className="text-gray-600">使API文档和最佳实践</p>
</div>
<Tabs defaultValue="getting-started" className="space-y-6">
<TabsList className="grid w-full grid-cols-5">
<TabsTrigger value="getting-started"></TabsTrigger>
<TabsTrigger value="basic-components"></TabsTrigger>
<TabsTrigger value="custom-components"></TabsTrigger>
<TabsTrigger value="best-practices"></TabsTrigger>
<TabsTrigger value="changelog"></TabsTrigger>
</TabsList>
{/* 快速开始 */}
<TabsContent value="getting-started" className="space-y-6">
<Card>
<CardHeader>
<CardTitle></CardTitle>
<CardDescription>使</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<div className="bg-gray-900 text-gray-100 p-4 rounded-lg">
<pre>{`// 导入基础UI组件
import { Button, Card, Input } from "@/components/ui"
// 导入自定义组件
import { PageHeader, StatCard } from "@/app/components/common"
// 使用组件
function MyComponent() {
return (
<Card>
<PageHeader title="标题" description="描述" />
<Button>点击我</Button>
</Card>
)
}`}</pre>
</div>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<div className="bg-gray-50 p-4 rounded-lg">
<pre>{`app/
├── components/
│ ├── ui/ # 基础UI组件
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ └── ...
│ └── common/ # 自定义业务组件
│ ├── PageHeader.tsx
│ ├── StatCard.tsx
│ └── ...
├── lib/
│ └── utils.ts # 工具函数
└── types/ # 类型定义`}</pre>
</div>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<p className="text-gray-600 mb-3">使 Tailwind CSS </p>
<div className="bg-gray-900 text-gray-100 p-4 rounded-lg">
<pre>{`// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
primary: {
50: '#eff6ff',
500: '#3b82f6',
900: '#1e3a8a',
}
}
}
}
}`}</pre>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 基础组件文档 */}
<TabsContent value="basic-components" className="space-y-6">
<ComponentDoc
name="Button"
description="按钮组件,支持多种样式和状态"
props={[
{
name: "variant",
type: "'default' | 'secondary' | 'outline' | 'ghost' | 'destructive'",
default: "'default'",
description: "按钮样式变体",
},
{ name: "size", type: "'sm' | 'default' | 'lg'", default: "'default'", description: "按钮大小" },
{ name: "disabled", type: "boolean", default: "false", description: "是否禁用" },
{ name: "onClick", type: "() => void", default: "-", description: "点击事件处理函数" },
]}
example={`<Button variant="primary" size="lg" onClick={() => alert('clicked')}>
点击我
</Button>`}
/>
<ComponentDoc
name="Card"
description="卡片容器组件,用于包装内容"
props={[
{ name: "className", type: "string", default: "-", description: "自定义CSS类名" },
{ name: "children", type: "ReactNode", default: "-", description: "卡片内容" },
]}
example={`<Card>
<CardHeader>
<CardTitle>标题</CardTitle>
<CardDescription>描述</CardDescription>
</CardHeader>
<CardContent>
内容区域
</CardContent>
</Card>`}
/>
<ComponentDoc
name="Input"
description="输入框组件,支持多种类型"
props={[
{
name: "type",
type: "'text' | 'email' | 'password' | 'number'",
default: "'text'",
description: "输入类型",
},
{ name: "placeholder", type: "string", default: "-", description: "占位符文本" },
{ name: "disabled", type: "boolean", default: "false", description: "是否禁用" },
{ name: "value", type: "string", default: "-", description: "输入值" },
{ name: "onChange", type: "(e: ChangeEvent) => void", default: "-", description: "值变化回调" },
]}
example={`<Input
type="email"
placeholder="请输入邮箱"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>`}
/>
</TabsContent>
{/* 自定义组件文档 */}
<TabsContent value="custom-components" className="space-y-6">
<ComponentDoc
name="PageHeader"
description="页面头部组件,提供统一的页面标题和描述布局"
props={[
{ name: "title", type: "string", default: "-", description: "页面标题" },
{ name: "description", type: "string", default: "-", description: "页面描述" },
{ name: "actions", type: "ReactNode", default: "-", description: "操作按钮区域" },
{ name: "breadcrumb", type: "ReactNode", default: "-", description: "面包屑导航" },
]}
example={`<PageHeader
title="设备管理"
description="管理所有连接的设备"
actions={<Button>添加设备</Button>}
/>`}
/>
<ComponentDoc
name="StatCard"
description="统计卡片组件,用于展示关键指标"
props={[
{ name: "title", type: "string", default: "-", description: "统计标题" },
{ name: "value", type: "string | number", default: "-", description: "统计值" },
{ name: "icon", type: "ReactNode", default: "-", description: "图标" },
{ name: "trend", type: "{ value: number; isPositive: boolean }", default: "-", description: "趋势信息" },
{ name: "description", type: "string", default: "-", description: "描述信息" },
]}
example={`<StatCard
title="总设备数"
value="1,234"
icon={<Smartphone className="h-6 w-6" />}
trend={{ value: 12, isPositive: true }}
/>`}
/>
</TabsContent>
{/* 最佳实践 */}
<TabsContent value="best-practices" className="space-y-6">
<Card>
<CardHeader>
<CardTitle></CardTitle>
<CardDescription>使</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div>
<h3 className="text-lg font-semibold mb-3">使</h3>
<ul className="space-y-2 text-gray-600">
<li> 使</li>
<li> </li>
<li> 使TypeScript确保类型安全</li>
<li> </li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3"></h3>
<ul className="space-y-2 text-gray-600">
<li> 使React.memo优化组件渲染</li>
<li> 使useCallback和useMemo</li>
<li> render中创建新对象</li>
<li> 使</li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<h3 className="text-lg font-semibold mb-3">访</h3>
<ul className="space-y-2 text-gray-600">
<li> ARIA标签</li>
<li> </li>
<li> </li>
<li> alt属性</li>
<li> 使HTML标签</li>
</ul>
</div>
</CardContent>
</Card>
</TabsContent>
{/* 更新日志 */}
<TabsContent value="changelog" className="space-y-6">
<Card>
<CardHeader>
<CardTitle></CardTitle>
<CardDescription></CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-6">
<div>
<div className="flex items-center gap-2 mb-2">
<Badge>v1.2.0</Badge>
<span className="text-sm text-gray-500">2024-01-15</span>
</div>
<h4 className="font-medium mb-2"></h4>
<ul className="text-sm text-gray-600 space-y-1">
<li> FileUploader </li>
<li> Wizard </li>
<li> NotificationSystem </li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<div className="flex items-center gap-2 mb-2">
<Badge variant="secondary">v1.1.0</Badge>
<span className="text-sm text-gray-500">2024-01-10</span>
</div>
<h4 className="font-medium mb-2"></h4>
<ul className="text-sm text-gray-600 space-y-1">
<li> DeviceSelector </li>
<li> DataTable </li>
<li> </li>
</ul>
</div>
<Separator />
<div>
<div className="flex items-center gap-2 mb-2">
<Badge variant="outline">v1.0.0</Badge>
<span className="text-sm text-gray-500">2024-01-01</span>
</div>
<h4 className="font-medium mb-2"></h4>
<ul className="text-sm text-gray-600 space-y-1">
<li> UI组件库</li>
<li> </li>
<li> </li>
</ul>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
</Tabs>
</div>
)
}
// 组件文档展示组件
function ComponentDoc({
name,
description,
props,
example,
}: {
name: string
description: string
props: Array<{
name: string
type: string
default: string
description: string
}>
example: string
}) {
return (
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2">
{name}
<Badge variant="outline"></Badge>
</CardTitle>
<CardDescription>{description}</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<div>
<h4 className="font-medium mb-3"> (Props)</h4>
<Table>
<TableHeader>
<TableRow>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{props.map((prop) => (
<TableRow key={prop.name}>
<TableCell className="font-mono text-sm">{prop.name}</TableCell>
<TableCell className="font-mono text-sm text-blue-600">{prop.type}</TableCell>
<TableCell className="font-mono text-sm">{prop.default}</TableCell>
<TableCell>{prop.description}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</div>
<div>
<h4 className="font-medium mb-3">使</h4>
<div className="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto">
<pre className="text-sm">{example}</pre>
</div>
</div>
</CardContent>
</Card>
)
}