From 8fdce94c47f824a8dee303a2c0a23b5ee5cf5d3d Mon Sep 17 00:00:00 2001 From: sion123 <450702724@qq.com> Date: Mon, 16 Mar 2026 01:13:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/antd-to-shadcn/SKILL.md | 51 +- .../src/components/ui/button/index.ts | 14 +- .../src/components/ui/checkbox/Checkbox.vue | 35 + .../src/components/ui/checkbox/index.ts | 1 + frontend/app/web-gold/src/style.css | 2 +- .../src/views/system/style-settings/index.vue | 753 ++++++++---------- .../components/TaskActionButtons.vue | 66 +- .../components/TaskFilterBar.vue | 162 ++-- .../components/TaskStatusTag.vue | 4 +- .../composables/useTaskList.js | 8 +- .../digital-human-task/index.vue | 525 +++++++----- .../task-management/layout/TaskLayout.vue | 80 +- .../system/task-management/mix-task/index.vue | 751 ++++++++++------- frontend/package.json | 2 + 14 files changed, 1366 insertions(+), 1088 deletions(-) create mode 100644 frontend/app/web-gold/src/components/ui/checkbox/Checkbox.vue create mode 100644 frontend/app/web-gold/src/components/ui/checkbox/index.ts diff --git a/.claude/skills/antd-to-shadcn/SKILL.md b/.claude/skills/antd-to-shadcn/SKILL.md index 5f51beb855..06108e0f9a 100644 --- a/.claude/skills/antd-to-shadcn/SKILL.md +++ b/.claude/skills/antd-to-shadcn/SKILL.md @@ -208,6 +208,53 @@ background: var(--primary) /* 主色 */ border-color: var(--border) /* 边框 */ ``` +## 迁移后检查 + +### Step 5: 现代化与一致性审查 + +迁移完成后,必须进行设计审查: + +**现代化检查**: +- [ ] Tabs 是否使用胶囊式设计(非底部粗线)? +- [ ] 表单间距是否宽松(space-y-6)? +- [ ] 卡片阴影是否克制(shadow-sm)? +- [ ] 边框是否避免重叠? +- [ ] 颜色是否有活力(非灰暗)? +- [ ] 按钮是否有圆角(rounded-lg)? +- [ ] 表格是否简洁无斑马纹? +- [ ] 整体是否有呼吸感? + +**一致性检查**: +- [ ] 相似页面布局是否一致? +- [ ] 同类组件样式是否统一? +- [ ] 间距规范是否遵循(4px 递进)? +- [ ] 颜色使用是否语义化? +- [ ] 字体大小是否有层级? + +### Step 6: 业务功能验证 + +确保迁移没有破坏现有功能: + +**交互检查**: +- [ ] 表单提交是否正常? +- [ ] 按钮点击事件是否触发? +- [ ] 弹窗/对话框是否正常打开关闭? +- [ ] 下拉选择是否正常工作? +- [ ] 分页是否正常? +- [ ] 搜索筛选是否正常? + +**数据检查**: +- [ ] 数据绑定是否正常(v-model)? +- [ ] 列表渲染是否正常? +- [ ] 条件渲染是否正常? +- [ ] 数据加载状态是否显示? + +**边界情况**: +- [ ] 空状态是否显示正常? +- [ ] 错误状态是否处理? +- [ ] 加载状态是否显示? +- [ ] 禁用状态是否正常? + ## 检查清单 迁移完成后验证: @@ -216,4 +263,6 @@ border-color: var(--border) /* 边框 */ - [ ] 图标已迁移到 Iconify - [ ] message/notification 已迁移到 Sonner - [ ] 样式使用 Tailwind 类或 CSS 变量 -- [ ] 业务功能测试通过 +- [ ] **现代化审查通过** +- [ ] **一致性审查通过** +- [ ] **业务功能验证通过** diff --git a/frontend/app/web-gold/src/components/ui/button/index.ts b/frontend/app/web-gold/src/components/ui/button/index.ts index 26e2c559c1..1879ac75d5 100644 --- a/frontend/app/web-gold/src/components/ui/button/index.ts +++ b/frontend/app/web-gold/src/components/ui/button/index.ts @@ -4,21 +4,21 @@ import { cva } from "class-variance-authority" export { default as Button } from "./Button.vue" export const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]", { variants: { variant: { default: - "bg-primary text-primary-foreground hover:bg-primary/90", + "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 hover:shadow-md active:scale-[0.98]", destructive: - "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + "bg-destructive text-white shadow-sm hover:bg-destructive/90 hover:shadow-md active:scale-[0.98]", outline: - "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-transparent dark:text-foreground dark:hover:bg-accent dark:hover:text-accent-foreground", secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", + "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80 dark:bg-secondary/50 dark:text-foreground", ghost: - "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", - link: "text-primary underline-offset-4 hover:underline", + "hover:bg-accent hover:text-accent-foreground dark:text-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline dark:text-primary", }, size: { "default": "h-9 px-4 py-2 has-[>svg]:px-3", diff --git a/frontend/app/web-gold/src/components/ui/checkbox/Checkbox.vue b/frontend/app/web-gold/src/components/ui/checkbox/Checkbox.vue new file mode 100644 index 0000000000..6604cbdb0e --- /dev/null +++ b/frontend/app/web-gold/src/components/ui/checkbox/Checkbox.vue @@ -0,0 +1,35 @@ + + + diff --git a/frontend/app/web-gold/src/components/ui/checkbox/index.ts b/frontend/app/web-gold/src/components/ui/checkbox/index.ts new file mode 100644 index 0000000000..3391a85758 --- /dev/null +++ b/frontend/app/web-gold/src/components/ui/checkbox/index.ts @@ -0,0 +1 @@ +export { default as Checkbox } from "./Checkbox.vue" diff --git a/frontend/app/web-gold/src/style.css b/frontend/app/web-gold/src/style.css index 714e9d477f..75cd84fdb8 100644 --- a/frontend/app/web-gold/src/style.css +++ b/frontend/app/web-gold/src/style.css @@ -17,7 +17,7 @@ --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.45 0.16 254.604); + --primary: oklch(0.55 0.18 254.604); --primary-foreground: oklch(0.985 0 0); --secondary: oklch(0.97 0.001 264.695); --secondary-foreground: oklch(0.205 0.015 264.695); diff --git a/frontend/app/web-gold/src/views/system/style-settings/index.vue b/frontend/app/web-gold/src/views/system/style-settings/index.vue index ef03909350..55aa095292 100644 --- a/frontend/app/web-gold/src/views/system/style-settings/index.vue +++ b/frontend/app/web-gold/src/views/system/style-settings/index.vue @@ -1,7 +1,51 @@ - - diff --git a/frontend/app/web-gold/src/views/system/task-management/components/TaskFilterBar.vue b/frontend/app/web-gold/src/views/system/task-management/components/TaskFilterBar.vue index 763eaacb0f..ce110b5713 100644 --- a/frontend/app/web-gold/src/views/system/task-management/components/TaskFilterBar.vue +++ b/frontend/app/web-gold/src/views/system/task-management/components/TaskFilterBar.vue @@ -1,68 +1,83 @@ - diff --git a/frontend/app/web-gold/src/views/system/task-management/components/TaskStatusTag.vue b/frontend/app/web-gold/src/views/system/task-management/components/TaskStatusTag.vue index 227dfe910d..d0b21bda6c 100644 --- a/frontend/app/web-gold/src/views/system/task-management/components/TaskStatusTag.vue +++ b/frontend/app/web-gold/src/views/system/task-management/components/TaskStatusTag.vue @@ -1,7 +1,7 @@ @@ -427,44 +631,21 @@ onMounted(fetchList) background: var(--color-bg-card); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); - - .filter-select, - .filter-input { - width: 200px; - } - - .filter-date-picker { - width: 280px; - } } .task-page__content { flex: 1; - overflow: auto; + overflow: hidden; background: var(--color-bg-card); border-radius: var(--radius-lg); padding: var(--space-4); + display: flex; + flex-direction: column; box-shadow: var(--shadow-sm); } .batch-toolbar { - padding: var(--space-2) 0; -} - -.title-cell { - display: flex; - align-items: center; - gap: var(--space-2); -} - -.text-muted { - color: var(--color-gray-400); -} - -.action-btn { - &--primary { color: var(--color-primary-500); &:hover { color: var(--color-primary-600); } } - &--success { color: var(--color-success-500); &:hover { color: var(--color-success-600); } } - &--danger { color: var(--color-error-500); &:hover { color: var(--color-error-600); } } + flex-shrink: 0; } .expanded-content { @@ -482,7 +663,7 @@ onMounted(fetchList) padding: var(--space-3); background: var(--color-gray-100); border-radius: var(--radius-md); - line-height: var(--line-height-base); + line-height: 1.5; } } @@ -515,7 +696,7 @@ onMounted(fetchList) padding: var(--space-2) var(--space-3); background: var(--color-gray-100); border-radius: var(--radius-md); - transition: box-shadow var(--duration-fast) var(--ease-out); + transition: box-shadow var(--duration-fast) ease; &:hover { box-shadow: var(--shadow-sm); @@ -538,21 +719,9 @@ onMounted(fetchList) .preview-loading { display: flex; + flex-direction: column; justify-content: center; align-items: center; min-height: 200px; } - -:deep(.ant-table-tbody > tr > td) { - padding: var(--space-3) var(--space-2); -} - -:deep(.ant-table-thead > tr > th) { - background: var(--color-gray-50); - font-weight: var(--font-weight-semibold); -} - -:deep(.ant-btn .anticon) { - line-height: 0; -} diff --git a/frontend/package.json b/frontend/package.json index de48457c36..d881950d9c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,8 +18,10 @@ "axios": "^1.12.2", "github-markdown-css": "^5.8.1", "localforage": "^1.10.0", + "lucide-vue-next": "^0.575.0", "unocss": "^66.5.4", "vite-plugin-compression2": "^2.4.0", + "vue-sonner": "^2.0.9", "web-storage-cache": "^1.1.1" } }