<script lang="ts" setup name="Tools"> import { ElLoading, ElMessage } from 'element-plus' import { useFullscreen } from '@vueuse/core' import type { Ref } from 'vue' import ResetPwd from './resetPwd.vue' import eventBus from '@/utils/eventBus' import useSettingsStore from '@/store/modules/settings' import useUserStore from '@/store/modules/user' import useRouteStore from '@/store/modules/route' import { getDictByCode } from '@/api/system/dict' import useWebsocketStore from '@/store/modules/websocket' import { getMultiTenantList, multiTenantConfig } from '@/api/system/multiTenant' const { proxy } = getCurrentInstance() const router = useRouter() const settingsStore = useSettingsStore() const userStore = useUserStore() const routeStore = useRouteStore() const websocket = useWebsocketStore() const mainPage = useMainPage() const { isFullscreen, toggle } = useFullscreen() const resetPwd = ref() interface Message { id: string message: string time: string } const messageList: Ref<Message[]> = ref([]) messageList.value = [ { id: '1', message: '示例消息', time: '2022-07-20 18:32:00' }, { id: '2', message: '收到一条证书到期提醒', time: '2022-07-20 18:32:00' }, { id: '3', message: '有新的借用申请待审批', time: '2022-07-20 18:32:00' }, { id: '4', message: '您的请假申请已通过', time: '2022-07-20 18:32:00' }, { id: '1', message: '示例消息', time: '2022-07-20 18:32:00' }, { id: '2', message: '收到一条证书到期提醒', time: '2022-07-20 18:32:00' }, { id: '3', message: '有新的借用申请待审批', time: '2022-07-20 18:32:00' }, { id: '4', message: '您的请假申请已通过', time: '2022-07-20 18:32:00' }, ] function userCommand(command: 'dashboard' | 'resetPassword' | 'setting' | 'hotkeys' | 'logout' | 'index') { switch (command) { case 'dashboard': router.push({ name: 'dashboard', }) break case 'resetPassword': resetPwd.value.initDialog() break case 'setting': router.push({ name: 'personalSetting', }) break case 'index': // 清空当前系统路由 localStorage.removeItem('currentSys') routeStore.removeRoutes() router.push({ path: '/index', }) break case 'hotkeys': eventBus.emit('global-hotkeys-intro-toggle') break case 'logout': localStorage.removeItem('currentSys') routeStore.removeRoutes() userStore.logout().then(() => { router.push({ name: 'login', }) }) break } } function pro() { window.open('https://hooray.gitee.io/fantastic-admin-pro-example/', 'top') } const systemType = ref('') // -------------------------------------租户权限相关------------------------------------------ const tenantData = ref({ tenantId: '', }) const tenantList: any = ref([]) // 获取租户下拉框 const fetchMultiTenantList = () => { const params = { keywords: '', tenantName: '', } getMultiTenantList(params).then((res) => { tenantList.value = res.data }) } const changeSelectTenantId = (id: string) => { tenantData.value.tenantId = id console.log('选择的id', id) const loading = ElLoading.service({ lock: true, text: '正在查询回放列表,请稍等', background: 'rgba(255, 255, 255, 0.8)', }) multiTenantConfig({ tenantId: id, }).then((res) => { if (res.code === 200) { ElMessage.success(res.data || '设置成功') // location.reload() document.getElementById('refresh')?.click() } loading.close() }).catch(() => { loading.close() }) } // --------------------------------------------字典--------------------------------------- const videoLink = ref('') // 视频会议链接的地址 const dangerMapLink = ref('') // 视频会议链接的地址 // 获取字典值 async function getDict() { // 视频会议链接地址 const response = await getDictByCode('videoLink') if (response && response.data && response.data.length) { videoLink.value = `${response.data[0].value}://${response.data[0].name}` } // 风险点地图地址 const mapResponse = await getDictByCode('dangermapLink') if (mapResponse && mapResponse.data && mapResponse.data.length) { dangerMapLink.value = `${mapResponse.data[0].value}://${mapResponse.data[0].name}` } } getDict() // -------------------------------------------------------------------------------------- // 点击视频会议\风险点地图按钮 const jumpPage = (type: 'video' | 'map') => { switch (type) { case 'video': // 视频会议 console.log('跳转链接', videoLink.value) window.open(videoLink.value) break case 'map': // 风险点地图 console.log('风险点地图跳转链接', dangerMapLink.value) // eslint-disable-next-line no-case-declarations const tempUrl = `${dangerMapLink.value}?token=${window.localStorage.getItem('token')}` window.open(tempUrl) break } } // -------------------------------------租户权限相关------------------------------------------ onMounted(() => { // 连接 websocket // websocket.initWebSocket() systemType.value = window.localStorage.getItem('systemType') as string fetchMultiTenantList() // 获取租户权限列表 }) onBeforeMount(() => { // 断开 websocket // websocket.destroyWebSocket() }) </script> <template> <div class="tools"> <div class="buttons"> <el-button v-if="proxy.hasPerm('/alarm/securityAlarm/dangermap')" type="success" @click="jumpPage('map')"> 风险点地图 </el-button> <el-button v-if="proxy.hasPerm('/alarm/securityAlarm/videoLink')" type="success" style="margin-right: 10px;" @click="jumpPage('video')"> 视频会议 </el-button> <span v-if="proxy.hasPerm('/sys/tenantSelect')" class="item" style="width: 100px;"> <el-select v-model="tenantData.tenantId" placeholder="租户权限" clearable filterable style="width: 100%;" @change="changeSelectTenantId" > <el-option v-for="item of tenantList" :key="item.id" :value="item.id " :label="item.tenantName" /> </el-select> </span> <span v-if="settingsStore.navSearch.enable" class="item" @click="eventBus.emit('global-search-toggle')"> <el-icon> <svg-icon name="ep:search" /> </el-icon> </span> <span v-if="settingsStore.mode === 'pc' && settingsStore.toolbar.enableFullscreen" class="item" @click="toggle"> <el-icon> <svg-icon :name="isFullscreen ? 'fullscreen-exit' : 'fullscreen'" /> </el-icon> </span> <span v-if="settingsStore.toolbar.enablePageReload" id="refresh" class="item" @click="mainPage.reload()"> <el-icon> <svg-icon name="icon-refresh" /> </el-icon> </span> <span v-if="settingsStore.toolbar.enableColorScheme" class="item" @click="settingsStore.setColorScheme(settingsStore.app.colorScheme === 'dark' ? 'light' : 'dark')"> <el-icon> <svg-icon v-show="settingsStore.app.colorScheme === 'light'" name="ep:sunny" /> <svg-icon v-show="settingsStore.app.colorScheme === 'dark'" name="ep:moon" /> </el-icon> </span> <span v-if="settingsStore.toolbar.enableAppSetting" class="item" @click="eventBus.emit('global-theme-toggle')"> <el-icon> <svg-icon name="ep:setting" /> </el-icon> </span> <!-- <span class="item" @click="userCommand('index')"> <el-icon> <svg-icon name="icon-goWorkbench" /> </el-icon> </span> --> <!-- 消息列表 --> <!-- <span v-if="settingsStore.mode === 'pc'" class="item"> <el-popover width="300"> <template #reference> <div> <el-badge :value="messageList.length" :max="9"> <el-icon> <svg-icon name="ep:bell" /> </el-icon> </el-badge> </div> </template> <template #default> <div class="message-container"> <div v-show="messageList.length" class="message-title">消息({{ messageList.length }})</div> <el-scrollbar max-height="400px"> <div v-for="message of messageList" :key="message.id" class="message-item"> <div class="icon"> <el-icon size="18"> <svg-icon name="ep:chat-dot-square" /> </el-icon> </div> <div class="message-content"> <div class="message"> {{ message.message }} </div> <div class="time"> {{ message.time }} </div> </div> </div> </el-scrollbar> <div class="message-footer"> 进入消息列表 </div> </div> </template> </el-popover> </span> --> </div> <div v-if="systemType !== 'sm'" class="user-wrapper"> {{ userStore.name }} <!-- <el-icon> <svg-icon name="ep:caret-bottom" /> </el-icon> --> </div> <el-dropdown v-if="systemType === 'sm'" class="user-container" size="default" @command="userCommand"> <div class="user-wrapper"> <!-- <el-avatar size="small"> <el-icon> <svg-icon name="ep:user-filled" /> </el-icon> </el-avatar> --> {{ userStore.name }} <el-icon> <svg-icon name="ep:caret-bottom" /> </el-icon> </div> <template #dropdown> <el-dropdown-menu class="user-dropdown" style="font-size: 20px;"> <!-- <el-dropdown-item v-if="settingsStore.dashboard.enable" command="dashboard"> 控制台 </el-dropdown-item> <el-dropdown-item command="setting"> 个人设置 </el-dropdown-item> <el-dropdown-item v-if="settingsStore.mode === 'pc'" divided command="hotkeys"> 快捷键介绍 </el-dropdown-item> --> <!-- <el-dropdown-item divided command="index"> 回首页 </el-dropdown-item> --> <!-- <el-dropdown-item divided command="resetPassword"> 修改密码 </el-dropdown-item> --> <el-dropdown-item divided command="logout"> 退出登录 </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> <reset-pwd ref="resetPwd" /> </div> </template> <style lang="scss" scoped> .tools { display: flex; align-items: center; padding: 0 20px; white-space: nowrap; .buttons { margin-right: 20px; .item { display: inline-flex; align-items: center; justify-content: center; // height: 24px; // width: 34px; cursor: pointer; vertical-align: middle; height: 34px; width: 44px; .el-icon { color: var(--el-text-color-primary); transition: var(--el-transition-color); font-size: 20px; } } } } .message-container { width: 100%; padding: 0 5px; .message-title { width: 100%; text-align: center; padding-bottom: 10px; font-size: 14px; border-bottom: 1px solid #ddd; } .message-item { display: flex; align-items: center; border-bottom: 1px solid #ddd; padding: 8px 5px; cursor: pointer; &:hover { background-color: #f6f6f6; } .icon { width: 26px; height: 26px; margin-right: 10px; border-radius: 40px; color: #fff; background-color: var(--el-color-primary); padding: 4px; } .message-content { flex: 1; font-size: 14px; .time { margin-top: 3px; font-size: 12px; color: #888; } } } .message-footer { margin-top: 10px; line-height: 2; text-align: center; cursor: pointer; &:hover { color: var(--el-color-primary); } } } :deep(.user-container) { display: inline-block; height: 24px; line-height: 24px; cursor: pointer; .user-wrapper { .el-avatar { vertical-align: middle; margin-top: -2px; margin-right: 4px; } } } </style>