Browse Source

监督端-查询统计

dev-V1.0.1
庄锐波 5 months ago
parent
commit
0ac7a12999
  1. 4
      zdxt-web-client/zdxt-admin-plus-ui/src/layout/components/Navbar.vue
  2. 13
      zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/permission.ts
  3. 35
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue
  4. 12
      zdxt-web-client/zdxt-admin-plus-ui/src/views/system/role/index-dept-separate.vue

4
zdxt-web-client/zdxt-admin-plus-ui/src/layout/components/Navbar.vue

@ -12,7 +12,7 @@
placeholder="切换菜单组" placeholder="切换菜单组"
@change="handleSystemCodeChange" @change="handleSystemCodeChange"
> >
<el-option v-for="item in systemCodeOptions" :key="item.value" :label="item.label" :value="item.value"> <el-option v-for="item in permissionStore.visibleSystemCodeOptions" :key="item.value" :label="item.label" :value="item.value">
<el-icon style="vertical-align: middle; margin-right: 4px;"><component :is="item.icon" /></el-icon> <el-icon style="vertical-align: middle; margin-right: 4px;"><component :is="item.icon" /></el-icon>
<span>{{ item.label }}</span> <span>{{ item.label }}</span>
</el-option> </el-option>
@ -102,7 +102,7 @@
<script setup lang="ts"> <script setup lang="ts">
import SearchMenu from './TopBar/search.vue'; import SearchMenu from './TopBar/search.vue';
import { usePermissionStore, systemCodeOptions } from '@/store/modules/permission'; import { usePermissionStore } from '@/store/modules/permission';
import { useAppStore } from '@/store/modules/app'; import { useAppStore } from '@/store/modules/app';
import { useUserStore } from '@/store/modules/user'; import { useUserStore } from '@/store/modules/user';
import { useSettingsStore } from '@/store/modules/settings'; import { useSettingsStore } from '@/store/modules/settings';

13
zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/permission.ts

