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
bbc37613
authored
Nov 16, 2023
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
代码生成:增加 tree 树形的示例
parent
3d0c4f44
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
162 additions
and
478 deletions
+162
-478
src/api/infra/demo/demo02/index.ts
+38
-0
src/api/infra/demo02/index.ts
+0
-49
src/views/infra/demo/demo02/Demo02CategoryForm.vue
+44
-42
src/views/infra/demo/demo02/index.vue
+80
-26
src/views/infra/demo02/DemoStudentAddressForm.vue
+0
-126
src/views/infra/demo02/DemoStudentContactForm.vue
+0
-177
src/views/infra/demo02/bak/DemoStudentAddressForm.vue
+0
-58
No files found.
src/api/infra/demo/demo02/index.ts
0 → 100644
View file @
bbc37613
import
request
from
'@/config/axios'
export
interface
Demo02CategoryVO
{
id
:
number
name
:
string
parentId
:
number
}
// 查询示例分类列表
export
const
getDemo02CategoryList
=
async
(
params
)
=>
{
return
await
request
.
get
({
url
:
`/infra/demo02-category/list`
,
params
})
}
// 查询示例分类详情
export
const
getDemo02Category
=
async
(
id
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/infra/demo02-category/get?id=`
+
id
})
}
// 新增示例分类
export
const
createDemo02Category
=
async
(
data
:
Demo02CategoryVO
)
=>
{
return
await
request
.
post
({
url
:
`/infra/demo02-category/create`
,
data
})
}
// 修改示例分类
export
const
updateDemo02Category
=
async
(
data
:
Demo02CategoryVO
)
=>
{
return
await
request
.
put
({
url
:
`/infra/demo02-category/update`
,
data
})
}
// 删除示例分类
export
const
deleteDemo02Category
=
async
(
id
:
number
)
=>
{
return
await
request
.
delete
({
url
:
`/infra/demo02-category/delete?id=`
+
id
})
}
// 导出示例分类 Excel
export
const
exportDemo02Category
=
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/infra/demo02-category/export-excel`
,
params
})
}
\ No newline at end of file
src/api/infra/demo02/index.ts
deleted
100644 → 0
View file @
3d0c4f44
import
request
from
'@/config/axios'
export
interface
DemoStudentVO
{
id
:
number
}
// 查询学生列表
export
const
getDemoStudentPage
=
async
(
params
)
=>
{
return
await
request
.
get
({
url
:
`/infra/demo-student/page`
,
params
})
}
// 查询学生详情
export
const
getDemoStudent
=
async
(
id
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/infra/demo-student/get?id=`
+
id
})
}
// 新增学生
export
const
createDemoStudent
=
async
(
data
:
DemoStudentVO
)
=>
{
return
await
request
.
post
({
url
:
`/infra/demo-student/create`
,
data
})
}
// 修改学生
export
const
updateDemoStudent
=
async
(
data
:
DemoStudentVO
)
=>
{
return
await
request
.
put
({
url
:
`/infra/demo-student/update`
,
data
})
}
// 删除学生
export
const
deleteDemoStudent
=
async
(
id
:
number
)
=>
{
return
await
request
.
delete
({
url
:
`/infra/demo-student/delete?id=`
+
id
})
}
// 导出学生 Excel
export
const
exportDemoStudent
=
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/infra/demo-student/export-excel`
,
params
})
}
// 获得学生联系人列表
export
const
getDemoStudentContactListByStudentId
=
async
(
studentId
)
=>
{
return
await
request
.
get
({
url
:
`/infra/demo-student/demo-student/list-by-student-id?studentId=`
+
studentId
})
}
// 获得学生地址
export
const
getDemoStudentAddressByStudentId
=
async
(
studentId
)
=>
{
return
await
request
.
get
({
url
:
`/infra/demo-student/demo-student/get-by-student-id?studentId=`
+
studentId
})
}
src/views/infra/demo
02/DemoStudent
Form.vue
→
src/views/infra/demo
/demo02/Demo02Category
Form.vue
View file @
bbc37613
...
@@ -6,16 +6,21 @@
...
@@ -6,16 +6,21 @@
:rules=
"formRules"
:rules=
"formRules"
label-width=
"100px"
label-width=
"100px"
v-loading=
"formLoading"
v-loading=
"formLoading"
/>
>
<!-- 子表的表单 -->
<el-form-item
label=
"名字"
prop=
"name"
>
<el-tabs
v-model=
"subTabsName"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入名字"
/>
<el-tab-pane
label=
"学生联系人"
name=
"demoStudentContact"
>
</el-form-item>
<DemoStudentContactForm
ref=
"demoStudentContactFormRef"
:student-id=
"formData.id"
/>
<el-form-item
label=
"父级编号"
prop=
"parentId"
>
</el-tab-pane>
<el-tree-select
<el-tab-pane
label=
"学生地址"
name=
"demoStudentAddress"
>
v-model=
"formData.parentId"
<DemoStudentAddressForm
ref=
"demoStudentAddressFormRef"
:student-id=
"formData.id"
/>
:data=
"demo02CategoryTree"
</el-tab-pane>
:props=
"defaultProps"
</el-tabs>
check-strictly
default-expand-all
placeholder=
"请选择父级编号"
/>
</el-form-item>
</el-form>
<template
#
footer
>
<template
#
footer
>
<el-button
@
click=
"submitForm"
type=
"primary"
:disabled=
"formLoading"
>
确 定
</el-button>
<el-button
@
click=
"submitForm"
type=
"primary"
:disabled=
"formLoading"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
...
@@ -23,9 +28,8 @@
...
@@ -23,9 +28,8 @@
</Dialog>
</Dialog>
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
*
as
DemoStudentApi
from
'@/api/infra/demo02'
import
*
as
Demo02CategoryApi
from
'@/api/infra/demo/demo02'
import
DemoStudentContactForm
from
'./DemoStudentContactForm.vue'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
DemoStudentAddressForm
from
'./DemoStudentAddressForm.vue'
const
{
t
}
=
useI18n
()
// 国际化
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
...
@@ -35,15 +39,16 @@ const dialogTitle = ref('') // 弹窗的标题
...
@@ -35,15 +39,16 @@ const dialogTitle = ref('') // 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
const
formData
=
ref
({
id
:
undefined
id
:
undefined
,
name
:
undefined
,
parentId
:
undefined
})
const
formRules
=
reactive
({
name
:
[{
required
:
true
,
message
:
'名字不能为空'
,
trigger
:
'blur'
}],
parentId
:
[{
required
:
true
,
message
:
'父级编号不能为空'
,
trigger
:
'blur'
}]
})
})
const
formRules
=
reactive
({})
const
formRef
=
ref
()
// 表单 Ref
const
formRef
=
ref
()
// 表单 Ref
const
demo02CategoryTree
=
ref
()
// 树形结构
/** 子表的表单 */
const
subTabsName
=
ref
(
'demoStudentContact'
)
const
demoStudentContactFormRef
=
ref
()
const
demoStudentAddressFormRef
=
ref
()
/** 打开弹窗 */
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
...
@@ -55,11 +60,12 @@ const open = async (type: string, id?: number) => {
...
@@ -55,11 +60,12 @@ const open = async (type: string, id?: number) => {
if
(
id
)
{
if
(
id
)
{
formLoading
.
value
=
true
formLoading
.
value
=
true
try
{
try
{
formData
.
value
=
await
Demo
StudentApi
.
getDemoStudent
(
id
)
formData
.
value
=
await
Demo
02CategoryApi
.
getDemo02Category
(
id
)
}
finally
{
}
finally
{
formLoading
.
value
=
false
formLoading
.
value
=
false
}
}
}
}
await
getDemo02CategoryTree
()
}
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
...
@@ -68,31 +74,15 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
...
@@ -68,31 +74,15 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
const
submitForm
=
async
()
=>
{
const
submitForm
=
async
()
=>
{
// 校验表单
// 校验表单
await
formRef
.
value
.
validate
()
await
formRef
.
value
.
validate
()
// 校验子表单
try
{
await
demoStudentContactFormRef
.
value
.
validate
()
}
catch
(
e
)
{
subTabsName
.
value
=
'demoStudentContact'
return
}
try
{
await
demoStudentAddressFormRef
.
value
.
validate
()
}
catch
(
e
)
{
subTabsName
.
value
=
'demoStudentAddress'
return
}
// 提交请求
// 提交请求
formLoading
.
value
=
true
formLoading
.
value
=
true
try
{
try
{
const
data
=
formData
.
value
as
unknown
as
DemoStudentApi
.
DemoStudentVO
const
data
=
formData
.
value
as
unknown
as
Demo02CategoryApi
.
Demo02CategoryVO
// 拼接子表的数据
data
.
demoStudentContacts
=
demoStudentContactFormRef
.
value
.
getData
()
data
.
demoStudentAddress
=
demoStudentAddressFormRef
.
value
.
getData
()
if
(
formType
.
value
===
'create'
)
{
if
(
formType
.
value
===
'create'
)
{
await
Demo
StudentApi
.
createDemoStudent
(
data
)
await
Demo
02CategoryApi
.
createDemo02Category
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
}
else
{
await
Demo
StudentApi
.
updateDemoStudent
(
data
)
await
Demo
02CategoryApi
.
updateDemo02Category
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
message
.
success
(
t
(
'common.updateSuccess'
))
}
}
dialogVisible
.
value
=
false
dialogVisible
.
value
=
false
...
@@ -106,8 +96,19 @@ const submitForm = async () => {
...
@@ -106,8 +96,19 @@ const submitForm = async () => {
/** 重置表单 */
/** 重置表单 */
const
resetForm
=
()
=>
{
const
resetForm
=
()
=>
{
formData
.
value
=
{
formData
.
value
=
{
id
:
undefined
id
:
undefined
,
name
:
undefined
,
parentId
:
undefined
}
}
formRef
.
value
?.
resetFields
()
formRef
.
value
?.
resetFields
()
}
}
</
script
>
/** 获得示例分类树 */
const
getDemo02CategoryTree
=
async
()
=>
{
demo02CategoryTree
.
value
=
[]
const
data
=
await
Demo02CategoryApi
.
getDemo02CategoryList
()
const
root
:
Tree
=
{
id
:
0
,
name
:
'顶级示例分类'
,
children
:
[]
}
root
.
children
=
handleTree
(
data
,
'id'
,
'parentId'
)
demo02CategoryTree
.
value
.
push
(
root
)
}
</
script
>
\ No newline at end of file
src/views/infra/demo02/index.vue
→
src/views/infra/demo
/demo
02/index.vue
View file @
bbc37613
...
@@ -8,10 +8,35 @@
...
@@ -8,10 +8,35 @@
:inline=
"true"
:inline=
"true"
label-width=
"68px"
label-width=
"68px"
>
>
<el-form-item
label=
"名字"
prop=
"name"
>
<el-input
v-model=
"queryParams.name"
placeholder=
"请输入名字"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"创建时间"
prop=
"createTime"
>
<el-date-picker
v-model=
"queryParams.createTime"
value-format=
"YYYY-MM-DD HH:mm:ss"
type=
"daterange"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
:default-time=
"[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item>
<el-form-item>
<el-button
@
click=
"handleQuery"
><Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"handleQuery"
><Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
><Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
@
click=
"resetQuery"
><Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
type=
"primary"
plain
@
click=
"openForm('create')"
>
<el-button
type=
"primary"
plain
@
click=
"openForm('create')"
v-hasPermi=
"['infra:demo02-category:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
</el-button>
</el-button>
<el-button
<el-button
...
@@ -19,28 +44,52 @@
...
@@ -19,28 +44,52 @@
plain
plain
@
click=
"handleExport"
@
click=
"handleExport"
:loading=
"exportLoading"
:loading=
"exportLoading"
v-hasPermi=
"['infra:demo
-student
:export']"
v-hasPermi=
"['infra:demo
02-category
:export']"
>
>
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
</el-button>
</el-button>
<el-button
type=
"danger"
plain
@
click=
"toggleExpandAll"
>
<Icon
icon=
"ep:sort"
class=
"mr-5px"
/>
展开/折叠
</el-button>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
</ContentWrap>
</ContentWrap>
<!-- 列表 -->
<!-- 列表 -->
<ContentWrap>
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
row-key=
"id"
:default-expand-all=
"isExpandAll"
v-if=
"refreshTable"
>
<el-table-column
label=
"编号"
align=
"center"
prop=
"id"
/>
<el-table-column
label=
"编号"
align=
"center"
prop=
"id"
/>
<el-table-column
label=
"名字"
align=
"center"
prop=
"name"
/>
<el-table-column
label=
"创建时间"
align=
"center"
prop=
"createTime"
:formatter=
"dateFormatter"
width=
"180px"
/>
<el-table-column
label=
"操作"
align=
"center"
>
<el-table-column
label=
"操作"
align=
"center"
>
<template
#
default=
"scope"
>
<template
#
default=
"scope"
>
<el-button
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
>
<el-button
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
v-hasPermi=
"['infra:demo02-category:update']"
>
编辑
编辑
</el-button>
</el-button>
<el-button
<el-button
link
link
type=
"danger"
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
@
click=
"handleDelete(scope.row.id)"
v-hasPermi=
"['infra:demo
-student
:delete']"
v-hasPermi=
"['infra:demo
02-category
:delete']"
>
>
删除
删除
</el-button>
</el-button>
...
@@ -57,25 +106,27 @@
...
@@ -57,25 +106,27 @@
</ContentWrap>
</ContentWrap>
<!-- 表单弹窗:添加/修改 -->
<!-- 表单弹窗:添加/修改 -->
<Demo
Student
Form
ref=
"formRef"
@
success=
"getList"
/>
<Demo
02Category
Form
ref=
"formRef"
@
success=
"getList"
/>
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
handleTree
}
from
'@/utils/tree'
import
download
from
'@/utils/download'
import
download
from
'@/utils/download'
import
*
as
Demo
StudentApi
from
'@/api/infra
/demo02'
import
*
as
Demo
02CategoryApi
from
'@/api/infra/demo
/demo02'
import
Demo
StudentForm
from
'./DemoStudent
Form.vue'
import
Demo
02CategoryForm
from
'./Demo02Category
Form.vue'
defineOptions
({
name
:
'
InfraDemoStudent
'
})
defineOptions
({
name
:
'
Demo02Category
'
})
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
{
t
}
=
useI18n
()
// 国际化
const
loading
=
ref
(
true
)
// 列表的加载中
const
loading
=
ref
(
true
)
// 列表的加载中
const
total
=
ref
(
0
)
// 列表的总页数
const
list
=
ref
([])
// 列表的数据
const
list
=
ref
([])
// 列表的数据
const
queryParams
=
reactive
({
const
queryParams
=
reactive
({
pageNo
:
1
,
name
:
null
,
pageSize
:
10
parentId
:
null
,
createTime
:
[]
})
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
queryFormRef
=
ref
()
// 搜索的表单
const
exportLoading
=
ref
(
false
)
// 导出的加载中
const
exportLoading
=
ref
(
false
)
// 导出的加载中
...
@@ -84,13 +135,8 @@ const exportLoading = ref(false) // 导出的加载中
...
@@ -84,13 +135,8 @@ const exportLoading = ref(false) // 导出的加载中
const
getList
=
async
()
=>
{
const
getList
=
async
()
=>
{
loading
.
value
=
true
loading
.
value
=
true
try
{
try
{
// const data = await DemoStudentApi.getDemoStudentPage(queryParams)
const
data
=
await
Demo02CategoryApi
.
getDemo02CategoryList
(
queryParams
)
list
.
value
=
[
list
.
value
=
handleTree
(
data
,
'id'
,
'parentId'
)
{
id
:
1
}
]
total
.
value
=
10
}
finally
{
}
finally
{
loading
.
value
=
false
loading
.
value
=
false
}
}
...
@@ -110,10 +156,7 @@ const resetQuery = () => {
...
@@ -110,10 +156,7 @@ const resetQuery = () => {
/** 添加/修改操作 */
/** 添加/修改操作 */
const
formRef
=
ref
()
const
formRef
=
ref
()
// const demoStudentContactFormRef = ref()
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
// console.log(demoStudentContactFormRef, 'xx demoStudentContactFormRef xx')
// demoStudentContactFormRef.value.validate()
formRef
.
value
.
open
(
type
,
id
)
formRef
.
value
.
open
(
type
,
id
)
}
}
...
@@ -123,7 +166,7 @@ const handleDelete = async (id: number) => {
...
@@ -123,7 +166,7 @@ const handleDelete = async (id: number) => {
// 删除的二次确认
// 删除的二次确认
await
message
.
delConfirm
()
await
message
.
delConfirm
()
// 发起删除
// 发起删除
await
Demo
StudentApi
.
deleteDemoStudent
(
id
)
await
Demo
02CategoryApi
.
deleteDemo02Category
(
id
)
message
.
success
(
t
(
'common.delSuccess'
))
message
.
success
(
t
(
'common.delSuccess'
))
// 刷新列表
// 刷新列表
await
getList
()
await
getList
()
...
@@ -137,16 +180,26 @@ const handleExport = async () => {
...
@@ -137,16 +180,26 @@ const handleExport = async () => {
await
message
.
exportConfirm
()
await
message
.
exportConfirm
()
// 发起导出
// 发起导出
exportLoading
.
value
=
true
exportLoading
.
value
=
true
const
data
=
await
Demo
StudentApi
.
exportDemoStudent
(
queryParams
)
const
data
=
await
Demo
02CategoryApi
.
exportDemo02Category
(
queryParams
)
download
.
excel
(
data
,
'
学生
.xls'
)
download
.
excel
(
data
,
'
示例分类
.xls'
)
}
catch
{
}
catch
{
}
finally
{
}
finally
{
exportLoading
.
value
=
false
exportLoading
.
value
=
false
}
}
}
}
/** 展开/折叠操作 */
const
isExpandAll
=
ref
(
true
)
// 是否展开,默认全部展开
const
refreshTable
=
ref
(
true
)
// 重新渲染表格状态
const
toggleExpandAll
=
async
()
=>
{
refreshTable
.
value
=
false
isExpandAll
.
value
=
!
isExpandAll
.
value
await
nextTick
()
refreshTable
.
value
=
true
}
/** 初始化 **/
/** 初始化 **/
onMounted
(()
=>
{
onMounted
(()
=>
{
getList
()
getList
()
})
})
</
script
>
</
script
>
\ No newline at end of file
src/views/infra/demo02/DemoStudentAddressForm.vue
deleted
100644 → 0
View file @
3d0c4f44
<
template
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"formRules"
label-width=
"100px"
v-loading=
"formLoading"
>
<el-form-item
label=
"名字"
prop=
"name"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入名字"
/>
</el-form-item>
<el-form-item
label=
"个人简介"
>
<Editor
v-model=
"formData.description"
height=
"150px"
/>
</el-form-item>
<el-form-item
label=
"性别 1"
prop=
"sex1"
>
<el-select
v-model=
"formData.sex1"
placeholder=
"请选择性别 1"
>
<el-option
v-for=
"dict in getStrDictOptions(DICT_TYPE.SYSTEM_SEX1)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"性别 2"
prop=
"sex2"
>
<el-checkbox-group
v-model=
"formData.sex2"
>
<el-checkbox
v-for=
"dict in getIntDictOptions(DICT_TYPE.SYSTEM_SEX2)"
:key=
"dict.value"
:label=
"dict.value"
>
{{
dict
.
label
}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item
label=
"性别 3"
prop=
"sex3"
>
<el-radio-group
v-model=
"formData.sex3"
>
<el-radio
v-for=
"dict in getBoolDictOptions(DICT_TYPE.SYSTEM_SEX3)"
:key=
"dict.value"
:label=
"dict.value"
>
{{
dict
.
label
}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"出生日期"
prop=
"birthday"
>
<el-date-picker
v-model=
"formData.birthday"
type=
"date"
value-format=
"x"
placeholder=
"选择出生日期"
/>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"memo"
>
<el-input
v-model=
"formData.memo"
type=
"textarea"
placeholder=
"请输入备注"
/>
</el-form-item>
</el-form>
</
template
>
<
script
setup
lang=
"ts"
>
import
{
getIntDictOptions
,
getStrDictOptions
,
getBoolDictOptions
,
DICT_TYPE
}
from
'@/utils/dict'
import
*
as
DemoStudentApi
from
'@/api/infra/demo02'
const
props
=
defineProps
<
{
studentId
:
undefined
// 学生编号(主表的关联字段)
}
>
()
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
formData
=
ref
([])
const
formRules
=
reactive
({
studentId
:
[{
required
:
true
,
message
:
'学生编号不能为空'
,
trigger
:
'blur'
}],
name
:
[{
required
:
true
,
message
:
'名字不能为空'
,
trigger
:
'blur'
}],
avatar
:
[{
required
:
true
,
message
:
'头像不能为空'
,
trigger
:
'blur'
}],
video
:
[{
required
:
true
,
message
:
'视频不能为空'
,
trigger
:
'blur'
}],
description
:
[{
required
:
true
,
message
:
'个人简介不能为空'
,
trigger
:
'blur'
}],
sex1
:
[{
required
:
true
,
message
:
'性别 1不能为空'
,
trigger
:
'change'
}],
sex2
:
[{
required
:
true
,
message
:
'性别 2不能为空'
,
trigger
:
'blur'
}],
sex3
:
[{
required
:
true
,
message
:
'性别 3不能为空'
,
trigger
:
'blur'
}],
birthday
:
[{
required
:
true
,
message
:
'出生日期不能为空'
,
trigger
:
'blur'
}],
memo
:
[{
required
:
true
,
message
:
'备注不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
()
// 表单 Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch
(
()
=>
props
.
studentId
,
async
(
val
)
=>
{
// 情况一:val 为空,说明是新增,则置空
if
(
!
val
)
{
formData
.
value
=
{
id
:
undefined
,
studentId
:
undefined
,
name
:
undefined
,
avatar
:
undefined
,
video
:
undefined
,
description
:
undefined
,
sex1
:
undefined
,
sex2
:
[],
sex3
:
undefined
,
birthday
:
undefined
,
memo
:
undefined
}
return
}
// 情况二:val 非空,说明是修改,则加载数据
try
{
formLoading
.
value
=
true
formData
.
value
=
await
DemoStudentApi
.
getDemoStudentAddressByStudentId
(
val
)
}
finally
{
formLoading
.
value
=
false
}
},
{
immediate
:
true
}
)
/** 表单校验 */
const
validate
=
()
=>
{
return
formRef
.
value
.
validate
()
}
/** 表单值 */
const
getData
=
()
=>
{
return
formData
.
value
}
defineExpose
({
validate
,
getData
})
</
script
>
src/views/infra/demo02/DemoStudentContactForm.vue
deleted
100644 → 0
View file @
3d0c4f44
<
template
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"formRules"
v-loading=
"formLoading"
label-width=
"0px"
:inline-message=
"true"
>
<el-table
:data=
"formData"
class=
"-mt-10px"
>
<el-table-column
label=
"序号"
type=
"index"
width=
"100"
/>
<el-table-column
label=
"名字"
width=
"150"
>
<template
#
default=
"
{ row, $index }">
<el-form-item
:prop=
"`$
{$index}.name`" :rules="formRules.name" class="mb-0px!">
<el-input
v-model=
"row.name"
placeholder=
"请输入名字"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"个人简介"
width=
"400"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.description`"
:rules="formRules.description"
class="mb-0px!"
>
<Editor
v-model=
"row.description"
height=
"150px"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"性别 1"
width=
"150"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.sex1`" :rules="formRules.sex1" class="mb-0px!">
<el-select
v-model=
"row.sex1"
placeholder=
"请选择性别 1"
>
<el-option
v-for=
"dict in getStrDictOptions(DICT_TYPE.SYSTEM_SEX1)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"性别 2"
width=
"150"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.sex2`" :rules="formRules.sex2" class="mb-0px!">
<el-checkbox-group
v-model=
"row.sex2"
>
<el-checkbox
v-for=
"dict in getIntDictOptions(DICT_TYPE.SYSTEM_SEX2)"
:key=
"dict.value"
:label=
"dict.value"
>
{{
dict
.
label
}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"性别 3"
width=
"150"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.sex3`" :rules="formRules.sex3" class="mb-0px!">
<el-radio-group
v-model=
"row.sex3"
>
<el-radio
v-for=
"dict in getBoolDictOptions(DICT_TYPE.SYSTEM_SEX3)"
:key=
"dict.value"
:label=
"dict.value"
>
{{
dict
.
label
}}
</el-radio>
</el-radio-group>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"出生日期"
width=
"150"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.birthday`" :rules="formRules.birthday" class="mb-0px!">
<el-date-picker
v-model=
"row.birthday"
type=
"date"
value-format=
"x"
placeholder=
"选择出生日期"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"备注"
width=
"200"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.memo`" :rules="formRules.memo" class="mb-0px!">
<el-input
v-model=
"row.memo"
type=
"textarea"
placeholder=
"请输入备注"
/>
</el-form-item>
</
template
>
</el-table-column>
</el-table>
</el-form>
<el-row
justify=
"center"
class=
"mt-3"
>
<el-button
@
click=
"handleAdd"
round
>
+ 添加联系人
</el-button>
</el-row>
</template>
<
script
setup
lang=
"ts"
>
import
{
getIntDictOptions
,
getStrDictOptions
,
getBoolDictOptions
,
DICT_TYPE
}
from
'@/utils/dict'
import
*
as
DemoStudentApi
from
'@/api/infra/demo02'
const
props
=
defineProps
<
{
studentId
:
undefined
// 学生编号(主表的关联字段)
}
>
()
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
formData
=
ref
([])
const
formRules
=
reactive
({
studentId
:
[{
required
:
true
,
message
:
'学生编号不能为空'
,
trigger
:
'blur'
}],
name
:
[{
required
:
true
,
message
:
'名字不能为空'
,
trigger
:
'blur'
}],
avatar
:
[{
required
:
true
,
message
:
'头像不能为空'
,
trigger
:
'blur'
}],
video
:
[{
required
:
true
,
message
:
'视频不能为空'
,
trigger
:
'blur'
}],
description
:
[{
required
:
true
,
message
:
'个人简介不能为空'
,
trigger
:
'blur'
}],
sex1
:
[{
required
:
true
,
message
:
'性别 1不能为空'
,
trigger
:
'change'
}],
sex2
:
[{
required
:
true
,
message
:
'性别 2不能为空'
,
trigger
:
'blur'
}],
sex3
:
[{
required
:
true
,
message
:
'性别 3不能为空'
,
trigger
:
'blur'
}],
birthday
:
[{
required
:
true
,
message
:
'出生日期不能为空'
,
trigger
:
'blur'
}],
memo
:
[{
required
:
true
,
message
:
'备注不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
()
// 表单 Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch
(
()
=>
props
.
studentId
,
async
(
val
)
=>
{
// 情况一:val 为空,说明是新增,则置空
if
(
!
val
)
{
formData
.
value
=
[]
return
}
// 情况二:val 非空,说明是修改,则加载数据
try
{
formLoading
.
value
=
true
formData
.
value
=
await
DemoStudentApi
.
getDemoStudentContactListByStudentId
(
val
)
}
finally
{
formLoading
.
value
=
false
}
},
{
immediate
:
true
}
)
/** 新增按钮操作 */
const
handleAdd
=
()
=>
{
const
row
=
{
id
:
undefined
,
studentId
:
undefined
,
name
:
undefined
,
avatar
:
undefined
,
video
:
undefined
,
description
:
undefined
,
sex1
:
undefined
,
sex2
:
[],
sex3
:
undefined
,
birthday
:
undefined
,
memo
:
undefined
}
row
.
studentId
=
props
.
studentId
formData
.
value
.
push
(
row
)
}
/** 删除按钮操作 */
const
handleDelete
=
(
index
)
=>
{
formData
.
value
.
splice
(
index
,
1
)
}
/** 表单校验 */
const
validate
=
()
=>
{
return
formRef
.
value
.
validate
()
}
/** 表单值 */
const
getData
=
()
=>
{
return
formData
.
value
}
defineExpose
({
validate
,
getData
})
</
script
>
src/views/infra/demo02/bak/DemoStudentAddressForm.vue
deleted
100644 → 0
View file @
3d0c4f44
<
template
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"formRules"
label-width=
"100px"
v-loading=
"formLoading"
>
<el-form-item
label=
"子字段 1"
prop=
"field1"
>
<el-input
v-model=
"formData.field1"
placeholder=
"请输入字段 1"
/>
</el-form-item>
<el-form-item
label=
"子字段 2"
prop=
"field2"
>
<el-input
v-model=
"formData.field2"
placeholder=
"请输入字段 2"
/>
</el-form-item>
<el-form-item
label=
"子字段 3"
prop=
"field3"
>
<el-input
v-model=
"formData.field3"
placeholder=
"请输入字段 3"
/>
</el-form-item>
</el-form>
</
template
>
<
script
setup
lang=
"ts"
>
const
props
=
defineProps
<
{
studentId
:
undefined
// 学生编号
}
>
()
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
formData
=
ref
({})
const
formRules
=
reactive
({
field1
:
[
required
]
})
const
formRef
=
ref
()
// 表单 Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch
(
()
=>
props
.
studentId
,
(
val
)
=>
{
if
(
val
)
{
formData
.
value
=
{
field2
:
'番茄'
,
field3
:
'西瓜'
}
}
else
{
formData
.
value
=
{}
}
},
{
immediate
:
true
}
)
/** 表单校验 */
const
validate
=
()
=>
{
return
formRef
.
value
.
validate
()
}
/** 表单值 **/
const
getData
=
()
=>
{
return
formData
.
value
}
defineExpose
({
validate
,
getData
})
</
script
>
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