基於vue、vuex、vue-router、echarts搭建的數據展現平臺

真的很久沒有更新博客了,可是我最近並無偷懶哦,一直在學習vue這個框架,而且用它作了一個小項目,如今就給你們分享一下個人這個還比較有意思的小項目咯,本項目是基於vue2.0開發的。html

靈感來源

這是一個數據可視化相關的項目,做爲一個學生班主任,須要對班上同窗的各方面的狀況都有所瞭解,因而我便作了一個問卷調查來了解學生各方面的狀況。而後我又想到能夠分析咱們班的羣聊記錄呀,根據羣聊記錄能夠獲得班上同窗之間的親密度和班級羣聊活躍度等信息。天然而然,我就想着能夠搭建一個平臺來展現這些數據,既然是數據固然是以圖表的方式來展現更加直觀,而後折中選擇了echarts這個圖標庫。至於爲何要選擇用vue這個插件,以前只是以爲學了vue能夠練練手,作完以後發現vue真的很輕量也很好上手,結合vuex和vue-router基本能完成我項目中的全部需求。vue

在線展現:http://119.29.57.165:8080/family
源碼:https://github.com/hieeyh/tong2-family
本教程是基於你已經有必定vue基礎之上的,若是你還不瞭解什麼是vue建議先去學習一下node

項目初始構建

首先全局安裝vue-cli,vue-cli是vue本身的項目構建工具,幾個簡單的步驟就能夠幫助你快速構建一個vue項目。webpack

npm install -g vue-cli

而後,利用vue-cli構建一個vue項目git

# 建立一個基於 "webpack" 模板的新項目
$ vue init webpack family
# 安裝依賴
$ cd family
$ npm install

項目文件解釋

  • build中是webpack基本配置文件,開發環境配置文件,生產環節配置文件github

  • node_modules是各類依賴模塊web

  • src中是vue組件及入口文件vue-router

  • static中放置靜態文件vuex

  • index.html是頁面入口文件vue-cli

基本頁面實現

項目建立好以後,就開始實現本身想要的頁面了,修改src文件夾下的App.vue文件,以下:

<template>
<div id="#app">
<!-- 導航欄 -->
  <my-head></my-head>
  <my-nav></my-nav>
  <transition>
    <router-view></router-view>
  </transition>
  <my-foot></my-foot>
</div>
</template>

<script>
import myHead from './components/header'
import myNav from './components/nav'
import myFoot from './components/foot'

export default {
  name: 'app',
  components: {
    myHead,
    myNav,
    myFoot
  }
}
</script>

myHead組件是頁面頭部,myNav組件是頁面左側導航欄,myFoot是頁面底部,router-view組件是vue-router中渲染路徑匹配到的視圖組件。每一個組件的具體實現能夠去github項目地址去看源碼。

建立配置路由

顯然,我要作的是一個單頁面應用,要用到vue-router,先安裝vue-router,輸入以下命令:

npm install --save vue-router

而後,在src文件夾下面的main.js文件中添加路由相關的代碼,以下:

import Vue from 'vue'
import App from './App'
import VueRouter from 'vue-router'

Vue.use(VueRouter) 
// 定義路由組件
const Worldcloud = require('./components/cloud.vue')
const Building = require('./components/building.vue')
const Canteen = require('./components/canteen.vue')
const Selfstudy = require('./components/selfstudy.vue')
const Difficult = require('./components/difficult.vue')
const Interest = require('./components/interest.vue')
const Bedroom = require('./components/bedroom.vue')
const Graduate = require('./components/graduate.vue')
const Getup = require('./components/getup.vue')
const Gotobed = require('./components/gotobed.vue')
const Eat = require('./components/eat.vue')
const Amuse = require('./components/amuse.vue')
const Single = require('./components/single.vue')
const Chat = require('./components/chat.vue')
const Onlyme = require('./components/onlyme.vue')

// 定義路由,配置路由映射
const routes = [
  { path: '/', redirect: '/wordcloud' },
  { path: '/wordcloud', component: Worldcloud },
  { path: '/building', component: Building },
  { path: '/canteen', component: Canteen },
  { path: '/selfstudy', component: Selfstudy },
  { path: '/difficult', component: Difficult },
  { path: '/interest', component: Interest },
  { path: '/bedroom', component: Bedroom },
  { path: '/graduate', component: Graduate },
  { path: '/getup', component: Getup },
  { path: '/gotobed', component: Gotobed },
  { path: '/eat', component: Eat },
  { path: '/amuse', component: Amuse },
  { path: '/single', component: Single },
  { path: '/chat', component: Chat },
  { path: '/onlyme', component: Onlyme }
]

new Vue({
  el: '#app',
  template: '<App/>',
  components: { App },
  router
})

從路由映射的配置中能夠看出,訪問網站的根路由會直接跳轉到/wordcloud。路由映射的組件中用到了百度的echarts庫,這是一個很好用的圖表庫。

