Skip to content

JPwise 列表配置生成规范

配置结构总览

标准列表配置结构

javascript
export const columnData = {
  // 基础配置
  type: 1,                    // 列表类型:1-普通列表,4-行内编辑
  hasPage: true,              // 是否分页
  pageSize: 20,               // 每页条数
  multiple: true,             // 是否多选
  hasSummary: false,          // 是否显示合计行
  
  // 列配置
  columnList: { /* 列配置对象 */ },
  columnOptions: [],          // 列选项数组
  defaultColumnList: [],      // 默认列配置
  
  // 排序配置
  defaultSidx: "",            // 默认排序字段
  sort: "",                   // 排序方向:asc/desc
  
  // 树形配置
  treeTitle: "左侧标题",
  treeDataSource: "dictionary",
  treeDictionary: "",
  treeRelation: "",
  treePropsUrl: "",
  treePropsValue: "id",
  treePropsChildren: "children",
  treePropsLabel: "fullName",
  groupField: "",
  
  // 权限配置
  useColumnPermission: false,  // 列权限
  useFormPermission: false,    // 表单权限
  useBtnPermission: false,     // 按钮权限
  useDataPermission: false,    // 数据权限
  
  // 按钮配置
  customBtnsList: [],         // 行按钮列表
  customTopBtnsList: [],      // 顶部按钮列表
  
  // 事件函数
  funcs: {}                   // 生命周期函数
}

列配置规范 (columnList)

基础列配置模板

javascript
columnList: {
  // 基本属性
  id: "",                     // 列ID
  label: "",                  // 列标题
  prop: "",                   // 数据属性名
  width: 120,                 // 列宽度
  __vModel__: "",            // 绑定字段名
  field: "",                  // 数据库字段名
  fieldName: "",              // 字段显示名
  dataType: "",               // 数据类型
  dataLength: "",             // 数据长度
  primaryKey: 0,              // 是否主键:0-否,1-是
  allowNull: false,           // 是否允许为空
  
  // 搜索配置
  searchType: "",             // 搜索类型:EQ-等于,LK-模糊,RANGE-范围
  searchJnpfKey: "",          // 搜索组件类型
  search: false,              // 是否可搜索
  
  // 显示配置
  align: "center",            // 对齐方式:left/center/right
  sortable: true,             // 是否可排序
  showtable: true,            // 是否显示在表格中
  fixed: "",                  // 固定位置:left/right/""
  
  // 交互配置
  multiple: false,            // 是否多选(用于select类型)
  clearable: true,            // 是否可清除
  customColumn: true,         // 是否自定义列
  customFormatter: true,      // 是否自定义格式化
  
  // 数值格式化
  precision: "",              // 小数精度
  thousand: false,            // 是否千分位分隔
  currency: "",               // 货币符号
  format: "",                 // 日期格式
  
  // 组件配置
  __config__: {
    dataType: "dictionary",   // 数据类型:dictionary/static/dynamic
    defaultValue: "",         // 默认值
    dictionaryType: "",       // 字典类型
    label: "",                // 组件标签
    propsUrl: "",             // 接口地址
    propsName: "",            // 接口名称
    props: {
      label: "label",         // 显示字段
      value: "value"          // 值字段
    }
  },
  
  // 插槽配置
  __slot__: {
    options: [],              // 选项数据
    searchOptions: []         // 搜索选项数据
  },
  
  // 扩展配置
  totalInfo: "",              // 合计信息
  textColor: "",              // 文本颜色
  linkCC: "({ row, column, formatInfo, that, getDynamicModelData, openWindow }) => {\n   \n}"  // 链接点击事件
}

列类型智能映射规则

javascript
const columnTypeMapping = {
  // 数据类型映射
  dataTypeMapping: {
    'varchar': { width: 150, align: 'left', sortable: true },
    'nvarchar': { width: 150, align: 'left', sortable: true },
    'int': { width: 100, align: 'right', sortable: true },
    'bigint': { width: 120, align: 'right', sortable: true },
    'decimal': { width: 120, align: 'right', sortable: true, precision: 2 },
    'datetime': { width: 160, align: 'center', sortable: true, format: 'yyyy-MM-dd HH:mm:ss' },
    'date': { width: 120, align: 'center', sortable: true, format: 'yyyy-MM-dd' },
    'text': { width: 200, align: 'left', sortable: false },
    'bit': { width: 80, align: 'center', sortable: true }
  },
  
  // 字段名模式映射
  fieldPatternMapping: {
    'ID': { width: 0, showtable: false },                    // ID字段隐藏
    'CODE': { width: 120, align: 'left', fixed: 'left' },   // 编码字段
    'NAME': { width: 150, align: 'left', fixed: 'left' },   // 名称字段
    'TITLE': { width: 200, align: 'left' },                 // 标题字段
    'STATUS': { width: 80, align: 'center' },               // 状态字段
    'AMOUNT': { width: 120, align: 'right', precision: 2 }, // 金额字段
    'DATE': { width: 120, align: 'center' },                // 日期字段
    'TIME': { width: 160, align: 'center' },                // 时间字段
    'REMARK': { width: 200, align: 'left' },                // 备注字段
    'USER': { width: 100, align: 'center' },                // 用户字段
    'DEPT': { width: 120, align: 'center' }                 // 部门字段
  }
}

