组件优势

  • 零代码负担:所有常见页面布局已封装为标签组件,通过属性配置即可快速完成页面搭建,无需编写复杂逻辑
  • API 自动化:内置智能数据请求引擎,只需配置 API 地址,组件自动处理数据加载、分页逻辑与状态管理
  • 全场景适配:通过丰富的标签属性组合,覆盖几乎所有业务场景需求,实现零代码定制化开发

带分页的table展示页

示例代码:

<template>
	<div class="main">
		<KPTableQuery :event-bus="eventBus" :query-params="queryParams">
			<KPInputText v-model="queryParams.postName" label="岗位名称" :span="5"/>
			<KPInputText v-model="queryParams.postCode" label="岗位编码" :span="5"/>
			<KPSelect v-model="queryParams.status" label="状态" :span="5" :options="StartAndStopEnum" @change="handleQuery"/>
		</KPTableQuery>
		
		<KPTable :event-bus="eventBus" :table-key="basic.tableKey" :list-api="basic.listApi" :table-column="tableColumn" :add-button="basic.addButtonAuth" :update-button="basic.updateButtonAuth" :del-api="basic.delApi" :del-button="basic.delButtonAuth" :details-button-row="basic.detailsButtonAuth" update-button-row del-button-row checkbox action-width="190px">
			<template #status="{ row }">
				<el-switch v-model="row.status" inline-prompt :active-value="1" active-text="正常" :inactive-value="0" inactive-text="停用" @click="handleSwitchStatus(row)"/>
			</template>
		</KPTable>
		
		<KPDialogFormEdit v-model="dialogVisible" :event-bus="eventBus" :table-key="basic.tableKey" :rules="rules" :title="basic.title" :edit-params="editForm" :date-structure="EditData" :save-api="basic.saveApi" :update-api="basic.updateApi" :details-api="basic.detailsApi" label-width="100px">
			<KPInputText v-model="editForm.postName" label="岗位名称" prop="postName"/>
			<KPInputText v-model="editForm.postCode" label="岗位编码" prop="postCode"/>
			<KPRadio v-model="editForm.status" label="岗位状态" prop="status" :options="StartAndStopEnum"/>
			<KPInputText v-model="editForm.remark" label="备注" type="textarea"/>
		</KPDialogFormEdit>
		
		<KPDialogDetails v-model="detailsDialogVisible" :event-bus="eventBus" :table-key="basic.tableKey" :title="basic.title + '详情'" :details-api="basic.detailsApi" :details-column="detailsColumn" label-width="120px"/>
	</div>
</template>

<script setup lang="ts">
import { reactive, ref } from "vue";
import mitt from "mitt";
import { removeEmptyAndNull } from "@/utils/json";
import { DetailsColumn, TableColumn, TableDialogColumn } from "@/utils/data/systemData";
import { StartAndStopEnum } from "@/utils/data/serviceData";
import { postJson } from "@/api/common";

let basic: TableDialogColumn = {
	title: "岗位",
	tableKey: "postId",
	listApi: "/auth/post/page/list",
	saveApi: "/auth/post/save",
	addButtonAuth: "auth:post:save",
	updateApi: "/auth/post/update",
	updateButtonAuth: "auth:post:update",
	delApi: "/auth/post/batch/remove",
	delButtonAuth: "auth:post:batch:remove",
	detailsApi: "/auth/post/details",
	detailsButtonAuth: "auth:post:details"
}

/**
 * 搜索内容
 */
const queryParams = reactive({
	postCode: null as string | null,
	postName: null as string | null,
	status: null as number | null,
	pageNum: 1,
	pageSize: 10,
	orderBy: null as string | null
});


/**
 * table 列表 定义显示列
 */
let tableColumn: TableColumn[] = [
	{ prop: 'postName', label: '岗位名称', sort: true },
	{ prop: 'postCode', label: '岗位编码', sort: true },
	{ prop: 'status', label: '岗位状态', sort: true },
	{ prop: 'remark', label: '备注' },
	{ prop: 'createDate', label: '创建时间', sort: true },
	{ prop: 'createUserName', label: '创建用户', sort: true },
	{ prop: 'updateDate', label: '修改时间', sort: true },
];

/**
 * 详情显示列
 */
