HuanMengAdmin/admin-client/前端接口对接文档-表列查询.md
2025-11-08 15:00:24 +08:00

19 KiB
Raw Permalink Blame History

表列查询接口对接文档

📋 更新概述

本次更新新增了基于表名和数据库标识的表列查询接口,替代了原有的基于 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;  // 表IDGuid格式
    columnName?: string;
    describe?: string;
  };
}

🔄 新旧接口对比

对比项 旧接口FindList 新接口FindListByTable
查询方式 使用 Low_Code_TableId 使用 TableName + DataBase
数据源 依赖数据库表 LowCodeTable 直接从内存缓存查询
可靠性 可能因数据库记录缺失而失败 更可靠,直接匹配表名
参数语义 需要先查询表ID 直接使用业务标识
状态 已废弃 推荐使用

📝 迁移指南

步骤 1获取表名和数据库标识

在调用新接口前,需要确保已有表名和数据库标识。通常这些信息来自:

  • 表列表接口返回的 tableNamedataBase 字段
  • 用户选择的表信息

步骤 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处理响应数据

响应数据结构保持一致,但新增了 tableNamedataBase 字段,可以用于后续操作。


💡 使用示例

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>

⚠️ 注意事项

  1. 必填参数tableNamedataBase 为必填参数,如果为空将返回空的分页结果
  2. 表不存在:如果指定的表不存在,接口会返回空的分页结果,不会抛出异常
  3. 数据实时性:数据来自内存缓存,缓存更新周期为 20 分钟,如需最新数据可先调用缓存清除接口
  4. ID 字段:返回的 id 字段是临时生成的,每次查询都会不同,不能用于持久化存储
  5. 向后兼容:旧接口仍然可用,但建议尽快迁移到新接口


🆕 新接口:根据表名和数据库标识保存列配置

接口信息

  • 请求路径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;         // 是否是图片IDnull 表示设置为 null
    orderById?: number | null;          // 排序IDnull 表示设置为 null
  }>;
}

请求示例

{
  "tableName": "T_AccountPasswordLogins",
  "dataBase": "LiveForum",
  "columns": [
    {
      "columnName": "LoginId",
      "displayName": "登录ID",
      "describe": "主键ID",
      "isTableColumnShow": true
    },
    {
      "columnName": "UserName",
      "displayName": null,
      "isTableSelect": false
    }
  ]
}

响应数据结构

// 成功时返回
true

// 失败时抛出异常ArgumentException
// 异常信息包含错误原因

响应示例

true

字段处理规则

  1. 只传递需要修改的字段:前端只传递需要修改的字段,未传递的字段保持原值
  2. 字符串字段displayName, describe, csField, width
    • 传递 null → 清空配置
    • 传递值 → 更新配置
    • 未传递 → 保持原值
  3. 可空值类型isTableColumnShow, isTableSelect, isImageId, orderById
    • 传递 null → 设置为 null
    • 传递值 → 设置为该值
    • 未传递 → 保持原值

错误处理

接口在以下情况会抛出 ArgumentException 异常:

  • 参数为空
  • tableNamedataBase 为空
  • columns 列表为空
  • 列配置中存在空的 columnName
  • 指定的表不存在
  • 没有成功更新任何列配置

注意事项

  1. 部分更新:只传递需要修改的字段,未传递的字段保持原值
  2. 列名匹配:使用 columnName 匹配内存中的列,如果列不存在会记录日志但继续处理其他列
  3. 数据实时性:保存后会清除缓存,下次查询会重新加载最新配置
  4. 配置持久化:配置保存到 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获取表名和数据库标识

在调用新接口前,需要确保已有表名和数据库标识。通常这些信息来自:

  • 表列表接口返回的 tableNamedataBase 字段
  • 用户选择的表信息

步骤 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(已废弃)

📞 技术支持

如有问题,请联系后端开发团队。