第十四章 開(kāi)發(fā)中心

一、界面樣式
image.png

說(shuō)一下這個(gè)界面的設(shè)計(jì)要素:

  1. 兼顧1366×768实束,在1920×1080上效果更好奥秆。
  2. 該界面包含一個(gè)歡迎頁(yè)。
  3. 左側(cè)樹(shù)報(bào)表支持二咸灿、三級(jí)節(jié)點(diǎn)同級(jí)排序构订。不過(guò)還沒(méi)有處理滾動(dòng)樣式。
  4. 右側(cè)還算標(biāo)準(zhǔn)和賞心悅目避矢,就這樣了悼瘾。
二、PC端框架頁(yè)代碼
  1. src/views/layout/pc/index.vue
<template>
  <div class="Dev-Layout">
    <main-content></main-content>
    <nav-bar></nav-bar>
    <head-bar></head-bar>
  </div>
</template>

<script>
import HeadBar from './HeadBar.vue'
import NavBar from './NavBar.vue'
import MainContent from './MainContent.vue'

export default {
  components: {
    HeadBar,
    NavBar,
    MainContent
  }
}
</script>

<style lang="scss" scoped>
.Dev-Layout {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #f4f5f7;
}
</style>

  1. src/views/layout/pc/HeadBar.vue
<template>
  <div class="Dev-Layout-HeadBar">
    <div class="logo" :style="`background-image: url(${logoPng})`"/>
    <div class="menu">
      <div class="active">儀表盤(pán)</div>
      <div>數(shù)據(jù)源</div>
      <div>數(shù)據(jù)集</div>
      <div>項(xiàng)目設(shè)置</div>
    </div>
    <div class="right-menu">
      <div>
        <el-badge :is-dot="true"><i class="el-icon-bell"></i></el-badge>
      </div>
      <div><i class="el-icon-notebook-2"></i></div>
      <div style="font-size: 13px">
        <el-dropdown>
          <span class="el-dropdown-link">
            Hi, sbling <i class="el-icon-arrow-down"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item>個(gè)人信息</el-dropdown-item>
            <el-dropdown-item>修改密碼</el-dropdown-item>
            <el-dropdown-item>關(guān)于</el-dropdown-item>
            <el-dropdown-item divided @click.native="logout">退出系統(tǒng)</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </div>
    </div>
  </div>
</template>

<script>
import logoPng from '@/assets/img/dev/logo.png'
import Cookies from 'js-cookie'

export default {
  data () {
    return {
      logoPng: logoPng
    }
  },
  methods: {
    logout () {
      Cookies.remove('token')
      Cookies.remove('account')
      this.$router.push('/login')
    }
  }
}
</script>

<style lang="scss" scoped>
.Dev-Layout-HeadBar {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 47px;
  background-color: #f1f4f7;
  border-bottom: 1px solid #e4e4e4;

  > .logo {
    width: 86px;
    height: 28px;
    background-repeat: no-repeat;
    background-size: 100% 100%;
    float: left;
    margin-top: 9px;
    margin-left: 25px;
  }

  > .menu {
    float: left;
    margin-left: 109px;

    > div {
      float: left;
      font-size: 14px;
      color: #303133;
      padding: 0 20px;
      height: 46px;
      line-height: 44px;
      transition: all .2s;
      cursor: pointer;

      &:hover {
        background-color: #e1e2e6;
      }

      &.active {
        background-color: #fff;
        border-bottom: 3px solid #409eff;
      }
    }
  }

  > .right-menu {
    height: 46px;
    float: right;
    padding-right: 10px;

    > div {
      float: left;
      margin-right: 20px;
      height: 22px;
      line-height: 20px;
      color: #606266;
      padding: 12px 0;
      cursor: pointer;
      font-size: 14px;
    }
  }
}
</style>

  1. src/views/layout/pc/NavBar.vue