按钮配置规范

行按钮配置 (customBtnsList)

标准行按钮模板

javascript
customBtnsList: [
  {
    value: "btn_row_edit",                    // 按钮标识(唯一)
    icon: "el-icon-edit",                     // 按钮图标
    label: "编辑",                            // 按钮文本
    unEdit: true,                             // 是否不可编辑
    disabled: false,                          // 是否禁用
    checked: true,                            // 是否默认选中
    func: `({ data, request, toast, refresh, initDynamicModelData, openWindow }) => {
      // 验证数据是否存在
      if (!data || !data.ID) {
        toast({ type: "error", message: "数据不完整,无法编辑", duration: 1500 });
        return;
      }
      // 验证权限(如果有工作流)
      if (this.config.webType == 3 && data.FLOWPHASE && data.FLOWPHASE != 0) {
        toast({ type: "error", message: "流程中的数据无法编辑", duration: 1500 });
        return;
      }
      this.handleOpen(data.ID);
    }`
  }
]

常用行按钮类型

javascript
const standardRowButtons = {
  // 编辑按钮
  edit: {
    value: "btn_row_edit",
    icon: "el-icon-edit",
    label: "编辑",
    validation: ["dataExists", "flowPermission"],
    action: "this.handleOpen(data.ID)"
  },
  
  // 删除按钮
  remove: {
    value: "btn_row_remove",
    icon: "el-icon-delete",
    label: "删除",
    validation: ["dataExists", "flowPermission", "confirmDialog"],
    action: "this.handleDel(data.ID, data.row_index)"
  },
  
  // 详情按钮
  detail: {
    value: "btn_row_detail",
    icon: "el-icon-tickets",
    label: "详情",
    validation: ["dataExists"],
    action: "this.handleOpen(data.ID, true, data)"
  },
  
  // 复制按钮
  copy: {
    value: "btn_row_copy",
    icon: "el-icon-copy-document",
    label: "复制",
    checked: false,  // 默认不显示
    validation: ["dataExists"],
    action: "this.handleCopy(data)"
  }
}

顶部按钮配置 (customTopBtnsList)

标准顶部按钮模板

javascript
customTopBtnsList: [
  {
    value: "btn_top_add",                     // 按钮标识
    icon: "el-icon-plus",                     // 按钮图标
    label: "新增",                            // 按钮文本
    unEdit: true,                             // 是否不可编辑
    disabled: false,                          // 是否禁用
    checked: true,                            // 是否默认选中
    btnType: "primary",                       // 按钮类型
    func: `({ data, request, toast, refresh, initDynamicModelData, openWindow }) => {
      // 检查权限
      if (!this.hasPermission || !this.hasPermission('add')) {
        toast({ type: "error", message: "暂无新增权限", duration: 1500 });
        return;
      }
      if (this.columnData.type === 4) {
        this.addHandleForRowEdit();
      } else {
        this.handleOpen();
      }
    }`
  }
]

常用顶部按钮类型

javascript
const standardTopButtons = {
  // 新增按钮
  add: {
    value: "btn_top_add",
    icon: "el-icon-plus",
    label: "新增",
    btnType: "primary",
    validation: ["addPermission"],
    priority: 1
  },
  
  // 批量编辑按钮
  batchEdit: {
    value: "btn_top_edit",
    icon: "el-icon-edit-outline",
    label: "编辑",
    validation: ["editPermission", "singleSelection", "flowPermission"],
    priority: 2
  },
  
  // 批量删除按钮
  batchRemove: {
    value: "btn_top_batchRemove",
    icon: "el-icon-delete",
    label: "批量删除",
    validation: ["deletePermission", "hasSelection", "confirmDialog"],
    priority: 3
  },
  
  // 导出Excel按钮
  exportExcel: {
    value: "btn_top_download",
    icon: "icon-ym icon-ym-file-excel",
    label: "导出Excel",
    validation: ["exportPermission", "hasData"],
    priority: 4
  },
  
  // 导入Excel按钮
  importExcel: {
    value: "btn_top_importExcel",
    icon: "icon-ym icon-ym-btn-import",
    label: "导入Excel",
    validation: ["importPermission"],
    priority: 5
  },
  
  // 刷新按钮
  refresh: {
    value: "btn_top_refresh",
    icon: "el-icon-refresh",
    label: "刷新",
    validation: [],
    priority: 6
  }
}

