65
新手指导模块
<el-drawer
class="drawer"
:title="$t('新手引导')"
:visible.sync="drawer"
size="465.81px"
:modal="false"
>
<div
style="display:flex;justify-content:center;margin-left:20px;margin-right:10px;margin-top:20px"
class="detaill"
>
<el-tabs v-model="activeName" type="card" class="detail">
<el-tab-pane :label="$t('Step1相机部署')" name="first"
><Step1
/></el-tab-pane>
<el-tab-pane :label="$t('Step2盒子管理')" name="second"
><Step2
/></el-tab-pane>
<el-tab-pane :label="$t('Step3模型组管理')" name="third"
><Step3
/></el-tab-pane>
</el-tabs>
</div>
</el-drawer>
这个放在el-container里面就行,因为position是fixed不会影响别的元素。
然后是某Step
<template>
<div>
<div class="title">
<span class="title-blue"></span>
<p class="title-word" v-html="$t('新增相机部署')"></p>
</div>
<div
class="part"
v-html="
$t('进入相机部署页面')
"
></div>
<br />
<div style="margin-left:5px;display:flex;justify-content:center">
<img class="img" src="../assets/image/step1.png" />
</div>
<br />
</div>
</template>
<style lang="scss" scoped>
.img {
width: 426.19px;
margin-left: -5px;
}
.title {
padding: 1px;
}
.title-blue {
display: inline-block;
width: 4px;
height: 16px;
margin-top: 5px;
background-color: #3488E2;
line-height: 2;
}
.title-word {
margin-top: -20px;
margin-left: 15px;
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: rgba(255, 255, 255, 0.8);
}
.part {
margin-left: 2px;
// margin-right: 10px;
line-height: 1.5;
font-size: 14px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: rgba(255, 255, 255, 0.6);
}
</style>
因为之前有空格,现在删了,所以没有改。加上‘&npsb;’+就有空格了。
然后就是帮助的图标
<span style="margin-left: auto;">
<el-dropdown
@command="handleCommand"
trigger="click"
@visible-change="changeColor"
>
<span :class="blue?'el-dropdown-link':'origin'">
<span class="test">
<img
class="operation-icon"
src="../assets/image/activehelp.png"
/>
{{ $t('帮助') }}
</span>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="document">{{
$t('帮助文档')
}}</el-dropdown-item>
<el-dropdown-item command="guide">{{
$t('新手引导')
}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
这个其实不难但是就是css比较难
一个是那个图片+文字的下拉点击按钮,hover的时候一起变蓝
.operation-icon {
margin-bottom: -5px;
margin-right: 0px;
cursor: pointer;
width: 20px;
filter: grayscale(1);
}
.operation-icon:hover {
margin-bottom: -5px;
margin-right: 0px;
cursor: pointer;
width: 20px;
filter: grayscale(0);
}
.el-dropdown-link:focus {
font-family: PingFangSC-Medium, PingFang SC;
color: #3488e2;
.test img {
filter: grayscale(0);
}
}
.origin {
color: rgba(255, 255, 255, 0.6);
cursor: pointer;
font-family: PingFangSC-Medium, PingFang SC;
.test img {
filter: grayscale(1);
margin-right: 0px;
}
}
.origin:hover {
color: #3488e2;
font-family: PingFangSC-Medium, PingFang SC;
.test img {
filter: grayscale(0);
margin-right: 0px;
}
}
不hover的时候设为灰色,也就是灰度置1,hover置0。blue通过点击事件来控制。
changeColor (value) {
this.blue = value
},
handleCommand (command) {
if (command === 'document') {
this.jumpToHelp()
} else {
this.drawer = true
}
},
还有就是drawer打开的时候不让他影响后面的页面点击,drawer的遮罩层设置为false。
.el-drawer__wrapper {
margin-left: auto;
width: 500px;
}
放个全的
<template>
<el-container class="container">
<el-drawer
class="drawer"
:title="$t('新手引导')"
:visible.sync="drawer"
size="465.81px"
:modal="false"
>
<div
style="display:flex;justify-content:center;margin-left:20px;margin-right:10px;margin-top:20px"
class="detaill"
>
<el-tabs v-model="activeName" type="card" class="detail">
<el-tab-pane :label="$t('Step1相机部署')" name="first"
><Step1
/></el-tab-pane>
<el-tab-pane :label="$t('Step2盒子管理')" name="second"
><Step2
/></el-tab-pane>
<el-tab-pane :label="$t('Step3模型组管理')" name="third"
><Step3
/></el-tab-pane>
</el-tabs>
</div>
</el-drawer>
<!-- <transition name="el-zoom-in-top">
<div class="container-alert" v-if="websocketLinking">
<i
class="el-icon-loading"
style="font-size: 16px; margin-right: 10px;"
></i>
{{ $t('正在连接服务器') }}
</div>
</transition> -->
<el-container class="container-content">
<el-header class="container-content-header">
<img
style="height: 30px;"
:key="$store.state.systemInfo.logo"
:src="$store.state.systemInfo.logo || defaultLogo"
alt="logo"
/>
<span style="margin: 0 10px;">|</span
>{{ $store.state.systemInfo.systemName || $t('系统名称') }}
<span style="margin-left: auto;">
<el-dropdown
@command="handleCommand"
trigger="click"
@visible-change="changeColor"
>
<span :class="blue?'el-dropdown-link':'origin'">
<span class="test">
<img
class="operation-icon"
src="../assets/image/activehelp.png"
/>
{{ $t('帮助') }}
</span>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="document">{{
$t('帮助文档')
}}</el-dropdown-item>
<el-dropdown-item command="guide">{{
$t('新手引导')
}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</span>
</el-header>
<el-container style="overflow: hidden;">
<el-aside class="container-aside" width="150px">
<el-menu class="container-menu">
<el-menu-item index="realtimeWatch">
<router-link
class="menu-sub-item-content"
:to="{ name: 'realtimeWatch' }"
>
<i class="el-icon-video-play"></i>
{{ $t('实时查看') }}
</router-link>
</el-menu-item>
<el-menu-item index="cameraDeploy">
<router-link
class="menu-sub-item-content"
:to="{ name: 'cameraDeploy' }"
>
<i class="el-icon-video-camera"></i>
{{ $t('相机部署') }}
</router-link>
</el-menu-item>
<el-menu-item index="boxManage">
<router-link
class="menu-sub-item-content"
:to="{ name: 'boxManage' }"
>
<i class="el-icon-box"></i>
{{ $t('盒子管理') }}
</router-link>
</el-menu-item>
<el-menu-item index="modelManage">
<router-link
class="menu-sub-item-content"
:to="{ name: 'modelManage' }"
>
<i class="el-icon-document"></i>
{{ $t('模型管理') }}
</router-link>
</el-menu-item>
<el-menu-item index="systemManage">
<router-link
class="menu-sub-item-content"
:to="{ name: 'systemManage' }"
>
<i class="el-icon-setting"></i>
{{ $t('系统设置') }}
</router-link>
</el-menu-item>
<el-menu-item index="systemManage">
<router-link
class="menu-sub-item-content"
:to="{ name: 'sampleProject' }"
>
<i class="el-icon-bell"></i>
{{ $t('事件展示') }}
</router-link>
</el-menu-item>
</el-menu>
<!-- <el-switch
:active-value="LANG.english"
:inactive-value="LANG.chinese"
@change="changeLanguage"
v-model="language"
active-text="English"
inactive-text="中文"
></el-switch> -->
</el-aside>
<el-main class="container-content-main"
><router-view></router-view
></el-main>
</el-container>
</el-container>
</el-container>
</template>
<script>
import Vue from 'vue'
import io from 'socket.io-client'
import { LANG } from '@/constant'
import defaultLogo from '@/assets/logo.png'
import { GetCustomSystemInfo } from '@/api/ports'
import { BASE_URL, BASE_URL_SOCKET } from '@/utils'
import Step1 from '@/components/Step1.vue'
import Step2 from '@/components/Step2.vue'
import Step3 from '@/components/Step3.vue'
export default {
components: {
Step1,
Step2,
Step3
},
data () {
return {
blue: false,
activeName: 'first',
drawer: false,
connection: null,
language: LANG.chinese,
LANG,
defaultLogo,
websocketLinking: false,
alertHideTimeout: null,
retryTimeout: null
}
},
mounted () {
this.stopSocket()
this.startSocket()
this.language = this.$store.state.language
this.$i18n.locale = this.$store.state.language
this.getSystemNameAndLogoInfo()
// FIXME:
// this.startSocket()
// TODO 获取系统信息
// this.getSystemUserInfo()
// this.$API.system.GetCustomSystemInfo().then(res => {
// if (res.result){
// this.$store.commit('setSystemInfo', {
// systemName: res.data.platform_name,
// logo: res.data.platform_icon_path ? GetFile(res.data.platform_icon_path) : ''
// })
// }else {
// this.$message.error(res.message)
// }
// })
},
methods: {
changeColor (value) {
this.blue = value
},
handleCommand (command) {
if (command === 'document') {
this.jumpToHelp()
} else {
this.drawer = true
}
},
getSystemNameAndLogoInfo () {
GetCustomSystemInfo().then(result => {
console.log(result)
if (result) {
this.GetFile(result.logo)
this.$store.commit('setSystemInfo', {
systemName: result.name,
logo: result.logo ? this.GetFile(result.logo) : ''
})
}
})
},
GetFile (path, download = false) {
return `${BASE_URL}${path}`
},
jumpToHelp () {
window.open(`${BASE_URL}/config/help`)
},
async getSystemInfo () {
const systemInfo = await GetCustomSystemInfo()
console.log(systemInfo)
},
changeLanguage () {
this.$store.commit('setLanguage', this.language)
this.$i18n.locale = this.language
},
stopSocket () {
if (Vue.prototype.$WebsocketConnection) {
Vue.prototype.$WebsocketConnection.close()
Vue.prototype.$WebsocketConnection = null
}
},
socketOpenWithToken (token) {
const url = BASE_URL_SOCKET
Vue.prototype.$WebsocketConnection = io(`${url}/server?token=${token}`, {
transports: ['websocket'],
timestampRequests: true
})
Vue.prototype.$WebsocketConnection.on('connect_error', e => {
console.log('socket io connect_error ', url)
this.websocketLinking = true
clearTimeout(this.retryTimeout)
this.retryTimeout = setTimeout(() => {
const token = localStorage.getItem('token')
this.socketOpenWithToken(token)
}, 2000)
})
Vue.prototype.$WebsocketConnection.on('disconnect', e => {
console.log('socket io disconnect ', url)
this.websocketLinking = true
})
Vue.prototype.$WebsocketConnection.on('connect', () => {
console.log('socket io connect ', url)
clearTimeout(this.alertHideTimeout)
this.alertHideTimeout = setTimeout(() => {
this.websocketLinking = false
}, 1500)
})
},
startSocket () {
this.stopSocket()
const token = localStorage.getItem('token')
this.socketOpenWithToken(token)
}
},
destroyed () {
this.stopSocket()
clearTimeout(this.alertHideTimeout)
clearTimeout(this.retryTimeout)
}
}
</script>
<style lang="scss" scoped>
@import '../style/variables';
@import '../style/theme';
.operation-icon {
margin-bottom: -5px;
margin-right: 0px;
cursor: pointer;
width: 20px;
filter: grayscale(1);
}
.operation-icon:hover {
margin-bottom: -5px;
margin-right: 0px;
cursor: pointer;
width: 20px;
filter: grayscale(0);
}
.el-dropdown-menu__item {
color: rgba(255, 255, 255, 0.6);
}
.el-dropdown-menu__item:not(.is-disabled):hover {
background-color: #2f2f2f;
}
.el-drawer__wrapper {
margin-left: auto;
width: 500px;
}
.el-tabs__nav-next {
display: none;
}
.el-tabs__nav-prev {
display: none;
}
.container {
overflow: hidden;
height: 100%;
&-aside {
@include var(background-color, color-bg-dark-2);
text-align: center;
line-height: 200px;
height: 100%;
box-shadow: 2px 0px 0px 0px #000000;
z-index: 1;
}
&-menu {
@include var(background-color, color-bg-dark-1);
border-right: none;
color: rgba(255, 255, 255, 0.6);
}
&-content {
&-header {
@include var(background-color, color-bg-dark-1);
box-shadow: 0px 2px 20px 0px rgba(0, 0, 0, 0.6), 0px 2px 0px 0px black;
z-index: 2;
display: flex;
align-items: center;
}
&-main {
display: flex;
flex-direction: column;
@include var(background-color, color-bg-dark-1);
padding: 0;
overflow: hidden;
}
}
&-alert {
position: fixed;
top: 10px;
left: calc(50% - 200px);
height: 40px;
width: 400px;
line-height: 40px;
padding: 0 20px;
background: rgba($color: #e6a23c, $alpha: 0.7);
z-index: 3;
color: #fff;
font-size: 14px;
border-radius: 4px;
text-align: center;
}
}
.menu-sub-item-content {
width: 100%;
height: 100%;
display: block;
}
.menu-icon {
color: rgba($color: #fff, $alpha: 0.49);
font-size: 24px;
vertical-align: sub;
}
.el-dropdown-link:focus {
font-family: PingFangSC-Medium, PingFang SC;
color: #3488e2;
.test img {
filter: grayscale(0);
}
}
.el-dropdown {
font-family: PingFangSC-Medium, PingFang SC;
display: inline-block;
position: relative;
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
}
.origin {
color: rgba(255, 255, 255, 0.6);
cursor: pointer;
font-family: PingFangSC-Medium, PingFang SC;
.test img {
filter: grayscale(1);
margin-right: 0px;
}
}
.origin:hover {
color: #3488e2;
font-family: PingFangSC-Medium, PingFang SC;
.test img {
filter: grayscale(0);
margin-right: 0px;
}
}
</style>
<style lang="scss">
@import '../style/variables';
.drawer .el-drawer__body {
overflow-y: scroll;
border-top: solid 1px;
color: rgba(255, 255, 255, 0.1);
}
.detail.el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
border-bottom-color: #5f5f5f;
background-color: rgba(255, 255, 255, 0.1);
}
.detail .el-tabs--card > .el-tabs__header .el-tabs__item {
border-left: none;
width: 142px;
height: 36px;
background: rgba(255, 255, 255, 0.1);
border-radius: 1px 0px 0px 1px;
}
.detail .el-tabs__item {
padding: 0 23px;
font-size: 13px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: rgba(255, 255, 255, 0.8);
}
.detail .el-tabs--top.el-tabs--border-card > .el-tabs__header .el-tabs__item {
color: rgba(255, 255, 255, 0.8);
}
.detail .el-tabs--card > .el-tabs__header .el-tabs__nav {
width: 426px;
height: 36px;
border-radius: 1px;
border: 1px solid #5f5f5f;
}
.drawer .el-drawer.rtl {
background-color: #3b3b3b;
}
.drawer .el-drawer__header {
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: rgba(255, 255, 255, 0.8);
line-height: 0px;
margin-top: -2px;
margin-bottom: 17px;
}
.detail.el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
color: rgba(255, 255, 255, 0.8);
}
.drawer .el-drawer__close-btn :hover {
border: none;
cursor: pointer;
font-size: 20px;
color: #3488e2;
background-color: transparent;
}
.detail .el-tabs__nav-scroll {
overflow: hidden;
display: flex;
justify-content: center;
}
.el-menu-item {
text-align: left;
padding: 0;
padding-left: 0;
height: 80px;
margin-left: -20px;
line-height: 80px;
overflow: hidden;
box-shadow: 0px 2px 0px 0px #000000;
&:hover {
background: #000 !important;
}
}
.menu-sub-item-content {
text-decoration: none;
padding-left: 18px;
color: #fff;
&.router-link-exact-active {
box-shadow: inset 8px 0px 0px 0px $--color-primary;
}
}
</style>