yuantianjiao 6 年之前
父節點
當前提交
ff1732d823

+ 2
- 1
package.json 查看文件

@@ -37,7 +37,8 @@
37 37
       "eslint:recommended"
38 38
     ],
39 39
     "rules": {
40
-      "no-console": "off"
40
+      "no-console": "off",
41
+      "vue/no-parsing-error": [2, { "x-invalid-end-tag": false }]
41 42
     },
42 43
     "parserOptions": {
43 44
       "parser": "babel-eslint"

+ 42
- 0
src/assets/main.css 查看文件

@@ -71,3 +71,45 @@ input[type='checkbox'] {
71 71
   transform: translate(-50%, -50%);
72 72
   -webkit-transform: translate(-50%, -50%);
73 73
 }
74
+*[class*='text-overflowEllipsis-line'] {
75
+  overflow: hidden;
76
+  text-overflow: ellipsis;
77
+  display: -webkit-box;
78
+  -webkit-box-orient: vertical;
79
+}
80
+.text-overflowEllipsis-line2 {
81
+  -webkit-line-clamp: 2;
82
+}
83
+.text-overflowEllipsis-line3 {
84
+  -webkit-line-clamp: 3;
85
+}
86
+.text-overflowEllipsis-line4 {
87
+  -webkit-line-clamp: 4;
88
+}
89
+*[class*='overflow-scroll-y'] {
90
+  overflow-x: hidden;
91
+  overflow-y: scroll;
92
+  -webkit-overflow-scrolling: touch;
93
+}
94
+*[class*='overflow-scroll-x'] {
95
+  overflow-y: hidden;
96
+  overflow-x: scroll;
97
+  -webkit-overflow-scrolling: touch;
98
+}
99
+.overflow-scroll-y-3d,
100
+.overflow-scroll-x-3d {
101
+  transform: translateZ(0);
102
+  -webkit-transform: translateZ(0);
103
+}
104
+.overflow-scroll-x::-webkit-scrollbar,
105
+.overflow-scroll-x-3d::-webkit-scrollbar {
106
+  width: 0;
107
+  height: 0;
108
+  color: transparent;
109
+  display: none;
110
+}
111
+input:focus,
112
+textarea:focus,
113
+select:focus {
114
+  outline: none;
115
+}

+ 0
- 0
src/components/menu.vue 查看文件


+ 118
- 8
src/pages/login/login.vue 查看文件

@@ -3,19 +3,27 @@
3 3
     <img :src="bg" alt="">
4 4
     <div class="login-box">
5 5
       <div class="title">微信信息管理平台</div>
6
-      <div class="user">
6
+      <div class="input">
7 7
         <i class="iconfont icon-yonghu1"></i>
8
-        <input type="text" >
8
+        <input type="text" v-model="UserName">
9 9
       </div>
10
-      <div class="password"></div>
11
-      <div>记住用户名和密码</div>
12
-      <div class="submit">登陆</div>
10
+      <div class="input">
11
+        <i class="iconfont icon-mima"></i>
12
+        <input type="password" v-model="PassWord">
13
+      </div>
14
+      <div class="remember">
15
+        <span>记住用户名密码</span>
16
+        <input type="checkbox" v-model="Remember">
17
+      </div>
18
+      <div class="submit" @click="submit()">登陆</div>
13 19
     </div>
14 20
   </div>
15 21
 </template>
16 22
 
17 23
 <script>
18 24
 import bg from '@/assets/login.jpg'
25
+import { createNamespacedHelpers } from 'vuex'
26
+const { mapState: mapLoginState, mapActions: mapLoginActions } = createNamespacedHelpers('login')
19 27
 export default {
20 28
   data () {
21 29
     return {
@@ -24,6 +32,57 @@ export default {
24 32
   },
25 33
   created () {
26 34
     // this.$Message.info('This is a info tip')
35
+    this.Remember = localStorage.getItem('remember')
36
+    if (!this.Remember) {
37
+      this.UserName = ''
38
+      this.PassWord = ''
39
+    } else {
40
+      this.UserName = localStorage.getItem('userName')
41
+      this.PassWord = localStorage.getItem('passWord')
42
+    }
43
+  },
44
+  computed: {
45
+    ...mapLoginState({
46
+      remember: item => item.remember,
47
+      userName: item => item.userName,
48
+      passWord: item => item.passWord
49
+    }),
50
+    Remember: {
51
+      get () {
52
+        return this.remember
53
+      },
54
+      set (val) {
55
+        this.setRemember(val)
56
+      }
57
+    },
58
+    UserName: {
59
+      get () {
60
+        return this.userName
61
+      },
62
+      set (val) {
63
+        this.setUserName(val)
64
+      }
65
+    },
66
+    PassWord: {
67
+      get () {
68
+        return this.passWord
69
+      },
70
+      set (val) {
71
+        this.setPassWord(val)
72
+      }
73
+    }
74
+  },
75
+  methods: {
76
+    ...mapLoginActions(['setRemember', 'setUserName', 'setPassWord', 'login']),
77
+    submit () {
78
+      this.$router.push({ name: 'index' })
79
+      this.login({ userName: this.UserName, passWord: this.PassWord }).then(() => {
80
+        if (!this.Remember) {
81
+          this.UserName = ''
82
+          this.PassWord = ''
83
+        }
84
+      })
85
+    }
27 86
   }
28 87
 }
29 88
 </script>
@@ -37,6 +96,7 @@ export default {
37 96
     width: 100%;
38 97
     height: 100%;
39 98
     object-fit: cover;
99
+    filter: brightness(70%);
40 100
   }
41 101
   .login-box {
42 102
     position: absolute;
@@ -45,11 +105,61 @@ export default {
45 105
     transform: translate(-50%, -50%);
46 106
     width: 450px;
47 107
     height: 300px;
48
-    .title{
49
-      font-size: 24px;
108
+    display: flex;
109
+    flex-flow: column nowrap;
110
+    justify-content: center;
111
+    align-items: center;
112
+    .title {
113
+      font-size: 28px;
50 114
       color: white;
51
-      letter-spacing: 4px;
115
+      letter-spacing: 6px;
116
+      text-align: center;
117
+      padding-bottom: 33px;
118
+    }
119
+    .input {
120
+      background-color: #fff;
121
+      border-radius: 8px;
122
+      width: 70%;
123
+      height: 30px;
124
+      padding: 4px;
125
+      display: flex;
126
+      overflow: hidden;
127
+      margin-bottom: 20px;
128
+      i {
129
+        font-size: 18px;
130
+        color: #999999;
131
+        padding: 0 5px;
132
+        border-right: 1px solid #999999;
133
+        &::before {
134
+          top: -2px;
135
+          position: relative;
136
+        }
137
+      }
138
+      input {
139
+        flex: 1;
140
+        padding-left: 5px;
141
+      }
142
+    }
143
+    .remember {
144
+      display: flex;
145
+      align-items: center;
146
+      justify-content: flex-end;
147
+      width: 70%;
148
+      padding-bottom: 20px;
149
+      span {
150
+        padding-right: 10px;
151
+        color: #fff;
152
+        font-size: 10px;
153
+      }
154
+    }
155
+    .submit {
156
+      width: 200px;
157
+      height: 35px;
52 158
       text-align: center;
159
+      line-height: 35px;
160
+      background-color: #00bbbd;
161
+      color: #fff;
162
+      border-radius: 12px;
53 163
     }
54 164
   }
55 165
 }

src/pages/index/index.vue → src/pages/main/index/index.vue 查看文件

@@ -1,3 +1,3 @@
1 1
 <template>
2
-  <div>aaaaa</div>
2
+  <div>bbbb</div>
3 3
 </template>

+ 120
- 0
src/pages/main/main.vue 查看文件

@@ -0,0 +1,120 @@
1
+<template>
2
+  <div class="mainPage">
3
+    <header class="top">
4
+      <div>头部</div>
5
+    </header>
6
+    <main>
7
+      <nav>
8
+        <Menu>
9
+          <div v-for="(item,index) in menus" :key="index">
10
+            <Submenu v-if="item.children" :name='item.id'>
11
+              <template slot="title">
12
+                {{item.label}}
13
+              </template>
14
+              <div v-for="(subItem,subIndex) in item.children" :key="subIndex">
15
+                <Submenu v-if="subItem.children" :name='subItem.id'>
16
+                  <template slot="title">
17
+                    {{subItem.label}}
18
+                  </template>
19
+                  <MenuItem v-for="(subItems,subIndexs) in subItem.children" :key="subIndexs" :name="subItems.id" :to='{name: subItems.Url}' >{{subItems.label}}</MenuItem>
20
+                </Submenu>
21
+                <MenuItem v-else :name="subItem.id" :to='{name: subItem.Url}' >{{subItem.label}}</MenuItem>
22
+              </div>
23
+            </Submenu>
24
+            <MenuItem v-else :name="item.id" :to='{name: item.Url}' >{{item.label}}</MenuItem>
25
+          </div>
26
+        </Menu>
27
+      </nav>
28
+      <div class="content">
29
+        <router-view/>
30
+      </div>
31
+    </main>
32
+  </div>
33
+</template>
34
+
35
+<script>
36
+import menu from './menu.json'
37
+export default {
38
+  data () {
39
+    return {
40
+      menu,
41
+      menus: []
42
+    }
43
+  },
44
+  created () {
45
+    this.menus = this.packChildren(this.menu.result.menus)
46
+    console.log(this.menus)
47
+  },
48
+  methods: {
49
+    packChildren (data) {
50
+      let cp = data.slice()
51
+      const res = []
52
+
53
+      cp.map(x => {
54
+        x.id = x.MenuId
55
+        x.label = x.MenuName
56
+        return x
57
+      })
58
+
59
+      data.forEach((it, inx) => {
60
+        let found = false
61
+        for (let i = 0; i < cp.length; i += 1) {
62
+          if (cp[i].MenuId === it.FatherId) {
63
+            found = true
64
+            if (it.IsShow === 1) {
65
+              cp[i].children = [...(cp[i].children || []), cp[inx]]
66
+            }
67
+            break
68
+          }
69
+        }
70
+
71
+        if (!found && cp[inx].IsShow === 1) {
72
+          res.push(cp[inx])
73
+        }
74
+      })
75
+
76
+      return res
77
+    }
78
+
79
+  }
80
+}
81
+</script>
82
+
83
+<style lang="scss" scoped>
84
+.mainPage {
85
+  width: 100%;
86
+  height: 100%;
87
+  position: relative;
88
+  background-color: #eee;
89
+}
90
+.top {
91
+  width: 100%;
92
+  height: 65px;
93
+  line-height: 65px;
94
+  position: absolute;
95
+  top: 0;
96
+  left: 0;
97
+  background-color: #fff;
98
+  > div {
99
+    width: 95%;
100
+    margin: 0 auto;
101
+  }
102
+}
103
+main {
104
+  display: flex;
105
+  width: 100%;
106
+  height: 100%;
107
+  padding-top: 80px;
108
+  nav {
109
+    width: 240px;
110
+    height: 100%;
111
+    background-color: #fff;
112
+    // border-right: 1px solid #dcdee2;
113
+  }
114
+  .content {
115
+    flex: 1;
116
+    padding: 10px 30px;
117
+    background-color: #fff;
118
+  }
119
+}
120
+</style>

+ 1635
- 0
src/pages/main/menu.json
文件差異過大導致無法顯示
查看文件


+ 12
- 4
src/pages/staticRouter.js 查看文件

@@ -1,11 +1,19 @@
1
-import index from '@/pages/index/index.vue'
1
+import main from '@/pages/main/main.vue' // 主体框架
2
+import index from '@/pages/main/index/index.vue' // 首页
2 3
 
3 4
 export default {
4 5
   router: [
5 6
     {
6
-      path: '/index',
7
-      name: 'index',
8
-      component: index
7
+      path: '/main',
8
+      name: 'main',
9
+      component: main,
10
+      children: [
11
+        {
12
+          path:'/',
13
+          name:'index',
14
+          component: index,
15
+        }
16
+      ]
9 17
     }
10 18
   ],
11 19
 }

+ 1
- 0
src/store/index.js 查看文件

@@ -14,6 +14,7 @@ const store = new Vuex.Store({
14 14
 Vuex.Store.prototype.$api = api
15 15
 Vuex.Store.prototype.$ajax = Ajax
16 16
 export const modules = {
17
+  login: () => require('./login').default,
17 18
 }
18 19
 
19 20
 Object.keys(modules).forEach((modKey) => {

+ 54
- 0
src/store/login.js 查看文件

@@ -0,0 +1,54 @@
1
+import ajax from '../util/ajax'
2
+import api from '../util/api'
3
+
4
+export default {
5
+  namespaced: true,
6
+  state: {
7
+    remember: null,
8
+    userName: '',
9
+    passWord: ''
10
+  },
11
+  mutations: {
12
+    updateRemember (state, data) {
13
+      state.remember = data
14
+    },
15
+    updateUserName (state, data) {
16
+      state.userName = data
17
+    },
18
+    updatePassWord (state, data) {
19
+      state.passWord = data
20
+    }
21
+  },
22
+  actions: {
23
+    login (context, data) {
24
+      return new Promise((resolve, reject) => {
25
+        ajax({
26
+          ...api.common.login,
27
+          data: {
28
+            ...data,
29
+          }
30
+        }).then(res => {
31
+          // context.commit('updateList', res)
32
+          resolve(res)
33
+        }).catch(reject)
34
+      })
35
+    },
36
+    setRemember ({ commit }, data) {
37
+      localStorage.setItem('remember', data)
38
+      if (data === 'true') {
39
+        data = true
40
+      } else if (data === 'false') {
41
+        data = false
42
+      }
43
+      commit('updateRemember', data)
44
+    },
45
+    setUserName ({ commit }, data) {
46
+      localStorage.setItem('userName', data)
47
+      commit('updateUserName', data)
48
+    },
49
+    setPassWord ({ commit }, data) {
50
+      localStorage.setItem('passWord', data)
51
+      commit('updatePassWord', data)
52
+    },
53
+  }
54
+}

+ 42
- 0
src/store/main.js 查看文件

@@ -0,0 +1,42 @@
1
+import ajax from '../util/ajax'
2
+import api from '../util/api'
3
+
4
+export default {
5
+  namespaced: true,
6
+  state: {
7
+    menu: [],
8
+  },
9
+  mutations: {
10
+    updateMenu (state, data) {
11
+      state.menu = data || []
12
+    }
13
+  },
14
+  actions: {
15
+    login (context, data) {
16
+      return new Promise((resolve, reject) => {
17
+        ajax({
18
+          ...api.common.login,
19
+          data: {
20
+            ...data,
21
+          }
22
+        }).then(res => {
23
+          // context.commit('updateList', res)
24
+          resolve(res)
25
+        }).catch(reject)
26
+      })
27
+    },
28
+    setMenu (context, data) {
29
+      return new Promise((resolve, reject) => {
30
+        ajax({
31
+          ...api.common.login,
32
+          data: {
33
+            ...data,
34
+          }
35
+        }).then(res => {
36
+          // context.commit('updateList', res)
37
+          resolve(res)
38
+        }).catch(reject)
39
+      })
40
+    }
41
+  }
42
+}

+ 6
- 1
src/util/api.js 查看文件

@@ -3,6 +3,11 @@
3 3
 // const guest = '/guest/:org'
4 4
 
5 5
 const $api = {
6
-  
6
+  common: {
7
+    login: {
8
+      url: '',
9
+      method: 'post'
10
+    }
11
+  }
7 12
 }
8 13
 export default $api