怎麼畫圖

怎麼用echarts畫圖呢?其實官網上有不少實例,下面以bedroom.vue組件爲例來簡單說明,bedroom.vue代碼以下:

<template>
  <div class="main_content">
    <div id="bedroom"></div>
  </div>
</template>
<script>
  import echarts from 'echarts'
  export default {
    data() {
      return {
        chart: null,
        opinion: ['學習氛圍差', '學習氛圍通常', '學習氛圍很好'],
        opinionData: [
          {value:26, name:'學習氛圍差'},
          {value:31, name:'學習氛圍通常'},
          {value:8, name:'學習氛圍很好'}
        ]
      }
    },
    methods: {
      drawPie (id) {
        this.chart = echarts.init(document.getElementById(id))
        this.chart.setOption({
          title: {
            text: '寢室學習氛圍狀況調查',
            left: 'center',
            top: 10,
            textStyle: {
              fontSize: 24,
              fontFamily: 'Helvetica',
              fontWeight: 400
            }
          },
          tooltip: {
            trigger: 'item',
            formatte: "{b}: {c} ({d}%)"
          },
          toolbox: {
            feature: {
              saveAsImage: {},
              dataView: {}
            },
            right: 15,
            top: 10
          },
          legend: {
              orient: 'vertical',
              left: 5,
              top: 10,
              data: this.opinion,
          },
          series: [
            {
              name: '寢室學習氛圍',
              type: 'pie',
              radius: ['50%', '70%'],
              center: ['50%', '60%'],
              avoidLabelOverlap: false,
              label: {
                emphasis: {
                  show: true,
                  textStyle: {
                    fontSize: '24',
                    fontWeight: 'bold'
                  }
                }
              },
              labelLine: {
                normal: {
                  show: false
                }
              },
              data: this.opinionData,
              itemStyle: {
                emphasis: {
                  shadowBlur: 10,
                  shadowOffset: 0,
                  shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
              }
            }
          ]
        })
      }
    },
    mounted() {
      this.$nextTick(function() {
        this.drawPie('bedroom')
      })
    }
  }
</script>
<style scoped>
#bedroom {
  position: relative;
  left: 50%;
  margin-left: -400px;
  margin-bottom: 70px;
  width: 800px;
  height: 600px;
  border: solid #D01257 1px;
  box-shadow: 0 0 8px #FB90B7;
  border-radius: 10px;
}   
</style>

這是一個vue的單文件組件,script中,首先導入echarts庫,前提是已經安裝了echarts庫,輸入如下命令安裝:

npm install --save echarts

data對象中是畫圖要用到的一些數據,drawpie方法用來畫圖,接收一個DOM對象,而後在mounted構子函數中調用drawpie便可。

兩點說明

  1. drawpie方法接收的DOM對象須要有肯定的寬高,不然圖像不顯示

  2. mounted中要包含vm.$nextTick才能保證該實例已經插入文檔

實現登陸功能

登陸功能基於vuex(vue狀態管理)和瀏覽器的sessionStorage實現的。首先在src文件夾下新建store文件夾,存放vuex的store(倉庫),新建三個文件store.js、login.js、user.js。login.js中存儲登陸狀態,user.js中存儲用戶登陸信息,store.js加載login和user模塊。

注意:在store.js中要引入babel-polyfill(先安裝),不然會報錯,報錯緣由是Babel默認只轉換新的JavaScript句法,而不轉換新的API,好比Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局對象,以及一些定義在全局對象上的方法都不會轉碼。因此必須使用babel-polyfill,爲當前環境提供一個墊片。

而後修改main.js文件,引入store:

import store from './store/store'
...
...
new Vue({
  el: '#app',
  template: '<App/>',
  components: { App },
  router,
  store
})

修改App.vue文件,以下:

<template>
<div id="#app">
<!-- 導航欄 -->
  <my-head></my-head>
  <my-nav></my-nav>
  <transition>
    <router-view></router-view>
  </transition>
  <my-mask v-if="canlogin"></my-mask>
  <my-login v-if="canlogin"></my-login>
  <my-foot></my-foot>
</div>
</template>
<script>
...
import myMask from './components/mask'
import myLogin from './components/login'

export default {
  ...
  data() {
    return {
      canlogin: false
    }
  },
  computed: {
    canlogin() {
      return this.$store.state.login.islogin
    }
  }
}
</script>

到此,就基本上大功告成了,在命令行中輸入 npm run dev預覽一下。

項目發佈

項目能夠在本地預覽了,可是要怎麼發佈到網上呢?首先,在命令行中輸入

npm run build

會生成一個dist文件夾,該文件夾中就是咱們能夠用來發布的代碼,直接將代碼上傳到你的服務器上就能夠啦。

相關文章
相關標籤/搜索