3106d96ac7
iotlcm-admin-ui:管理前端(基于 Vben Admin 5.5.9 二次开发)。 - 天地图 API Key → YOUR_TIANDITU_KEY - OAuth 客户端 ID → your-client-id,store 加密密钥 → 提示自行替换 - Makefile 移除明文 registry 登录口令,镜像地址改 - appIcon 指向内网图床的链接 → /favicon.ico - 真实手机号 → 合法 11 位编造号(保留号段前 3 位 + 后 4 位) - 真实邮箱 → example.com(署名头内的上游作者邮箱保留) - 移除 CI 触发器 - 补 MIT LICENSE(含 Vben Admin 上游声明)+ README - 统一 LF 行尾并加 .gitattributes 上游 Vben Admin 的版权与许可声明完整保留(各源文件 @Author/@Copyright 头 + LICENSE)。
6.2 KiB
6.2 KiB
任务组:IOTLCM CRUD 新风格模板的正确使用与弹窗内表格扩展
scope(范围):apps/web-antd/src/template/iotlcm-crud-style 模板学习与迁移工作,尤其是把默认生成或旧风格 CRUD 页面迁移到新风格时,遇到查看弹窗内新增 Tab、弹窗内 Grid、接口契约不明确、字段配置归属不清等场景。
applies_to(适用条件):cwd=E:/Projects/Componany/XiuJieZhiLian/IotLcm/iotlcm-admin-ui/vue;适用于 apps/web-antd/src/views/iotlcm/... 与对应 apps/web-antd/src/api/iotlcm/... 的 Vben 页面迁移;每次学习 iotlcm-crud-style 目录时,必须先读 README.md,并同步读取本文件。
任务 1:修正 tSimFlowPool 查看弹窗中的流量池号卡 Tab,成功
keywords(关键词)
- iotlcm-crud-style, tSimFlowPool, view.vue, model.tsx, PoolCardGridColumns, PoolCardGridSchema, ViewDescSchema, useVbenVxeGrid, proxyConfig, BetterVben.grid.gridOptions.modal, GetCardsByPackageCodes, any, packageCodes, flowPoolCode
用户偏好
- 当用户要求参考
apps/web-antd/src/template/iotlcm-crud-style修正页面时,不要只套外层模板;要把列表、弹窗、表单、查看详情、弹窗内 Grid、对应 API 一起放到当前模板语境中判断。 - 当接口返回结构没有本地后端契约、类型文件、Swagger 或已有实现能确认时,不要凭前端列名推断返回类型;保留
any,并在汇报中明确说明“接口返回未确认,所以未定义响应模型”。 - 当用户指出“columns 应该放哪里”时,默认遵循配置归属:所有表格列配置放在
model.tsx,组件文件只负责组合实例、状态与调用。 - 当查看弹窗新增 Tab 内含表格时,这个表格属于查看弹窗的扩展配置,不属于主页列表配置;相关列和查询表单应放在
ViewDescSchema后面,而不是插在IndexGridColumns和EditFormSchema中间。 - 当用户指出“proxyConfig 不会用?”时,弹窗内 Grid 的数据加载也应优先使用
useVbenVxeGrid({ gridOptions: { proxyConfig: { ajax: { query }}}}),不要手动setGridOptions({ data })塞数据。 - 当用户明确纠正实现方式时,先核对当前项目已有写法和模板文档,再做最小改动;不要为了消除 lint 或 any 而编造类型、字段或接口契约。
可复用知识
model.tsx是表单字段、表格列、查看描述等配置的集中位置;普通页面顺序仍为:IndexGridSchemaIndexGridColumnsEditFormSchemaViewDescSchema
- 如果查看弹窗内新增了业务 Tab 和 Grid,相关配置应追加在查看配置之后,例如:
ViewDescSchemaPoolCardGridColumnsPoolCardGridSchema
view.vue中的弹窗内 Grid 推荐结构:
const [Grid, gridApi] = useVbenVxeGrid({
formOptions: {
...(BetterVben.grid.formOptions.default as any),
schema: PoolCardGridSchema,
},
gridOptions: {
...(BetterVben.grid.gridOptions.modal as any),
columns: PoolCardGridColumns,
proxyConfig: {
ajax: {
query: async ({ page }: any, formValues: any) => {
if (!flowPoolCode.value) {
return {};
}
return await GetCardsByPackageCodes({
page: page.currentPage,
pageSize: page.pageSize,
...formValues,
packageCodes: packageCodes.value,
flowPoolCode: flowPoolCode.value,
});
},
},
},
},
});
- 查看弹窗打开时应只做详情加载、上下文状态设置和触发表格查询:
const record = await View({ id: row.id });
setDescProps({ data: record }, true);
flowPoolCode.value = record.flowPoolCode || '';
packageCodes.value = record.packageCodes || [];
await gridApi.query();
- 查看弹窗关闭时应清空弹窗局部状态,避免再次打开时沿用上一次数据:
activeKey.value = '1';
flowPoolCode.value = '';
packageCodes.value = [];
setDescProps({ data: {} }, true);
- 弹窗内 Grid 应使用
BetterVben.grid.gridOptions.modal,不是随手使用default或手写一套height/cellStyle/headerCellStyle/rowStyle。 GetCardsByPackageCodes当前返回结构未确认时,可保留:
export function GetCardsByPackageCodes(params: any) {
return requestClient.post<any>(
'/iot/tSimFlowPool/getCardsByPackageCodes',
params,
);
}
或在只确认请求参数时保留请求参数的最小结构,但不要定义未验证的响应模型。
- 对弹窗内号卡表格,列配置应尽量参考已有
tCommunication/tSimCardInfo/model.tsx的字段含义、字典渲染和通道选择配置,而不是凭字段名临时拼列。 PoolCardGridSchema这类弹窗内表格搜索表单也属于model.tsx配置;不要写在view.vue里。
失败与改进方式
- 症状:为了清掉 API 扫描里的
any,凭view.vue中的列名定义了TSimFlowPoolCardModel与响应类型。原因:没有确认后端路由实现或真实响应契约。修复:撤掉伪精确类型,保留any并说明接口返回未知。 - 症状:把
cardGridOptions.columns写在view.vue。原因:把弹窗内表格当成组件临时 UI,而不是页面配置的一部分。修复:把PoolCardGridColumns移到model.tsx,并放在ViewDescSchema后面。 - 症状:通过
cardTableApi.setGridOptions({ data })手动塞表格数据。原因:忽略了 Vben Grid 的proxyConfig.ajax.query数据源模式。修复:把加载逻辑放入useVbenVxeGrid的proxyConfig,打开弹窗后调用gridApi.query()。 - 症状:弹窗内 Grid 没有使用
BetterVben.grid.gridOptions.modal。原因:只想到“有表格列”而没有区分主页面 Grid 与弹窗 Grid。修复:弹窗内表格使用modal配置,主页面表格使用default配置。 - 症状:为了“同步处理 API”删除或改造了不确定的旧接口。原因:把模板要求机械执行,未区分已使用、未使用和契约未知的接口。修复:先
rg调用点;契约不明时保留any或最小改动,不做伪类型化。 - 症状:学习模板目录时只读
README.md,漏掉实战纠错知识。修复:每次学习apps/web-antd/src/template/iotlcm-crud-style时必须同时读取本文件。