This commit is contained in:
2025-11-07 11:19:38 +08:00
8 changed files with 348 additions and 38 deletions

View File

@ -256,7 +256,7 @@
clearInterval(interval); clearInterval(interval);
} }
updateProgress(progress); updateProgress(progress);
}, 100); // 保持100毫秒的间隔 }, 125); // 保持100毫秒的间隔
}, 100); // 初始延迟500毫秒 }, 100); // 初始延迟500毫秒
</script> </script>
</body> </body>

View File

@ -277,6 +277,9 @@ function createWindow(): void {
mainWindow.webContents.send('fullscreen-status-changed', false) mainWindow.webContents.send('fullscreen-status-changed', false)
}); });
mainWindow.on("close", (e) => { mainWindow.on("close", (e) => {
if (isRestart) {
return
}
e.preventDefault(); e.preventDefault();
dialog dialog
.showMessageBox(mainWindow, { .showMessageBox(mainWindow, {
@ -539,6 +542,10 @@ function closeAllWindows() {
}); });
} }
function getmainWindow() {
return mainWindow;
}
const gotTheLock = app.requestSingleInstanceLock(); const gotTheLock = app.requestSingleInstanceLock();
if (!gotTheLock) { if (!gotTheLock) {
@ -604,5 +611,7 @@ if (!gotTheLock) {
}; };
} }
export { getmainWindow };
// In this file you can include the rest of your app's specific main process // In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here. // code. You can also put them in separate files and require them here.

View File

@ -255,7 +255,7 @@
clearInterval(interval); clearInterval(interval);
} }
updateProgress(progress); updateProgress(progress);
}, 100); // 保持100毫秒的间隔 }, 150); // 保持100毫秒的间隔
}, 100); // 初始延迟500毫秒 }, 100); // 初始延迟500毫秒
</script> </script>
</body> </body>

View File

