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
90cd8297
authored
Mar 18, 2023
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Vue3 重构:邮件模版的列表
parent
e42a9aa6
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
154 additions
and
338 deletions
+154
-338
src/views/infra/dataSourceConfig/form.vue
+1
-2
src/views/system/mail/account/account.data.ts
+1
-3
src/views/system/mail/template/index.vue
+65
-254
src/views/system/mail/template/template.data.ts
+87
-79
No files found.
src/views/infra/dataSourceConfig/form.vue
View file @
90cd8297
...
...
@@ -30,7 +30,6 @@
</template>
<
script
setup
lang=
"ts"
>
import
*
as
DataSourceConfigApi
from
'@/api/infra/dataSourceConfig'
import
{
DataSourceConfigVO
}
from
'@/api/infra/dataSourceConfig'
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
...
...
@@ -39,7 +38,7 @@ const modelVisible = ref(false) // 弹窗的是否展示
const
modelTitle
=
ref
(
''
)
// 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
<
DataSourceConfigVO
>
({
const
formData
=
ref
<
DataSourceConfig
Api
.
DataSourceConfig
VO
>
({
id
:
undefined
,
name
:
''
,
url
:
''
,
...
...
src/views/system/mail/account/account.data.ts
View file @
90cd8297
...
...
@@ -77,9 +77,7 @@ const crudSchemas = reactive<CrudSchema[]>([
{
label
:
'操作'
,
field
:
'action'
,
form
:
{
show
:
false
}
isForm
:
false
}
])
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
src/views/system/mail/template/index.vue
View file @
90cd8297
<
template
>
<ContentWrap>
<!-- 列表 -->
<XTable
@
register=
"registerTable"
>
<template
#
accountId_search
>
<el-select
v-model=
"queryParams.accountId"
>
<el-option
:key=
"undefined"
label=
"全部"
:value=
"undefined"
/>
<el-option
v-for=
"item in accountOptions"
:key=
"item.id"
:label=
"item.mail"
:value=
"item.id"
/>
</el-select>
</
template
>
<
template
#
toolbar_buttons
>
<!-- 操作:新增 -->
<XButton
<!-- 搜索工作栏 -->
<content-wrap>
<Search
:schema=
"allSchemas.searchSchema"
@
search=
"setSearchParams"
@
reset=
"setSearchParams"
>
<!-- 新增等操作按钮 -->
<template
#
actionMore
>
<el-button
type=
"primary"
preIcon=
"ep:zoom-in"
:title=
"t('action.add')"
v-hasPermi=
"['system:mail-template:create']"
@
click=
"handleCreate()"
/>
</
template
>
<
template
#
accountId_default=
"{ row }"
>
<span>
{{
accountOptions
.
find
((
account
)
=>
account
.
id
===
row
.
accountId
)?.
mail
}}
</span>
@
click=
"openModal('create')"
v-hasPermi=
"['system:mail-account:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
</el-button>
</
template
>
<
template
#
actionbtns_default=
"{ row }"
>
<!-- 操作:测试短信 -->
<XTextButton
preIcon=
"ep:cpu"
:title=
"t('action.test')"
v-hasPermi=
"['system:mail-template:send-mail']"
@
click=
"handleSendMail(row)"
/>
<!-- 操作:修改 -->
<XTextButton
preIcon=
"ep:edit"
:title=
"t('action.edit')"
v-hasPermi=
"['system:mail-template:update']"
@
click=
"handleUpdate(row.id)"
/>
<!-- 操作:详情 -->
<XTextButton
preIcon=
"ep:view"
:title=
"t('action.detail')"
v-hasPermi=
"['system:mail-template:query']"
@
click=
"handleDetail(row.id)"
/>
<!-- 操作:删除 -->
<XTextButton
preIcon=
"ep:delete"
:title=
"t('action.del')"
v-hasPermi=
"['system:mail-template:delete']"
@
click=
"deleteData(row.id)"
/>
</
template
>
</XTable>
</ContentWrap>
</Search>
</content-wrap>
<!-- 添加/修改/详情的弹窗 -->
<XModal
id=
"mailTemplateModel"
:loading=
"modelLoading"
v-model=
"modelVisible"
:title=
"modelTitle"
>
<!-- 表单:添加/修改 -->
<Form
ref=
"formRef"
v-if=
"['create', 'update'].includes(actionType)"
:schema=
"allSchemas.formSchema"
:rules=
"rules"
<!-- 列表 -->
<content-wrap>
<Table
:columns=
"allSchemas.tableColumns"
:data=
"tableObject.tableList"
:loading=
"tableObject.loading"
:pagination=
"{
total: tableObject.total
}"
v-model:pageSize=
"tableObject.pageSize"
v-model:currentPage=
"tableObject.currentPage"
>
<
template
#
accountId=
"form"
>
<el-select
v-model=
"form.accountId"
>
<el-option
v-for=
"item in accountOptions"
:key=
"item.id"
:label=
"item.mail"
:value=
"item.id"
/>
</el-select>
<
template
#
action=
"{ row }"
>
<el-button
link
type=
"primary"
@
click=
"openModal('update', row.id)"
v-hasPermi=
"['system:mail-template:update']"
>
编辑
</el-button>
<el-button
link
type=
"danger"
v-hasPermi=
"['system:mail-template:delete']"
@
click=
"handleDelete(row.id)"
>
删除
</el-button>
</
template
>
</Form>
<!-- 表单:详情 -->
<Descriptions
v-if=
"actionType === 'detail'"
:schema=
"allSchemas.detailSchema"
:data=
"detailData"
/>
<
template
#
footer
>
<!-- 按钮:保存 -->
<XButton
v-if=
"['create', 'update'].includes(actionType)"
type=
"primary"
:title=
"t('action.save')"
:loading=
"actionLoading"
@
click=
"submitForm()"
/>
<!-- 按钮:关闭 -->
<XButton
:loading=
"actionLoading"
:title=
"t('dialog.close')"
@
click=
"modelVisible = false"
/>
</
template
>
</XModal>
</Table>
</content-wrap>
<!-- 测试邮件的弹窗 -->
<XModal
id=
"sendTest"
v-model=
"sendVisible"
title=
"测试"
>
<el-form
:model=
"sendForm"
:rules=
"sendRules"
label-width=
"200px"
label-position=
"top"
>
<el-form-item
label=
"模板内容"
prop=
"content"
>
<Editor
:model-value=
"sendForm.content"
readonly
height=
"150px"
/>
</el-form-item>
<el-form-item
label=
"收件邮箱"
prop=
"mail"
>
<el-input
v-model=
"sendForm.mail"
placeholder=
"请输入收件邮箱"
/>
</el-form-item>
<el-form-item
v-for=
"param in sendForm.params"
:key=
"param"
:label=
"'参数 {' + param + '}'"
:prop=
"'templateParams.' + param"
>
<el-input
v-model=
"sendForm.templateParams[param]"
:placeholder=
"'请输入 ' + param + ' 参数'"
/>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<
template
#
footer
>
<XButton
type=
"primary"
:title=
"t('action.test')"
:loading=
"actionLoading"
@
click=
"sendTest()"
/>
<XButton
:title=
"t('dialog.close')"
@
click=
"sendVisible = false"
/>
</
template
>
</XModal>
<!-- 表单弹窗:添加/修改 -->
<!-- <mail-template-form ref="modalRef" @success="getList" />-->
</template>
<
script
setup
lang=
"ts"
name=
"MailTemplate"
>
import
{
FormExpose
}
from
'@/components/Form'
// 业务相关的 import
import
{
rules
,
allSchemas
}
from
'./template.data'
import
{
allSchemas
}
from
'./template.data'
import
*
as
MailTemplateApi
from
'@/api/system/mail/template'
import
*
as
MailAccountApi
from
'@/api/system/mail/account'
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
// import MailAccountForm from './form.vue'
// 列表相关的变量
const
queryParams
=
reactive
({
accountId
:
null
})
const
[
registerTable
,
{
reload
,
deleteData
}]
=
useXTable
({
allSchemas
:
allSchemas
,
params
:
queryParams
,
getListApi
:
MailTemplateApi
.
getMailTemplatePageApi
,
deleteApi
:
MailTemplateApi
.
deleteMailTemplateApi
// tableObject:表格的属性对象,可获得分页大小、条数等属性
// tableMethods:表格的操作对象,可进行获得分页、删除记录等操作
// 详细可见:https://kailong110120130.gitee.io/vue-element-plus-admin-doc/components/table.html#usetable
const
{
tableObject
,
tableMethods
}
=
useTable
({
getListApi
:
MailTemplateApi
.
getMailTemplatePageApi
,
// 分页接口
delListApi
:
MailTemplateApi
.
deleteMailTemplateApi
// 删除接口
})
const
accountOptions
=
ref
<
any
[]
>
([])
// 账号下拉选项
// 弹窗相关的变量
const
modelVisible
=
ref
(
false
)
// 是否显示弹出层
const
modelTitle
=
ref
(
'edit'
)
// 弹出层标题
const
modelLoading
=
ref
(
false
)
// 弹出层loading
const
actionType
=
ref
(
''
)
// 操作按钮的类型
const
actionLoading
=
ref
(
false
)
// 按钮 Loading
const
formRef
=
ref
<
FormExpose
>
()
// 表单 Ref
const
detailData
=
ref
()
// 详情 Ref
// 设置标题
const
setDialogTile
=
(
type
:
string
)
=>
{
modelLoading
.
value
=
true
modelTitle
.
value
=
t
(
'action.'
+
type
)
actionType
.
value
=
type
modelVisible
.
value
=
true
}
// 获得表格的各种操作
const
{
getList
,
setSearchParams
}
=
tableMethods
// 新增操作
const
handleCreate
=
()
=>
{
setDialogTile
(
'create'
)
modelLoading
.
value
=
false
}
// 修改操作
const
handleUpdate
=
async
(
rowId
:
number
)
=>
{
setDialogTile
(
'update'
)
// 设置数据
const
res
=
await
MailTemplateApi
.
getMailTemplateApi
(
rowId
)
unref
(
formRef
)?.
setValues
(
res
)
modelLoading
.
value
=
false
}
// 详情操作
const
handleDetail
=
async
(
rowId
:
number
)
=>
{
setDialogTile
(
'detail'
)
const
res
=
await
MailTemplateApi
.
getMailTemplateApi
(
rowId
)
detailData
.
value
=
res
modelLoading
.
value
=
false
}
// 提交按钮
const
submitForm
=
async
()
=>
{
const
elForm
=
unref
(
formRef
)?.
getElFormRef
()
if
(
!
elForm
)
return
elForm
.
validate
(
async
(
valid
)
=>
{
if
(
valid
)
{
actionLoading
.
value
=
true
// 提交请求
try
{
const
data
=
unref
(
formRef
)?.
formModel
as
MailTemplateApi
.
MailTemplateVO
if
(
actionType
.
value
===
'create'
)
{
await
MailTemplateApi
.
createMailTemplateApi
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
await
MailTemplateApi
.
updateMailTemplateApi
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
}
modelVisible
.
value
=
false
}
finally
{
actionLoading
.
value
=
false
// 刷新列表
await
reload
()
}
}
})
}
// ========== 测试相关 ==========
const
sendForm
=
ref
({
content
:
''
,
params
:
{},
mail
:
''
,
templateCode
:
''
,
templateParams
:
{}
})
const
sendRules
=
ref
({
mail
:
[{
required
:
true
,
message
:
'邮箱不能为空'
,
trigger
:
'blur'
}],
templateCode
:
[{
required
:
true
,
message
:
'模版编号不能为空'
,
trigger
:
'blur'
}],
templateParams
:
{}
})
const
sendVisible
=
ref
(
false
)
const
handleSendMail
=
(
row
:
any
)
=>
{
sendForm
.
value
.
content
=
row
.
content
sendForm
.
value
.
params
=
row
.
params
sendForm
.
value
.
templateCode
=
row
.
code
sendForm
.
value
.
templateParams
=
row
.
params
.
reduce
(
function
(
obj
,
item
)
{
obj
[
item
]
=
undefined
return
obj
},
{})
sendRules
.
value
.
templateParams
=
row
.
params
.
reduce
(
function
(
obj
,
item
)
{
obj
[
item
]
=
{
required
:
true
,
message
:
'参数 '
+
item
+
' 不能为空'
,
trigger
:
'change'
}
return
obj
},
{})
sendVisible
.
value
=
true
}
/** 添加/修改操作 */
// const modalRef = ref()
// const openModal = (type: string, id?: number) => {
// modalRef.value.openModal(type, id)
// }
const
sendTest
=
async
()
=>
{
const
data
:
MailTemplateApi
.
MailSendReqVO
=
{
mail
:
sendForm
.
value
.
mail
,
templateCode
:
sendForm
.
value
.
templateCode
,
templateParams
:
sendForm
.
value
.
templateParams
as
unknown
as
Map
<
string
,
Object
>
}
const
res
=
await
MailTemplateApi
.
sendMailApi
(
data
)
if
(
res
)
{
message
.
success
(
'提交发送成功!发送结果,见发送日志编号:'
+
res
)
}
sendVisible
.
value
=
false
/** 删除按钮操作 */
const
handleDelete
=
(
id
:
number
)
=>
{
tableMethods
.
delList
(
id
,
false
)
}
/
/ ========== 初始化 ==========
/
** 初始化 **/
onMounted
(()
=>
{
MailAccountApi
.
getSimpleMailAccountList
().
then
((
data
)
=>
{
accountOptions
.
value
=
data
})
getList
()
})
</
script
>
src/views/system/mail/template/template.data.ts
View file @
90cd8297
import
type
{
VxeCrudSchema
}
from
'@/hooks/web/useVxeCrudSchemas'
import
type
{
CrudSchema
}
from
'@/hooks/web/useCrudSchemas'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
TableColumn
}
from
'@/types/table'
import
{
DictTag
}
from
'@/components/DictTag'
import
*
as
MailAccountApi
from
'@/api/system/mail/account'
const
accounts
=
await
MailAccountApi
.
getSimpleMailAccountList
()
// 表单校验
export
const
rules
=
reactive
({
name
:
[
required
],
code
:
[
required
],
accountId
:
[
required
],
title
:
[
required
],
label
:
[
required
],
content
:
[
required
],
params
:
[
required
],
status
:
[
required
]
})
// CrudSchema
const
crudSchemas
=
reactive
<
VxeCrudSchema
>
({
primaryKey
:
'id'
,
// 默认的主键ID
primaryTitle
:
'编号'
,
// 默认显示的值
primaryType
:
null
,
action
:
true
,
actionWidth
:
'260'
,
columns
:
[
{
title
:
'模板编码'
,
field
:
'code'
,
isSearch
:
true
},
{
title
:
'模板名称'
,
field
:
'name'
,
isSearch
:
true
},
{
title
:
'模板标题'
,
field
:
'title'
},
{
title
:
'模板内容'
,
field
:
'content'
,
form
:
{
component
:
'Editor'
,
colProps
:
{
span
:
24
},
componentProps
:
{
valueHtml
:
''
}
// CrudSchema:https://kailong110120130.gitee.io/vue-element-plus-admin-doc/hooks/useCrudSchemas.html
const
crudSchemas
=
reactive
<
CrudSchema
[]
>
([
{
label
:
'模板编码'
,
field
:
'code'
,
isSearch
:
true
},
{
label
:
'模板名称'
,
field
:
'name'
,
isSearch
:
true
},
{
label
:
'模板标题'
,
field
:
'title'
},
{
label
:
'模板内容'
,
field
:
'content'
,
form
:
{
component
:
'Editor'
,
colProps
:
{
span
:
24
},
componentProps
:
{
valueHtml
:
''
}
}
},
{
label
:
'邮箱账号'
,
field
:
'accountId'
,
isSearch
:
true
,
width
:
'200px'
,
formatter
:
(
_
:
Recordable
,
__
:
TableColumn
,
cellValue
:
number
)
=>
{
return
accounts
.
find
((
account
)
=>
account
.
id
===
cellValue
)?.
mail
},
{
title
:
'邮箱账号'
,
field
:
'accountId'
,
isSearch
:
true
,
table
:
{
width
:
200
,
slots
:
{
default
:
'accountId_default'
}
search
:
{
show
:
true
,
component
:
'Select'
,
api
:
()
=>
{
return
accounts
},
search
:
{
slots
:
{
default
:
'accountId_search'
componentProps
:
{
optionsAlias
:
{
labelField
:
'mail'
,
valueField
:
'id'
}
}
}
},
{
label
:
'发送人名称'
,
field
:
'nickname'
},
{
label
:
'开启状态'
,
field
:
'status'
,
isSearch
:
true
,
formatter
:
(
_
:
Recordable
,
__
:
TableColumn
,
cellValue
:
number
)
=>
{
return
h
(
DictTag
,
{
type
:
DICT_TYPE
.
COMMON_STATUS
,
value
:
cellValue
})
},
{
title
:
'发送人名称'
,
field
:
'nickname'
},
{
title
:
'开启状态'
,
field
:
'status'
,
isSearch
:
true
,
dictType
:
DICT_TYPE
.
COMMON_STATUS
,
dictClass
:
'number'
},
{
title
:
'备注'
,
field
:
'remark'
,
isTable
:
false
},
{
title
:
'创建时间'
,
field
:
'createTime'
,
isForm
:
false
,
formatter
:
'formatDate'
,
table
:
{
width
:
180
},
search
:
{
show
:
true
,
itemRender
:
{
name
:
'XDataTimePicker'
}
dictType
:
DICT_TYPE
.
COMMON_STATUS
,
dictClass
:
'number'
},
{
label
:
'备注'
,
field
:
'remark'
,
isTable
:
false
},
{
label
:
'创建时间'
,
field
:
'createTime'
,
isForm
:
false
,
formatter
:
dateFormatter
,
search
:
{
show
:
true
,
itemRender
:
{
name
:
'XDataTimePicker'
}
}
]
}
)
export
const
{
allSchemas
}
=
use
Vxe
CrudSchemas
(
crudSchemas
)
}
]
)
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
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