let detailsColumn: DetailsColumn[] = [
	{ prop: 'postId', label: '岗位Id' },
	{ prop: 'postName', label: '岗位名称' },
	{ prop: 'postCode', label: '岗位编码' },
	{ prop: 'status', label: '项目状态', render: { 0: "停用", 1: "正常" } },
	{ prop: 'createDate', label: '创建时间' },
	{ prop: 'updateDate', label: '修改时间' },
	{ prop: 'createUserId', label: '创建用户编号' },
	{ prop: 'updateUserId', label: '修改用户编号' },
	{ prop: 'createUserName', label: '创建用户名称' },
	{ prop: 'updateUserName', label: '修改用户名称' },
	{ prop: 'remark', label: '备注', span: 2 }
];

/**
 * 新增 修改的表单校验对象
 */
const rules = reactive({
	postName: [{ required: true, message: "请输入岗位名称", trigger: "blur" }],
	postCode: [{ required: true, message: "请输入岗位编号", trigger: "blur" }],
	status: [{ required: true, message: "请选择岗位状态", trigger: "blur" }]
});


/**
 * 需要编辑的对象内容定义
 */
class EditData {
	postId: string = null;
	postName: string = null;
	postCode: string = null;
	remark: string = null;
	status: number = 1;
};
//编辑表单数据
const editForm = reactive<EditData>(new EditData());
// 创建事件总线实例
const eventBus = mitt();
//是否显示模态框
const dialogVisible = ref<boolean>(false)
//详情模态框
const detailsDialogVisible = ref<boolean>(false)


/**
 * 下拉框修改
 */
const handleQuery = async () => {
	eventBus.emit('queryList', removeEmptyAndNull(queryParams));
};

/**
 * 设置项目状态
 * @param val
 */
const handleSwitchStatus = async (val) => {
	await postJson("/auth/post/do/status", { postId: val.postId });
	eventBus.emit('queryList', removeEmptyAndNull(queryParams));
};


</script>

<style lang="scss" scoped></style>

最终效果:

效果图 img01

不带分页的table展示页

示例代码:

<template>
	<div class="main">
		<KPTableQuery :event-bus="eventBus" :query-params="queryParams" :date-structure="QueryData" exclude="orderBy,isTree">
			<KPInputText v-model="queryParams.deptName" label="部门名称" :span="5"/>
			<KPInputText v-model="queryParams.source" label="数据来源" :span="5"/>
			<KPSelect v-model="queryParams.status" label="状态" :span="5" :options="StartAndStopEnum" @change="handleQuery"/>
		</KPTableQuery>
		
		<KPTableTree :event-bus="eventBus" :table-key="basic.tableKey" :list-api="basic.listApi" :table-column="tableColumn" :query-params="queryParams" :add-button="basic.addButtonAuth" :update-button="basic.updateButtonAuth" :del-api="basic.delApi" :del-button="basic.delButtonAuth" :details-button-row="basic.detailsButtonAuth" :sort-api="basic.sortApi" update-button-row del-button-row checkbox @open-edit-dialog="openEditDialog" action-width="190px">
			<template #status="{ row }">
				<el-switch v-model="row.status" inline-prompt :active-value="1" active-text="正常" :inactive-value="0" inactive-text="停用" @click="handleSwitchStatus(row)"/>
			</template>
		</KPTableTree>
		
		<KPDialogFormEdit v-model="dialogVisible" :event-bus="eventBus" :table-key="basic.tableKey" :rules="rules" :title="basic.title" :query-params="queryParams" :edit-params="editForm" :date-structure="EditData" :save-api="basic.saveApi" :update-api="basic.updateApi" :details-api="basic.detailsApi" label-width="100px">
			<KPTreeSelect v-model="editForm.parentId" :options="deptSelectValue" label="上级部门" prop="parentId"/>
			<KPInputText v-model="editForm.deptName" label="部门名称" prop="deptName"/>
			<KPRadio v-model="editForm.status" label="部门状态" prop="status" :options="StartAndStopEnum"/>
			<KPInputText v-model="editForm.remark" label="备注" type="textarea" rows="4"/>
		</KPDialogFormEdit>
		
		<KPDialogDetails v-model="detailsDialogVisible" :event-bus="eventBus" :table-key="basic.tableKey" :title="basic.title + '详情'" :details-api="basic.detailsApi" :details-column="detailsColumn" label-width="120px"/>
	</div>
</template>

<script setup lang="ts">
import { reactive, ref } from "vue";
import mitt from "mitt";
import { removeEmptyAndNull } from "@/utils/json";
import { DetailsColumn, SelectColumn, TableColumn, TableDialogColumn } from "@/utils/data/systemData";
import { StartAndStopEnum } from "@/utils/data/serviceData";
import { getDeptSelect } from "@/api/system";
import { postJson } from "@/api/common";

