npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@layoutkit/prime-vue-layoutkit

v0.1.8

Published

`@layoutkit/prime-vue-layoutkit` 是一个基于prime-vue ui的工厂函数,用于生成页面基础配置对象,提供表格、表单、对话框、工具栏、消息提示等功能,常用于后台管理系统页面。

Downloads

365

Readme

@layoutkit/prime-vue-layoutkit

@layoutkit/prime-vue-layoutkit 是一个基于prime-vue ui的工厂函数,用于生成页面基础配置对象,提供表格、表单、对话框、工具栏、消息提示等功能,常用于后台管理系统页面。

安装(Installation)

npm install @layoutkit/prime-vue-layoutkit@latest

导出内容总览

以下是该包对外全部导出的内容列表:

一、组件(Components)

| 组件名 | 说明 | | --------------------- | -------------------------- | | DialogRender | 弹窗包装组件,支持动态内容加载、缓存、按钮自定义等 | | PageRender | 页面级布局组件,用于表格 + 工具栏 + 分页等场景 | | LayoutTable | 表格组件,根据配置自动渲染表格 | | LayoutForm | 动态表单组件,根据配置自动渲染表单项 | | DialogContentSlot | Dialog 内容插槽扩展组件 | | FormItemSlot | 表单项插槽扩展组件 | | ColumnItemSlot | 表格列插槽扩展组件 | | LayoutMessage | 消息组件 |

使用方式:

import { ColumnItemSlot, PageRender } from '@layoutkit/prime-vue-layoutkit'

消息及弹窗使用方式:

# 在App.vue中新增,如下
<script setup>
import { DialogRender, LayoutMessage } from '@layoutkit/prime-vue-layoutkit'
</script>

<template>
    <router-view />
    <LayoutMessage />
    <DialogRender />
</template>

二、Hooks & Store

| 方法名 | 使用方式 | 说明 | | --------------------- | -------------------------- | -------------------------- | | useConfig | const { table, dialog, form, tablebar, toolbar, message,key } = useConfig() | 配合PageRander使用,集成了所有hooks,具体api参考其他hooks | | useDialog | const dialog = useDialog() | 弹窗 | | useForm | const form = useForm() | 表单 | | useTable | const table = useTable() | 表格 | | useTableBar | const tablebar = useTableBar() | 表格工具栏 | | useMessage | const message = useMessage() | 消息 |

三、枚举类型(Enums)

| 枚举 | 作用 | | ---------------------- | -------------------------------------- | | FilterEnum | 页面筛选器类型(input / select / date 等) | | FilterOperatorEnum | 筛选器操作符(=、like、between 等) | | FormEnum | 表单项类型定义(input、textarea、select、radio 等) |

示例:

import { FormEnum } from '@layoutkit/prime-vue-layoutkit'

if (field.type === FormEnum.SELECT) { ... }

快速开始(Usage)

  • 需要在项目中使用权限管理相关设置,如下代码所示。
import { store as storePer } from '@layoutkit/prime-vue-layoutkit'
# 此处数据存储到localStorage中,如需sessionStorage, 请调用storePer.enabledSession(), 更多使用参考store相关内容。
async getPermission() {
    try {
        const res = await api.getPermission()
        if (res.code === 0) {
            this.menus = res.data.menus.sort((a, b) => a.sort - b.sort)
            this.permissions = res.data.pers
            this.userInfo = res.data.userInfo
            if (res.data.super) storePer.disabledPer()  // 超管不验证权限
            else {
                storePer.set(res.data.pers)             // 将权限数据传递给权限控制模块
                storePer.enabledPer()                   // 启用权限控制   
            }
        }
        return res
    } catch (error) {
        this.menus = []
        throw error
    }
}
  • PageRender组件中的筛选功能
# PageRender组件中的筛选相关功能默认数据格式为普通json对象,如需其他数据格式需要使用如下方法重写
app.config.globalProperties.$layoutkitBuildDataFunc = (items) => { return items }

# items数据结构如下
[{
  field: '',              // 字段名
  fieldOperator: '=',     // 查询类型
  value: ''               // 查询值
}]

API 文档(API)

useTable, 或者useConfig中提供的table

| 方法名称 | 描述 | | ---------------------- | -------------------------------------- | | registerLoader | 注册表格加载函数,需返回数据格式: { total: 0, records: [] } , 树形表格返回[]即可 | | setPageSize | 设置分页大小 | | setPageOptions | 设置分页选项 | | setRowKey | 数据行的字段 | | setParentKey | 树结构表格数据行的父级字段 | | disabledDefaultCloumn | 禁用默认列 | | enabledTree | 启用树结构表格 | | enabledLeftPosition | 启用左侧工具栏,默认右侧 | | disabledPagination | 禁用分页组件 | | reload | 重新加载表格,并将分页页码重置为 1 | | registerKey | 注册权限对象 | | setColumn | 表格列函数,详细参考下面表格 |

