feat:人员管理页面跳转

This commit is contained in:
dzc committed 2025-09-17 15:53:16 +08:00
1 parent ddc7465294
commit 8b6f39e880
9 files changed
+130 -60

No files matched your search

+26 -21
View File
@@ -1,8 +1,9 @@
<template>
<div class="h100" v-show="!isTagsViewCurrenFull">
<div v-if="!isFromPanel" class="h100" v-show="!isTagsViewCurrenFull">
<el-aside class="layout-aside" :class="setCollapseStyle" v-if="setShowAside">
<Logo v-if="setShowLogo" />
<el-scrollbar class="flex-auto" ref="layoutAsideScrollbarRef" @mouseenter="onAsideEnterLeave(true)" @mouseleave="onAsideEnterLeave(false)">
<el-scrollbar class="flex-auto" ref="layoutAsideScrollbarRef" @mouseenter="onAsideEnterLeave(true)"
@mouseleave="onAsideEnterLeave(false)">
<Vertical :menuList="state.menuList" />
</el-scrollbar>
</el-aside>
@@ -10,15 +11,16 @@
</template>
<script setup lang="ts" name="layoutAside">
import {computed, defineAsyncComponent, onBeforeMount, reactive, ref, watch} from 'vue';
import {storeToRefs} from 'pinia';
import { computed, defineAsyncComponent, onBeforeMount, reactive, ref, watch } from 'vue';
import { storeToRefs } from 'pinia';
import pinia from '/@/stores/index';
import {useRoutesList} from '/@/stores/routesList';
import {useThemeConfig} from '/@/stores/themeConfig';
import {useTagsViewRoutes} from '/@/stores/tagsViewRoutes';
import { useRoutesList } from '/@/stores/routesList';
import { useThemeConfig } from '/@/stores/themeConfig';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import mittBus from '/@/utils/mitt';
import {useI18n} from 'vue-i18n';
import {useRoute} from "vue-router";
import { useI18n } from 'vue-i18n';
import { useRoute } from "vue-router";
import { usePanel } from "/@/stores/panel"
// 引入组件
const Logo = defineAsyncComponent(() => import('/@/layout/logo/index.vue'));
@@ -37,6 +39,9 @@ const state = reactive<AsideState>({
clientWidth: 0,
});
const storesPanel = usePanel()
const { isFromPanel } = storeToRefs(storesPanel);
// 设置菜单展开/收起时的宽度
const setCollapseStyle = computed(() => {
const { layout, isCollapse, menuBar } = themeConfig.value;
@@ -64,13 +69,13 @@ const setCollapseStyle = computed(() => {
? isCollapse
? 'layout-aside-pc-1'
: locale.value === 'en'
? 'layout-aside-pc-250'
: 'layout-aside-pc-220'
? 'layout-aside-pc-250'
: 'layout-aside-pc-220'
: isCollapse
? 'layout-aside-pc-64'
: locale.value === 'en'
? 'layout-aside-pc-250'
: 'layout-aside-pc-220',
? 'layout-aside-pc-64'
: locale.value === 'en'
? 'layout-aside-pc-250'
: 'layout-aside-pc-220',
];
}
});
@@ -78,12 +83,12 @@ const setCollapseStyle = computed(() => {
const route = useRoute();
// 设置是否显示左侧菜单栏
const setShowAside = computed(() => {
let { layout } = themeConfig.value;
if(layout !== 'classic'){
return true
}
// 首页不显示侧边栏
return route.path !== '/home'
let { layout } = themeConfig.value;
if (layout !== 'classic') {
return true
}
// 首页不显示侧边栏
return route.path !== '/home'
});
// 设置显示/隐藏 logo
+5 -1
View File
@@ -1,5 +1,5 @@
<template>
<el-header class="layout-header" v-show="!isTagsViewCurrenFull">
<el-header v-if="!isFromPanel" class="layout-header" v-show="!isTagsViewCurrenFull">
<NavBarsIndex />
</el-header>
</template>
@@ -8,6 +8,7 @@
import { defineAsyncComponent } from 'vue';
import { storeToRefs } from 'pinia';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { usePanel } from "/@/stores/panel"
// 引入组件
const NavBarsIndex = defineAsyncComponent(() => import('/@/layout/navBars/index.vue'));
@@ -15,4 +16,7 @@ const NavBarsIndex = defineAsyncComponent(() => import('/@/layout/navBars/index.
// 定义变量内容
const storesTagsViewRoutes = useTagsViewRoutes();
const { isTagsViewCurrenFull } = storeToRefs(storesTagsViewRoutes);
const storesPanel = usePanel()
const { isFromPanel } = storeToRefs(storesPanel);
</script>
+9 -8
View File
@@ -1,16 +1,13 @@
<template>
<el-main class="layout-main" :style="isFixedHeader ? `height: calc(100% - ${setMainHeight})` : `minHeight: calc(100% - ${setMainHeight})`">
<el-scrollbar
ref="layoutMainScrollbarRef"
class="layout-main-scroll layout-backtop-header-fixed"
wrap-class="layout-main-scroll"
view-class="layout-main-scroll"
>
<el-main class="layout-main"
:style="!isFromPanel ? (isFixedHeader ? `height: calc(100% - ${setMainHeight})` : `minHeight: calc(100% - ${setMainHeight})`) : 'height:100%;'">
<el-scrollbar ref="layoutMainScrollbarRef" class="layout-main-scroll layout-backtop-header-fixed"
wrap-class="layout-main-scroll" view-class="layout-main-scroll">
<LayoutParentView />
</el-scrollbar>
<el-backtop :target="setBacktopClass" />
<check-token />
<chat/>
<chat />
</el-main>
</template>
@@ -18,6 +15,7 @@
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { useThemeConfig } from '/@/stores/themeConfig';
import { NextLoading } from '/@/utils/loading';
import { usePanel } from "/@/stores/panel"
// 引入组件
const LayoutParentView = defineAsyncComponent(() => import('/@/layout/routerView/parent.vue'));
@@ -32,6 +30,9 @@ const storesThemeConfig = useThemeConfig();
const { themeConfig } = storeToRefs(storesThemeConfig);
const { isTagsViewCurrenFull } = storeToRefs(storesTagsViewRoutes);
const storesPanel = usePanel()
const { isFromPanel } = storeToRefs(storesPanel);
// 设置 header 固定
const isFixedHeader = computed(() => {
return themeConfig.value.isFixedHeader;
+15
View File
@@ -0,0 +1,15 @@
import { defineStore } from 'pinia';
export const usePanel = defineStore('panel', {
state: () => ({
isFromPanel: false,
}),
actions: {
openFromPanel() {
this.isFromPanel = true;
},
closeFromPanel() {
this.isFromPanel = false;
}
},
});
@@ -10,7 +10,7 @@
</el-form-item>
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item style="width: 350px;" label="抓拍时间" prop="swingTimeList">
<el-date-picker v-model="state.queryForm.swingTimeList" value-format="YYYY-MM-DD"
<el-date-picker v-model="state.queryForm.swingTimeList" value-format="YYYY-MM-DD HH:mm:ss"
type="daterange" />
</el-form-item>
</el-form>
+24 -2
View File
@@ -15,9 +15,9 @@
<dict-select v-model="state.queryForm.alarmType" :options="door_alarm_type"
placeholder="请选择报警类型" />
</el-form-item>
<el-form-item style="width: 350px;" label="抓拍时间" prop="swingTimeList">
<el-form-item style="width: 450px;" label="抓拍时间" prop="swingTimeList">
<el-date-picker v-model="state.queryForm.swingTimeList" value-format="YYYY-MM-DD HH:mm:ss"
type="daterange" />
type="datetimerange" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
@@ -136,6 +136,9 @@ import { BasicTableProps, useTable } from "/@/hooks/table";
import { useMessage, useMessageBox } from "/@/hooks/message";
import { useDict } from '/@/hooks/dict';
import { parseTime } from "/@/utils/formatTime"
import { usePanel } from "/@/stores/panel"
const storesPanel = usePanel()
import * as DoorRecordApi from "/@/api/door/doorRecord";
@@ -181,6 +184,25 @@ const resetQuery = () => {
getDataList()
}
onBeforeMount(() => {
const query: any = useRoute().query
if (query && query.action == 'panel') {
if (query.params) {
Object.assign(state.queryForm, JSON.parse(query.params))
getDataList()
}
storesPanel.openFromPanel()
}
})
onBeforeUnmount(() => {
const query = useRoute().query
if (query && query.action == 'panel') {
storesPanel.closeFromPanel()
}
})
// 导出excel
const exportExcel = () => {
downBlobFile('/door/doorRecord/export', Object.assign(state.queryForm, { ids: selectObjs }), 'doorRecord.xlsx')
+1 -1
View File
@@ -138,7 +138,7 @@ const getSummaries = (param: any) => {
function openDoorTableDialogRef(row: any) {
const query = {
swingTimeList: [row.time, addDays(row.time, 1)],
swingTimeList: [row.time + " 00:00:00", addDays(row.time, 1) + " 00:00:00"],
openTypeList: ['61', '62'],
}
doorTableDialogRef.value.openDialog(query)
+23 -2
View File
@@ -12,9 +12,9 @@
<el-form-item style="width: 250px;" label="开门类型" prop="openType">
<dict-select v-model="state.queryForm.openType" :options="dh_door_open_type" placeholder="请选择进开门类型" />
</el-form-item>
<el-form-item style="width: 350px;" label="抓拍时间" prop="swingTimeList">
<el-form-item style="width: 450px;" label="抓拍时间" prop="swingTimeList">
<el-date-picker v-model="state.queryForm.swingTimeList" value-format="YYYY-MM-DD HH:mm:ss"
type="daterange" />
type="datetimerange" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="getDataList">
@@ -122,6 +122,9 @@ import { BasicTableProps, useTable } from "/@/hooks/table";
import { fetchList, delObjs } from "/@/api/door/doorRecord";
import { useMessage, useMessageBox } from "/@/hooks/message";
import { useDict } from '/@/hooks/dict';
import { usePanel } from "/@/stores/panel"
const storesPanel = usePanel()
// 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
@@ -161,6 +164,24 @@ const resetQuery = () => {
getDataList()
}
onBeforeMount(() => {
const query: any = useRoute().query
if (query && query.action == 'panel') {
if (query.params) {
Object.assign(state.queryForm, JSON.parse(query.params))
getDataList()
}
storesPanel.openFromPanel()
}
})
onBeforeUnmount(() => {
const query = useRoute().query
if (query && query.action == 'panel') {
storesPanel.closeFromPanel()
}
})
// 导出excel
const exportExcel = () => {
downBlobFile('/door/doorRecord/export', Object.assign(state.queryForm, { ids: selectObjs }), 'doorRecord.xlsx')
+26 -24
View File
@@ -17,29 +17,22 @@
<el-empty description="没有部件啦" :image-size="280"></el-empty>
</div>
<el-row :gutter="2">
<el-col :gutter="2" v-for="(item, index) in grid.layout" v-bind:key="index" :md="item" :xs="24">
<draggable
v-model="grid.copmsList[index]"
animation="200"
handle=".customize-overlay"
group="people"
item-key="com"
dragClass="aaaaa"
force-fallback
fallbackOnBody
class="draggable-box"
>
<el-col :gutter="2" v-for="(item, index) in grid.layout" v-bind:key="index" :md="item"
:xs="24">
<draggable v-model="grid.copmsList[index]" animation="200" handle=".customize-overlay"
group="people" item-key="com" dragClass="aaaaa" force-fallback fallbackOnBody
class="draggable-box">
<template #item="{ element }">
<div class="widgets-item">
<component :is="allComps[element]"></component>
<div v-if="customizing" class="customize-overlay">
<el-button class="close" type="danger" plain icon="Close" size="small" @click="remove(element)"></el-button>
<el-button class="close" type="danger" plain icon="Close" size="small"
@click="remove(element)"></el-button>
<label>
<el-icon>
<component :is="allComps[element].icon" />
</el-icon>
{{ allComps[element].title }}</label
>
{{ allComps[element].title }}</label>
</div>
</div>
</template>
@@ -54,26 +47,32 @@
<el-header>
<div class="widgets-aside-title">添加部件</div>
<div class="widgets-aside-close" @click="close()">
<el-icon><Close /></el-icon>
<el-icon>
<Close />
</el-icon>
</div>
</el-header>
<el-header style="height: auto">
<div class="selectLayout">
<div class="selectLayout-item item01" :class="{ active: grid.layout.join(',') === '12,6,6' }" @click="setLayout([12, 6, 6])">
<div class="selectLayout-item item01"
:class="{ active: grid.layout.join(',') === '12,6,6' }" @click="setLayout([12, 6, 6])">
<el-row :gutter="2">
<el-col :span="7"><span></span></el-col>
<el-col :span="7"><span></span></el-col>
<el-col :span="10"><span></span></el-col>
</el-row>
</div>
<div class="selectLayout-item item02" :class="{ active: grid.layout.join(',') === '24,16,8' }" @click="setLayout([24, 16, 8])">
<div class="selectLayout-item item02"
:class="{ active: grid.layout.join(',') === '24,16,8' }"
@click="setLayout([24, 16, 8])">
<el-row :gutter="2">
<el-col :span="24"><span></span></el-col>
<el-col :span="16"><span></span></el-col>
<el-col :span="8"><span></span></el-col>
</el-row>
</div>
<div class="selectLayout-item item03" :class="{ active: grid.layout.join(',') === '24' }" @click="setLayout([24])">
<div class="selectLayout-item item03" :class="{ active: grid.layout.join(',') === '24' }"
@click="setLayout([24])">
<el-row :gutter="2">
<el-col :span="24"><span></span></el-col>
<el-col :span="24"><span></span></el-col>
@@ -98,7 +97,8 @@
<p>{{ item.description }}</p>
</div>
<div class="item-actions">
<el-button type="primary" icon="el-icon-plus" size="small" @click="push(item)"></el-button>
<el-button type="primary" icon="el-icon-plus" size="small"
@click="push(item)"></el-button>
</div>
</div>
</div>
@@ -124,7 +124,7 @@ const defaultGrid = ref({
copmsList: [
['current-user', 'flow-data', 'audit-log', 'sys-log-line'],
['news', 'sys-log', 'demo-chart1'],
['calendar', 'favorite-menu','favorite-flow', 'demo-chart2'],
['calendar', 'favorite-menu', 'favorite-flow', 'demo-chart2'],
],
});
const customizing = ref(false);
@@ -209,8 +209,8 @@ const backDefaul = () => {
widgets.value.style.removeProperty('transform');
grid.value = defaultGrid.value;
Local.remove(widgetsKey.value);
// 重新加载页面
window.location.reload();
// 重新加载页面
window.location.reload();
};
const close = () => {
@@ -306,7 +306,7 @@ onMounted(() => {
.customizing .widgets-wrapper {
margin-right: -360px;
width: 100%;
width: 100%;
}
.customizing .widgets-wrapper .el-col {
@@ -470,6 +470,7 @@ onMounted(() => {
.customizing .widgets {
transform: scale(1) !important;
}
.customizing .widgets-aside {
width: 100%;
position: absolute;
@@ -477,6 +478,7 @@ onMounted(() => {
right: 0;
bottom: 0;
}
.customizing .widgets-wrapper {
margin-right: 0;
}