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
f1a80fe5
authored
Mar 17, 2023
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vue3 重构:邮件账号的列表 + 搜索
parent
763dce6f
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
48 additions
and
163 deletions
+48
-163
src/views/system/mail/account/account.data.ts
+21
-25
src/views/system/mail/account/index.vue
+27
-138
No files found.
src/views/system/mail/account/account.data.ts
View file @
f1a80fe5
import
type
{
VxeCrudSchema
}
from
'@/hooks/web/useVxeCrudSchemas'
import
{
CrudSchema
,
useCrudSchemas
}
from
'@/hooks/web/useCrudSchemas'
import
{
DictTag
}
from
'@/components/DictTag'
import
{
TableColumn
}
from
'@/types/table'
import
{
dateFormatter
}
from
'@/utils/formatTime'
const
{
t
}
=
useI18n
()
// 国际化
// 表单校验
export
const
rules
=
reactive
({
// mail: [required],
mail
:
[
{
required
:
true
,
message
:
t
(
'profile.rules.mail'
),
trigger
:
'blur'
},
{
...
...
@@ -21,34 +23,28 @@ export const rules = reactive({
})
// CrudSchema
const
crudSchemas
=
reactive
<
VxeCrudSchema
>
({
primaryKey
:
'id'
,
// 默认的主键 ID
primaryTitle
:
'编号'
,
primaryType
:
'id'
,
action
:
true
,
actionWidth
:
'200'
,
// 3 个按钮默认 200,如有删减对应增减即可
columns
:
[
const
crudSchemas
=
reactive
<
CrudSchema
[]
>
([
{
title
:
'邮箱'
,
label
:
'邮箱'
,
field
:
'mail'
,
isSearch
:
true
},
{
title
:
'用户名'
,
label
:
'用户名'
,
field
:
'username'
,
isSearch
:
true
},
{
title
:
'密码'
,
label
:
'密码'
,
field
:
'password'
,
isTable
:
false
},
{
title
:
'SMTP 服务器域名'
,
label
:
'SMTP 服务器域名'
,
field
:
'host'
},
{
title
:
'SMTP 服务器端口'
,
label
:
'SMTP 服务器端口'
,
field
:
'port'
,
form
:
{
component
:
'InputNumber'
,
...
...
@@ -56,20 +52,20 @@ const crudSchemas = reactive<VxeCrudSchema>({
}
},
{
title
:
'是否开启 SSL'
,
label
:
'是否开启 SSL'
,
field
:
'sslEnable'
,
dictType
:
DICT_TYPE
.
INFRA_BOOLEAN_STRING
,
dictClass
:
'boolean'
formatter
:
(
_
:
Recordable
,
__
:
TableColumn
,
cellValue
:
boolean
)
=>
{
return
h
(
DictTag
,
{
type
:
DICT_TYPE
.
INFRA_BOOLEAN_STRING
,
value
:
cellValue
})
}
},
{
title
:
'创建时间'
,
label
:
'创建时间'
,
field
:
'createTime'
,
isForm
:
false
,
formatter
:
'formatDate'
,
table
:
{
width
:
180
}
formatter
:
dateFormatter
}
]
})
export
const
{
allSchemas
}
=
useVxeCrudSchemas
(
crudSchemas
)
])
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
src/views/system/mail/account/index.vue
View file @
f1a80fe5
<
template
>
<ContentWrap>
<!-- 列表 -->
<XTable
@
register=
"registerTable"
>
<template
#
toolbar_buttons
>
<!-- 操作:新增 -->
<XButton
type=
"primary"
preIcon=
"ep:zoom-in"
:title=
"t('action.add')"
v-hasPermi=
"['system:mail-account:create']"
@
click=
"handleCreate()"
/>
</
template
>
<
template
#
actionbtns_default=
"{ row }"
>
<!-- 操作:修改 -->
<XTextButton
preIcon=
"ep:edit"
:title=
"t('action.edit')"
v-hasPermi=
"['system:mail-account:update']"
@
click=
"handleUpdate(row.id)"
/>
<!-- 操作:详情 -->
<XTextButton
preIcon=
"ep:view"
:title=
"t('action.detail')"
v-hasPermi=
"['system:mail-account:query']"
@
click=
"handleDetail(row.id)"
/>
<!-- 操作:删除 -->
<XTextButton
preIcon=
"ep:delete"
:title=
"t('action.del')"
v-hasPermi=
"['system:mail-account:delete']"
@
click=
"deleteData(row.id)"
/>
</
template
>
</XTable>
<Search
:schema=
"allSchemas.searchSchema"
@
search=
"setSearchParams"
@
reset=
"setSearchParams"
/>
</ContentWrap>
<!-- 弹窗 -->
<XModal
id=
"mailAccountModel"
:loading=
"modelLoading"
v-model=
"modelVisible"
:title=
"modelTitle"
>
<!-- 表单:添加/修改 -->
<Form
ref=
"formRef"
v-if=
"['create', 'update'].includes(actionType)"
:schema=
"allSchemas.formSchema"
:rules=
"rules"
/>
<!-- 表单:详情 -->
<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"
/>
<ContentWrap>
<Table
v-model:pageSize=
"tableObject.pageSize"
v-model:currentPage=
"tableObject.currentPage"
:columns=
"allSchemas.tableColumns"
:data=
"tableObject.tableList"
:loading=
"tableObject.loading"
:pagination=
"
{
total: tableObject.total
}"
@register="register"
>
<template
#
action=
"
{ row }">
<ElButton
type=
"danger"
@
click=
"delData(row, false)"
>
{{
t
(
'exampleDemo.del'
)
}}
</ElButton>
</
template
>
</XModal>
</Table>
</ContentWrap>
</template>
<
script
setup
lang=
"ts"
name=
"MailAccount"
>
import
{
FormExpose
}
from
'@/components/Form
'
// 业务相关的 import
import
{
rules
,
allSchemas
}
from
'./account.data
'
import
{
allSchemas
}
from
'./account.data
'
import
{
useTable
}
from
'@/hooks/web/useTable'
import
{
Table
}
from
'@/components/Table
'
import
*
as
MailAccountApi
from
'@/api/system/mail/account'
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
// 列表相关的变量
const
[
registerTable
,
{
reload
,
deleteData
}]
=
useXTable
({
allSchemas
:
allSchemas
,
const
{
register
,
tableObject
,
methods
}
=
useTable
<
MailAccountApi
.
MailAccountVO
>
({
getListApi
:
MailAccountApi
.
getMailAccountPageApi
,
del
ete
Api
:
MailAccountApi
.
deleteMailAccountApi
del
List
Api
:
MailAccountApi
.
deleteMailAccountApi
})
// 弹窗相关的变量
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
handleCreate
=
()
=>
{
setDialogTile
(
'create'
)
modelLoading
.
value
=
false
}
// 修改操作
const
handleUpdate
=
async
(
rowId
:
number
)
=>
{
setDialogTile
(
'update'
)
// 设置数据
const
res
=
await
MailAccountApi
.
getMailAccountApi
(
rowId
)
unref
(
formRef
)?.
setValues
(
res
)
modelLoading
.
value
=
false
}
// 详情操作
const
handleDetail
=
async
(
rowId
:
number
)
=>
{
setDialogTile
(
'detail'
)
const
res
=
await
MailAccountApi
.
getMailAccountApi
(
rowId
)
detailData
.
value
=
res
modelLoading
.
value
=
false
}
const
{
getList
,
setSearchParams
}
=
methods
// 提交按钮
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
MailAccountApi
.
MailAccountVO
if
(
actionType
.
value
===
'create'
)
{
await
MailAccountApi
.
createMailAccountApi
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
await
MailAccountApi
.
updateMailAccountApi
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
}
modelVisible
.
value
=
false
}
finally
{
actionLoading
.
value
=
false
// 刷新列表
await
reload
()
}
}
})
}
getList
()
</
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