setColumn

| 方法名称 | 描述 | | ---------------------- | -------------------------------------- | | enabledPer | 设置列是否使用权限控制 | | setTemplate | 重写列的内容,支持返回一般内容以及使用组件返回 | | setWidth | 设置列的宽度 | | setStyle | 设置列的样式 | | setAttr | 设置列的属性 |

代码参考

table.enabledLeftPosition()
table.setPageOptions([10, 15, 20])
table.registerLoader(async (page, params) => {
    const pageData = {
        pageIndex: page.index,
        pageSize: page.size,
        data: params
    }
    const res = await api.getPage(pageData)
    return res.code === 0 ? res.data : []
})
table.setColumn('id', '查看')
    .enabledPer('look')
    .setAttr({ frozen: true, alignFrozen: 'left' })
    .setStyle({ color: 'red' })
    .setWidth('20rem')
    .setTemplate((item) => {
        return {
            component: Button,
            content: '查看',
            props: {
                severity: 'info',
                variant: 'text',
                onClick: () => {}
            }
        }
    })

filter(表格筛选, useConfig中提供的)

| 方法名称 | 描述 | | ---------------------- | -------------------------------------- | | register | 注册筛选字段,返回字段对象,可链式设置属性, label字段选填 | | registerBuildDataFunc | 筛选数据重写函数,此函数优先级高于全局$layoutkitBuildDataFunc方法 |

返回对象方法

| 方法 | 说明 | | -------------------------------- | ---------------------- | | setOptions(options: Array) | 设置下拉选项,自动切换为 SELECT 类型 | | setType(type: FilterEnum) | 设置字段类型,参考包中FilterEnum枚举 | | setDefaultValue(val: any) | 设置默认值, 同时设置值, 重置时生效 | | setValue(val: any) | 设置值 | | setOperator(operator: FilterOperatorEnum) | 设置查询操作符,参考包中FilterOperatorEnum枚举 | | setPlaceholder(text: string) | 设置输入提示 | | onRequire() | 开启筛选必须输入验证 |

代码参考

filter.register('name', '姓名')
  .setType(FilterEnum.TEXT)
  .setPlaceholder('请输入姓名')

toolbar(页面工具栏, useConfig中提供的)

提供顶部工具栏注册和操作

| 方法名称 | 描述 | | ---------------------- | -------------------------------------- | | register | 注册筛选字段,返回字段对象,可链式设置属性, label字段选填 | | registerKey | 注册权限对象 |

返回对象方法

| 方法 | 说明 | | -------------------------------- | ---------------------- | | enabledPer(id: string) | 设置工具栏中按钮是否使用权限控制 | | ignorePer() | 设置工具栏中按钮是否忽略权限控制 | | setAttr(attrs: object) | 设置工具栏中按钮的属性 | | on(val: func) | 事件函数 |

代码参考

toolbar.register('新增')
  .setAttr({ type: 'success', icon: 'Plus' })
  .enabledPer('add')
  .on(() => {
    console.log('点击新增')
  })

4. tablebar(表格工具栏, useConfig中提供的) 或者useTableBar

提供表格中的工具栏按钮注册和操作

| 方法名称 | 描述 | | ---------------------- | -------------------------------------- | | register | 注册按钮,返回按钮对象,可链式设置属性, label字段选填 | | registerKey | 注册权限对象 | | enabledForzen | 启用悬停 | | setAttr | 设置属性 | | setTitle | 设置标题 | | setWidth | 设置宽 | | setStyle | 设置style |

返回字段对象方法

| 方法 | 说明 | | -------------------------------- | ---------------------- | | enabledPer(id: string) | 设置工具栏中按钮是否使用权限控制 | | ignorePer() | 设置工具栏中按钮是否忽略权限控制 | | setAttr(attrs: object) | 设置工具栏中按钮的属性 | | hide(val: func) | 隐藏事件函数 | | on(val: func) | 事件函数 |

代码参考

tablebar.register('编辑')
  .setAttr({ type: 'primary', icon: 'Edit' })
  .enabledPer('edit')
  .hide((item) => item.status === 1)
  .on(() => {
    console.log('点击新增')
  })

5. dialog(弹窗管理, useConfig中提供的) 或者useDialog

注册一个弹窗实例,返回链式操作对象

| 方法名称 | 描述 | | ---------------------- | -------------------------------------- | | register | 注册dialog对象,可链式设置属性 |

返回对象方法