事件处理函数规范 (funcs)

生命周期函数配置

javascript
funcs: {
  // 数据加载完成事件
  afterOnload: {
    func: `({ data, attributes, events, methods, tableRef, request, getTableStyle, setTableStyle }) => {
      // 数据加载完成后执行
      console.log('数据加载完成,记录数:', data.length);
      
      // 自动设置表格样式
      if (data.length > 0) {
        setTableStyle({
          stripe: true,
          border: true,
          size: 'mini'
        });
      }
      
      // 初始化汇总信息
      this.initSummaryData && this.initSummaryData(data);
    }`,
    name: "数据加载完成事件",
    type: "afterOnload"
  },
  
  // 组件挂载事件
  mounted: {
    func: `({ data, methods, tableRef }) => {
      // 组件挂载完成后执行
      console.log('列表组件已挂载');
      
      // 初始化权限检查
      this.initPermissions && this.initPermissions();
      
      // 设置默认排序
      if (this.defaultSidx) {
        this.$nextTick(() => {
          tableRef && tableRef.sort(this.defaultSidx, this.sort || 'desc');
        });
      }
      
      // 监听窗口变化,自适应表格高度
      this.handleResize = () => {
        this.$nextTick(() => {
          tableRef && tableRef.doLayout();
        });
      };
      window.addEventListener('resize', this.handleResize);
    }`,
    name: "组件挂载事件",
    type: "mounted"
  },
  
  // 页面初始化事件
  onload: {
    func: `({ setInitSearchInfo, request }) => {
      // 页面初始化时执行
      console.log('页面初始化开始');
      
      // 设置初始搜索条件
      const initSearchInfo = {
        // 添加默认搜索条件
        // status: '1', // 例如:默认只查询启用状态的数据
      };
      
      // 从路由参数获取搜索条件
      const routeQuery = this.$route.query;
      Object.keys(routeQuery).forEach(key => {
        if (routeQuery[key]) {
          initSearchInfo[key] = routeQuery[key];
        }
      });
      
      setInitSearchInfo(initSearchInfo);
      
      // 初始化其他配置
      this.initializeConfig && this.initializeConfig();
    }`,
    name: "页面初始化事件",
    type: "onload"
  },
  
  // 组件销毁事件
  beforeDestroy: {
    func: `({ data, methods, tableRef }) => {
      // 组件销毁前执行清理
      if (this.handleResize) {
        window.removeEventListener('resize', this.handleResize);
      }
      
      // 清理定时器
      if (this.refreshTimer) {
        clearInterval(this.refreshTimer);
      }
      
      console.log('列表组件已销毁');
    }`,
    name: "组件销毁事件",
    type: "beforeDestroy"
  }
}

事件函数参数说明

javascript
const eventParameters = {
  // afterOnload 参数
  afterOnload: {
    data: "数据数组",
    attributes: "属性对象",
    events: "事件对象",
    methods: "方法对象",
    tableRef: "表格引用",
    request: "请求对象",
    getTableStyle: "获取表格样式函数",
    setTableStyle: "设置表格样式函数"
  },
  
  // mounted 参数
  mounted: {
    data: "数据数组",
    methods: "方法对象",
    tableRef: "表格引用"
  },
  
  // onload 参数
  onload: {
    setInitSearchInfo: "设置初始搜索条件函数",
    request: "请求对象"
  },
  
  // 按钮事件参数
  buttonEvent: {
    data: "当前行数据(行按钮)或选中数据(顶部按钮)",
    request: "请求对象",
    toast: "消息提示函数",
    refresh: "刷新数据函数",
    initDynamicModelData: "初始化动态数据函数",
    openWindow: "打开窗口函数"
  }
}

权限验证规范

通用权限验证函数

