
Security News
The Code You Didn't Write Is Still Yours to Defend
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.
bz-form-dynamic-test
Advanced tools
Form Dynamic 是一个基于 Vue 3 开发的动态表单设计器组件,提供直观的拖拽式界面来快速构建复杂表单。该组件支持丰富的表单项类型、动态联动、数据验证、权限控制等高级功能,适用于企业级应用中的表单配置场景。
src/
├── api/ # API相关模块,包含模拟数据和接口配置
├── common/ # 通用配置和工具
├── components/ # 表单组件库
├── composables/ # 可复用的组合式函数
├── const/ # 常量定义
├── dialogs/ # 对话框组件
├── store/ # 状态管理
├── utils/ # 工具函数
├── index.vue # 主组件
└── plugin.js # Vue插件配置
npm install form-dynamic
yarn add form-dynamic
在你的 Vue 应用入口文件中(如 main.js 或 main.ts):
import { createApp } from 'vue'
import App from './App.vue'
import FormDynamic from 'form-dynamic'
import 'form-dynamic/dist/style.css'
const app = createApp(App)
app.use(FormDynamic)
app.mount('#app')
在需要使用的组件中:
import { FormDynamicDesigner } from 'form-dynamic'
import 'form-dynamic/dist/style.css'
export default {
components: {
FormDynamicDesigner
}
}
<template>
<div>
<form-dynamic-designer
ref="formDesigner"
:config="formConfig"
@save="handleSave"
@preview="handlePreview"
/>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const formConfig = ref({
// 表单配置项
title: '示例表单',
fields: []
})
const handleSave = (config) => {
console.log('保存表单配置:', config)
// 保存到后端或本地存储
}
const handlePreview = (config) => {
console.log('预览表单配置:', config)
// 预览表单
}
return {
formConfig,
handleSave,
handlePreview
}
}
}
</script>
该项目提供了内置的模拟API模块,用于开发和测试环境,结构如下:
api/config.js: API配置管理api/index.js: API统一导出api/menu.js: 菜单相关模拟数据api/organization/: 组织相关模拟数据api/role.js: 角色相关模拟数据api/system/: 系统相关模拟数据api/user.js: 用户相关模拟数据import { getType, getBasicAll } from 'form-dynamic/api'
// 使用模拟API获取表单类型
getType().then(res => {
console.log('表单类型数据:', res.data)
})
// 使用模拟API获取基础数据
getBasicAll().then(res => {
console.log('基础数据:', res.data)
})
当前版本默认使用真实API,无需额外配置。表单设计器会自动调用配置的API接口获取数据。
你可以通过以下方式配置API参数:
// 通过插件配置自定义API参数
app.use(FormDynamic, {
apiConfig: {
// API基础URL
baseURL: 'https://your-api-server.com/api',
// 请求超时时间(毫秒)
timeout: 30000,
// 是否启用模拟数据模式(设置为true时使用模拟数据)
mock: false
}
})
// 或者在运行时更新API配置
import { updateApiConfig } from 'form-dynamic/api/config'
updateApiConfig({
baseURL: 'https://api.example.com',
timeout: 15000
})
当你需要在开发环境使用模拟数据时,可以通过以下方式配置:
import { createApp } from 'vue'
import App from './App.vue'
import FormDynamic from 'form-dynamic'
import 'form-dynamic/dist/style.css'
const app = createApp(App)
// 通过插件配置启用模拟数据模式
app.use(FormDynamic, {
apiConfig: {
// 启用模拟数据模式
mock: true,
// mockData 对象中定义各个API的模拟返回数据
mockData: {
// 角色列表模拟数据
listRole: (params) => ({
data: [
{ roleId: '1', roleName: '管理员', roleCode: 'ADMIN' },
{ roleId: '2', roleName: '普通用户', roleCode: 'USER' }
]
}),
// 用户列表模拟数据
getUserList: (params) => ({
code: 200,
message: 'success',
data: [
{ id: '1', username: 'admin', realName: '管理员' },
{ id: '2', username: 'user1', realName: '用户1' }
]
}),
// 菜单列表模拟数据
getMenuList: () => ({
data: [
{ menuId: '1', menuName: '首页', menuCode: 'HOME' },
{ menuId: '2', menuName: '设置', menuCode: 'SETTINGS' }
]
}),
// 资源类型模拟数据
getType: () => ({
data: [
{ typeId: '1', typeName: '表单', typeCode: 'FORM' },
{ typeId: '2', typeName: '报表', typeCode: 'REPORT' }
]
}),
// 基础数据模拟数据
getBasicAll: (dictType) => ({
data: {}
}),
// 动态字段模拟数据
getRelateFormFields: (formId) => ({
data: []
}),
// 保存表单配置模拟数据
putSysForm: (data) => ({
code: 200,
message: '保存成功'
}),
// 获取表单配置模拟数据
getFormConfig: (formId) => ({
data: {
basic: {
code: 'demo_form',
name: '示例表单'
},
areaComponents: {}
}
})
}
}
})
app.mount('#app')
除了通过插件配置外,你还可以在应用运行时直接更新API配置:
import { updateApiConfig } from 'form-dynamic/api'
// 更新API配置
updateApiConfig({
mockData: {
listRole: {
data: [
// 你的自定义角色数据
]
},
// 其他API的模拟数据...
}
})
// 获取当前API配置
import { getApiConfig } from 'form-dynamic/api'
const currentConfig = getApiConfig()
console.log('当前API配置:', currentConfig)
表单设计器在处理API调用时的优先级机制如下:
首先检查是否启用模拟模式:
mock: true,则使用模拟数据mock: false(默认),则直接调用真实API在模拟模式下的优先级:
apiConfig.mockData 提供的自定义模拟数据函数API参数配置:
baseURL: API基础URL(默认: '/api')timeout: 请求超时时间(默认: 30000毫秒)mock: 是否启用模拟数据模式(默认: false)mockData: 自定义模拟数据函数对象这种优先级机制确保你可以在开发和测试环境中灵活切换真实API和模拟数据,同时保持配置的简洁性和可维护性。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| config | Object | {} | 表单配置对象 |
| disabled | Boolean | false | 是否禁用设计器 |
| showHeader | Boolean | true | 是否显示头部工具栏 |
| showFooter | Boolean | true | 是否显示底部操作栏 |
| locale | String | 'zh-CN' | 语言设置 |
| theme | Object | {} | 主题配置 |
| 事件 | 参数 | 说明 |
|---|---|---|
| save | config: Object | 保存表单配置时触发 |
| preview | config: Object | 预览表单时触发 |
| reset | - | 重置表单设计器时触发 |
| change | config: Object | 表单配置变更时触发 |
| error | error: Object | 发生错误时触发 |
import { mergeConfig } from 'form-dynamic/utils/configMerger'
const defaultConfig = { /* 默认配置 */ }
const customConfig = { /* 自定义配置 */ }
const mergedConfig = mergeConfig(defaultConfig, customConfig)
import { serializeConfig, deserializeConfig } from 'form-dynamic/utils/configHandler'
// 序列化配置为字符串
const configStr = serializeConfig(formConfig)
// 从字符串反序列化配置
const configObj = deserializeConfig(configStr)
<template>
<form-dynamic-designer
:config="formConfig"
:custom-components="customComponents"
@save="handleSave"
/>
</template>
<script>
import { ref } from 'vue'
import MyCustomComponent from './components/MyCustomComponent.vue'
export default {
setup() {
const formConfig = ref({})
const customComponents = [
{
type: 'my-custom',
name: '自定义组件',
component: MyCustomComponent,
props: {
label: '自定义组件',
placeholder: '请输入'
}
}
]
const handleSave = (config) => {
console.log('保存配置:', config)
}
return {
formConfig,
customComponents,
handleSave
}
}
}
</script>
<template>
<form-dynamic-designer
:config="formConfig"
@change="handleConfigChange"
/>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const formConfig = ref({
title: '数据联动示例',
fields: [
{
type: 'select',
field: 'department',
label: '部门',
options: [
{ label: '技术部', value: 'tech' },
{ label: '市场部', value: 'marketing' }
],
required: true
},
{
type: 'select',
field: 'employee',
label: '员工',
options: [],
required: true,
// 数据联动配置
dependencies: ['department'],
// 根据部门动态获取员工选项
optionsProvider: (values) => {
const { department } = values
// 这里可以调用API获取数据
if (department === 'tech') {
return [
{ label: '张三', value: 'zhangsan' },
{ label: '李四', value: 'lisi' }
]
} else if (department === 'marketing') {
return [
{ label: '王五', value: 'wangwu' },
{ label: '赵六', value: 'zhaoliu' }
]
}
return []
}
}
]
})
const handleConfigChange = (config) => {
console.log('配置已变更:', config)
}
return {
formConfig,
handleConfigChange
}
}
}
</script>
MIT
欢迎贡献代码和问题反馈!请在提交PR前确保通过所有测试。
# 安装依赖
npm install
# 启动开发服务器
npm run dev
# 构建生产版本
npm run build
# 预览生产构建
npm run preview
FAQs
Vue 3动态表单设计器插件
The npm package bz-form-dynamic-test receives a total of 4 weekly downloads. As such, bz-form-dynamic-test popularity was classified as not popular.
We found that bz-form-dynamic-test demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
AI agents are pulling packages into environments no scanner is watching, creating exposure before security teams can see it.

Security News
GitHub Actions checkout now blocks risky pull_request_target checkouts by default to help prevent pwn request supply chain attacks.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.