邮件日志及状态管理
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
5dd13b58c5
commit
795423182d
|
|
@ -350,3 +350,35 @@ export function getUserJoinedTrialList(data) {
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// 邮件日志-日志列表
|
||||||
|
export function getEmailLogList(data) {
|
||||||
|
return request({
|
||||||
|
url: `/EmailLog/getEmailLogList`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 邮件日志-日志详情
|
||||||
|
export function getEmailInfo(data) {
|
||||||
|
return request({
|
||||||
|
url: `/EmailLog/getEmailInfo`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 邮件日志-重发邮件
|
||||||
|
export function resendEmail(data) {
|
||||||
|
return request({
|
||||||
|
url: `/EmailLog/resendEmail`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// 邮件日志-同步邮件
|
||||||
|
export function synchronizationEmail(data) {
|
||||||
|
return request({
|
||||||
|
url: `/EmailLog/synchronizationEmail`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,228 @@
|
||||||
|
<template>
|
||||||
|
<div class="detail">
|
||||||
|
<div class="attachment" v-if="Array.isArray(info.AttachmentList) && info.AttachmentList.length > 0">
|
||||||
|
<div class="box" v-for="item of info.AttachmentList" :key="item.AttachmentPath" @click="perview(item)">
|
||||||
|
<i :class="`icon icon_file icon_${item.type}`" />
|
||||||
|
<span>{{ item.AttachmentName }}</span>
|
||||||
|
</div>
|
||||||
|
<span class="downLoadTip" @click="downloadFile">{{ $t('system:email:tip:allDownLoad') }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="content" v-html="info.Content"></div>
|
||||||
|
<viewer ref="picture_perview" style="margin: 0 10px"
|
||||||
|
v-if="rowData.type && ['png', 'jpg', 'jpeg'].includes(rowData.type.toLowerCase())"
|
||||||
|
:images="[`${OSSclientConfig.basePath}${rowData.AttachmentPath}`]" :options="viewerOptions">
|
||||||
|
|
||||||
|
<img v-show="false" :src="`${OSSclientConfig.basePath}${rowData.AttachmentPath}`" alt="Image" />
|
||||||
|
</viewer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { downLoadFile } from '@/utils/stream.js'
|
||||||
|
export default {
|
||||||
|
name: "emailDetail",
|
||||||
|
props: {
|
||||||
|
info: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
rowData: {},
|
||||||
|
viewerOptions: {
|
||||||
|
toolbar: {
|
||||||
|
zoomIn: true,
|
||||||
|
zoomOut: true,
|
||||||
|
reset: true,
|
||||||
|
prev: false,
|
||||||
|
next: false,
|
||||||
|
rotateLeft: true,
|
||||||
|
rotateRight: true,
|
||||||
|
flipHorizontal: true,
|
||||||
|
flipVertical: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
//预览
|
||||||
|
perview(data) {
|
||||||
|
this.rowData = data
|
||||||
|
if (['.ppt',
|
||||||
|
'.pptx',
|
||||||
|
'.doc',
|
||||||
|
'.docx',
|
||||||
|
'.xls',
|
||||||
|
'.xlsx'].includes(`.${data.type.toLowerCase()}`)) {
|
||||||
|
this.$onlyOffice({
|
||||||
|
path: data.AttachmentPath,
|
||||||
|
type: data.type,
|
||||||
|
title: data.AttachmentName
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (['.jpg',
|
||||||
|
'.jpeg',
|
||||||
|
'.png'].includes(`.${data.type.toLowerCase()}`)) {
|
||||||
|
this.$refs['picture_perview'].$viewer.show()
|
||||||
|
}
|
||||||
|
if (['.pdf'].includes(`.${data.type.toLowerCase()}`)) {
|
||||||
|
this.$preview({
|
||||||
|
path: data.Path || data.AttachmentPath,
|
||||||
|
type: 'pdf',
|
||||||
|
title: data.AttachmentName,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async downloadFile() {
|
||||||
|
try {
|
||||||
|
let { files, name } = this.formatDownloadFile(this.info.AttachmentList)
|
||||||
|
let res = await downLoadFile(files, name, 'zip')
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 格式化下载文件路径
|
||||||
|
formatDownloadFile(list) {
|
||||||
|
let files = [],
|
||||||
|
name = `Attachment_${new Date().getTime()}.zip`
|
||||||
|
list.forEach(item => {
|
||||||
|
let obj = {
|
||||||
|
name: item.AttachmentName,
|
||||||
|
url: this.OSSclientConfig.basePath + item.AttachmentPath,
|
||||||
|
}
|
||||||
|
files.push(obj)
|
||||||
|
})
|
||||||
|
return { files, name }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.attachment {
|
||||||
|
border-bottom: 1px solid #EBEEF5;
|
||||||
|
padding: 10px 0 0 0;
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
.box {
|
||||||
|
padding: 5px 10px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
max-width: 400px;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
border-radius: 5px;
|
||||||
|
background-color: #E4E7ED;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-right: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
|
||||||
|
i {
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.downLoadTip {
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #409EFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
height: 20px;
|
||||||
|
width: 20px;
|
||||||
|
padding: 0px;
|
||||||
|
line-height: 20px;
|
||||||
|
margin-right: 6px;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*文件*/
|
||||||
|
.icon_file {
|
||||||
|
width: 16px !important;
|
||||||
|
height: 16px !important;
|
||||||
|
margin-right: 6px;
|
||||||
|
background-size: inherit;
|
||||||
|
background-image: url(@/assets/0.file-16.png);
|
||||||
|
background-position: 0 0;
|
||||||
|
margin-top: -2px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
font-style: normal;
|
||||||
|
display: inline-block;
|
||||||
|
pointer-events: none;
|
||||||
|
font-size: 85%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*文件夹*/
|
||||||
|
.icon_folder {
|
||||||
|
background-image: url(@/assets/folder_win11_small.png);
|
||||||
|
margin-top: -6px;
|
||||||
|
margin-left: 2px;
|
||||||
|
margin-right: 6px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*docx*/
|
||||||
|
.icon_docx {
|
||||||
|
background-position: -81px -560px !important;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*doc*/
|
||||||
|
.icon_doc {
|
||||||
|
background-position: -81px -592px !important;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*xlsx*/
|
||||||
|
.icon_xlsx {
|
||||||
|
background-position: -81px -48px !important;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*pdf*/
|
||||||
|
.icon_pdf {
|
||||||
|
background-position: -81px -352px !important;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*pptx*/
|
||||||
|
.icon_pptx {
|
||||||
|
background-position: -81px -288px !important;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*zip*/
|
||||||
|
.icon_zip {
|
||||||
|
background-position: 0 0 !important;
|
||||||
|
margin-top: -2px;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*ppt*/
|
||||||
|
.icon_ppt {
|
||||||
|
background-position: -81px -304px !important;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*xls*/
|
||||||
|
.icon_xls {
|
||||||
|
background-position: -81px -96px !important;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,271 @@
|
||||||
|
<template>
|
||||||
|
<div class="event">
|
||||||
|
<div ref="leftContainer" class="left">
|
||||||
|
<el-form :inline="true">
|
||||||
|
<el-form-item :label="$t('system:email:search:ToRecipientName')">
|
||||||
|
<el-input v-model="searchData.ToRecipientName" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('system:email:search:CcRecipientName')">
|
||||||
|
<el-input v-model="searchData.CcRecipientName" clearable />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('system:email:search:EmailStateEnum')">
|
||||||
|
<el-select v-model="searchData.EmailStateEnum" clearable filterable placeholder="">
|
||||||
|
<el-option v-for="item in $d.EmailState" :key="item.id" :label="item.label"
|
||||||
|
:value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('system:email:search:EmailStateEnum')">
|
||||||
|
<el-select v-model="searchData.EmailStateEnum" clearable filterable placeholder="">
|
||||||
|
<el-option v-for="item in $d.EmailState" :key="item.id" :label="item.label"
|
||||||
|
:value="item.value" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('system:email:search:emailDate')">
|
||||||
|
<el-date-picker v-model="datetimerange" type="datetimerange"
|
||||||
|
:default-time="['00:00:00', '23:59:59']" :start-placeholder="$t('feedBack:search:beginTime')"
|
||||||
|
:end-placeholder="$t('feedBack:search:endTime')" value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
@change="handleDatetimeChange" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="small" @click="getList">
|
||||||
|
{{ $t('common:button:search') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button icon="el-icon-refresh-left" size="small" @click="handleReset">
|
||||||
|
{{ $t('common:button:reset') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button type="primary" size="small" @click="synchronizationEmail">
|
||||||
|
{{ $t('system:email:button:sync') }}
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<el-table v-loading="loading" v-adaptive="{ bottomOffset: 45 }" height="100" :data="list" class="table"
|
||||||
|
@sort-change="handleSortByColumn">
|
||||||
|
<el-table-column type="index" width="50" />
|
||||||
|
<el-table-column :label="$t('system:email:table:messageId')" prop="MessageId" show-overflow-tooltip
|
||||||
|
sortable="custom" />
|
||||||
|
<el-table-column :label="$t('system:email:table:emailSubject')" prop="EmailSubject"
|
||||||
|
show-overflow-tooltip />
|
||||||
|
<el-table-column :label="$t('system:email:table:ToRecipientName')" prop="ToRecipientName"
|
||||||
|
show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{Array.isArray(scope.row.RecipientList) && scope.row.RecipientList.length > 0
|
||||||
|
? scope.row.RecipientList.filter(item => item.RecipientTypeEnum === 0).map(item =>
|
||||||
|
item.RecipientName).join(", ") : ''
|
||||||
|
}}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="$t('system:email:table:CcRecipientName')" prop="CcRecipientName"
|
||||||
|
show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{Array.isArray(scope.row.RecipientList) && scope.row.RecipientList.length > 0
|
||||||
|
? scope.row.RecipientList.filter(item => item.RecipientTypeEnum === 1).map(item =>
|
||||||
|
item.RecipientName).join(", ") : ''
|
||||||
|
}}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="$t('system:email:table:emailDate')" prop="EmailDate" show-overflow-tooltip
|
||||||
|
sortable="custom" />
|
||||||
|
<el-table-column :label="$t('system:email:table:emailStateEnum')" prop="EmailStateEnum"
|
||||||
|
show-overflow-tooltip sortable="custom">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="scope.row.EmailStateEnum === 1 ? 'danger' : ''">{{ $fd("EmailState",
|
||||||
|
scope.row.EmailStateEnum) }}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column :label="$t('system:email:table:errorInfo')" prop="ErrorInfo" show-overflow-tooltip />
|
||||||
|
<el-table-column :label="$t('common:action:action')" fixed="right" prop="" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button type="text" @click="view(scope.row)">
|
||||||
|
{{ $t('common:button:view') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button type="text" @click="resendEmail(scope.row)">
|
||||||
|
{{ $t('system:email:button:resendEmail') }}
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<div class="pagination" style="text-align: right; margin-top: 5px">
|
||||||
|
<pagination :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize"
|
||||||
|
@pagination="getList" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<base-model v-if="model_cfg.visible" :config="model_cfg">
|
||||||
|
<template slot="dialog-body">
|
||||||
|
<emailDetail :info="info" />
|
||||||
|
</template>
|
||||||
|
</base-model>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import { getEmailLogList, resendEmail, getEmailInfo, synchronizationEmail } from '@/api/admin'
|
||||||
|
import Pagination from '@/components/Pagination'
|
||||||
|
import BaseModel from '@/components/BaseModel'
|
||||||
|
import emailDetail from "./components/detail"
|
||||||
|
const searchDataDefault = () => {
|
||||||
|
return {
|
||||||
|
TrialId: null,
|
||||||
|
EmailStartDate: null,
|
||||||
|
EmailEndDate: null,
|
||||||
|
EmailStateEnum: null,
|
||||||
|
ToRecipientName: null,
|
||||||
|
CcRecipientName: null,
|
||||||
|
Asc: false,
|
||||||
|
SortField: 'CreateTime',
|
||||||
|
PageIndex: 1,
|
||||||
|
PageSize: 20,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default {
|
||||||
|
name: 'emailLog',
|
||||||
|
components: { Pagination, BaseModel, emailDetail },
|
||||||
|
props: {
|
||||||
|
isSystem: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
searchData: searchDataDefault(),
|
||||||
|
list: [],
|
||||||
|
total: 0,
|
||||||
|
loading: false,
|
||||||
|
datetimerange: [],
|
||||||
|
model_cfg: { visible: false, title: '', width: '500px', fullscreen: true },
|
||||||
|
info: null,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getList() {
|
||||||
|
this.loading = true
|
||||||
|
if (!this.isSystem) this.searchData.TrialId = this.$route.query.trialId
|
||||||
|
getEmailLogList(this.searchData)
|
||||||
|
.then((res) => {
|
||||||
|
this.loading = false
|
||||||
|
this.list = res.Result.CurrentPageData
|
||||||
|
this.total = res.Result.TotalCount
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 查看详情
|
||||||
|
async view(row) {
|
||||||
|
try {
|
||||||
|
let data = {
|
||||||
|
Id: row.Id
|
||||||
|
// Id: "EC660000-BA37-5C60-8680-08DE1CD6931B"
|
||||||
|
}
|
||||||
|
let res = await getEmailInfo(data)
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.info = res.Result
|
||||||
|
if (Array.isArray(this.info.AttachmentList) && this.info.AttachmentList.length > 0) {
|
||||||
|
this.info.AttachmentList.forEach(item => {
|
||||||
|
var type = item.AttachmentName
|
||||||
|
.substring(item.AttachmentName.lastIndexOf('.'))
|
||||||
|
.toLocaleLowerCase().split('.')[1];
|
||||||
|
item.type = type
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.model_cfg.visible = true
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 同步邮件
|
||||||
|
async synchronizationEmail() {
|
||||||
|
try {
|
||||||
|
this.loading = true
|
||||||
|
let res = await synchronizationEmail()
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.getList()
|
||||||
|
this.$message.success(this.$t("system:email:message:syncSuccessfully"))
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 重发邮件
|
||||||
|
async resendEmail(row) {
|
||||||
|
try {
|
||||||
|
let data = {
|
||||||
|
Id: row.Id
|
||||||
|
}
|
||||||
|
this.loading = true
|
||||||
|
let res = await resendEmail(data)
|
||||||
|
this.loading = false
|
||||||
|
if (res.IsSuccess) {
|
||||||
|
this.getList()
|
||||||
|
this.$message.success(this.$t("system:email:message:resendSuccessfully"))
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
this.loading = false
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 重置列表查询
|
||||||
|
handleReset() {
|
||||||
|
this.searchData = searchDataDefault()
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
// 排序
|
||||||
|
handleSortByColumn(column) {
|
||||||
|
if (column.order === 'ascending') {
|
||||||
|
this.searchData.Asc = true
|
||||||
|
} else {
|
||||||
|
this.searchData.Asc = false
|
||||||
|
}
|
||||||
|
this.searchData.SortField = column.prop
|
||||||
|
this.searchData.PageIndex = 1
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
handleDatetimeChange(val) {
|
||||||
|
if (val) {
|
||||||
|
this.searchData.EmailStartDate = val[0]
|
||||||
|
this.searchData.EmailEndDate = val[1]
|
||||||
|
} else {
|
||||||
|
this.searchData.EmailStartDate = ''
|
||||||
|
this.searchData.EmailEndDate = ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.event {
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
|
||||||
|
.left {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
width: 0;
|
||||||
|
flex-grow: 4;
|
||||||
|
|
||||||
|
// border-right: 1px solid #ccc;
|
||||||
|
.filter-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.data-table {
|
||||||
|
flex: 1;
|
||||||
|
padding: 5px 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pagination-container {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,242 @@
|
||||||
|
<template>
|
||||||
|
<div v-loading="loading" class="email-wrapper">
|
||||||
|
<el-collapse v-model="activeCollapse" class="setting-config">
|
||||||
|
<!-- 发件箱配置 -->
|
||||||
|
<el-collapse-item :title="$t('trials:emailManageCfg:title:sendEmailCfg')" name="1">
|
||||||
|
<!-- 配置信息表单 -->
|
||||||
|
<el-form ref="emailRulesForm" v-loading="loading" :model="form" style="width:800px;margin-top: 10px;"
|
||||||
|
:rules="rules" label-width="230px" size="small">
|
||||||
|
<!-- 发件箱账号 -->
|
||||||
|
<el-form-item :label="$t('trials:emailManageCfg:title:sendEmailAccount')" prop="EmailFromEmail">
|
||||||
|
<el-input v-model="form.EmailFromEmail" :disabled="!isEdit" />
|
||||||
|
</el-form-item>
|
||||||
|
<!-- 发件人 -->
|
||||||
|
<el-form-item :label="$t('trials:emailManageCfg:title:fromName')" prop="EmailFromName">
|
||||||
|
<el-input v-model="form.EmailFromName" :disabled="!isEdit" />
|
||||||
|
</el-form-item>
|
||||||
|
<!-- 密码/授权码 -->
|
||||||
|
<el-form-item :label="$t('trials:emailManageCfg:title:password')" prop="EmailAuthorizationCode">
|
||||||
|
<el-input v-model="form.EmailAuthorizationCode" :disabled="!isEdit" />
|
||||||
|
</el-form-item>
|
||||||
|
<!-- SMTP服务器 -->
|
||||||
|
<el-form-item :label="$t('trials:emailManageCfg:title:SMTPServerAddress')"
|
||||||
|
prop="EmailSMTPServerAddress">
|
||||||
|
<el-input v-model="form.EmailSMTPServerAddress" :disabled="!isEdit" />
|
||||||
|
</el-form-item>
|
||||||
|
<!-- SMTP端口 -->
|
||||||
|
<el-form-item :label="$t('trials:emailManageCfg:title:SMTPServerPort')" prop="EmailSMTPServerPort">
|
||||||
|
<el-input v-model.number="form.EmailSMTPServerPort" type="number" :disabled="!isEdit" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item v-if="hasPermi(['trials:trials-panel:setting:email-manage:edit'])">
|
||||||
|
<el-button v-if="isEdit" size="small" type="primary" @click="setTrialEmail">
|
||||||
|
{{ $t('common:button:confirm') }}
|
||||||
|
</el-button>
|
||||||
|
<el-button v-else size="small" type="primary" @click="isEdit = true">
|
||||||
|
{{ $t('trials:trialCfg:button:update') }}
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-collapse-item>
|
||||||
|
<!-- 自动邮件模版 -->
|
||||||
|
<el-collapse-item :title="$t('trials:emailManageCfg:title:emailTpl')" name="2">
|
||||||
|
<el-tabs v-model="activeTab" type="border-card">
|
||||||
|
<!-- 通用 -->
|
||||||
|
<el-tab-pane :label="$t('trials:emailManageCfg:title:commom')" name="0">
|
||||||
|
<EmailList v-if="activeTab === '0'" ref="emailList" :is-distinguish-criteria="false"
|
||||||
|
:is-edit="isEdit" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<!-- 标准相关 -->
|
||||||
|
<el-tab-pane :label="$t('trials:emailManageCfg:title:criterions')" name="1">
|
||||||
|
<EmailList v-if="activeTab === '1'" ref="emailList" :is-distinguish-criteria="true"
|
||||||
|
:is-edit="isEdit" />
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</el-collapse-item>
|
||||||
|
</el-collapse>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import EmailList from './components/EmailList'
|
||||||
|
import { getTrialCriterionList } from '@/api/trials/reading'
|
||||||
|
import { setTrialEmail, getTrialEmail } from '@/api/trials'
|
||||||
|
export default {
|
||||||
|
name: 'emailConfig',
|
||||||
|
components: {
|
||||||
|
EmailList
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
activeCollapse: ['1', '2'],
|
||||||
|
trialId: '',
|
||||||
|
activeTab: '0',
|
||||||
|
trialCriterionList: [],
|
||||||
|
loading: false,
|
||||||
|
isEdit: true,
|
||||||
|
form: {
|
||||||
|
EmailFromEmail: '',
|
||||||
|
EmailFromName: '',
|
||||||
|
EmailAuthorizationCode: '',
|
||||||
|
EmailSMTPServerAddress: '',
|
||||||
|
EmailSMTPServerPort: null,
|
||||||
|
IsConfigureEmail: true
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
EmailFromEmail: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
||||||
|
EmailFromName: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
||||||
|
EmailAuthorizationCode: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
||||||
|
EmailSMTPServerAddress: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
||||||
|
EmailSMTPServerPort: [{ required: true, message: this.$t('common:ruleMessage:specify') }, {
|
||||||
|
type: "number",
|
||||||
|
min: 1,
|
||||||
|
max: 65535,
|
||||||
|
message: this.$t("common:ruleMessage:portPattern"),
|
||||||
|
trigger: "blur",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
validator: (rule, value, callback) => {
|
||||||
|
if (
|
||||||
|
value &&
|
||||||
|
(String(value).includes(".") ||
|
||||||
|
new RegExp(/\D/g).test(String(value)))
|
||||||
|
) {
|
||||||
|
callback(new Error(this.$t("common:ruleMessage:portPattern")));
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
trigger: "blur",
|
||||||
|
},]
|
||||||
|
},
|
||||||
|
NODE_ENV: process.env.NODE_ENV,
|
||||||
|
VUE_APP_OSS_PATH: process.env.VUE_APP_OSS_PATH,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// watch: {
|
||||||
|
// activeTab(v) {
|
||||||
|
// console.log(v)
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
created() {
|
||||||
|
if (this.VUE_APP_OSS_PATH === '/uat/dist') {
|
||||||
|
this.form = {
|
||||||
|
EmailFromEmail: 'uat@extimaging.com',
|
||||||
|
EmailFromName: 'Uat IRC Imaging System',
|
||||||
|
EmailAuthorizationCode: 'SHzyyl2021',
|
||||||
|
EmailSMTPServerAddress: 'smtp.qiye.aliyun.com',
|
||||||
|
EmailSMTPServerPort: 465,
|
||||||
|
IsConfigureEmail: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (this.VUE_APP_OSS_PATH === '/test/dist') {
|
||||||
|
this.form = {
|
||||||
|
EmailFromEmail: 'test@extimaging.com',
|
||||||
|
EmailFromName: 'Test IRC Imaging System',
|
||||||
|
EmailAuthorizationCode: 'SHzyyl2021',
|
||||||
|
EmailSMTPServerAddress: 'smtp.qiye.aliyun.com',
|
||||||
|
EmailSMTPServerPort: 465,
|
||||||
|
IsConfigureEmail: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.trialId = this.$route.query.trialId
|
||||||
|
this.getTrialEmail()
|
||||||
|
this.getTrialCriterionList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleClick(a) {
|
||||||
|
this.activeName = a.name
|
||||||
|
},
|
||||||
|
setTrialEmail() {
|
||||||
|
this.$refs['emailRulesForm'].validate((valid) => {
|
||||||
|
if (!valid) {
|
||||||
|
// resolve(false)
|
||||||
|
} else {
|
||||||
|
this.form.TrialId = this.trialId
|
||||||
|
setTrialEmail(this.form).then(res => {
|
||||||
|
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
||||||
|
this.isEdit = false
|
||||||
|
this.$refs['emailList'].getList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getTrialEmail() {
|
||||||
|
getTrialEmail({
|
||||||
|
TrialId: this.trialId
|
||||||
|
}).then(res => {
|
||||||
|
if (res.Result.IsConfigureEmail) {
|
||||||
|
this.form = Object.assign(this.form, res.Result)
|
||||||
|
this.isEdit = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
getTrialCriterionList() {
|
||||||
|
this.loading = true
|
||||||
|
getTrialCriterionList(this.trialId, false).then(res => {
|
||||||
|
this.trialCriterionList = res.Result
|
||||||
|
// this.activeTab = this.trialCriterionList[0].TrialReadingCriterionId
|
||||||
|
this.loading = false
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.email-wrapper {
|
||||||
|
height: 100%;
|
||||||
|
background-color: #fff;
|
||||||
|
|
||||||
|
.el-tabs {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tabs__header {
|
||||||
|
height: 40px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-tabs__content {
|
||||||
|
flex: 1;
|
||||||
|
|
||||||
|
.el-tab-pane {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.email-wrapper {
|
||||||
|
height: 100%;
|
||||||
|
background-color: #fff;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep.el-collapse-item__header {
|
||||||
|
background: #e5ecef;
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep.el-collapse-item__content {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom {
|
||||||
|
height: 50px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
border-top: 1px solid #e1e1e1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,268 +1,43 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" class="email-wrapper">
|
<div style="background-color: #fff;height: 100%;">
|
||||||
<el-collapse v-model="activeCollapse" class="setting-config">
|
<el-tabs v-model="activeName" @tab-click="handleClick" style="height: 100%;">
|
||||||
<!-- 发件箱配置 -->
|
<el-tab-pane :label="$t('trials:emailManageCfg:tab:title:emailManageCfg')" name="emailManageCfg">
|
||||||
<el-collapse-item :title="$t('trials:emailManageCfg:title:sendEmailCfg')" name="1">
|
<emailConfig v-if="activeName === 'emailManageCfg'" />
|
||||||
<!-- 配置信息表单 -->
|
</el-tab-pane>
|
||||||
<el-form
|
<el-tab-pane :label="$t('trials:emailManageCfg:tab:title:emailLog')" name="emailLog">
|
||||||
ref="emailRulesForm"
|
<emailLog :isSystem="false" v-if="activeName === 'emailLog'" />
|
||||||
v-loading="loading"
|
</el-tab-pane>
|
||||||
:model="form"
|
</el-tabs>
|
||||||
style="width:800px;margin-top: 10px;"
|
|
||||||
:rules="rules"
|
|
||||||
label-width="230px"
|
|
||||||
size="small"
|
|
||||||
>
|
|
||||||
<!-- 发件箱账号 -->
|
|
||||||
<el-form-item
|
|
||||||
:label="$t('trials:emailManageCfg:title:sendEmailAccount')"
|
|
||||||
prop="EmailFromEmail"
|
|
||||||
>
|
|
||||||
<el-input v-model="form.EmailFromEmail" :disabled="!isEdit" />
|
|
||||||
</el-form-item>
|
|
||||||
<!-- 发件人 -->
|
|
||||||
<el-form-item
|
|
||||||
:label="$t('trials:emailManageCfg:title:fromName')"
|
|
||||||
prop="EmailFromName"
|
|
||||||
>
|
|
||||||
<el-input v-model="form.EmailFromName" :disabled="!isEdit" />
|
|
||||||
</el-form-item>
|
|
||||||
<!-- 密码/授权码 -->
|
|
||||||
<el-form-item
|
|
||||||
:label="$t('trials:emailManageCfg:title:password')"
|
|
||||||
prop="EmailAuthorizationCode"
|
|
||||||
>
|
|
||||||
<el-input v-model="form.EmailAuthorizationCode" :disabled="!isEdit" />
|
|
||||||
</el-form-item>
|
|
||||||
<!-- SMTP服务器 -->
|
|
||||||
<el-form-item
|
|
||||||
:label="$t('trials:emailManageCfg:title:SMTPServerAddress')"
|
|
||||||
prop="EmailSMTPServerAddress"
|
|
||||||
>
|
|
||||||
<el-input v-model="form.EmailSMTPServerAddress" :disabled="!isEdit" />
|
|
||||||
</el-form-item>
|
|
||||||
<!-- SMTP端口 -->
|
|
||||||
<el-form-item
|
|
||||||
:label="$t('trials:emailManageCfg:title:SMTPServerPort')"
|
|
||||||
prop="EmailSMTPServerPort"
|
|
||||||
>
|
|
||||||
<el-input v-model.number="form.EmailSMTPServerPort" type="number" :disabled="!isEdit" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item v-if="hasPermi(['trials:trials-panel:setting:email-manage:edit'])">
|
|
||||||
<el-button v-if="isEdit" size="small" type="primary" @click="setTrialEmail">
|
|
||||||
{{ $t('common:button:confirm') }}
|
|
||||||
</el-button>
|
|
||||||
<el-button v-else size="small" type="primary" @click="isEdit = true">
|
|
||||||
{{ $t('trials:trialCfg:button:update') }}
|
|
||||||
</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
</el-collapse-item>
|
|
||||||
<!-- 自动邮件模版 -->
|
|
||||||
<el-collapse-item :title="$t('trials:emailManageCfg:title:emailTpl')" name="2">
|
|
||||||
<el-tabs v-model="activeTab" type="border-card">
|
|
||||||
<!-- 通用 -->
|
|
||||||
<el-tab-pane
|
|
||||||
:label="$t('trials:emailManageCfg:title:commom')"
|
|
||||||
name="0"
|
|
||||||
>
|
|
||||||
<EmailList
|
|
||||||
v-if="activeTab === '0'"
|
|
||||||
ref="emailList"
|
|
||||||
:is-distinguish-criteria="false"
|
|
||||||
:is-edit="isEdit"
|
|
||||||
/>
|
|
||||||
</el-tab-pane>
|
|
||||||
<!-- 标准相关 -->
|
|
||||||
<el-tab-pane
|
|
||||||
:label="$t('trials:emailManageCfg:title:criterions')"
|
|
||||||
name="1"
|
|
||||||
>
|
|
||||||
<EmailList
|
|
||||||
v-if="activeTab === '1'"
|
|
||||||
ref="emailList"
|
|
||||||
:is-distinguish-criteria="true"
|
|
||||||
:is-edit="isEdit"
|
|
||||||
/>
|
|
||||||
</el-tab-pane>
|
|
||||||
</el-tabs>
|
|
||||||
</el-collapse-item>
|
|
||||||
</el-collapse>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import EmailList from './components/EmailList'
|
import emailConfig from './config.vue'
|
||||||
import { getTrialCriterionList } from '@/api/trials/reading'
|
import emailLog from "@/views/system/email"
|
||||||
import { setTrialEmail, getTrialEmail } from '@/api/trials'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'EmailManage',
|
name: 'EmailManage',
|
||||||
components: {
|
components: {
|
||||||
EmailList
|
emailConfig,
|
||||||
|
emailLog
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
activeCollapse: ['1', '2'],
|
activeName: 'emailManageCfg', // emailLog emailManageCfg
|
||||||
trialId: '',
|
|
||||||
activeTab: '0',
|
|
||||||
trialCriterionList: [],
|
|
||||||
loading: false,
|
|
||||||
isEdit: true,
|
|
||||||
form: {
|
|
||||||
EmailFromEmail: '',
|
|
||||||
EmailFromName: '',
|
|
||||||
EmailAuthorizationCode: '',
|
|
||||||
EmailSMTPServerAddress: '',
|
|
||||||
EmailSMTPServerPort: null,
|
|
||||||
IsConfigureEmail: true
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
EmailFromEmail: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
|
||||||
EmailFromName: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
|
||||||
EmailAuthorizationCode: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
|
||||||
EmailSMTPServerAddress: [{ required: true, message: this.$t('common:ruleMessage:specify') }],
|
|
||||||
EmailSMTPServerPort: [{ required: true, message: this.$t('common:ruleMessage:specify') },{
|
|
||||||
type: "number",
|
|
||||||
min: 1,
|
|
||||||
max: 65535,
|
|
||||||
message: this.$t("common:ruleMessage:portPattern"),
|
|
||||||
trigger: "blur",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
validator: (rule, value, callback) => {
|
|
||||||
if (
|
|
||||||
value &&
|
|
||||||
(String(value).includes(".") ||
|
|
||||||
new RegExp(/\D/g).test(String(value)))
|
|
||||||
) {
|
|
||||||
callback(new Error(this.$t("common:ruleMessage:portPattern")));
|
|
||||||
} else {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
trigger: "blur",
|
|
||||||
},]
|
|
||||||
},
|
|
||||||
NODE_ENV: process.env.NODE_ENV,
|
|
||||||
VUE_APP_OSS_PATH: process.env.VUE_APP_OSS_PATH,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// watch: {
|
|
||||||
// activeTab(v) {
|
|
||||||
// console.log(v)
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
created() {
|
|
||||||
if(this.VUE_APP_OSS_PATH === '/uat/dist'){
|
|
||||||
this.form= {
|
|
||||||
EmailFromEmail: 'uat@extimaging.com',
|
|
||||||
EmailFromName: 'Uat IRC Imaging System',
|
|
||||||
EmailAuthorizationCode: 'SHzyyl2021',
|
|
||||||
EmailSMTPServerAddress: 'smtp.qiye.aliyun.com',
|
|
||||||
EmailSMTPServerPort: 465,
|
|
||||||
IsConfigureEmail: true
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if(this.VUE_APP_OSS_PATH === '/test/dist'){
|
|
||||||
this.form= {
|
|
||||||
EmailFromEmail: 'test@extimaging.com',
|
|
||||||
EmailFromName: 'Test IRC Imaging System',
|
|
||||||
EmailAuthorizationCode: 'SHzyyl2021',
|
|
||||||
EmailSMTPServerAddress: 'smtp.qiye.aliyun.com',
|
|
||||||
EmailSMTPServerPort: 465,
|
|
||||||
IsConfigureEmail: true
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.trialId = this.$route.query.trialId
|
|
||||||
this.getTrialEmail()
|
|
||||||
this.getTrialCriterionList()
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
setTrialEmail() {
|
handleClick(a) {
|
||||||
this.$refs['emailRulesForm'].validate((valid) => {
|
this.activeName = a.name
|
||||||
if (!valid) {
|
|
||||||
// resolve(false)
|
|
||||||
} else {
|
|
||||||
this.form.TrialId = this.trialId
|
|
||||||
setTrialEmail(this.form).then(res => {
|
|
||||||
this.$message.success(this.$t('common:message:savedSuccessfully'))
|
|
||||||
this.isEdit = false
|
|
||||||
this.$refs['emailList'].getList()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
getTrialEmail() {
|
|
||||||
getTrialEmail({
|
|
||||||
TrialId: this.trialId
|
|
||||||
}).then(res => {
|
|
||||||
if (res.Result.IsConfigureEmail) {
|
|
||||||
this.form = Object.assign(this.form, res.Result)
|
|
||||||
this.isEdit = false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
getTrialCriterionList() {
|
|
||||||
this.loading = true
|
|
||||||
getTrialCriterionList(this.trialId, false).then(res => {
|
|
||||||
this.trialCriterionList = res.Result
|
|
||||||
// this.activeTab = this.trialCriterionList[0].TrialReadingCriterionId
|
|
||||||
this.loading = false
|
|
||||||
}).catch(() => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss">
|
|
||||||
.email-wrapper{
|
|
||||||
height: 100%;
|
|
||||||
background-color: #fff;
|
|
||||||
.el-tabs{
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.el-tabs__header {
|
|
||||||
height: 40px;
|
|
||||||
margin-bottom:5px;
|
|
||||||
}
|
|
||||||
.el-tabs__content{
|
|
||||||
flex: 1;
|
|
||||||
.el-tab-pane{
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.email-wrapper{
|
::v-deep .el-tabs__content {
|
||||||
height: 100%;
|
height: calc(100% - 60px);
|
||||||
background-color: #fff;
|
|
||||||
display: flex;
|
.el-tab-pane {
|
||||||
flex-direction: column;
|
height: 100%;
|
||||||
.content{
|
overflow: auto;
|
||||||
flex: 1;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
::v-deep.el-collapse-item__header{
|
|
||||||
background:#e5ecef;
|
|
||||||
padding-left:10px;
|
|
||||||
}
|
|
||||||
::v-deep.el-collapse-item__content{
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
.bottom{
|
|
||||||
height: 50px;
|
|
||||||
display:flex;
|
|
||||||
align-items:center;
|
|
||||||
justify-content:center;
|
|
||||||
text-align: center;
|
|
||||||
border-top: 1px solid #e1e1e1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
</style>
|
||||||
</style>
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue