0.0.4 • Published 7 months ago

kc-table-form v0.0.4

Weekly downloads
-
License
ISC
Repository
-
Last release
7 months ago

TOC

同类型产品

image-20230922104820867

image-20230922105530455

image-20230922104725264

优势对比

对比对象

小科爱牧5.0 (爱佳-供应商管理)

image-20230922093740218image-20230922093814780

种猪测定站 (系统管理-测定中心管理)

image-20230922093853870

image-20230922093837114

页面模板代码量对比

小科爱牧5.0:357行

image-20230922094319638

种猪测定站 :7行

image-20230922094353548

业务逻辑代码量对比

小科爱牧5.0:725行

image-20230922094651716

种猪测定站 :150行

image-20230922094537244

对比总结

对比项小科爱牧5.0种猪测定站差异比
页面模板代码量357751:1
业务逻辑代码量7251504.8:1
合计10821576.9:1

KcTable使用文档

功能介绍&案例演示

基础功能介绍

基础功能介绍2

基础功能介绍3

可选类型

image-20230922152516522

复杂搭配

复杂搭配

<!--模板配置-->
<kc-table-dialog ref="measureDialog" :form='data.form' :field-list="data.formFields" width="700px" :submit="submit">
<template #header="{formData}">
  <div class="mb20 flex align-items-center justify-content-between">
    <span>商品代集中测定可测定的性状为:生长性状、胴体性状!</span>
    <el-button :disabled="!formData.linkMeasureId" class="pointer" @click="measureCalendar(formData.linkMeasureId)" type="primary" link>测定中心日程查看</el-button>
  </div>
</template>
<template #footer>
  <span>已选样本:{{ selectedList.length }}只</span>
  <span class="ml20">公猪{{ selectedMaleList }}只</span>
  <span class="ml20">母猪{{ selectedFemaleList }}只</span>
  <kc-table class="w-100" style="height: 50vh;" selection :index="false" ref="pigSelectListTable"
            :columns="data.pigSelectListColumns" :api="data.pigSelectListApi" :api-filters="data.pigSelectListApiFilters" :pagerCount="5"/>
</template>
</kc-table-dialog>

<script>
const data = reactive({
  ...,
  // Form字段配置
  formFields: [
    {
      label: '拟测日期', prop: 'planDate', span: 12, form: {
        component: {name: 'el-date-picker', valueFormat: 'YYYY-MM-DD',},
        formItem: {rules: [{required: true, trigger: ['blur', 'change'], message: '请选择拟测日期'},]}
      }
    },
  ],
  // 表格字段配置
  pigSelectListApi: listAnimals,
  pigSelectListApiFilters: {orgId: useUserStore().orgInfo.orgId, groupType: 2},//集中测定只测定示范场商品代
  pigSelectListColumns: [
    {label: '猪只编号', prop: 'pigCode', width: '170px', align: 'center'},
    {
      label: '性别', prop: 'gender', width: 'auto', align: 'center',
      formatter: (row) => row.gender === GENDER_MALE ? '公猪' : '母猪'
    },
    {label: '猪场', prop: 'linkFarmName', width: 'auto', align: 'center'},
    {label: '品种', prop: 'linkSeriesName', width: 'auto', align: 'center'},
    {label: '初生日期', prop: 'birthDate', width: 'auto', align: 'center'},
  ],
  ...
})

//打开弹框
const handleMeasure = (row) => {
  data.form = {planDate: row?.planDate,id:row?.id, entrustCode: row?.entrustCode, comLicence: useUserStore().orgInfo.comLicence}
  measureDialog.value.open(row ? 'edit' : 'add', '示范场商品代委托测定')
}

// 提交逻辑
const submit = (type, formRef, formData) => {
    // 先提交委托,再提交200头猪
    proxy.simpleCall(formData, type === 'add' ? addTask : editTask, loading, table, proxy, (res) => {
      formData.entrustCode = formData.entrustCode || res?.data
      formData.pigList = selectedList.value.map(item => ({id: item.id, pigCode: item.pigCode}))
      proxy.simpleCall(formData, sendEntrust, loading, table, proxy)
    })
  }
</script>

配置&使用

模板配置

<kc-table style="height: 100%" ref="table"
<!--新增按钮权限-->
permissions="system:breedingfarm:add"
<!--table的列-->
:columns="tableColumns"
<!--table操作列-->
:handle="tableHandle"
<!--table数据列表的筛选条件-->
:filters="tableFilters"

<!--获取table数据列表的api接口-->
:api="getDataListReq"
<!--api接口请求默认携带的参数-->
:api-filters="{orgId:1}"
<!--将要渲染的数据,配置data时api将失效-->
:data="[]"

