Commit d42836872b7bcf901b8462c14fa9b59ac74b4d5d

Authored by 梁保满
1 parent 29f8fb90

首页布局完成,页面顶部返回组件

package.json
@@ -28,6 +28,7 @@ @@ -28,6 +28,7 @@
28 "babel-core": "^6.22.1", 28 "babel-core": "^6.22.1",
29 "babel-loader": "^7.1.1", 29 "babel-loader": "^7.1.1",
30 "babel-eslint": "^10.1.0", 30 "babel-eslint": "^10.1.0",
  31 + "babel-polyfill": "^6.26.0",
31 "eslint": "^6.7.2", 32 "eslint": "^6.7.2",
32 "eslint-plugin-vue": "^6.2.2", 33 "eslint-plugin-vue": "^6.2.2",
33 "extract-text-webpack-plugin": "^3.0.0", 34 "extract-text-webpack-plugin": "^3.0.0",
src/assets/css/base.css 0 → 100644
  1 +* {
  2 + margin: 0px;
  3 + padding: 0px;
  4 +}
  5 +html,
  6 +body {
  7 + height:100%;
  8 + overflow: hidden;
  9 + background-color: #fff;
  10 + font-size: 14px;
  11 + color: #333333;
  12 +}
  13 +
  14 +li {
  15 + list-style: none;
  16 +}
  17 +
  18 +a {
  19 + text-decoration: none;
  20 +}
0 \ No newline at end of file 21 \ No newline at end of file
src/assets/nav/analysis.png 0 → 100644

6.48 KB

src/assets/nav/ask.png 0 → 100644

6.48 KB

src/assets/nav/card.png 0 → 100644

6.65 KB

src/assets/nav/device.png 0 → 100644

8.87 KB

src/assets/nav/down.png 0 → 100644

6.32 KB

src/assets/nav/examinationPaper.png 0 → 100644

7.45 KB

src/assets/nav/portrait.png 0 → 100644

8.87 KB

src/assets/nav/setUpAccount.png 0 → 100644

7.45 KB

src/assets/nav/setUpConglomerate.png 0 → 100644

7.45 KB

src/assets/nav/setUpSchool.png 0 → 100644

7.65 KB

src/assets/nav/test.png 0 → 100644

7.65 KB

src/components/ECharts/lineEcharts.vue
@@ -96,7 +96,20 @@ export default { @@ -96,7 +96,20 @@ export default {
96 } 96 }
97 ] 97 ]
98 }) 98 })
99 - } 99 +
  100 + this.selfAdaption()
  101 + },
  102 + // echart自适应
  103 + selfAdaption() {
  104 + let that = this;
  105 + setTimeout(() => {
  106 + window.onresize = function () {
  107 + if (that.$refs.echarts) {
  108 + that.$refs.echarts.chart.resize();
  109 + }
  110 + };
  111 + }, 10);
  112 + },
100 } 113 }
101 } 114 }
102 </script> 115 </script>
src/components/backBox.vue 0 → 100644
  1 +<template>
  2 + <div class="back">
  3 + <div class="back-l" @click="back">
  4 + <slot name="title"></slot>
  5 + </div>
  6 + <div class="back-r">
  7 + <slot name="btns"></slot>
  8 + </div>
  9 + </div>
  10 +</template>
  11 +
  12 +<script>
  13 +export default {
  14 + name: "back",
  15 + methods: {
  16 + back() {
  17 + this.$router.go(-1);
  18 + },
  19 + },
  20 +};
  21 +</script>
  22 +
  23 +<style lang="scss" scoped>
  24 +.back {
  25 + width: 100%;
  26 + height: 56px;
  27 + border-bottom: 1px solid #e2e2e2;
  28 + display: flex;
  29 + justify-content: space-between;
  30 + align-items: center;
  31 + padding: 0 20px;
  32 + box-sizing: border-box;
  33 + .back-l {
  34 + display: flex;
  35 + align-items: center;
  36 + cursor: pointer;
  37 + flex-shrink: 0;
  38 + font-size: 18px;
  39 + font-weight: 500;
  40 + }
  41 + .back-r {
  42 + flex: 1;
  43 + display: flex;
  44 + justify-content: flex-end;
  45 + }
  46 + .fa-mail-reply-all {
  47 + font-size: 28px;
  48 + color: #b3b3b3;
  49 + margin-right: 12px;
  50 + }
  51 +}
  52 +</style>
0 \ No newline at end of file 53 \ No newline at end of file
src/components/globalComponents.js 0 → 100644
  1 +import Vue from "vue";
  2 +/**
  3 + * require.context(directory .useSubdirectories ,regExp )
  4 + * directory :-读取文件路径
  5 + * useSubdirectories :-是够遍历文件子目录
  6 + * regExp :匹配文件正则
  7 + */
  8 +
  9 +function changeStr(str) {
  10 + return str.charAt(str).toUpperCase() + str.slice(1)
  11 +}
  12 +const requireComponent = require.context("./", false, /\.vue$/);
  13 +
  14 +requireComponent.keys().forEach((fileName) => {
  15 + let config = requireComponent(fileName);
  16 + let componentName = changeStr(
  17 + fileName.replace(/\.\//, "").replace(/\.\w+$/, "")
  18 + );
  19 + Vue.component(componentName, config.default || config);
  20 +});
  21 +
src/main.js
@@ -9,11 +9,15 @@ import i18n from &quot;./i18n/i18n&quot; @@ -9,11 +9,15 @@ import i18n from &quot;./i18n/i18n&quot;
9 import globalPlugin from "./utils/global" 9 import globalPlugin from "./utils/global"
10 import permission from "./directive/permission/button" 10 import permission from "./directive/permission/button"
11 import NProgress from "nprogress" 11 import NProgress from "nprogress"
  12 +import "babel-polyfill"
  13 +import '@/components/globalComponents.js'
  14 +
12 15
13 import "nprogress/nprogress.css" 16 import "nprogress/nprogress.css"
14 import "element-ui/lib/theme-chalk/index.css" 17 import "element-ui/lib/theme-chalk/index.css"
15 import "font-awesome/css/font-awesome.css" 18 import "font-awesome/css/font-awesome.css"
16 import "@/router/permission" 19 import "@/router/permission"
  20 +import "@/assets/css/base.css"
17 21
18 Vue.config.productionTip = false 22 Vue.config.productionTip = false
19 Vue.use(ElementUI) 23 Vue.use(ElementUI)
@@ -30,6 +34,4 @@ new Vue({ @@ -30,6 +34,4 @@ new Vue({
30 store, 34 store,
31 i18n, 35 i18n,
32 render: h => h(App), 36 render: h => h(App),
33 - components: {App},  
34 - template: "<App/>"  
35 }) 37 })
src/router/permission.js
@@ -17,6 +17,7 @@ const TestAnalysis = () =&gt; import(&quot;@/views/test/analysis&quot;) @@ -17,6 +17,7 @@ const TestAnalysis = () =&gt; import(&quot;@/views/test/analysis&quot;)
17 const DataSync = () => import("@/views/dataSync/index") 17 const DataSync = () => import("@/views/dataSync/index")
18 const Portrait = () => import("@/views/portrait/index") 18 const Portrait = () => import("@/views/portrait/index")
19 const Card = () => import("@/views/card/index") 19 const Card = () => import("@/views/card/index")
  20 +const Analysis = () => import("@/views/analysis/index")
20 const Device = () => import("@/views/device/index") 21 const Device = () => import("@/views/device/index")
21 const Down = () => import("@/views/down/index") 22 const Down = () => import("@/views/down/index")
22 const DownClient = () => import("@/views/down/client") 23 const DownClient = () => import("@/views/down/client")
@@ -127,42 +128,45 @@ let addrouters = [ //测试用,后续后端获取 @@ -127,42 +128,45 @@ let addrouters = [ //测试用,后续后端获取
127 } 128 }
128 ] 129 ]
129 }, 130 },
  131 +
