第十四章 开发中心

一、界面样式
image.png

说一下这个界面的设计要素:

  1. 兼顾1366×768,在1920×1080上效果更好。
  2. 该界面包含一个欢迎页。
  3. 左侧树报表支持二、三级节点同级排序。不过还没有处理滚动样式。
  4. 右侧还算标准和赏心悦目,就这样了。
二、PC端框架页代码
  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">仪表盘</div>
      <div>数据源</div>
      <div>数据集</div>
      <div>项目设置</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>个人信息</el-dropdown-item>
            <el-dropdown-item>修改密码</el-dropdown-item>
            <el-dropdown-item>关于</el-dropdown-item>
            <el-dropdown-item divided @click.native="logout">退出系统</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: '区域销售报告区域销售报告区域销售报告区域销售报告区域销售报告',
          icon: 'el-icon-menu',
          aboveId: 0,
          level: 2,
          children: [{
            label: '区域销售报告',
            icon: 'el-icon-tickets',
            aboveId: 11,
            level: 3
          }, {
            label: '区域销售报告2',
            icon: 'el-icon-tickets',
            aboveId: 11,
            level: 3
          }]
        }]
      }, {
        id: 1,
        label: '移动端',
        icon: 'el-icon-mobile',
        aboveId: null,
        level: 1,
        children: [{
          id: 12,
          label: '区域销售报告',
          icon: 'el-icon-menu',
          aboveId: 1,
          level: 2,
          children: [{
            label: '区域销售报告',
            icon: 'el-icon-tickets',
            aboveId: 12,
            level: 3
          }]
        }]
      }, {
        id: 2,
        label: '数字大屏',
        icon: 'el-icon-data-analysis',
        aboveId: null,
        level: 1,
        children: [{
          id: 13,
          label: '区域销售报告',
          icon: 'el-icon-menu',
          aboveId: 2,
          level: 2,
          children: [{
            label: '区域销售报告',
            icon: 'el-icon-tickets',
            aboveId: 13,
            level: 3
          }]
        }]
      }, {
        id: 3,
        label: '报告',
        icon: 'el-icon-printer',
        aboveId: null,
        level: 1,
        children: [{
          id: 14,
          label: '区域销售报告',
          icon: 'el-icon-menu',
          aboveId: 3,
          level: 2,
          children: [{
            label: '区域销售报告',
            icon: 'el-icon-tickets',
            aboveId: 14,
            level: 3
          }]
        }]
      }]
    }
  },
  methods: {
    handleNodeClick () {
    },
    // 自定义树节点
    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>
      )
    },
    // 树节点拖拽事件
    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
      }
    },
    // 树节点拖拽后重新排序
    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,欢迎使用库铂BI。"></el-empty> -->
    <div class="filter-bar">
      <el-select v-model="value" placeholder="请选择" 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="请选择" 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: '选项1',
        label: '黄金糕'
      }, {
        value: '选项2',
        label: '双皮奶'
      }, {
        value: '选项3',
        label: '蚵仔煎'
      }, {
        value: '选项4',
        label: '龙须面'
      }, {
        value: '选项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')
},
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容