<template>
  <div class="Dev-Layout-NavBar">
    <div class="search">
      <el-input size="small">
        <el-button
          slot="append"
          type="primary"
          icon="el-icon-search"
        />
      </el-input>
    </div>
    <div class="projects" style="overflow: scroll;">
      <el-tree
        draggable
        :indent="5"
        :props="{ children: 'children', label: 'label' }"
        :data="data"
        :render-content="renderContent"
        :allow-drop="allowDrop"
        @node-click="handleNodeClick"
        @node-drop="sort"
      />
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      data: [{
        id: 0,
        label: 'PC端',
        icon: 'el-icon-monitor',
        aboveId: null,
        level: 1,
        children: [{
          id: 11,
          label: '區(qū)域銷(xiāo)售報(bào)告區(qū)域銷(xiāo)售報(bào)告區(qū)域銷(xiāo)售報(bào)告區(qū)域銷(xiāo)售報(bào)告區(qū)域銷(xiāo)售報(bào)告',
          icon: 'el-icon-menu',
          aboveId: 0,
          level: 2,
          children: [{
            label: '區(qū)域銷(xiāo)售報(bào)告',
            icon: 'el-icon-tickets',
            aboveId: 11,
            level: 3
          }, {
            label: '區(qū)域銷(xiāo)售報(bào)告2',
            icon: 'el-icon-tickets',
            aboveId: 11,
            level: 3
          }]
        }]
      }, {
        id: 1,
        label: '移動(dòng)端',
        icon: 'el-icon-mobile',
        aboveId: null,
        level: 1,
        children: [{
          id: 12,
          label: '區(qū)域銷(xiāo)售報(bào)告',
          icon: 'el-icon-menu',
          aboveId: 1,
          level: 2,
          children: [{
            label: '區(qū)域銷(xiāo)售報(bào)告',
            icon: 'el-icon-tickets',
            aboveId: 12,
            level: 3
          }]
        }]
      }, {
        id: 2,
        label: '數(shù)字大屏',
        icon: 'el-icon-data-analysis',
        aboveId: null,
        level: 1,
        children: [{
          id: 13,
          label: '區(qū)域銷(xiāo)售報(bào)告',
          icon: 'el-icon-menu',
          aboveId: 2,
          level: 2,
          children: [{
            label: '區(qū)域銷(xiāo)售報(bào)告',
            icon: 'el-icon-tickets',
            aboveId: 13,
            level: 3
          }]
        }]
      }, {
        id: 3,
        label: '報(bào)告',
        icon: 'el-icon-printer',
        aboveId: null,
        level: 1,
        children: [{
          id: 14,
          label: '區(qū)域銷(xiāo)售報(bào)告',
          icon: 'el-icon-menu',
          aboveId: 3,
          level: 2,
          children: [{
            label: '區(qū)域銷(xiāo)售報(bào)告',
            icon: 'el-icon-tickets',
            aboveId: 14,
            level: 3
          }]
        }]
      }]
    }
  },
  methods: {
    handleNodeClick () {
    },
    // 自定義樹(shù)節(jié)點(diǎn)
    renderContent (h, { node, data, store }) {
      return (
        <div class="tree-node-item">
          <div class="tree-node-name" title={node.label}>
            <i class={data.icon}></i> {node.label}
          </div>
          {data.level !== 3 && (
            <div class="tree-node-plus"><i class="el-icon-plus"></i></div>
          )}
          <div class="tree-node-more"><i class="el-icon-more"></i></div>
        </div>
      )
    },
    // 樹(shù)節(jié)點(diǎn)拖拽事件
    allowDrop (draggingNode, dropNode, type) {
      if (!draggingNode.data.aboveId) {
        return false
      }
      if (draggingNode.data.level === dropNode.data.level) {
        if (draggingNode.data.aboveId === dropNode.data.aboveId) {
          return type === 'prev' || type === 'next'
        }
      } else {
        return false
      }
    },
    // 樹(shù)節(jié)點(diǎn)拖拽后重新排序
    sort (draggingNode, dropNode, type, event) {
      let obj = {
        aboveId: '',
        arr: []
      }
      obj.aboveId = dropNode.data.aboveId
      for (let item of dropNode.parent.childNodes) {
        obj.arr.push(item.data.id)
      }
    }
  }
}
</script>
<style lang="scss">
.Dev-Layout-NavBar {
  position: absolute;
  top: 47px;
  left: 0;
  bottom: 0;
  width: 250px;
  border-right: 1px solid #e4e4e4;
  padding: 12px 10px;
  background-color: #fff;

  > .search {
    .el-input-group__append {
      padding: 0 10px;
    }
  }

  > .projects {
    margin: 0 -10px;
    padding: 10px 0;
    height: calc(100vh - 91px);

    .tree-node-item {
      height: 24px;
      line-height: 24px;
      flex: 1;
      display: flex;
      flex-direction: row;

      .tree-node-name {
        flex: 1;
        font-size: 14px;
        white-space: nowrap;
        text-overflow: ellipsis;
        overflow: hidden;
        word-break: break-all;
        width: 100px;
      }

      .tree-node-plus {
        text-align: center;
        width: 24px;
        color: #898989;
        opacity: 0;
      }

      &:hover {
        .tree-node-plus {
          opacity: 1;
        }
      }

      .tree-node-more {
        text-align: center;
        width: 24px;
        color: #898989;
        opacity: 0;
      }

      &:hover {
        .tree-node-more {
          opacity: 1;
        }
      }
    }
  }
}
</style>

  1. src/views/layout/pc/MainContent.vue