130 { 132 {
131 - path: "/dataSync",  
132 - iconCls: "fa fa-random", // 图标样式class  
133 - name: "数据同步", 133 + path: "/setUpConglomerate",
  134 + iconCls: "fa fa-building", // 图标样式class
  135 + name: "学校管理",
134 component: Layout, 136 component: Layout,
135 alone: true, 137 alone: true,
136 children: [ 138 children: [
137 { 139 {
138 - path: "/dataSync",  
139 - iconCls: "fa fa-random", // 图标样式class  
140 - name: "",  
141 - component: DataSync, 140 + path: "/setUpConglomerate",
  141 + iconCls: "fa fa-building",
  142 + name: '集团管理',
  143 + component: SetUpConglomerate,
142 children: [] 144 children: []
143 - } 145 + },
144 ] 146 ]
145 }, 147 },
146 { 148 {
147 - path: "/",  
148 - iconCls: "fa fa-cog",  
149 - name: '信息管理', 149 + path: "/setUpAccount",
  150 + iconCls: "fa fa-id-card-o", // 图标样式class
  151 + name: "账号管理",
150 component: Layout, 152 component: Layout,
  153 + alone: true,
151 children: [ 154 children: [
152 { 155 {
153 path: "/setUpAccount", 156 path: "/setUpAccount",
154 iconCls: "fa fa-id-card-o", 157 iconCls: "fa fa-id-card-o",
155 - name: '账号管理', 158 + name: '',
156 component: SetUpAccount, 159 component: SetUpAccount,
157 children: [] 160 children: []
158 }, 161 },
159 - {  
160 - path: "/setUpConglomerate",  
161 - iconCls: "fa fa-building",  
162 - name: '集团管理',  
163 - component: SetUpConglomerate,  
164 - children: []  
165 - }, 162 + ]
  163 + },
  164 + {
  165 + path: "/",
  166 + iconCls: "fa fa-cog",
  167 + name: '学校管理',
  168 + component: Layout,
  169 + children: [
166 { 170 {
167 path: "/setUpSchool", 171 path: "/setUpSchool",
168 iconCls: "fa fa-calculator", 172 iconCls: "fa fa-calculator",
@@ -219,6 +223,22 @@ let addrouters = [ //测试用,后续后端获取 @@ -219,6 +223,22 @@ let addrouters = [ //测试用,后续后端获取
219 ] 223 ]
220 }, 224 },
221 { 225 {
  226 + path: "/analysis",
  227 + iconCls: "fa fa-area-chart", // 图标样式class
  228 + name: "使用分析",
  229 + component: Layout,
  230 + alone: true,
  231 + children: [
  232 + {
  233 + path: "/analysis",
  234 + iconCls: "fa fa-area-chart", // 图标样式class
  235 + name: "",
  236 + component: Analysis,
  237 + children: []
  238 + }
  239 + ]
  240 + },
  241 + {
222 path: "/down", 242 path: "/down",
223 iconCls: "fa fa-download", // 图标样式class 243 iconCls: "fa fa-download", // 图标样式class
224 name: "软件下载", 244 name: "软件下载",
@@ -241,7 +261,22 @@ let addrouters = [ //测试用,后续后端获取 @@ -241,7 +261,22 @@ let addrouters = [ //测试用,后续后端获取
241 } 261 }
242 ] 262 ]
243 }, 263 },
244 - 264 + {
  265 + path: "/dataSync",
  266 + iconCls: "fa fa-random", // 图标样式class
  267 + name: "数据同步",
  268 + component: Layout,
  269 + alone: true,
  270 + children: [
  271 + {
  272 + path: "/dataSync",
  273 + iconCls: "fa fa-random", // 图标样式class
  274 + name: "",
  275 + component: DataSync,
  276 + children: []
  277 + }
  278 + ]
  279 + },
245 { 280 {
246 path: "*", 281 path: "*",
247 redirect: "/404", 282 redirect: "/404",
@@ -268,7 +303,7 @@ router.beforeEach((to, from, next) =&gt; { @@ -268,7 +303,7 @@ router.beforeEach((to, from, next) =&gt; {
268 roleName: "超级管理员" 303 roleName: "超级管理员"
269 } 304 }
270 ], 305 ],
271 - name: "老师", 306 + name: "老师",
272 // avatar: data.avatar ? data.avatar : "", 307 // avatar: data.avatar ? data.avatar : "",
273 // uid: data.id, 308 // uid: data.id,
274 // authorityRouter:[], 309 // authorityRouter:[],
@@ -276,7 +311,6 @@ router.beforeEach((to, from, next) =&gt; { @@ -276,7 +311,6 @@ router.beforeEach((to, from, next) =&gt; {
276 }) 311 })
277 await store.commit("setRouters", addrouters) 312 await store.commit("setRouters", addrouters)
278 let newAddRouters = store.getters.addRouters 313 let newAddRouters = store.getters.addRouters
279 - // await router.addRoutes(newAddRouters)  
280 newAddRouters.forEach(res => { 314 newAddRouters.forEach(res => {
281 router.addRoute(res) 315 router.addRoute(res)
282 }) 316 })
src/store/index.js
@@ -20,6 +20,7 @@ const TestAnalysis = () =&gt; import(&quot;@/views/test/analysis&quot;) @@ -20,6 +20,7 @@ const TestAnalysis = () =&gt; import(&quot;@/views/test/analysis&quot;)
20 const DataSync = () => import("@/views/dataSync/index") 20 const DataSync = () => import("@/views/dataSync/index")
21 const Portrait = () => import("@/views/portrait/index") 21 const Portrait = () => import("@/views/portrait/index")
22 const Card = () => import("@/views/card/index") 22 const Card = () => import("@/views/card/index")
  23 +const Analysis = () => import("@/views/analysis/index")
23 const Device = () => import("@/views/device/index") 24 const Device = () => import("@/views/device/index")
24 const Down = () => import("@/views/down/index") 25 const Down = () => import("@/views/down/index")
25 const DownClient = () => import("@/views/down/client") 26 const DownClient = () => import("@/views/down/client")
@@ -130,42 +131,45 @@ let addrouters = [ //测试用,后续后端获取 @@ -130,42 +131,45 @@ let addrouters = [ //测试用,后续后端获取
130 } 131 }
131 ] 132 ]
132 }, 133 },
  134 +
