19 KiB
19 KiB
表列查询接口对接文档
📋 更新概述
本次更新新增了基于表名和数据库标识的表列查询接口,替代了原有的基于 Low_Code_TableId 的查询方式。新接口更加直观、可靠,与新的内存缓存架构完全匹配。
🆕 新接口:根据表名和数据库标识查询列列表
接口信息
- 请求路径:
POST /api/v1/admin/LowCodeTableInfo/FindListByTable - 请求方法:
POST - 是否需要认证:是
- 描述:根据表名和数据库标识查询指定表的所有列信息,支持分页和筛选
请求参数
请求体结构
interface TableColumnQueryInput {
// 分页参数
page: number; // 当前页码,从 1 开始
size: number; // 每页数量
// 必填参数
tableName: string; // 表名(必填)
dataBase: string; // 数据库标识(必填),如 "Admin"、"MiaoYuChat"、"LiveForum"
// 筛选条件(可选)
search?: {
columnName?: string; // 列名筛选(模糊匹配)
describe?: string; // 列描述筛选(模糊匹配)
};
// 排序(可选)
searchSort?: Array<{
field: string; // 排序字段
order: "asc" | "desc"; // 排序方向
}>;
}
请求示例
{
"page": 1,
"size": 20,
"tableName": "SysUser",
"dataBase": "Admin",
"search": {
"columnName": "Name",
"describe": "用户"
}
}
响应数据结构
interface PagingView {
total: number; // 总记录数
pageCount: number; // 总页数
page: number; // 当前页码
size: number; // 每页数量
dataSource: Array<{ // 列数据列表
id: string; // 临时ID(从内存查询生成)
isPrimary: boolean; // 是否主键
isIdentity: boolean; // 是否自增
isNullable: boolean; // 是否可空
position: number; // 字段位置
columnName: string; // 列名
describe: string; // 列描述
databaseColumnType: string; // 数据库列类型
csType: string; // C# 数据类型
csField: string; // C# 字段名
displayName: string; // 显示名称
tableName: string; // 表名
dataBase: string; // 数据库标识
lastModificationTime: string; // 最后修改时间
creationTime: string; // 创建时间
isTableColumnShow: boolean; // 是否在表格中显示
isTableSelect: boolean; // 是否可查询
isImageId: boolean; // 是否是图片ID
orderById: number; // 排序ID
maxLength: number; // 最大长度
}>;
}
响应示例
{
"total": 15,
"pageCount": 1,
"page": 1,
"size": 20,
"dataSource": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPrimary": true,
"isIdentity": true,
"isNullable": false,
"position": 1,
"columnName": "Id",
"describe": "主键ID",
"databaseColumnType": "uniqueidentifier",
"csType": "Guid",
"csField": "Id",
"displayName": "主键ID",
"tableName": "SysUser",
"dataBase": "Admin",
"lastModificationTime": "2024-01-15",
"creationTime": "2024-01-15",
"isTableColumnShow": true,
"isTableSelect": false,
"isImageId": false,
"orderById": 10,
"maxLength": null
},
{
"id": "550e8400-e29b-41d4-a716-446655440001",
"isPrimary": false,
"isIdentity": false,
"isNullable": false,
"position": 2,
"columnName": "UserName",
"describe": "用户名",
"databaseColumnType": "nvarchar",
"csType": "string",
"csField": "UserName",
"displayName": "用户名",
"tableName": "SysUser",
"dataBase": "Admin",
"lastModificationTime": "2024-01-15",
"creationTime": "2024-01-15",
"isTableColumnShow": true,
"isTableSelect": true,
"isImageId": false,
"orderById": 10,
"maxLength": 50
}
]
}
响应字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
| total | number | 总记录数 |
| pageCount | number | 总页数 |
| page | number | 当前页码 |
| size | number | 每页数量 |
| dataSource | Array | 列数据列表 |
| dataSource[].id | string | 临时ID(每次查询生成,不固定) |
| dataSource[].isPrimary | boolean | 是否主键 |
| dataSource[].isIdentity | boolean | 是否自增标识 |
| dataSource[].isNullable | boolean | 是否可空 |
| dataSource[].position | number | 字段在表中的位置 |
| dataSource[].columnName | string | 数据库列名 |
| dataSource[].describe | string | 列描述/备注 |
| dataSource[].databaseColumnType | string | 数据库列类型(如 nvarchar、int、datetime) |
| dataSource[].csType | string | C# 数据类型(如 string、int、DateTime) |
| dataSource[].csField | string | C# 字段名(用于代码生成) |
| dataSource[].displayName | string | 显示名称(用于前端展示) |
| dataSource[].tableName | string | 所属表名 |
| dataSource[].dataBase | string | 所属数据库标识 |
| dataSource[].isTableColumnShow | boolean | 是否在表格列中显示 |
| dataSource[].isTableSelect | boolean | 是否可用于查询筛选 |
| dataSource[].isImageId | boolean | 是否是图片ID字段 |
| dataSource[].orderById | number | 排序ID(用于前端列排序) |
| dataSource[].maxLength | number | 最大长度(字符串类型字段) |
⚠️ 旧接口(已废弃)
接口信息
- 请求路径:
POST /api/v1/admin/LowCodeTableInfo/FindList - 请求方法:
POST - 状态:已废弃,请使用新接口
FindListByTable - 废弃原因:使用
Low_Code_TableId查询依赖数据库表,与新架构不匹配
旧接口请求参数
interface OldQueryInput {
page: number;
size: number;
search: {
low_Code_TableId: string; // 表ID(Guid格式)
columnName?: string;
describe?: string;
};
}
🔄 新旧接口对比
| 对比项 | 旧接口(FindList) | 新接口(FindListByTable) |
|---|---|---|
| 查询方式 | 使用 Low_Code_TableId |
使用 TableName + DataBase |
| 数据源 | 依赖数据库表 LowCodeTable |
直接从内存缓存查询 |
| 可靠性 | 可能因数据库记录缺失而失败 | 更可靠,直接匹配表名 |
| 参数语义 | 需要先查询表ID | 直接使用业务标识 |
| 状态 | 已废弃 | 推荐使用 |
📝 迁移指南
步骤 1:获取表名和数据库标识
在调用新接口前,需要确保已有表名和数据库标识。通常这些信息来自:
- 表列表接口返回的
tableName和dataBase字段 - 用户选择的表信息
步骤 2:修改请求参数
旧接口请求示例:
// 旧接口
const request = {
page: 1,
size: 20,
search: {
low_Code_TableId: "550e8400-e29b-41d4-a716-446655440000",
columnName: "Name"
}
};
新接口请求示例:
// 新接口
const request = {
page: 1,
size: 20,
tableName: "SysUser", // 直接使用表名
dataBase: "Admin", // 直接使用数据库标识
search: {
columnName: "Name"
}
};
步骤 3:更新接口调用
// 旧接口调用
// POST /api/v1/admin/LowCodeTableInfo/FindList
// 新接口调用
// POST /api/v1/admin/LowCodeTableInfo/FindListByTable
步骤 4:处理响应数据
响应数据结构保持一致,但新增了 tableName 和 dataBase 字段,可以用于后续操作。
💡 使用示例
JavaScript/TypeScript 示例
// 定义接口类型
interface TableColumnQueryInput {
page: number;
size: number;
tableName: string;
dataBase: string;
search?: {
columnName?: string;
describe?: string;
};
}
// 调用接口
async function getTableColumns(
tableName: string,
dataBase: string,
page: number = 1,
size: number = 20
) {
const request: TableColumnQueryInput = {
page,
size,
tableName,
dataBase,
search: {
// 可选筛选条件
}
};
const response = await fetch('/api/v1/admin/LowCodeTableInfo/FindListByTable', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify(request)
});
const data = await response.json();
return data;
}
// 使用示例
const columns = await getTableColumns('SysUser', 'Admin', 1, 20);
console.log(`共 ${columns.total} 列,当前页 ${columns.dataSource.length} 列`);
Vue 3 示例
<template>
<div>
<el-table :data="columns" v-loading="loading">
<el-table-column prop="columnName" label="列名" />
<el-table-column prop="displayName" label="显示名称" />
<el-table-column prop="csType" label="数据类型" />
<el-table-column prop="describe" label="描述" />
</el-table>
<el-pagination
v-model:current-page="page"
v-model:page-size="size"
:total="total"
@current-change="loadColumns"
/>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
const columns = ref([]);
const loading = ref(false);
const page = ref(1);
const size = ref(20);
const total = ref(0);
const tableName = ref('SysUser');
const dataBase = ref('Admin');
async function loadColumns() {
loading.value = true;
try {
const response = await fetch('/api/v1/admin/LowCodeTableInfo/FindListByTable', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify({
page: page.value,
size: size.value,
tableName: tableName.value,
dataBase: dataBase.value
})
});
const data = await response.json();
columns.value = data.dataSource;
total.value = data.total;
} finally {
loading.value = false;
}
}
onMounted(() => {
loadColumns();
});
</script>
⚠️ 注意事项
- 必填参数:
tableName和dataBase为必填参数,如果为空将返回空的分页结果 - 表不存在:如果指定的表不存在,接口会返回空的分页结果,不会抛出异常
- 数据实时性:数据来自内存缓存,缓存更新周期为 20 分钟,如需最新数据可先调用缓存清除接口
- ID 字段:返回的
id字段是临时生成的,每次查询都会不同,不能用于持久化存储 - 向后兼容:旧接口仍然可用,但建议尽快迁移到新接口
🆕 新接口:根据表名和数据库标识保存列配置
接口信息
- 请求路径:
POST /api/v1/admin/LowCodeTableInfo/ChangeByTable - 请求方法:
POST - 是否需要认证:是
- 描述:根据表名和数据库标识保存列配置,支持部分更新
请求参数
请求体结构
interface TableColumnChangeInput {
tableName: string; // 表名(必填)
dataBase: string; // 数据库标识(必填),如 "Admin"、"MiaoYuChat"、"LiveForum"
columns: Array<{ // 列配置列表(必填,至少包含一个列)
columnName: string; // 列名(必填,用于匹配)
// 可配置字段(可选,只传递需要修改的字段)
displayName?: string | null; // 显示名称(null 表示清空)
describe?: string | null; // 列描述(null 表示清空)
csField?: string | null; // C# 字段名(null 表示清空)
width?: string | null; // 宽度(null 表示清空)
isTableColumnShow?: boolean | null; // 是否在表格中显示(null 表示设置为 null)
isTableSelect?: boolean | null; // 是否可查询(null 表示设置为 null)
isImageId?: boolean | null; // 是否是图片ID(null 表示设置为 null)
orderById?: number | null; // 排序ID(null 表示设置为 null)
}>;
}
请求示例
{
"tableName": "T_AccountPasswordLogins",
"dataBase": "LiveForum",
"columns": [
{
"columnName": "LoginId",
"displayName": "登录ID",
"describe": "主键ID",
"isTableColumnShow": true
},
{
"columnName": "UserName",
"displayName": null,
"isTableSelect": false
}
]
}
响应数据结构
// 成功时返回
true
// 失败时抛出异常(ArgumentException)
// 异常信息包含错误原因
响应示例
true
字段处理规则
- 只传递需要修改的字段:前端只传递需要修改的字段,未传递的字段保持原值
- 字符串字段(
displayName,describe,csField,width):- 传递
null→ 清空配置 - 传递值 → 更新配置
- 未传递 → 保持原值
- 传递
- 可空值类型(
isTableColumnShow,isTableSelect,isImageId,orderById):- 传递
null→ 设置为null - 传递值 → 设置为该值
- 未传递 → 保持原值
- 传递
错误处理
接口在以下情况会抛出 ArgumentException 异常:
- 参数为空
tableName或dataBase为空columns列表为空- 列配置中存在空的
columnName - 指定的表不存在
- 没有成功更新任何列配置
注意事项
- 部分更新:只传递需要修改的字段,未传递的字段保持原值
- 列名匹配:使用
columnName匹配内存中的列,如果列不存在会记录日志但继续处理其他列 - 数据实时性:保存后会清除缓存,下次查询会重新加载最新配置
- 配置持久化:配置保存到 JSON 文件,不依赖数据库表
⚠️ 旧接口(已废弃)
接口信息
- 请求路径:
POST /api/v1/admin/LowCodeTableInfo/Change - 请求方法:
POST - 状态:已废弃,请使用新接口
ChangeByTable - 废弃原因:使用
Low_Code_TableId查询依赖数据库表,与新架构不匹配
旧接口请求参数
interface OldChangeInput {
// 数组中的每个对象都需要包含 Low_Code_TableId
// 依赖数据库表记录
}
🔄 新旧接口对比
| 对比项 | 旧接口(Change) | 新接口(ChangeByTable) |
|---|---|---|
| 查询方式 | 使用 Low_Code_TableId |
使用 TableName + DataBase |
| 数据源 | 依赖数据库表 LowCodeTable |
直接从内存缓存查询 |
| 可靠性 | 可能因数据库记录缺失而失败 | 更可靠,直接匹配表名 |
| 参数语义 | 需要先查询表ID | 直接使用业务标识 |
| 部分更新 | 支持 | 支持(只传递修改的字段) |
| 状态 | 已废弃 | 推荐使用 |
📝 迁移指南
步骤 1:获取表名和数据库标识
在调用新接口前,需要确保已有表名和数据库标识。通常这些信息来自:
- 表列表接口返回的
tableName和dataBase字段 - 用户选择的表信息
步骤 2:修改请求参数
旧接口请求示例:
// 旧接口
const request = [
{
low_Code_TableId: "550e8400-e29b-41d4-a716-446655440000",
columnName: "LoginId",
displayName: "登录ID"
}
];
新接口请求示例:
// 新接口
const request = {
tableName: "T_AccountPasswordLogins",
dataBase: "LiveForum",
columns: [
{
columnName: "LoginId",
displayName: "登录ID"
}
]
};
步骤 3:更新接口调用
// 旧接口调用
// POST /api/v1/admin/LowCodeTableInfo/Change
// 新接口调用
// POST /api/v1/admin/LowCodeTableInfo/ChangeByTable
步骤 4:处理响应数据
- 成功:返回
true - 失败:捕获
ArgumentException异常,异常信息包含错误原因
💡 使用示例
JavaScript/TypeScript 示例
// 定义接口类型
interface TableColumnChangeInput {
tableName: string;
dataBase: string;
columns: Array<{
columnName: string;
displayName?: string | null;
describe?: string | null;
csField?: string | null;
width?: string | null;
isTableColumnShow?: boolean | null;
isTableSelect?: boolean | null;
isImageId?: boolean | null;
orderById?: number | null;
}>;
}
// 调用接口
async function saveTableColumns(
tableName: string,
dataBase: string,
columns: TableColumnChangeInput['columns']
) {
const request: TableColumnChangeInput = {
tableName,
dataBase,
columns
};
try {
const response = await fetch('/api/v1/admin/LowCodeTableInfo/ChangeByTable', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify(request)
});
if (!response.ok) {
const error = await response.text();
throw new Error(error);
}
const result = await response.json();
return result === true;
} catch (error) {
console.error('保存列配置失败:', error);
throw error;
}
}
// 使用示例:只修改部分字段
const columns = await getTableColumns('T_AccountPasswordLogins', 'LiveForum');
const modifiedColumns = columns.dataSource
.filter(col => col.columnName === 'LoginId' || col.columnName === 'UserName')
.map(col => ({
columnName: col.columnName,
displayName: col.columnName === 'LoginId' ? '登录ID' : col.displayName,
isTableColumnShow: col.columnName === 'LoginId' ? true : undefined // 未传递,保持原值
}));
await saveTableColumns('T_AccountPasswordLogins', 'LiveForum', modifiedColumns);
Vue 3 示例
<template>
<div>
<el-form :model="form" @submit.prevent="handleSave">
<el-form-item label="表名">
<el-input v-model="form.tableName" />
</el-form-item>
<el-form-item label="数据库">
<el-select v-model="form.dataBase">
<el-option label="主数据库" value="Admin" />
<el-option label="喵语聊天" value="MiaoYuChat" />
<el-option label="直播论坛" value="LiveForum" />
</el-select>
</el-form-item>
<el-button type="primary" @click="handleSave">保存配置</el-button>
</el-form>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { ElMessage } from 'element-plus';
const form = ref({
tableName: 'T_AccountPasswordLogins',
dataBase: 'LiveForum',
columns: [] as any[]
});
async function handleSave() {
try {
const response = await fetch('/api/v1/admin/LowCodeTableInfo/ChangeByTable', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + token
},
body: JSON.stringify(form.value)
});
if (!response.ok) {
const error = await response.text();
throw new Error(error);
}
const result = await response.json();
if (result === true) {
ElMessage.success('保存成功');
}
} catch (error: any) {
ElMessage.error('保存失败: ' + error.message);
}
}
</script>
🔗 相关接口
- 获取表列表:
POST /api/v1/admin/LowCodeTable/FindList - 获取数据库列表:
GET /api/CodeGeneration/databases - 获取列列表:
POST /api/v1/admin/LowCodeTableInfo/FindListByTable - 修改列配置(旧):
POST /api/v1/admin/LowCodeTableInfo/Change(已废弃)
📞 技术支持
如有问题,请联系后端开发团队。