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
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
76 additions
and
191 deletions
+76
-191
src/views/system/mail/account/account.data.ts
+49
-53
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
()
// 国际化
const
{
t
}
=
useI18n
()
// 国际化
// 表单校验
// 表单校验
export
const
rules
=
reactive
({
export
const
rules
=
reactive
({
// mail: [required],
mail
:
[
mail
:
[
{
required
:
true
,
message
:
t
(
'profile.rules.mail'
),
trigger
:
'blur'
},
{
required
:
true
,
message
:
t
(
'profile.rules.mail'
),
trigger
:
'blur'
},
{
{
...
@@ -21,55 +23,49 @@ export const rules = reactive({
...
@@ -21,55 +23,49 @@ export const rules = reactive({
})
})
// CrudSchema
// CrudSchema
const
crudSchemas
=
reactive
<
VxeCrudSchema
>
({
const
crudSchemas
=
reactive
<
CrudSchema
[]
>
([
primaryKey
:
'id'
,
// 默认的主键 ID
{
primaryTitle
:
'编号'
,
label
:
'邮箱'
,
primaryType
:
'id'
,
field
:
'mail'
,
action
:
true
,
isSearch
:
true
actionWidth
:
'200'
,
// 3 个按钮默认 200,如有删减对应增减即可
},
columns
:
[
{
{
label
:
'用户名'
,
title
:
'邮箱'
,
field
:
'username'
,
field
:
'mail'
,
isSearch
:
true
isSearch
:
true
},
},
{
{
label
:
'密码'
,
title
:
'用户名'
,
field
:
'password'
,
field
:
'username'
,
isTable
:
false
isSearch
:
true
},
},
{
{
label
:
'SMTP 服务器域名'
,
title
:
'密码'
,
field
:
'host'
field
:
'password'
,
},
isTable
:
false
{
},
label
:
'SMTP 服务器端口'
,
{
field
:
'port'
,
title
:
'SMTP 服务器域名'
,
form
:
{
field
:
'host'
component
:
'InputNumber'
,
},
value
:
465
{
title
:
'SMTP 服务器端口'
,
field
:
'port'
,
form
:
{
component
:
'InputNumber'
,
value
:
465
}
},
{
title
:
'是否开启 SSL'
,
field
:
'sslEnable'
,
dictType
:
DICT_TYPE
.
INFRA_BOOLEAN_STRING
,
dictClass
:
'boolean'
},
{
title
:
'创建时间'
,
field
:
'createTime'
,
isForm
:
false
,
formatter
:
'formatDate'
,
table
:
{
width
:
180
}
}
}
]
},
})
{
export
const
{
allSchemas
}
=
useVxeCrudSchemas
(
crudSchemas
)
label
:
'是否开启 SSL'
,
field
:
'sslEnable'
,
formatter
:
(
_
:
Recordable
,
__
:
TableColumn
,
cellValue
:
boolean
)
=>
{
return
h
(
DictTag
,
{
type
:
DICT_TYPE
.
INFRA_BOOLEAN_STRING
,
value
:
cellValue
})
}
},
{
label
:
'创建时间'
,
field
:
'createTime'
,
isForm
:
false
,
formatter
:
dateFormatter
}
])
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
src/views/system/mail/account/index.vue
View file @
f1a80fe5
<
template
>
<
template
>
<ContentWrap>
<ContentWrap>
<!-- 列表 -->
<Search
:schema=
"allSchemas.searchSchema"
@
search=
"setSearchParams"
@
reset=
"setSearchParams"
/>
<XTable
@
register=
"registerTable"
>
</ContentWrap>
<template
#
toolbar_buttons
>
<!-- 操作:新增 -->
<ContentWrap>
<XButton
<Table
type=
"primary"
v-model:pageSize=
"tableObject.pageSize"
preIcon=
"ep:zoom-in"
v-model:currentPage=
"tableObject.currentPage"
:title=
"t('action.add')"
:columns=
"allSchemas.tableColumns"
v-hasPermi=
"['system:mail-account:create']"
:data=
"tableObject.tableList"
@
click=
"handleCreate()"
:loading=
"tableObject.loading"
/>
:pagination=
"
{
</
template
>
total: tableObject.total
<
template
#
actionbtns_default=
"{ row }"
>
}"
<!-- 操作:修改 -->
@register="register"
<XTextButton
>
preIcon=
"ep:edit"
<template
#
action=
"
{ row }">
:title=
"t('action.edit')"
<ElButton
type=
"danger"
@
click=
"delData(row, false)"
>
v-hasPermi=
"['system:mail-account:update']"
{{
t
(
'exampleDemo.del'
)
}}
@
click=
"handleUpdate(row.id)"
</ElButton>
/>
<!-- 操作:详情 -->
<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
>
</
template
>
</
X
Table>
</Table>
</ContentWrap>
</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"
/>
</
template
>
</XModal>
</template>
</template>
<
script
setup
lang=
"ts"
name=
"MailAccount"
>
<
script
setup
lang=
"ts"
name=
"MailAccount"
>
import
{
FormExpose
}
from
'@/components/Form
'
import
{
allSchemas
}
from
'./account.data
'
// 业务相关的 import
import
{
useTable
}
from
'@/hooks/web/useTable'
import
{
rules
,
allSchemas
}
from
'./account.data
'
import
{
Table
}
from
'@/components/Table
'
import
*
as
MailAccountApi
from
'@/api/system/mail/account'
import
*
as
MailAccountApi
from
'@/api/system/mail/account'
const
{
t
}
=
useI18n
()
// 国际化
const
{
register
,
tableObject
,
methods
}
=
useTable
<
MailAccountApi
.
MailAccountVO
>
({
const
message
=
useMessage
()
// 消息弹窗
// 列表相关的变量
const
[
registerTable
,
{
reload
,
deleteData
}]
=
useXTable
({
allSchemas
:
allSchemas
,
getListApi
:
MailAccountApi
.
getMailAccountPageApi
,
getListApi
:
MailAccountApi
.
getMailAccountPageApi
,
del
ete
Api
:
MailAccountApi
.
deleteMailAccountApi
del
List
Api
:
MailAccountApi
.
deleteMailAccountApi
})
})
// 弹窗相关的变量
const
{
getList
,
setSearchParams
}
=
methods
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
}
// 提交按钮
getList
()
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
()
}
}
})
}
</
script
>
</
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