133 { 135 {
134 - path: "/dataSync",  
135 - iconCls: "fa fa-random", // 图标样式class  
136 - name: "数据同步", 136 + path: "/setUpConglomerate",
  137 + iconCls: "fa fa-building", // 图标样式class
  138 + name: "学校管理",
137 component: Layout, 139 component: Layout,
138 alone: true, 140 alone: true,
139 children: [ 141 children: [
140 { 142 {
141 - path: "/dataSync",  
142 - iconCls: "fa fa-random", // 图标样式class  
143 - name: "",  
144 - component: DataSync, 143 + path: "/setUpConglomerate",
  144 + iconCls: "fa fa-building",
  145 + name: '集团管理',
  146 + component: SetUpConglomerate,
145 children: [] 147 children: []
146 - } 148 + },
147 ] 149 ]
148 }, 150 },
149 { 151 {
150 - path: "/",  
151 - iconCls: "fa fa-cog",  
152 - name: '信息管理', 152 + path: "/setUpAccount",
  153 + iconCls: "fa fa-id-card-o", // 图标样式class
  154 + name: "账号管理",
153 component: Layout, 155 component: Layout,
  156 + alone: true,
154 children: [ 157 children: [
155 { 158 {
156 path: "/setUpAccount", 159 path: "/setUpAccount",
157 iconCls: "fa fa-id-card-o", 160 iconCls: "fa fa-id-card-o",
158 - name: '账号管理', 161 + name: '',
159 component: SetUpAccount, 162 component: SetUpAccount,
160 children: [] 163 children: []
161 }, 164 },
162 - {  
163 - path: "/setUpConglomerate",  
164 - iconCls: "fa fa-building",  
165 - name: '集团管理',  
166 - component: SetUpConglomerate,  
167 - children: []  
168 - }, 165 + ]
  166 + },
  167 + {
  168 + path: "/",
  169 + iconCls: "fa fa-cog",
  170 + name: '学校管理',
  171 + component: Layout,
  172 + children: [
169 { 173 {
170 path: "/setUpSchool", 174 path: "/setUpSchool",
171 iconCls: "fa fa-calculator", 175 iconCls: "fa fa-calculator",
@@ -222,6 +226,22 @@ let addrouters = [ //测试用,后续后端获取 @@ -222,6 +226,22 @@ let addrouters = [ //测试用,后续后端获取
222 ] 226 ]
223 }, 227 },
224 { 228 {
  229 + path: "/analysis",
  230 + iconCls: "fa fa-area-chart", // 图标样式class
  231 + name: "使用分析",
  232 + component: Layout,
  233 + alone: true,
  234 + children: [
  235 + {
  236 + path: "/analysis",
  237 + iconCls: "fa fa-area-chart", // 图标样式class
  238 + name: "",
  239 + component: Analysis,
  240 + children: []
  241 + }
  242 + ]
  243 + },
  244 + {
225 path: "/down", 245 path: "/down",
226 iconCls: "fa fa-download", // 图标样式class 246 iconCls: "fa fa-download", // 图标样式class
227 name: "软件下载", 247 name: "软件下载",
@@ -244,7 +264,22 @@ let addrouters = [ //测试用,后续后端获取 @@ -244,7 +264,22 @@ let addrouters = [ //测试用,后续后端获取
244 } 264 }
245 ] 265 ]
246 }, 266 },
247 - 267 + {
  268 + path: "/dataSync",
  269 + iconCls: "fa fa-random", // 图标样式class
  270 + name: "数据同步",
  271 + component: Layout,
  272 + alone: true,
  273 + children: [
  274 + {
  275 + path: "/dataSync",
  276 + iconCls: "fa fa-random", // 图标样式class
  277 + name: "",
  278 + component: DataSync,
  279 + children: []
  280 + }
  281 + ]
  282 + },
248 { 283 {
249 path: "*", 284 path: "*",
250 redirect: "/404", 285 redirect: "/404",
@@ -301,8 +336,6 @@ const store = new Vuex.Store({ @@ -301,8 +336,6 @@ const store = new Vuex.Store({
301 // authorityRouter:[], 336 // authorityRouter:[],
302 }); 337 });
303 commit("setRouters", addrouters) 338 commit("setRouters", addrouters)
304 - // let newAddRouters = getters.addRouters;  
305 - // await router.addRoutes(newAddRouters)  
306 addrouters.forEach((res) => { 339 addrouters.forEach((res) => {
307 that.$router.addRoute(res); 340 that.$router.addRoute(res);
308 }); 341 });
@@ -327,8 +360,6 @@ const store = new Vuex.Store({ @@ -327,8 +360,6 @@ const store = new Vuex.Store({
327 // authorityRouter:[], 360 // authorityRouter:[],
328 }); 361 });
329 commit("setRouters", addrouters) 362 commit("setRouters", addrouters)
330 - // let newAddRouters = getters.addRouters;  
331 - // await router.addRoutes(newAddRouters)  
332 addrouters.forEach((res) => { 363 addrouters.forEach((res) => {
333 that.$router.addRoute(res); 364 that.$router.addRoute(res);
334 }); 365 });
src/utils/global.js
@@ -7,98 +7,5 @@ export default { @@ -7,98 +7,5 @@ export default {
7 Vue.prototype.$echarts = echarts 7 Vue.prototype.$echarts = echarts
8 Vue.prototype.$request = request 8 Vue.prototype.$request = request
9 Vue.prototype.$rules = rules 9 Vue.prototype.$rules = rules
10 - /** 时间字符串  
11 - * @method $getDateDiff  
12 - * @param timespan  
13 - */  
14 - Vue.prototype.$getDateDiff = function (timespan) {  
15 - var dateTime = new Date(timespan)  
16 - var year = dateTime.getFullYear()  
17 - var month = (dateTime.getMonth() + 1) < 10 ? "0" + (dateTime.getMonth() + 1) : (dateTime.getMonth() + 1)  
18 - var day = dateTime.getDate() < 10 ? "0" + dateTime.getDate() : dateTime.getDate()  
19 - var hour = dateTime.getHours() < 10 ? "0" + dateTime.getHours() : dateTime.getHours()  
20 - var minute = dateTime.getMinutes() < 10 ? "0" + dateTime.getMinutes() : dateTime.getMinutes()  
21 - var seconds = dateTime.getSeconds() < 10 ? "0" + dateTime.getSeconds() : dateTime.getSeconds()  
22 - var now = new Date()  
23 - var nowNew = now.getTime()  
24 - var milliseconds = 0  
25 - var timeSpanStr  
26 - milliseconds = nowNew - dateTime  
27 -  
28 - if (milliseconds <= 1000 * 60 * 1) {  
29 - timeSpanStr = "刚刚"  
30 - } else if (1000 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60) {  
31 - timeSpanStr = Math.round((milliseconds / (1000 * 60))) + "分钟前"  
32 - } else if (1000 * 60 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24) {  
33 - timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60)) + "小时前"  
34 - } else if (1000 * 60 * 60 * 24 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24 * 3) {  
35 - timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60 * 24)) + "天前"  
36 - } else if (milliseconds > 1000 * 60 * 60 * 24 * 3 && year === now.getFullYear()) {  
37 - timeSpanStr = month + "-" + day + " " + hour + ":" + minute + ":" + seconds  
38 - } else {  
39 - timeSpanStr = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + seconds  
40 - }  
41 - return timeSpanStr  
42 - }  
43 -  
44 - /** 当前地址ip  
45 - * @method $path  
46 - * @param {}  
47 - */  
48 - Vue.prototype.$path = process.env.API_HOST  
49 -  
50 - /** 传入路径转换成完整连接  
51 - * @method $getPath  
52 - * @param {url: 路径}  
53 - */  
54 - Vue.prototype.$getPath = function (url) {  
55 - const base = process.env.API_HOST  
56 - if (/^http/.test(url)) return url  
57 - return base + url  
58 - }  
59 - /** 是否开发模式  
60 - * @method $env  
61 - * @param {}  
62 - */  
63 - Vue.prototype.$env = process.env.NODE_ENV  
64 -  
65 - /** 导出,下载处理文件流  
66 - * @method $exportClick  
67 - * @param {res:文件流,name : 下载文件名}  
68 - */  
69 - Vue.prototype.$exportClick = function (res, name = "下载.zip") {  
70 - const content = res  
71 - const blob = new Blob([content])  
72 - const fileName = name  
73 - if ("download" in document.createElement("a")) { // 非IE下载  
74 - const elink = document.createElement("a")  
75 - elink.download = fileName  
76 - elink.style.display = "none"  
77 - elink.href = URL.createObjectURL(blob)  
78 - document.body.appendChild(elink)  
79 - elink.click()  
80 - URL.revokeObjectURL(elink.href) // 释放URL 对象  
81 - document.body.removeChild(elink)  
82 - } else { // IE10+下载  
83 - navigator.msSaveBlob(blob, fileName)  
84 - }  
85 - }  
86 -  
87 - /** 当res.code === 200 时  
88 - * @method $restBack  
89 - * @param res  
90 - * @param fn  
91 - * @param message  
92 - * @param type  
93 - */  
94 - Vue.prototype.$restBack = function (res, fn = () => {}, message, type = "success") {  
95 - if (res.code === 200) {  
96 - this.$message({  
97 - message: message || res.message,  
98 - type: type  
99 - })  
100 - fn()  
101 - }  
102 - }  
103 } 10 }
104 } 11 }
src/views/analysis/index.vue 0 → 100644
  1 +<template>
  2 + <div>使用分析</div>
  3 +</template>
  4 +
  5 +<script>
  6 +export default {
  7 +
  8 +}
  9 +</script>
  10 +
  11 +<style>
  12 +
  13 +</style>
