总览

VanCone Console Component 是为企业Web应用提供统一界面和交互风格的前端组件库,基于 Vue.js、Vite、ElementPlus 进行构建。相比基础组件库,Console Component 定义了一套新的 UI 风格,将基础组件组合成更加复杂的页面组件,并提供了低代码配置能力。

快速开始

安装依赖

# NPM
$ npm i @vancone/console-component --save

# Yarn
$ yarn add @vancone/console-component

加载样式

// main.ts

// 引入组件样式
import "element-plus/dist/index.css";
import '@vancone/console-component/style.css';

主界面

// App.vue
<template>
  <ConsoleApp title="Demo" helpDocUrl="https://docs.vancone.com/demo" />
</template>

<script setup lang="ts">
import { ConsoleApp } from 'vancone-console-component';
</script>

路由

// src/router/index.ts
import { DetailPage, NoPermission, TablePage } from '@vancone/console-component';


export const routes: Array<RouteRecordRaw> = [
  {
    path: '/:model?',
    name: 'ModelTable',
    component: TablePage,
    meta: {
      title: 'User',
      hidden: true,
      activeMenu: '{model}',
    }
  },
  {
    path: '/:model/detail',
    name: 'ModelDetail',
    component: DetailPage,
    meta: {
      title: 'User',
      hidden: true,
      activeMenu: '{model}',
    }
  },
  {
    path: '/no-permission',
    name: 'NoPermission',
    component: NoPermission,
    meta: {
      title: 'No Permission',
      hidden: true,
    }
  },
  ...
]

国际化

首先检查项目中是否已经引入 vue-i18n 依赖,如果没有需要先安装。

# NPM
$ npm i vue-i18n --save

# Yarn
$ yarn add vue-i18n
// src/main.ts
import { i18n } from '@vancone/console-component';
import '~/i18n/index';

app.use(i18n);
// src/i18n/index.ts
import { en, zh } from '@vancone/console-component';

import enJson from './langs/en.json';
import zhJson from './langs/zh.json';

Object.assign(en, enJson);
Object.assign(zh, zhJson);

低代码

// src/main.ts
import '~/config/index';
// src/config/index.ts
import { modelList, menuList, activeMenuMapping } from '@vancone/console-component';

import dataSourceModel from "./models/data-source";
import dataModelModel from "./models/data-model";
import agentModel from "./models/agent";

import assetSvg from '~/assets/svg/asset.svg';
import appSvg from '~/assets/svg/service.svg';

modelList.value = {
    'agent': agentModel,
    'data-asset': dataSourceModel,
    'data-source': dataSourceModel,
};

Object.assign(activeMenuMapping, {
    'data-source': 'data-asset',
    'data-model': 'data-asset',
});

menuList.value = [
    {
        path: '/data-asset',
        title: 'menu.dataAsset.dataAsset',
        icon: assetSvg,
    },
    {
        path: '/data-app',
        title: 'menu.dataService',
        icon: appSvg,
    },
];

基础组件

TableView 表格

基于 Element Plus 的低代码表格组件,支持数据展示、增删改查、导出、打印等功能。

基础用法

<script setup lang="ts">
import { reactive } from 'vue';
import TableView from 'vancone-console-web-component';

const model = reactive<DataModel>({
  api: '/api/data-sources',
  route: 'data-sources',
  tableConfig: {
    editPageRoutePath: '/data-sources/detail',
  },
  fields: [
    {
      prop: 'name',
      label: '数据源名称',
      tableColumn: { link: true }
    },
    {
      prop: 'type',
      label: '类型',
    },
    {
      prop: 'status',
      label: '状态',
    }
  ]
});
</script>

<template>
  <TableView :model="model" />
</template>

下拉列表

表格支持显示下拉字段的 label 值,使用 formItem.select 配置:

const model = reactive<DataModel>({
  api: '/api/data-sources',
  fields: [
    {
      prop: 'type',
      label: '数据源类型',
      formItem: {
        type: 'select',
        select: {
          options: [
            { label: 'MySQL', value: 'mysql' },
            { label: 'PostgreSQL', value: 'postgresql' },
            { label: 'MongoDB', value: 'mongodb' }
          ]
        }
      }
    }
  ]
});

路由跳转

支持两种路由跳转方式:

默认链接跳转

{
  prop: 'name',
  label: '名称',
  tableColumn: { link: true }  // 跳转到 /{route}/detail?id={id}
}

自定义路由跳转

{
  prop: 'name',
  label: '名称',
  tableColumn: {
    routerLink: '/custom/path/{id}'  // {id} 会被替换为实际 ID
  }
}

自定义操作列