<!--返回按钮,返回上一级页面-->
back-btn
<!--分页按钮数量-->
:pager-count="5"
<!--表格是否为索引类型,默认为true。-->
index
<!--表格是否为可选类型,默认为false。配置selection时index将失效-->
selection
<!--表格数据是否分页,默认为false-->
noPage
<!--单元格合并方法,接收一个Function-->
spanMethod
>
    
    <!--筛选区域的插槽,data为表格原始数据-->
    <template #filter="{data}"></template>
    <!--添加按钮区域插槽-->
    <template #action></template>
    <!--表格顶部区域插槽-->
    <template #header></template>


</kc-table>

配置参数

参数名说明类型默认值
api获取table数据列表的api接口Function-
api-filtersapi接口请求默认携带的参数Object-
data将要渲染的数据,配置data时api将失效Array-
columnstable的列Array-
handletable操作列Array-
filterstable数据列表的筛选条件Array-
back-btn返回按钮,返回上一级页面Booleanfalse
pager-count分页按钮数量Number5
index表格是否为索引类型Booleantrue
selection表格是否为可选类型。配置selection时index将失效Booleanfalse
noPage表格数据是否分页eBooleanfalse
spanMethod单元格合并方法Function-

插槽

插槽名说明参数
filter筛选区域的插槽,data为表格原始数据data
action添加按钮区域插槽-
header表格顶部区域插槽-

具体配置

api && api-filters

const data = reactive({
    ...,
    //   列表请求接口
    api: listOrg,
    //   列表请求接口固定拼接的参数 相当于listOrg({farmType: FARM_TYPE_BREEDING}).then(res=>{...})
    apiFilters: {farmType: FARM_TYPE_BREEDING},
    ...
})

export function listOrg(query) {
    // axios对象实例
    return request({
        url: '/system/org/pageInfo',
        method: 'get',
        params: query
    })
}

columns

字段名说明参数
label列名String
prop列属性,接收的key,支持多级选择,如:user.ageString
width列宽度,支持pxString
align列对齐方式String
formatter列数据格式化Function
click列点击事件Function
render列数据渲染,配置后formatter和click将不生效Function
editor行内编辑模式,配置后render将不生效Object

注意:el-table的原生属性也可以写在columns里面,如:fixed、show-overflow-tooltip等

const data = reactive({
    ...,
    //   表格显示的列
    tableColumns: [
        // 普通数据渲染
        {label: '功能ID', prop: 'id', width: 'auto', align: 'center'},
        {label: '功能名称', prop: 'title', width: '100px', align: 'center'},
        // 行内编辑模式
        {label: '功能名称', prop: 'title', width: '100px', align: 'center', editor: {is: 'el-input'}},
        // 多层级prop数据渲染
        {label: '操作员年龄', prop: 'user.age', width: 'auto', align: 'center'},
        {label: '操作员性别', prop: 'user.gender', width: 'auto', align: 'center'},
        // el-table的原生属性使用
        {label: '备注', prop: 'reamark', width: 'auto', align: 'center', showOverflowTooltip: true},
        // 数据格式化(只改变内容)
        {
            label: '测试类型', prop: 'test', width: 'auto', align: 'center',
            formatter: (row) => COM_TYPE.find(item => item.value == row.comType).label
        },
        {
            label: '测试时间', prop: 'createTime', width: 'auto', align: 'center',
            formatter: (row) => proxy.parseTime(row.createTime, '{y}-{m}-{d} {h}:{i}')
        },
        // 点击事件处理
        {
            label: '测试历史数据1', prop: 'breedSeriesCount', width: 'auto', align: 'center',
            click: (row) => router.push({name: 'BreedSeries', query: {breedId: row.id}})
        },
        // 数据格式化 +点击事件处理
        {
            label: '测试历史数据2', prop: 'pigCount', width: 'auto', align: 'center',
            click: (row) => router.push({name: 'PigDemo', query: {breedId: row.id}}),
            formatter: (row) => row.pigCount > 0 ? row.pigCount : undefined
        },
        // 个性化组件渲染
        {
            label: '操作类型', prop: 'businessTypes', width: 'auto', align: 'center',
            render: (h, {row}) => h(ElTag, {innerText: row.businessTypes, type: 'success'})
        },
        // 个性化组件渲染,复杂情况处理。涉及数据交互
        {
            label: '状态', prop: 'status', width: 'auto', align: 'center',
            render: (h, {row}) => {
                return h(ElSwitch, {
                    modelValue: Number(row.status), activeValue: STATUS_NORMAL, inactiveValue: STATUS_ABNORMAL,
                    'onUpdate:modelValue': value => {
                        row.status = value;
                        // 处理状态改变逻辑
                        handleStatusChange(row);
                    },
                })
            }
        },
    ],
    ...
})