| 方法 | 说明 | |------|------| | setTitle(title) | 设置标题 | | setWidth(width) | 设置宽 | | setStyle(style) | 设置style | | setContentStyle(style) | 设置ContentStyle | | setAttr(attrs) | 批量设置属性,如 title、width、fullscreen、draggable、withCancel、aliginCenter | | setComponent(comp, propsData) | 设置弹窗组件及 propsData,支持异步 | | setForm(propsData) | useForm返回的表单对象 | | setFormData(propsData) | 表单的字段对象/支持异步调用的表单数据接口 | | show() | 显示弹窗并设置 dialog.instance | | hide() | 隐藏弹窗 | | destroy() | 销毁弹窗,清空数据,重置 loading | | disabledCancel() | 禁用取消按钮 | | disabledCancelIcon() | 禁用取消按钮图标 | | enabledMaximizable() | 启用最大化按钮 | | setBtn(label, command, type, icon) | 添加或覆盖按钮 |

setBtn

| 方法 | 说明 | |------|------| | setLabel(label) | 设置名称 | | setIcon(icon) | 设置图标 | | setType(type) | 设置按钮类型 | | on(func) | 按钮事件 |

代码参考

// 创建,使用表单的话,参考下节表单相关内容
const useForm = form.register()
const myDialog = dialog.register()
  .setAttr({ width: '600px', fullscreen: false, draggable: true })
  .setBtn('保存', async (dialogRef, compRef) => {
      await saveUser(formMap.get('userForm').data)
      dialogRef.hide()
  }, 'primary')
  .setForm(useForm)
// 新增示例
myDialog.setTitle('新增用户').setFormData({ }).show()
// 编辑示例
myDialog.setTitle('用户信息').setFormData({ name: '张三', age: 21 }).show()

6. form(表单管理, useConfig中提供的) 或者useForm

用于创建表单对象,或者配合dialog使用

| 方法名称 | 描述 | | ---------------------- | -------------------------------------- | | register | 注册form对象,可链式设置属性 |

返回对象方法

| 方法 | 说明 | |------|------| | setData(formData) | 设置表单数据 | | setRow() | 创建行,返回行对象 |

setRow

| 方法 | 说明 | |------|------| | setColumn(field: string, callback: function, label: string) | 创建列 |

callback

| 方法 | 说明 | |------|------| | disabledLabel() | 隐藏表单标题 | | setLabel(label: string) | 设置标题 | | setOptions(options: array, type: FormEnum) | 设置部门组件的选项数据, type:默认值是FormEnum.SELECT | | setType(type:FormEnum) | 设置组件类型,详细参考FormEnum枚举 | | setPlaceholder(text:string) | 设置提示语 | | setAttr(attrs:object) | 批量设置属性 | | setComponent(comp:object) | 设置自定义组件,可与FormItemSlot插槽配合使用 | | setRule(rules:function) | 设置表单验证规则,function可接收 schema、 z 、formData 参数 | | onRequire() | 启用表单规则验证 | | on(fn:function) | 表单组件事件 | | hide(fn:function) | 组件隐藏事件 | | change(fn:function) | 改变组件的行为 | | setColumn(field: string, callback: function, label: string) | 创建列 |

代码参考

const options = [{label:'男', value:'M'}, {label:'女', value:'F'}]
const testForm = form.register()
testForm.setRow()
    .setColumn('name', col => col.setLabel('姓名')
      .setPlaceholder('请输入姓名')
      .onRequire())
    .setColumn('gender', col => col.setLabel('性别')
      .setType(FormEnum.SELECT)
      .setOptions(options))

7. key(权限注册管理,由useConfig提供)

用于权限验证

方法

| 方法 | 说明 | | ---------------------------- | -------- | | register(key:string, value:string) | 注册权限 key | | get(key:string) | 获取权限 key |

代码参考


# 注册权限
key.register('view', 'menu:view')
# 工具栏使用权限
toolbar.register('预览').enabledPer('view').on(()=> {})

8. message(消息提示与确认弹窗, useConfig中提供的) 或者useMessage

消息提示


message.success(content: string, callback: function)
message.error(content:string, callback: function)
message.info(content:string, callback: function)
message.warning(content:string, callback: function)
message.confirm(content:string, acceptFunc: function, rejectFunc: function, callback: function)

弹窗提示

await message.confirm('确定删除吗?', () => {})
await message.success('操作完成')

9. 枚举对象

FormEnum

FormEnum = {
  INPUT_TEXT: 'input_text',
    INPUT_NUMBER: 'input_number',
    INPUT_TEXTAREA: 'input_textarea',
    DATE_PICKER: 'date_picker',
    TIME_PICKER: 'time_picker',
    RADIO_BUTTON: 'radio_button',
    CHECKBOX: 'checkbox',
    TOGGLE_BUTTON: 'toggle_button',
    SELECT: 'select',
    TREE_SELECT: 'tree_select',
    MULTI_SELECT: 'multi_select',
    PASSWORD: 'password',
    COMPONENT: 'component'
}