const model = reactive<DataModel>({
  api: '/api/users',
  tableConfig: {
    operations: [
      {
        label: 'common.table.view',
        functions: {
          click: (index, row) => {
            console.log('查看', row.id);
          }
        }
      },
      {
        label: '启用',
        functions: {
          click: (index, row) => {
            // 启用操作
          }
        }
      }
    ]
  },
  fields: [...]
});

值转换显示

函数转换

{
  prop: 'status',
  label: '状态',
  tableColumn: {
    functions: {
      transformValue: (value) => {
        return value === 'active' ? '启用' : '禁用';
      }
    }
  }
}

映射转换

{
  prop: 'status',
  label: '状态',
  tableColumn: {
    transformValueMappings: [
      { value: 'active', label: '启用' },
      { value: 'inactive', label: '禁用' }
    ]
  }
}

显示选项配置

通过 tableConfig.display 控制表格显示元素:

const model = reactive<DataModel>({
  api: '/api/data',
  tableConfig: {
    display: {
      pane: false,          // 是否显示白色背景面板
      searchBox: false,    // 是否显示搜索框
      pagination: false,    // 是否显示分页
      advancedSearch: false, // 是否显示高级搜索按钮
      fileTaskButton: false  // 是否显示导入导出按钮
    }
  },
  fields: [...]
});

打印功能

点击工具栏的"打印"按钮,打印选中的行数据:

// 打印时表格会自动生成包含选中数据的 iframe

导出功能

点击导入导出下拉菜单中的"导出查询结果":

const model = reactive<DataModel>({
  api: '/api/data',
  // 导出请求将发送到 {api}/export
});

只读模式

const model = reactive<DataModel>({
  api: '/api/data',
  tableConfig: {
    readOnly: true  // 隐藏创建、删除、编辑等操作按钮
  },
  fields: [...]
});

选择模式

const model = reactive<DataModel>({
  api: '/api/data',
  tableConfig: {
    selectMode: true  // 显示查看选中项的复选框
  },
  fields: [...]
});

自定义 CRUD 函数

const model = reactive<DataModel>({
  api: '/api/data',
  tableConfig: {
    functions: {
      create: () => {
        // 自定义创建逻辑
        dialogVisible.value = true;
      },
      delete: (index, row) => {
        // 自定义删除逻辑
      },
      batchDelete: (selectedItems) => {
        // 自定义批量删除逻辑
      }
    }
  },
  fields: [...]
});

标签类型

{
  prop: 'category',
  label: '分类',
  tableColumn: { type: 'tag' }  // 使用 el-tag 显示
}

分页配置

支持 [10, 20, 50, 100] 四种分页大小选择。

查询参数

const model = reactive<DataModel>({
  api: '/api/data',
  tableConfig: {
    queryParams: {
      status: 'active',
      type: 'mysql'
    }
  },
  fields: [...]
});

工具提示

const model = reactive<DataModel>({
  api: '/api/data',
  tableConfig: {
    tooltip: 'common.table.dataSourceTooltip'  // 在工具栏显示提示图标
  },
  fields: [...]
});

DataModel 属性

属性描述类型
api查询、修改表格数据的 RESTful 风格 APIstring
fields表格的字段定义Array<Field>
route路由路径,用于生成默认详情页链接string
tableConfig表格配置TableConfig
formConfig表单配置FormConfig
pageConfig页面配置PageConfig

TableConfig 属性

属性描述类型默认值
selectMode选择模式,显示查看选中项的复选框booleanfalse
readOnly只读模式,隐藏创建、删除等操作按钮booleanfalse
creatable是否显示创建按钮booleantrue
updatable是否显示编辑按钮booleantrue
deletable是否显示删除按钮booleantrue
editPageRoutePath编辑页面路由路径string / ComputedRef
createPageRoutePath创建页面路由路径string
queryParams额外的查询参数IAnyObject
operations自定义操作按钮Array<IOperationItem>
labels自定义按钮标签ILabel
export是否显示导出功能boolean
tooltip工具栏提示文本string
functions自定义 CRUD 函数Functions
display显示选项配置DisplayOptions

DisplayOptions 属性

属性描述类型默认值
pane是否显示白色背景面板booleantrue
searchBox是否显示搜索框booleantrue
pagination是否显示分页booleantrue
advancedSearch是否显示高级搜索按钮booleanfalse
fileTaskButton是否显示导入导出按钮booleanfalse

Field 属性

属性描述类型默认值
prop字段对应的 JSON keystring
label表头显示名称,支持 i18n(key) 语法string
visible是否可见booleantrue
value字段值string
formItem表单配置FormItemConfig
tableColumn表格列配置TableColumnConfig

TableColumnConfig 属性

