上篇對該項目作了個總述 :Vue + Element-ui實現後臺管理系統(1) --- 總述javascript
這篇主要講解 項目搭建 + 後臺⾸⻚佈局實現 :php
總體效果
css
後臺首頁按佈局一共包含3個部分: 一、左側欄部分 二、頭部部分 三、內容部分。html
說明
在整個後臺管理系統中,左側欄和頭部部分是應該一直在頁面中展現的,因此對於每一個頁面這兩個組件都應該存在,而 內容部分 纔是經過router的跳轉而跳到不一樣的組件。vue
下面先把整個項目搭建一下,而後再來說解上面三個部分java
#一、安裝node (node -v查詢版本號) node 安裝 #二、安裝淘寶鏡像 npm install -g cnpm --registry=https://registry.npm.taobao.org #三、安裝 webpack,以全局的方式安裝 npm install webpack -g #四、全局安裝vue以及腳手架vue-cli npm install @vue/cli -g --unsafe-perm #五、建立vue項目 mall-manage-system是你起的項目名稱 vue create mall-manage-system #六、運行當前項目 這個整個項目就搭建好了 npm run serve
在安裝中可能會存在的問題node
一、node升級後,項目中的node-sass報錯的問題webpack
二、npm install 報錯,提示 gyp ERR! stack Error: EACCES: permission denied 解決方法ios
若是上面都安裝成功,那麼經過 npm run serve 就可用啓動該項目了。這裏把簡單說明下一些公共配置git
一、main.js(主文件)
import Vue from 'vue' import App from './App.vue' import router from './router' //引入 vue-router import store from './store' //引入 vuex // 全局配置 import '@/assets/scss/reset.scss' //全局樣式 import 'element-ui/lib/theme-chalk/index.css' //element-ui樣式 import http from '@/api/config' //axios import './mock' // mockjs // 第三方包 import ElementUI from 'element-ui' Vue.use(ElementUI) Vue.prototype.$http = http Vue.config.productionTip = false new Vue({ router, store, render: h => h(App) }).$mount('#app')
二、router(路由跳轉配置)
router做用
:簡單理解就是幫助組件之間跳轉用的。
這裏爲了性能都採用懶加載,還有這裏無論先登錄登錄頁面 默認跳轉組件爲 Main.vue
import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) // 完整路由代碼 export default new VueRouter({ routes: [ { path: '/', component: () => import('@/views/Main'), children: [ { path: '/', name: 'home', component: () => import('@/views/Home/Home'), }, { path: '/user', name: 'user', component: () => import('@/views/UserManage/UserManage'), }, { path: '/mall', name: 'mall', component: () => import('@/views/MallManage/MallManage'), }, { path: '/page1', name: 'page1', component: () => import('@/views/Other/PageOne'), }, { path: '/page2', name: 'page2', component: () => import('@/views/Other/PageTwo'), }, ] } ] })
三、vuex(存儲共享數據)
vuex做用
:vuex解決了組件之間同一狀態的共享問題。
export default { //存儲數據 state: { isCollapse: false }, //調用方法 mutations: { collapseMenu(state) { state.isCollapse = !state.isCollapse } }, actions: {} }
這裏先只設定一個全局數據isCollapse,用於側邊欄是否水平展開。
四、axios
axios做用
:axios主要是用於向後臺發起請求的,還有在請求中作更可能是可控功能。
import axios from 'axios' // 建立一個axios實例 const service = axios.create({ // 請求超時時間 timeout: 3000 }) export default service
其它的這裏就不詳細講解了,在文章最下面會附上github地址
這個是後臺系統的主組件,它採用的佈局是 element-ui的 Container 佈局容器 Container 佈局容器
<template> <el-container style="height: 100%"> <!--左側欄--> <el-aside width="auto"> <!--左側欄控件--> <common-aside></common-aside> </el-aside> <!--右側欄--> <el-container> <!--header部分--> <el-header> <!--header部分控件--> <common-header></common-header> </el-header> <el-main> <!--左側欄 和 header部分對於整個後臺部分都是不變的,惟一變的就是上面3的部分,這裏就經過router-view來展現所需控件--> <router-view/> </el-main> </el-container> </el-container> </template> <script> import CommonAside from '../components/CommonAside' import CommonHeader from "../components/CommonHeader"; export default { components: { CommonAside, CommonHeader } } </script>
這樣整個後臺管理系統的整個輪廓就定下來了,接下來經過路由的切換的組件展現在router-view
的位置。
它採用的佈局是 element-ui的 NavMenu 導航菜單
<template> <!--collapse 是否水平摺疊收起菜單--> <el-menu :collapse="isCollapse" :default-active="$route.path" class="el-menu-vertical-demo" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b" > <!--是否水平摺疊收起菜單 會影響這裏字段的顯示 --> <h3 v-show="isCollapse">偶囧</h3> <h3 v-show="!isCollapse">偶囧後臺管理系統</h3> <el-menu-item :index="item.path" v-for="item in noChildren" :key="item.path" @click="clickMenu(item)"> <i :class="'el-icon-' + item.icon"></i> <span slot="title">{{ item.label }}</span> </el-menu-item> <el-submenu :index="item.label" v-for="(item, index) in hasChildren" :key="index"> <template slot="title"> <i :class="'el-icon-' + item.icon"></i> <span slot="title">{{ item.label }}</span> </template> <el-menu-item-group> <el-menu-item :index="subItem.path" v-for="(subItem, subIndex) in item.children" :key="subIndex" @click="clickMenu(subItem)"> <i :class="'el-icon-' + subItem.icon"></i> <span slot="title">{{ subItem.label }}</span> </el-menu-item> </el-menu-item-group> </el-submenu> </el-menu> </template> <script> export default { //計算屬性 computed: { //沒有子菜單 noChildren() { return this.menu.filter(item => !item.children) }, //有子菜單 (這樣設置會有一個問題 就是有子菜單的 永遠會在沒有子菜單的下面) hasChildren() { return this.menu.filter(item => item.children) }, isCollapse() { // 這裏的數據就是從vuex取得 return this.$store.state.tab.isCollapse } }, data() { return { menu: [ { path: '/user', name: 'user', label: '用戶管理', icon: 'user', url: 'UserManage/UserManage' }, { label: '其餘', icon: 'location', children: [ { path: '/page1', name: 'page1', label: '頁面1', icon: 'setting', url: 'Other/PageOne' }, { path: '/page2', name: 'page2', label: '頁面2', icon: 'setting', url: 'Other/PageTwo' } ] } ] } }, methods: { //跳轉路由 根據名稱跳轉 clickMenu(item) { this.$router.push({ name: item.name }) } } } </script>
這裏經過點擊那個圖標來控制:左側欄是否水平摺疊收起菜單,因此這裏來修改vuex中 isCollapse 數據。
它採用的佈局是 element-ui的 Dropdown 下拉菜單
<template> <header> <div class="l-content"> <el-button plain icon="el-icon-menu" size="mini" @click="collapseMenu"></el-button> <h3 style=" color : #fff">首頁</h3> </div> <div class="r-content"> <el-dropdown trigger="click" size="mini"> <span class="el-dropdown-link"><img :src="userImg" class="user"/></span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item>我的中心</el-dropdown-item> <el-dropdown-item @click.native="logOut">退出</el-dropdown-item> </el-dropdown-menu> </el-dropdown> </div> </header> </template> <script> export default { data() { return { userImg: require('../assets/images/user.png') } }, methods: { //控制左側菜單是否摺疊 collapseMenu() { this.$store.commit('collapseMenu') }, //退出登錄 logOut() { location.reload() } } } </script>
它採用的佈局是 element-ui的 Card 卡片 + Layout 佈局
<template> <el-row class="home" :gutter="20"> <!--span默認一共是24,這裏佔8 下面佔16,因此這兩個分隔欄所佔的寬度 是1:2--> <el-col :span="8" style="margin-top: 20px"> <!--shadow屬性設置卡片陰影出現的時機--> <el-card shadow='hover'> <div class="user"> <img :src="userImg"/> <div class="userinfo"> <p class="name">Admin</p> <p class="access">超級管理員</p> </div> </div> <div class="login-info"> <p>上次登陸時間:<span>2019-10-20</span></p> <p>上次登陸地點:<span>北京</span></p> </div> </el-card> <el-card style="height: 460px ; margin-top: 20px"> <el-table :data="tableData"> <el-table-column show-overflow-tooltip v-for="(val, key) in tableLabel" :key="key" :prop="key" :label="val"></el-table-column> </el-table> </el-card> </el-col> <el-col :span="16" style="margin-top: 20px"> <div class="num"> <el-card shadow="hover" v-for="item in countData" :key="item.name" :body-style="{ display: 'flex', padding: 0}"> <i class="icon" :class="`el-icon-${item.icon}`" :style="{ background: item.color }"></i> <div class="detail"> <p class="num">¥ {{ item.value }}</p> <p class="txt">{{ item.name }}</p> </div> </el-card> </div> <el-card shadow="hover" style="height: 280px"> </el-card> <div class="graph"> <el-card shadow="hover" style="height: 260px"> </el-card> <el-card shadow="hover" style="height: 260px"> </el-card> </div> </el-col> </el-row> </template> <script> export default { data() { return { userImg: require('../../assets/images/user.png'), countData: [], tableData: [], tableLabel: { name: '課程', todayBuy: '今日購買', monthBuy: '本月購買', totalBuy: '總購買' } } }, methods: { getTableData() { this.$http.get('/home/getData').then(res => { res = res.data this.tableData = res.data.tableData }) } }, //一進組件就會去請求後端接口 獲取首頁數據 created() { this.getTableData() } }
Github地址
mall-manage-system
別人罵我胖,我會生氣,由於我內心認可了我胖。別人說我矮,我就會以爲可笑,由於我內心知道我不可能矮。這就是咱們爲何會對別人的攻擊生氣。 攻我盾者,乃我心裏之矛(13)