0 \ No newline at end of file 14 \ No newline at end of file
src/views/examinationPaper/index.vue
1 <template> 1 <template>
2 <div> 2 <div>
3 - 答题卡列表  
4 - <router-link to="/examinationPaperAdd">添加答题卡</router-link>  
5 - <router-link to="/examinationPaperRecycle">已归档答题卡</router-link>  
6 - <router-link to="/examinationPaperEdit">修改答案</router-link> 3 + <back-box>
  4 + <template slot="title">
  5 + <i class="fa fa-mail-reply-all"></i>
  6 + <span>备题组卷</span>
  7 + </template>
  8 + <template slot="btns">
  9 +
  10 + </template>
  11 + </back-box>
  12 + <div class="content">
  13 + <router-link to="/examinationPaperAdd">添加答题卡</router-link>
  14 + <router-link to="/examinationPaperRecycle">已归档答题卡</router-link>
  15 + <router-link to="/examinationPaperEdit">修改答案</router-link>
  16 + </div>
7 </div> 17 </div>
8 </template> 18 </template>
9 19
10 <script> 20 <script>
11 export default { 21 export default {
12 - name:"examinationPaper"  
13 -} 22 + name: "examinationPaper",
  23 +};
14 </script> 24 </script>
15 25
16 -<style>  
17 - 26 +<style scoped lang="scss">
  27 +.container {
  28 +}
18 </style> 29 </style>
19 \ No newline at end of file 30 \ No newline at end of file
src/views/index/mainIndex.vue
1 <template> 1 <template>
2 - <div>首页</div> 2 + <div class="container">
  3 + <ul class="nav-list" v-if="type == '学校管理员'">
  4 + <li class="nav-item item1" @click="links('setUpAccount')">
  5 + <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" />
  6 + <div class="text">
  7 + <p class="p1">账号管理</p>
  8 + <p class="p2">管理32个任课教师,14个班主任,3个备课组长账号信息。</p>
  9 + </div>
  10 + </li>
  11 + <li class="nav-item item1" @click="links('setUpSchool')">
  12 + <img class="icon" src="../../assets/nav/setUpSchool.png" alt="" />
  13 + <div class="text">
  14 + <p class="p1">学校管理</p>
  15 + <p class="p2">管理6个年级,3个班级,397名学生信息。</p>
  16 + </div>
  17 + </li>
  18 + <li class="nav-item item2" @click="links('device')">
  19 + <img class="icon" src="../../assets/nav/device.png" alt="" />
  20 + <div class="text">
  21 + <p class="p1">设备状态</p>
  22 + <p class="p2">管理14个基站,396套答题器设备。</p>
  23 + </div>
  24 + </li>
  25 + <li class="item3">
  26 + <div class="nav-item item1 item-child1" @click="links('analysis')">
  27 + <img class="icon" src="../../assets/nav/analysis.png" alt="" />
  28 + <div class="text">
  29 + <p class="p1">使用分析</p>
  30 + <p class="p2">按班级、科目等维度分析设备使用频率。</p>
  31 + </div>
  32 + </div>
  33 + <div class="nav-item item1 item-child2" @click="links('card')">
  34 + <img class="icon" src="../../assets/nav/card.png" alt="" />
  35 + <p class="p1">发卡补卡</p>
  36 + <p class="p2">为学生办理发卡、补卡业务。</p>
  37 + </div>
  38 + <div class="nav-item item1 item-child2" @click="links('down')">
  39 + <img class="icon" src="../../assets/nav/down.png" alt="" />
  40 + <p class="p1">软件下载</p>
  41 + <p class="p2">设置参数,下载授课端软件。</p>
  42 + </div>
  43 + </li>
  44 + </ul>
  45 + <ul class="nav-list" v-if="type == '集团管理员'">
  46 + <li v-for="item in navList" :key="item.path" class="nav-item item4" @click="links(item.path)">
  47 + <img class="icon" :src="getImgs(item.path)" alt="" />
  48 + <div class="text" v-if="item.path == 'setUpConglomerate'">
  49 + <p class="p1">学校管理</p>
  50 + <p class="p2">管理3个区域,14个学校。</p>
  51 + </div>
  52 + <div class="text" v-else-if="item.path == 'setUpAccount'">
  53 + <p class="p1">账号管理</p>
  54 + <p class="p2">共35个各层级管理员账号。</p>
  55 + </div>
  56 + <div class="text" v-else-if="item.path == 'device'">
  57 + <p class="p1">设备状态</p>
  58 + <p class="p2">管理14个基站,396套答题器设备。</p>
  59 + </div>
  60 + <div class="text" v-else>
  61 + <p class="p1">使用分析</p>
  62 + <p class="p2">按软件功能、题型统计使用频率。</p>
  63 + </div>
  64 + </li>
  65 + </ul>
  66 + <ul class="nav-list" v-if="type == '班主任' || type == '任课老师' ">
  67 + <li v-for="item in navList" :key="item.path" class="nav-item item4" @click="links(item.path)">
  68 + <img class="icon" :src="getImgs(item.path)" alt="" />
  69 + <div class="text" v-if="item.path == 'examinationPaper'">
  70 + <p class="p1">备题组卷</p>
  71 + <p class="p2">管理32套答题卡。</p>
  72 + </div>
  73 + <div class="text" v-else-if="item.path == 'portrait'">
  74 + <p class="p1">学生画像</p>
  75 + <p class="p2">共分析532名学生成绩。</p>
  76 + </div>
  77 + <div class="text" v-else-if="item.path == 'ask'">
  78 + <p class="p1">随堂问报表</p>
  79 + <p class="p2">对41套随堂问答题记录分析。</p>
  80 + </div>
  81 + <div class="text" v-else>
  82 + <p class="p1">即时测报表</p>
  83 + <p class="p2">对28套即时测答题记录分析。</p>
  84 + </div>
  85 + </li>
  86 + </ul>
  87 + </div>