javascript
const permissionValidations = {
  // 数据存在性验证
  dataExists: (data) => {
    if (!data || !data.ID) {
      return { valid: false, message: "数据不完整,无法操作" };
    }
    return { valid: true };
  },
  
  // 工作流权限验证
  flowPermission: (data, config) => {
    if (config.webType == 3 && data.FLOWPHASE && data.FLOWPHASE != 0) {
      return { valid: false, message: "流程中的数据无法操作" };
    }
    return { valid: true };
  },
  
  // 单选验证
  singleSelection: (selectionData) => {
    if (!selectionData.length || selectionData.length != 1) {
      return { valid: false, message: "请选择一条数据进行操作" };
    }
    return { valid: true };
  },
  
  // 多选验证
  hasSelection: (selectionData) => {
    if (!selectionData.length) {
      return { valid: false, message: "请选择要操作的数据" };
    }
    return { valid: true };
  },
  
  // 数据存在验证
  hasData: (list) => {
    if (!list || list.length === 0) {
      return { valid: false, message: "暂无数据可操作" };
    }
    return { valid: true };
  }
}

智能配置生成算法

列配置自动生成

javascript
function generateColumnConfig(fields, businessScenario) {
  const columnConfig = {
    columnList: [],
    searchFields: [],
    summaryFields: []
  };
  
  fields.forEach(field => {
    const column = {
      ...getBaseColumnConfig(field),
      ...getTypeSpecificConfig(field),
      ...getBusinessSpecificConfig(field, businessScenario)
    };
    
    columnConfig.columnList.push(column);
    
    // 自动添加搜索字段
    if (shouldAddToSearch(field)) {
      columnConfig.searchFields.push(generateSearchField(field));
    }
    
    // 自动添加汇总字段
    if (shouldAddToSummary(field)) {
      columnConfig.summaryFields.push(field.field);
    }
  });
  
  return columnConfig;
}

按钮配置自动生成

javascript
function generateButtonConfig(businessScenario, permissions) {
  const buttonConfig = {
    customBtnsList: [],
    customTopBtnsList: []
  };
  
  // 基础行按钮
  const baseRowButtons = ['edit', 'remove', 'detail'];
  baseRowButtons.forEach(buttonType => {
    if (hasPermission(permissions, buttonType)) {
      buttonConfig.customBtnsList.push(
        generateRowButton(buttonType, businessScenario)
      );
    }
  });
  
  // 基础顶部按钮
  const baseTopButtons = ['add', 'batchRemove', 'exportExcel', 'refresh'];
  baseTopButtons.forEach(buttonType => {
    if (hasPermission(permissions, buttonType)) {
      buttonConfig.customTopBtnsList.push(
        generateTopButton(buttonType, businessScenario)
      );
    }
  });
  
  return buttonConfig;
}

最佳实践

配置生成原则

  1. 数据驱动 - 根据字段类型和业务场景智能选择配置
  2. 权限优先 - 严格验证用户权限,确保数据安全
  3. 用户体验 - 提供清晰的错误提示和操作反馈
  4. 性能考虑 - 合理设置分页和懒加载
  5. 扩展性 - 预留扩展接口,便于业务定制

常见配置模式

javascript
const configurationPatterns = {
  // 基础数据管理模式
  basicDataManagement: {
    features: ['add', 'edit', 'delete', 'export', 'search'],
    permissions: ['read', 'write', 'delete', 'export'],
    layout: 'standard'
  },
  
  // 审批流程模式
  approvalWorkflow: {
    features: ['add', 'edit', 'detail', 'export', 'search'],
    permissions: ['read', 'write', 'approve', 'export'],
    layout: 'workflow',
    specialColumns: ['flowStatus', 'approver', 'approveTime']
  },
  
  // 只读查询模式
  readOnlyQuery: {
    features: ['detail', 'export', 'search'],
    permissions: ['read', 'export'],
    layout: 'readonly',
    hideButtons: ['add', 'edit', 'delete']
  }
}

性能优化建议

  1. 合理分页 - 根据数据量设置合适的pageSize
  2. 懒加载 - 大数据集使用虚拟滚动
  3. 缓存策略 - 字典数据等静态信息进行缓存
  4. 索引优化 - 确保排序和搜索字段有合适的数据库索引

错误处理规范

javascript
const errorHandlingPatterns = {
  // 网络错误处理
  networkError: {
    retry: true,
    maxRetries: 3,
    fallbackMessage: "网络连接异常,请稍后重试"
  },
  
  // 权限错误处理
  permissionError: {
    redirect: false,
    message: "权限不足,请联系管理员"
  },
  
  // 数据错误处理
  dataError: {
    validate: true,
    sanitize: true,
    message: "数据格式不正确"
  }
}

注意:此规范文档是列表配置生成的核心依据,所有自动生成逻辑必须严格遵循这些规则!