3.9 前端联调指引
概述
前端每个列表模块由三件套组成:api/{域}/{模块}.ts(接口)、views/{域}/{模块}/columns.ts(表格列)、views/{域}/{模块}/querySchemas.ts(筛选表单)。三者与后端 gmeta/Req 字段严格对齐,本节以 example 模块真实代码演示。
接口模块(真实代码,摘自 ui/src/api/tool/example.ts)
ts
import { http } from '@/utils/http/axios';
/**
* 案例演示模块接口
*
* 提供案例演示的增删改查及导入导出接口调用。
*/
/**
* 获取案例演示分页列表
*
* @param params 查询参数,包含 pageNo、pageSize 及业务筛选条件
* @returns 分页结果,含 records、total、size、current、pages
*/
export function getExamplePage(params?: Record<string, any>) {
return http.request({
url: '/example/page',
method: 'GET',
params,
});
}
/**
* 根据 ID 获取案例演示详情
*
* @param id 案例演示ID
* @returns 案例演示详情数据
*/
export function getExampleDetail(id) {
return http.request({
url: '/example/detail/' + id,
method: 'get',
});
}
/**
* 添加案例演示
*
* @param data 案例演示数据
* @returns 新记录的 ID
*/
export function exampleAdd(data: any) {
return http.request({
url: '/example/add',
method: 'POST',
data,
});
}要点:url 不含 /api(axios baseURL 已是 /api);GET 用 params、写操作用 data;路径与后端 gmeta path 逐条对齐。
筛选表单(真实代码,摘自 views/tool/example/querySchemas.ts)
ts
import { FormSchema } from '@/components/Form/index';
/**
* 案例演示查询表单配置
*
* 定义列表页搜索区域的表单项,字段来自 filter_fields,
* 按字段类型自动选择组件:
* - 字符型用 Input;
* - 带选项的字段用 Select;
* - 纯数字字段用 InputNumber;
* - 日期字段用 DatePicker。
*/
export const schemas: FormSchema[] = [
{
// 案例名称
field: 'name',
component: 'Input',
label: '案例名称',
componentProps: {
placeholder: '请输入案例名称',
clearable: true,
},
},
{
// 案例类型
field: 'type',
component: 'Select',
label: '案例类型',
componentProps: {
placeholder: '请输入案例类型',
clearable: true,
// 选项列表:值用于查询,标签用于展示
options: [
{ label: '类型1', value: 1 },
{ label: '类型2', value: 2 },
{ label: '类型3', value: 3 },
{ label: '类型4', value: 4 },
],
},
},
];筛选对齐三件套(2026-10-14 定稿)
text
前端 querySchemas.ts 每个输入框
↔ XxxPageReq 同名驼峰字段
↔ logic spec 声明
字符串 Input → LikeFields(逐列模糊,值取 req 同名字段)
Select/InputNumber → EqFields(等值,零值跳过)
关键词框 → KeywordFields(能力保留在基座,模块按需声明)example 对应关系:querySchemas 的 name(Input)↔ ExamplePageReq.Name ↔ LikeFields: []string{"name"};type/status(Select)↔ EqFields。导出统一走 spec.applyFilters 与列表同套筛选(导出=所见)。
表格列(真实代码,摘自 views/tool/example/columns.ts)
ts
import { h } from 'vue';
import { ElAvatar, ElTag } from 'element-plus';
/**
* 案例演示表格列配置
*
* 定义列表页表格的显示列,包含多选框、ID、各业务字段及审计字段。
* 字段按类型自动选择渲染方式:图片用 ElAvatar、选项用 ElTag、
* 链接用 a 标签,其余为普通文本。
*/
export const columns = [
{
type: 'selection', // 多选框列
},
{
label: 'ID',
prop: 'id',
fixed: 'left',
width: 50,
},
{
label: '案例图片',
prop: 'avatar',
minWidth: 120,
// 图片渲染:以方形头像形式展示
render(record) {
return h(ElAvatar, {
size: 48,
src: record.row.avatar,
shape: 'square',
fit: 'fill',
});
},
},
// …
];枚举列显示 {field}Text(如 statusText,由后端字典填充),保证文案唯一真相在字典管理页。
页面文件组织
text
views/tool/example/
├── index.vue # 列表页(分页表格 + querySchemas 筛选区 + 增删改入口)
├── edit.vue # 新增/编辑弹窗表单
├── detail.vue # 详情视图
├── columns.ts # 表格列配置
└── querySchemas.ts # 筛选表单配置联调自检清单
- [ ] api 模块 url 与后端 gmeta path 一致(无
/v1,baseURL 补/api) - [ ] querySchemas field 名与 XxxPageReq json 字段驼峰一致
- [ ] 字符串筛选项后端已声明 LikeFields,Select/InputNumber 已声明 EqFields
- [ ] 枚举列展示 {field}Text;字典编码与 spec SerializeMaps 一致
- [ ] 文件字段读侧已由基座补完整 URL,直接绑定展示组件
- [ ] 前端按钮已加权限指令(对齐 gmeta permission)