2021-6-25

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>

上一篇:背景图滚动translateY代替background-position更优


下一篇:vue 使用腾讯IM即时通信