3 </template> 88 </template>
4 89
5 <script> 90 <script>
6 export default { 91 export default {
7 name: "mainIndex", 92 name: "mainIndex",
8 - mounted() {  
9 - this.selfAdaption(); 93 + data() {
  94 + return {
  95 + // type: "学校管理员",
  96 + // type: "集团管理员",
  97 + // type: "班主任",
  98 + type: "任课老师",
  99 + navList: [
  100 + // {
  101 + // name: "学校管理",
  102 + // path: "setUpConglomerate",
  103 + // },
  104 + // {
  105 + // name: "账号管理",
  106 + // path: "setUpAccount",
  107 + // },
  108 + // {
  109 + // name: "设备状态",
  110 + // path: "device",
  111 + // },
  112 + // {
  113 + // name: "使用分析",
  114 + // path: "analysis",
  115 + // },
  116 + {
  117 + name: "备题组卷",
  118 + path: "examinationPaper",
  119 + },
  120 + {
  121 + name: "学生画像",
  122 + path: "portrait",
  123 + },
  124 + {
  125 + name: "随堂问报表",
  126 + path: "ask",
  127 + },
  128 + {
  129 + name: "即时测报表",
  130 + path: "test",
  131 + },
  132 + ],
  133 + };
10 }, 134 },
  135 + mounted() {},
11 methods: { 136 methods: {
12 - // echart自适应  
13 - selfAdaption() {  
14 - let that = this;  
15 - setTimeout(() => {  
16 - window.onresize = function () {  
17 - if (that.$refs.echarts) {  
18 - that.$refs.echarts.chart.resize();  
19 - }  
20 - };  
21 - }, 10); 137 + getImgs(path) {
  138 + return require(`@/assets/nav/${path}.png`)
  139 + },
  140 + links(path) {
  141 + this.$router.push({
  142 + path: `/${path}`,
  143 + });
22 }, 144 },
23 }, 145 },
24 }; 146 };
25 </script> 147 </script>
26 148
27 <style lang="scss"> 149 <style lang="scss">
28 -$top: top;  
29 -$bottom: bottom;  
30 -$left: left;  
31 -$right: right;  
32 -$leftright: ($left, $right);  
33 -$pinkk: #eec2d3;  
34 -$bluee: #409eff;  
35 -$yelloww: #f4d884;  
36 -$grennn: #89dda0;  
37 -$purplee: #78a2ea;  
38 -$lightBluee: #b8d6ff;  
39 -  
40 -$list: bluee pinkk yelloww grennn purplee lightBluee;  
41 -$list1: $bluee $pinkk $yelloww $grennn $purplee $lightBluee;  
42 -%shadow {  
43 - background: #fff;  
44 - -webkit-box-shadow: 4px 4px 40px rgba(0, 0, 0, 0.2);  
45 - box-shadow: 4px 4px 40px rgba(0, 0, 0, 0.2);  
46 - border-color: rgba(0, 0, 0, 0.2);  
47 - .title {  
48 - font-size: 14px;  
49 - padding: 10px;  
50 - i {  
51 - margin-#{$right}: 5px;  
52 - }  
53 - }  
54 -}  
55 -  
56 -@mixin flex($direction: row, $content: space-between) { 150 +.container {
57 display: flex; 151 display: flex;
58 - flex-direction: $direction;  
59 - justify-content: $content;  
60 -}  
61 -.card {  
62 - color: #666;  
63 - @extend %shadow;  
64 -  
65 - ul {  
66 - @include flex;  
67 - li {  
68 - flex: 1;  
69 - a {  
70 - color: #666666;  
71 - align-items: center;  
72 - padding-#{$top}: 20px;  
73 - padding-#{$bottom}: 20px;  
74 - @include flex(column);  
75 - span {  
76 - height: 44px;  
77 - }  
78 - .num {  
79 - line-height: 44px;  
80 - font-size: 42px;  
81 - color: $bluee;  
82 - margin: 0px;  
83 - } 152 + justify-content: center;
  153 + align-items: center;
  154 + padding: 100px 90px 0 50px;
  155 + .nav-list {
  156 + width: 100%;
  157 + display: flex;
  158 + flex-wrap: wrap;
  159 + .nav-item {
  160 + background: #f8f8f8;
  161 + border-radius: 20px;
  162 + box-shadow: 3px 3px 3px #aaaaaa59;
  163 + cursor: pointer;
  164 + &:hover {
  165 + background-color: #ededed;
84 } 166 }
85 - .kjfs-bluee {  
86 - color: $bluee; 167 + .icon {
  168 + width: 110px;
  169 + height: 110px;
  170 + border-radius: 50%;
87 } 171 }
88 - .kjfs-pinkk {  
89 - color: $pinkk; 172 + .p1 {
  173 + font-size: 18px;
  174 + color: #333;
  175 + line-height: 18px;
  176 + margin-bottom: 12px;
  177 + font-weight: 500;
90 } 178 }
91 - .kjfs-yelloww {  
92 - color: $yelloww; 179 + .p2 {
  180 + font-size: 14px;
  181 + color: #999;
93 } 182 }
94 - .kjfs-grennn {  
95 - color: $grennn; 183 + }
  184 + .item1 {
  185 + width: calc(50% - 10px);
  186 + flex-shrink: 0;
  187 + display: flex;
  188 + justify-content: center;
  189 + margin-right: 20px;
  190 + margin-bottom: 20px;
  191 + box-sizing: border-box;
  192 + padding: 40px 80px;
  193 + &:nth-child(2) {
  194 + margin-right: 0;
96 } 195 }
97 - .kjfs-purplee {  
98 - color: $purplee; 196 + .icon {
  197 + margin-right: 20px;
99 } 198 }
100 - .kjfs-lightBluee {  
101 - color: $lightBluee; 199 + .text {
  200 + display: flex;
  201 + flex-direction: column;
  202 + justify-content: center;
  203 + padding-top: 10px;
102 } 204 }
103 - &:hover {  
104 - .kjfs-bluee {  
105 - color: #ffffff;  
106 - background: $bluee;  
107 - }  
108 - .kjfs-pinkk {  
109 - color: #ffffff;  
110 - background: $pinkk; 205 + .p2 {
  206 + line-height: 24px;
  207 + }
  208 + &.item-child1 {
  209 + width: 100%;
  210 + height: calc(50% - 8px);
  211 + margin-bottom: 16px;
  212 + padding: 0 20px;
  213 + align-items: center;
  214 + .icon {
  215 + width: 80px;
  216 + height: 80px;
111 } 217 }
112 - .kjfs-yelloww {  
113 - color: #ffffff;  
114 - background: $yelloww; 218 + }
  219 + &.item-child2 {
  220 + height: calc(50% - 8px);
  221 + margin-right: 20px;
  222 + flex-wrap: wrap;
  223 + padding: 12px 30px;
  224 + .icon {
  225 + width: 60px;
  226 + height: 60px;
115 } 227 }
116 - .kjfs-grennn {  
117 - color: #ffffff;  
118 - background: $grennn; 228 + .p1 {
  229 + flex: 1;
  230 + line-height: 60px;
  231 + margin-bottom: 0;
119 } 232 }
120 - .kjfs-purplee {  
121 - color: #ffffff;  
122 - background: $purplee; 233 + .p2 {
  234 + width: 100%;
123 } 235 }
124 - .kjfs-lightBluee {  
125 - color: #ffffff;  
126 - background: $lightBluee; 236 + &:last-of-type {
  237 + margin-right: 0;
127 } 238 }
128 } 239 }
129 } 240 }
  241 + .item2 {
  242 + width: calc(50% - 10px);
  243 + height: 240px;
  244 + flex-shrink: 0;
  245 + display: flex;
  246 + flex-direction: column;
  247 + justify-content: center;
  248 + align-items: center;
  249 + margin-right: 20px;
  250 + box-sizing: border-box;
  251 + padding: 30px 0;
  252 + text-align: center;
  253 + &:last-of-type {
  254 + margin-right: 0;
  255 + }
  256 + .icon {
  257 + margin-bottom: 20px;
  258 + }
  259 + .p2 {
  260 + line-height: 16px;
  261 + }
  262 + }
  263 + .item3 {
  264 + width: calc(50% - 10px);
  265 + height: 240px;
  266 + display: flex;
  267 + flex-wrap: wrap;
  268 + }
  269 + .item4 {
  270 + width: calc(50% - 10px);
  271 + flex-shrink: 0;
  272 + display: flex;
  273 + justify-content: flex-start;
  274 + margin-right: 20px;
  275 + margin-bottom: 20px;
  276 + box-sizing: border-box;
  277 + padding: 40px 80px;
  278 + &:nth-child(2n) {
  279 + margin-right: 0;
  280 + }
  281 + .icon {
  282 + margin-right: 20px;
  283 + }
  284 + .text {
  285 + display: flex;
  286 + flex-direction: column;
  287 + justify-content: center;
  288 + padding-top: 10px;
  289 + }
  290 + .p2 {
  291 + line-height: 24px;
  292 + }
  293 + }
130 } 294 }
131 } 295 }
132 -#lineEcharts {  
133 - margin-#{$top}: 30px;  
134 - padding-#{$top}: 30px;  
135 - @extend %shadow;  
136 -}  
137 </style> 296 </style>
src/views/layout/aside/aside.vue
@@ -2,9 +2,16 @@ @@ -2,9 +2,16 @@
2 <div> 2 <div>
3 <el-aside id="asideNav"> 3 <el-aside id="asideNav">
4 <div class="logo-name"> 4 <div class="logo-name">
5 - <img class="logo" src="../../../assets/images/logo.png" alt="">  
6 - <p >中天易教</p>  
7 - <img v-if="$store.getters.logoShow" class="logo" src="../../../assets/images/logo.png" alt=""> 5 + <img
  6 + v-if="$store.getters.logoShow"
  7 + class="logo"
  8 + src="../../../assets/images/logo.png"
  9 + alt=""
  10 + />
  11 + <template v-else>
  12 + <img class="logo" src="../../../assets/images/logo.png" alt="" />
  13 + <p>中天易教</p>
  14 + </template>
