第11节:前端 UI 设计与前端基础组件

第11节:前端 UI 设计与前端基础组件 前面几节里我们已经把 Hify 的后端基础设施、前端工程骨架和一键启动链路都搭起来了。到这一步项目已经从“空目录”变成了“能运行的工程”。但如果你打开现在的前端页面大概率还是会有一种很强烈的感觉它能用但还不像一个真正的产品。对很多后端工程师来说前端最难的地方往往不是语法而是另外两件事怎么把页面从“能用”做成“好看”怎么把那些每个页面都会重复写的东西抽成公共组件也正因为这个原因很多人一提到前端就会本能地往后躲。不是因为完全做不出来而是因为细节太多、迭代太慢、自己又很难判断什么叫“设计感”和“组件化做对了”。这一节我想解决的就是这个问题。而且这次我们不只是让 Claude Code 帮忙“写页面”而是让它在三个角色里一起工作当设计师先帮你定风格、出初稿当前端工程师把公共组件一次性封装好当实现搭档配合你一轮一轮打磨细节如果前面几节你已经接受了“让 AI 参与架构和基础设施设计”那么这一节其实是在继续往前走一步让 AI 参与界面设计与产品打磨。第一部分先让 AI 当设计师而不是直接让它“随便做个页面”很多人第一次让 AI 做前端最常见的问题就是提示词太空。比如只说一句帮我设计一个好看的后台页面。这种说法看起来像是在给自由度实际效果往往是让它瞎猜。最后出来的页面通常不会丑但也很容易变成一种“标准 AI 风格”工整、干净、没明显错误但也没什么记忆点。如果你想让 Claude Code 真正参与设计提示词不能只停留在“好看”这一级而要把设计约束讲清楚。第一步先定视觉方向我当时先没有让 Claude Code 直接改代码而是先用咨询模式让它帮我做一套设计系统的初稿。提示词是这样的Hify是一个AI Agent开发平台面向技术团队内部使用主要用户是开发者和技术管理者。界面以管理后台为主——大量的表格、表单、配置页面加上一个对话交互页面。我想要的视觉风格浅底 科技感点缀。整体用浅色背景保持信息可读性管理后台表格多深色底长时间看眼睛累。但不要太素——侧边栏用深色底按钮和关键交互元素用亮色制造科技感和品牌感。色调方向主色用蓝紫系科技感强辅色用青色或薄荷绿数据/状态指示。参考Linear、Supabase的视觉风格——干净但不无聊有设计感但不花哨。帮我设计一套完整的设计系统主色/辅色/背景色阶/文字色阶/圆角/阴影/过渡动效用CSS变量输出。Figure 1: Claude Code 生成前端设计系统初稿这条提示词之所以有效不是因为它字多而是因为它信息层级清楚先说产品是什么再说主要用户是谁再说界面场景是什么再给出你想要的视觉方向再补色调偏好最后给参考锚点这个结构很重要。因为 Claude Code 做设计时跟写代码一样也需要约束和上下文。你说得越具体它猜得越少第一稿就越接近你想要的东西。第二步先改最显眼的部分优先做侧边栏如果要从一个页面里挑出“改完最立竿见影”的区域我几乎总会先选侧边栏。原因很简单它是用户打开页面后第一眼就看到的地方而且它决定了整个后台的第一层气质。所以我给 Claude Code 的下一条指令是改造Hify的侧边栏。要求背景用深色接近纯黑但不是纯黑用 --color-bg-dark和浅色内容区形成对比顶部Logo区域显示Hify品牌名用主色渐变文字下面一行小字 “AI Agent Platform”菜单项默认白色文字 透明背景hover时背景微亮rgba白色10%透明度选中态左边一条3px的主色竖线 背景微亮菜单图标每个菜单项前加Element Plus图标模型管理用SettingAgent管理用User对话用ChatDotRound底部折叠/展开按钮版本号整体要炫酷有科技感但不能花哨到影响使用Figure 2: 侧边栏视觉升级后的效果这一步很值得注意的一点是提示词里不是只说“做得高级一点”而是把几个最关键的视觉元素拆开说清楚了比如背景、Logo、选中态、图标、底部区域。这样做的好处是你不是在评价一个模糊的整体而是在控制几个具体可改的设计点。第三步把页面整体布局拉到统一节奏侧边栏改完之后下一步就该处理页面整体布局。因为真正的“设计感”很多时候不是来自某个单独控件而是来自背景和卡片之间有没有层次标题区和内容区节奏是否统一间距是不是稳定按钮主次是否清楚我给 Claude Code 的提示词是优化Hify的页面整体布局顶栏左侧面包屑导航显示当前页面路径右侧用户信息区域头像 用户名placeholder内容区背景用 --color-bg-secondary浅灰内容卡片用白色背景 轻阴影 圆角和背景有层次感页面标题区域每个页面顶部有标题 描述文字 操作按钮区右侧间距统一页面边距24px卡片内边距20px元素间距16px按钮样式主要操作用主色渐变按钮蓝紫渐变次要操作用白色边框按钮危险操作用红色Figure 3: 页面整体布局和内容卡片层次优化Figure 4: 顶栏、标题区与按钮层级的统一效果到这里前端页面通常就已经会从“原型味很重”变成“有产品感”的状态了。第二部分前端基础组件不要一个页面一个页面重复造光把视觉风格调漂亮还不够。如果你后面每做一个页面都要重新写表格加载状态分页逻辑弹窗显隐控制删除确认通知提示请求三态管理那速度还是会很慢。对后端工程师来说前端最耗时间的常常不是业务逻辑本身而是这些碎而重复的交互样板代码。所以这里的思路和后端很像先把基础组件抽出来后面做业务页面时只填配置。一条完整指令直接生成一批公共组件这一步我没有一个组件一个组件去搭而是直接给 Claude Code 一条完整指令让它一次性生成前端公共组件。提示词是在hify-web中创建以下前端公共组件放在src/components/目录下。所有组件使用Vue 3 Composition API TypeScript Element PlusHifyTable.vue通用列表页表格组件。Props接收columns配置label/prop/width/slot、api方法返回PageResult格式、是否显示分页。内部自动管理loading状态、分页参数、数据请求。暴露refresh()方法供外部调用刷新。空状态显Element Plus的el-empty。HifyFormDialog.vue通用表单弹窗组件。Props接收 title、width、表单rules。v-model控制显示隐藏。内部管理提交loading、关闭时自动重置表单。暴露open(data?)方法传data为编辑模式不传为新增模式。提交时触发submi事件由父组件处理API调用。src/composables/useConfirm.ts删除确认composable。接收确认文案和API方法弹出ElMessageBox确认框确认后调用API成功后显示ElMessage成功提示返回Promise。一行代码完成 “确认删除→调接口→提示成功” 全流程。src/composables/useRequest.ts请求状态管理composable。接收API方法返回 { data, loading, error, execute }。自动管理三态避免每个页面写try-catch-finally样板代码。src/utils/notify.ts统一通知封装。导出notifySuccess/notifyError/notifyWarning三个方法底层调用ElMessage统一配置duration和样式。 每个组件要有TypeScript类型定义用泛型支持不同数据类型。组件风格和第一步定的设计系统一致。Figure 5: 一条指令生成前端公共组件集合这一步我特别想强调一个观念后端工程师做前端不需要把大量时间耗在组件实现细节上。你真正要做的是把组件接口和行为讲清楚它接收什么输入它自动处理哪些状态它向外暴露什么能力它和项目已有约定如何对接只要这几个点说清楚Claude Code 通常就能把第一版搭出来。然后你快速过一遍TypeScript 类型对不对组件接口设计顺不顺手和 Element Plus 的结合有没有明显问题前端组件本身不需要每一行都深度 review能用、顺手、可继续扩展通常就够了。第三部分真正花时间、也最有价值的其实是细节打磨UI 和基础组件都有了但实际打开页面时你一定还是会觉得有很多地方不够顺眼。这是完全正常的。因为前端设计几乎从来不是“一条指令出完美结果”而是先出一个可用初稿再通过多轮非常具体的反馈不断打磨这个来回调整的过程恰恰最能体现人机协作的价值。用 ProviderList 页面演示真实的打磨过程我先让 Claude Code 基于刚才封装好的组件生成一个完整的 Provider 列表页面。提示词是用HifyTable和HifyFormDialog实现Provider列表页面src/views/provider/ProviderList.vue。用mock数据不调真实API。 列表展示名称、类型OpenAI/Claude/Gemini/Ollama、Base URL、状态启用/禁用用el-tag显示、创建时间、操作编辑/删除。 页面顶部有标题 “模型提供商管理”、描述文字、右侧 “新增提供商” 按钮。 点新增弹出HifyFormDialog表单字段名称、类型下拉、API Key、Base URL。 删除用useConfirm。 mock数据写5条类型分布开。这一步做完之后我不会立刻去看源码而是先启动页面看效果。因为在 UI 这件事上真正的判断来自“看起来对不对”而不是“代码像不像对的”。第一轮调布局第一版页面最常见的问题通常是间距和节奏不对。比如我当时给 Claude Code 的反馈是ProviderList页面的表格和顶部标题区之间间距太大了从24px改成16px。表格的行高偏高把el-table的row-style行高从默认改成52px。操作列的两个按钮间距太小加8px的margin-left。这类问题非常适合交给 Claude Code。你不需要自己去翻样式文件也不用手动试来试去只要能准确指出哪里不对、想改成什么它通常就能非常快地改到位。第二轮调状态色颜色的判断也很典型。比如 Provider 页面里“禁用”状态如果被 Claude Code 第一版做成红色其实并不是严格意义上的错误但从产品感觉上说它不够合适。所以我的反馈是状态列的el-tag颜色不对。启用状态用绿色type“success”禁用状态用灰色type“info”不要用红色——禁用不是错误不应该用danger色。这就是一个非常典型的“AI 先出初稿人做审美判断”的场景。Claude Code 的第一版通常会基于一种通用直觉来处理状态而你更了解这个页面在真实产品语境里的含义所以你来做最后判断。第三轮调弹窗和表单细节表单弹窗也很容易在第一版里显得不够顺手。比如我给过 Claude Code 这样一轮调整新增提供商的弹窗宽度太宽了600px改成520px。API Key输入框改成password类型加一个 “显示/隐藏” 切换按钮。Base URL输入框加placeholder示例“https://api.openai.com/v1”。表单label宽度统一100px从左对齐改成右对齐。这种调整很能说明一件事你未必会写 Vue 组件细节但你完全可以通过“视觉和使用体验判断”来指导 Claude Code 把它改好。第四轮补响应式细节如果页面只在宽屏下好看很多时候还是不够的。我当时还会继续往前推一层当浏览器宽度小于1200px时侧边栏自动折叠成只显示图标的窄模式。表格在窄屏下隐藏Base URL和创建时间两列只保留关键信息。这一步特别重要因为它会强迫你从“单一静态效果”转向“真实使用场景”去看页面。第五轮做整体微调最后再来一轮整体细节调整比如整体看一下ProviderList页面做以下微调表格头部背景色太深了换成 --color-bg-secondary浅灰分页器居右对齐上方加一条细分割线“新增提供商” 按钮加一个Plus图标鼠标悬停表格行时背景微微变色hover效果操作列的 “编辑” 按钮用text类型蓝色“删除” 用text类型红色不要默认的primary按钮样式这时候你会发现真正的 UI 打磨过程几乎从来不是“出一个大方案”而是这种一轮一轮、非常具体的小调整。而这恰好也是 Claude Code 最适合协作的方式之一。因为它不怕琐碎也不嫌你改得细。你只要说得足够具体它就能快速把你的判断翻译成代码。真正重要的认知你不一定要会写 CSS但你要能看出哪里不对这一节最核心的收获我觉得不是你学会了几个 Vue 组件也不是你背下了什么 UI 设计原则。真正重要的是下面这件事你不一定需要亲自写前端细节但你必须能说清楚“哪里不对”和“应该怎样”。比如间距太大改成 16px禁用状态不该用红色应该用灰色弹窗太宽收窄到 520pxhover 效果不够明显需要更轻一点的背景变化这些判断不依赖你是不是专业前端工程师它更像是一种产品和设计判断能力。而 Claude Code 的价值就在于它可以把这种判断快速翻译成可执行的实现。也就是说你不需要亲自去精通每一行 CSS但你要学会用自己的眼睛和产品直觉来做反馈。一旦这套协作方式跑顺了后面做 Agent 页面、对话页面、工作流页面其实都只是同一种方法的重复。总结这一节我们其实做了三件非常关键的事先让 Claude Code 参与前端视觉设计而不是只把它当页面生成器用一条完整指令把前端公共组件一次性封装起来通过 Provider 页面的一轮轮微调建立真实的 UI 打磨协作流程如果要把这一节的方法论压缩成三句话我会这样说第一让 AI 当设计师时输入一定要具体。不要只说“做得好看一点”而要告诉它产品是什么、用户是谁、你想要什么风格、有什么参考锚点。第二前端基础组件要提前封装不要每个页面重复造轮子。列表页表格、表单弹窗、删除确认、请求状态、统一通知这些东西一旦抽出来后面做业务页面会快很多。第三真正有价值的不是第一版而是你和 Claude Code 之间的多轮细节打磨。第一版几乎永远不会完美真正的水平来自你能否看着页面清楚说出哪里不对、为什么不对、该怎么改。到这里Hify 的前端已经不再只是“有几个页面能打开”而是开始具备一套真正像产品的视觉语言和组件体系了。而这也意味着接下来进入正式业务页面开发时你不再是在一块空白画布上硬做而是在一个已经有设计系统、有公共组件、有打磨方法的前端基础上继续往前推进。