This commit is contained in:
wyuu 2026-03-11 15:27:15 +08:00
parent 98632e6463
commit dc30a21d8f
15 changed files with 1761 additions and 2300 deletions

View File

@ -60,3 +60,11 @@ export function saveCanCreaeReqList(query: any) {
data: query data: query
}) })
} }
//获取病人明细信息
export function queryPatDetail(query: any) {
return request({
url: '/reqInput/queryPatDetail',
method: 'get',
params: query
})
}

View File

@ -58,10 +58,10 @@
<div class="box-shadow"> <div class="box-shadow">
<el-form :model="queryParams" inline size="small" label-width="5.5rem"> <el-form :model="queryParams" inline size="small" label-width="5.5rem">
<el-form-item label="姓名:" prop="brxm"> <el-form-item label="姓名:" prop="brxm">
<el-input v-model="queryParams.brxm" style="width: 9rem;" /> <el-input v-model="queryParams.brxm" style="width: 9rem;" clearable />
</el-form-item> </el-form-item>
<el-form-item label="条码号:" prop="sqh"> <el-form-item label="条码号:" prop="sqh">
<el-input v-model="queryParams.sqh" style="width: 9rem;" /> <el-input v-model="queryParams.sqh" style="width: 9rem;" clearable />
</el-form-item> </el-form-item>
<el-form-item label="状态:" prop="zt"> <el-form-item label="状态:" prop="zt">
<el-select v-model="queryParams.zt" placeholder="请选择" style="width: 9rem;" clearable> <el-select v-model="queryParams.zt" placeholder="请选择" style="width: 9rem;" clearable>
@ -101,7 +101,9 @@
<template #brly="{ row }"> <template #brly="{ row }">
{{ formatDict(row.brly, 'PT') }} {{ formatDict(row.brly, 'PT') }}
</template> </template>
<template #zt="{ row }">
{{ formatDictzt(row.zt) }}
</template>
</CustomVxeTable> </CustomVxeTable>
</div> </div>
</div> </div>
@ -117,12 +119,14 @@
<script setup> <script setup>
import Info from './components/info.vue' import Info from './components/info.vue'
import { getDictData, formatDict, dictData } from '@/hooks' import { getDictData, formatDict, dictData } from '@/hooks'
import { queryXmInfoList, saveReqInfo, queryPatList } from '@/api/liswork/order' import { queryXmInfoList, saveReqInfo, queryPatList, queryPatDetail } from '@/api/liswork/order'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { getFirstLetter } from '@/utils/pinyin'; import { getFirstLetter } from '@/utils/pinyin';
import SetBilling from './components/setBilling.vue' import SetBilling from './components/setBilling.vue'
const { proxy } = getCurrentInstance();
const { lis_req_type } = proxy.useDict("lis_req_type");
const labpat = ref({ const labpat = ref({
zt: '1' zt: '1'
}) })
@ -139,7 +143,7 @@ const tableColumns = ref([
{ field: 'brxm', title: '姓名', width: 40, align: 'center', resizable: true, }, { field: 'brxm', title: '姓名', width: 40, align: 'center', resizable: true, },
{ field: 'brxb', title: '性别', width: 30, align: 'center', slotName: 'brxb', resizable: true }, { field: 'brxb', title: '性别', width: 30, align: 'center', slotName: 'brxb', resizable: true },
{ field: 'sqh', title: '条码号', width: 100, align: 'center', resizable: true, }, { field: 'sqh', title: '条码号', width: 100, align: 'center', resizable: true, },
{ field: 'zt', title: '状态', width: 40, align: 'center', resizable: true, }, { field: 'zt', title: '状态', width: 40, align: 'center', slotName: 'zt', resizable: true, },
{ field: 'nl', title: '年', width: 30, align: 'center', resizable: true }, { field: 'nl', title: '年', width: 30, align: 'center', resizable: true },
{ field: 'nldw', title: '龄', width: 20, align: 'center', slotName: 'nldw', resizable: true }, { field: 'nldw', title: '龄', width: 20, align: 'center', slotName: 'nldw', resizable: true },
{ field: 'yblx', title: '标本', width: 50, align: 'center', resizable: true, slotName: 'yblx' }, { field: 'yblx', title: '标本', width: 50, align: 'center', resizable: true, slotName: 'yblx' },
@ -157,9 +161,13 @@ const cellStyle = ({ row, column }) => {
} }
const handleRowClick = (row) => { const handleRowClick = (row) => {
row.brxb = row.brxb.trim() queryPatDetail({ sqh: row.sqh }).then(res => {
row.zt = row.zt.trim() labpat.value = res.data.labReqmain
labpat.value = row labpat.value.brxb = labpat.value.brxb.trim()
labpat.value.zt = labpat.value.zt.trim()
sqXmList.value = res.data.reqInputLisWorkVOList
checkboxs.value = res.data.reqInputLisWorkVOList.map(item => item.sfxmdh)
})
} }
const handleQuery = () => { const handleQuery = () => {
@ -255,6 +263,7 @@ const sqXmColumns = ref([
]) ])
const handleChecksChange = (val) => { const handleChecksChange = (val) => {
console.log('val==>', val);
sqXmList.value = [] sqXmList.value = []
val.forEach(item => { val.forEach(item => {
const existingItem = processedTableData.value.find((row) => row.sfxmdh == item) const existingItem = processedTableData.value.find((row) => row.sfxmdh == item)
@ -298,6 +307,11 @@ const resultList = (arr) => {
return categoryList return categoryList
} }
const formatDictzt = (value) => {
const item = lis_req_type.value.find(i => i.value === value.trim());
return item ? item.label : value;
}
onMounted(() => { onMounted(() => {
queryParams.value.begdate = dayjs().format('YYYY-MM-DD') queryParams.value.begdate = dayjs().format('YYYY-MM-DD')
queryParams.value.enddate = dayjs().format('YYYY-MM-DD') queryParams.value.enddate = dayjs().format('YYYY-MM-DD')

View File

@ -1,287 +1,234 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="任务名称" prop="jobName"> <el-form-item label="任务名称" prop="jobName">
<el-input <el-input v-model="queryParams.jobName" placeholder="请输入任务名称" clearable style="width: 200px"
v-model="queryParams.jobName" @keyup.enter="handleQuery" />
placeholder="请输入任务名称" </el-form-item>
clearable <el-form-item label="任务组名" prop="jobGroup">
style="width: 200px" <el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable style="width: 200px">
@keyup.enter="handleQuery" <el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value" />
/> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="任务组名" prop="jobGroup"> <el-form-item label="任务状态" prop="status">
<el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable style="width: 200px"> <el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable style="width: 200px">
<el-option <el-option v-for="dict in sys_job_status" :key="dict.value" :label="dict.label" :value="dict.value" />
v-for="dict in sys_job_group" </el-select>
:key="dict.value" </el-form-item>
:label="dict.label" <el-form-item>
:value="dict.value" <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
/> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-select> </el-form-item>
</el-form-item> </el-form>
<el-form-item label="任务状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable style="width: 200px"> <el-row :gutter="10" class="mb8">
<el-option <el-col :span="1.5">
v-for="dict in sys_job_status" <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['monitor:job:add']">新增</el-button>
:key="dict.value" </el-col>
:label="dict.label" <el-col :span="1.5">
:value="dict.value" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
/> v-hasPermi="['monitor:job:edit']">修改</el-button>
</el-select> </el-col>
</el-form-item> <el-col :span="1.5">
<el-form-item> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> v-hasPermi="['monitor:job:remove']">删除</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-col>
</el-form-item> <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['monitor:job:export']">导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="Operation" @click="handleJobLog"
v-hasPermi="['monitor:job:query']">日志</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange"
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="任务编号" width="100" align="center" prop="jobId" />
<el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" />
<el-table-column label="任务组名" align="center" prop="jobGroup">
<template #default="scope">
<dict-tag :options="sys_job_group" :value="scope.row.jobGroup" />
</template>
</el-table-column>
<el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
<el-table-column label="cron执行表达式" align="center" prop="cronExpression" :show-overflow-tooltip="true" />
<el-table-column label="状态" align="center">
<template #default="scope">
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
@change="handleStatusChange(scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['monitor:job:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['monitor:job:remove']"></el-button>
</el-tooltip>
<el-tooltip content="执行一次" placement="top">
<el-button link type="primary" icon="CaretRight" @click="handleRun(scope.row)"
v-hasPermi="['monitor:job:changeStatus']"></el-button>
</el-tooltip>
<el-tooltip content="任务详细" placement="top">
<el-button link type="primary" icon="View" @click="handleView(scope.row)"
v-hasPermi="['monitor:job:query']"></el-button>
</el-tooltip>
<el-tooltip content="调度日志" placement="top">
<el-button link type="primary" icon="Operation" @click="handleJobLog(scope.row)"
v-hasPermi="['monitor:job:query']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改定时任务对话框 -->
<el-dialog :title="title" v-model="open" width="820px" append-to-body>
<el-form ref="jobRef" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="任务名称" prop="jobName">
<el-input v-model="form.jobName" placeholder="请输入任务名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务分组" prop="jobGroup">
<el-select v-model="form.jobGroup" placeholder="请选择">
<el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="invokeTarget">
<template #label>
<span>
调用方法
<el-tooltip placement="top">
<template #content>
<div>
Bean调用示例:ryTask.ryParams('ry')
<br />Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')
<br />参数说明:支持字符串,布尔类型,长整型,浮点型,整型
</div>
</template>
<el-icon><question-filled /></el-icon>
</el-tooltip>
</span>
</template>
<el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="cron表达式" prop="cronExpression">
<el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式">
<template #append>
<el-button type="primary" @click="handleShowCron">
生成表达式
<i class="el-icon-time el-icon--right"></i>
</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="form.jobId !== undefined">
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_job_status" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="执行策略" prop="misfirePolicy">
<el-radio-group v-model="form.misfirePolicy">
<el-radio-button label="1">立即执行</el-radio-button>
<el-radio-button label="2">执行一次</el-radio-button>
<el-radio-button label="3">放弃执行</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否并发" prop="concurrent">
<el-radio-group v-model="form.concurrent">
<el-radio-button label="0">允许</el-radio-button>
<el-radio-button label="1">禁止</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<el-row :gutter="10" class="mb8"> <el-dialog title="Cron表达式生成器" v-model="openCron" append-to-body destroy-on-close>
<el-col :span="1.5"> <crontab ref="crontabRef" @hide="openCron = false" @fill="crontabFill" :expression="expression"></crontab>
<el-button </el-dialog>
type="primary"
plain
icon="Plus"
@click="handleAdd"
v-hasPermi="['monitor:job:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['monitor:job:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['monitor:job:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['monitor:job:export']"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="Operation"
@click="handleJobLog"
v-hasPermi="['monitor:job:query']"
>日志</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange"> <!-- 任务日志详细 -->
<el-table-column type="selection" width="55" align="center" /> <el-dialog title="任务详细" v-model="openView" width="700px" append-to-body>
<el-table-column label="任务编号" width="100" align="center" prop="jobId" /> <el-form :model="form" label-width="120px">
<el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" /> <el-row>
<el-table-column label="任务组名" align="center" prop="jobGroup"> <el-col :span="12">
<template #default="scope"> <el-form-item label="任务编号:">{{ form.jobId }}</el-form-item>
<dict-tag :options="sys_job_group" :value="scope.row.jobGroup" /> <el-form-item label="任务名称:">{{ form.jobName }}</el-form-item>
</template> </el-col>
</el-table-column> <el-col :span="12">
<el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" /> <el-form-item label="任务分组:">{{ jobGroupFormat(form) }}</el-form-item>
<el-table-column label="cron执行表达式" align="center" prop="cronExpression" :show-overflow-tooltip="true" /> <el-form-item label="创建时间:">{{ form.createTime }}</el-form-item>
<el-table-column label="状态" align="center"> </el-col>
<template #default="scope"> <el-col :span="12">
<el-switch <el-form-item label="cron表达式:">{{ form.cronExpression }}</el-form-item>
v-model="scope.row.status" </el-col>
active-value="0" <el-col :span="12">
inactive-value="1" <el-form-item label="下次执行时间:">{{ parseTime(form.nextValidTime) }}</el-form-item>
@change="handleStatusChange(scope.row)" </el-col>
></el-switch> <el-col :span="24">
</template> <el-form-item label="调用目标方法:">{{ form.invokeTarget }}</el-form-item>
</el-table-column> </el-col>
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width"> <el-col :span="12">
<template #default="scope"> <el-form-item label="任务状态:">
<el-tooltip content="修改" placement="top"> <div v-if="form.status == 0">正常</div>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['monitor:job:edit']"></el-button> <div v-else-if="form.status == 1">暂停</div>
</el-tooltip> </el-form-item>
<el-tooltip content="删除" placement="top"> </el-col>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['monitor:job:remove']"></el-button> <el-col :span="12">
</el-tooltip> <el-form-item label="是否并发:">
<el-tooltip content="执行一次" placement="top"> <div v-if="form.concurrent == 0">允许</div>
<el-button link type="primary" icon="CaretRight" @click="handleRun(scope.row)" v-hasPermi="['monitor:job:changeStatus']"></el-button> <div v-else-if="form.concurrent == 1">禁止</div>
</el-tooltip> </el-form-item>
<el-tooltip content="任务详细" placement="top"> </el-col>
<el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['monitor:job:query']"></el-button> <el-col :span="12">
</el-tooltip> <el-form-item label="执行策略:">
<el-tooltip content="调度日志" placement="top"> <div v-if="form.misfirePolicy == 0">默认策略</div>
<el-button link type="primary" icon="Operation" @click="handleJobLog(scope.row)" v-hasPermi="['monitor:job:query']"></el-button> <div v-else-if="form.misfirePolicy == 1">立即执行</div>
</el-tooltip> <div v-else-if="form.misfirePolicy == 2">执行一次</div>
</template> <div v-else-if="form.misfirePolicy == 3">放弃执行</div>
</el-table-column> </el-form-item>
</el-table> </el-col>
</el-row>
<pagination </el-form>
v-show="total > 0" <template #footer>
:total="total" <div class="dialog-footer">
v-model:page="queryParams.pageNum" <el-button @click="openView = false">关 闭</el-button>
v-model:limit="queryParams.pageSize" </div>
@pagination="getList" </template>
/> </el-dialog>
</div>
<!-- 添加或修改定时任务对话框 -->
<el-dialog :title="title" v-model="open" width="820px" append-to-body>
<el-form ref="jobRef" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="任务名称" prop="jobName">
<el-input v-model="form.jobName" placeholder="请输入任务名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务分组" prop="jobGroup">
<el-select v-model="form.jobGroup" placeholder="请选择">
<el-option
v-for="dict in sys_job_group"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item prop="invokeTarget">
<template #label>
<span>
调用方法
<el-tooltip placement="top">
<template #content>
<div>
Bean调用示例:ryTask.ryParams('ry')
<br />Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')
<br />参数说明:支持字符串,布尔类型,长整型,浮点型,整型
</div>
</template>
<el-icon><question-filled /></el-icon>
</el-tooltip>
</span>
</template>
<el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="cron表达式" prop="cronExpression">
<el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式">
<template #append>
<el-button type="primary" @click="handleShowCron">
生成表达式
<i class="el-icon-time el-icon--right"></i>
</el-button>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="form.jobId !== undefined">
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in sys_job_status"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="执行策略" prop="misfirePolicy">
<el-radio-group v-model="form.misfirePolicy">
<el-radio-button label="1">立即执行</el-radio-button>
<el-radio-button label="2">执行一次</el-radio-button>
<el-radio-button label="3">放弃执行</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否并发" prop="concurrent">
<el-radio-group v-model="form.concurrent">
<el-radio-button label="0">允许</el-radio-button>
<el-radio-button label="1">禁止</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<el-dialog title="Cron表达式生成器" v-model="openCron" append-to-body destroy-on-close>
<crontab ref="crontabRef" @hide="openCron=false" @fill="crontabFill" :expression="expression"></crontab>
</el-dialog>
<!-- 任务日志详细 -->
<el-dialog title="任务详细" v-model="openView" width="700px" append-to-body>
<el-form :model="form" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="任务编号:">{{ form.jobId }}</el-form-item>
<el-form-item label="任务名称:">{{ form.jobName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务分组:">{{ jobGroupFormat(form) }}</el-form-item>
<el-form-item label="创建时间:">{{ form.createTime }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="cron表达式:">{{ form.cronExpression }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下次执行时间:">{{ parseTime(form.nextValidTime) }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="调用目标方法:">{{ form.invokeTarget }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务状态:">
<div v-if="form.status == 0">正常</div>
<div v-else-if="form.status == 1">暂停</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否并发:">
<div v-if="form.concurrent == 0">允许</div>
<div v-else-if="form.concurrent == 1">禁止</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="执行策略:">
<div v-if="form.misfirePolicy == 0">默认策略</div>
<div v-else-if="form.misfirePolicy == 1">立即执行</div>
<div v-else-if="form.misfirePolicy == 2">执行一次</div>
<div v-else-if="form.misfirePolicy == 3">放弃执行</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="openView = false">关 闭</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Job"> <script setup name="Job">
@ -402,8 +349,9 @@ function handleRun(row) {
proxy.$modal.confirm('确认要立即执行一次"' + row.jobName + '"任务吗?').then(function () { proxy.$modal.confirm('确认要立即执行一次"' + row.jobName + '"任务吗?').then(function () {
return runJob(row.jobId, row.jobGroup); return runJob(row.jobId, row.jobGroup);
}).then(() => { }).then(() => {
proxy.$modal.msgSuccess("执行成功");}) proxy.$modal.msgSuccess("执行成功");
.catch(() => {}); })
.catch(() => { });
} }
/** 任务详细信息 */ /** 任务详细信息 */
function handleView(row) { function handleView(row) {
@ -470,7 +418,7 @@ function handleDelete(row) {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {

View File

@ -1,173 +1,118 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="任务名称" prop="jobName"> <el-form-item label="任务名称" prop="jobName">
<el-input <el-input v-model="queryParams.jobName" placeholder="请输入任务名称" clearable style="width: 240px"
v-model="queryParams.jobName" @keyup.enter="handleQuery" />
placeholder="请输入任务名称" </el-form-item>
clearable <el-form-item label="任务组名" prop="jobGroup">
style="width: 240px" <el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable style="width: 240px">
@keyup.enter="handleQuery" <el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value" />
/> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="任务组名" prop="jobGroup"> <el-form-item label="执行状态" prop="status">
<el-select <el-select v-model="queryParams.status" placeholder="请选择执行状态" clearable style="width: 240px">
v-model="queryParams.jobGroup" <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
placeholder="请选择任务组名" </el-select>
clearable </el-form-item>
style="width: 240px" <el-form-item label="执行时间" style="width: 308px">
> <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
<el-option start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
v-for="dict in sys_job_group" </el-form-item>
:key="dict.value" <el-form-item>
:label="dict.label" <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
:value="dict.value" <el-button icon="Refresh" @click="resetQuery">重置</el-button>
/> </el-form-item>
</el-select> </el-form>
</el-form-item>
<el-form-item label="执行状态" prop="status"> <el-row :gutter="10" class="mb8">
<el-select <el-col :span="1.5">
v-model="queryParams.status" <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
placeholder="请选择执行状态" v-hasPermi="['monitor:job:remove']">删除</el-button>
clearable </el-col>
style="width: 240px" <el-col :span="1.5">
> <el-button type="danger" plain icon="Delete" @click="handleClean"
<el-option v-hasPermi="['monitor:job:remove']">清空</el-button>
v-for="dict in sys_common_status" </el-col>
:key="dict.value" <el-col :span="1.5">
:label="dict.label" <el-button type="warning" plain icon="Download" @click="handleExport"
:value="dict.value" v-hasPermi="['monitor:job:export']">导出</el-button>
/> </el-col>
</el-select> <el-col :span="1.5">
</el-form-item> <el-button type="warning" plain icon="Close" @click="handleClose">关闭</el-button>
<el-form-item label="执行时间" style="width: 308px"> </el-col>
<el-date-picker <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
v-model="dateRange" </el-row>
value-format="YYYY-MM-DD"
type="daterange" <el-table v-loading="loading" :data="jobLogList" @selection-change="handleSelectionChange"
range-separator="-" height="calc(100vh - 280px)">
start-placeholder="开始日期" <el-table-column type="selection" width="55" align="center" />
end-placeholder="结束日期" <el-table-column label="日志编号" width="80" align="center" prop="jobLogId" />
></el-date-picker> <el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" />
</el-form-item> <el-table-column label="任务组名" align="center" prop="jobGroup" :show-overflow-tooltip="true">
<el-form-item> <template #default="scope">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <dict-tag :options="sys_job_group" :value="scope.row.jobGroup" />
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </template>
</el-form-item> </el-table-column>
<el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
<el-table-column label="日志信息" align="center" prop="jobMessage" :show-overflow-tooltip="true" />
<el-table-column label="执行状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_common_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="执行时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row)"
v-hasPermi="['monitor:job:query']">详细</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 调度日志详细 -->
<el-dialog title="调度日志详细" v-model="open" width="700px" append-to-body>
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="日志序号:">{{ form.jobLogId }}</el-form-item>
<el-form-item label="任务名称:">{{ form.jobName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务分组:">{{ form.jobGroup }}</el-form-item>
<el-form-item label="执行时间:">{{ form.createTime }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="调用方法:">{{ form.invokeTarget }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="日志信息:">{{ form.jobMessage }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="执行状态:">
<div v-if="form.status == 0">正常</div>
<div v-else-if="form.status == 1">失败</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="异常信息:" v-if="form.status == 1">{{ form.exceptionInfo }}</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer>
<el-row :gutter="10" class="mb8"> <div class="dialog-footer">
<el-col :span="1.5"> <el-button @click="open = false">关 闭</el-button>
<el-button </div>
type="danger" </template>
plain </el-dialog>
icon="Delete" </div>
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['monitor:job:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
@click="handleClean"
v-hasPermi="['monitor:job:remove']"
>清空</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['monitor:job:export']"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Close"
@click="handleClose"
>关闭</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="jobLogList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="日志编号" width="80" align="center" prop="jobLogId" />
<el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" />
<el-table-column label="任务组名" align="center" prop="jobGroup" :show-overflow-tooltip="true">
<template #default="scope">
<dict-tag :options="sys_job_group" :value="scope.row.jobGroup" />
</template>
</el-table-column>
<el-table-column label="调用目标字符串" align="center" prop="invokeTarget" :show-overflow-tooltip="true" />
<el-table-column label="日志信息" align="center" prop="jobMessage" :show-overflow-tooltip="true" />
<el-table-column label="执行状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_common_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="执行时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['monitor:job:query']">详细</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 调度日志详细 -->
<el-dialog title="调度日志详细" v-model="open" width="700px" append-to-body>
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="日志序号:">{{ form.jobLogId }}</el-form-item>
<el-form-item label="任务名称:">{{ form.jobName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务分组:">{{ form.jobGroup }}</el-form-item>
<el-form-item label="执行时间:">{{ form.createTime }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="调用方法:">{{ form.invokeTarget }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="日志信息:">{{ form.jobMessage }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="执行状态:">
<div v-if="form.status == 0">正常</div>
<div v-else-if="form.status == 1">失败</div>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="异常信息:" v-if="form.status == 1">{{ form.exceptionInfo }}</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="open = false">关 闭</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="JobLog"> <script setup name="JobLog">
@ -242,7 +187,7 @@ function handleDelete(row) {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 清空按钮操作 */ /** 清空按钮操作 */
function handleClean() { function handleClean() {
@ -251,7 +196,7 @@ function handleClean() {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("清空成功"); proxy.$modal.msgSuccess("清空成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {

View File

@ -1,127 +1,77 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="登录地址" prop="ipaddr"> <el-form-item label="登录地址" prop="ipaddr">
<el-input <el-input v-model="queryParams.ipaddr" placeholder="请输入登录地址" clearable style="width: 240px;"
v-model="queryParams.ipaddr" @keyup.enter="handleQuery" />
placeholder="请输入登录地址" </el-form-item>
clearable <el-form-item label="用户名称" prop="userName">
style="width: 240px;" <el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px;"
@keyup.enter="handleQuery" @keyup.enter="handleQuery" />
/> </el-form-item>
</el-form-item> <el-form-item label="状态" prop="status">
<el-form-item label="用户名称" prop="userName"> <el-select v-model="queryParams.status" placeholder="登录状态" clearable style="width: 240px">
<el-input <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
v-model="queryParams.userName" </el-select>
placeholder="请输入用户名称" </el-form-item>
clearable <el-form-item label="登录时间" style="width: 308px">
style="width: 240px;" <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-"
@keyup.enter="handleQuery" start-placeholder="开始日期" end-placeholder="结束日期"
/> :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item>
<el-select <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
v-model="queryParams.status" <el-button icon="Refresh" @click="resetQuery">重置</el-button>
placeholder="登录状态" </el-form-item>
clearable </el-form>
style="width: 240px"
>
<el-option
v-for="dict in sys_common_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="登录时间" style="width: 308px">
<el-date-picker
v-model="dateRange"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
type="danger" v-hasPermi="['monitor:logininfor:remove']">删除</el-button>
plain </el-col>
icon="Delete" <el-col :span="1.5">
:disabled="multiple" <el-button type="danger" plain icon="Delete" @click="handleClean"
@click="handleDelete" v-hasPermi="['monitor:logininfor:remove']">清空</el-button>
v-hasPermi="['monitor:logininfor:remove']" </el-col>
>删除</el-button> <el-col :span="1.5">
</el-col> <el-button type="primary" plain icon="Unlock" :disabled="single" @click="handleUnlock"
<el-col :span="1.5"> v-hasPermi="['monitor:logininfor:unlock']">解锁</el-button>
<el-button </el-col>
type="danger" <el-col :span="1.5">
plain <el-button type="warning" plain icon="Download" @click="handleExport"
icon="Delete" v-hasPermi="['monitor:logininfor:export']">导出</el-button>
@click="handleClean" </el-col>
v-hasPermi="['monitor:logininfor:remove']" <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
>清空</el-button> </el-row>
</el-col>
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Unlock"
:disabled="single"
@click="handleUnlock"
v-hasPermi="['monitor:logininfor:unlock']"
>解锁</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['monitor:logininfor:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table ref="logininforRef" v-loading="loading" :data="logininforList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange"> <el-table ref="logininforRef" v-loading="loading" :data="logininforList" height="calc(100vh - 280px)"
<el-table-column type="selection" width="55" align="center" /> @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
<el-table-column label="访问编号" align="center" prop="infoId" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" /> <el-table-column label="访问编号" align="center" prop="infoId" />
<el-table-column label="地址" align="center" prop="ipaddr" :show-overflow-tooltip="true" /> <el-table-column label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" sortable="custom"
<el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" /> :sort-orders="['descending', 'ascending']" />
<el-table-column label="操作系统" align="center" prop="os" :show-overflow-tooltip="true" /> <el-table-column label="地址" align="center" prop="ipaddr" :show-overflow-tooltip="true" />
<el-table-column label="浏览器" align="center" prop="browser" :show-overflow-tooltip="true" /> <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />
<el-table-column label="登录状态" align="center" prop="status"> <el-table-column label="操作系统" align="center" prop="os" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="浏览器" align="center" prop="browser" :show-overflow-tooltip="true" />
<dict-tag :options="sys_common_status" :value="scope.row.status" /> <el-table-column label="登录状态" align="center" prop="status">
</template> <template #default="scope">
</el-table-column> <dict-tag :options="sys_common_status" :value="scope.row.status" />
<el-table-column label="描述" align="center" prop="msg" :show-overflow-tooltip="true" /> </template>
<el-table-column label="访问时间" align="center" prop="loginTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180"> </el-table-column>
<template #default="scope"> <el-table-column label="描述" align="center" prop="msg" :show-overflow-tooltip="true" />
<span>{{ parseTime(scope.row.loginTime) }}</span> <el-table-column label="访问时间" align="center" prop="loginTime" sortable="custom"
</template> :sort-orders="['descending', 'ascending']" width="180">
</el-table-column> <template #default="scope">
</el-table> <span>{{ parseTime(scope.row.loginTime) }}</span>
</template>
</el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-show="total > 0" v-model:limit="queryParams.pageSize" @pagination="getList" />
:total="total" </div>
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template> </template>
<script setup name="Logininfor"> <script setup name="Logininfor">
@ -194,7 +144,7 @@ function handleDelete(row) {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 清空按钮操作 */ /** 清空按钮操作 */
function handleClean() { function handleClean() {
@ -203,7 +153,7 @@ function handleClean() {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("清空成功"); proxy.$modal.msgSuccess("清空成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 解锁按钮操作 */ /** 解锁按钮操作 */
function handleUnlock() { function handleUnlock() {
@ -212,7 +162,7 @@ function handleUnlock() {
return unlockLogininfor(username); return unlockLogininfor(username);
}).then(() => { }).then(() => {
proxy.$modal.msgSuccess("用户" + username + "解锁成功"); proxy.$modal.msgSuccess("用户" + username + "解锁成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {

View File

@ -1,60 +1,48 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true"> <el-form :model="queryParams" ref="queryRef" :inline="true">
<el-form-item label="登录地址" prop="ipaddr"> <el-form-item label="登录地址" prop="ipaddr">
<el-input <el-input v-model="queryParams.ipaddr" placeholder="请输入登录地址" clearable style="width: 200px"
v-model="queryParams.ipaddr" @keyup.enter="handleQuery" />
placeholder="请输入登录地址" </el-form-item>
clearable <el-form-item label="用户名称" prop="userName">
style="width: 200px" <el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 200px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery" />
/> </el-form-item>
</el-form-item> <el-form-item>
<el-form-item label="用户名称" prop="userName"> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-input <el-button icon="Refresh" @click="resetQuery">重置</el-button>
v-model="queryParams.userName" </el-form-item>
placeholder="请输入用户名称" </el-form>
clearable <el-table v-loading="loading" :data="onlineList.slice((pageNum - 1) * pageSize, pageNum * pageSize)"
style="width: 200px" style="width: 100%;" height="calc(100vh - 250px)">
@keyup.enter="handleQuery" <el-table-column label="序号" width="50" type="index" align="center">
/> <template #default="scope">
</el-form-item> <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
<el-form-item> </template>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> </el-table-column>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-table-column label="会话编号" align="center" prop="tokenId" :show-overflow-tooltip="true" />
</el-form-item> <el-table-column label="登录名称" align="center" prop="userName" :show-overflow-tooltip="true" />
</el-form> <el-table-column label="所属部门" align="center" prop="deptName" :show-overflow-tooltip="true" />
<el-table <el-table-column label="主机" align="center" prop="ipaddr" :show-overflow-tooltip="true" />
v-loading="loading" <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />
:data="onlineList.slice((pageNum - 1) * pageSize, pageNum * pageSize)" <el-table-column label="操作系统" align="center" prop="os" :show-overflow-tooltip="true" />
style="width: 100%;" <el-table-column label="浏览器" align="center" prop="browser" :show-overflow-tooltip="true" />
> <el-table-column label="登录时间" align="center" prop="loginTime" width="180">
<el-table-column label="序号" width="50" type="index" align="center"> <template #default="scope">
<template #default="scope"> <span>{{ parseTime(scope.row.loginTime) }}</span>
<span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span> </template>
</template> </el-table-column>
</el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-table-column label="会话编号" align="center" prop="tokenId" :show-overflow-tooltip="true" /> <template #default="scope">
<el-table-column label="登录名称" align="center" prop="userName" :show-overflow-tooltip="true" /> <el-button link type="primary" icon="Delete" @click="handleForceLogout(scope.row)"
<el-table-column label="所属部门" align="center" prop="deptName" :show-overflow-tooltip="true" /> v-hasPermi="['monitor:online:forceLogout']">强退</el-button>
<el-table-column label="主机" align="center" prop="ipaddr" :show-overflow-tooltip="true" /> </template>
<el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" /> </el-table-column>
<el-table-column label="操作系统" align="center" prop="os" :show-overflow-tooltip="true" /> </el-table>
<el-table-column label="浏览器" align="center" prop="browser" :show-overflow-tooltip="true" />
<el-table-column label="登录时间" align="center" prop="loginTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.loginTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Delete" @click="handleForceLogout(scope.row)" v-hasPermi="['monitor:online:forceLogout']">强退</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" /> <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" />
</div> </div>
</template> </template>
<script setup name="Online"> <script setup name="Online">
@ -94,12 +82,12 @@ function resetQuery() {
} }
/** 强退按钮操作 */ /** 强退按钮操作 */
function handleForceLogout(row) { function handleForceLogout(row) {
proxy.$modal.confirm('是否确认强退名称为"' + row.userName + '"的用户?').then(function () { proxy.$modal.confirm('是否确认强退名称为"' + row.userName + '"的用户?').then(function () {
return forceLogout(row.tokenId); return forceLogout(row.tokenId);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
getList(); getList();

View File

@ -1,207 +1,148 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="操作地址" prop="operIp"> <el-form-item label="操作地址" prop="operIp">
<el-input <el-input v-model="queryParams.operIp" placeholder="请输入操作地址" clearable style="width: 240px;"
v-model="queryParams.operIp" @keyup.enter="handleQuery" />
placeholder="请输入操作地址" </el-form-item>
clearable <el-form-item label="系统模块" prop="title">
style="width: 240px;" <el-input v-model="queryParams.title" placeholder="请输入系统模块" clearable style="width: 240px;"
@keyup.enter="handleQuery" @keyup.enter="handleQuery" />
/> </el-form-item>
</el-form-item> <el-form-item label="操作人员" prop="operName">
<el-form-item label="系统模块" prop="title"> <el-input v-model="queryParams.operName" placeholder="请输入操作人员" clearable style="width: 240px;"
<el-input @keyup.enter="handleQuery" />
v-model="queryParams.title" </el-form-item>
placeholder="请输入系统模块" <el-form-item label="类型" prop="businessType">
clearable <el-select v-model="queryParams.businessType" placeholder="操作类型" clearable style="width: 240px">
style="width: 240px;" <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" />
@keyup.enter="handleQuery" </el-select>
/> </el-form-item>
</el-form-item> <el-form-item label="状态" prop="status">
<el-form-item label="操作人员" prop="operName"> <el-select v-model="queryParams.status" placeholder="操作状态" clearable style="width: 240px">
<el-input <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
v-model="queryParams.operName" </el-select>
placeholder="请输入操作人员" </el-form-item>
clearable <el-form-item label="操作时间" style="width: 308px">
style="width: 240px;" <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-"
@keyup.enter="handleQuery" start-placeholder="开始日期" end-placeholder="结束日期"
/> :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="类型" prop="businessType"> <el-form-item>
<el-select <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
v-model="queryParams.businessType" <el-button icon="Refresh" @click="resetQuery">重置</el-button>
placeholder="操作类型" </el-form-item>
clearable </el-form>
style="width: 240px"
> <el-row :gutter="10" class="mb8">
<el-option <el-col :span="1.5">
v-for="dict in sys_oper_type" <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
:key="dict.value" v-hasPermi="['monitor:operlog:remove']">删除</el-button>
:label="dict.label" </el-col>
:value="dict.value" <el-col :span="1.5">
/> <el-button type="danger" plain icon="Delete" @click="handleClean"
</el-select> v-hasPermi="['monitor:operlog:remove']">清空</el-button>
</el-form-item> </el-col>
<el-form-item label="状态" prop="status"> <el-col :span="1.5">
<el-select <el-button type="warning" plain icon="Download" @click="handleExport"
v-model="queryParams.status" v-hasPermi="['monitor:operlog:export']">导出</el-button>
placeholder="操作状态" </el-col>
clearable <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
style="width: 240px" </el-row>
>
<el-option <el-table ref="operlogRef" v-loading="loading" :data="operlogList" height="calc(100vh - 320px)"
v-for="dict in sys_common_status" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
:key="dict.value" <el-table-column type="selection" width="50" align="center" />
:label="dict.label" <el-table-column label="日志编号" align="center" prop="operId" />
:value="dict.value" <el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" />
/> <el-table-column label="操作类型" align="center" prop="businessType">
</el-select> <template #default="scope">
</el-form-item> <dict-tag :options="sys_oper_type" :value="scope.row.businessType" />
<el-form-item label="操作时间" style="width: 308px"> </template>
<el-date-picker </el-table-column>
v-model="dateRange" <el-table-column label="操作人员" align="center" width="110" prop="operName" :show-overflow-tooltip="true"
value-format="YYYY-MM-DD HH:mm:ss" sortable="custom" :sort-orders="['descending', 'ascending']" />
type="daterange" <el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
range-separator="-" <el-table-column label="操作状态" align="center" prop="status">
start-placeholder="开始日期" <template #default="scope">
end-placeholder="结束日期" <dict-tag :options="sys_common_status" :value="scope.row.status" />
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" </template>
></el-date-picker> </el-table-column>
</el-form-item> <el-table-column label="操作日期" align="center" prop="operTime" width="180" sortable="custom"
<el-form-item> :sort-orders="['descending', 'ascending']">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <template #default="scope">
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <span>{{ parseTime(scope.row.operTime) }}</span>
</el-form-item> </template>
</el-table-column>
<el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true"
sortable="custom" :sort-orders="['descending', 'ascending']">
<template #default="scope">
<span>{{ scope.row.costTime }}毫秒</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)"
v-hasPermi="['monitor:operlog:query']">详细</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 操作日志详细 -->
<el-dialog title="操作日志详细" v-model="open" width="800px" append-to-body>
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
<el-form-item label="登录信息:">{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item>
<el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="操作方法:">{{ form.method }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="请求参数:">{{ form.operParam }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="操作状态:">
<div v-if="form.status === 0">正常</div>
<div v-else-if="form.status === 1">失败</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="消耗时间:">{{ form.costTime }}毫秒</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer>
<el-row :gutter="10" class="mb8"> <div class="dialog-footer">
<el-col :span="1.5"> <el-button @click="open = false">关 闭</el-button>
<el-button </div>
type="danger" </template>
plain </el-dialog>
icon="Delete" </div>
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['monitor:operlog:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
@click="handleClean"
v-hasPermi="['monitor:operlog:remove']"
>清空</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['monitor:operlog:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table ref="operlogRef" v-loading="loading" :data="operlogList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="日志编号" align="center" prop="operId" />
<el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" />
<el-table-column label="操作类型" align="center" prop="businessType">
<template #default="scope">
<dict-tag :options="sys_oper_type" :value="scope.row.businessType" />
</template>
</el-table-column>
<el-table-column label="操作人员" align="center" width="110" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
<el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
<el-table-column label="操作状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_common_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作日期" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']">
<template #default="scope">
<span>{{ parseTime(scope.row.operTime) }}</span>
</template>
</el-table-column>
<el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']">
<template #default="scope">
<span>{{ scope.row.costTime }}毫秒</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)" v-hasPermi="['monitor:operlog:query']">详细</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 操作日志详细 -->
<el-dialog title="操作日志详细" v-model="open" width="800px" append-to-body>
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
<el-form-item
label="登录信息:"
>{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item>
<el-form-item label="请求方式:">{{ form.requestMethod }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="操作方法:">{{ form.method }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="请求参数:">{{ form.operParam }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="返回参数:">{{ form.jsonResult }}</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="操作状态:">
<div v-if="form.status === 0">正常</div>
<div v-else-if="form.status === 1">失败</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="消耗时间:">{{ form.costTime }}毫秒</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="操作时间:">{{ parseTime(form.operTime) }}</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="异常信息:" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="open = false">关 闭</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Operlog"> <script setup name="Operlog">
import { list, delOperlog, cleanOperlog } from "@/api/monitor/operlog"; import { list, delOperlog, cleanOperlog } from "@/api/monitor/operlog";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type","sys_common_status"); const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type", "sys_common_status");
const operlogList = ref([]); const operlogList = ref([]);
const open = ref(false); const open = ref(false);
@ -279,7 +220,7 @@ function handleDelete(row) {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 清空按钮操作 */ /** 清空按钮操作 */
function handleClean() { function handleClean() {
@ -288,11 +229,11 @@ function handleClean() {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("清空成功"); proxy.$modal.msgSuccess("清空成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download("monitor/operlog/export",{ proxy.download("monitor/operlog/export", {
...queryParams.value, ...queryParams.value,
}, `config_${new Date().getTime()}.xlsx`); }, `config_${new Date().getTime()}.xlsx`);
} }

View File

@ -1,134 +1,112 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="参数名称" prop="configName"> <el-form-item label="参数名称" prop="configName">
<el-input v-model="queryParams.configName" <el-input v-model="queryParams.configName" placeholder="请输入参数名称" clearable style="width: 240px"
placeholder="请输入参数名称" @keyup.enter="handleQuery" />
clearable </el-form-item>
style="width: 240px" <el-form-item label="参数键名" prop="configKey">
@keyup.enter="handleQuery" <el-input v-model="queryParams.configKey" placeholder="请输入参数键名" clearable style="width: 240px"
/> @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="参数键名" prop="configKey"> <el-form-item label="系统内置" prop="configType">
<el-input <el-select v-model="queryParams.configType" placeholder="系统内置" clearable>
v-model="queryParams.configKey" <el-option v-for="dict in sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
placeholder="请输入参数键名" </el-select>
clearable </el-form-item>
style="width: 240px" <el-form-item label="创建时间" style="width: 308px;">
@keyup.enter="handleQuery" <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
/> start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="系统内置" prop="configType"> <el-form-item>
<el-select v-model="queryParams.configType" placeholder="系统内置" clearable> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-option <el-button icon="Refresh" @click="resetQuery">重置</el-button>
v-for="dict in sys_yes_no" </el-form-item>
:key="dict.value" </el-form>
:label="dict.label"
:value="dict.value" <el-row :gutter="10" class="mb8">
/> <el-col :span="1.5">
</el-select> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:config:add']">新增</el-button>
</el-form-item> </el-col>
<el-form-item label="创建时间" style="width: 308px;"> <el-col :span="1.5">
<el-date-picker <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-model="dateRange" v-hasPermi="['system:config:edit']">修改</el-button>
value-format="YYYY-MM-DD" </el-col>
type="daterange" <el-col :span="1.5">
range-separator="-" <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
start-placeholder="开始日期" v-hasPermi="['system:config:remove']">删除</el-button>
end-placeholder="结束日期" </el-col>
></el-date-picker> <el-col :span="1.5">
</el-form-item> <el-button type="warning" plain icon="Download" @click="handleExport"
<el-form-item> v-hasPermi="['system:config:export']">导出</el-button>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> </el-col>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-col :span="1.5">
</el-form-item> <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache"
v-hasPermi="['system:config:remove']">刷新缓存</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange"
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="参数主键" align="center" prop="configId" />
<el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true" />
<el-table-column label="参数键名" align="center" prop="configKey" :show-overflow-tooltip="true" />
<el-table-column label="参数键值" align="center" prop="configValue" :show-overflow-tooltip="true" />
<el-table-column label="系统内置" align="center" prop="configType">
<template #default="scope">
<dict-tag :options="sys_yes_no" :value="scope.row.configType" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:config:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:config:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="configRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="参数名称" prop="configName">
<el-input v-model="form.configName" placeholder="请输入参数名称" />
</el-form-item>
<el-form-item label="参数键名" prop="configKey">
<el-input v-model="form.configKey" placeholder="请输入参数键名" />
</el-form-item>
<el-form-item label="参数键值" prop="configValue">
<el-input v-model="form.configValue" placeholder="请输入参数键值" />
</el-form-item>
<el-form-item label="系统内置" prop="configType">
<el-radio-group v-model="form.configType">
<el-radio v-for="dict in sys_yes_no" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form> </el-form>
<template #footer>
<el-row :gutter="10" class="mb8"> <div class="dialog-footer">
<el-col :span="1.5"> <el-button type="primary" @click="submitForm">确 定</el-button>
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:config:add']">新增</el-button> <el-button @click="cancel">取 消</el-button>
</el-col> </div>
<el-col :span="1.5"> </template>
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:config:edit']">修改</el-button> </el-dialog>
</el-col> </div>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:config:remove']">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:config:export']">导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Refresh" @click="handleRefreshCache" v-hasPermi="['system:config:remove']">刷新缓存</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="参数主键" align="center" prop="configId" />
<el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true" />
<el-table-column label="参数键名" align="center" prop="configKey" :show-overflow-tooltip="true" />
<el-table-column label="参数键值" align="center" prop="configValue" :show-overflow-tooltip="true" />
<el-table-column label="系统内置" align="center" prop="configType">
<template #default="scope">
<dict-tag :options="sys_yes_no" :value="scope.row.configType" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:config:edit']" >修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:config:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="configRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="参数名称" prop="configName">
<el-input v-model="form.configName" placeholder="请输入参数名称" />
</el-form-item>
<el-form-item label="参数键名" prop="configKey">
<el-input v-model="form.configKey" placeholder="请输入参数键名" />
</el-form-item>
<el-form-item label="参数键值" prop="configValue">
<el-input v-model="form.configValue" placeholder="请输入参数键值" />
</el-form-item>
<el-form-item label="系统内置" prop="configType">
<el-radio-group v-model="form.configType">
<el-radio
v-for="dict in sys_yes_no"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Config"> <script setup name="Config">
@ -253,7 +231,7 @@ function handleDelete(row) {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {

View File

@ -1,143 +1,112 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="部门名称" prop="deptName"> <el-form-item label="部门名称" prop="deptName">
<el-input <el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable style="width: 200px"
v-model="queryParams.deptName" @keyup.enter="handleQuery" />
placeholder="请输入部门名称" </el-form-item>
clearable <el-form-item label="状态" prop="status">
style="width: 200px" <el-select v-model="queryParams.status" placeholder="部门状态" clearable style="width: 200px">
@keyup.enter="handleQuery" <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
/> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item>
<el-select v-model="queryParams.status" placeholder="部门状态" clearable style="width: 200px"> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-option <el-button icon="Refresh" @click="resetQuery">重置</el-button>
v-for="dict in sys_normal_disable" </el-form-item>
:key="dict.value" </el-form>
:label="dict.label"
:value="dict.value" <el-row :gutter="10" class="mb8">
/> <el-col :span="1.5">
</el-select> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dept:add']">新增</el-button>
</el-form-item> </el-col>
<el-form-item> <el-col :span="1.5">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="info" plain icon="Sort" @click="toggleExpandAll">展开/折叠</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-col>
</el-form-item> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-if="refreshTable" v-loading="loading" :data="deptList" row-key="deptId"
:default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
height="calc(100vh - 280px)">
<el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
<el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
<el-table-column prop="status" label="状态" width="100">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="200">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:dept:edit']">修改</el-button>
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)"
v-hasPermi="['system:dept:add']">新增</el-button>
<el-button v-if="scope.row.parentId != 0" link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:dept:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改部门对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form ref="deptRef" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="24" v-if="form.parentId !== 0">
<el-form-item label="上级部门" prop="parentId">
<el-tree-select v-model="form.parentId" :data="deptOptions"
:props="{ value: 'deptId', label: 'deptName', children: 'children' }" value-key="deptId"
placeholder="选择上级部门" check-strictly />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称" prop="deptName">
<el-input v-model="form.deptName" placeholder="请输入部门名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="显示排序" prop="orderNum">
<el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人" prop="leader">
<el-input v-model="form.leader" placeholder="请输入负责人" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="phone">
<el-input v-model="form.phone" placeholder="请输入联系电话" maxlength="11" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer>
<el-row :gutter="10" class="mb8"> <div class="dialog-footer">
<el-col :span="1.5"> <el-button type="primary" @click="submitForm">确 定</el-button>
<el-button <el-button @click="cancel">取 消</el-button>
type="primary" </div>
plain </template>
icon="Plus" </el-dialog>
@click="handleAdd" </div>
v-hasPermi="['system:dept:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
plain
icon="Sort"
@click="toggleExpandAll"
>展开/折叠</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table
v-if="refreshTable"
v-loading="loading"
:data="deptList"
row-key="deptId"
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
<el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
<el-table-column prop="status" label="状态" width="100">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="200">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">修改</el-button>
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']">新增</el-button>
<el-button v-if="scope.row.parentId != 0" link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改部门对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form ref="deptRef" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="24" v-if="form.parentId !== 0">
<el-form-item label="上级部门" prop="parentId">
<el-tree-select
v-model="form.parentId"
:data="deptOptions"
:props="{ value: 'deptId', label: 'deptName', children: 'children' }"
value-key="deptId"
placeholder="选择上级部门"
check-strictly
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称" prop="deptName">
<el-input v-model="form.deptName" placeholder="请输入部门名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="显示排序" prop="orderNum">
<el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人" prop="leader">
<el-input v-model="form.leader" placeholder="请输入负责人" maxlength="20" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="phone">
<el-input v-model="form.phone" placeholder="请输入联系电话" maxlength="11" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Dept"> <script setup name="Dept">
@ -262,12 +231,12 @@ function submitForm() {
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
proxy.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function() { proxy.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function () {
return delDept(row.deptId); return delDept(row.deptId);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
getList(); getList();

View File

@ -1,174 +1,115 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item class="cus-el-form-item" label="字典名称" prop="dictName"> <el-form-item class="cus-el-form-item" label="字典名称" prop="dictName">
<el-input <el-input v-model="queryParams.dictName" placeholder="请输入字典名称" clearable style="width: 240px"
v-model="queryParams.dictName" @keyup.enter="handleQuery" />
placeholder="请输入字典名称" </el-form-item>
clearable <el-form-item class="cus-el-form-item" label="字典类型" prop="dictType">
style="width: 240px" <el-input v-model="queryParams.dictType" placeholder="请输入字典类型" clearable style="width: 240px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery" />
/> </el-form-item>
</el-form-item> <el-form-item class="cus-el-form-item" label="状态" prop="status">
<el-form-item class="cus-el-form-item" label="字典类型" prop="dictType"> <el-select v-model="queryParams.status" placeholder="字典状态" clearable style="width: 240px">
<el-input <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
v-model="queryParams.dictType" </el-select>
placeholder="请输入字典类型" </el-form-item>
clearable <el-form-item class="cus-el-form-item" label="创建时间" style="width: 308px">
style="width: 240px" <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
@keyup.enter="handleQuery" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
/> </el-form-item>
</el-form-item> <el-form-item>
<el-form-item class="cus-el-form-item" label="状态" prop="status"> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-select <el-button icon="Refresh" @click="resetQuery">重置</el-button>
v-model="queryParams.status" </el-form-item>
placeholder="字典状态" </el-form>
clearable
style="width: 240px" <el-row :gutter="10" class="mb8">
> <el-col :span="1.5">
<el-option <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">新增</el-button>
v-for="dict in sys_normal_disable" </el-col>
:key="dict.value" <el-col :span="1.5">
:label="dict.label" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
:value="dict.value" v-hasPermi="['system:dict:edit']">修改</el-button>
/> </el-col>
</el-select> <el-col :span="1.5">
</el-form-item> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
<el-form-item class="cus-el-form-item" label="创建时间" style="width: 308px"> v-hasPermi="['system:dict:remove']">删除</el-button>
<el-date-picker </el-col>
v-model="dateRange" <el-col :span="1.5">
value-format="YYYY-MM-DD" <el-button type="warning" plain icon="Download" @click="handleExport"
type="daterange" v-hasPermi="['system:dict:export']">导出</el-button>
range-separator="-" </el-col>
start-placeholder="开始日期" <el-col :span="1.5">
end-placeholder="结束日期" <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache"
></el-date-picker> v-hasPermi="['system:dict:remove']">刷新缓存</el-button>
</el-form-item> </el-col>
<el-form-item> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> </el-row>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange"
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="字典编号" align="center" prop="dictId" />
<el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true" />
<el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
<template #default="scope">
<router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type">
<span>{{ scope.row.dictType }}</span>
</router-link>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:dict:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:dict:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="dictRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="字典名称" prop="dictName">
<el-input v-model="form.dictName" placeholder="请输入字典名称" />
</el-form-item>
<el-form-item label="字典类型" prop="dictType">
<el-input v-model="form.dictType" placeholder="请输入字典类型" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form> </el-form>
<template #footer>
<el-row :gutter="10" class="mb8"> <div class="dialog-footer">
<el-col :span="1.5"> <el-button type="primary" @click="submitForm">确 定</el-button>
<el-button <el-button @click="cancel">取 消</el-button>
type="primary" </div>
plain </template>
icon="Plus" </el-dialog>
@click="handleAdd" </div>
v-hasPermi="['system:dict:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:dict:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:dict:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['system:dict:export']"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Refresh"
@click="handleRefreshCache"
v-hasPermi="['system:dict:remove']"
>刷新缓存</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="字典编号" align="center" prop="dictId" />
<el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true"/>
<el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
<template #default="scope">
<router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type">
<span>{{ scope.row.dictType }}</span>
</router-link>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="dictRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="字典名称" prop="dictName">
<el-input v-model="form.dictName" placeholder="请输入字典名称" />
</el-form-item>
<el-form-item label="字典类型" prop="dictType">
<el-input v-model="form.dictType" placeholder="请输入字典类型" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Dict"> <script setup name="Dict">
@ -287,12 +228,12 @@ function submitForm() {
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const dictIds = row.dictId || ids.value; const dictIds = row.dictId || ids.value;
proxy.$modal.confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?').then(function() { proxy.$modal.confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?').then(function () {
return delType(dictIds); return delType(dictIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
@ -313,7 +254,7 @@ getList();
<style scoped lang="scss"> <style scoped lang="scss">
.cus-el-form-item { .cus-el-form-item {
margin-bottom: 5px; margin-bottom: 5px;
margin-right: 10px; margin-right: 10px;
} }
</style> </style>

View File

@ -1,161 +1,114 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="公告标题" prop="noticeTitle"> <el-form-item label="公告标题" prop="noticeTitle">
<el-input <el-input v-model="queryParams.noticeTitle" placeholder="请输入公告标题" clearable style="width: 200px"
v-model="queryParams.noticeTitle" @keyup.enter="handleQuery" />
placeholder="请输入公告标题" </el-form-item>
clearable <el-form-item label="操作人员" prop="createBy">
style="width: 200px" <el-input v-model="queryParams.createBy" placeholder="请输入操作人员" clearable style="width: 200px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery" />
/> </el-form-item>
</el-form-item> <el-form-item label="类型" prop="noticeType">
<el-form-item label="操作人员" prop="createBy"> <el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable style="width: 200px">
<el-input <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" />
v-model="queryParams.createBy" </el-select>
placeholder="请输入操作人员" </el-form-item>
clearable <el-form-item>
style="width: 200px" <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@keyup.enter="handleQuery" <el-button icon="Refresh" @click="resetQuery">重置</el-button>
/> </el-form-item>
</el-form-item> </el-form>
<el-form-item label="类型" prop="noticeType">
<el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable style="width: 200px"> <el-row :gutter="10" class="mb8">
<el-option <el-col :span="1.5">
v-for="dict in sys_notice_type" <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:notice:add']">新增</el-button>
:key="dict.value" </el-col>
:label="dict.label" <el-col :span="1.5">
:value="dict.value" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
/> v-hasPermi="['system:notice:edit']">修改</el-button>
</el-select> </el-col>
</el-form-item> <el-col :span="1.5">
<el-form-item> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> v-hasPermi="['system:notice:remove']">删除</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-col>
</el-form-item> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange"
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="noticeId" width="100" />
<el-table-column label="公告标题" align="center" prop="noticeTitle" :show-overflow-tooltip="true" />
<el-table-column label="公告类型" align="center" prop="noticeType" width="100">
<template #default="scope">
<dict-tag :options="sys_notice_type" :value="scope.row.noticeType" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :options="sys_notice_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建者" align="center" prop="createBy" width="100" />
<el-table-column label="创建时间" align="center" prop="createTime" width="100">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:notice:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:notice:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改公告对话框 -->
<el-dialog :title="title" v-model="open" width="780px" append-to-body>
<el-form ref="noticeRef" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="公告标题" prop="noticeTitle">
<el-input v-model="form.noticeTitle" placeholder="请输入公告标题" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="公告类型" prop="noticeType">
<el-select v-model="form.noticeType" placeholder="请选择">
<el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_notice_status" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容">
<editor v-model="form.noticeContent" :min-height="192" />
</el-form-item>
</el-col>
</el-row>
</el-form> </el-form>
<template #footer>
<el-row :gutter="10" class="mb8"> <div class="dialog-footer">
<el-col :span="1.5"> <el-button type="primary" @click="submitForm">确 定</el-button>
<el-button <el-button @click="cancel">取 消</el-button>
type="primary" </div>
plain </template>
icon="Plus" </el-dialog>
@click="handleAdd" </div>
v-hasPermi="['system:notice:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:notice:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:notice:remove']"
>删除</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="noticeId" width="100" />
<el-table-column
label="公告标题"
align="center"
prop="noticeTitle"
:show-overflow-tooltip="true"
/>
<el-table-column label="公告类型" align="center" prop="noticeType" width="100">
<template #default="scope">
<dict-tag :options="sys_notice_type" :value="scope.row.noticeType" />
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :options="sys_notice_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建者" align="center" prop="createBy" width="100" />
<el-table-column label="创建时间" align="center" prop="createTime" width="100">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:notice:remove']" >删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改公告对话框 -->
<el-dialog :title="title" v-model="open" width="780px" append-to-body>
<el-form ref="noticeRef" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="公告标题" prop="noticeTitle">
<el-input v-model="form.noticeTitle" placeholder="请输入公告标题" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="公告类型" prop="noticeType">
<el-select v-model="form.noticeType" placeholder="请选择">
<el-option
v-for="dict in sys_notice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in sys_notice_status"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="内容">
<editor v-model="form.noticeContent" :min-height="192"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Notice"> <script setup name="Notice">
@ -271,12 +224,12 @@ function submitForm() {
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const noticeIds = row.noticeId || ids.value const noticeIds = row.noticeId || ids.value
proxy.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?').then(function() { proxy.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?').then(function () {
return delNotice(noticeIds); return delNotice(noticeIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
getList(); getList();

View File

@ -1,147 +1,104 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="岗位编码" prop="postCode"> <el-form-item label="岗位编码" prop="postCode">
<el-input <el-input v-model="queryParams.postCode" placeholder="请输入岗位编码" clearable style="width: 200px"
v-model="queryParams.postCode" @keyup.enter="handleQuery" />
placeholder="请输入岗位编码" </el-form-item>
clearable <el-form-item label="岗位名称" prop="postName">
style="width: 200px" <el-input v-model="queryParams.postName" placeholder="请输入岗位名称" clearable style="width: 200px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery" />
/> </el-form-item>
</el-form-item> <el-form-item label="状态" prop="status">
<el-form-item label="岗位名称" prop="postName"> <el-select v-model="queryParams.status" placeholder="岗位状态" clearable style="width: 200px">
<el-input <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
v-model="queryParams.postName" </el-select>
placeholder="请输入岗位名称" </el-form-item>
clearable <el-form-item>
style="width: 200px" <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@keyup.enter="handleQuery" <el-button icon="Refresh" @click="resetQuery">重置</el-button>
/> </el-form-item>
</el-form-item> </el-form>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="岗位状态" clearable style="width: 200px"> <el-row :gutter="10" class="mb8">
<el-option <el-col :span="1.5">
v-for="dict in sys_normal_disable" <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:post:add']">新增</el-button>
:key="dict.value" </el-col>
:label="dict.label" <el-col :span="1.5">
:value="dict.value" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
/> v-hasPermi="['system:post:edit']">修改</el-button>
</el-select> </el-col>
</el-form-item> <el-col :span="1.5">
<el-form-item> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> v-hasPermi="['system:post:remove']">删除</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-col>
</el-form-item> <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['system:post:export']">导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"
height="calc(100vh - 280px)">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="岗位编号" align="center" prop="postId" />
<el-table-column label="岗位编码" align="center" prop="postCode" />
<el-table-column label="岗位名称" align="center" prop="postName" />
<el-table-column label="岗位排序" align="center" prop="postSort" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:post:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:post:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改岗位对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="postRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="岗位名称" prop="postName">
<el-input v-model="form.postName" placeholder="请输入岗位名称" />
</el-form-item>
<el-form-item label="岗位编码" prop="postCode">
<el-input v-model="form.postCode" placeholder="请输入编码名称" />
</el-form-item>
<el-form-item label="岗位顺序" prop="postSort">
<el-input-number v-model="form.postSort" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="岗位状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form> </el-form>
<template #footer>
<el-row :gutter="10" class="mb8"> <div class="dialog-footer">
<el-col :span="1.5"> <el-button type="primary" @click="submitForm">确 定</el-button>
<el-button <el-button @click="cancel">取 消</el-button>
type="primary" </div>
plain </template>
icon="Plus" </el-dialog>
@click="handleAdd" </div>
v-hasPermi="['system:post:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:post:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:post:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['system:post:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="岗位编号" align="center" prop="postId" />
<el-table-column label="岗位编码" align="center" prop="postCode" />
<el-table-column label="岗位名称" align="center" prop="postName" />
<el-table-column label="岗位排序" align="center" prop="postSort" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']">修改</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改岗位对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="postRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="岗位名称" prop="postName">
<el-input v-model="form.postName" placeholder="请输入岗位名称" />
</el-form-item>
<el-form-item label="岗位编码" prop="postCode">
<el-input v-model="form.postCode" placeholder="请输入编码名称" />
</el-form-item>
<el-form-item label="岗位顺序" prop="postSort">
<el-input-number v-model="form.postSort" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="岗位状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Post"> <script setup name="Post">
@ -259,12 +216,12 @@ function submitForm() {
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const postIds = row.postId || ids.value; const postIds = row.postId || ids.value;
proxy.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function() { proxy.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function () {
return delPost(postIds); return delPost(postIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {

View File

@ -1,244 +1,171 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px"> <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
<el-form-item label="角色名称" prop="roleName"> <el-form-item label="角色名称" prop="roleName">
<el-input <el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable style="width: 240px"
v-model="queryParams.roleName" @keyup.enter="handleQuery" />
placeholder="请输入角色名称" </el-form-item>
clearable <el-form-item label="权限字符" prop="roleKey">
style="width: 240px" <el-input v-model="queryParams.roleKey" placeholder="请输入权限字符" clearable style="width: 240px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery" />
/> </el-form-item>
</el-form-item> <el-form-item label="状态" prop="status">
<el-form-item label="权限字符" prop="roleKey"> <el-select v-model="queryParams.status" placeholder="角色状态" clearable style="width: 240px">
<el-input <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
v-model="queryParams.roleKey" </el-select>
placeholder="请输入权限字符" </el-form-item>
clearable <el-form-item label="创建时间" style="width: 308px">
style="width: 240px" <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
@keyup.enter="handleQuery" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
/> </el-form-item>
</el-form-item> <el-form-item>
<el-form-item label="状态" prop="status"> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-select <el-button icon="Refresh" @click="resetQuery">重置</el-button>
v-model="queryParams.status" </el-form-item>
placeholder="角色状态" </el-form>
clearable <el-row :gutter="10" class="mb8">
style="width: 240px" <el-col :span="1.5">
> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:role:add']">新增</el-button>
<el-option </el-col>
v-for="dict in sys_normal_disable" <el-col :span="1.5">
:key="dict.value" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
:label="dict.label" v-hasPermi="['system:role:edit']">修改</el-button>
:value="dict.value" </el-col>
/> <el-col :span="1.5">
</el-select> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
</el-form-item> v-hasPermi="['system:role:remove']">删除</el-button>
<el-form-item label="创建时间" style="width: 308px"> </el-col>
<el-date-picker <el-col :span="1.5">
v-model="dateRange" <el-button type="warning" plain icon="Download" @click="handleExport"
value-format="YYYY-MM-DD" v-hasPermi="['system:role:export']">导出</el-button>
type="daterange" </el-col>
range-separator="-" <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
start-placeholder="开始日期" </el-row>
end-placeholder="结束日期"
></el-date-picker> <!-- 表格数据 -->
</el-form-item> <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"
<el-form-item> height="calc(100vh - 280px)">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-table-column type="selection" width="55" align="center" />
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-table-column label="角色编号" prop="roleId" width="120" />
</el-form-item> <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
<el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
<el-table-column label="显示顺序" prop="roleSort" width="100" />
<el-table-column label="状态" align="center" width="100">
<template #default="scope">
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
@change="handleStatusChange(scope.row)"></el-switch>
</template>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:role:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:role:remove']"></el-button>
</el-tooltip>
<el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)"
v-hasPermi="['system:role:edit']"></el-button>
</el-tooltip>
<el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)"
v-hasPermi="['system:role:edit']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改角色配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="form.roleName" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item prop="roleKey">
<template #label>
<span>
<el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
<el-icon><question-filled /></el-icon>
</el-tooltip>
权限字符
</span>
</template>
<el-input v-model="form.roleKey" placeholder="请输入权限字符" />
</el-form-item>
<el-form-item label="角色顺序" prop="roleSort">
<el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="菜单权限">
<el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
<el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
<el-checkbox v-model="form.menuCheckStrictly"
@change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
<el-tree class="tree-border" :data="menuOptions" show-checkbox ref="menuRef" node-key="id"
:check-strictly="!form.menuCheckStrictly" empty-text="加载中,请稍候"
:props="{ label: 'label', children: 'children' }"></el-tree>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <template #footer>
<el-col :span="1.5"> <div class="dialog-footer">
<el-button <el-button type="primary" @click="submitForm">确 定</el-button>
type="primary" <el-button @click="cancel">取 消</el-button>
plain </div>
icon="Plus" </template>
@click="handleAdd" </el-dialog>
v-hasPermi="['system:role:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="Edit"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:role:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:role:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['system:role:export']"
>导出</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格数据 --> <!-- 分配角色数据权限对话框 -->
<el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> <el-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
<el-table-column type="selection" width="55" align="center" /> <el-form :model="form" label-width="80px">
<el-table-column label="角色编号" prop="roleId" width="120" /> <el-form-item label="角色名称">
<el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" /> <el-input v-model="form.roleName" :disabled="true" />
<el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" /> </el-form-item>
<el-table-column label="显示顺序" prop="roleSort" width="100" /> <el-form-item label="权限字符">
<el-table-column label="状态" align="center" width="100"> <el-input v-model="form.roleKey" :disabled="true" />
<template #default="scope"> </el-form-item>
<el-switch <el-form-item label="权限范围">
v-model="scope.row.status" <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
active-value="0" <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label"
inactive-value="1" :value="item.value"></el-option>
@change="handleStatusChange(scope.row)" </el-select>
></el-switch> </el-form-item>
</template> <el-form-item label="数据权限" v-show="form.dataScope == 2">
</el-table-column> <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
<el-table-column label="创建时间" align="center" prop="createTime"> <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
<template #default="scope"> <el-checkbox v-model="form.deptCheckStrictly"
<span>{{ parseTime(scope.row.createTime) }}</span> @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
</template> <el-tree class="tree-border" :data="deptOptions" show-checkbox default-expand-all ref="deptRef" node-key="id"
</el-table-column> :check-strictly="!form.deptCheckStrictly" empty-text="加载中,请稍候"
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> :props="{ label: 'label', children: 'children' }"></el-tree>
<template #default="scope"> </el-form-item>
<el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1"> </el-form>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button> <template #footer>
</el-tooltip> <div class="dialog-footer">
<el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1"> <el-button type="primary" @click="submitDataScope">确 定</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button> <el-button @click="cancelDataScope">取 消</el-button>
</el-tooltip> </div>
<el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1"> </template>
<el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button> </el-dialog>
</el-tooltip> </div>
<el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
<el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改角色配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="form.roleName" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item prop="roleKey">
<template #label>
<span>
<el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
<el-icon><question-filled /></el-icon>
</el-tooltip>
权限字符
</span>
</template>
<el-input v-model="form.roleKey" placeholder="请输入权限字符" />
</el-form-item>
<el-form-item label="角色顺序" prop="roleSort">
<el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="菜单权限">
<el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
<el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
<el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
<el-tree
class="tree-border"
:data="menuOptions"
show-checkbox
ref="menuRef"
node-key="id"
:check-strictly="!form.menuCheckStrictly"
empty-text="加载中,请稍候"
:props="{ label: 'label', children: 'children' }"
></el-tree>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<!-- 分配角色数据权限对话框 -->
<el-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
<el-form :model="form" label-width="80px">
<el-form-item label="角色名称">
<el-input v-model="form.roleName" :disabled="true" />
</el-form-item>
<el-form-item label="权限字符">
<el-input v-model="form.roleKey" :disabled="true" />
</el-form-item>
<el-form-item label="权限范围">
<el-select v-model="form.dataScope" @change="dataScopeSelectChange">
<el-option
v-for="item in dataScopeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据权限" v-show="form.dataScope == 2">
<el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
<el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
<el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
<el-tree
class="tree-border"
:data="deptOptions"
show-checkbox
default-expand-all
ref="deptRef"
node-key="id"
:check-strictly="!form.deptCheckStrictly"
empty-text="加载中,请稍候"
:props="{ label: 'label', children: 'children' }"
></el-tree>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitDataScope">确 定</el-button>
<el-button @click="cancelDataScope">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="Role"> <script setup name="Role">
@ -324,7 +251,7 @@ function handleDelete(row) {
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {

View File

@ -1,241 +1,240 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-row :gutter="20"> <el-row :gutter="20">
<!--部门数据--> <!--部门数据-->
<el-col :span="4" :xs="24"> <el-col :span="4" :xs="24">
<div class="head-container"> <div class="head-container">
<el-input v-model="deptName" placeholder="请输入部门名称" clearable prefix-icon="Search" <el-input v-model="deptName" placeholder="请输入部门名称" clearable prefix-icon="Search"
style="margin-bottom: 20px" /> style="margin-bottom: 20px" />
</div> </div>
<div class="head-container"> <div class="head-container">
<el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }" <el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }" :expand-on-click-node="false"
:expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id" highlight-current default-expand-all
highlight-current default-expand-all @node-click="handleNodeClick" /> @node-click="handleNodeClick" />
</div> </div>
</el-col> </el-col>
<!--用户数据--> <!--用户数据-->
<el-col :span="20" :xs="24"> <el-col :span="20" :xs="24">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-form-item label="用户名称" prop="userName"> <el-form-item label="用户名称" prop="userName">
<el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px" <el-input v-model="queryParams.userName" placeholder="请输入用户名称" clearable style="width: 240px"
@keyup.enter="handleQuery" /> @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="手机号码" prop="phonenumber"> <el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable style="width: 240px" <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable style="width: 240px"
@keyup.enter="handleQuery" /> @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px"> <el-select v-model="queryParams.status" placeholder="用户状态" clearable style="width: 240px">
<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
:value="dict.value" /> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item label="创建时间" style="width: 308px;">
<el-form-item label="创建时间" style="width: 308px;"> <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker> </el-form-item>
</el-form-item> <el-form-item>
<el-form-item> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-form-item>
</el-form-item> </el-form>
</el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" <el-button type="primary" plain icon="Plus" @click="handleAdd"
v-hasPermi="['system:user:add']">新增</el-button> v-hasPermi="['system:user:add']">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
v-hasPermi="['system:user:edit']">修改</el-button> v-hasPermi="['system:user:edit']">修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
v-hasPermi="['system:user:remove']">删除</el-button> v-hasPermi="['system:user:remove']">删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="info" plain icon="Upload" @click="handleImport" <el-button type="info" plain icon="Upload" @click="handleImport"
v-hasPermi="['system:user:import']">excel导入</el-button> v-hasPermi="['system:user:import']">excel导入</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="info" plain icon="Upload" @click="handleImportFromLis" <el-button type="info" plain icon="Upload" @click="handleImportFromLis"
v-hasPermi="['system:user:import']">老lis导入</el-button> v-hasPermi="['system:user:import']">老lis导入</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" <el-button type="warning" plain icon="Download" @click="handleExport"
v-hasPermi="['system:user:export']">导出</el-button> v-hasPermi="['system:user:export']">导出</el-button>
</el-col> </el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> </el-row>
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"
<el-table-column type="selection" width="50" align="center" /> height="calc(100vh - 300px)">
<el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" /> <el-table-column type="selection" width="50" align="center" />
<el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible" <el-table-column label="用户编号" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
:show-overflow-tooltip="true" /> <el-table-column label="用户名称" align="center" key="userName" prop="userName" v-if="columns[1].visible"
<el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
:show-overflow-tooltip="true" /> <el-table-column label="用户昵称" align="center" key="nickName" prop="nickName" v-if="columns[2].visible"
<el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />
:show-overflow-tooltip="true" /> <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible"
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" :show-overflow-tooltip="true" />
v-if="columns[4].visible" width="120" /> <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible"
<el-table-column label="状态" align="center" key="status" v-if="columns[5].visible"> width="120" />
<template #default="scope"> <el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" <template #default="scope">
@change="handleStatusChange(scope.row)"></el-switch> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
</template> @change="handleStatusChange(scope.row)"></el-switch>
</el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:user:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:user:remove']"></el-button>
</el-tooltip>
<el-tooltip content="重置密码" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)"
v-hasPermi="['system:user:resetPwd']"></el-button>
</el-tooltip>
<el-tooltip content="分配角色" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"
v-hasPermi="['system:user:edit']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-col>
</el-row>
<!-- 添加或修改用户配置对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="归属部门" prop="deptId">
<el-tree-select v-model="form.deptId" :data="deptOptions"
:props="{ value: 'id', label: 'label', children: 'children' }" value-key="id"
placeholder="请选择归属部门" check-strictly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20"
show-password />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="form.sex" placeholder="请选择">
<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="form.postIds" multiple placeholder="请选择">
<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName"
:value="item.postId" :disabled="item.status == 1"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="角色">
<el-select v-model="form.roleIds" multiple placeholder="请选择">
<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName"
:value="item.roleId" :disabled="item.status == 1"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<!-- 用户导入对话框 -->
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
</div>
<span>仅允许导入xls、xlsx格式文件。</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
@click="importTemplate">下载模板</el-link>
</div>
</template> </template>
</el-upload> </el-table-column>
<template #footer> <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
<div class="dialog-footer"> <template #default="scope">
<el-button type="primary" @click="submitFileForm">确 定</el-button> <span>{{ parseTime(scope.row.createTime) }}</span>
<el-button @click="upload.open = false">取 消</el-button> </template>
</el-table-column>
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="修改" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
v-hasPermi="['system:user:edit']"></el-button>
</el-tooltip>
<el-tooltip content="删除" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
v-hasPermi="['system:user:remove']"></el-button>
</el-tooltip>
<el-tooltip content="重置密码" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)"
v-hasPermi="['system:user:resetPwd']"></el-button>
</el-tooltip>
<el-tooltip content="分配角色" placement="top" v-if="scope.row.userId !== 1">
<el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"
v-hasPermi="['system:user:edit']"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-col>
</el-row>
<!-- 添加或修改用户配置对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="用户昵称" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入用户昵称" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="归属部门" prop="deptId">
<el-tree-select v-model="form.deptId" :data="deptOptions"
:props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="请选择归属部门"
check-strictly />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="手机号码" prop="phonenumber">
<el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户名称" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="30" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="form.sex" placeholder="请选择">
<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="form.postIds" multiple placeholder="请选择">
<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId"
:disabled="item.status == 1"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="角色">
<el-select v-model="form.roleIds" multiple placeholder="请选择">
<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId"
:disabled="item.status == 1"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<!-- 用户导入对话框 -->
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据
</div> </div>
</template> <span>仅允许导入xls、xlsx格式文件。</span>
</el-dialog> <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
</div> @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template> </template>
<script setup name="User"> <script setup name="User">
@ -264,266 +263,266 @@ const postOptions = ref([]);
const roleOptions = ref([]); const roleOptions = ref([]);
/*** 用户导入参数 */ /*** 用户导入参数 */
const upload = reactive({ const upload = reactive({
// 是否显示弹出层(用户导入) // 是否显示弹出层(用户导入)
open: false, open: false,
// 弹出层标题(用户导入) // 弹出层标题(用户导入)
title: "", title: "",
// 是否禁用上传 // 是否禁用上传
isUploading: false, isUploading: false,
// 是否更新已经存在的用户数据 // 是否更新已经存在的用户数据
updateSupport: 0, updateSupport: 0,
// 设置上传的请求头部 // 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() }, headers: { Authorization: "Bearer " + getToken() },
// 上传的地址 // 上传的地址
url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData" url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
}); });
// 列显隐信息 // 列显隐信息
const columns = ref([ const columns = ref([
{ key: 0, label: `用户编号`, visible: true }, { key: 0, label: `用户编号`, visible: true },
{ key: 1, label: `用户名称`, visible: true }, { key: 1, label: `用户名称`, visible: true },
{ key: 2, label: `用户昵称`, visible: true }, { key: 2, label: `用户昵称`, visible: true },
{ key: 3, label: `部门`, visible: true }, { key: 3, label: `部门`, visible: true },
{ key: 4, label: `手机号码`, visible: true }, { key: 4, label: `手机号码`, visible: true },
{ key: 5, label: `状态`, visible: true }, { key: 5, label: `状态`, visible: true },
{ key: 6, label: `创建时间`, visible: true } { key: 6, label: `创建时间`, visible: true }
]); ]);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
userName: undefined, userName: undefined,
phonenumber: undefined, phonenumber: undefined,
status: undefined, status: undefined,
deptId: undefined deptId: undefined
}, },
rules: { rules: {
userName: [{ required: true, message: "用户名称不能为空", trigger: "blur" }, { min: 2, max: 20, message: "用户名称长度必须介于 2 和 20 之间", trigger: "blur" }], userName: [{ required: true, message: "用户名称不能为空", trigger: "blur" }, { min: 2, max: 20, message: "用户名称长度必须介于 2 和 20 之间", trigger: "blur" }],
nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }], nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }], password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }],
email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }], email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }] phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
} }
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 通过条件过滤节点 */ /** 通过条件过滤节点 */
const filterNode = (value, data) => { const filterNode = (value, data) => {
if (!value) return true; if (!value) return true;
return data.label.indexOf(value) !== -1; return data.label.indexOf(value) !== -1;
}; };
/** 根据名称筛选部门树 */ /** 根据名称筛选部门树 */
watch(deptName, val => { watch(deptName, val => {
proxy.$refs["deptTreeRef"].filter(val); proxy.$refs["deptTreeRef"].filter(val);
}); });
/** 查询部门下拉树结构 */ /** 查询部门下拉树结构 */
function getDeptTree() { function getDeptTree() {
deptTreeSelect().then(response => { deptTreeSelect().then(response => {
deptOptions.value = response.data; deptOptions.value = response.data;
}); });
}; };
/** 查询用户列表 */ /** 查询用户列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => { listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
loading.value = false; loading.value = false;
userList.value = res.rows; userList.value = res.rows;
total.value = res.total; total.value = res.total;
}); });
}; };
/** 节点单击事件 */ /** 节点单击事件 */
function handleNodeClick(data) { function handleNodeClick(data) {
queryParams.value.deptId = data.id; queryParams.value.deptId = data.id;
handleQuery(); handleQuery();
}; };
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
}; };
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
dateRange.value = []; dateRange.value = [];
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
queryParams.value.deptId = undefined; queryParams.value.deptId = undefined;
proxy.$refs.deptTreeRef.setCurrentKey(null); proxy.$refs.deptTreeRef.setCurrentKey(null);
handleQuery(); handleQuery();
}; };
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const userIds = row.userId || ids.value; const userIds = row.userId || ids.value;
proxy.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function () { proxy.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function () {
return delUser(userIds); return delUser(userIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => { }); }).catch(() => { });
}; };
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download("system/user/export", { proxy.download("system/user/export", {
...queryParams.value, ...queryParams.value,
}, `user_${new Date().getTime()}.xlsx`); }, `user_${new Date().getTime()}.xlsx`);
}; };
/** 用户状态修改 */ /** 用户状态修改 */
function handleStatusChange(row) { function handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用"; let text = row.status === "0" ? "启用" : "停用";
proxy.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () { proxy.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?').then(function () {
return changeUserStatus(row.userId, row.status); return changeUserStatus(row.userId, row.status);
}).then(() => { }).then(() => {
proxy.$modal.msgSuccess(text + "成功"); proxy.$modal.msgSuccess(text + "成功");
}).catch(function () { }).catch(function () {
row.status = row.status === "0" ? "1" : "0"; row.status = row.status === "0" ? "1" : "0";
}); });
}; };
/** 更多操作 */ /** 更多操作 */
function handleCommand(command, row) { function handleCommand(command, row) {
switch (command) { switch (command) {
case "handleResetPwd": case "handleResetPwd":
handleResetPwd(row); handleResetPwd(row);
break; break;
case "handleAuthRole": case "handleAuthRole":
handleAuthRole(row); handleAuthRole(row);
break; break;
default: default:
break; break;
} }
}; };
/** 跳转角色分配 */ /** 跳转角色分配 */
function handleAuthRole(row) { function handleAuthRole(row) {
const userId = row.userId; const userId = row.userId;
router.push("/system/user-auth/role/" + userId); router.push("/system/user-auth/role/" + userId);
}; };
/** 重置密码按钮操作 */ /** 重置密码按钮操作 */
function handleResetPwd(row) { function handleResetPwd(row) {
proxy.$prompt('请输入"' + row.userName + '"的新密码', "提示", { proxy.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
closeOnClickModal: false, closeOnClickModal: false,
inputPattern: /^.{5,20}$/, inputPattern: /^.{5,20}$/,
inputErrorMessage: "用户密码长度必须介于 5 和 20 之间", inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
}).then(({ value }) => { }).then(({ value }) => {
resetUserPwd(row.userId, value).then(response => { resetUserPwd(row.userId, value).then(response => {
proxy.$modal.msgSuccess("修改成功,新密码是:" + value); proxy.$modal.msgSuccess("修改成功,新密码是:" + value);
}); });
}).catch(() => { }); }).catch(() => { });
}; };
/** 选择条数 */ /** 选择条数 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.userId); ids.value = selection.map(item => item.userId);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
}; };
/** 导入按钮操作 */ /** 导入按钮操作 */
function handleImport() { function handleImport() {
upload.title = "用户导入"; upload.title = "用户导入";
upload.open = true; upload.open = true;
}; };
//从老的lis系统导入用户 //从老的lis系统导入用户
async function handleImportFromLis() { async function handleImportFromLis() {
const isConfirmed = await deleteConfirm('是否导入老lis数据?', { title: '导入数据', type: 'warning', confirmButtonText: '确认导入' }) const isConfirmed = await deleteConfirm('是否导入老lis数据?', { title: '导入数据', type: 'warning', confirmButtonText: '确认导入' })
if (isConfirmed) { if (isConfirmed) {
loading.value = true loading.value = true
await importFromLis().then(response => { await importFromLis().then(response => {
proxy.$modal.msgSuccess("导入成功"); proxy.$modal.msgSuccess("导入成功");
getList(); getList();
}); });
loading.value = false loading.value = false
} }
} }
/** 下载模板操作 */ /** 下载模板操作 */
function importTemplate() { function importTemplate() {
proxy.download("system/user/importTemplate", { proxy.download("system/user/importTemplate", {
}, `user_template_${new Date().getTime()}.xlsx`); }, `user_template_${new Date().getTime()}.xlsx`);
}; };
/**文件上传中处理 */ /**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => { const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true; upload.isUploading = true;
}; };
/** 文件上传成功处理 */ /** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => { const handleFileSuccess = (response, file, fileList) => {
upload.open = false; upload.open = false;
upload.isUploading = false; upload.isUploading = false;
proxy.$refs["uploadRef"].handleRemove(file); proxy.$refs["uploadRef"].handleRemove(file);
proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true }); proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
getList(); getList();
}; };
/** 提交上传文件 */ /** 提交上传文件 */
function submitFileForm() { function submitFileForm() {
proxy.$refs["uploadRef"].submit(); proxy.$refs["uploadRef"].submit();
}; };
/** 重置操作表单 */ /** 重置操作表单 */
function reset() { function reset() {
form.value = { form.value = {
userId: undefined, userId: undefined,
deptId: undefined, deptId: undefined,
userName: undefined, userName: undefined,
nickName: undefined, nickName: undefined,
password: undefined, password: undefined,
phonenumber: undefined, phonenumber: undefined,
email: undefined, email: undefined,
sex: undefined, sex: undefined,
status: "0", status: "0",
remark: undefined, remark: undefined,
postIds: [], postIds: [],
roleIds: [] roleIds: []
}; };
proxy.resetForm("userRef"); proxy.resetForm("userRef");
}; };
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
}; };
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
getUser().then(response => { getUser().then(response => {
postOptions.value = response.posts; postOptions.value = response.posts;
roleOptions.value = response.roles; roleOptions.value = response.roles;
open.value = true; open.value = true;
title.value = "添加用户"; title.value = "添加用户";
form.value.password = initPassword.value; form.value.password = initPassword.value;
}); });
}; };
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const userId = row.userId || ids.value; const userId = row.userId || ids.value;
getUser(userId).then(response => { getUser(userId).then(response => {
form.value = response.data; form.value = response.data;
postOptions.value = response.posts; postOptions.value = response.posts;
roleOptions.value = response.roles; roleOptions.value = response.roles;
form.value.postIds = response.postIds; form.value.postIds = response.postIds;
form.value.roleIds = response.roleIds; form.value.roleIds = response.roleIds;
open.value = true; open.value = true;
title.value = "修改用户"; title.value = "修改用户";
form.password = ""; form.password = "";
}); });
}; };
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["userRef"].validate(valid => { proxy.$refs["userRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.userId != undefined) { if (form.value.userId != undefined) {
updateUser(form.value).then(response => { updateUser(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addUser(form.value).then(response => { addUser(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
}
} }
}); }
});
}; };
getDeptTree(); getDeptTree();
@ -533,10 +532,10 @@ getList();
<style lang="scss" scoped> <style lang="scss" scoped>
.el-form--inline .el-form-item { .el-form--inline .el-form-item {
margin-right: 12px; margin-right: 12px;
} }
.el-form-item--default { .el-form-item--default {
margin-bottom: 8px; margin-bottom: 8px;
} }
</style> </style>

View File

@ -4,10 +4,7 @@ import {
} from 'vite' } from 'vite'
import path from 'path' import path from 'path'
import createVitePlugins from './vite/plugins' import createVitePlugins from './vite/plugins'
import viteImagemin from 'vite-plugin-imagemin' import.meta
import {
visualizer
} from 'rollup-plugin-visualizer'
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig(({ export default defineConfig(({
@ -23,28 +20,7 @@ export default defineConfig(({
// 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上 // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
base: VITE_APP_ENV === 'production' ? '/' : '/', base: VITE_APP_ENV === 'production' ? '/' : '/',
plugins: [ plugins: createVitePlugins(env, command === 'build'),
createVitePlugins(env, command === 'build'),
// 图片压缩
VITE_APP_ENV === 'production' && viteImagemin({
gifsicle: {
optimizationLevel: 3
},
optipng: {
optimizationLevel: 7
},
mozjpeg: {
quality: 85
},
svgo: {
plugins: [{
removeViewBox: false
}, {
cleanupIDs: false
}]
}
})
].filter(Boolean),
resolve: { resolve: {
// https://cn.vitejs.dev/config/#resolve-alias // https://cn.vitejs.dev/config/#resolve-alias
alias: { alias: {
@ -92,54 +68,21 @@ export default defineConfig(({
}] }]
} }
}, },
// 新增build配置,用于生产环境移除console
build: { build: {
minify: VITE_APP_ENV === 'production' ? 'terser' : 'esbuild', // 只有生产环境才移除console
terserOptions: VITE_APP_ENV === 'production' ? { minify: VITE_APP_ENV === 'production' ? 'esbuild' : 'terser',
compress: {
drop_console: true,
drop_debugger: true,
pure_funcs: ['console.log', 'console.warn'],
collapse_vars: true,
reduce_vars: true
},
format: {
comments: false
}
} : {},
esbuild: { esbuild: {
// 生产环境下移除console和debugger
drop: VITE_APP_ENV === 'production' ? ['console', 'debugger'] : [] drop: VITE_APP_ENV === 'production' ? ['console', 'debugger'] : []
}, },
target: 'es2015', target: 'es2015',
cssTarget: ['chrome64', 'firefox67', 'safari11.1', 'edge79'], cssTarget: ['chrome64', 'firefox67', 'safari11.1', 'edge79'] // CSS兼容目标: ['chrome64', 'firefox67', 'safari11.1', 'edge79'] // CSS兼容目标
assetsInlineLimit: 4096,
chunkSizeWarningLimit: 500,
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) return 'vendor';
if (id.includes('src/components/common')) return 'common-components';
if (id.includes('src/utils')) return 'utils';
},
preload: false,
prefetch: false,
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: '[ext]/[name]-[hash].[ext]'
},
plugins: [
VITE_APP_ENV === 'production' && visualizer({
filename: './node_modules/.cache/visualizer/stats.html',
open: false,
gzipSize: true,
brotliSize: true
})
].filter(Boolean)
}
}, },
optimizeDeps: { optimizeDeps: {
include: ['vue', 'axios'], // 仅预构建核心依赖 // include: ['jquery', 'select2', 'vue3-select2-component'],
exclude: ['sortablejs', 'jquery'] // exclude: ['sortablejs'] // 跳过 Vite 对 SortableJS 的预构建
} },
} }
}) })