Browse Source

style:系统管理

master
waibao2 3 days ago
parent
commit
02baf9d308
  1. 7
      src/views/message/value/index.vue
  2. 364
      src/views/monitor/logininfor/index.vue
  3. 417
      src/views/monitor/operlog/index.vue
  4. 462
      src/views/system/config/index.vue
  5. 383
      src/views/system/dept/index.vue
  6. 534
      src/views/system/dict/data.vue
  7. 477
      src/views/system/dict/index.vue
  8. 455
      src/views/system/menu/index.vue
  9. 415
      src/views/system/notice/index.vue
  10. 420
      src/views/system/post/index.vue
  11. 948
      src/views/system/role/index.vue

7
src/views/message/value/index.vue

@ -224,11 +224,8 @@
const reset = () => { const reset = () => {
Object.assign(form, { Object.assign(form, {
id: null, id: null,
name: null, stnmId: null,
deptId: null, value: null,
department: null,
phone: null,
remarks: null
}); });
proxy.resetForm("formRef"); proxy.resetForm("formRef");
} }

364
src/views/monitor/logininfor/index.vue

@ -1,225 +1,167 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="登录地址" prop="ipaddr"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-input <el-form-item label="登录地址" prop="ipaddr">
v-model="queryParams.ipaddr" <el-input v-model="queryParams.ipaddr" placeholder="请输入登录地址" clearable style="width: 240px;" @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 label="状态" prop="status">
</el-form-item> <el-select v-model="queryParams.status" placeholder="登录状态" clearable style="width: 240px">
<el-form-item label="用户名称" prop="userName"> <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-input </el-select>
v-model="queryParams.userName" </el-form-item>
placeholder="请输入用户名称" <el-form-item label="登录时间" style="width: 308px">
clearable <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>
style="width: 240px;" </el-form-item>
@keyup.enter="handleQuery" <el-form-item>
/> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-form-item> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-form-item label="状态" prop="status"> </el-form-item>
<el-select </el-form>
v-model="queryParams.status"
placeholder="登录状态"
clearable
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" v-hasPermi="['monitor:logininfor:remove']">删除</el-button>
type="danger" </el-col>
plain <el-col :span="1.5">
icon="Delete" <el-button type="danger" plain icon="Delete" @click="handleClean" v-hasPermi="['monitor:logininfor:remove']">清空</el-button>
:disabled="multiple" </el-col>
@click="handleDelete" <el-col :span="1.5">
v-hasPermi="['monitor:logininfor:remove']" <el-button type="primary" plain icon="Unlock" :disabled="single" @click="handleUnlock" v-hasPermi="['monitor:logininfor:unlock']">解锁</el-button>
>删除</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" v-hasPermi="['monitor:logininfor:export']">导出</el-button>
<el-button </el-col>
type="danger" <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
plain </el-row>
icon="Delete" </el-card>
@click="handleClean"
v-hasPermi="['monitor:logininfor:remove']"
>清空</el-button>
</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"> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<el-table-column type="selection" width="55" align="center" /> <el-table ref="logininforRef" v-table-height v-loading="loading" :data="logininforList" @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" :sort-orders="['descending', 'ascending']" />
<el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" /> <el-table-column label="地址" align="center" prop="ipaddr" :show-overflow-tooltip="true" />
<el-table-column label="操作系统" align="center" prop="os" :show-overflow-tooltip="true" /> <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />
<el-table-column label="浏览器" align="center" prop="browser" :show-overflow-tooltip="true" /> <el-table-column label="操作系统" align="center" prop="os" :show-overflow-tooltip="true" />
<el-table-column label="登录状态" align="center" prop="status"> <el-table-column label="浏览器" align="center" prop="browser" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="登录状态" align="center" prop="status">
<dict-tag :options="sys_common_status" :value="scope.row.status" /> <template #default="scope">
</template> <dict-tag :options="sys_common_status" :value="scope.row.status" />
</el-table-column> </template>
<el-table-column label="描述" align="center" prop="msg" :show-overflow-tooltip="true" /> </el-table-column>
<el-table-column label="访问时间" align="center" prop="loginTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180"> <el-table-column label="描述" align="center" prop="msg" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="访问时间" align="center" prop="loginTime" sortable="custom" :sort-orders="['descending', 'ascending']" width="180">
<span>{{ parseTime(scope.row.loginTime) }}</span> <template #default="scope">
</template> <span>{{ parseTime(scope.row.loginTime) }}</span>
</el-table-column> </template>
</el-table> </el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-show="total > 0" </div>
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div> </div>
</template> </template>
<script setup name="Logininfor"> <script setup name="Logininfor">
import { list, delLogininfor, cleanLogininfor, unlockLogininfor } from "@/api/monitor/logininfor"; import { list, delLogininfor, cleanLogininfor, unlockLogininfor } from "@/api/monitor/logininfor";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_common_status } = proxy.useDict("sys_common_status"); const { sys_common_status } = proxy.useDict("sys_common_status");
const logininforList = ref([]); const logininforList = ref([]);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const selectName = ref(""); const selectName = ref("");
const total = ref(0); const total = ref(0);
const dateRange = ref([]); const dateRange = ref([]);
const defaultSort = ref({ prop: "loginTime", order: "descending" }); const defaultSort = ref({ prop: "loginTime", order: "descending" });
// //
const queryParams = ref({ const queryParams = ref({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
ipaddr: undefined, ipaddr: undefined,
userName: undefined, userName: undefined,
status: undefined, status: undefined,
orderByColumn: undefined, orderByColumn: undefined,
isAsc: undefined isAsc: undefined
}); });
/** 查询登录日志列表 */ /** 查询登录日志列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => { list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
logininforList.value = response.rows; logininforList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
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.pageNum = 1; queryParams.value.pageNum = 1;
proxy.$refs["logininforRef"].sort(defaultSort.value.prop, defaultSort.value.order); proxy.$refs["logininforRef"].sort(defaultSort.value.prop, defaultSort.value.order);
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.infoId); ids.value = selection.map(item => item.infoId);
multiple.value = !selection.length; multiple.value = !selection.length;
single.value = selection.length != 1; single.value = selection.length != 1;
selectName.value = selection.map(item => item.userName); selectName.value = selection.map(item => item.userName);
} }
/** 排序触发事件 */ /** 排序触发事件 */
function handleSortChange(column, prop, order) { function handleSortChange(column, prop, order) {
queryParams.value.orderByColumn = column.prop; queryParams.value.orderByColumn = column.prop;
queryParams.value.isAsc = column.order; queryParams.value.isAsc = column.order;
getList(); getList();
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const infoIds = row.infoId || ids.value; const infoIds = row.infoId || ids.value;
proxy.$modal.confirm('是否确认删除访问编号为"' + infoIds + '"的数据项?').then(function () { proxy.$modal.confirm('是否确认删除访问编号为"' + infoIds + '"的数据项?').then(function () {
return delLogininfor(infoIds); return delLogininfor(infoIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 清空按钮操作 */ /** 清空按钮操作 */
function handleClean() { function handleClean() {
proxy.$modal.confirm("是否确认清空所有登录日志数据项?").then(function () { proxy.$modal.confirm("是否确认清空所有登录日志数据项?").then(function () {
return cleanLogininfor(); return cleanLogininfor();
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("清空成功"); proxy.$modal.msgSuccess("清空成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 解锁按钮操作 */ /** 解锁按钮操作 */
function handleUnlock() { function handleUnlock() {
const username = selectName.value; const username = selectName.value;
proxy.$modal.confirm('是否确认解锁用户"' + username + '"数据项?').then(function () { proxy.$modal.confirm('是否确认解锁用户"' + username + '"数据项?').then(function () {
return unlockLogininfor(username); return unlockLogininfor(username);
}).then(() => { }).then(() => {
proxy.$modal.msgSuccess("用户" + username + "解锁成功"); proxy.$modal.msgSuccess("用户" + username + "解锁成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download("monitor/logininfor/export", { proxy.download("monitor/logininfor/export", {
...queryParams.value, ...queryParams.value,
}, `config_${new Date().getTime()}.xlsx`); }, `config_${new Date().getTime()}.xlsx`);
} }
getList(); getList();
</script> </script>

417
src/views/monitor/operlog/index.vue

@ -1,162 +1,93 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="操作地址" prop="operIp"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-input <el-form-item label="操作地址" prop="operIp">
v-model="queryParams.operIp" <el-input v-model="queryParams.operIp" placeholder="请输入操作地址" clearable style="width: 240px;" @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 label="操作人员" prop="operName">
</el-form-item> <el-input v-model="queryParams.operName" placeholder="请输入操作人员" clearable style="width: 240px;" @keyup.enter="handleQuery" />
<el-form-item label="系统模块" prop="title"> </el-form-item>
<el-input <el-form-item label="类型" prop="businessType">
v-model="queryParams.title" <el-select v-model="queryParams.businessType" placeholder="操作类型" clearable style="width: 240px">
placeholder="请输入系统模块" <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" />
clearable </el-select>
style="width: 240px;" </el-form-item>
@keyup.enter="handleQuery" <el-form-item label="状态" prop="status">
/> <el-select v-model="queryParams.status" placeholder="操作状态" clearable style="width: 240px">
</el-form-item> <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-form-item label="操作人员" prop="operName"> </el-select>
<el-input </el-form-item>
v-model="queryParams.operName" <el-form-item label="操作时间" style="width: 308px">
placeholder="请输入操作人员" <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>
clearable </el-form-item>
style="width: 240px;" <el-form-item>
@keyup.enter="handleQuery" <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
/> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
<el-form-item label="类型" prop="businessType"> </el-form>
<el-select
v-model="queryParams.businessType"
placeholder="操作类型"
clearable
style="width: 240px"
>
<el-option
v-for="dict in sys_oper_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="操作状态"
clearable
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" v-hasPermi="['monitor:operlog:remove']">删除</el-button>
type="danger" </el-col>
plain <el-col :span="1.5">
icon="Delete" <el-button type="danger" plain icon="Delete" @click="handleClean" v-hasPermi="['monitor:operlog:remove']">清空</el-button>
:disabled="multiple" </el-col>
@click="handleDelete" <el-col :span="1.5">
v-hasPermi="['monitor:operlog:remove']" <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['monitor:operlog:export']">导出</el-button>
>删除</el-button> </el-col>
</el-col> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-col :span="1.5"> </el-row>
<el-button </el-card>
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"> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<el-table-column type="selection" width="50" align="center" /> <el-table ref="operlogRef" v-table-height v-loading="loading" :data="operlogList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
<el-table-column label="日志编号" align="center" prop="operId" /> <el-table-column type="selection" width="50" align="center" />
<el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" /> <el-table-column label="日志编号" align="center" prop="operId" />
<el-table-column label="操作类型" align="center" prop="businessType"> <el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="操作类型" align="center" prop="businessType">
<dict-tag :options="sys_oper_type" :value="scope.row.businessType" /> <template #default="scope">
</template> <dict-tag :options="sys_oper_type" :value="scope.row.businessType" />
</el-table-column> </template>
<el-table-column label="操作人员" align="center" width="110" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" /> </el-table-column>
<el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" /> <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="status"> <el-table-column label="操作地址" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="操作状态" align="center" prop="status">
<dict-tag :options="sys_common_status" :value="scope.row.status" /> <template #default="scope">
</template> <dict-tag :options="sys_common_status" :value="scope.row.status" />
</el-table-column> </template>
<el-table-column label="操作日期" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']"> </el-table-column>
<template #default="scope"> <el-table-column label="操作日期" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']">
<span>{{ parseTime(scope.row.operTime) }}</span> <template #default="scope">
</template> <span>{{ parseTime(scope.row.operTime) }}</span>
</el-table-column> </template>
<el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']"> </el-table-column>
<template #default="scope"> <el-table-column label="消耗时间" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']">
<span>{{ scope.row.costTime }}毫秒</span> <template #default="scope">
</template> <span>{{ scope.row.costTime }}毫秒</span>
</el-table-column> </template>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> </el-table-column>
<template #default="scope"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)" v-hasPermi="['monitor:operlog:query']">详细</el-button> <template #default="scope">
</template> <el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)" v-hasPermi="['monitor:operlog:query']">详细</el-button>
</el-table-column> </template>
</el-table> </el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 操作日志详细 --> <!-- 操作日志详细 -->
<el-dialog title="操作日志详细" v-model="open" width="800px" append-to-body> <el-dialog class="custom-dialog" title="操作日志详细" v-model="open" width="800px" append-to-body>
<el-form :model="form" label-width="100px"> <el-form :model="form" label-width="100px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item> <el-form-item label="操作模块:">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
<el-form-item <el-form-item label="登录信息:">{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
label="登录信息:"
>{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item> <el-form-item label="请求地址:">{{ form.operUrl }}</el-form-item>
@ -198,104 +129,104 @@
</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);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const title = ref(""); const title = ref("");
const dateRange = ref([]); const dateRange = ref([]);
const defaultSort = ref({ prop: "operTime", order: "descending" }); const defaultSort = ref({ prop: "operTime", order: "descending" });
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
operIp: undefined, operIp: undefined,
title: undefined, title: undefined,
operName: undefined, operName: undefined,
businessType: undefined, businessType: undefined,
status: undefined status: undefined
} }
}); });
const { queryParams, form } = toRefs(data); const { queryParams, form } = toRefs(data);
/** 查询登录日志 */ /** 查询登录日志 */
function getList() { function getList() {
loading.value = true; loading.value = true;
list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => { list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
operlogList.value = response.rows; operlogList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 操作日志类型字典翻译 */ /** 操作日志类型字典翻译 */
function typeFormat(row, column) { function typeFormat(row, column) {
return proxy.selectDictLabel(sys_oper_type.value, row.businessType); return proxy.selectDictLabel(sys_oper_type.value, row.businessType);
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
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.pageNum = 1; queryParams.value.pageNum = 1;
proxy.$refs["operlogRef"].sort(defaultSort.value.prop, defaultSort.value.order); proxy.$refs["operlogRef"].sort(defaultSort.value.prop, defaultSort.value.order);
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.operId); ids.value = selection.map(item => item.operId);
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 排序触发事件 */ /** 排序触发事件 */
function handleSortChange(column, prop, order) { function handleSortChange(column, prop, order) {
queryParams.value.orderByColumn = column.prop; queryParams.value.orderByColumn = column.prop;
queryParams.value.isAsc = column.order; queryParams.value.isAsc = column.order;
getList(); getList();
} }
/** 详细按钮操作 */ /** 详细按钮操作 */
function handleView(row) { function handleView(row) {
open.value = true; open.value = true;
form.value = row; form.value = row;
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const operIds = row.operId || ids.value; const operIds = row.operId || ids.value;
proxy.$modal.confirm('是否确认删除日志编号为"' + operIds + '"的数据项?').then(function () { proxy.$modal.confirm('是否确认删除日志编号为"' + operIds + '"的数据项?').then(function () {
return delOperlog(operIds); return delOperlog(operIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 清空按钮操作 */ /** 清空按钮操作 */
function handleClean() { function handleClean() {
proxy.$modal.confirm("是否确认清空所有操作日志数据项?").then(function () { proxy.$modal.confirm("是否确认清空所有操作日志数据项?").then(function () {
return cleanOperlog(); return cleanOperlog();
}).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`);
} }
getList(); getList();
</script> </script>

462
src/views/system/config/index.vue

@ -1,134 +1,76 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="参数名称" prop="configName"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-input <el-form-item label="参数名称" prop="configName">
v-model="queryParams.configName" <el-input v-model="queryParams.configName" placeholder="请输入参数名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
placeholder="请输入参数名称" </el-form-item>
clearable <el-form-item label="参数键名" prop="configKey">
style="width: 240px" <el-input v-model="queryParams.configKey" placeholder="请输入参数键名" clearable style="width: 240px" @keyup.enter="handleQuery" />
@keyup.enter="handleQuery" </el-form-item>
/> <el-form-item label="系统内置" prop="configType">
</el-form-item> <el-select v-model="queryParams.configType" placeholder="系统内置" clearable>
<el-form-item label="参数键名" prop="configKey"> <el-option v-for="dict in sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-input </el-select>
v-model="queryParams.configKey" </el-form-item>
placeholder="请输入参数键名" <el-form-item label="创建时间" style="width: 308px;">
clearable <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
style="width: 240px" </el-form-item>
@keyup.enter="handleQuery" <el-form-item>
/> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-form-item> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-form-item label="系统内置" prop="configType"> </el-form-item>
<el-select v-model="queryParams.configType" placeholder="系统内置" clearable> </el-form>
<el-option
v-for="dict in sys_yes_no"
: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"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></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="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:config:add']">新增</el-button>
type="primary" </el-col>
plain <el-col :span="1.5">
icon="Plus" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:config:edit']">修改</el-button>
@click="handleAdd" </el-col>
v-hasPermi="['system:config:add']" <el-col :span="1.5">
>新增</el-button> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:config:remove']">删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:config:export']">导出</el-button>
type="success" </el-col>
plain <el-col :span="1.5">
icon="Edit" <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache" v-hasPermi="['system:config:remove']">刷新缓存</el-button>
:disabled="single" </el-col>
@click="handleUpdate" <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
v-hasPermi="['system:config:edit']" </el-row>
>修改</el-button> </el-card>
</el-col>
<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"> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<el-table-column type="selection" width="55" align="center" /> <el-table v-table-height v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
<el-table-column label="参数主键" align="center" prop="configId" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true" /> <el-table-column label="参数主键" align="center" prop="configId" />
<el-table-column label="参数键名" align="center" prop="configKey" :show-overflow-tooltip="true" /> <el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true" />
<el-table-column label="参数键值" align="center" prop="configValue" :show-overflow-tooltip="true" /> <el-table-column label="参数键名" align="center" prop="configKey" :show-overflow-tooltip="true" />
<el-table-column label="系统内置" align="center" prop="configType"> <el-table-column label="参数键值" align="center" prop="configValue" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="系统内置" align="center" prop="configType">
<dict-tag :options="sys_yes_no" :value="scope.row.configType" /> <template #default="scope">
</template> <dict-tag :options="sys_yes_no" :value="scope.row.configType" />
</el-table-column> </template>
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> </el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="创建时间" align="center" prop="createTime" width="180">
<span>{{ parseTime(scope.row.createTime) }}</span> <template #default="scope">
</template> <span>{{ parseTime(scope.row.createTime) }}</span>
</el-table-column> </template>
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width"> </el-table-column>
<template #default="scope"> <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:config:edit']" >修改</el-button> <template #default="scope">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:config:remove']">删除</el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:config:edit']">修改</el-button>
</template> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:config:remove']">删除</el-button>
</el-table-column> </template>
</el-table> </el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加或修改参数配置对话框 --> <!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body> <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 ref="configRef" :model="form" :rules="rules" label-width="80px">
@ -143,11 +85,7 @@
</el-form-item> </el-form-item>
<el-form-item label="系统内置" prop="configType"> <el-form-item label="系统内置" prop="configType">
<el-radio-group v-model="form.configType"> <el-radio-group v-model="form.configType">
<el-radio <el-radio v-for="dict in sys_yes_no" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_yes_no"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
@ -165,141 +103,141 @@
</template> </template>
<script setup name="Config"> <script setup name="Config">
import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from "@/api/system/config"; import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from "@/api/system/config";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_yes_no } = proxy.useDict("sys_yes_no"); const { sys_yes_no } = proxy.useDict("sys_yes_no");
const configList = ref([]); const configList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const title = ref(""); const title = ref("");
const dateRange = ref([]); const dateRange = ref([]);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
configName: undefined, configName: undefined,
configKey: undefined, configKey: undefined,
configType: undefined configType: undefined
}, },
rules: { rules: {
configName: [{ required: true, message: "参数名称不能为空", trigger: "blur" }], configName: [{ required: true, message: "参数名称不能为空", trigger: "blur" }],
configKey: [{ required: true, message: "参数键名不能为空", trigger: "blur" }], configKey: [{ required: true, message: "参数键名不能为空", trigger: "blur" }],
configValue: [{ required: true, message: "参数键值不能为空", trigger: "blur" }] configValue: [{ required: true, message: "参数键值不能为空", trigger: "blur" }]
} }
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询参数列表 */ /** 查询参数列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listConfig(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => { listConfig(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
configList.value = response.rows; configList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
configId: undefined, configId: undefined,
configName: undefined, configName: undefined,
configKey: undefined, configKey: undefined,
configValue: undefined, configValue: undefined,
configType: "Y", configType: "Y",
remark: undefined remark: undefined
}; };
proxy.resetForm("configRef"); proxy.resetForm("configRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
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");
handleQuery(); handleQuery();
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.configId); ids.value = selection.map(item => item.configId);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加参数"; title.value = "添加参数";
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const configId = row.configId || ids.value; const configId = row.configId || ids.value;
getConfig(configId).then(response => { getConfig(configId).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改参数"; title.value = "修改参数";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["configRef"].validate(valid => { proxy.$refs["configRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.configId != undefined) { if (form.value.configId != undefined) {
updateConfig(form.value).then(response => { updateConfig(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addConfig(form.value).then(response => { addConfig(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} }
} }
}); });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const configIds = row.configId || ids.value; const configIds = row.configId || ids.value;
proxy.$modal.confirm('是否确认删除参数编号为"' + configIds + '"的数据项?').then(function () { proxy.$modal.confirm('是否确认删除参数编号为"' + configIds + '"的数据项?').then(function () {
return delConfig(configIds); return delConfig(configIds);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download("system/config/export", { proxy.download("system/config/export", {
...queryParams.value ...queryParams.value
}, `config_${new Date().getTime()}.xlsx`); }, `config_${new Date().getTime()}.xlsx`);
} }
/** 刷新缓存按钮操作 */ /** 刷新缓存按钮操作 */
function handleRefreshCache() { function handleRefreshCache() {
refreshCache().then(() => { refreshCache().then(() => {
proxy.$modal.msgSuccess("刷新缓存成功"); proxy.$modal.msgSuccess("刷新缓存成功");
}); });
} }
getList(); getList();
</script> </script>

383
src/views/system/dept/index.vue

@ -1,80 +1,54 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="部门名称" prop="deptName"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-input <el-form-item label="部门名称" prop="deptName">
v-model="queryParams.deptName" <el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable style="width: 200px" @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-select>
</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-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
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 <el-row :gutter="10" class="mb8">
v-if="refreshTable" <el-col :span="1.5">
v-loading="loading" <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dept:add']">新增</el-button>
:data="deptList" </el-col>
row-key="deptId" <el-col :span="1.5">
:default-expand-all="isExpandAll" <el-button type="info" plain icon="Sort" @click="toggleExpandAll">展开/折叠</el-button>
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }" </el-col>
> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-table-column prop="deptName" label="部门名称" width="260"></el-table-column> </el-row>
<el-table-column prop="orderNum" label="排序" width="200"></el-table-column> </el-card>
<el-table-column prop="status" label="状态" width="100"> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<template #default="scope"> <el-table v-if="refreshTable" v-loading="loading" :data="deptList" row-key="deptId" :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" /> <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
</template> <el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
</el-table-column> <el-table-column prop="status" label="状态" width="100">
<el-table-column label="创建时间" align="center" prop="createTime" width="200"> <template #default="scope">
<template #default="scope"> <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
<span>{{ parseTime(scope.row.createTime) }}</span> </template>
</template> </el-table-column>
</el-table-column> <el-table-column label="创建时间" align="center" prop="createTime" width="200">
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <template #default="scope">
<template #default="scope"> <span>{{ parseTime(scope.row.createTime) }}</span>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">修改</el-button> </template>
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']">新增</el-button> </el-table-column>
<el-button v-if="scope.row.parentId != 0" link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">删除</el-button> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
</template> <template #default="scope">
</el-table-column> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">修改</el-button>
</el-table> <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="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 添加或修改部门对话框 --> <!-- 添加或修改部门对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body> <el-dialog :title="title" v-model="open" width="600px" append-to-body>
@ -82,14 +56,7 @@
<el-row> <el-row>
<el-col :span="24" v-if="form.parentId !== 0"> <el-col :span="24" v-if="form.parentId !== 0">
<el-form-item label="上级部门" prop="parentId"> <el-form-item label="上级部门" prop="parentId">
<el-tree-select <el-tree-select v-model="form.parentId" :data="deptOptions" :props="{ value: 'deptId', label: 'deptName', children: 'children' }" value-key="deptId" placeholder="选择上级部门" check-strictly />
v-model="form.parentId"
:data="deptOptions"
:props="{ value: 'deptId', label: 'deptName', children: 'children' }"
value-key="deptId"
placeholder="选择上级部门"
check-strictly
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -120,11 +87,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="部门状态"> <el-form-item label="部门状态">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -141,134 +104,134 @@
</template> </template>
<script setup name="Dept"> <script setup name="Dept">
import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"; import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const deptList = ref([]); const deptList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const title = ref(""); const title = ref("");
const deptOptions = ref([]); const deptOptions = ref([]);
const isExpandAll = ref(true); const isExpandAll = ref(true);
const refreshTable = ref(true); const refreshTable = ref(true);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
deptName: undefined, deptName: undefined,
status: undefined status: undefined
}, },
rules: { rules: {
parentId: [{ required: true, message: "上级部门不能为空", trigger: "blur" }], parentId: [{ required: true, message: "上级部门不能为空", trigger: "blur" }],
deptName: [{ required: true, message: "部门名称不能为空", trigger: "blur" }], deptName: [{ required: true, message: "部门名称不能为空", trigger: "blur" }],
orderNum: [{ required: true, message: "显示排序不能为空", trigger: "blur" }], orderNum: [{ required: true, message: "显示排序不能为空", trigger: "blur" }],
email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }], email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }] phone: [{ 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);
/** 查询部门列表 */ /** 查询部门列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listDept(queryParams.value).then(response => { listDept(queryParams.value).then(response => {
deptList.value = proxy.handleTree(response.data, "deptId"); deptList.value = proxy.handleTree(response.data, "deptId");
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
deptId: undefined, deptId: undefined,
parentId: undefined, parentId: undefined,
deptName: undefined, deptName: undefined,
orderNum: 0, orderNum: 0,
leader: undefined, leader: undefined,
phone: undefined, phone: undefined,
email: undefined, email: undefined,
status: "0" status: "0"
}; };
proxy.resetForm("deptRef"); proxy.resetForm("deptRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
getList(); getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
handleQuery(); handleQuery();
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd(row) { function handleAdd(row) {
reset(); reset();
listDept().then(response => { listDept().then(response => {
deptOptions.value = proxy.handleTree(response.data, "deptId"); deptOptions.value = proxy.handleTree(response.data, "deptId");
}); });
if (row != undefined) { if (row != undefined) {
form.value.parentId = row.deptId; form.value.parentId = row.deptId;
}
open.value = true;
title.value = "添加部门";
}
/** 展开/折叠操作 */
function toggleExpandAll() {
refreshTable.value = false;
isExpandAll.value = !isExpandAll.value;
nextTick(() => {
refreshTable.value = true;
});
}
/** 修改按钮操作 */
function handleUpdate(row) {
reset();
listDeptExcludeChild(row.deptId).then(response => {
deptOptions.value = proxy.handleTree(response.data, "deptId");
});
getDept(row.deptId).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改部门";
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["deptRef"].validate(valid => {
if (valid) {
if (form.value.deptId != undefined) {
updateDept(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addDept(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
} }
} open.value = true;
}); title.value = "添加部门";
} }
/** 删除按钮操作 */ /** 展开/折叠操作 */
function handleDelete(row) { function toggleExpandAll() {
proxy.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function() { refreshTable.value = false;
return delDept(row.deptId); isExpandAll.value = !isExpandAll.value;
}).then(() => { nextTick(() => {
getList(); refreshTable.value = true;
proxy.$modal.msgSuccess("删除成功"); });
}).catch(() => {}); }
} /** 修改按钮操作 */
function handleUpdate(row) {
reset();
listDeptExcludeChild(row.deptId).then(response => {
deptOptions.value = proxy.handleTree(response.data, "deptId");
});
getDept(row.deptId).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改部门";
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["deptRef"].validate(valid => {
if (valid) {
if (form.value.deptId != undefined) {
updateDept(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addDept(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 删除按钮操作 */
function handleDelete(row) {
proxy.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?').then(function () {
return delDept(row.deptId);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => { });
}
getList(); getList();
</script> </script>

534
src/views/system/dict/data.vue

@ -1,129 +1,80 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="字典名称" prop="dictType"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-select v-model="queryParams.dictType" style="width: 200px"> <el-form-item label="字典名称" prop="dictType">
<el-option <el-select v-model="queryParams.dictType" style="width: 200px">
v-for="item in typeOptions" <el-option v-for="item in typeOptions" :key="item.dictId" :label="item.dictName" :value="item.dictType" />
:key="item.dictId" </el-select>
:label="item.dictName" </el-form-item>
:value="item.dictType" <el-form-item label="字典标签" prop="dictLabel">
/> <el-input v-model="queryParams.dictLabel" placeholder="请输入字典标签" clearable style="width: 200px" @keyup.enter="handleQuery" />
</el-select> </el-form-item>
</el-form-item> <el-form-item label="状态" prop="status">
<el-form-item label="字典标签" prop="dictLabel"> <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.dictLabel" </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-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-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="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">新增</el-button>
type="primary" </el-col>
plain <el-col :span="1.5">
icon="Plus" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:dict:edit']">修改</el-button>
@click="handleAdd" </el-col>
v-hasPermi="['system:dict:add']" <el-col :span="1.5">
>新增</el-button> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:dict:remove']">删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">导出</el-button>
type="success" </el-col>
plain <el-col :span="1.5">
icon="Edit" <el-button type="warning" plain icon="Close" @click="handleClose">关闭</el-button>
:disabled="single" </el-col>
@click="handleUpdate" <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
v-hasPermi="['system:dict:edit']" </el-row>
>修改</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="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="dataList" @selection-change="handleSelectionChange"> </el-card>
<el-table-column type="selection" width="55" align="center" /> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<el-table-column label="字典编码" align="center" prop="dictCode" /> <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
<el-table-column label="字典标签" align="center" prop="dictLabel"> <el-table-column type="selection" width="55" align="center" />
<template #default="scope"> <el-table-column label="字典编码" align="center" prop="dictCode" />
<span v-if="(scope.row.listClass == '' || scope.row.listClass == 'default') && (scope.row.cssClass == '' || scope.row.cssClass == null)">{{ scope.row.dictLabel }}</span> <el-table-column label="字典标签" align="center" prop="dictLabel">
<el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass" :class="scope.row.cssClass">{{ scope.row.dictLabel }}</el-tag> <template #default="scope">
</template> <span v-if="(scope.row.listClass == '' || scope.row.listClass == 'default') && (scope.row.cssClass == '' || scope.row.cssClass == null)">{{ scope.row.dictLabel }}</span>
</el-table-column> <el-tag v-else :type="scope.row.listClass == 'primary' ? '' : scope.row.listClass" :class="scope.row.cssClass">{{ scope.row.dictLabel }}</el-tag>
<el-table-column label="字典键值" align="center" prop="dictValue" /> </template>
<el-table-column label="字典排序" align="center" prop="dictSort" /> </el-table-column>
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="字典键值" align="center" prop="dictValue" />
<template #default="scope"> <el-table-column label="字典排序" align="center" prop="dictSort" />
<dict-tag :options="sys_normal_disable" :value="scope.row.status" /> <el-table-column label="状态" align="center" prop="status">
</template> <template #default="scope">
</el-table-column> <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> </template>
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> </el-table-column>
<template #default="scope"> <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<span>{{ parseTime(scope.row.createTime) }}</span> <el-table-column label="创建时间" align="center" prop="createTime" width="180">
</template> <template #default="scope">
</el-table-column> <span>{{ parseTime(scope.row.createTime) }}</span>
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width"> </template>
<template #default="scope"> </el-table-column>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">修改</el-button> <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">删除</el-button> <template #default="scope">
</template> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">修改</el-button>
</el-table-column> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">删除</el-button>
</el-table> </template>
</el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加或修改参数配置对话框 --> <!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body> <el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form ref="dataRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="dataRef" :model="form" :rules="rules" label-width="80px">
@ -144,21 +95,12 @@
</el-form-item> </el-form-item>
<el-form-item label="回显样式" prop="listClass"> <el-form-item label="回显样式" prop="listClass">
<el-select v-model="form.listClass"> <el-select v-model="form.listClass">
<el-option <el-option v-for="item in listClassOptions" :key="item.value" :label="item.label + '(' + item.value + ')'" :value="item.value"></el-option>
v-for="item in listClassOptions"
:key="item.value"
:label="item.label + '(' + item.value + ')'"
:value="item.value"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
@ -176,175 +118,175 @@
</template> </template>
<script setup name="Data"> <script setup name="Data">
import useDictStore from '@/store/modules/dict' import useDictStore from '@/store/modules/dict'
import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type"; import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type";
import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data"; import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const dataList = ref([]); const dataList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const title = ref(""); const title = ref("");
const defaultDictType = ref(""); const defaultDictType = ref("");
const typeOptions = ref([]); const typeOptions = ref([]);
const route = useRoute(); const route = useRoute();
// //
const listClassOptions = ref([ const listClassOptions = ref([
{ value: "default", label: "默认" }, { value: "default", label: "默认" },
{ value: "primary", label: "主要" }, { value: "primary", label: "主要" },
{ value: "success", label: "成功" }, { value: "success", label: "成功" },
{ value: "info", label: "信息" }, { value: "info", label: "信息" },
{ value: "warning", label: "警告" }, { value: "warning", label: "警告" },
{ value: "danger", label: "危险" } { value: "danger", label: "危险" }
]); ]);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
dictType: undefined, dictType: undefined,
dictLabel: undefined, dictLabel: undefined,
status: undefined status: undefined
}, },
rules: { rules: {
dictLabel: [{ required: true, message: "数据标签不能为空", trigger: "blur" }], dictLabel: [{ required: true, message: "数据标签不能为空", trigger: "blur" }],
dictValue: [{ required: true, message: "数据键值不能为空", trigger: "blur" }], dictValue: [{ required: true, message: "数据键值不能为空", trigger: "blur" }],
dictSort: [{ required: true, message: "数据顺序不能为空", trigger: "blur" }] dictSort: [{ required: true, message: "数据顺序不能为空", trigger: "blur" }]
} }
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询字典类型详细 */ /** 查询字典类型详细 */
function getTypes(dictId) { function getTypes(dictId) {
getType(dictId).then(response => { getType(dictId).then(response => {
queryParams.value.dictType = response.data.dictType; queryParams.value.dictType = response.data.dictType;
defaultDictType.value = response.data.dictType; defaultDictType.value = response.data.dictType;
getList(); getList();
}); });
} }
/** 查询字典类型列表 */ /** 查询字典类型列表 */
function getTypeList() { function getTypeList() {
getDictOptionselect().then(response => { getDictOptionselect().then(response => {
typeOptions.value = response.data; typeOptions.value = response.data;
}); });
} }
/** 查询字典数据列表 */ /** 查询字典数据列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listData(queryParams.value).then(response => { listData(queryParams.value).then(response => {
dataList.value = response.rows; dataList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
dictCode: undefined, dictCode: undefined,
dictLabel: undefined, dictLabel: undefined,
dictValue: undefined, dictValue: undefined,
cssClass: undefined, cssClass: undefined,
listClass: "default", listClass: "default",
dictSort: 0, dictSort: 0,
status: "0", status: "0",
remark: undefined remark: undefined
}; };
proxy.resetForm("dataRef"); proxy.resetForm("dataRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
} }
/** 返回按钮操作 */ /** 返回按钮操作 */
function handleClose() { function handleClose() {
const obj = { path: "/system/dict" }; const obj = { path: "/system/dict" };
proxy.$tab.closeOpenPage(obj); proxy.$tab.closeOpenPage(obj);
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
queryParams.value.dictType = defaultDictType.value; queryParams.value.dictType = defaultDictType.value;
handleQuery(); handleQuery();
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加字典数据"; title.value = "添加字典数据";
form.value.dictType = queryParams.value.dictType; form.value.dictType = queryParams.value.dictType;
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.dictCode); ids.value = selection.map(item => item.dictCode);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const dictCode = row.dictCode || ids.value; const dictCode = row.dictCode || ids.value;
getData(dictCode).then(response => { getData(dictCode).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改字典数据"; title.value = "修改字典数据";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["dataRef"].validate(valid => { proxy.$refs["dataRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.dictCode != undefined) { if (form.value.dictCode != undefined) {
updateData(form.value).then(response => { updateData(form.value).then(response => {
useDictStore().removeDict(queryParams.value.dictType); useDictStore().removeDict(queryParams.value.dictType);
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addData(form.value).then(response => { addData(form.value).then(response => {
useDictStore().removeDict(queryParams.value.dictType); useDictStore().removeDict(queryParams.value.dictType);
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} }
} }
}); });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(row) { function handleDelete(row) {
const dictCodes = row.dictCode || ids.value; const dictCodes = row.dictCode || ids.value;
proxy.$modal.confirm('是否确认删除字典编码为"' + dictCodes + '"的数据项?').then(function() { proxy.$modal.confirm('是否确认删除字典编码为"' + dictCodes + '"的数据项?').then(function () {
return delData(dictCodes); return delData(dictCodes);
}).then(() => { }).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功"); proxy.$modal.msgSuccess("删除成功");
useDictStore().removeDict(queryParams.value.dictType); useDictStore().removeDict(queryParams.value.dictType);
}).catch(() => {}); }).catch(() => { });
} }
/** 导出按钮操作 */ /** 导出按钮操作 */
function handleExport() { function handleExport() {
proxy.download("system/dict/data/export", { proxy.download("system/dict/data/export", {
...queryParams.value ...queryParams.value
}, `dict_data_${new Date().getTime()}.xlsx`); }, `dict_data_${new Date().getTime()}.xlsx`);
} }
getTypes(route.params && route.params.dictId); getTypes(route.params && route.params.dictId);
getTypeList(); getTypeList();
</script> </script>

477
src/views/system/dict/index.vue

@ -1,143 +1,80 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="字典名称" prop="dictName"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
<el-input <el-form-item label="字典名称" prop="dictName">
v-model="queryParams.dictName" <el-input v-model="queryParams.dictName" placeholder="请输入字典名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
placeholder="请输入字典名称" </el-form-item>
clearable <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 label="状态" prop="status">
</el-form-item> <el-select v-model="queryParams.status" placeholder="字典状态" clearable style="width: 240px">
<el-form-item label="字典类型" prop="dictType"> <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-input </el-select>
v-model="queryParams.dictType" </el-form-item>
placeholder="请输入字典类型" <el-form-item label="创建时间" style="width: 308px">
clearable <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
style="width: 240px" </el-form-item>
@keyup.enter="handleQuery" <el-form-item>
/> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-form-item> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-form-item label="状态" prop="status"> </el-form-item>
<el-select </el-form>
v-model="queryParams.status"
placeholder="字典状态"
clearable
style="width: 240px"
>
<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 label="创建时间" style="width: 308px">
<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-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="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">新增</el-button>
type="primary" </el-col>
plain <el-col :span="1.5">
icon="Plus" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:dict:edit']">修改</el-button>
@click="handleAdd" </el-col>
v-hasPermi="['system:dict:add']" <el-col :span="1.5">
>新增</el-button> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:dict:remove']">删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">导出</el-button>
type="success" </el-col>
plain <el-col :span="1.5">
icon="Edit" <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache" v-hasPermi="['system:dict:remove']">刷新缓存</el-button>
:disabled="single" </el-col>
@click="handleUpdate" <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
v-hasPermi="['system:dict:edit']" </el-row>
>修改</el-button> </el-card>
</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"> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<el-table-column type="selection" width="55" align="center" /> <el-table v-table-height v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
<el-table-column label="字典编号" align="center" prop="dictId" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true"/> <el-table-column label="字典编号" align="center" prop="dictId" />
<el-table-column label="字典类型" align="center" :show-overflow-tooltip="true"> <el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
<router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type"> <template #default="scope">
<span>{{ scope.row.dictType }}</span> <router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type">
</router-link> <span>{{ scope.row.dictType }}</span>
</template> </router-link>
</el-table-column> </template>
<el-table-column label="状态" align="center" prop="status"> </el-table-column>
<template #default="scope"> <el-table-column label="状态" align="center" prop="status">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" /> <template #default="scope">
</template> <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
</el-table-column> </template>
<el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" /> </el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
<template #default="scope"> <el-table-column label="创建时间" align="center" prop="createTime" width="180">
<span>{{ parseTime(scope.row.createTime) }}</span> <template #default="scope">
</template> <span>{{ parseTime(scope.row.createTime) }}</span>
</el-table-column> </template>
<el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width"> </el-table-column>
<template #default="scope"> <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">修改</el-button> <template #default="scope">
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">删除</el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']">修改</el-button>
</template> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']">删除</el-button>
</el-table-column> </template>
</el-table> </el-table-column>
</el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-show="total > 0" </div>
: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-dialog :title="title" v-model="open" width="500px" append-to-body>
@ -150,11 +87,7 @@
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
@ -172,141 +105,141 @@
</template> </template>
<script setup name="Dict"> <script setup name="Dict">
import useDictStore from '@/store/modules/dict' import useDictStore from '@/store/modules/dict'
import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type"; import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const typeList = ref([]); const typeList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const title = ref(""); const title = ref("");
const dateRange = ref([]); const dateRange = ref([]);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
dictName: undefined, dictName: undefined,
dictType: undefined, dictType: undefined,
status: undefined status: undefined
}, },
rules: { rules: {
dictName: [{ required: true, message: "字典名称不能为空", trigger: "blur" }], dictName: [{ required: true, message: "字典名称不能为空", trigger: "blur" }],
dictType: [{ required: true, message: "字典类型不能为空", trigger: "blur" }] dictType: [{ required: true, message: "字典类型不能为空", trigger: "blur" }]
}, },
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询字典类型列表 */ /** 查询字典类型列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listType(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => { listType(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
typeList.value = response.rows; typeList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
dictId: undefined, dictId: undefined,
dictName: undefined, dictName: undefined,
dictType: undefined, dictType: undefined,
status: "0", status: "0",
remark: undefined remark: undefined
}; };
proxy.resetForm("dictRef"); proxy.resetForm("dictRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
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");
handleQuery(); handleQuery();
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加字典类型"; title.value = "添加字典类型";
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.dictId); ids.value = selection.map(item => item.dictId);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const dictId = row.dictId || ids.value; const dictId = row.dictId || ids.value;
getType(dictId).then(response => { getType(dictId).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改字典类型"; title.value = "修改字典类型";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["dictRef"].validate(valid => { proxy.$refs["dictRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.dictId != undefined) { if (form.value.dictId != undefined) {
updateType(form.value).then(response => { updateType(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addType(form.value).then(response => { addType(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} }
} }
}); });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
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() {
proxy.download("system/dict/type/export", { proxy.download("system/dict/type/export", {
...queryParams.value ...queryParams.value
}, `dict_${new Date().getTime()}.xlsx`); }, `dict_${new Date().getTime()}.xlsx`);
} }
/** 刷新缓存按钮操作 */ /** 刷新缓存按钮操作 */
function handleRefreshCache() { function handleRefreshCache() {
refreshCache().then(() => { refreshCache().then(() => {
proxy.$modal.msgSuccess("刷新成功"); proxy.$modal.msgSuccess("刷新成功");
useDictStore().cleanDict(); useDictStore().cleanDict();
}); });
} }
getList(); getList();
</script> </script>

455
src/views/system/menu/index.vue

@ -1,87 +1,62 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="菜单名称" prop="menuName"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-input <el-form-item label="菜单名称" prop="menuName">
v-model="queryParams.menuName" <el-input v-model="queryParams.menuName" placeholder="请输入菜单名称" clearable style="width: 200px" @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-select>
</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="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:menu:add']">新增</el-button>
type="primary" </el-col>
plain <el-col :span="1.5">
icon="Plus" <el-button type="info" plain icon="Sort" @click="toggleExpandAll">展开/折叠</el-button>
@click="handleAdd" </el-col>
v-hasPermi="['system:menu:add']" <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
>新增</el-button> </el-row>
</el-col> </el-card>
<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 <div class="el-card-p card-shadow carder-border mt10 pad10 ">
v-if="refreshTable" <el-table v-table-height v-if="refreshTable" v-loading="loading" :data="menuList" row-key="menuId" :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
v-loading="loading" <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
:data="menuList" <el-table-column prop="icon" label="图标" align="center" width="100">
row-key="menuId" <template #default="scope">
:default-expand-all="isExpandAll" <svg-icon :icon-class="scope.row.icon" />
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }" </template>
> </el-table-column>
<el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column> <el-table-column prop="orderNum" label="排序" width="60"></el-table-column>
<el-table-column prop="icon" label="图标" align="center" width="100"> <el-table-column prop="perms" label="权限标识" :show-overflow-tooltip="true"></el-table-column>
<template #default="scope"> <el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true"></el-table-column>
<svg-icon :icon-class="scope.row.icon" /> <el-table-column prop="status" label="状态" width="80">
</template> <template #default="scope">
</el-table-column> <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
<el-table-column prop="orderNum" label="排序" width="60"></el-table-column> </template>
<el-table-column prop="perms" label="权限标识" :show-overflow-tooltip="true"></el-table-column> </el-table-column>
<el-table-column prop="component" label="组件路径" :show-overflow-tooltip="true"></el-table-column> <el-table-column label="创建时间" align="center" width="160" prop="createTime">
<el-table-column prop="status" label="状态" width="80"> <template #default="scope">
<template #default="scope"> <span>{{ parseTime(scope.row.createTime) }}</span>
<dict-tag :options="sys_normal_disable" :value="scope.row.status" /> </template>
</template> </el-table-column>
</el-table-column> <el-table-column label="操作" align="center" width="210" class-name="small-padding fixed-width">
<el-table-column label="创建时间" align="center" width="160" prop="createTime"> <template #default="scope">
<template #default="scope"> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:menu:edit']">修改</el-button>
<span>{{ parseTime(scope.row.createTime) }}</span> <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:menu:add']">新增</el-button>
</template> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:menu:remove']">删除</el-button>
</el-table-column> </template>
<el-table-column label="操作" align="center" width="210" class-name="small-padding fixed-width"> </el-table-column>
<template #default="scope"> </el-table>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:menu:edit']">修改</el-button> </div>
<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:menu:add']">新增</el-button>
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:menu:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改菜单对话框 --> <!-- 添加或修改菜单对话框 -->
<el-dialog :title="title" v-model="open" width="680px" append-to-body> <el-dialog :title="title" v-model="open" width="680px" append-to-body>
@ -89,14 +64,7 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="上级菜单"> <el-form-item label="上级菜单">
<el-tree-select <el-tree-select v-model="form.parentId" :data="menuOptions" :props="{ value: 'menuId', label: 'menuName', children: 'children' }" value-key="menuId" placeholder="选择上级菜单" check-strictly />
v-model="form.parentId"
:data="menuOptions"
:props="{ value: 'menuId', label: 'menuName', children: 'children' }"
value-key="menuId"
placeholder="选择上级菜单"
check-strictly
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
@ -110,21 +78,14 @@
</el-col> </el-col>
<el-col :span="24" v-if="form.menuType != 'F'"> <el-col :span="24" v-if="form.menuType != 'F'">
<el-form-item label="菜单图标" prop="icon"> <el-form-item label="菜单图标" prop="icon">
<el-popover <el-popover placement="bottom-start" :width="540" trigger="click">
placement="bottom-start"
:width="540"
trigger="click"
>
<template #reference> <template #reference>
<el-input v-model="form.icon" placeholder="点击选择图标" @blur="showSelectIcon" readonly> <el-input v-model="form.icon" placeholder="点击选择图标" @blur="showSelectIcon" readonly>
<template #prefix> <template #prefix>
<svg-icon <svg-icon v-if="form.icon" :icon-class="form.icon" class="el-input__icon" style="height: 32px;width: 16px;" />
v-if="form.icon" <el-icon v-else style="height: 32px;width: 16px;">
:icon-class="form.icon" <search />
class="el-input__icon" </el-icon>
style="height: 32px;width: 16px;"
/>
<el-icon v-else style="height: 32px;width: 16px;"><search /></el-icon>
</template> </template>
</el-input> </el-input>
</template> </template>
@ -236,11 +197,7 @@
</span> </span>
</template> </template>
<el-radio-group v-model="form.visible"> <el-radio-group v-model="form.visible">
<el-radio <el-radio v-for="dict in sys_show_hide" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_show_hide"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -255,11 +212,7 @@
</span> </span>
</template> </template>
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -276,152 +229,152 @@
</template> </template>
<script setup name="Menu"> <script setup name="Menu">
import { addMenu, delMenu, getMenu, listMenu, updateMenu } from "@/api/system/menu"; import { addMenu, delMenu, getMenu, listMenu, updateMenu } from "@/api/system/menu";
import SvgIcon from "@/components/SvgIcon"; import SvgIcon from "@/components/SvgIcon";
import IconSelect from "@/components/IconSelect"; import IconSelect from "@/components/IconSelect";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_show_hide, sys_normal_disable } = proxy.useDict("sys_show_hide", "sys_normal_disable"); const { sys_show_hide, sys_normal_disable } = proxy.useDict("sys_show_hide", "sys_normal_disable");
const menuList = ref([]); const menuList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const title = ref(""); const title = ref("");
const menuOptions = ref([]); const menuOptions = ref([]);
const isExpandAll = ref(false); const isExpandAll = ref(false);
const refreshTable = ref(true); const refreshTable = ref(true);
const iconSelectRef = ref(null); const iconSelectRef = ref(null);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
menuName: undefined, menuName: undefined,
visible: undefined visible: undefined
}, },
rules: { rules: {
menuName: [{ required: true, message: "菜单名称不能为空", trigger: "blur" }], menuName: [{ required: true, message: "菜单名称不能为空", trigger: "blur" }],
orderNum: [{ required: true, message: "菜单顺序不能为空", trigger: "blur" }], orderNum: [{ required: true, message: "菜单顺序不能为空", trigger: "blur" }],
path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }] path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }]
}, },
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询菜单列表 */ /** 查询菜单列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listMenu(queryParams.value).then(response => { listMenu(queryParams.value).then(response => {
menuList.value = proxy.handleTree(response.data, "menuId"); menuList.value = proxy.handleTree(response.data, "menuId");
loading.value = false; loading.value = false;
}); });
} }
/** 查询菜单下拉树结构 */ /** 查询菜单下拉树结构 */
function getTreeselect() { function getTreeselect() {
menuOptions.value = []; menuOptions.value = [];
listMenu().then(response => { listMenu().then(response => {
const menu = { menuId: 0, menuName: "主类目", children: [] }; const menu = { menuId: 0, menuName: "主类目", children: [] };
menu.children = proxy.handleTree(response.data, "menuId"); menu.children = proxy.handleTree(response.data, "menuId");
menuOptions.value.push(menu); menuOptions.value.push(menu);
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
menuId: undefined, menuId: undefined,
parentId: 0, parentId: 0,
menuName: undefined, menuName: undefined,
icon: undefined, icon: undefined,
menuType: "M", menuType: "M",
orderNum: undefined, orderNum: undefined,
isFrame: "1", isFrame: "1",
isCache: "0", isCache: "0",
visible: "0", visible: "0",
status: "0" status: "0"
}; };
proxy.resetForm("menuRef"); proxy.resetForm("menuRef");
} }
/** 展示下拉图标 */ /** 展示下拉图标 */
function showSelectIcon() { function showSelectIcon() {
iconSelectRef.value.reset(); iconSelectRef.value.reset();
} }
/** 选择图标 */ /** 选择图标 */
function selected(name) { function selected(name) {
form.value.icon = name; form.value.icon = name;
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
getList(); getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
handleQuery(); handleQuery();
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd(row) { function handleAdd(row) {
reset(); reset();
getTreeselect(); getTreeselect();
if (row != null && row.menuId) { if (row != null && row.menuId) {
form.value.parentId = row.menuId; form.value.parentId = row.menuId;
} else {
form.value.parentId = 0;
}
open.value = true;
title.value = "添加菜单";
}
/** 展开/折叠操作 */
function toggleExpandAll() {
refreshTable.value = false;
isExpandAll.value = !isExpandAll.value;
nextTick(() => {
refreshTable.value = true;
});
}
/** 修改按钮操作 */
async function handleUpdate(row) {
reset();
await getTreeselect();
getMenu(row.menuId).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改菜单";
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["menuRef"].validate(valid => {
if (valid) {
if (form.value.menuId != undefined) {
updateMenu(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else { } else {
addMenu(form.value).then(response => { form.value.parentId = 0;
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
} }
} open.value = true;
}); title.value = "添加菜单";
} }
/** 删除按钮操作 */ /** 展开/折叠操作 */
function handleDelete(row) { function toggleExpandAll() {
proxy.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?').then(function() { refreshTable.value = false;
return delMenu(row.menuId); isExpandAll.value = !isExpandAll.value;
}).then(() => { nextTick(() => {
getList(); refreshTable.value = true;
proxy.$modal.msgSuccess("删除成功"); });
}).catch(() => {}); }
} /** 修改按钮操作 */
async function handleUpdate(row) {
reset();
await getTreeselect();
getMenu(row.menuId).then(response => {
form.value = response.data;
open.value = true;
title.value = "修改菜单";
});
}
/** 提交按钮 */
function submitForm() {
proxy.$refs["menuRef"].validate(valid => {
if (valid) {
if (form.value.menuId != undefined) {
updateMenu(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
addMenu(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 删除按钮操作 */
function handleDelete(row) {
proxy.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?').then(function () {
return delMenu(row.menuId);
}).then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => { });
}
getList(); getList();
</script> </script>

415
src/views/system/notice/index.vue

@ -1,116 +1,72 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="公告标题" prop="noticeTitle"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-input <el-form-item label="公告标题" prop="noticeTitle">
v-model="queryParams.noticeTitle" <el-input v-model="queryParams.noticeTitle" placeholder="请输入公告标题" clearable style="width: 200px" @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 label="类型" prop="noticeType">
</el-form-item> <el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable style="width: 200px">
<el-form-item label="操作人员" prop="createBy"> <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-input </el-select>
v-model="queryParams.createBy" </el-form-item>
placeholder="请输入操作人员" <el-form-item>
clearable <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
style="width: 200px" <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@keyup.enter="handleQuery" </el-form-item>
/> </el-form>
</el-form-item>
<el-form-item label="类型" prop="noticeType">
<el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable style="width: 200px">
<el-option
v-for="dict in sys_notice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</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="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:notice:add']">新增</el-button>
type="primary" </el-col>
plain <el-col :span="1.5">
icon="Plus" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:notice:edit']">修改</el-button>
@click="handleAdd" </el-col>
v-hasPermi="['system:notice:add']" <el-col :span="1.5">
>新增</el-button> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:notice:remove']">删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
<el-button </el-row>
type="success" </el-card>
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"> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<el-table-column type="selection" width="55" align="center" /> <el-table v-table-height v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
<el-table-column label="序号" align="center" prop="noticeId" width="100" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column <el-table-column label="序号" align="center" prop="noticeId" width="100" />
label="公告标题" <el-table-column label="公告标题" align="center" prop="noticeTitle" :show-overflow-tooltip="true" />
align="center" <el-table-column label="公告类型" align="center" prop="noticeType" width="100">
prop="noticeTitle" <template #default="scope">
:show-overflow-tooltip="true" <dict-tag :options="sys_notice_type" :value="scope.row.noticeType" />
/> </template>
<el-table-column label="公告类型" align="center" prop="noticeType" width="100"> </el-table-column>
<template #default="scope"> <el-table-column label="状态" align="center" prop="status" width="100">
<dict-tag :options="sys_notice_type" :value="scope.row.noticeType" /> <template #default="scope">
</template> <dict-tag :options="sys_notice_status" :value="scope.row.status" />
</el-table-column> </template>
<el-table-column label="状态" align="center" prop="status" width="100"> </el-table-column>
<template #default="scope"> <el-table-column label="创建者" align="center" prop="createBy" width="100" />
<dict-tag :options="sys_notice_status" :value="scope.row.status" /> <el-table-column label="创建时间" align="center" prop="createTime" width="100">
</template> <template #default="scope">
</el-table-column> <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
<el-table-column label="创建者" align="center" prop="createBy" width="100" /> </template>
<el-table-column label="创建时间" align="center" prop="createTime" width="100"> </el-table-column>
<template #default="scope"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> <template #default="scope">
</template> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']">修改</el-button>
</el-table-column> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:notice:remove']">删除</el-button>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> </template>
<template #default="scope"> </el-table-column>
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']">修改</el-button> </el-table>
<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 <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加或修改公告对话框 --> <!-- 添加或修改公告对话框 -->
<el-dialog :title="title" v-model="open" width="780px" append-to-body> <el-dialog class="custom-dialog" :title="title" v-model="open" width="780px" append-to-body>
<el-form ref="noticeRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="noticeRef" :model="form" :rules="rules" label-width="80px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
@ -121,29 +77,20 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="公告类型" prop="noticeType"> <el-form-item label="公告类型" prop="noticeType">
<el-select v-model="form.noticeType" placeholder="请选择"> <el-select v-model="form.noticeType" placeholder="请选择">
<el-option <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
v-for="dict in sys_notice_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="状态"> <el-form-item label="状态">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio v-for="dict in sys_notice_status" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_notice_status"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="内容"> <el-form-item label="内容">
<editor v-model="form.noticeContent" :min-height="192"/> <editor v-model="form.noticeContent" :min-height="192" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -159,125 +106,125 @@
</template> </template>
<script setup name="Notice"> <script setup name="Notice">
import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"; import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_notice_status, sys_notice_type } = proxy.useDict("sys_notice_status", "sys_notice_type"); const { sys_notice_status, sys_notice_type } = proxy.useDict("sys_notice_status", "sys_notice_type");
const noticeList = ref([]); const noticeList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const title = ref(""); const title = ref("");
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
noticeTitle: undefined, noticeTitle: undefined,
createBy: undefined, createBy: undefined,
status: undefined status: undefined
}, },
rules: { rules: {
noticeTitle: [{ required: true, message: "公告标题不能为空", trigger: "blur" }], noticeTitle: [{ required: true, message: "公告标题不能为空", trigger: "blur" }],
noticeType: [{ required: true, message: "公告类型不能为空", trigger: "change" }] noticeType: [{ required: true, message: "公告类型不能为空", trigger: "change" }]
}, },
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询公告列表 */ /** 查询公告列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listNotice(queryParams.value).then(response => { listNotice(queryParams.value).then(response => {
noticeList.value = response.rows; noticeList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
noticeId: undefined, noticeId: undefined,
noticeTitle: undefined, noticeTitle: undefined,
noticeType: undefined, noticeType: undefined,
noticeContent: undefined, noticeContent: undefined,
status: "0" status: "0"
}; };
proxy.resetForm("noticeRef"); proxy.resetForm("noticeRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
handleQuery(); handleQuery();
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.noticeId); ids.value = selection.map(item => item.noticeId);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加公告"; title.value = "添加公告";
} }
/**修改按钮操作 */ /**修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const noticeId = row.noticeId || ids.value; const noticeId = row.noticeId || ids.value;
getNotice(noticeId).then(response => { getNotice(noticeId).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改公告"; title.value = "修改公告";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["noticeRef"].validate(valid => { proxy.$refs["noticeRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.noticeId != undefined) { if (form.value.noticeId != undefined) {
updateNotice(form.value).then(response => { updateNotice(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addNotice(form.value).then(response => { addNotice(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} }
} }
}); });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
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();
</script> </script>

420
src/views/system/post/index.vue

@ -1,114 +1,68 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="岗位编码" prop="postCode"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
<el-input <el-form-item label="岗位编码" prop="postCode">
v-model="queryParams.postCode" <el-input v-model="queryParams.postCode" placeholder="请输入岗位编码" clearable style="width: 200px" @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 label="状态" prop="status">
</el-form-item> <el-select v-model="queryParams.status" placeholder="岗位状态" clearable style="width: 200px">
<el-form-item label="岗位名称" prop="postName"> <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-input </el-select>
v-model="queryParams.postName" </el-form-item>
placeholder="请输入岗位名称" <el-form-item>
clearable <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
style="width: 200px" <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@keyup.enter="handleQuery" </el-form-item>
/> </el-form>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="岗位状态" clearable style="width: 200px">
<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-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-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
@click="handleAdd"
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-row :gutter="10" class="mb8">
<el-table-column type="selection" width="55" align="center" /> <el-col :span="1.5">
<el-table-column label="岗位编号" align="center" prop="postId" /> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:post:add']">新增</el-button>
<el-table-column label="岗位编码" align="center" prop="postCode" /> </el-col>
<el-table-column label="岗位名称" align="center" prop="postName" /> <el-col :span="1.5">
<el-table-column label="岗位排序" align="center" prop="postSort" /> <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:post:edit']">修改</el-button>
<el-table-column label="状态" align="center" prop="status"> </el-col>
<template #default="scope"> <el-col :span="1.5">
<dict-tag :options="sys_normal_disable" :value="scope.row.status" /> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:post:remove']">删除</el-button>
</template> </el-col>
</el-table-column> <el-col :span="1.5">
<el-table-column label="创建时间" align="center" prop="createTime" width="180"> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:post:export']">导出</el-button>
<template #default="scope"> </el-col>
<span>{{ parseTime(scope.row.createTime) }}</span> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</template> </el-row>
</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 </el-card>
v-show="total > 0" <div class="el-card-p card-shadow carder-border mt10 pad10 ">
:total="total" <el-table v-table-height v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
v-model:page="queryParams.pageNum" <el-table-column type="selection" width="55" align="center" />
v-model:limit="queryParams.pageSize" <el-table-column label="岗位编号" align="center" prop="postId" />
@pagination="getList" <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" />
</div>
<!-- 添加或修改岗位对话框 --> <!-- 添加或修改岗位对话框 -->
<el-dialog :title="title" v-model="open" width="500px" append-to-body> <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 ref="postRef" :model="form" :rules="rules" label-width="80px">
@ -123,11 +77,7 @@
</el-form-item> </el-form-item>
<el-form-item label="岗位状态" prop="status"> <el-form-item label="岗位状态" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
v-for="dict in sys_normal_disable"
:key="dict.value"
:label="dict.value"
>{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
@ -145,133 +95,133 @@
</template> </template>
<script setup name="Post"> <script setup name="Post">
import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post"; import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const postList = ref([]); const postList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const title = ref(""); const title = ref("");
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
postCode: undefined, postCode: undefined,
postName: undefined, postName: undefined,
status: undefined status: undefined
}, },
rules: { rules: {
postName: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }], postName: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }],
postCode: [{ required: true, message: "岗位编码不能为空", trigger: "blur" }], postCode: [{ required: true, message: "岗位编码不能为空", trigger: "blur" }],
postSort: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }], postSort: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }],
} }
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询岗位列表 */ /** 查询岗位列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listPost(queryParams.value).then(response => { listPost(queryParams.value).then(response => {
postList.value = response.rows; postList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 取消按钮 */ /** 取消按钮 */
function cancel() { function cancel() {
open.value = false; open.value = false;
reset(); reset();
} }
/** 表单重置 */ /** 表单重置 */
function reset() { function reset() {
form.value = { form.value = {
postId: undefined, postId: undefined,
postCode: undefined, postCode: undefined,
postName: undefined, postName: undefined,
postSort: 0, postSort: 0,
status: "0", status: "0",
remark: undefined remark: undefined
}; };
proxy.resetForm("postRef"); proxy.resetForm("postRef");
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
} }
/** 重置按钮操作 */ /** 重置按钮操作 */
function resetQuery() { function resetQuery() {
proxy.resetForm("queryRef"); proxy.resetForm("queryRef");
handleQuery(); handleQuery();
} }
/** 多选框选中数据 */ /** 多选框选中数据 */
function handleSelectionChange(selection) { function handleSelectionChange(selection) {
ids.value = selection.map(item => item.postId); ids.value = selection.map(item => item.postId);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
reset(); reset();
open.value = true; open.value = true;
title.value = "添加岗位"; title.value = "添加岗位";
} }
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
reset(); reset();
const postId = row.postId || ids.value; const postId = row.postId || ids.value;
getPost(postId).then(response => { getPost(postId).then(response => {
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
title.value = "修改岗位"; title.value = "修改岗位";
}); });
} }
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
proxy.$refs["postRef"].validate(valid => { proxy.$refs["postRef"].validate(valid => {
if (valid) { if (valid) {
if (form.value.postId != undefined) { if (form.value.postId != undefined) {
updatePost(form.value).then(response => { updatePost(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addPost(form.value).then(response => { addPost(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} }
} }
}); });
} }
/** 删除按钮操作 */ /** 删除按钮操作 */
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() {
proxy.download("system/post/export", { proxy.download("system/post/export", {
...queryParams.value ...queryParams.value
}, `post_${new Date().getTime()}.xlsx`); }, `post_${new Date().getTime()}.xlsx`);
} }
getList(); getList();
</script> </script>

948
src/views/system/role/index.vue

@ -1,559 +1,469 @@
<template> <template>
<div class="app-container"> <div class="app-container app-container-bg">
<el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px"> <el-card class="first-card" ref='firstCard' shadow="always">
<el-form-item label="角色名称" prop="roleName"> <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" @submit.native.prevent>
<el-input <el-form-item label="角色名称" prop="roleName">
v-model="queryParams.roleName" <el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable style="width: 240px" @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 label="状态" prop="status">
</el-form-item> <el-select v-model="queryParams.status" placeholder="角色状态" clearable style="width: 240px">
<el-form-item label="权限字符" prop="roleKey"> <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
<el-input </el-select>
v-model="queryParams.roleKey" </el-form-item>
placeholder="请输入权限字符" <el-form-item label="创建时间" style="width: 308px">
clearable <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
style="width: 240px" </el-form-item>
@keyup.enter="handleQuery" <el-form-item>
/> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
</el-form-item> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-form-item label="状态" prop="status"> </el-form-item>
<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"
: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"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></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-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="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:role:add']">新增</el-button>
type="primary" </el-col>
plain <el-col :span="1.5">
icon="Plus" <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:role:edit']">修改</el-button>
@click="handleAdd" </el-col>
v-hasPermi="['system:role:add']" <el-col :span="1.5">
>新增</el-button> <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:role:remove']">删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:role:export']">导出</el-button>
type="success" </el-col>
plain <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
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-row>
</el-card>
<!-- 表格数据 --> <!-- 表格数据 -->
<el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> <div class="el-card-p card-shadow carder-border mt10 pad10 ">
<el-table-column type="selection" width="55" align="center" /> <el-table v-table-height v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
<el-table-column label="角色编号" prop="roleId" width="120" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" /> <el-table-column label="角色编号" prop="roleId" width="120" />
<el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" /> <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
<el-table-column label="显示顺序" prop="roleSort" width="100" /> <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
<el-table-column label="状态" align="center" width="100"> <el-table-column label="显示顺序" prop="roleSort" width="100" />
<template #default="scope"> <el-table-column label="状态" align="center" width="100">
<el-switch <template #default="scope">
v-model="scope.row.status" <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
active-value="0" </template>
inactive-value="1" </el-table-column>
@change="handleStatusChange(scope.row)" <el-table-column label="创建时间" align="center" prop="createTime">
></el-switch> <template #default="scope">
</template> <span>{{ parseTime(scope.row.createTime) }}</span>
</el-table-column> </template>
<el-table-column label="创建时间" align="center" prop="createTime"> </el-table-column>
<template #default="scope"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<span>{{ parseTime(scope.row.createTime) }}</span> <template #default="scope">
</template> <el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
</el-table-column> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> </el-tooltip>
<template #default="scope"> <el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1">
<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-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button> </el-tooltip>
</el-tooltip> <el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">
<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-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button> </el-tooltip>
</el-tooltip> <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
<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-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button> </el-tooltip>
</el-tooltip> </template>
<el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1"> </el-table-column>
<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> </el-table>
<pagination <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改角色配置对话框 --> </div>
<el-dialog :title="title" v-model="open" width="500px" append-to-body> <!-- 添加或修改角色配置对话框 -->
<el-form ref="roleRef" :model="form" :rules="rules" label-width="100px"> <el-dialog :title="title" v-model="open" width="500px" append-to-body>
<el-form-item label="角色名称" prop="roleName"> <el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
<el-input v-model="form.roleName" placeholder="请输入角色名称" /> <el-form-item label="角色名称" prop="roleName">
</el-form-item> <el-input v-model="form.roleName" placeholder="请输入角色名称" />
<el-form-item prop="roleKey"> </el-form-item>
<template #label> <el-form-item prop="roleKey">
<span> <template #label>
<el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top"> <span>
<el-icon><question-filled /></el-icon> <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
</el-tooltip> <el-icon><question-filled /></el-icon>
权限字符 </el-tooltip>
</span> 权限字符
</template> </span>
<el-input v-model="form.roleKey" placeholder="请输入权限字符" /> </template>
</el-form-item> <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
<el-form-item label="角色顺序" prop="roleSort"> </el-form-item>
<el-input-number v-model="form.roleSort" controls-position="right" :min="0" /> <el-form-item label="角色顺序" prop="roleSort">
</el-form-item> <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
<el-form-item label="状态"> </el-form-item>
<el-radio-group v-model="form.status"> <el-form-item label="状态">
<el-radio <el-radio-group v-model="form.status">
v-for="dict in sys_normal_disable" <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
:key="dict.value" </el-radio-group>
:label="dict.value" </el-form-item>
>{{ dict.label }}</el-radio> <el-form-item label="菜单权限">
</el-radio-group> <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
</el-form-item> <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
<el-form-item label="菜单权限"> <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
<el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($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-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox> </el-form-item>
<el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox> <el-form-item label="备注">
<el-tree <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
class="tree-border" </el-form-item>
:data="menuOptions" </el-form>
show-checkbox <template #footer>
ref="menuRef" <div class="dialog-footer">
node-key="id" <el-button type="primary" @click="submitForm"> </el-button>
:check-strictly="!form.menuCheckStrictly" <el-button @click="cancel"> </el-button>
empty-text="加载中,请稍候" </div>
:props="{ label: 'label', children: 'children' }" </template>
></el-tree> </el-dialog>
</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-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
<el-form :model="form" label-width="80px"> <el-form :model="form" label-width="80px">
<el-form-item label="角色名称"> <el-form-item label="角色名称">
<el-input v-model="form.roleName" :disabled="true" /> <el-input v-model="form.roleName" :disabled="true" />
</el-form-item> </el-form-item>
<el-form-item label="权限字符"> <el-form-item label="权限字符">
<el-input v-model="form.roleKey" :disabled="true" /> <el-input v-model="form.roleKey" :disabled="true" />
</el-form-item> </el-form-item>
<el-form-item label="权限范围"> <el-form-item label="权限范围">
<el-select v-model="form.dataScope" @change="dataScopeSelectChange"> <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
<el-option <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
v-for="item in dataScopeOptions" </el-select>
:key="item.value" </el-form-item>
:label="item.label" <el-form-item label="数据权限" v-show="form.dataScope == 2">
:value="item.value" <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
></el-option> <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
</el-select> <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
</el-form-item> <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 label="数据权限" v-show="form.dataScope == 2"> </el-form-item>
<el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox> </el-form>
<el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox> <template #footer>
<el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox> <div class="dialog-footer">
<el-tree <el-button type="primary" @click="submitDataScope"> </el-button>
class="tree-border" <el-button @click="cancelDataScope"> </el-button>
:data="deptOptions" </div>
show-checkbox </template>
default-expand-all </el-dialog>
ref="deptRef" </div>
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">
import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role"; import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role";
import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu"; import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu";
const router = useRouter(); const router = useRouter();
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable"); const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const roleList = ref([]); const roleList = ref([]);
const open = ref(false); const open = ref(false);
const loading = ref(true); const loading = ref(true);
const showSearch = ref(true); const showSearch = ref(true);
const ids = ref([]); const ids = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const title = ref(""); const title = ref("");
const dateRange = ref([]); const dateRange = ref([]);
const menuOptions = ref([]); const menuOptions = ref([]);
const menuExpand = ref(false); const menuExpand = ref(false);
const menuNodeAll = ref(false); const menuNodeAll = ref(false);
const deptExpand = ref(true); const deptExpand = ref(true);
const deptNodeAll = ref(false); const deptNodeAll = ref(false);
const deptOptions = ref([]); const deptOptions = ref([]);
const openDataScope = ref(false); const openDataScope = ref(false);
const menuRef = ref(null); const menuRef = ref(null);
const deptRef = ref(null); const deptRef = ref(null);
/** 数据范围选项*/ /** 数据范围选项*/
const dataScopeOptions = ref([ const dataScopeOptions = ref([
{ value: "1", label: "全部数据权限" }, { value: "1", label: "全部数据权限" },
{ value: "2", label: "自定数据权限" }, { value: "2", label: "自定数据权限" },
{ value: "3", label: "本部门数据权限" }, { value: "3", label: "本部门数据权限" },
{ value: "4", label: "本部门及以下数据权限" }, { value: "4", label: "本部门及以下数据权限" },
{ value: "5", label: "仅本人数据权限" } { value: "5", label: "仅本人数据权限" }
]); ]);
const data = reactive({ const data = reactive({
form: {}, form: {},
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
roleName: undefined, roleName: undefined,
roleKey: undefined, roleKey: undefined,
status: undefined status: undefined
}, },
rules: { rules: {
roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }], roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }], roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }] roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }]
}, },
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
/** 查询角色列表 */ /** 查询角色列表 */
function getList() { function getList() {
loading.value = true; loading.value = true;
listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => { listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
roleList.value = response.rows; roleList.value = response.rows;
total.value = response.total; total.value = response.total;
loading.value = false; loading.value = false;
}); });
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
function handleQuery() { function handleQuery() {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = [];
proxy.resetForm("queryRef");
handleQuery();
}
/** 删除按钮操作 */
function handleDelete(row) {
const roleIds = row.roleId || ids.value;
proxy.$modal.confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?').then(function () {
return delRole(roleIds);
}).then(() => {
getList(); getList();
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
proxy.download("system/role/export", {
...queryParams.value,
}, `role_${new Date().getTime()}.xlsx`);
}
/** 多选框选中数据 */
function handleSelectionChange(selection) {
ids.value = selection.map(item => item.roleId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 角色状态修改 */
function handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用";
proxy.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?').then(function () {
return changeRoleStatus(row.roleId, row.status);
}).then(() => {
proxy.$modal.msgSuccess(text + "成功");
}).catch(function () {
row.status = row.status === "0" ? "1" : "0";
});
}
/** 更多操作 */
function handleCommand(command, row) {
switch (command) {
case "handleDataScope":
handleDataScope(row);
break;
case "handleAuthUser":
handleAuthUser(row);
break;
default:
break;
} }
} /** 重置按钮操作 */
/** 分配用户 */ function resetQuery() {
function handleAuthUser(row) { dateRange.value = [];
router.push("/system/role-auth/user/" + row.roleId); proxy.resetForm("queryRef");
} handleQuery();
/** 查询菜单树结构 */ }
function getMenuTreeselect() { /** 删除按钮操作 */
menuTreeselect().then(response => { function handleDelete(row) {
menuOptions.value = response.data; const roleIds = row.roleId || ids.value;
}); proxy.$modal.confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?').then(function () {
} return delRole(roleIds);
/** 所有部门节点数据 */ }).then(() => {
function getDeptAllCheckedKeys() { getList();
// proxy.$modal.msgSuccess("删除成功");
let checkedKeys = deptRef.value.getCheckedKeys(); }).catch(() => { });
// }
let halfCheckedKeys = deptRef.value.getHalfCheckedKeys(); /** 导出按钮操作 */
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); function handleExport() {
return checkedKeys; proxy.download("system/role/export", {
} ...queryParams.value,
/** 重置新增的表单以及其他数据 */ }, `role_${new Date().getTime()}.xlsx`);
function reset() { }
if (menuRef.value != undefined) { /** 多选框选中数据 */
menuRef.value.setCheckedKeys([]); function handleSelectionChange(selection) {
ids.value = selection.map(item => item.roleId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 角色状态修改 */
function handleStatusChange(row) {
let text = row.status === "0" ? "启用" : "停用";
proxy.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?').then(function () {
return changeRoleStatus(row.roleId, row.status);
}).then(() => {
proxy.$modal.msgSuccess(text + "成功");
}).catch(function () {
row.status = row.status === "0" ? "1" : "0";
});
}
/** 更多操作 */
function handleCommand(command, row) {
switch (command) {
case "handleDataScope":
handleDataScope(row);
break;
case "handleAuthUser":
handleAuthUser(row);
break;
default:
break;
}
}
/** 分配用户 */
function handleAuthUser(row) {
router.push("/system/role-auth/user/" + row.roleId);
} }
menuExpand.value = false; /** 查询菜单树结构 */
menuNodeAll.value = false; function getMenuTreeselect() {
deptExpand.value = true; menuTreeselect().then(response => {
deptNodeAll.value = false; menuOptions.value = response.data;
form.value = { });
roleId: undefined, }
roleName: undefined, /** 所有部门节点数据 */
roleKey: undefined, function getDeptAllCheckedKeys() {
roleSort: 0, //
status: "0", let checkedKeys = deptRef.value.getCheckedKeys();
menuIds: [], //
deptIds: [], let halfCheckedKeys = deptRef.value.getHalfCheckedKeys();
menuCheckStrictly: true, checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
deptCheckStrictly: true, return checkedKeys;
remark: undefined }
}; /** 重置新增的表单以及其他数据 */
proxy.resetForm("roleRef"); function reset() {
} if (menuRef.value != undefined) {
/** 添加角色 */ menuRef.value.setCheckedKeys([]);
function handleAdd() { }
reset(); menuExpand.value = false;
getMenuTreeselect(); menuNodeAll.value = false;
open.value = true; deptExpand.value = true;
title.value = "添加角色"; deptNodeAll.value = false;
} form.value = {
/** 修改角色 */ roleId: undefined,
function handleUpdate(row) { roleName: undefined,
reset(); roleKey: undefined,
const roleId = row.roleId || ids.value; roleSort: 0,
const roleMenu = getRoleMenuTreeselect(roleId); status: "0",
getRole(roleId).then(response => { menuIds: [],
form.value = response.data; deptIds: [],
form.value.roleSort = Number(form.value.roleSort); menuCheckStrictly: true,
deptCheckStrictly: true,
remark: undefined
};
proxy.resetForm("roleRef");
}
/** 添加角色 */
function handleAdd() {
reset();
getMenuTreeselect();
open.value = true; open.value = true;
nextTick(() => { title.value = "添加角色";
roleMenu.then((res) => { }
let checkedKeys = res.checkedKeys; /** 修改角色 */
checkedKeys.forEach((v) => { function handleUpdate(row) {
nextTick(() => { reset();
menuRef.value.setChecked(v, true, false); const roleId = row.roleId || ids.value;
const roleMenu = getRoleMenuTreeselect(roleId);
getRole(roleId).then(response => {
form.value = response.data;
form.value.roleSort = Number(form.value.roleSort);
open.value = true;
nextTick(() => {
roleMenu.then((res) => {
let checkedKeys = res.checkedKeys;
checkedKeys.forEach((v) => {
nextTick(() => {
menuRef.value.setChecked(v, true, false);
});
}); });
}); });
}); });
title.value = "修改角色";
}); });
title.value = "修改角色"; }
}); /** 根据角色ID查询菜单树结构 */
} function getRoleMenuTreeselect(roleId) {
/** 根据角色ID查询菜单树结构 */ return roleMenuTreeselect(roleId).then(response => {
function getRoleMenuTreeselect(roleId) { menuOptions.value = response.menus;
return roleMenuTreeselect(roleId).then(response => { return response;
menuOptions.value = response.menus; });
return response; }
}); /** 根据角色ID查询部门树结构 */
} function getDeptTree(roleId) {
/** 根据角色ID查询部门树结构 */ return deptTreeSelect(roleId).then(response => {
function getDeptTree(roleId) { deptOptions.value = response.depts;
return deptTreeSelect(roleId).then(response => { return response;
deptOptions.value = response.depts; });
return response; }
}); /** 树权限(展开/折叠)*/
} function handleCheckedTreeExpand(value, type) {
/** 树权限(展开/折叠)*/ if (type == "menu") {
function handleCheckedTreeExpand(value, type) { let treeList = menuOptions.value;
if (type == "menu") { for (let i = 0; i < treeList.length; i++) {
let treeList = menuOptions.value; menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
for (let i = 0; i < treeList.length; i++) { }
menuRef.value.store.nodesMap[treeList[i].id].expanded = value; } else if (type == "dept") {
let treeList = deptOptions.value;
for (let i = 0; i < treeList.length; i++) {
deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
}
} }
} else if (type == "dept") { }
let treeList = deptOptions.value; /** 树权限(全选/全不选) */
for (let i = 0; i < treeList.length; i++) { function handleCheckedTreeNodeAll(value, type) {
deptRef.value.store.nodesMap[treeList[i].id].expanded = value; if (type == "menu") {
menuRef.value.setCheckedNodes(value ? menuOptions.value : []);
} else if (type == "dept") {
deptRef.value.setCheckedNodes(value ? deptOptions.value : []);
} }
} }
} /** 树权限(父子联动) */
/** 树权限(全选/全不选) */ function handleCheckedTreeConnect(value, type) {
function handleCheckedTreeNodeAll(value, type) { if (type == "menu") {
if (type == "menu") { form.value.menuCheckStrictly = value ? true : false;
menuRef.value.setCheckedNodes(value ? menuOptions.value : []); } else if (type == "dept") {
} else if (type == "dept") { form.value.deptCheckStrictly = value ? true : false;
deptRef.value.setCheckedNodes(value ? deptOptions.value : []); }
} }
} /** 所有菜单节点数据 */
/** 树权限(父子联动) */ function getMenuAllCheckedKeys() {
function handleCheckedTreeConnect(value, type) { //
if (type == "menu") { let checkedKeys = menuRef.value.getCheckedKeys();
form.value.menuCheckStrictly = value ? true : false; //
} else if (type == "dept") { let halfCheckedKeys = menuRef.value.getHalfCheckedKeys();
form.value.deptCheckStrictly = value ? true : false; checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
return checkedKeys;
} }
} /** 提交按钮 */
/** 所有菜单节点数据 */ function submitForm() {
function getMenuAllCheckedKeys() { proxy.$refs["roleRef"].validate(valid => {
// if (valid) {
let checkedKeys = menuRef.value.getCheckedKeys(); if (form.value.roleId != undefined) {
// form.value.menuIds = getMenuAllCheckedKeys();
let halfCheckedKeys = menuRef.value.getHalfCheckedKeys(); updateRole(form.value).then(response => {
checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); proxy.$modal.msgSuccess("修改成功");
return checkedKeys; open.value = false;
} getList();
/** 提交按钮 */ });
function submitForm() { } else {
proxy.$refs["roleRef"].validate(valid => { form.value.menuIds = getMenuAllCheckedKeys();
if (valid) { addRole(form.value).then(response => {
if (form.value.roleId != undefined) { proxy.$modal.msgSuccess("新增成功");
form.value.menuIds = getMenuAllCheckedKeys(); open.value = false;
updateRole(form.value).then(response => { getList();
proxy.$modal.msgSuccess("修改成功"); });
open.value = false; }
getList();
});
} else {
form.value.menuIds = getMenuAllCheckedKeys();
addRole(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
} }
});
}
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
/** 选择角色权限范围触发 */
function dataScopeSelectChange(value) {
if (value !== "2") {
deptRef.value.setCheckedKeys([]);
} }
});
}
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
/** 选择角色权限范围触发 */
function dataScopeSelectChange(value) {
if (value !== "2") {
deptRef.value.setCheckedKeys([]);
} }
} /** 分配数据权限操作 */
/** 分配数据权限操作 */ function handleDataScope(row) {
function handleDataScope(row) { reset();
reset(); const deptTreeSelect = getDeptTree(row.roleId);
const deptTreeSelect = getDeptTree(row.roleId); getRole(row.roleId).then(response => {
getRole(row.roleId).then(response => { form.value = response.data;
form.value = response.data; openDataScope.value = true;
openDataScope.value = true; nextTick(() => {
nextTick(() => { deptTreeSelect.then(res => {
deptTreeSelect.then(res => { nextTick(() => {
nextTick(() => { if (deptRef.value) {
if (deptRef.value) { deptRef.value.setCheckedKeys(res.checkedKeys);
deptRef.value.setCheckedKeys(res.checkedKeys); }
} });
}); });
}); });
}); title.value = "分配数据权限";
title.value = "分配数据权限";
});
}
/** 提交按钮(数据权限) */
function submitDataScope() {
if (form.value.roleId != undefined) {
form.value.deptIds = getDeptAllCheckedKeys();
dataScope(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
openDataScope.value = false;
getList();
}); });
} }
} /** 提交按钮(数据权限) */
/** 取消按钮(数据权限)*/ function submitDataScope() {
function cancelDataScope() { if (form.value.roleId != undefined) {
openDataScope.value = false; form.value.deptIds = getDeptAllCheckedKeys();
reset(); dataScope(form.value).then(response => {
} proxy.$modal.msgSuccess("修改成功");
openDataScope.value = false;
getList();
});
}
}
/** 取消按钮(数据权限)*/
function cancelDataScope() {
openDataScope.value = false;
reset();
}
getList(); getList();
</script> </script>
Loading…
Cancel
Save