<template>
  <div class="Dev-Layout-MainContent">
    <!-- <el-empty description="Hi审胸,admin亥宿,歡迎使用庫(kù)鉑BI。"></el-empty> -->
    <div class="filter-bar">
      <el-select v-model="value" placeholder="請(qǐng)選擇" size="small">
        <el-option
          v-for="item in options"
          :key="item.value"
          :label="item.label"
          :value="item.value">
        </el-option>
      </el-select>
      <el-select v-model="value" placeholder="請(qǐng)選擇" size="small">
        <el-option
          v-for="item in options"
          :key="item.value"
          :label="item.label"
          :value="item.value">
        </el-option>
      </el-select>
      <el-button type="primary" size="mini" style="height: 32px;float: right;"><span>重置</span></el-button>
    </div>
    <div class="chart-container">
      <div class="chart-item"></div>
      <div class="chart-item"></div>
      <div class="chart-item"></div>
      <div class="chart-item"></div>
      <div class="chart-item"></div>
      <div class="chart-item"></div>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      options: [{
        value: '選項(xiàng)1',
        label: '黃金糕'
      }, {
        value: '選項(xiàng)2',
        label: '雙皮奶'
      }, {
        value: '選項(xiàng)3',
        label: '蚵仔煎'
      }, {
        value: '選項(xiàng)4',
        label: '龍須面'
      }, {
        value: '選項(xiàng)5',
        label: '北京烤鴨'
      }],
      value: ''
    }
  }
}
</script>

<style lang="scss" scoped>
.Dev-Layout-MainContent {
  position: absolute;
  top: 47px;
  left: 250px;
  right: 0px;
  bottom: 0px;
  background-color: #f2f2f2;

  > .filter-bar {
    background-color: #fff;
    border-bottom: 1px solid #dfe4ed;
    height: 52px;
    padding: 10px;
  }

  > .chart-container {
    height: calc(100vh - 99px);
    padding: 2px;

    > .chart-item {
      width: 300px;
      height: 200px;
      margin: 2px;
      background-color: #fff;
      border: 1px solid #ebebeb;
      float: left;
      border-radius: 4px;
    }
  }
}
</style>

  1. router
{
  path: '/dev',
  name: '桌面端',
  component: () => import('@/views/layout/dev')
},
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歹嘹,一起剝皮案震驚了整個(gè)濱河市箩绍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尺上,老刑警劉巖材蛛,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怎抛,居然都是意外死亡卑吭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)马绝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)豆赏,“玉大人,你說(shuō)我怎么就攤上這事富稻≈腊睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵椭赋,是天一觀的道長(zhǎng)抚岗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哪怔,這世上最難降的妖魔是什么宣蔚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮认境,結(jié)果婚禮上胚委,老公的妹妹穿的比我還像新娘。我一直安慰自己叉信,他們只是感情好亩冬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著硼身,像睡著了一般鉴未。 火紅的嫁衣襯著肌膚如雪枢冤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天铜秆,我揣著相機(jī)與錄音,去河邊找鬼讶迁。 笑死连茧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巍糯。 我是一名探鬼主播啸驯,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祟峦!你這毒婦竟也來(lái)了罚斗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宅楞,失蹤者是張志新(化名)和其女友劉穎针姿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厌衙,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡距淫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婶希。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榕暇。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖喻杈,靈堂內(nèi)的尸體忽然破棺而出彤枢,到底是詐尸還是另有隱情,我是刑警寧澤筒饰,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布缴啡,位于F島的核電站,受9級(jí)特大地震影響龄砰,放射性物質(zhì)發(fā)生泄漏盟猖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一换棚、第九天 我趴在偏房一處隱蔽的房頂上張望式镐。 院中可真熱鬧,春花似錦固蚤、人聲如沸娘汞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)你弦。三九已至惊豺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禽作,已是汗流浹背尸昧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旷偿,地道東北人烹俗。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像萍程,于是被迫代替她去往敵國(guó)和親幢妄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容