fetch(add): 账户管理

This commit is contained in:
sexygoat
2026-01-23 17:18:24 +08:00
parent 339abca4c0
commit b53fea43c6
93 changed files with 7094 additions and 3153 deletions

View File

@@ -60,7 +60,13 @@
<template #default="scope">
<ElProgress
:percentage="scope.row.progress"
:status="scope.row.status === 'failed' ? 'exception' : scope.row.status === 'sent' ? 'success' : undefined"
:status="
scope.row.status === 'failed'
? 'exception'
: scope.row.status === 'sent'
? 'success'
: undefined
"
/>
</template>
</ElTableColumn>
@@ -131,7 +137,12 @@
>
<ElForm ref="formRef" :model="form" :rules="rules" label-width="120px">
<ElFormItem label="通知标题" prop="title">
<ElInput v-model="form.title" placeholder="请输入通知标题" maxlength="50" show-word-limit />
<ElInput
v-model="form.title"
placeholder="请输入通知标题"
maxlength="50"
show-word-limit
/>
</ElFormItem>
<ElFormItem label="通知类型" prop="type">
@@ -163,7 +174,12 @@
</ElFormItem>
<ElFormItem v-if="form.targetType === 'specific'" label="用户列表">
<ElSelect v-model="form.targetUsers" multiple placeholder="请选择目标用户" style="width: 100%">
<ElSelect
v-model="form.targetUsers"
multiple
placeholder="请选择目标用户"
style="width: 100%"
>
<ElOption label="张三 (13800138000)" value="user1" />
<ElOption label="李四 (13900139000)" value="user2" />
<ElOption label="王五 (13700137000)" value="user3" />
@@ -242,12 +258,19 @@
<ElTag v-else type="info">待发送</ElTag>
</ElDescriptionsItem>
<ElDescriptionsItem label="发送方式" :span="2">
<ElTag v-for="method in currentDetail.sendMethods" :key="method" size="small" style="margin-right: 4px">
<ElTag
v-for="method in currentDetail.sendMethods"
:key="method"
size="small"
style="margin-right: 4px"
>
{{ getSendMethodText(method) }}
</ElTag>
</ElDescriptionsItem>
<ElDescriptionsItem label="创建时间">{{ currentDetail.createTime }}</ElDescriptionsItem>
<ElDescriptionsItem label="发送时间">{{ currentDetail.sendTime || '-' }}</ElDescriptionsItem>
<ElDescriptionsItem label="发送时间">{{
currentDetail.sendTime || '-'
}}</ElDescriptionsItem>
<ElDescriptionsItem label="通知内容" :span="2">
{{ currentDetail.content }}
</ElDescriptionsItem>
@@ -530,14 +553,15 @@
<style lang="scss" scoped>
.page-content {
:deep(.is-loading) {
animation: rotating 2s linear infinite;
margin-right: 4px;
animation: rotating 2s linear infinite;
}
@keyframes rotating {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}

View File

@@ -21,7 +21,9 @@
</template>
</ElAlert>
<ElButton type="primary" :icon="Download" @click="downloadTemplate">下载导入模板</ElButton>
<ElButton type="primary" :icon="Download" @click="downloadTemplate"
>下载导入模板</ElButton
>
</ElCol>
<ElCol :xs="24" :lg="12">
@@ -44,7 +46,12 @@
</template>
</ElUpload>
<div style="margin-top: 16px; text-align: center">
<ElButton type="success" :loading="uploading" :disabled="!fileList.length" @click="submitUpload">
<ElButton
type="success"
:loading="uploading"
:disabled="!fileList.length"
@click="submitUpload"
>
开始导入
</ElButton>
<ElButton @click="clearFiles">清空</ElButton>
@@ -71,7 +78,9 @@
<div class="stat-label">成功绑定</div>
<div class="stat-value" style="color: var(--el-color-success)">1,180</div>
</div>
<el-icon class="stat-icon" style="color: var(--el-color-success)"><SuccessFilled /></el-icon>
<el-icon class="stat-icon" style="color: var(--el-color-success)"
><SuccessFilled
/></el-icon>
</ElCard>
</ElCol>
<ElCol :xs="24" :sm="12" :lg="6">
@@ -80,7 +89,9 @@
<div class="stat-label">导入失败</div>
<div class="stat-value" style="color: var(--el-color-danger)">70</div>
</div>
<el-icon class="stat-icon" style="color: var(--el-color-danger)"><CircleCloseFilled /></el-icon>
<el-icon class="stat-icon" style="color: var(--el-color-danger)"
><CircleCloseFilled
/></el-icon>
</ElCard>
</ElCol>
<ElCol :xs="24" :sm="12" :lg="6">
@@ -89,7 +100,9 @@
<div class="stat-label">成功率</div>
<div class="stat-value">94.4%</div>
</div>
<el-icon class="stat-icon" style="color: var(--el-color-warning)"><TrendCharts /></el-icon>
<el-icon class="stat-icon" style="color: var(--el-color-warning)"
><TrendCharts
/></el-icon>
</ElCard>
</ElCol>
</ElRow>
@@ -97,10 +110,15 @@
<!-- 导入记录 -->
<ElCard shadow="never" style="margin-top: 20px">
<template #header>
<div style="display: flex; justify-content: space-between; align-items: center">
<div style="display: flex; align-items: center; justify-content: space-between">
<span style="font-weight: 500">导入记录</span>
<div>
<ElSelect v-model="statusFilter" placeholder="状态筛选" style="width: 120px; margin-right: 12px" clearable>
<ElSelect
v-model="statusFilter"
placeholder="状态筛选"
style="width: 120px; margin-right: 12px"
clearable
>
<ElOption label="全部" value="" />
<ElOption label="处理中" value="processing" />
<ElOption label="完成" value="success" />
@@ -190,7 +208,10 @@
</ElDescriptions>
<ElDivider content-position="left">失败明细</ElDivider>
<div v-if="currentDetail.failReasons && currentDetail.failReasons.length" style="max-height: 300px; overflow-y: auto">
<div
v-if="currentDetail.failReasons && currentDetail.failReasons.length"
style="max-height: 300px; overflow-y: auto"
>
<ElTable :data="currentDetail.failReasons" border size="small">
<ElTableColumn label="行号" prop="row" width="80" />
<ElTableColumn label="设备编号" prop="deviceCode" width="150" />
@@ -202,7 +223,12 @@
<template #footer>
<ElButton @click="detailDialogVisible = false">关闭</ElButton>
<ElButton v-if="currentDetail.failCount > 0" type="primary" :icon="Download" @click="downloadFailData(currentDetail)">
<ElButton
v-if="currentDetail.failCount > 0"
type="primary"
:icon="Download"
@click="downloadFailData(currentDetail)"
>
下载失败数据
</ElButton>
</template>
@@ -303,7 +329,12 @@
importTime: '2026-01-07 10:15:00',
operator: 'operator01',
failReasons: [
{ row: 10, deviceCode: 'GPS001', iccid: '89860123456789012349', message: 'ICCID 已被其他设备绑定' },
{
row: 10,
deviceCode: 'GPS001',
iccid: '89860123456789012349',
message: 'ICCID 已被其他设备绑定'
},
{ row: 20, deviceCode: 'GPS002', iccid: '89860123456789012350', message: 'ICCID 状态异常' }
]
}
@@ -368,7 +399,12 @@
importTime: new Date().toLocaleString('zh-CN'),
operator: 'admin',
failReasons: [
{ row: 12, deviceCode: 'TEST001', iccid: '89860123456789012351', message: 'ICCID 不存在' },
{
row: 12,
deviceCode: 'TEST001',
iccid: '89860123456789012351',
message: 'ICCID 不存在'
},
{ row: 34, deviceCode: 'TEST002', iccid: '89860123456789012352', message: '设备类型无效' }
]
}
@@ -421,18 +457,18 @@
}
:deep(.el-icon--upload) {
margin-bottom: 16px;
font-size: 67px;
color: var(--el-text-color-placeholder);
margin-bottom: 16px;
}
:deep(.el-upload__text) {
color: var(--el-text-color-regular);
font-size: 14px;
color: var(--el-text-color-regular);
em {
color: var(--el-color-primary);
font-style: normal;
color: var(--el-color-primary);
}
}
@@ -444,6 +480,7 @@
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
@@ -459,9 +496,9 @@
.stat-content {
.stat-label {
margin-bottom: 8px;
font-size: 14px;
color: var(--el-text-color-secondary);
margin-bottom: 8px;
}
.stat-value {

View File

@@ -20,7 +20,9 @@
</template>
</ElAlert>
<ElButton type="primary" :icon="Download" @click="downloadTemplate">下载导入模板</ElButton>
<ElButton type="primary" :icon="Download" @click="downloadTemplate"
>下载导入模板</ElButton
>
</ElCol>
<ElCol :xs="24" :lg="12">
@@ -43,7 +45,12 @@
</template>
</ElUpload>
<div style="margin-top: 16px; text-align: center">
<ElButton type="success" :loading="uploading" :disabled="!fileList.length" @click="submitUpload">
<ElButton
type="success"
:loading="uploading"
:disabled="!fileList.length"
@click="submitUpload"
>
开始导入
</ElButton>
<ElButton @click="clearFiles">清空</ElButton>
@@ -56,7 +63,7 @@
<!-- 导入记录 -->
<ElCard shadow="never" style="margin-top: 20px">
<template #header>
<div style="display: flex; justify-content: space-between; align-items: center">
<div style="display: flex; align-items: center; justify-content: space-between">
<span style="font-weight: 500">导入记录</span>
<ElButton size="small" @click="refreshList">刷新</ElButton>
</div>
@@ -133,7 +140,11 @@
<ElDescriptionsItem label="操作人">{{ currentDetail.operator }}</ElDescriptionsItem>
<ElDescriptionsItem label="失败原因" :span="2">
<div v-if="currentDetail.failReasons && currentDetail.failReasons.length">
<div v-for="(reason, index) in currentDetail.failReasons" :key="index" style="margin-bottom: 4px">
<div
v-for="(reason, index) in currentDetail.failReasons"
:key="index"
style="margin-bottom: 4px"
>
<ElTag type="danger" size="small">{{ reason.row }}</ElTag>
{{ reason.message }}
</div>
@@ -292,7 +303,9 @@
importRecords.value.unshift(newRecord)
uploading.value = false
clearFiles()
ElMessage.success(`导入完成!成功 ${newRecord.successCount} 条,失败 ${newRecord.failCount}`)
ElMessage.success(
`导入完成!成功 ${newRecord.successCount} 条,失败 ${newRecord.failCount}`
)
}, 2000)
}
@@ -335,18 +348,18 @@
}
:deep(.el-icon--upload) {
margin-bottom: 16px;
font-size: 67px;
color: var(--el-text-color-placeholder);
margin-bottom: 16px;
}
:deep(.el-upload__text) {
color: var(--el-text-color-regular);
font-size: 14px;
color: var(--el-text-color-regular);
em {
color: var(--el-color-primary);
font-style: normal;
color: var(--el-color-primary);
}
}
@@ -358,6 +371,7 @@
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}