handle

字段名说明参数
label按钮名称StringFunction
permissions按钮权限String
disabled按钮是否禁用Function
visible按钮是否隐藏Function
attrs按钮属性,支持原生属性Object
isPop是否弹出提示框Boolean
method按钮点击事件Function
const data = reactive({
    ...,
    //   操作区域
    tableHandle: [
        {
            label: row => row.checkState === '2' ? '查看' : '编辑',
            permissions: 'system:breedingfarm:edit',
            disabled: (row) => row.batchStatus == 1,
            attrs: {link: true, plain: true, type: 'primary', size: 'small', icon: 'Edit'},
            method: row => editItem(row)
        },
        {
            permissions: 'system:breedingfarm:remove',
            visible: (row) => row.batchStatus == 1,
            attrs: {link: true, plain: true, type: 'danger', size: 'small', icon: 'Delete'},
            isPop: true,
            method: row => deleteItem(row)
        }
    ],
    ...
})

filters

字段名说明参数
is组件名称String
prop请求参数名String
title标题String
defaultFirst是否默认选中第一条数据Boolean
dict筛选组件数据源,支持字典数据,也支持自定义数据Array
params是否要放到params里面 如:paramsbeginTime、paramsendTimeBoolean
value默认值Array
shortcuts快速选取时间区域 ,搭配el-date-picker使用Array
attrs筛选组件属性,支持原生属性Object
const data = reactive({
    ...,
    tableFilters: [
        {
            is: 'el-input',
            prop: 'nickName',
            title: '操作人员',
            attrs: {placeholder: '请输入操作人员', style: 'width: 200px;', class: 'mr10', clearable: true}
        },
        {
            is: 'el-select', prop: 'status', defaultFirst: true, title: '状态',
            attrs: {placeholder: '请选择状态', style: {width: '90px'}, class: 'mr10'},
            dict: wrapDefaultAll(STATUS)
        },
        {
            is: 'el-date-picker',
            prop: 'default',//default
            params: true,
            title: '日期范围',
            // value: [proxy.parseTime(new Date(new Date().getTime() - 3600 * 1000 * 24 * 30), '{y}-{m}-{d}'), proxy.parseTime(new Date(), '{y}-{m}-{d}')],
            attrs: {
                startPlaceholder: '开始日期',
                valueFormat: 'YYYY-MM-DD',
                endPlaceholder: '结束日期',
                type: 'daterange',
                rangeSeparator: '-',
                style: {width: '250px'},
                class: 'mr10 w-100',
            },
        },
        // 复杂筛选组件
        {
            is: 'el-date-picker',
            //  请求时候会自动拼接begin和end,如:beginCreateTime、endCreateTime,注意开头字母大小写
            //  如果prop为default,会为:beginTime、endTime
            //  切记,default只可以设置一个,否则会多个组件使用同一个响应数据
            prop: 'CreateTime',//default
            //  是否要放到params里面  如:params[beginTime]、params[endTime]
            params: true,
            title: '日期范围',
            // 默认值
            value: [proxy.parseTime(new Date(new Date().getTime() - 3600 * 1000 * 24 * 30), '{y}-{m}-{d}'), proxy.parseTime(new Date(), '{y}-{m}-{d}')],
            //   快速选取时间区域
            shortcuts: [
                {
                    text: '昨天',
                    value: () => {
                        const end = new Date()
                        const start = new Date()
                        start.setTime(start.getTime() - 3600 * 1000 * 24)
                        return [start, end]
                    },
                },

                {
                    text: '上周',
                    value: () => {
                        const end = new Date()
                        const start = new Date()
                        start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
                        return [start, end]
                    },
                },
                {
                    text: '本周',
                    value: () => {
                        const end = new Date()
                        const start = new Date()
                        start.setTime(start.getTime())
                        return [start, end]
                    },
                },
                {
                    text: '上月',
                    value: () => {
                        const end = new Date()
                        const start = new Date()
                        start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
                        return [start, end]
                    },
                },
                {
                    text: '本月',
                    value: () => {
                        const end = new Date()
                        const start = new Date()
                        start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
                        start.setDate(1)
                        return [start, end]
                    },
                },
            ],

            attrs: {
                'start-placeholder': '开始日期',
                'value-format': 'YYYY-MM-DD',
                'end-placeholder': '结束日期',
                type: 'daterange',
                'range-separator': '-',
                style: {width: '250px'},
                class: 'mr10 w-100',
            },
        },
    ],
    ...
})

selection

// 使用 selectedList获取当前选中内容
tableRef.value.selectedList

KCTableDialog使用示例

