一键导入
ui-prototype
// 基于现有页面快速生成 UI 原型。当需要设计新页面、修改现有页面布局、新增 UI 功能模块,或需要向产品/设计对齐 UI 方案时使用。支持截图输入和文字描述输入。
// 基于现有页面快速生成 UI 原型。当需要设计新页面、修改现有页面布局、新增 UI 功能模块,或需要向产品/设计对齐 UI 方案时使用。支持截图输入和文字描述输入。
Use when creating a TAPD test request from PRs or requirement changes and needing a standardized, reusable template for BKFlow.
独立的原型生成工具。用自然语言描述需求,AI 澄清后生成高保真可交互的 HTML 原型。触发条件:"做个原型"、"设计页面"、"出个交互稿"、"prototype xxx"
Use when development requirements are confirmed and before implementation starts - ensures a TAPD work item exists for the work, creating one if needed.
After implementing or modifying API code in bkflow/apigw, automatically updates or generates apidoc markdown files in bkflow/apigw/docs/zh/. Use when API views, serializers, or routes are changed, or when the user asks to sync API docs or generate apidoc.
| name | ui-prototype |
| description | 基于现有页面快速生成 UI 原型。当需要设计新页面、修改现有页面布局、新增 UI 功能模块,或需要向产品/设计对齐 UI 方案时使用。支持截图输入和文字描述输入。 |
核心理念:代码即原型。不画 Figma,直接在现有页面基础上用代码迭代 UI 方案。 AI 生成可运行的 Vue 组件代码,浏览器中预览,快速迭代至满意。
本项目前端技术栈:
| 技术 | 版本 | 说明 |
|---|---|---|
| Vue | 2.7.14 | Options API 为主 |
| bk-magic-vue | 2.5.8 | 蓝鲸 MagicBox 组件库,组件以 bk- 前缀使用 |
| Element UI | 2.15.13 | 辅助组件库,用于 bk-magic-vue 未覆盖的场景 |
| Vue Router | 2.x | 路由 |
| Vuex | 2.x | 状态管理 |
| vue-i18n | 7.x | 国际化,使用 $t('中文') 包裹文案 |
| AntV X6 | 2.x | 画布/流程编排 |
组件使用优先级:bk-magic-vue > Element UI > 原生 HTML
两种输入模式:
| 输入方式 | AI 行为 |
|---|---|
| 截图 + 描述 | 分析截图中的现有布局,理解要在哪里改、改什么 |
| 纯文字描述 | 找到最相似的现有页面作为基线,在其基础上设计 |
AI 必须做的事:
frontend/src/views/ 下找到与需求最相关的现有页面.vue 文件,理解现有布局、组件使用、样式模式输出格式:
📐 原型范围确认
**基线页面**:`frontend/src/views/admin/Space/Credential/index.vue`
**现有布局**:顶部操作栏 + 数据表格 + 侧滑面板
**改动范围**:[新增 / 修改 / 重新设计]
**具体内容**:
- [改动点 1]
- [改动点 2]
确认后我开始生成原型代码。
触发条件:后端代码已存在(改造已有功能、重构现有页面)。 跳过条件:全新功能、后端尚未开发——此时基于用户提供的需求描述或产品文档设计表单,在原型报告中注明"字段待后端确认"。
先读后端,再画前端。 当后端已有数据模型时,表单类页面的原型必须基于后端数据模型,而非凭截图猜测。
AI 必须做的事:
数据类型 → 控件映射表:
| 后端数据类型 | 表单控件 | bk-magic-vue 组件 |
|---|---|---|
| boolean / choices=["true","false"] | 开关 Switch | bk-switcher |
| string + choices(2 个选项) | 分段按钮 Segmented Control | bk-radio-button-group |
| string + choices(3+ 个选项) | 下拉选择 Select | bk-select + bk-option |
| string(短文本,无 choices) | 文本输入 Input | bk-input |
| string(有格式要求,如时间) | 文本输入 + 格式提示 | bk-input + 下方灰色提示文字 |
| JSON object | 代码编辑器 | FullCodeEditor(Monaco) |
| JSON array(用户列表等) | 标签输入 Tag Input | bk-tag-input 或自定义 Tag 组件 |
| is_mix_type=true(TEXT/JSON 可切换) | 类型切换 + 对应控件 | 分段按钮 [TEXT]/[JSON] + 输入框或编辑器 |
输出格式:
📋 字段-控件映射(共 N 个字段)
| 字段 | 说明 | 类型 | 默认值 | 控件 | 分组 |
|------|------|------|--------|------|------|
| superusers | 空间管理员 | JSON array | [] | 标签输入 | 权限与用户 |
| flow_versioning | 流程版本控制 | choices[true/false] | "false" | Switch | 权限与用户 |
| ... | ... | ... | ... | ... | ... |
当后端已有代码时:映射表必须覆盖后端定义的所有字段,不可遗漏。用户确认映射后才能生成原型。
当后端尚未开发时:基于需求描述推断字段和类型,同样输出映射表,但在每个字段备注列标注"待确认"。此映射表可作为前后端对齐的沟通工具。
核心原则:
$t() 包裹:保持国际化一致性生成模式选择:
| 场景 | 生成方式 |
|---|---|
| 修改现有页面 | 直接修改现有 .vue 文件 |
| 新增子组件 | 在现有页面的 components/ 下新建 .vue 文件 |
| 全新页面 | 在 views/ 对应目录下创建新的 .vue + 注册路由 |
代码结构要求:
<template>
<!-- 使用 bk-magic-vue 组件 -->
</template>
<script>
export default {
name: 'ComponentName',
components: {},
props: {},
data() {
return {
// 用 mock 数据填充,让原型看起来真实
};
},
methods: {
// 交互方法用空实现或 console.log 占位
},
};
</script>
<style lang="scss" scoped>
/* 遵循项目现有样式模式 */
</style>
原型必须用真实感的 Mock 数据,不要用 "Lorem ipsum" 或 "测试1"。
// 好的 Mock 数据
tableData: [
{ id: 1, name: 'prod-api-key', type: 'bearer_token', creator: 'admin', create_at: '2026-02-15 14:30:00' },
{ id: 2, name: 'ci-deploy-token', type: 'app_secret', creator: 'devops', create_at: '2026-02-10 09:15:00' },
]
// 坏的 Mock 数据
tableData: [
{ id: 1, name: '测试', type: 'type1', creator: 'user1', create_at: '2020-01-01' },
]
原型图必须满足两个要求:覆盖所有页面状态 和 标注交互细节。
禁止只出一个 Tab / 一种状态的原型。 页面有多少个 Tab / 分组 / 步骤,就必须生成对应数量的原型图,每个都展示该状态下的所有字段和控件。
| 页面类型 | 需要覆盖的状态 |
|---|---|
| Tab 切换页 | 每个 Tab 各一张原型图 |
| 多步骤表单 | 每个步骤各一张 |
| 列表 + 详情 | 列表页一张 + 详情/编辑态一张 |
| 弹窗/侧滑 | 主页面一张 + 弹窗打开态一张 |
每张原型图必须包含红色编号标注(❶❷❸...),用红色引线指向具体 UI 元素,旁边附交互说明文字。
标注内容必须覆盖:
| 必须标注的交互 | 说明 |
|---|---|
| 保存时机 | 立即保存(onChange)还是失焦保存还是手动点击保存 |
| 校验规则 | 什么时候校验、校验失败的表现(红色边框、错误提示文字) |
| 状态指示 | 如何区分已修改/默认值/未配置 |
| 危险操作 | 恢复默认值、删除等需二次确认的操作 |
| 特殊控件 | 代码编辑器的工具栏按钮、全屏模式、折叠/展开行为 |
| 导航行为 | Tab 切换、URL 同步、搜索跨 Tab 跳转 |
每次生成/修改后,输出以下报告:
---
## 🎨 原型 v[N]
### 原型图
[为每个状态/Tab 生成一张带交互标注的原型图]
### 改动文件
- `path/to/file.vue`: [做了什么]
### 页面结构
[用简洁的文字描述页面布局]
### 各状态下的字段与控件
[按 Tab/分组 列出每个字段使用的控件]
### 交互标注汇总
[按编号列出所有交互标注,每条包含:元素 + 交互行为]
| 编号 | 元素 | 交互说明 |
|------|------|----------|
| ❶ | 搜索框 | 实时搜索,跨 Tab 过滤... |
| ❷ | Switch 开关 | onChange 立即保存... |
---
⏸️ **请预览后反馈**
- **继续迭代** → 告诉我哪里需要调整
- **满意,开始实现** → 我将基于此原型编写完整的功能代码
- **推倒重来** → 描述新的方向
迭代原则:
从原型到正式代码:
当用户说"满意"或"开始实现"时:
test-driven-development skill 编写测试生成原型时优先使用以下组件:
| 组件 | 用途 |
|---|---|
bk-sideslider | 侧滑面板(编辑/新建表单) |
bk-dialog | 弹窗(确认/警告/表单) |
bk-tab / bk-tab-panel | 标签页切换 |
bk-collapse / bk-collapse-item | 折叠面板 |
| 组件 | 用途 |
|---|---|
bk-table / bk-table-column | 数据表格 |
bk-pagination | 分页 |
bk-tag | 标签/状态标记 |
bk-badge | 徽标/计数 |
bk-progress | 进度条 |
bk-tree | 树形控件 |
| 组件 | 用途 |
|---|---|
bk-form / bk-form-item | 表单容器(支持校验) |
bk-input | 文本输入 |
bk-select / bk-option | 下拉选择 |
bk-checkbox / bk-checkbox-group | 多选 |
bk-radio / bk-radio-group | 单选 |
bk-switcher | 开关 |
bk-date-picker | 日期选择 |
bk-time-picker | 时间选择 |
bk-upload | 文件上传 |
| 组件 | 用途 |
|---|---|
bk-button | 按钮(primary / default / text) |
bk-dropdown-menu / bk-dropdown-item | 下拉菜单 |
bk-popover | 气泡提示 |
bk-popconfirm | 气泡确认 |
bk-loading | 加载状态(指令:v-bkloading) |
bk-notify / bk-message | 通知消息(JS 调用) |
| 组件 | 用途 |
|---|---|
bk-navigation | 顶部导航 |
bk-breadcrumb / bk-breadcrumb-item | 面包屑 |
bk-steps | 步骤条 |
在生成原型前,读取以下路径了解项目现有的 UI 模式:
| 模式 | 参考文件 |
|---|---|
| 列表页(搜索+表格+分页) | views/admin/Space/Credential/index.vue |
| 侧滑表单 | views/admin/Space/Credential/components/CredentialSlider.vue |
| Tab 切换页 | views/admin/Space/SpaceConfig/ |
| 任务/流程页 | views/admin/Space/Task/ |
| 模板管理页 | views/admin/Space/Template/ |
读取现有页面的目的:继承其布局模式、间距、组件用法、样式写法,确保原型与现有页面风格统一。
| 规则 | 说明 |
|---|---|
| 先读后端(如已有) | 后端已有代码时,表单类页面必须先读取数据模型再设计控件;全新功能则基于需求描述推断 |
| 先找基线 | 生成任何原型前,必须先找到并读取最相关的现有页面 |
| 控件映射 | 严格按照「数据类型→控件映射表」选择控件,不凭直觉猜测 |
| 全状态覆盖 | 页面有多少个 Tab / 步骤 / 状态,就必须生成对应数量的原型图 |
| 交互标注 | 每张原型图必须带红色编号标注,标在图上而非仅文字描述 |
| 字段无遗漏 | 后端已定义的字段必须全部体现;新功能需列出所有推断字段并标注"待确认" |
| 用项目组件 | 优先 bk-magic-vue,禁止引入 Ant Design、Vuetify 等未使用的库 |
| 真实 Mock | 用接近真实业务的数据,不用占位符 |
| 保持一致 | 与现有页面的风格、间距、配色保持一致 |
| 国际化 | 所有可见文案用 $t() 包裹 |
| 每轮报告 | 每次生成/修改后输出原型报告 |
| 不过度设计 | 原型阶段只做结构和交互,不纠结像素级细节 |
| 错误做法 | 正确做法 |
|---|---|
| 后端已有代码却不读,凭截图猜字段类型 | 先读后端 Config/Model/Serializer,提取完整字段元数据 |
| 只出一个 Tab 的原型,让用户脑补其他 Tab | 每个 Tab/状态都出原型图,全部展示 |
| 交互说明只写文字表格,不标注在图上 | 用红色编号❶❷❸直接标注在原型图上,附引线和说明 |
| 遗漏已有字段,或新功能不列推断字段 | 输出字段-控件映射表,逐一对照确保无遗漏;新功能标注"待确认" |
| 不看现有页面,凭空设计 | 先读取最相关的现有页面作为基线 |
| 使用 Tailwind / 外部 CSS 框架 | 用 SCSS + 项目现有的样式模式 |
| 引入项目未使用的组件库 | 严格使用 bk-magic-vue + Element UI |
| Mock 数据用"测试1" "aaa" | 用接近真实业务的数据 |
| 一次大改,不给用户预览机会 | 小步迭代,每次改完等用户反馈 |
| 原型阶段写完整的后端对接逻辑 | 原型用 Mock 数据,确认后再对接 |
通用 UI 设计原则详见 reference/design-principles.md。