@ -7,7 +7,7 @@ import { RouteRecordRaw } from 'vue-router';
import Layout from '@/layout/index.vue'; import Layout from '@/layout/index.vue';
import ParentView from '@/components/ParentView/index.vue'; import ParentView from '@/components/ParentView/index.vue';
import InnerLink from '@/layout/components/InnerLink/index.vue'; import InnerLink from '@/layout/components/InnerLink/index.vue';
import { ref } from 'vue'; import { ref, computed } from 'vue';
import { createCustomNameComponent } from '@/utils/createCustomNameComponent'; import { createCustomNameComponent } from '@/utils/createCustomNameComponent';
import { isHttp } from '@/utils/validate'; import { isHttp } from '@/utils/validate';
@ -212,6 +212,16 @@ export const usePermissionStore = defineStore('permission', () => {
iframeUrl.value = defaultOption?.iframeUrl || ''; iframeUrl.value = defaultOption?.iframeUrl || '';
}; };
/** 根据后端返回的路由数据,动态过滤可见的系统分类选项(首页始终显示) */
const visibleSystemCodeOptions = computed(() => {
return systemCodeOptions.filter((option) => {
// 首页(有 iframeUrl 的)始终显示
if (option.iframeUrl) return true;
// 其他选项:只有当后端路由中存在匹配的 systemCode 时才显示
return allRouteDataCache.value.some((route: any) => route.systemCode === option.value);
});
});
return { return {
routes, routes,
topbarRouters, topbarRouters,
@ -220,6 +230,7 @@ export const usePermissionStore = defineStore('permission', () => {
currentSystemCode, currentSystemCode,
iframeMode, iframeMode,
iframeUrl, iframeUrl,
visibleSystemCodeOptions,
getRoutes, getRoutes,
getDefaultRoutes, getDefaultRoutes,

35
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/virtualUnit/unitUserManager.vue

@ -353,6 +353,22 @@ const roleLoading = ref(false);
const roleList = ref<RoleVO[]>([]); const roleList = ref<RoleVO[]>([]);
const roleTableRef = ref<InstanceType<typeof import('element-plus')['ElTable']>>(); const roleTableRef = ref<InstanceType<typeof import('element-plus')['ElTable']>>();
const currentRoleUser = ref<{ userId: number; fullname: string }>({ userId: 0, fullname: '' }); const currentRoleUser = ref<{ userId: number; fullname: string }>({ userId: 0, fullname: '' });
const roleSearchKeyword = ref('');
/** 根据搜索关键词过滤角色列表 */
const filteredRoleList = computed(() => {
const keyword = roleSearchKeyword.value.trim();
if (!keyword) return roleList.value;
return roleList.value.filter((role) => role.roleName?.includes(keyword) || role.roleKey?.includes(keyword));
});
/** 高亮角色名称中匹配的文字 */
const highlightRoleName = (name: string | undefined) => {
if (!name) return '';
const keyword = roleSearchKeyword.value.trim();
if (!keyword) return name;
return name.replace(new RegExp(`(${keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'g'), '<span class="search-match">$1</span>');
};
/** 打开分配角色对话框 */ /** 打开分配角色对话框 */
const handleAuthRole = async (row: UnitUserVo) => { const handleAuthRole = async (row: UnitUserVo) => {
@ -537,21 +553,32 @@ const submitResetPwd = async () => {
</div> </div>
<!-- 分配角色对话框 --> <!-- 分配角色对话框 -->
<el-dialog v-model="roleDialogVisible" title="分配角色" width="600px" append-to-body> <el-dialog v-model="roleDialogVisible" title="分配角色" width="860px" append-to-body @close="roleSearchKeyword = ''">
<div style="margin-bottom: 12px;"> <div style="margin-bottom: 12px; display: flex; align-items: center; justify-content: space-between;">
<span>当前用户:<strong>{{ currentRoleUser.fullname }}</strong></span> <span>当前用户:<strong>{{ currentRoleUser.fullname }}</strong></span>
<el-input
v-model="roleSearchKeyword"
placeholder="搜索角色名称"
:prefix-icon="Search"
clearable
style="width: 220px;"
/>
</div> </div>
<el-table <el-table
ref="roleTableRef" ref="roleTableRef"
v-loading="roleLoading" v-loading="roleLoading"
:data="roleList" :data="filteredRoleList"
border border
row-key="roleId" row-key="roleId"
max-height="400px" max-height="400px"
@row-click="(row: RoleVO) => { if (row.status === '0') roleTableRef?.toggleRowSelection(row) }" @row-click="(row: RoleVO) => { if (row.status === '0') roleTableRef?.toggleRowSelection(row) }"
> >
<el-table-column type="selection" width="55" :selectable="(row: RoleVO) => row.status === '0'" /> <el-table-column type="selection" width="55" :selectable="(row: RoleVO) => row.status === '0'" />
<el-table-column label="角色名称" align="center" prop="roleName" /> <el-table-column label="角色名称" align="center">
<template #default="{ row }">
<span v-html="highlightRoleName(row.roleName)"></span>
</template>
</el-table-column>
<el-table-column label="权限字符" align="center" prop="roleKey" /> <el-table-column label="权限字符" align="center" prop="roleKey" />
<el-table-column label="状态" align="center" width="80"> <el-table-column label="状态" align="center" width="80">
<template #default="{ row }"> <template #default="{ row }">

12
zdxt-web-client/zdxt-admin-plus-ui/src/views/system/role/index-dept-separate.vue

@ -1,8 +1,8 @@
<template> <template>
<div class="p-2"> <div class="p-2">
<el-row :gutter="20"> <el-row :gutter="20">
<!-- 部门树 --> <!-- 部门树(暂时隐藏) -->
<el-col :lg="4" :xs="24"> <el-col v-if="false" :lg="4" :xs="24">
<el-card shadow="hover" style="position: sticky; top: 0;"> <el-card shadow="hover" style="position: sticky; top: 0;">
<el-input v-model="deptName" placeholder="请输入部门名称" prefix-icon="Search" clearable /> <el-input v-model="deptName" placeholder="请输入部门名称" prefix-icon="Search" clearable />
<div style="max-height: calc(100vh - 180px); overflow-y: auto; overflow-x: hidden;"> <div style="max-height: calc(100vh - 180px); overflow-y: auto; overflow-x: hidden;">
@ -23,7 +23,7 @@
</el-col> </el-col>
<!-- 右侧角色管理 --> <!-- 右侧角色管理 -->
<el-col :lg="20" :xs="24"> <el-col :lg="24" :xs="24">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
@ -81,15 +81,15 @@
<el-table ref="roleTableRef" border v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> <el-table ref="roleTableRef" border v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column v-if="false" label="角色编号" prop="roleId" width="120" /> <el-table-column v-if="false" label="角色编号" prop="roleId" width="120" />
<el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" /> <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" />
<el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="200" /> <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="400" />
<el-table-column label="显示顺序" prop="roleSort" width="100" /> <el-table-column label="显示顺序" prop="roleSort" width="100" />
<el-table-column label="状态" align="center" width="100"> <el-table-column label="状态" align="center" width="100">
<template #default="scope"> <template #default="scope">
<el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" align="center" prop="createTime"> <el-table-column label="创建时间" align="center" prop="createTime" width="250">
<template #default="scope"> <template #default="scope">
<span>{{ proxy.parseTime(scope.row.createTime) }}</span> <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
</template> </template>

Loading…
Cancel
Save