FilterEnum

FilterEnum = {
    TEXT: 'text',
    NUMBER: 'number',
    SELECT: 'select',
    DATE: 'date',
    DATE_RANGE: 'daterange',
    SWITCH: 'switch',
}

FilterOperatorEnum

FilterOperatorEnum = {
  EQUAL: "=",              // 等于
  NOT_EQUAL: "!=",         // 不等于
  GREATER: ">",            // 大于
  LESS: "<",               // 小于
  GREATER_EQUAL: ">=",     // 大于等于
  LESS_EQUAL: "<=",        // 小于等于
  IS_NULL: "isNull",       // IS NULL
  IS_NOT_NULL: "isNotNull",// IS NOT NULL
  LIKE: "like",            // LIKE
  NOT_LIKE: "notLike",     // NOT LIKE
  IN: "in",                // IN
  NOT_IN: "notIn",         // NOT IN
  OR: "or",                // OR
}

参考示例

<template>
    <div>
        <PageRender />
        <!--表格列示例-->
        <ColumnItemSlot name="name1">
          <template #default="{ props, data }">
            <!--如果传入的是props属性,如下-->
            <el-tag type='info' v-if="data === 0">男</el-tag>
            <!--如果传入的是content属性,如下-->
            <el-tag type='primary' v-if="data === 1">女</el-tag>
          </template>
        </ColumnItemSlot>
        <!--表单项示例-->
        <FormItemSlot name="name2">
          <!--emit:其中包含update更新方法-->
          <!--props:表单字段属性-->
          <!--data:表单数据-->
          <template #default="{ data, props, emit }">
            <el-select v-model="data.gender"
              @change="(e) => emit('update', data.gender)">
              <el-option label="男" value="0" />
              <el-option label="女" value="1" />
          </el-select>
          </template>
        </FormItemSlot>
        <!--Dialog 显示内容示例-->
        <DialogContentSlot name="name3">
            <template #default="{ data }">
              <span>测试</span>
              <span>{{data.content}}</span>
            </template>
        </DialogContentSlot>
    </div>
</template>

<script setup>
  import {
    PageRender, useConfig, FormEnum,
    DialogContentSlot, FormItemSlot, ColumnItemSlot
  } from '@layoutkit/prime-vue-layoutkit'
  const { table, tablebar, filter, toolbar, form, dialog, message, key } = useConfig()

  // 注册权限
  key.register('view', 'test:view')

  // 注册表单
  const userForm = form.register()
  userForm.setRow()
    .setColumn('name', col => col.setLabel('年龄'))
    .setColumn('age', col => col.setLabel('年龄').setType(FormEnum.INPUT_NUMBER).onRequire())
  // 插槽示例
  userForm.setRow().
    .setColumn('gender', col => col.setLabel('性别').setComponent('name2'))

  // 筛选部分
  filter.register('name', '姓名')
  filter.register('age', '年龄')

  // dialog
  const userDialog = dialog.register()
              .setAttr({ width: '600px' })
              .setBtn('保存', async (currentDialog, componentRef) => {
                  try {
                      // 表单验证
                      await componentRef.valid()  
                      // 调用接口
                      const formData = componentRef.formData
                      formData.id 
                        ? await api.addUser(componentRef.formData) 
                        : await api.updateUser(componentRef.formData)
                      currentDialog.hide()
                      message.success('保存成功')
                      table.reload()
                  } catch (e) {
                      console.log('表单校验未通过', e)
                  }
              }, 'primary')

  // 工具栏
  toolbar.register('添加').enabledPer('view').setAttr({ type: 'success' }).on(async () => {
      userForm.setData({ name: '', age: 0 })
      userDialog.setTitle('添加用户').setForm(userForm).show()
  })

  // 工具栏, 测试dialog内容插槽
  toolbar.register('测试dialog内容插槽').on(async () => {
      dialog.register('测试dialog内容插槽').setComponent('name3', { content: '测试内容' }).show()
  })

  // table工具栏
  tablebar.register('编辑').on((item) => {
      userForm.setData(item)
      userDialog.setTitle('编辑用户').setForm(userForm).show()
  })

  // 表格加载
  table.setColumn('name', '姓名')
  table.setColumn('age', '年龄')
  table.setColumn('gender', '性别').setTemplate((item) => {
    return {
      component: 'name1',
      content: item.gender,
      props: {
        gender: item.gender
      }
    }
  })
  table.registerLoader(async (pageInfo, pageParams) => {
    const res = await api.getUsers({
        pageNum: page.index,
        pageSize: page.size,
        data: pageParams
    })
    return { records: res.list, total: res.total }
  })
</script>