配置&使用

模板配置

<kc-table-dialog ref="dialog"
<!--dialog的宽度-->
width='400px'
<!--dialog的高度,不包括 slot #footer-->
height='400px'
<!--编辑的时候需要传入Form的数据,可用做默认值-->
:form='form'
<!--Form字段列表-->
:field-list="formFields"
<!--el-upload的header-->
:headers="headers"
<!--el-upload的action-->
:action="action"
<!--点击确定按钮,通过表单验证的回调 submit(form, type, fileList)-->
@submit="submit"
<!--点击按钮回调,会覆盖@submit-->
:submit="submit"
>
    
    <!--form上方区域,formData为当前form内数据-->
    <template #header="{formData}"></template>
    <template #footer></template>
    <!--form下方区域-->

</kc-table-dialog>

配置参数

参数名说明类型默认值
widthdialog的宽度String50%
heightdialog的高度String50%
form编辑的时候需要传入Form的数据,可用做默认值Object-
field-listForm字段列表Array-
headersel-upload的headerObject-
actionel-upload的actionString-
@submit点击确定按钮,通过表单验证的回调 submit(form, type, fileList)Function-
submit点击按钮回调,会覆盖@submit。通常会搭配formRef使用Function-

插槽

插槽名说明参数
headerform上方区域,formData为当前form内数据formData
footerform下方区域-

具体配置

field-list

字段名说明参数
label列名String
visible是否要显示当前字段Object
editHide编辑模式是否要隐藏当前字段(根据type判断),如编辑用户信息需要隐藏账号、密码Boolean
prop列属性,接收的key,支持多级选择,如:user.ageString
span表单元素所占宽度,范围1-24Number
style表单元素样式Object
form表单元素配置Object
form.change目前仅适用于el-select、el-radio-group、el-input的changeFunction
form.component表单元素配置Object
form.component.name表单元素名称,不填写默认为el-inputString
form.component.formItem表单元素配置Object
form.component.formItem.dict表单元素数据源,支持字典数据,也支持自定义数据Array
form.component.formItem.rules表单元素校验规则Array
const data = reactive({
    ...,
    formFields: [
        // 分割符的使用
        {label: '示范场商品代', span: 24, style: {color: '#1A66FF', fontWeight: '600'}, form: {component: {name: 'div'},}},
        // el-date-picker使用
        {
            label: '结测日期', prop: 'endDate', span: 12, form: {
                component: {name: 'el-date-picker', valueFormat: 'YYYY-MM-DD',},
                formItem: {rules: [{required: true, trigger: ['blur', 'change'], message: '请选择结测日期'},]}
            }
        },
        // el-input使用
        {
            label: '结测体重', prop: 'endWeight', span: 12, form: {
                component: {name: 'el-input',},
                formItem: {rules: [{required: true, message: '请输入结测体重', trigger: ['blur', 'change']},]}
            }
        },
        // visible使用
        {
            label: '进场胎次', prop: 'inParity', span: 12, visible: (formData) => formData.gender === GENDER_FEMALE,
            form: {
                component: {name: 'el-input',},
                formItem: {
                    rules: [
                        {required: true, trigger: ['blur', 'change'], message: '请输入进场胎次'},
                        {pattern: /^^[0-9]+(\.[0-9]+)?$/, message: '请输入正确的进场胎次', trigger: ['blur', 'change']}
                    ]
                }
            }
        },
        // editHide使用
        {
            label: '账号', prop: 'userName', width: 80, editHide: true, form: {
                component: {name: 'el-input',}, formItem: {rules: [{required: true, message: '请输入登录账号', trigger: ['blur', 'change']},]}
            }
        },
        // change使用
        {
            label: '负责人', prop: 'linkLeaderId', span: 12, style: {width: 'calc(100% - 30px)'}, form: {
                component: {name: 'el-select'},
                change: (value) => {
                    const phone = userOptions.value.find(item => item.value === value)?.phone
                    if (phone) {
                        // 通过dialog.value.updateForm更新表单数据
                        dialog.value.updateForm({leaderPhone: phone})
                    }
                },
                formItem: {dict: userOptions, rules: [{required: true, message: '请选则负责人', trigger: ['blur', 'change']},]}
            }
        },
    ],
    ...,
})

内部方法

方法名说明参数
open打开dialog,参数为(type,name)type建议值为add、edit。type会从submit的第二个参数回传String,String
close关闭dialog-
updateForm更新表单数据,更新的字段会覆盖已有字段Object

内部变量

变量名说明类型
formData当前表单数据Object
formRef当前表单对象Object
0.0.4

7 months ago

0.0.3

7 months ago

0.0.2

7 months ago

0.0.1

7 months ago