导出excel加上日期

This commit is contained in:
weiwei committed 2025-03-06 14:38:52 +08:00
1 parent 8bdf76ae3a
commit 5dce0acf8c
67 files changed
+2300 -2278

No files matched your search

+379 -355
View File
@@ -1,427 +1,451 @@
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row class="ml10" v-show="showSearch">
<el-form :inline="true" :model="state.queryForm" ref="queryRef">
<el-form-item :label="$t('job.jobName')" prop="jobName">
<el-input :placeholder="$t('job.inputjobNameTip')" @keyup.enter="getDataList" clearable
v-model="state.queryForm.jobName"/>
</el-form-item>
<el-form-item :label="t('job.jobStatus')" prop="jobStatus">
<el-select :placeholder="t('job.inputjobStatusTip')" v-model="state.queryForm.jobStatus">
<el-option :key="index" :label="item.label" :value="item.value"
v-for="(item, index) in job_status"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="t('job.jobExecuteStatus')" prop="jobExecuteStatus">
<el-select :placeholder="t('job.inputjobExecuteStatusTip')" v-model="state.queryForm.jobExecuteStatus">
<el-option :key="index" :label="item.label" :value="item.value"
v-for="(item, index) in job_execute_status"></el-option>
</el-select>
</el-form-item>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-row class="ml10" v-show="showSearch">
<el-form :inline="true" :model="state.queryForm" ref="queryRef">
<el-form-item :label="$t('job.jobName')" prop="jobName">
<el-input :placeholder="$t('job.inputjobNameTip')" @keyup.enter="getDataList" clearable v-model="state.queryForm.jobName" />
</el-form-item>
<el-form-item :label="t('job.jobStatus')" prop="jobStatus">
<el-select :placeholder="t('job.inputjobStatusTip')" v-model="state.queryForm.jobStatus">
<el-option :key="index" :label="item.label" :value="item.value" v-for="(item, index) in job_status"></el-option>
</el-select>
</el-form-item>
<el-form-item :label="t('job.jobExecuteStatus')" prop="jobExecuteStatus">
<el-select :placeholder="t('job.inputjobExecuteStatusTip')" v-model="state.queryForm.jobExecuteStatus">
<el-option :key="index" :label="item.label" :value="item.value" v-for="(item, index) in job_execute_status"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="getDataList" icon="Search" type="primary">{{ $t('common.queryBtn') }}</el-button>
<el-button @click="resetQuery" icon="Refresh">{{ $t('common.resetBtn') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button v-auth="'job_sys_job_add'" @click="formDialogRef.openDialog()" class="ml10" icon="folder-add"
type="primary">
{{ $t('common.addBtn') }}
</el-button>
<el-button plain v-auth="'job_sys_job_del'" :disabled="multiple" @click="handleDelete(undefined)" class="ml10"
icon="Delete" type="primary">
{{ $t('common.delBtn') }}
</el-button>
<right-toolbar
:export="'job_sys_job_add'"
@exportExcel="exportExcel"
@queryTable="getDataList"
class="ml10"
style="float: right; margin-right: 20px"
v-model:showSearch="showSearch"
>
<el-tooltip class="item" effect="dark" :content="$t('queryTree.view')" placement="top">
<el-button circle icon="Grid" @click="tableViewRef = !tableViewRef"></el-button>
</el-tooltip>
</right-toolbar>
</div>
</el-row>
<el-form-item>
<el-button @click="getDataList" icon="Search" type="primary">{{ $t("common.queryBtn") }}</el-button>
<el-button @click="resetQuery" icon="Refresh">{{ $t("common.resetBtn") }}</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button v-auth="'job_sys_job_add'" @click="formDialogRef.openDialog()" class="ml10" icon="folder-add" type="primary">
{{ $t("common.addBtn") }}
</el-button>
<el-button
plain
v-auth="'job_sys_job_del'"
:disabled="multiple"
@click="handleDelete(undefined)"
class="ml10"
icon="Delete"
type="primary"
>
{{ $t("common.delBtn") }}
</el-button>
<right-toolbar
:export="'job_sys_job_add'"
@exportExcel="exportExcel"
@queryTable="getDataList"
class="ml10"
style="float: right; margin-right: 20px"
v-model:showSearch="showSearch"
>
<el-tooltip class="item" effect="dark" :content="$t('queryTree.view')" placement="top">
<el-button circle icon="Grid" @click="tableViewRef = !tableViewRef"></el-button>
</el-tooltip>
</right-toolbar>
</div>
</el-row>
<!-- 表格视图 -->
<el-table
v-if="tableViewRef"
:data="state.dataList"
@selection-change="handleSelectionChange"
style="width: 100%"
row-key="jobId"
v-loading="state.loading"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column align="center" type="selection" width="40"/>
<el-table-column :label="t('job.index')" fixed="left" type="index" width="60"/>
<el-table-column :label="t('job.jobName')" fixed="left" prop="jobName" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.jobGroup')" prop="jobGroup" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.jobStatus')" prop="jobStatus" show-overflow-tooltip width="120">
<template #default="scope">
<dict-tag :options="job_status" :value="scope.row.jobStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="t('job.jobExecuteStatus')" prop="jobExecuteStatus" show-overflow-tooltip width="120">
<template #default="scope">
<dict-tag :options="job_execute_status" :value="scope.row.jobExecuteStatus"></dict-tag>
</template>
</el-table-column>
<!-- 表格视图 -->
<el-table
v-if="tableViewRef"
:data="state.dataList"
@selection-change="handleSelectionChange"
style="width: 100%"
row-key="jobId"
v-loading="state.loading"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
>
<el-table-column align="center" type="selection" width="40" />
<el-table-column :label="t('job.index')" fixed="left" type="index" width="60" />
<el-table-column :label="t('job.jobName')" fixed="left" prop="jobName" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.jobGroup')" prop="jobGroup" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.jobStatus')" prop="jobStatus" show-overflow-tooltip width="120">
<template #default="scope">
<dict-tag :options="job_status" :value="scope.row.jobStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="t('job.jobExecuteStatus')" prop="jobExecuteStatus" show-overflow-tooltip width="120">
<template #default="scope">
<dict-tag :options="job_execute_status" :value="scope.row.jobExecuteStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="t('job.startTime')" prop="startTime" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.startTime')" prop="startTime" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.previousTime')" prop="previousTime" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.nextTime')" prop="nextTime" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.jobType')" prop="jobType" show-overflow-tooltip width="120">
<template #default="scope">
<dict-tag :options="job_type" :value="scope.row.jobType"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="t('job.executePath')" prop="executePath" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.className')" prop="className" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.methodName')" prop="methodName" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.methodParamsValue')" prop="methodParamsValue" show-overflow-tooltip
width="120"/>
<el-table-column :label="t('job.cronExpression')" prop="cronExpression" show-overflow-tooltip width="120"/>
<el-table-column :label="t('job.misfirePolicy')" prop="misfirePolicy" show-overflow-tooltip width="200">
<template #default="scope">
<dict-tag :options="misfire_policy" :value="scope.row.misfirePolicy"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="$t('common.action')" fixed="right" width="300">
<template #default="scope">
<el-button @click="handleJobLog(scope.row)" text type="primary">{{ $t('job.jobLogBtn') }}</el-button>
<el-table-column :label="t('job.previousTime')" prop="previousTime" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.nextTime')" prop="nextTime" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.jobType')" prop="jobType" show-overflow-tooltip width="120">
<template #default="scope">
<dict-tag :options="job_type" :value="scope.row.jobType"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="t('job.executePath')" prop="executePath" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.className')" prop="className" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.methodName')" prop="methodName" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.methodParamsValue')" prop="methodParamsValue" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.cronExpression')" prop="cronExpression" show-overflow-tooltip width="120" />
<el-table-column :label="t('job.misfirePolicy')" prop="misfirePolicy" show-overflow-tooltip width="200">
<template #default="scope">
<dict-tag :options="misfire_policy" :value="scope.row.misfirePolicy"></dict-tag>
</template>
</el-table-column>
<el-table-column :label="$t('common.action')" fixed="right" width="300">
<template #default="scope">
<el-button @click="handleJobLog(scope.row)" text type="primary">{{ $t("job.jobLogBtn") }}</el-button>
<el-button v-auth="'job_sys_job_start_job'" @click="handleStartJob(scope.row)" text type="primary"
v-if="scope.row.jobStatus !== '2'"
>
{{ $t('job.jobStartBtn') }}
</el-button>
<el-button
v-auth="'job_sys_job_start_job'"
@click="handleStartJob(scope.row)"
text
type="primary"
v-if="scope.row.jobStatus !== '2'"
>
{{ $t("job.jobStartBtn") }}
</el-button>
<el-button
v-auth="'job_sys_job_shutdown_job'"
@click="handleShutDownJob(scope.row)"
text
type="primary"
v-if="scope.row.jobStatus === '2'"
>
{{ $t('job.jobPauseBtn') }}
</el-button>
<el-button
v-auth="'job_sys_job_shutdown_job'"
@click="handleShutDownJob(scope.row)"
text
type="primary"
v-if="scope.row.jobStatus === '2'"
>
{{ $t("job.jobPauseBtn") }}
</el-button>
<el-button v-auth="'job_sys_job_edit'" @click="handleEditJob(scope.row)" text type="primary">
{{ $t('common.editBtn') }}
</el-button>
<el-button v-auth="'job_sys_job_edit'" @click="handleEditJob(scope.row)" text type="primary">
{{ $t("common.editBtn") }}
</el-button>
<el-button v-auth="'job_sys_job_start_job'" @click="handleRunJob(scope.row)" text type="primary">
{{ $t('job.jobRunBtn') }}
</el-button>
<el-button v-auth="'job_sys_job_start_job'" @click="handleRunJob(scope.row)" text type="primary">
{{ $t("job.jobRunBtn") }}
</el-button>
<el-button v-auth="'job_sys_job_del'" @click="handleDelete(scope.row)" text type="primary"
:disabled="scope.row.jobStatus === '2'">{{ $t('common.delBtn') }}
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 卡片视图 -->
<el-scrollbar v-if="!tableViewRef">
<div class="p-4">
<div class="mx-auto">
<!-- Main -->
<div class="grid grid-cols-4 gap-x-4 gap-y-6">
<div
v-for="job in state.dataList"
:key="job.jobId"
class="w-full max-w-sm mt-2 bg-gray-100 dark:bg-[#1d1e1f] rounded-lg border dark:border-[#303030]"
>
<div aria-label="header" class="flex items-center p-4 space-x-4">
<div aria-label="avatar" class="flex items-center mr-auto space-x-4">
<div class="flex flex-col flex-1 space-y-2">
<div class="text-lg font-bold text-gray-900 dark:text-gray-100">
{{ job.jobName }}
</div>
<p class="text-base font-normal text-gray-500 truncate dark:text-gray-400">
{{ job.jobGroup }} / {{ job_type.find((item: any) => item.value === job.jobType)?.label }}
</p>
</div>
</div>
</div>
<div aria-label="navigation" class="py-2">
<nav class="grid gap-1">
<div class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md">
<span class="font-medium">{{ $t('job.jobStatus') }}:</span>
<span>{{ job_status.find((item: any) => item.value === job.jobStatus)?.label }}</span>
</div>
<div class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md">
<span class="font-medium">{{ $t('job.cronExpression') }}:</span>
<span>{{ job.cronExpression }}</span>
</div>
<div class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md">
<span class="font-medium">{{ $t('job.previousTime') }}:</span>
<span>{{ job.previousTime }}</span>
</div>
<div class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md">
<span class="font-medium">{{ $t('job.nextTime') }}:</span>
<span>{{ job.nextTime }}</span>
</div>
<div class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md">
<span class="font-medium">{{ $t('job.jobExecuteStatus') }}:</span>
<span>
<el-icon v-if="job.jobExecuteStatus === '1'"><CircleCloseFilled/></el-icon>
<el-icon v-if="job.jobExecuteStatus === '0'"><CircleCheckFilled/></el-icon>
</span>
</div>
</nav>
</div>
<div aria-label="footer" class="pt-2 border-t dark:border-[#303030]">
<div class="flex items-center justify-center min-w-full">
<nav class="flex">
<a
@click="handleJobLog(job)"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t('job.jobLogBtn') }}</span>
</a>
<a
v-auth="'job_sys_job_start_job'"
@click="handleStartJob(job)"
v-if="job.jobStatus !== '2'"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t('job.jobStartBtn') }}</span>
</a>
<a
v-auth="'job_sys_job_shutdown_job'"
@click="handleShutDownJob(job)"
v-if="job.jobStatus === '2'"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t('job.jobPauseBtn') }}</span>
</a>
<a
v-auth="'job_sys_job_edit'" @click="handleEditJob(job)"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span> {{ $t('common.editBtn') }}</span>
</a>
<a
v-auth="'job_sys_job_start_job'" @click="handleRunJob(job)"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t('job.jobRunBtn') }}</span>
</a>
<el-button
v-auth="'job_sys_job_del'"
@click="handleDelete(scope.row)"
text
type="primary"
:disabled="scope.row.jobStatus === '2'"
>{{ $t("common.delBtn") }}
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 卡片视图 -->
<el-scrollbar v-if="!tableViewRef">
<div class="p-4">
<div class="mx-auto">
<!-- Main -->
<div class="grid grid-cols-4 gap-x-4 gap-y-6">
<div
v-for="job in state.dataList"
:key="job.jobId"
class="w-full max-w-sm mt-2 bg-gray-100 dark:bg-[#1d1e1f] rounded-lg border dark:border-[#303030]"
>
<div aria-label="header" class="flex items-center p-4 space-x-4">
<div aria-label="avatar" class="flex items-center mr-auto space-x-4">
<div class="flex flex-col flex-1 space-y-2">
<div class="text-lg font-bold text-gray-900 dark:text-gray-100">
{{ job.jobName }}
</div>
<p class="text-base font-normal text-gray-500 truncate dark:text-gray-400">
{{ job.jobGroup }} / {{ job_type.find((item: any) => item.value === job.jobType)?.label }}
</p>
</div>
</div>
</div>
<div aria-label="navigation" class="py-2">
<nav class="grid gap-1">
<div
class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md"
>
<span class="font-medium">{{ $t("job.jobStatus") }}:</span>
<span>{{ job_status.find((item: any) => item.value === job.jobStatus)?.label }}</span>
</div>
<div
class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md"
>
<span class="font-medium">{{ $t("job.cronExpression") }}:</span>
<span>{{ job.cronExpression }}</span>
</div>
<div
class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md"
>
<span class="font-medium">{{ $t("job.previousTime") }}:</span>
<span>{{ job.previousTime }}</span>
</div>
<div
class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md"
>
<span class="font-medium">{{ $t("job.nextTime") }}:</span>
<span>{{ job.nextTime }}</span>
</div>
<div
class="flex items-center w-full px-4 py-1 space-x-3 leading-6 text-gray-600 dark:text-gray-300 hover:bg-white dark:hover:bg-[#303030] rounded-md"
>
<span class="font-medium">{{ $t("job.jobExecuteStatus") }}:</span>
<span>
<el-icon v-if="job.jobExecuteStatus === '1'"><CircleCloseFilled /></el-icon>
<el-icon v-if="job.jobExecuteStatus === '0'"><CircleCheckFilled /></el-icon>
</span>
</div>
</nav>
</div>
<div aria-label="footer" class="pt-2 border-t dark:border-[#303030]">
<div class="flex items-center justify-center min-w-full">
<nav class="flex">
<a
@click="handleJobLog(job)"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t("job.jobLogBtn") }}</span>
</a>
<a
v-auth="'job_sys_job_start_job'"
@click="handleStartJob(job)"
v-if="job.jobStatus !== '2'"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t("job.jobStartBtn") }}</span>
</a>
<a
v-auth="'job_sys_job_shutdown_job'"
@click="handleShutDownJob(job)"
v-if="job.jobStatus === '2'"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t("job.jobPauseBtn") }}</span>
</a>
<a
v-auth="'job_sys_job_edit'"
@click="handleEditJob(job)"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span> {{ $t("common.editBtn") }}</span>
</a>
<a
v-auth="'job_sys_job_start_job'"
@click="handleRunJob(job)"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t("job.jobRunBtn") }}</span>
</a>
<a
v-auth="'job_sys_job_del'" @click="handleDelete(job)" type="primary"
v-if="job.jobStatus !== '2'"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t('common.delBtn') }}</span>
</a>
</nav>
</div>
</div>
</div>
</div>
</div>
<a
v-auth="'job_sys_job_del'"
@click="handleDelete(job)"
type="primary"
v-if="job.jobStatus !== '2'"
href="javascript:;"
class="px-2 py-2 text-primary hover:text-primary-400 dark:text-primary-300"
>
<span>{{ $t("common.delBtn") }}</span>
</a>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</el-scrollbar>
</div>
</el-scrollbar>
<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination" />
</div>
<pagination @current-change="currentChangeHandle" @size-change="sizeChangeHandle" v-bind="state.pagination"/>
</div>
<!-- 编辑、新增 -->
<form-dialog @refresh="getDataList()" ref="formDialogRef"/>
<job-log ref="jobLogRef"></job-log>
</div>
<!-- 编辑、新增 -->
<form-dialog @refresh="getDataList()" ref="formDialogRef" />
<job-log ref="jobLogRef"></job-log>
</div>
</template>
<script lang="ts" name="systemSysJob" setup>
import {BasicTableProps, useTable} from '/@/hooks/table';
import {delObj, fetchList, runJobRa, shutDownJobRa, startJobRa} from '/@/api/daemon/job';
import {useMessage, useMessageBox} from '/@/hooks/message';
import {useDict} from '/@/hooks/dict';
import {useI18n} from 'vue-i18n';
import { BasicTableProps, useTable } from "/@/hooks/table"
import { delObj, fetchList, runJobRa, shutDownJobRa, startJobRa } from "/@/api/daemon/job"
import { useMessage, useMessageBox } from "/@/hooks/message"
import { useDict } from "/@/hooks/dict"
import { useI18n } from "vue-i18n"
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const JobLog = defineAsyncComponent(() => import('./job-log.vue'));
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
const JobLog = defineAsyncComponent(() => import("./job-log.vue"))
// 获取国际化方法
const {t} = useI18n();
const { t } = useI18n()
/** 表单弹窗引用 */
const formDialogRef = ref();
const formDialogRef = ref()
/** 作业日志引用 */
const jobLogRef = ref();
const jobLogRef = ref()
/** 表格视图 */
const tableViewRef = ref(false)
/** 搜索表单信息 */
const queryForm = reactive({
jobName: '',
jobGroup: '',
jobStatus: '',
jobExecuteStatus: '',
});
jobName: "",
jobGroup: "",
jobStatus: "",
jobExecuteStatus: "",
})
/** 是否展示搜索表单 */
const showSearch = ref(true);
const showSearch = ref(true)
// 多选变量
/** 选中的行 */
const selectedRows = ref([]);
const selectedRows = ref([])
/** 是否可以多选 */
const multiple = ref(true);
const multiple = ref(true)
/** 查询字典 */
const {
job_status,
job_execute_status,
misfire_policy,
job_type
} = useDict('job_status', 'job_execute_status', 'misfire_policy', 'job_type');
const { job_status, job_execute_status, misfire_policy, job_type } = useDict(
"job_status",
"job_execute_status",
"misfire_policy",
"job_type",
)
/** 表格状态变量 */
const state = reactive<BasicTableProps>({
queryForm,
pageList: fetchList,
pagination: {
size: 8,
pageSizes: [4, 8, 12]
}
});
queryForm,
pageList: fetchList,
pagination: {
size: 8,
pageSizes: [4, 8, 12],
},
})
/** 获取表格数据方法 */
const {getDataList, currentChangeHandle, sizeChangeHandle, downBlobFile, tableStyle} = useTable(state);
const { getDataList, currentChangeHandle, sizeChangeHandle, downBlobFile, tableStyle } = useTable(state)
/** 重置查询表单 */
const resetQuery = () => {
Object.keys(queryForm).forEach((key) => (queryForm[key] = ''));
getDataList();
};
Object.keys(queryForm).forEach((key) => (queryForm[key] = ""))
getDataList()
}
/** 行选中事件 */
const handleSelectionChange = (rows: any) => {
selectedRows.value = rows;
multiple.value = !rows.length;
};
selectedRows.value = rows
multiple.value = !rows.length
}
/** 导出Excel */
const exportExcel = () => {
downBlobFile('/job/sys-job/export', Object.assign(state.queryForm, {ids: selectedRows}), 'job.xlsx');
};
downBlobFile("/job/sys-job/export", Object.assign(state.queryForm, { ids: selectedRows }), "Quartz管理.xlsx")
}
/** 查看作业日志 */
const handleJobLog = (row) => {
jobLogRef.value.openDialog(row.jobId);
};
jobLogRef.value.openDialog(row.jobId)
}
/** 编辑作业 */
const handleEditJob = (row) => {
const jobStatus = row.jobStatus;
if (jobStatus === '1' || jobStatus === '3') {
formDialogRef.value.openDialog(row.jobId);
} else {
useMessage().error('运行中定时任务不可修改,请先暂停后操作');
}
};
const jobStatus = row.jobStatus
if (jobStatus === "1" || jobStatus === "3") {
formDialogRef.value.openDialog(row.jobId)
} else {
useMessage().error("运行中定时任务不可修改,请先暂停后操作")
}
}
/** 启动作业 */
const handleStartJob = async (row) => {
const jobStatus = row.jobStatus;
if (jobStatus === '1' || jobStatus === '3') {
try {
await useMessageBox().confirm(`即将发布或启动(任务名称: ${row.jobName}), 是否继续?`);
} catch {
return;
}
const jobStatus = row.jobStatus
if (jobStatus === "1" || jobStatus === "3") {
try {
await useMessageBox().confirm(`即将发布或启动(任务名称: ${row.jobName}), 是否继续?`)
} catch {
return
}
try {
await startJobRa(row.jobId);
getDataList();
useMessage().success(t('common.optSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
} else {
useMessage().error('定时任务已运行');
}
};
try {
await startJobRa(row.jobId)
getDataList()
useMessage().success(t("common.optSuccessText"))
} catch (err: any) {
useMessage().error(err.msg)
}
} else {
useMessage().error("定时任务已运行")
}
}
/** 暂停作业 */
const handleShutDownJob = async (row) => {
const jobStatus = row.jobStatus;
if (jobStatus === '2') {
try {
await useMessageBox().confirm(`即将暂停(任务名称: ${row.jobName}), 是否继续?`);
} catch {
return;
}
const jobStatus = row.jobStatus
if (jobStatus === "2") {
try {
await useMessageBox().confirm(`即将暂停(任务名称: ${row.jobName}), 是否继续?`)
} catch {
return
}
try {
await shutDownJobRa(row.jobId);
getDataList();
useMessage().success(t('common.optSuccessText'));
} catch (err: any) {
useMessage().error(err.msg);
}
} else {
useMessage().error('已暂停,不要重复操作');
}
};
try {
await shutDownJobRa(row.jobId)
getDataList()
useMessage().success(t("common.optSuccessText"))
} catch (err: any) {
useMessage().error(err.msg)
}
} else {
useMessage().error("已暂停,不要重复操作")
}
}
/** 运行作业 */
const handleRunJob = async (row) => {
try {
await useMessageBox().confirm(`立刻执行一次任务(任务名称: ${row.jobName}), 是否继续?`);
} catch {
return;
}
try {
await useMessageBox().confirm(`立刻执行一次任务(任务名称: ${row.jobName}), 是否继续?`)
} catch {
return
}
try {
await runJobRa(row.jobId);
getDataList();
useMessage().success(t('common.optSuccessText'));
} catch (err: any) {
useMessage().error('运行失败');
}
};
try {
await runJobRa(row.jobId)
getDataList()
useMessage().success(t("common.optSuccessText"))
} catch (err: any) {
useMessage().error("运行失败")
}
}
/** 删除操作 */
const handleDelete = async (row) => {
if (!row) {
selectedRows.value.forEach(handleDelete);
return;
}
if (!row) {
selectedRows.value.forEach(handleDelete)
return
}
const {jobId, jobName} = row;
try {
await useMessageBox().confirm(`${t('common.delConfirmText')}(任务名称:${jobName})`);
} catch {
return;
}
const { jobId, jobName } = row
try {
await useMessageBox().confirm(`${t("common.delConfirmText")}(任务名称:${jobName})`)
} catch {
return
}
try {
await delObj(jobId);
getDataList();
useMessage().success(t('common.delSuccessText'));
} catch (error: any) {
useMessage().error('删除失败');
}
};
try {
await delObj(jobId)
getDataList()
useMessage().success(t("common.delSuccessText"))
} catch (error: any) {
useMessage().error("删除失败")
}
}
</script>
+110 -117
View File
@@ -1,89 +1,90 @@
<template>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="业务名称" prop="configName">
<el-input placeholder="请输入业务名称" v-model="state.queryForm.configName"/>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
查询
</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()"
v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary"
v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar v-model:showSearch="showSearch" :export="'admin_sysMessage_export'"
@exportExcel="exportExcel" class="ml10 mr20" style="float: right;"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" border
:cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" label="#" width="40"/>
<el-table-column prop="configName" label="业务名称" show-overflow-tooltip/>
<el-table-column prop="configKey" label="业务标识" show-overflow-tooltip/>
<el-table-column prop="configValue.supplier" label="服务地址" show-overflow-tooltip>
<template #default="scope">
{{ JSON.parse(scope.row.configValue).smtpServer }}
</template>
</el-table-column>
<el-table-column prop="configStatus" label="启用状态" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.configStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" v-auth="'sys_message_edit'"
@click="senderDialogRef.openDialog(scope.row.id)">测试
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'sys_message_edit'"
@click="formDialogRef.openDialog(scope.row.id)">编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'"
@click="handleDelete([scope.row.id])">删除
</el-button>
<el-button icon="Tickets" text type="primary" v-auth="'sys_message_del'"
@click="handleLog">日志
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination"/>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="业务名称" prop="configName">
<el-input placeholder="请输入业务名称" v-model="state.queryForm.configName" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList"> 查询 </el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary" v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar
v-model:showSearch="showSearch"
:export="'admin_sysMessage_export'"
@exportExcel="exportExcel"
class="ml10 mr20"
style="float: right"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" label="#" width="40" />
<el-table-column prop="configName" label="业务名称" show-overflow-tooltip />
<el-table-column prop="configKey" label="业务标识" show-overflow-tooltip />
<el-table-column prop="configValue.supplier" label="服务地址" show-overflow-tooltip>
<template #default="scope">
{{ JSON.parse(scope.row.configValue).smtpServer }}
</template>
</el-table-column>
<el-table-column prop="configStatus" label="启用状态" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.configStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" v-auth="'sys_message_edit'" @click="senderDialogRef.openDialog(scope.row.id)"
>测试
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'sys_message_edit'" @click="formDialogRef.openDialog(scope.row.id)"
>编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'" @click="handleDelete([scope.row.id])">删除 </el-button>
<el-button icon="Tickets" text type="primary" v-auth="'sys_message_del'" @click="handleLog">日志 </el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)"/>
<sender-dialog ref="senderDialogRef"/>
</div>
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
<sender-dialog ref="senderDialogRef" />
</div>
</template>
<script setup lang="ts" name="systemEmailMessage">
import {BasicTableProps, useTable} from "/@/hooks/table";
import {delObjs, fetchList} from "/@/api/admin/config";
import {useMessage, useMessageBox} from "/@/hooks/message";
import {useDict} from '/@/hooks/dict';
import { BasicTableProps, useTable } from "/@/hooks/table"
import { delObjs, fetchList } from "/@/api/admin/config"
import { useMessage, useMessageBox } from "/@/hooks/message"
import { useDict } from "/@/hooks/dict"
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const SenderDialog = defineAsyncComponent(() => import('./sender.vue'));
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
const SenderDialog = defineAsyncComponent(() => import("./sender.vue"))
// 定义查询字典
const {yes_no_type} = useDict('yes_no_type')
const { yes_no_type } = useDict("yes_no_type")
// 定义变量内容
const formDialogRef = ref()
const senderDialogRef = ref()
@@ -96,64 +97,56 @@ const selectObjs = ref([]) as any
const multiple = ref(true)
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {
configType: 'email',
configName: ''
},
pageList: fetchList
queryForm: {
configType: "email",
configName: "",
},
pageList: fetchList,
})
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile,
tableStyle
} = useTable(state)
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 导出excel
const exportExcel = () => {
downBlobFile('/admin/sysMessage/export', Object.assign(state.queryForm, {ids: selectObjs}), 'sysMessage.xlsx')
downBlobFile("/admin/sysMessage/export", Object.assign(state.queryForm, { ids: selectObjs }), "信息推送-邮件.xlsx")
}
// 多选事件
const selectionChangHandle = (objs: { id: string }[]) => {
selectObjs.value = objs.map(({id}) => id);
multiple.value = !objs.length;
};
selectObjs.value = objs.map(({ id }) => id)
multiple.value = !objs.length
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm('此操作将永久删除');
} catch {
return;
}
try {
await useMessageBox().confirm("此操作将永久删除")
} catch {
return
}
try {
await delObjs(ids);
getDataList();
useMessage().success('删除成功');
} catch (err: any) {
useMessage().error(err.msg);
}
};
// 跳转日志
const router = useRouter();
const handleLog = () => {
router.push({path: '/admin/log/index', query: {serviceId: 'email'}})
try {
await delObjs(ids)
getDataList()
useMessage().success("删除成功")
} catch (err: any) {
useMessage().error(err.msg)
}
}
// 跳转日志
const router = useRouter()
const handleLog = () => {
router.push({ path: "/admin/log/index", query: { serviceId: "email" } })
}
</script>
+146 -135
View File
@@ -1,103 +1,121 @@
<template>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="标题" prop="title">
<el-input placeholder="请输入标题" v-model="state.queryForm.title"/>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
查询
</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()"
v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary"
v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar v-model:showSearch="showSearch" :export="'admin_sysMessage_export'"
@exportExcel="exportExcel" class="ml10 mr20" style="float: right;"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" border
:cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" label="#" width="40"/>
<el-table-column prop="category" label="分类" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="message_type" :value="scope.row.category"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="title" label="标题" show-overflow-tooltip/>
<el-table-column prop="allFlag" label="全部通知" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.allFlag"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="sendFlag" label="已发送" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.sendFlag"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="sort" label="排序" show-overflow-tooltip/>
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" @click="contentRef.openDialog(scope.row)">详情
</el-button>
<el-button icon="BellFilled" text type="primary" v-auth="'sys_message_edit'"
v-if="scope.row.sendFlag !== '1'"
@click="handleSend(scope.row.id)">群发
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'sys_message_edit'"
v-if="scope.row.sendFlag === '0'"
@click="formDialogRef.openDialog(scope.row.id)">编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'"
@click="handleDelete([scope.row.id])">删除
</el-button>
<el-button icon="List" text type="primary" v-auth="'sys_message_edit'"
v-if="scope.row.sendFlag === '1'"
@click="receiveRef.openDialog(scope.row.id)">接收情况
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination"/>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="标题" prop="title">
<el-input placeholder="请输入标题" v-model="state.queryForm.title" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList"> 查询 </el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary" v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar
v-model:showSearch="showSearch"
:export="'admin_sysMessage_export'"
@exportExcel="exportExcel"
class="ml10 mr20"
style="float: right"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" label="#" width="40" />
<el-table-column prop="category" label="分类" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="message_type" :value="scope.row.category"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="title" label="标题" show-overflow-tooltip />
<el-table-column prop="allFlag" label="全部通知" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.allFlag"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="sendFlag" label="已发送" show-overflow-tooltip>
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.sendFlag"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="sort" label="排序" show-overflow-tooltip />
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" @click="contentRef.openDialog(scope.row)">详情 </el-button>
<el-button
icon="BellFilled"
text
type="primary"
v-auth="'sys_message_edit'"
v-if="scope.row.sendFlag !== '1'"
@click="handleSend(scope.row.id)"
>群发
</el-button>
<el-button
icon="edit-pen"
text
type="primary"
v-auth="'sys_message_edit'"
v-if="scope.row.sendFlag === '0'"
@click="formDialogRef.openDialog(scope.row.id)"
>编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'" @click="handleDelete([scope.row.id])">删除 </el-button>
<el-button
icon="List"
text
type="primary"
v-auth="'sys_message_edit'"
v-if="scope.row.sendFlag === '1'"
@click="receiveRef.openDialog(scope.row.id)"
>接收情况
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)"/>
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
<!-- 消息内容 -->
<news-content ref="contentRef"/>
<!-- 消息内容 -->
<news-content ref="contentRef" />
<!-- 接收列表 -->
<receive ref="receiveRef"/>
</div>
<!-- 接收列表 -->
<receive ref="receiveRef" />
</div>
</template>
<script setup lang="ts" name="systemSysMessage">
import {BasicTableProps, useTable} from "/@/hooks/table";
import {delObjs, fetchList, sendObj} from "/@/api/admin/message";
import {useMessage, useMessageBox} from "/@/hooks/message";
import {useDict} from '/@/hooks/dict';
import { BasicTableProps, useTable } from "/@/hooks/table"
import { delObjs, fetchList, sendObj } from "/@/api/admin/message"
import { useMessage, useMessageBox } from "/@/hooks/message"
import { useDict } from "/@/hooks/dict"
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const Receive = defineAsyncComponent(() => import('./receive.vue'));
const NewsContent = defineAsyncComponent(() => import('/@/views/home/news/content.vue'));
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
const Receive = defineAsyncComponent(() => import("./receive.vue"))
const NewsContent = defineAsyncComponent(() => import("/@/views/home/news/content.vue"))
// 定义查询字典
const {message_type, yes_no_type} = useDict('message_type', 'yes_no_type')
const { message_type, yes_no_type } = useDict("message_type", "yes_no_type")
// 定义变量内容
const formDialogRef = ref()
// 搜索变量
@@ -110,71 +128,64 @@ const selectObjs = ref([]) as any
const multiple = ref(true)
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {},
pageList: fetchList
queryForm: {},
pageList: fetchList,
})
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile,
tableStyle
} = useTable(state)
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 导出excel
const exportExcel = () => {
downBlobFile('/admin/sysMessage/export', Object.assign(state.queryForm, {ids: selectObjs}), 'sysMessage.xlsx')
downBlobFile("/admin/sysMessage/export", Object.assign(state.queryForm, { ids: selectObjs }), "信息推送-站内信.xlsx")
}
// 多选事件
const selectionChangHandle = (objs: { id: string }[]) => {
selectObjs.value = objs.map(({id}) => id);
multiple.value = !objs.length;
};
selectObjs.value = objs.map(({ id }) => id)
multiple.value = !objs.length
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm('此操作将永久删除');
} catch {
return;
}
try {
await useMessageBox().confirm("此操作将永久删除")
} catch {
return
}
try {
await delObjs(ids);
getDataList();
useMessage().success('删除成功');
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await delObjs(ids)
getDataList()
useMessage().success("删除成功")
} catch (err: any) {
useMessage().error(err.msg)
}
}
// 推送给目标用户
const handleSend = async (id: string) => {
try {
await useMessageBox().confirm('此操作将消息推送给目标用户');
} catch {
return;
}
try {
await useMessageBox().confirm("此操作将消息推送给目标用户")
} catch {
return
}
try {
await sendObj({id: id});
getDataList();
useMessage().success('推送成功');
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await sendObj({ id: id })
getDataList()
useMessage().success("推送成功")
} catch (err: any) {
useMessage().error(err.msg)
}
}
</script>
+108 -113
View File
@@ -1,87 +1,89 @@
<template>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="业务名称" prop="configName">
<el-input placeholder="请输入业务名称" v-model="state.queryForm.configName"/>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
查询
</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()"
v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary"
v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar v-model:showSearch="showSearch" :export="'admin_sysMessage_export'"
@exportExcel="exportExcel" class="ml10 mr20" style="float: right;"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" border
:cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" label="#" width="40"/>
<el-table-column prop="configName" label="业务名称" show-overflow-tooltip/>
<el-table-column prop="configKey" label="业务标识" show-overflow-tooltip/>
<el-table-column prop="configValue.supplier" label="厂商" show-overflow-tooltip>
<template #default="scope">
{{ formDialogRef?.supplierList.find((item: any) => item.value === JSON.parse(scope.row.configValue).supplier)?.label}}
</template>
</el-table-column>
<el-table-column prop="configStatus" label="启用状态" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.configStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" v-auth="'sys_message_edit'"
@click="senderDialogRef.openDialog(scope.row.id)">测试
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'sys_message_edit'"
@click="formDialogRef.openDialog(scope.row.id)">编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'"
@click="handleDelete([scope.row.id])">删除
</el-button>
<el-button icon="Tickets" text type="primary" v-auth="'sys_message_del'"
@click="handleLog">日志
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination"/>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="业务名称" prop="configName">
<el-input placeholder="请输入业务名称" v-model="state.queryForm.configName" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList"> 查询 </el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary" v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar
v-model:showSearch="showSearch"
:export="'admin_sysMessage_export'"
@exportExcel="exportExcel"
class="ml10 mr20"
style="float: right"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" label="#" width="40" />
<el-table-column prop="configName" label="业务名称" show-overflow-tooltip />
<el-table-column prop="configKey" label="业务标识" show-overflow-tooltip />
<el-table-column prop="configValue.supplier" label="厂商" show-overflow-tooltip>
<template #default="scope">
{{ formDialogRef?.supplierList.find((item: any) => item.value === JSON.parse(scope.row.configValue).supplier)?.label }}
</template>
</el-table-column>
<el-table-column prop="configStatus" label="启用状态" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.configStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" v-auth="'sys_message_edit'" @click="senderDialogRef.openDialog(scope.row.id)"
>测试
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'sys_message_edit'" @click="formDialogRef.openDialog(scope.row.id)"
>编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'" @click="handleDelete([scope.row.id])">删除 </el-button>
<el-button icon="Tickets" text type="primary" v-auth="'sys_message_del'" @click="handleLog">日志 </el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)"/>
<sender-dialog ref="senderDialogRef"/>
</div>
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
<sender-dialog ref="senderDialogRef" />
</div>
</template>
<script setup lang="ts" name="systemSmsMessage">
import {BasicTableProps, useTable} from "/@/hooks/table";
import {delObjs, fetchList} from "/@/api/admin/config";
import {useMessage, useMessageBox} from "/@/hooks/message";
import {useDict} from '/@/hooks/dict';
import { BasicTableProps, useTable } from "/@/hooks/table"
import { delObjs, fetchList } from "/@/api/admin/config"
import { useMessage, useMessageBox } from "/@/hooks/message"
import { useDict } from "/@/hooks/dict"
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const SenderDialog = defineAsyncComponent(() => import('./sender.vue'));
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
const SenderDialog = defineAsyncComponent(() => import("./sender.vue"))
// 定义查询字典
const {yes_no_type} = useDict('yes_no_type')
const { yes_no_type } = useDict("yes_no_type")
// 定义变量内容
const formDialogRef = ref()
const senderDialogRef = ref()
@@ -93,63 +95,56 @@ const selectObjs = ref([]) as any
const multiple = ref(true)
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {
configType: 'sms',
configName: ''
},
pageList: fetchList
queryForm: {
configType: "sms",
configName: "",
},
pageList: fetchList,
})
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile,
tableStyle
} = useTable(state)
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 导出excel
const exportExcel = () => {
downBlobFile('/admin/sysMessage/export', Object.assign(state.queryForm, {ids: selectObjs}), 'sysMessage.xlsx')
downBlobFile("/admin/sysMessage/export", Object.assign(state.queryForm, { ids: selectObjs }), "信息推送-短信.xlsx")
}
// 多选事件
const selectionChangHandle = (objs: { id: string }[]) => {
selectObjs.value = objs.map(({id}) => id);
multiple.value = !objs.length;
};
selectObjs.value = objs.map(({ id }) => id)
multiple.value = !objs.length
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm('此操作将永久删除');
} catch {
return;
}
try {
await useMessageBox().confirm("此操作将永久删除")
} catch {
return
}
try {
await delObjs(ids);
getDataList();
useMessage().success('删除成功');
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await delObjs(ids)
getDataList()
useMessage().success("删除成功")
} catch (err: any) {
useMessage().error(err.msg)
}
}
// 跳转日志
const router = useRouter();
const router = useRouter()
const handleLog = () => {
router.push({path: '/admin/log/index', query: {serviceId: 'sms'}})
router.push({ path: "/admin/log/index", query: { serviceId: "sms" } })
}
</script>
+108 -113
View File
@@ -1,89 +1,91 @@
<template>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="业务名称" prop="configName">
<el-input placeholder="请输入业务名称" v-model="state.queryForm.configName"/>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
查询
</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()"
v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary"
v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar v-model:showSearch="showSearch" :export="'admin_sysMessage_export'"
@exportExcel="exportExcel" class="ml10 mr20" style="float: right;"
@queryTable="getDataList"></right-toolbar>
</div>
</el-row>
<el-table :data="state.dataList" v-loading="state.loading" border
:cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle">
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" label="#" width="40"/>
<el-table-column prop="configName" label="业务名称" show-overflow-tooltip/>
<el-table-column prop="configKey" label="业务标识" show-overflow-tooltip/>
<el-table-column prop="configValue.supplier" label="厂商" show-overflow-tooltip>
<template #default="scope">
{{ formDialogRef?.supplierList.find((item: any) => item.value === JSON.parse(scope.row.configValue).supplier)?.label}}
</template>
</el-table-column>
<el-table-column prop="configStatus" label="启用状态" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.configStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" v-auth="'sys_message_edit'"
@click="senderDialogRef.openDialog(scope.row.id)">测试
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'sys_message_edit'"
@click="formDialogRef.openDialog(scope.row.id)">编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'"
@click="handleDelete([scope.row.id])">删除
</el-button>
<el-button icon="Tickets" text type="primary" v-auth="'sys_message_del'"
@click="handleLog">日志
</el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination"/>
<div>
<el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="业务名称" prop="configName">
<el-input placeholder="请输入业务名称" v-model="state.queryForm.configName" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList"> 查询 </el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
</el-row>
<el-row>
<div class="mb8" style="width: 100%">
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'sys_message_add'">
新 增
</el-button>
<el-button plain :disabled="multiple" icon="Delete" type="primary" v-auth="'sys_message_del'" @click="handleDelete(selectObjs)">
删除
</el-button>
<right-toolbar
v-model:showSearch="showSearch"
:export="'admin_sysMessage_export'"
@exportExcel="exportExcel"
class="ml10 mr20"
style="float: right"
@queryTable="getDataList"
></right-toolbar>
</div>
</el-row>
<el-table
:data="state.dataList"
v-loading="state.loading"
border
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle"
@selection-change="selectionChangHandle"
@sort-change="sortChangeHandle"
>
<el-table-column type="selection" width="40" align="center" />
<el-table-column type="index" label="#" width="40" />
<el-table-column prop="configName" label="业务名称" show-overflow-tooltip />
<el-table-column prop="configKey" label="业务标识" show-overflow-tooltip />
<el-table-column prop="configValue.supplier" label="厂商" show-overflow-tooltip>
<template #default="scope">
{{ formDialogRef?.supplierList.find((item: any) => item.value === JSON.parse(scope.row.configValue).supplier)?.label }}
</template>
</el-table-column>
<el-table-column prop="configStatus" label="启用状态" show-overflow-tooltip width="100">
<template #default="scope">
<dict-tag :options="yes_no_type" :value="scope.row.configStatus"></dict-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="300">
<template #default="scope">
<el-button icon="view" text type="primary" v-auth="'sys_message_edit'" @click="senderDialogRef.openDialog(scope.row.id)"
>测试
</el-button>
<el-button icon="edit-pen" text type="primary" v-auth="'sys_message_edit'" @click="formDialogRef.openDialog(scope.row.id)"
>编辑
</el-button>
<el-button icon="delete" text type="primary" v-auth="'sys_message_del'" @click="handleDelete([scope.row.id])">删除 </el-button>
<el-button icon="Tickets" text type="primary" v-auth="'sys_message_del'" @click="handleLog">日志 </el-button>
</template>
</el-table-column>
</el-table>
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)"/>
<sender-dialog ref="senderDialogRef"/>
</div>
<!-- 编辑、新增 -->
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
<sender-dialog ref="senderDialogRef" />
</div>
</template>
<script setup lang="ts" name="systemSysHookMessage">
import {BasicTableProps, useTable} from "/@/hooks/table";
import {delObjs, fetchList} from "/@/api/admin/config";
import {useMessage, useMessageBox} from "/@/hooks/message";
import {useDict} from '/@/hooks/dict';
import { BasicTableProps, useTable } from "/@/hooks/table"
import { delObjs, fetchList } from "/@/api/admin/config"
import { useMessage, useMessageBox } from "/@/hooks/message"
import { useDict } from "/@/hooks/dict"
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
const SenderDialog = defineAsyncComponent(() => import('./sender.vue'));
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
const SenderDialog = defineAsyncComponent(() => import("./sender.vue"))
const senderDialogRef = ref()
// 定义查询字典
const {yes_no_type} = useDict('yes_no_type')
const { yes_no_type } = useDict("yes_no_type")
// 定义变量内容
const formDialogRef = ref()
// 搜索变量
@@ -94,63 +96,56 @@ const selectObjs = ref([]) as any
const multiple = ref(true)
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {
configType: 'webhook',
configName: ''
},
pageList: fetchList
queryForm: {
configType: "webhook",
configName: "",
},
pageList: fetchList,
})
// table hook
const {
getDataList,
currentChangeHandle,
sizeChangeHandle,
sortChangeHandle,
downBlobFile,
tableStyle
} = useTable(state)
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
// 清空搜索条件
const resetQuery = () => {
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
// 清空搜索条件
queryRef.value?.resetFields()
// 清空多选
selectObjs.value = []
getDataList()
}
// 导出excel
const exportExcel = () => {
downBlobFile('/admin/sysMessage/export', Object.assign(state.queryForm, {ids: selectObjs}), 'sysMessage.xlsx')
downBlobFile("/admin/sysMessage/export", Object.assign(state.queryForm, { ids: selectObjs }), "信息推送-hook.xlsx")
}
// 多选事件
const selectionChangHandle = (objs: { id: string }[]) => {
selectObjs.value = objs.map(({id}) => id);
multiple.value = !objs.length;
};
selectObjs.value = objs.map(({ id }) => id)
multiple.value = !objs.length
}
// 删除操作
const handleDelete = async (ids: string[]) => {
try {
await useMessageBox().confirm('此操作将永久删除');
} catch {
return;
}
try {
await useMessageBox().confirm("此操作将永久删除")
} catch {
return
}
try {
await delObjs(ids);
getDataList();
useMessage().success('删除成功');
} catch (err: any) {
useMessage().error(err.msg);
}
};
try {
await delObjs(ids)
getDataList()
useMessage().success("删除成功")
} catch (err: any) {
useMessage().error(err.msg)
}
}
// 跳转日志
const router = useRouter();
const router = useRouter()
const handleLog = () => {
router.push({path: '/admin/log/index', query: {serviceId: 'webhook'}})
router.push({ path: "/admin/log/index", query: { serviceId: "webhook" } })
}
</script>