let basic: TableDialogColumn = {
	title: "部门",
	tableKey: "deptId",
	listApi: "/auth/dept/list",
	saveApi: "/auth/dept/save",
	addButtonAuth: "auth:dept:save",
	updateApi: "/auth/dept/update",
	updateButtonAuth: "auth:dept:update",
	delApi: "/auth/dept/batch/remove",
	delButtonAuth: "auth:dept:batch:remove",
	detailsApi: "/auth/dept/details",
	detailsButtonAuth: "auth:dept:details",
	sortApi: "/auth/dept/do/set/sort"
}

/**
 * 搜索内容对象内容定义
 */
class QueryData {
	deptName: string = null;
	source: string = null;
	status: string = null;
	orderBy: string = "sort asc";
	isTree: number = 1
};

/**
 * 搜索内容
 */
const queryParams = reactive<QueryData>(new QueryData());

/**
 * table 列表 定义显示列
 */
let tableColumn: TableColumn[] = [
	{ prop: 'deptName', label: '部门名称', sort: true },
	{ prop: 'hierarchy', label: '层级', sort: true },
	{ prop: 'source', label: '数据来源', sort: true },
	{ prop: 'status', label: '部门状态', sort: true },
	{ prop: 'remark', label: '备注' },
	{ prop: 'createDate', label: '创建时间', sort: true },
	{ prop: 'createUserName', label: '创建用户', sort: true },
	{ prop: 'updateDate', label: '修改时间', sort: true },
];

/**
 * 详情显示列
 */
let detailsColumn: DetailsColumn[] = [
	{ prop: 'deptId', label: '部门Id' },
	{ prop: 'deptName', label: '部门名称' },
	{ prop: 'status', label: '项目状态', render: { 0: "停用", 1: "正常" } },
	{ prop: 'hierarchy', label: '部门层级', suffix: "级" },
	{ prop: 'parentId', label: '父部门id' },
	{ prop: 'topDeptId', label: '根部门id' },
	{ prop: 'trilateralId', label: '三方系统主键' },
	{ prop: 'source', label: '数据来源' },
	{ prop: 'ancestors', label: '祖级列表', span: 2 },
	{ prop: 'createDate', label: '创建时间' },
	{ prop: 'updateDate', label: '修改时间' },
	{ prop: 'createUserId', label: '创建用户编号' },
	{ prop: 'updateUserId', label: '修改用户编号' },
	{ prop: 'createUserName', label: '创建用户名称' },
	{ prop: 'updateUserName', label: '修改用户名称' },
	{ prop: 'remark', label: '备注', span: 2 }
];

/**
 * 新增 修改的表单校验对象
 */
const rules = reactive({
	deptName: [{ required: true, message: "请输入部门名称", trigger: "blur" }],
	status: [{ required: true, message: "请选择部门状态", trigger: "blur" }]
});


/**
 * 需要编辑的对象内容定义
 */
class EditData {
	deptId: string = null;
	deptName: string = null;
	parentId: string = null;
	remark: string = null;
	status: number = 1;
	source: string = "鉴权系统";
};
//编辑表单数据
const editForm = reactive<EditData>(new EditData());
// 创建事件总线实例
const eventBus = mitt();
//是否显示模态框
const dialogVisible = ref<boolean>(false)
//详情模态框
const detailsDialogVisible = ref<boolean>(false)
//部门下拉框
const deptSelectValue = ref<Array<SelectColumn>>();


/**
 * 下拉框修改
 */
const handleQuery = async () => {
	eventBus.emit('queryList', removeEmptyAndNull(queryParams));
};

/**
 * 设置项目状态
 * @param val
 */
const handleSwitchStatus = async (val) => {
	await postJson("/auth/dept/do/status", { deptId: val.deptId });
	eventBus.emit('queryList', removeEmptyAndNull(queryParams));
};

const openEditDialog = async (edit: string, row: any) => {
	const body = await getDeptSelect({ isTree: 1 });
	if (!body.success) return;
	deptSelectValue.value = body.data;
};


</script>

<style lang="scss" scoped></style>

最终效果:

效果图 img02

其他组件

昆鹏框架提供了丰富的UI组件库,完整组件列表请参考组件展示

本代码模板仅展示了基础表格页面的使用方式,更多组件及高级用法请开发者自行探索。框架处于快速迭代中,后续会持续新增更多实用组件。

关于组件文档说明:

  • 所有组件源码均包含详尽注释
  • 标签属性及功能说明均已在代码中详细标注
  • 开发者可直接查阅框架源码获取完整信息

我们非常重视文档建设,如果您需要更完善的组件文档,请反馈给我们。当反馈达到一定数量后,我们会优先安排文档编写工作。