属性描述类型默认值
type显示类型'tag'
visible在表格列中是否可见booleantrue
link是否为默认链接跳转booleanfalse
routerLink自定义路由链接模板,{id} 会被替换string
width列宽度number
transformValueMappings值映射转换Array<{ value, label }>
functions自定义函数{ transformValue?: (value) => string }

FormItemConfig 属性

属性描述类型默认值
visible在表单中是否可见booleantrue
type表单项类型'input' \| 'select' \| 'checkbox' \| 'date' \| ...
placeholder占位符文本string
select下拉框配置SelectConfig
inputNumber数字输入框配置InputNumberConfig
required是否必填boolean
validationRule验证规则Array<any>
defaultValue默认值any
editable是否可编辑(创建时)boolean
updatable是否可更新(编辑时)boolean

SelectConfig 属性

属性描述类型默认值
options静态选项列表Array<{ label, value }>
api动态选项接口string
queryParamName查询参数名string
queryParamValueField查询参数值字段string
labelMappingFieldlabel 映射字段string
valueMappingFieldvalue 映射字段string
viewModeLabelField表格视图显示 label 的字段string
allowCreate是否允许创建新选项boolean
useDatableDict是否使用数据字典boolean
dictId数据字典 IDstring
multiple是否多选boolean

IOperationItem 属性

属性描述类型默认值
label按钮标签string / ComputedRef
icon按钮图标string
functions按钮函数{ transformLabel?, click? }

ILabel 属性

属性描述类型默认值
create创建按钮自定义标签string
delete删除按钮自定义标签string

组件暴露方法

方法描述
refresh()刷新表格数据
multipleSelection当前选中的行数据
updateConfigAndRefresh更新配置并刷新(已废弃)

TabCard 选项卡

TabCard 组件的作用与常见的 Tab 组件类似,主要用于页面中不同分类的数据表格的切换显示,支持展示不同分类的总数统计,需要搭配 Table 组件一起使用。

基础用法

<template>
  <TabCard :cards="cards" :tableRef="tableRef"/>
  <TableView ref="tableRef" :config="tableConfig" />
</template>

<script setup lang="ts">
import { computed, onMounted, reactive, ref } from "vue";
import { countData } from "~/api";
import TableView, { ITableConfig } from "~/components/common/TableView.vue";
import TabCard, { ICardConfig } from "~/components/common/TabCard.vue";

const tableRef = ref();

const firstTableConfig = reactive<ITableConfig>({
  // 此处省略 Table 配置
});

const secondTableConfig = reactive<ITableConfig>({
  // 此处省略 Table 配置
});

const tableConfig = reactive<ITableConfig>({...firstTableConfig});

const cards = reactive<Array<ICardConfig>>([
  {
    key: 'first',
    label: 'menu.first',
    icon: 'first-icon',
    tableConfig: firstTableConfig,
  },
  {
    key: 'second',
    label: 'menu.second',
    icon: 'second-icon',
    tableConfig: secondTableConfig,
  },
]);

onMounted(() => {
  countData().then(({ data }) => {
    let resultSet = data.data;
    for (var index in cards) {
      cards[index].count = resultSet[cards[index].key] ?? undefined;
    }
  })
})
</script>

TabCard 属性

属性描述类型默认值
disable是否禁用卡片booleanfalse
icon卡片矢量图标名称,存放于 src/assets/svg 目录string
key卡片唯一标识符string
label卡片标题string
tableConfig点击卡片时要展示的表格配置ITableConfig

Header 标题栏

Header 组件构成了应用界面顶部的标题栏,显示应用名称,为用户提供应用目录、消息中心、控制台入口、用户中心等功能。

Header组件

应用目录:为用户展示 VanCone 生态系统中的所有应用,方便用户快速跳转所需的应用。

消息中心:建设中。

用户菜单:组件最右侧展示用户头像,如果用户尚未设置头像,则会显示用户昵称的前两个字符。用户将光标悬停在头像上,将展示悬浮菜单,可以跳转用户中心、切换语言和退出登录。

基础用法

<template>
  <Header title="Example" helpDocUrl="https://vancone.com/" />
</template>

<script setup lang="ts">
import { Header } from '@vancone/console-component';
</script>

组件属性

属性描述类型默认值
title应用标题string
helpDocUrl帮助文档链接string

低代码配置

Header 组件不支持低代码配置。

SvgIcon 图标

SvgIcon 用于加载 SVG 图标,会根据 name 字段的值去寻找项目中的 src/assets/svg 目录下的同名 SVG 文件。

基础用法

<template>
  <SvgIcon name="menu-grey" />
</template>

<script setup lang="ts">
import SvgIcon from '~/components/common/SvgIcon.vue';
</script>

SideMenu 侧边菜单

基础用法

FormView 表单

基础用法

组件属性

低代码配置

复合组件