8 </div> 15 </div>
9 <el-menu 16 <el-menu
10 :default-active="$route.path" 17 :default-active="$route.path"
@@ -27,7 +34,7 @@ @@ -27,7 +34,7 @@
27 > 34 >
28 <template slot="title"> 35 <template slot="title">
29 <i :class="item.iconCls ? item.iconCls : [fa, fa - server]"></i> 36 <i :class="item.iconCls ? item.iconCls : [fa, fa - server]"></i>
30 - <span slot="title">{{item.name}}</span> 37 + <span slot="title">{{ item.name }}</span>
31 </template> 38 </template>
32 39
33 <menu-tree :menuData="item.children"></menu-tree> 40 <menu-tree :menuData="item.children"></menu-tree>
@@ -120,13 +127,13 @@ $right: right; @@ -120,13 +127,13 @@ $right: right;
120 align-items: center; 127 align-items: center;
121 width: 100%; 128 width: 100%;
122 height: 50px; 129 height: 50px;
123 - padding:0 16px; 130 + padding: 0 16px;
124 box-sizing: border-box; 131 box-sizing: border-box;
125 @extend %w100; 132 @extend %w100;
126 - .logo{  
127 - width:24px;  
128 - height:24px;  
129 - margin-right:10px; 133 + .logo {
  134 + width: 24px;
  135 + height: 24px;
  136 + margin-right: 10px;
130 } 137 }
131 p { 138 p {
132 line-height: 50px; 139 line-height: 50px;
src/views/layout/header/header.vue
@@ -2,8 +2,8 @@ @@ -2,8 +2,8 @@
2 <div> 2 <div>
3 <el-header id="header"> 3 <el-header id="header">
4 <span class="hideAside" @click="collapse" 4 <span class="hideAside" @click="collapse"
5 - ><i class="fa fa-indent fa-lg"></i  
6 - ></span> 5 + ><i class="el-icon-s-fold" v-show="!isCollapse"></i>
  6 + <i class="el-icon-s-unfold" v-show="isCollapse"></i></span>
7 <ul class="personal"> 7 <ul class="personal">
8 <!-- <li> 8 <!-- <li>
9 <langSelect></langSelect> 9 <langSelect></langSelect>
@@ -81,10 +81,12 @@ export default { @@ -81,10 +81,12 @@ export default {
81 dialogPassVisible: false, 81 dialogPassVisible: false,
82 title: "", 82 title: "",
83 userId: "", 83 userId: "",
  84 + isCollapse:false
84 }; 85 };
85 }, 86 },
86 methods: { 87 methods: {
87 collapse() { 88 collapse() {
  89 + this.isCollapse = !this.isCollapse
88 this.$store.dispatch("collapse"); 90 this.$store.dispatch("collapse");
89 }, 91 },
90 successCallback() { 92 successCallback() {
@@ -122,20 +124,7 @@ export default { @@ -122,20 +124,7 @@ export default {
122 handleCommand(command) { 124 handleCommand(command) {
123 //刷新权限跳转首页 125 //刷新权限跳转首页
124 this.$message("click on item " + command); 126 this.$message("click on item " + command);
125 -  
126 - this.$store.dispatch("setInfo", {  
127 - permissions: [  
128 - {  
129 - role: "superAdmin",  
130 - roleName: "超级管理员",  
131 - },  
132 - ],  
133 - // authorityRouter:[],  
134 - name: "",  
135 - });  
136 - this.$router.push({  
137 - path: "/index",  
138 - }); 127 + this.$store.dispatch("permissions", this);
139 }, 128 },
140 logOut() { 129 logOut() {
141 this.$router.push({ 130 this.$router.push({
@@ -187,8 +176,13 @@ ul.el-menu { @@ -187,8 +176,13 @@ ul.el-menu {
187 display: flex; 176 display: flex;
188 justify-content: space-between; 177 justify-content: space-between;
189 color: #fff; 178 color: #fff;
  179 + padding:0 20px 0 10px;
190 .hideAside { 180 .hideAside {
191 @extend %cursor; 181 @extend %cursor;
  182 + i{
  183 + font-size:24px;
  184 + line-height: 50px;
  185 + }
192 } 186 }
193 .personal { 187 .personal {
194 display: flex; 188 display: flex;
@@ -198,6 +192,7 @@ ul.el-menu { @@ -198,6 +192,7 @@ ul.el-menu {
198 font-size: 12px; 192 font-size: 12px;
199 @extend %cursor; 193 @extend %cursor;
200 position: relative; 194 position: relative;
  195 + line-height: 50px;
201 } 196 }
202 } 197 }
203 .userInfo { 198 .userInfo {
@@ -224,9 +219,11 @@ ul.el-menu { @@ -224,9 +219,11 @@ ul.el-menu {
224 .el-icon-rank { 219 .el-icon-rank {
225 font-size: 20px; 220 font-size: 20px;
226 transform: rotate(45deg); 221 transform: rotate(45deg);
  222 + line-height: 50px;
227 } 223 }
228 .el-icon-switch-button { 224 .el-icon-switch-button {
229 font-size: 18px; 225 font-size: 18px;
  226 + line-height: 50px;
230 } 227 }
231 .fa-lg { 228 .fa-lg {
232 color: #fff; 229 color: #fff;
src/views/layout/layout.vue
@@ -48,26 +48,7 @@ export default { @@ -48,26 +48,7 @@ export default {
48 transition: all 0.3s; 48 transition: all 0.3s;
49 } 49 }
50 </style> 50 </style>
51 -<style lang="scss">  
52 -* {  
53 - margin: 0px;  
54 - padding: 0px;  
55 -}  
56 -  
57 -body {  
58 - background-color: #f2f2f2;  
59 - font-size: 14px;  
60 - color: #333333;  
61 -}  
62 -  
63 -li {  
64 - list-style: none;  
65 -}  
66 -  
67 -a {  
68 - text-decoration: none;  
69 -}  
70 - 51 +<style lang="scss" scoped>
71 $top: top; 52 $top: top;
72 $bottom: bottom; 53 $bottom: bottom;
73 $left: left; 54 $left: left;
@@ -84,12 +65,7 @@ $leftright: ($left, $right); @@ -84,12 +65,7 @@ $leftright: ($left, $right);
84 %cursor { 65 %cursor {
85 cursor: pointer; 66 cursor: pointer;
86 } 67 }
87 -html,  
88 -body {  
89 - overflow: hidden;  
90 -}  
91 -html,  
92 -body, 68 +
93 #loyout, 69 #loyout,
94 .el-container, 70 .el-container,
95 #asideNav, 71 #asideNav,
@@ -104,7 +80,8 @@ ul.el-menu { @@ -104,7 +80,8 @@ ul.el-menu {
104 } 80 }
105 81
106 #elmain { 82 #elmain {
107 - background-color: #f0f2f5; 83 + background-color: #fff;
  84 + padding:0;
108 } 85 }
109 86
110 .avatar-uploader .el-upload { 87 .avatar-uploader .el-upload {
src/views/setUp/index.vue 0 → 100644
src/views/systemManage/roleManage.vue deleted
1 -<template>  
2 - <div class="cardshadow roleListTable">  
3 - <div>  
4 - <el-button type="primary" icon="el-icon-circle-plus-outline" size="mini" @click="addRole" plain v-role-btn="'btn_100002'">新增</el-button>  
5 - </div>  
6 - <el-table  
7 - :data="tableData"  
8 - style="width: 100%">  
9 - <el-table-column  
10 - type="index">  
11 - </el-table-column>  
12 - <el-table-column  
13 - property="name"  
14 - label="角色名">  
15 - </el-table-column>  
16 - <el-table-column  
17 - property="describe"  
18 - label="角色描述">  
19 - </el-table-column>  
20 - <el-table-column  
21 - prop="status"  
22 - label="状态"  
23 - filter-placement="bottom-end">  
24 - <template slot-scope="scope">  
25 - <el-tag  
26 - :type="scope.row.status === '启用' ? 'primary' : 'danger'"  
27 - disable-transitions>{{scope.row.status}}  
28 - </el-tag>  
29 - </template>  
30 - </el-table-column>  
31 - <el-table-column label="操作">  
32 - <template slot-scope="scope">  
33 - <el-button  
34 - size="mini"  
35 - :disabled="scope.row.name=='超级管理员'"  
36 - @click="handleEdit(scope.$index, scope.row)">编辑  
37 - </el-button>  
38 - <el-button  
39 - size="mini"  
40 - :disabled="scope.row.name=='超级管理员'"  
41 - @click="roleEdit(scope.$index, scope.row)">权限分配  
42 - </el-button>  
43 - <el-button  
44 - size="mini"  
45 - type="danger"  
46 - :disabled="scope.row.name=='超级管理员'"  
47 - @click="handleDelete(scope.$index, scope.row)">删除  
48 - </el-button>  
49 - </template>  
50 - </el-table-column>  
51 - </el-table>  
52 - <el-dialog title="角色信息" width="700px" class="dialog1" :visible.sync="dialogFormVisible">  
53 - <el-form :model="form">  
54 - <el-form-item label="角色名称" :label-width="formLabelWidth">  
55 - <el-input v-model="form.name"  
56 - maxlength="8"  
57 - show-word-limit  
58 - autocomplete="off"></el-input>  
59 - </el-form-item>  
60 - <el-form-item label="角色描述" :label-width="formLabelWidth">  
61 - <el-input v-model="form.describe"  
62 - maxlength="15"  
63 - show-word-limit  
64 - autocomplete="off"></el-input>  
65 - </el-form-item>  
66 - <el-form-item label="是否开启" :label-width="formLabelWidth">  
67 - <el-switch v-model="form.status"></el-switch>  
68 - </el-form-item>  
69 - </el-form>  
70 - <div slot="footer" class="dialog-footer">  
71 - <el-button @click="dialogFormVisible=false">取 消</el-button>  
72 - <el-button type="primary" @click="addRoleSubmit">确 定</el-button>  
73 - </div>  
74 - </el-dialog>  
75 - <el-dialog title="权限分配" class="dialog2" @opened="setRoleData" :visible.sync="dialogFormVisible2">  
76 - <el-input  
77 - placeholder="输入关键字进行过滤"  
78 - v-model="filterText"  
79 - style="margin-bottom: 20px"  
80 - >  
81 - </el-input>  
82 - <el-tree  
83 - :data="roleTree"  
84 - node-key="r_id"  
85 - show-checkbox  
86 - check-on-click-node  
87 - default-expand-all  
88 - check-strictly  
89 - :expand-on-click-node="false"  
90 - ref="permission"  
91 - :filter-node-method="filterNode"  
92 - :props="defaultProps">  
93 - </el-tree>  
94 - <div slot="footer" class="dialog-footer">  
95 - <el-button @click="dialogFormVisible2 = false">取 消</el-button>  
96 - <el-button type="primary" @click="rolePermissionSubmit">确 定</el-button>  
97 - </div>  
98 - </el-dialog>  
99 - </div>  
100 -</template>  
101 -  
102 -<script>  
103 -export default {  
104 - name: "roleManage",  
105 - data () {  
106 - return {  
107 - tableData: [],  
108 - dialogFormVisible: false,  
109 - dialogFormVisible2: false,  
110 - form: {  
111 - name: "",  
112 - describe: "",  
113 - status: true,  
114 - permission: []  
115 - },  
116 - formLabelWidth: "120px",  
117 - defaultProps: {  
118 - children: "children",  
119 - label: "r_name",  
120 - id: "r_id"  
121 - },  
122 - selectRoleId: "",  
123 - selectData: [],  
124 - filterText: ""  
125 - }  
126 - },  
127 - methods: {  
128 - handleEdit (index, row) {  
129 - for (let item in row) {  
130 - this.form[item] = row[item]  
131 - }  
132 - this.form.status = row.status === "启用"  
133 - this.dialogFormVisible = true  
134 - },  
135 - addRole () {  
136 - this.form = {  
137 - name: "",  
138 - describe: "",  
139 - status: true  
140 - }  
141 - this.dialogFormVisible = true  
142 - },  
143 - addRoleSubmit () {  
144 - let that = this  
145 - if (!this.form.name) {  
146 - that.$message({  
147 - showClose: true,  
148 - message: "角色名称不能为空",  
149 - type: "error"  
150 - })  
151 - return false  
152 - }  
153 - this.$request.fetchAddRole(this.form).then((res) => {  
154 - that.$message({  
155 - showClose: true,  
156 - message: res.data.message,  
157 - type: "success"  
158 - })  
159 - this.dialogFormVisible = false  
160 - this.getList()  
161 - }).catch((err) => {  
162 - console.log(err)  
163 - })  
164 - },  
165 - rolePermissionSubmit () {  
166 - let that = this  
167 - let rolePermissionData = {  
168 - selectPermission: that.$refs.permission.getCheckedKeys(),  
169 - rid: that.selectRoleId  
170 - }  
171 - this.$request.fetchRolePermissions(rolePermissionData).then(res => {  
172 - that.$restBack(res.data, () => {  
173 - that.dialogFormVisible2 = false  
174 - that.getList()  
175 - })  
176 - }).catch((err) => {  
177 - console.log(err)  
178 - })  
179 - },  
180 - roleEdit (index, row) {  
181 - console.log(index, row)  
182 - this.selectRoleId = row.id  
183 - this.selectData = row.permission ? row.permission.split(",") : []  
184 - this.dialogFormVisible2 = true  
185 - },  
186 - setRoleData () {  
187 - this.$request.fetchSearchRolePermissions({rid: this.selectRoleId}).then(res => {  
188 - this.$refs.permission.setCheckedKeys([])  
189 - let permissionData = res.data.data.permissionPage + "," + res.data.data.permissionButton  
190 - this.$refs.permission.setCheckedKeys(permissionData.split(","))  
191 - })  
192 - },  
193 - handleDelete (index, row) {  
194 - let that = this  
195 - this.$request.fetchDelRole({  
196 - id: row.id  
197 - })  
198 - .then(response => {  
199 - console.log(response)  
200 - that.$message({  
201 - showClose: true,  
202 - message: response.data.message,  
203 - type: "success"  
204 - })  
205 - that.getList()  
206 - })  
207 - .catch(err => {  
208 - console.log(err)  
209 - })  
210 - },  
211 - getList () {  
212 - let that = this  
213 - this.$request.fetchGetRoleList()  
214 - .then(function (response) {  
215 - console.log(response)  
216 - for (let i = 0; i < response.data.rows.length; i++) {  
217 - if (response.data.rows[i].status) {  
218 - response.data.rows[i].status = "启用"  
219 - } else {  
220 - response.data.rows[i].status = "禁用"  
221 - }  
222 - }  
223 - that.tableData = response.data.rows  
224 - })  
225 - .catch(function (error) {  
226 - console.log(error)  
227 - })  
228 - },  
229 - filterNode (value, data) {  
230 - if (!value) return true  
231 - return data.r_name.indexOf(value) !== -1  
232 - }  
233 - },  
234 - watch: {  
235 - filterText (val) {  
236 - this.$refs.permission.filter(val)  
237 - }  
238 - },  
239 - computed: {  
240 - roleTree: function () {  
241 - let roleData = this.$store.getters.roleData  
242 - for (let i = 0; i < roleData.length; i++) {  
243 - if (roleData[i].redirect === "/404") {  
244 - roleData.splice(i, 1)  
245 - }  
246 - }  
247 - return roleData  
248 - }  
249 - },  
250 - mounted () {  
251 - this.getList()  
252 - }  
253 -}  
254 -</script>  
255 -  
256 -<style scoped>  
257 - .nameinput {  
258 - width: 150px;  
259 - }  
260 -  
261 - .phoneinput {  
262 - width: 120px;  
263 - }  
264 -  
265 - .datepicker {  
266 - width: 260px;  
267 - }  
268 - .dialog1 .el-dialog {  
269 - width: 35%;  
270 - }  
271 -  
272 - .dialog1 .el-dialog .el-form {  
273 - width: 500px;  
274 - margin: 0 auto;  
275 - }  
276 -  
277 - .el-form-item__content {  
278 - margin-left: 120px;  
279 - width: 300px;  
280 - }  
281 -  
282 -</style>  
283 -