# 页面视图开发 :::tip 说明 页面视图位于 `src/views/` 目录,每个业务模块遵循 `index.vue`(列表页)+ `edit.vue`(编辑弹窗)+ `detail.vue`(详情弹窗)的标准模式,辅以 `columns.ts`(列定义)和 `querySchemas.ts`(搜索表单)配置文件。 ::: ## 目录结构 ``` src/views/ ├── tool/ │ ├── example/ │ │ ├── index.vue # 案例列表页 │ │ ├── edit.vue # 案例编辑弹窗 │ │ ├── detail.vue # 案例详情弹窗 │ │ ├── columns.ts # 表格列定义 │ │ └── querySchemas.ts # 搜索表单定义 │ └── ... └── ... ``` ## 文件职责 | 文件 | 职责 | 说明 | |------|------|------| | `index.vue` | 列表页 | 搜索表单 + 工具栏 + BasicTable + 编辑弹窗引用 | | `edit.vue` | 编辑弹窗 | a-modal + a-form,懒加载 | | `detail.vue` | 详情弹窗 | a-modal 展示详情,懒加载 | | `columns.ts` | 表格列定义 | 定列 dataIndex、title、customRender 函数等 | | `querySchemas.ts` | 搜索表单定义 | FormSchema 数组,定义搜索字段 | ## index.vue 列表页 以案例管理为例,完整结构如下: ```vue ``` ## columns.ts ```typescript import { h } from 'vue'; import { Tag, Image } from 'ant-design-vue'; export const columns = [ { title: 'ID', dataIndex: 'id', fixed: 'left', width: 50, }, { title: '案例名称', dataIndex: 'name', width: 150, }, { title: '案例图片', dataIndex: 'avatar', width: 150, customRender({ record }) { return record.avatar ? h(Image, { src: record.avatar, width: 48, height: 48, fit: 'cover', preview: true }) : h('span', '-'); }, }, { title: '案例类型', dataIndex: 'type', width: 100, customRender({ record }) { const statusMap = { 1: { text: '类型1', color: 'success' }, 2: { text: '类型2', color: 'error' }, 3: { text: '类型3', color: 'warning' }, 4: { text: '类型4', color: 'default' } }; const status = statusMap[record.type]; return h(Tag, { color: status?.color || 'default' }, { default: () => status?.text || record.type }); }, }, { title: '案例状态', dataIndex: 'status', width: 100, customRender({ record }) { const statusMap = { 1: { text: '正常', color: 'success' }, 2: { text: '禁用', color: 'error' } }; const status = statusMap[record.status]; return h(Tag, { color: status?.color || 'default' }, { default: () => status?.text || record.status }); }, }, { title: '排序', dataIndex: 'sort', width: 100, }, { title: '创建人', dataIndex: 'createUser', width: 100, }, { title: '创建时间', dataIndex: 'createTime', width: 180, }, { title: '操作', fixed: 'right', dataIndex: 'action', key: 'action', width: 200, }, ]; ``` ## querySchemas.ts ```typescript import { FormSchema } from '@/components/Form/index'; export const schemas: FormSchema[] = [ { name: 'name', component: 'Input', label: '案例名称', componentProps: { placeholder: '请输入案例名称', clearable: true, allowClear: true }, }, { name: 'type', component: 'Select', label: '案例类型', componentProps: { placeholder: '请输入案例类型', clearable: true, allowClear: true, options: [ { label: '类型1', value: 1 }, { label: '类型2', value: 2 }, { label: '类型3', value: 3 }, { label: '类型4', value: 4 }, ], }, }, { name: 'status', component: 'Select', label: '案例状态', componentProps: { placeholder: '请输入案例状态', clearable: true, allowClear: true, options: [ { label: '正常', value: 1 }, { label: '禁用', value: 2 }, ], }, }, ]; ``` ## 数据流 ``` 页面加载 → BasicForm 注册 → BasicTable request 触发 → loadDataTable → API → 渲染表格 用户搜索 → handleSubmit → 更新 formParams → reloadTable → 重新请求 用户新增 → handleAdd → currentId=0 → editVisible=true → edit.vue 加载 → 表单填写 → 提交 用户编辑 → handleEdit → currentId=id → editVisible=true → edit.vue 加载详情 → 修改 → 提交 用户删除 → Modal.confirm → API → reloadTable ``` :::tip 温馨提示 `columns.ts` 和 `querySchemas.ts` 独立为配置文件,便于维护和复用。`columns` 中的 `customRender` 函数使用 Vue 的 `h()` 创建虚拟 DOM,可实现任意复杂的自定义渲染。`querySchemas` 中的 `options` 硬编码或通过字典 API 动态获取。 ::: ## 总结 页面视图遵循 `index.vue` + `edit.vue` + `detail.vue` + `columns.ts` + `querySchemas.ts` 标准模式。列表页使用 `BasicForm` 搜索 + `BasicTable` 展示数据 + `bodyCell` 插槽操作按钮,编辑弹窗使用 `defineAsyncComponent` 懒加载 + `useLockFn` 防重复提交。