@ -364,6 +364,7 @@ img {
.login-select-popper { .login-select-popper {
border: 1px solid var(--el-border-color-light) !important; border: 1px solid var(--el-border-color-light) !important;
box-shadow: var(--el-box-shadow-light) !important; box-shadow: var(--el-box-shadow-light) !important;
z-index: 9999 !important;
.el-select-dropdown { .el-select-dropdown {
background: #fff !important; background: #fff !important;

View File

@ -37,7 +37,7 @@ const router = createRouter({
}) })
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
// 去登录,放行 // 去登录,放行
if (to.path === '/') { if (to.path === '/' || to.path === '/login') {
next() next()
} else { } else {
if (localStorage.getItem('Authorization')) { if (localStorage.getItem('Authorization')) {

View File

@ -39,7 +39,7 @@ import {TsApi} from "../../../api/ts";
const times = ref(0) const times = ref(0)
const numbers = ref(0) const numbers = ref(0)
const detail = ref({}) const detail:any = ref({})
const eventBus: any = inject('bus') const eventBus: any = inject('bus')
let eventObj:any = ref(null) let eventObj:any = ref(null)

View File

@ -1,12 +1,9 @@
<template> <template>
<video <div class="rightBox" v-if="isDesktop">
key="second-video" <el-button size="small" :icon="Setting" @click="serviceDialog = true"> </el-button>
autoplay </div>
loop <video key="second-video" autoplay loop muted src="../../assets/video/author_video.mp4"
muted style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover;z-index: -1;"></video>
src="../../assets/video/author_video.mp4"
style="position: fixed; width: 100vw; height: 100vh; left: 0; top: 0; object-fit: cover"
></video>
<Dialog ref="baseDialog" class="graffiti" title="系统授权" :closeCallback="closeCallBack"> <Dialog ref="baseDialog" class="graffiti" title="系统授权" :closeCallback="closeCallBack">
<template #content> <template #content>
<div class="auth_info custom_scroll_bar content_h"> <div class="auth_info custom_scroll_bar content_h">
@ -15,12 +12,7 @@
<span class="fankuai"></span> <span class="fankuai"></span>
{{ t('auths.authCode') }} {{ t('auths.authCode') }}
</div> </div>
<div <div class="auth_info_text" @click="copy(authInfo.license_code)" style="cursor: pointer" title="点击可复制">
class="auth_info_text"
@click="copy(authInfo.license_code)"
style="cursor: pointer"
title="点击可复制"
>
{{ authInfo.license_code || '' }} {{ authInfo.license_code || '' }}
<svg-icon name="copy" :size="20" style="margin-left: 30px"></svg-icon> <svg-icon name="copy" :size="20" style="margin-left: 30px"></svg-icon>
</div> </div>
@ -43,12 +35,8 @@
<span class="fankuai"></span> <span class="fankuai"></span>
{{ t('auths.authType') }} {{ t('auths.authType') }}
</div> </div>
<div <div v-if="authInfo.status != null" class="auth_info_text" style="font-size: 16px"
v-if="authInfo.status != null" :style="{ color: authInfo.status ? 'rgba(27, 248, 195, 1)' : 'rgba(255, 161, 69, 1)' }">
class="auth_info_text"
style="font-size: 16px"
:style="{ color: authInfo.status ? 'rgba(27, 248, 195, 1)' : 'rgba(255, 161, 69, 1)' }"
>
{{ authInfo.status ? t('auths.authTempExpire') : t('auths.authexpire') }} {{ authInfo.status ? t('auths.authTempExpire') : t('auths.authexpire') }}
</div> </div>
<!-- <div v-else class="auth_info_text">{{ authInfo.message || '无' }}</div> --> <!-- <div v-else class="auth_info_text">{{ authInfo.message || '无' }}</div> -->
@ -64,14 +52,71 @@
<button @click="close">退出系统</button> <button @click="close">退出系统</button>
</template> </template>
</Dialog> </Dialog>
<div class="service" v-if="serviceDialog">
<div class="contentBox">
<div class="titleBox">
<span class="title"></span>
<span class="closeBox">
<span @click="cancel"></span>
</span>
</div>
<h1 class="hello">Hello!</h1>
<h2 class="greet"><span>欢迎您使用</span>实景三维电子沙盘系统</h2>
<div class="serviceContent">
<el-tabs v-model="selectedService" class="demo-tabs">
<el-tab-pane label="接口服务" name="接口服务"></el-tab-pane>
</el-tabs>
<div class="tabPanel">
<div class="item">
<span class="itemLabel">服务选择</span>
<el-select class="select" popper-class="login-select-popper" v-model="servVal">
<el-option size="mini" v-for="item in servOptions" :key="item.value" :label="item.name"
:value="item.name">
</el-option>
</el-select>
</div>
<div class="item prototype" v-if="servVal == '网络'">
<span class="itemLabel">协议</span><el-input v-model="prototype"></el-input>
</div>
<div class="item ip">
<template v-if="servVal == '单机'">
<span class="itemLabel">IP</span>
<el-input v-model="localip" disabled></el-input>
</template>
<template v-if="servVal == '网络'">
<span class="itemLabel">IP</span>
<el-input v-model="ip"></el-input>
</template>
</div>
<div class="item port">
<template v-if="servVal == '单机'">
<span class="itemLabel">端口</span>
<el-input v-model="localport"></el-input>
</template>
<template v-if="servVal == '网络'">
<span class="itemLabel">端口</span>
<el-input v-model="port"></el-input>
</template>
</div>
</div>
</div>
<div class="btn">
<el-button style="margin: 5px 0" size="mini" @click="submit">确定</el-button>
<el-button size="mini" @click="cancel">关闭</el-button>
</div>
</div>
</div>
</template> </template>
<script setup> <script setup>
import { User, Unlock, Setting, SwitchButton } from '@element-plus/icons-vue'
import Dialog from '@/components/dialog/baseDialog.vue' import Dialog from '@/components/dialog/baseDialog.vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { ref, reactive, toRefs, onBeforeMount, onMounted, watchEffect, computed } from 'vue' import { ref, reactive, toRefs, onBeforeMount, onMounted, watchEffect, computed } from 'vue'
import { AuthApi } from '@/api/setting/auth' import { AuthApi } from '@/api/setting/auth'
import { useLogin } from '../login/useLogin'
import { useSetUp } from '../login/useSetUp'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import uploadFiles from '@/components/upload/uploadFiles.vue' import uploadFiles from '@/components/upload/uploadFiles.vue'
import useClipboard from 'vue-clipboard3' import useClipboard from 'vue-clipboard3'
@ -82,12 +127,47 @@ import {
$changeComponentShow $changeComponentShow
} from '@/utils/communication' } from '@/utils/communication'
const {
loginFormRef,
loginForm,
loginRules,
loading,
checkboxVModel,
showContent,
isFirstVideoPlayed,
onFirstVideoEnded,
rememberpwd,
handleLogin,
firstVideoRef,
goExit,
loginInit,
isDesktop
} = useLogin()
const {
serviceDialog,
servVal,
prototype,
ip,
port,
localip,
localport,
gpsVal,
gpsOptions,
servOptions,
serviceOptions,
submit,
cancel,
initialize
} = useSetUp()
const { ipcRenderer } = require('electron') const { ipcRenderer } = require('electron')
const router = useRouter() const router = useRouter()
const getAuthInfo = async () => { const getAuthInfo = async () => {
try { try {
const res = await AuthApi.showAuth() const res = await AuthApi.showAuth()
if (typeof res.data === 'object') { if (typeof res.data === 'object') {
authInfo.value.generateTime = res.data.generateTime
authInfo.value.expireTime = res.data.expireTime
getStatus2()
getStatus(res.data.expireTime) getStatus(res.data.expireTime)
} }
} catch (error) { } catch (error) {
@ -111,6 +191,7 @@ const getAuthInfo = async () => {
}) })
} }
} }
const selectedService = ref('接口服务')
let showPop = ref(false) let showPop = ref(false)
const baseDialog = ref(null) const baseDialog = ref(null)
const getStatus = (date) => { const getStatus = (date) => {
@ -139,7 +220,9 @@ const getStatus = (date) => {
}) })
} }
} }
setTimeout(() => {
getAuthInfo() getAuthInfo()
}, 5000);
//授权页面 //授权页面
@ -213,8 +296,9 @@ const getAuthCode = async () => {
const res = await AuthApi.authInfo() const res = await AuthApi.authInfo()
authInfo.value.license_code = res.data authInfo.value.license_code = res.data
} }
getAuthInfo2() setTimeout(() => {
getAuthCode() getAuthCode()
}, 5000);
//复制 //复制
const copy = async (text) => { const copy = async (text) => {
@ -227,8 +311,17 @@ const copy = async (text) => {
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
:root { .rightBox {
--color-sdk-text-shadow: rgba(20, 118, 255, 1); position: absolute;
right: 10px;
top: 0px;
z-index: 99999;
.el-button {
background: linear-gradient(to bottom, transparent, rgb(25, 129, 132));
border: none !important;
color: #fff;
}
} }
.auth_info { .auth_info {
@ -262,6 +355,7 @@ const copy = async (text) => {
border-radius: 4px; border-radius: 4px;
} }
} }
.fankuai { .fankuai {
width: 10px; width: 10px;
height: 10px; height: 10px;
@ -272,6 +366,7 @@ const copy = async (text) => {
margin-right: 5px; margin-right: 5px;
margin-left: 5px; margin-left: 5px;
} }
.YJ-custom-base-dialog { .YJ-custom-base-dialog {
position: absolute; position: absolute;
color: #ffffff; color: #ffffff;
@ -279,8 +374,7 @@ const copy = async (text) => {
z-index: 99; z-index: 99;
background: linear-gradient(0deg, #00ffff33 0%, #00ffff00 100%), rgba(0, 0, 0, 0.6); background: linear-gradient(0deg, #00ffff33 0%, #00ffff00 100%), rgba(0, 0, 0, 0.6);
border: 1.5px solid; border: 1.5px solid;
border-image: linear-gradient(to bottom, rgba(var(--color-base1), 1) 6.25%, rgb(0, 200, 255) 100%) border-image: linear-gradient(to bottom, rgba(var(--color-base1), 1) 6.25%, rgb(0, 200, 255) 100%) 1;
1;
text-align: left; text-align: left;
font-family: 'sy-boldface'; font-family: 'sy-boldface';
} }
@ -325,6 +419,7 @@ const copy = async (text) => {
padding: 5px 16px 5px 16px !important; padding: 5px 16px 5px 16px !important;
position: relative; position: relative;
} }
::v-deep .title-box>.close-box { ::v-deep .title-box>.close-box {
display: none; display: none;
} }
@ -363,6 +458,7 @@ const copy = async (text) => {
padding: 5px 20px; padding: 5px 20px;
cursor: pointer; cursor: pointer;
} }
::v-deep .foot>button:hover { ::v-deep .foot>button:hover {
border: 1px solid rgba(var(--color-base1), 1); border: 1px solid rgba(var(--color-base1), 1);
color: rgba(var(--color-base1), 1); color: rgba(var(--color-base1), 1);
@ -371,6 +467,7 @@ const copy = async (text) => {
::v-deep .foot>.show>.label { ::v-deep .foot>.show>.label {
margin: 0px 10px; margin: 0px 10px;
} }
::v-deep .el-message-box { ::v-deep .el-message-box {
--el-messagebox-title-color: #fff !important; --el-messagebox-title-color: #fff !important;
--el-messagebox-content-color: #fff !important; --el-messagebox-content-color: #fff !important;
@ -378,6 +475,206 @@ const copy = async (text) => {
linear-gradient(180deg, rgba(var(--color-base1), 0) 0%, rgba(var(--color-base1), 0.2) 100%), linear-gradient(180deg, rgba(var(--color-base1), 0) 0%, rgba(var(--color-base1), 0.2) 100%),
rgba(0, 0, 0, 0.6) !important; rgba(0, 0, 0, 0.6) !important;
} }
#app {
.service {
z-index: 9999;
width: 100vw;
height: 100vh;
position: absolute;
.contentBox {
padding: 0 40px 40px 40px;
background-color: #ffffff;
backdrop-filter: blur(2px);
width: 450px;
position: absolute;
color: rgba(51, 51, 51, 1);
left: 50%;
top: 29%;
transform: translate(-50%, 0%);
display: flex;
flex-direction: column;
justify-content: space-between;
.hello {
color: rgba(0, 66, 66, 1);
font-family: 'ddin';
font-size: 30px;
font-weight: 700;
line-height: 30px;
margin-bottom: 16px;
}
.greet {
color: rgba(0, 66, 66, 1);
font-family: 'SourceHanSans';
font-size: 18px;
line-height: 18px;
font-weight: 500;
span {
color: rgba(153, 153, 153, 1);
font-weight: 500;
margin-right: 5px;
}
}
.titleBox {
height: 40px;
.title {
line-height: 50px;
padding-left: 15px;
font-size: 1rem;
text-shadow: 0px 0px 9px rgba(20, 118, 255, 1);
}
.closeBox {
right: 0;
position: absolute;
display: inline-block;
width: 30px;
height: 30px;
border-radius: 0 0 0 90%;
background: rgba(var(--color-base1), 1);
&>span {
font-size: 1rem;
position: absolute;
right: 0px;
cursor: pointer;
color: rgba(0, 66, 66, 1);
font-weight: 700;
width: 25px;
height: 25px;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.serviceContent {
margin-top: 30px;
flex: auto;
::v-deep .el-tabs {
.el-tabs__header {
margin-bottom: 5px;
.el-tabs__nav-wrap {
.el-tabs__nav-scroll {
.el-tabs__nav {
.el-tabs__active-bar {
background: rgba(0, 66, 66, 1);
height: 3px;
}
.el-tabs__item {
color: rgba(153, 153, 153, 1);
font-size: 16px;
font-weight: 500;
}
.el-tabs__item:focus-visible {
box-shadow: none;
}
.el-tabs__item.is-active {
font-size: 18px;
color: rgba(0, 66, 66, 1);
}
}
}
}
.el-tabs__nav-wrap::after {
height: 1px;
}
}
}
.tab {
border-radius: 5px;
//width: 50%;
width: 300px;
margin: 0 auto;
overflow: hidden;
background: rgba(var(--color-base1), 0.2);
display: flex;
.tab-item {
display: inline-block;
flex: 1;
height: 32px;
line-height: 32px;
text-align: center;
cursor: pointer;
}
.activeService {
border: 1px solid rgba(var(--color-base1), 1);
border-radius: 5px;
}
}
.itemLabel {
width: 64px;
flex: 0 0 64px;
white-space: nowrap;
text-align: right;
display: inline-block;
margin-right: 10px;
}
.tabPanel {
margin: 0;
.item {
display: flex;
align-items: center;
margin: 15px 0;
.select {}
}
}
}
}
.btn {
text-align: center;
button {
width: 166px;
height: 40px;
border-radius: 0;
::v-deep span {
font-weight: 500;
}
&:hover {
border: 1px solid rgba(var(--color-base1), 1) !important;
}
}
button:nth-child(1) {
background: rgba(0, 255, 255, 1) !important;
border-color: #ff000000 !important;
color: rgba(0, 66, 66, 1) !important;
}
button:nth-child(2) {
background: rgba(255, 255, 255, 1) !important;
border-color: rgba(204, 204, 204, 0.4) !important;
color: rgba(102, 102, 102, 1) !important;
}
}
}
}
::v-deep .el-popper {
z-index: 9999 !important;
}
</style> </style>
<style lang="scss"> <style lang="scss">
.el-message-box { .el-message-box {
@ -386,6 +683,7 @@ const copy = async (text) => {
background: background:
linear-gradient(180deg, rgba(var(--color-base1), 0) 0%, rgba(var(--color-base1), 0.2) 100%), linear-gradient(180deg, rgba(var(--color-base1), 0) 0%, rgba(var(--color-base1), 0.2) 100%),
rgba(0, 0, 0, 0.6) !important; rgba(0, 0, 0, 0.6) !important;
.el-message-box__btns { .el-message-box__btns {
.el-button { .el-button {
--el-button-text-color: #fff; --el-button-text-color: #fff;
@ -395,10 +693,12 @@ const copy = async (text) => {
--el-button-hover-border-color: rgba(var(--color-base1), 1) !important; --el-button-hover-border-color: rgba(var(--color-base1), 1) !important;
--el-button-hover-text-color: rgba(var(--color-base1), 1) !important; --el-button-hover-text-color: rgba(var(--color-base1), 1) !important;
} }
.el-button--primary { .el-button--primary {
--el-button-bg-color: rgba(var(--color-base1), 0.2) !important; --el-button-bg-color: rgba(var(--color-base1), 0.2) !important;
--el-button-hover-bg-color: rgba(var(--color-base1), 0.2) !important; --el-button-hover-bg-color: rgba(var(--color-base1), 0.2) !important;
} }
.el-button:focus-visible { .el-button:focus-visible {
outline: none !important; outline: none !important;
} }

View File

@ -48,7 +48,7 @@ const logout = async (e) => {
window.earth = null window.earth = null
} }
if (res.code === 200) { if (res.code === 200) {
router.push({ path: '/' }) router.push({ path: '/login' })
// localStorage.clear() // localStorage.clear()
} }
} }