Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
1f1ac1f2
authored
Apr 30, 2024
by
puhui999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
使用 tsx 封装 form-create 通用选择组件
parent
21483448
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
217 additions
and
65 deletions
+217
-65
src/components/FormCreate/index.ts
+2
-2
src/components/FormCreate/src/CurrencySelect/index.vue
+0
-53
src/components/FormCreate/src/components/useCurrencySelect.tsx
+59
-0
src/components/FormCreate/src/config/index.ts
+5
-1
src/components/FormCreate/src/config/useCurrencySelectRule.ts
+2
-1
src/components/FormCreate/src/config/useDeptSelectRule.ts
+26
-0
src/components/FormCreate/src/config/useUserSelectRule.ts
+26
-0
src/components/FormCreate/src/type/index.ts
+41
-0
src/components/FormCreate/src/useFormCreateDesigner.ts
+38
-2
src/plugins/formCreate/index.ts
+16
-2
src/views/infra/build/index.vue
+2
-4
No files found.
src/components/FormCreate/index.ts
View file @
1f1ac1f2
import
{
useFormCreateDesigner
}
from
'./src/useFormCreateDesigner'
import
{
useFormCreateDesigner
}
from
'./src/useFormCreateDesigner'
import
CurrencySelect
from
'./src/CurrencySelect/index.vue
'
import
{
useCurrencySelect
}
from
'./src/components/useCurrencySelect
'
export
{
useFormCreateDesigner
,
CurrencySelect
}
export
{
useFormCreateDesigner
,
use
CurrencySelect
}
src/components/FormCreate/src/CurrencySelect/index.vue
deleted
100644 → 0
View file @
21483448
<
template
>
<el-select
class=
"w-1/1"
v-bind=
"attrs"
>
<el-option
v-for=
"(item, index) in options"
:key=
"index"
:label=
"item.label"
:value=
"item.value"
/>
</el-select>
</
template
>
<
script
lang=
"ts"
setup
>
import
request
from
'@/config/axios'
import
{
isEmpty
}
from
'@/utils/is'
defineOptions
({
name
:
'CurrencySelect'
})
// 接受父组件参数
interface
Props
{
labelField
?:
string
// 字典类型
valueField
?:
string
// 字典值类型
restful
?:
string
// api 接口
}
const
props
=
withDefaults
(
defineProps
<
Props
>
(),
{
labelField
:
'nickname'
,
valueField
:
'id'
,
restful
:
'/system/user/simple-list'
})
const
attrs
=
useAttrs
()
const
options
=
ref
<
any
[]
>
([])
// 下拉数据
const
getOptions
=
async
()
=>
{
options
.
value
=
[]
if
(
isEmpty
(
props
.
restful
))
{
return
}
// TODO 只支持 GET 查询,复杂下拉构建条件请使用业务表单
const
data
=
await
request
.
get
({
url
:
props
.
restful
})
if
(
Array
.
isArray
(
data
))
{
options
.
value
=
data
.
map
((
item
:
any
)
=>
({
label
:
item
[
props
.
labelField
],
value
:
item
[
props
.
valueField
]
}))
return
}
console
.
log
(
`接口[
${
props
.
restful
}
] 返回结果不是一个数组`
)
}
onMounted
(()
=>
{
getOptions
()
})
</
script
>
src/components/FormCreate/src/components/useCurrencySelect.tsx
0 → 100644
View file @
1f1ac1f2
import
request
from
'@/config/axios'
import
{
isEmpty
}
from
'@/utils/is'
import
{
CurrencySelectProps
}
from
'@/components/FormCreate/src/type'
export
const
useCurrencySelect
=
(
option
:
CurrencySelectProps
)
=>
{
return
defineComponent
({
name
:
option
.
name
,
props
:
{
// 字典类型
labelField
:
{
type
:
String
,
default
:
()
=>
option
.
labelField
??
''
},
// 字典值类型
valueField
:
{
type
:
String
,
default
:
()
=>
option
.
valueField
??
''
},
// api 接口
restful
:
{
type
:
String
,
default
:
()
=>
option
.
restful
??
''
}
},
setup
(
props
)
{
const
attrs
=
useAttrs
()
const
options
=
ref
<
any
[]
>
([])
// 下拉数据
const
getOptions
=
async
()
=>
{
options
.
value
=
[]
if
(
isEmpty
(
props
.
restful
))
{
return
}
// TODO 只支持 GET 查询,复杂下拉构建条件请使用业务表单
const
data
=
await
request
.
get
({
url
:
props
.
restful
})
if
(
Array
.
isArray
(
data
))
{
options
.
value
=
data
.
map
((
item
:
any
)
=>
({
label
:
item
[
props
.
labelField
],
value
:
item
[
props
.
valueField
]
}))
return
}
console
.
log
(
`接口[
${
props
.
restful
}
] 返回结果不是一个数组`
)
}
onMounted
(
async
()
=>
{
await
getOptions
()
})
return
()
=>
(
<>
<
el
-
select
className=
"w-1/1"
{
...
attrs
}
>
{
options
.
value
.
map
((
item
,
index
)
=>
(
<
el
-
option
key=
{
index
}
label=
{
item
.
label
}
value=
{
item
.
value
}
/>
))
}
</
el
-
select
>
</>
)
}
})
}
src/components/FormCreate/src/config/index.ts
View file @
1f1ac1f2
...
@@ -4,6 +4,8 @@ import { useUploadImgsRule } from './useUploadImgsRule'
...
@@ -4,6 +4,8 @@ import { useUploadImgsRule } from './useUploadImgsRule'
import
{
useDictSelectRule
}
from
'./useDictSelectRule'
import
{
useDictSelectRule
}
from
'./useDictSelectRule'
import
{
useCurrencySelectRule
}
from
'./useCurrencySelectRule'
import
{
useCurrencySelectRule
}
from
'./useCurrencySelectRule'
import
{
useEditorRule
}
from
'./useEditorRule'
import
{
useEditorRule
}
from
'./useEditorRule'
import
{
useUserSelectRule
}
from
'./useUserSelectRule'
import
{
useDeptSelectRule
}
from
'./useDeptSelectRule'
export
{
export
{
useUploadFileRule
,
useUploadFileRule
,
...
@@ -11,5 +13,7 @@ export {
...
@@ -11,5 +13,7 @@ export {
useUploadImgsRule
,
useUploadImgsRule
,
useDictSelectRule
,
useDictSelectRule
,
useCurrencySelectRule
,
useCurrencySelectRule
,
useEditorRule
useEditorRule
,
useUserSelectRule
,
useDeptSelectRule
}
}
src/components/FormCreate/src/config/useCurrencySelectRule.ts
View file @
1f1ac1f2
import
{
generateUUID
}
from
'@/utils'
import
{
generateUUID
}
from
'@/utils'
import
{
localeProps
,
makeRequiredRule
}
from
'@/components/FormCreate/src/utils'
import
{
localeProps
,
makeRequiredRule
}
from
'@/components/FormCreate/src/utils'
import
selectRule
from
'@/components/FormCreate/src/config/selectRule'
import
selectRule
from
'@/components/FormCreate/src/config/selectRule'
import
{
DragRule
}
from
'@/components/FormCreate/src/type'
export
const
useCurrencySelectRule
=
()
=>
{
export
const
useCurrencySelectRule
=
()
:
DragRule
=>
{
const
label
=
'通用选择器'
const
label
=
'通用选择器'
const
name
=
'CurrencySelect'
const
name
=
'CurrencySelect'
return
{
return
{
...
...
src/components/FormCreate/src/config/useDeptSelectRule.ts
0 → 100644
View file @
1f1ac1f2
import
{
generateUUID
}
from
'@/utils'
import
{
localeProps
,
makeRequiredRule
}
from
'@/components/FormCreate/src/utils'
import
selectRule
from
'@/components/FormCreate/src/config/selectRule'
import
{
DragRule
}
from
'@/components/FormCreate/src/type'
export
const
useDeptSelectRule
=
():
DragRule
=>
{
const
label
=
'部门选择器'
const
name
=
'DeptSelect'
return
{
icon
:
'icon-select'
,
label
,
name
,
rule
()
{
return
{
type
:
name
,
field
:
generateUUID
(),
title
:
label
,
info
:
''
,
$required
:
false
}
},
props
(
_
,
{
t
})
{
return
localeProps
(
t
,
name
+
'.props'
,
[
makeRequiredRule
(),
...
selectRule
])
}
}
}
src/components/FormCreate/src/config/useUserSelectRule.ts
0 → 100644
View file @
1f1ac1f2
import
{
generateUUID
}
from
'@/utils'
import
{
localeProps
,
makeRequiredRule
}
from
'@/components/FormCreate/src/utils'
import
selectRule
from
'@/components/FormCreate/src/config/selectRule'
import
{
DragRule
}
from
'@/components/FormCreate/src/type'
export
const
useUserSelectRule
=
():
DragRule
=>
{
const
label
=
'用户选择器'
const
name
=
'UserSelect'
return
{
icon
:
'icon-select'
,
label
,
name
,
rule
()
{
return
{
type
:
name
,
field
:
generateUUID
(),
title
:
label
,
info
:
''
,
$required
:
false
}
},
props
(
_
,
{
t
})
{
return
localeProps
(
t
,
name
+
'.props'
,
[
makeRequiredRule
(),
...
selectRule
])
}
}
}
src/components/FormCreate/src/type/index.ts
0 → 100644
View file @
1f1ac1f2
import
{
Rule
}
from
'@form-create/element-ui'
//左侧拖拽按钮
//左侧拖拽按钮
export
interface
MenuItem
{
label
:
string
name
:
string
icon
:
string
}
//左侧拖拽按钮分类
export
interface
Menu
{
title
:
string
name
:
string
list
:
MenuItem
[]
}
export
interface
MenuList
extends
Array
<
Menu
>
{}
//拖拽组件的规则
export
interface
DragRule
{
icon
:
string
name
:
string
label
:
string
children
?:
string
inside
?:
true
drag
?:
true
|
String
dragBtn
?:
false
mask
?:
false
rule
():
Rule
props
(
v
:
any
,
v1
:
any
):
Rule
[]
}
// 通用下拉组件 Props 类型
export
interface
CurrencySelectProps
{
name
:
string
// 组件名称
labelField
?:
string
// 字典类型
valueField
?:
string
// 字典值类型
restful
?:
string
// api 接口
}
src/components/FormCreate/src/useFormCreateDesigner.ts
View file @
1f1ac1f2
import
{
import
{
useCurrencySelectRule
,
useCurrencySelectRule
,
useDeptSelectRule
,
useDictSelectRule
,
useDictSelectRule
,
useEditorRule
,
useEditorRule
,
useUploadFileRule
,
useUploadFileRule
,
useUploadImgRule
,
useUploadImgRule
,
useUploadImgsRule
useUploadImgsRule
,
useUserSelectRule
}
from
'./config'
}
from
'./config'
import
{
Ref
}
from
'vue'
import
{
Ref
}
from
'vue'
import
{
Menu
}
from
'@/components/FormCreate/src/type'
/**
/**
* 表单设计器增强 hook
* 表单设计器增强 hook
...
@@ -26,7 +29,10 @@ export const useFormCreateDesigner = (designer: Ref) => {
...
@@ -26,7 +29,10 @@ export const useFormCreateDesigner = (designer: Ref) => {
const
dictSelectRule
=
useDictSelectRule
()
const
dictSelectRule
=
useDictSelectRule
()
const
currencySelectRule
=
useCurrencySelectRule
()
const
currencySelectRule
=
useCurrencySelectRule
()
onMounted
(()
=>
{
/**
* 构建表单组件
*/
const
buildFormComponents
=
()
=>
{
// 移除自带的上传组件规则,使用 uploadFileRule、uploadImgRule、uploadImgsRule 替代
// 移除自带的上传组件规则,使用 uploadFileRule、uploadImgRule、uploadImgsRule 替代
designer
.
value
?.
removeMenuItem
(
'upload'
)
designer
.
value
?.
removeMenuItem
(
'upload'
)
// 移除自带的富文本组件规则,使用 editorRule 替代
// 移除自带的富文本组件规则,使用 editorRule 替代
...
@@ -51,5 +57,35 @@ export const useFormCreateDesigner = (designer: Ref) => {
...
@@ -51,5 +57,35 @@ export const useFormCreateDesigner = (designer: Ref) => {
label
:
component
.
label
label
:
component
.
label
})
})
})
})
}
const
userSelectRule
=
useUserSelectRule
()
const
deptSelectRule
=
useDeptSelectRule
()
/**
* 构建系统字段菜单
*/
const
buildSystemMenu
=
()
=>
{
const
components
=
[
userSelectRule
,
deptSelectRule
]
const
menu
:
Menu
=
{
name
:
'system'
,
title
:
'系统字段'
,
list
:
components
.
map
((
component
)
=>
{
// 插入组件规则
designer
.
value
?.
addComponent
(
component
)
// 插入拖拽按钮到 `system` 分类下
return
{
icon
:
component
.
icon
,
name
:
component
.
name
,
label
:
component
.
label
}
})
}
designer
.
value
?.
addMenu
(
menu
)
}
onMounted
(
async
()
=>
{
await
nextTick
()
buildFormComponents
()
buildSystemMenu
()
})
})
}
}
src/plugins/formCreate/index.ts
View file @
1f1ac1f2
...
@@ -20,9 +20,22 @@ import install from '@form-create/element-ui/auto-import'
...
@@ -20,9 +20,22 @@ import install from '@form-create/element-ui/auto-import'
//======================= 自定义组件 =======================
//======================= 自定义组件 =======================
import
{
UploadFile
,
UploadImg
,
UploadImgs
}
from
'@/components/UploadFile'
import
{
UploadFile
,
UploadImg
,
UploadImgs
}
from
'@/components/UploadFile'
import
{
DictSelect
}
from
'@/components/DictSelect'
import
{
DictSelect
}
from
'@/components/DictSelect'
import
{
CurrencySelect
}
from
'@/components/FormCreate'
import
{
use
CurrencySelect
}
from
'@/components/FormCreate'
import
{
Editor
}
from
'@/components/Editor'
import
{
Editor
}
from
'@/components/Editor'
const
UserSelect
=
useCurrencySelect
({
name
:
'UserSelect'
,
labelField
:
'nickname'
,
valueField
:
'id'
,
restful
:
'/system/user/simple-list'
})
const
DeptSelect
=
useCurrencySelect
({
name
:
'DeptSelect'
,
labelField
:
'name'
,
valueField
:
'id'
,
restful
:
'/system/dept/simple-list'
})
const
components
=
[
const
components
=
[
ElAside
,
ElAside
,
ElPopconfirm
,
ElPopconfirm
,
...
@@ -40,7 +53,8 @@ const components = [
...
@@ -40,7 +53,8 @@ const components = [
UploadImgs
,
UploadImgs
,
UploadFile
,
UploadFile
,
DictSelect
,
DictSelect
,
CurrencySelect
,
UserSelect
,
DeptSelect
,
Editor
Editor
]
]
...
...
src/views/infra/build/index.vue
View file @
1f1ac1f2
...
@@ -8,11 +8,9 @@
...
@@ -8,11 +8,9 @@
<el-button
size=
"small"
type=
"danger"
@
click=
"showTemplate"
>
生成组件
</el-button>
<el-button
size=
"small"
type=
"danger"
@
click=
"showTemplate"
>
生成组件
</el-button>
</div>
</div>
</el-col>
</el-col>
<!-- 表单设计器 -->
<el-col>
<FcDesigner
ref=
"designer"
height=
"780px"
/>
</el-col>
</el-row>
</el-row>
<!-- 表单设计器 -->
<FcDesigner
ref=
"designer"
height=
"780px"
/>
</ContentWrap>
</ContentWrap>
<!-- 弹窗:表单预览 -->
<!-- 弹窗:表单预览 -->
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment