Pan 7 years ago
parent
commit
b44c7384dc
57 changed files with 675 additions and 819 deletions
  1. 117 291
      .eslintrc.js
  2. 10 1
      build/webpack.base.conf.js
  3. 9 8
      package.json
  4. 2 2
      src/App.vue
  5. 4 7
      src/api/login.js
  6. 2 4
      src/api/table.js
  7. 0 1
      src/assets/iconfont/iconfont.js
  8. 23 24
      src/components/Hamburger/index.vue
  9. 9 0
      src/icons/index.js
  10. 1 0
      src/icons/svg/404.svg
  11. 1 0
      src/icons/svg/EXCEL.svg
  12. 1 0
      src/icons/svg/QQ.svg
  13. 1 0
      src/icons/svg/a.svg
  14. 1 0
      src/icons/svg/b.svg
  15. 1 0
      src/icons/svg/bug.svg
  16. 1 0
      src/icons/svg/c.svg
  17. 1 0
      src/icons/svg/email.svg
  18. 1 0
      src/icons/svg/from.svg
  19. 1 0
      src/icons/svg/icons.svg
  20. 1 0
      src/icons/svg/mima.svg
  21. 1 0
      src/icons/svg/quanxian.svg
  22. 1 0
      src/icons/svg/shouce.svg
  23. 1 0
      src/icons/svg/tab.svg
  24. 1 0
      src/icons/svg/table.svg
  25. 1 0
      src/icons/svg/theme.svg
  26. 1 0
      src/icons/svg/tubiao.svg
  27. 1 0
      src/icons/svg/tuozhuai.svg
  28. 1 0
      src/icons/svg/weixin.svg
  29. 1 0
      src/icons/svg/wujiaoxing.svg
  30. 1 0
      src/icons/svg/xinrenzhinan.svg
  31. 1 0
      src/icons/svg/yanjing.svg
  32. 1 0
      src/icons/svg/yonghuming.svg
  33. 1 0
      src/icons/svg/zonghe.svg
  34. 1 0
      src/icons/svg/zujian.svg
  35. 6 46
      src/main.js
  36. 38 0
      src/permission.js
  37. 1 1
      src/router/_import_development.js
  38. 15 15
      src/router/index.js
  39. 1 1
      src/store/getters.js
  40. 8 8
      src/store/index.js
  41. 6 6
      src/store/modules/app.js
  42. 7 7
      src/store/modules/permission.js
  43. 35 36
      src/store/modules/user.js
  44. 19 20
      src/utils/fetch.js
  45. 18 18
      src/utils/index.js
  46. 10 11
      src/utils/validate.js
  47. 11 11
      src/views/dashboard/index.vue
  48. 12 12
      src/views/layout/AppMain.vue
  49. 22 21
      src/views/layout/Layout.vue
  50. 34 34
      src/views/layout/Levelbar.vue
  51. 42 44
      src/views/layout/Navbar.vue
  52. 14 15
      src/views/layout/Sidebar.vue
  53. 35 35
      src/views/layout/SidebarItem.vue
  54. 4 4
      src/views/layout/index.js
  55. 52 52
      src/views/login/index.vue
  56. 64 64
      src/views/page/form.vue
  57. 20 20
      src/views/table/index.vue

+ 117 - 291
.eslintrc.js

@@ -6,7 +6,8 @@ module.exports = {
6 6
     },
7 7
     env: {
8 8
         browser: true,
9
-        node: true
9
+        node: true,
10
+        es6: true,
10 11
     },
11 12
     extends: 'eslint:recommended',
12 13
     // required to lint *.vue files
@@ -22,297 +23,122 @@ module.exports = {
22 23
         }
23 24
     },
24 25
     // add your custom rules here
26
+    //it is base on https://github.com/vuejs/eslint-config-vue
25 27
     'rules': {
26
-        // don't require .vue extension when importing
27
-        // 'import/extensions': ['error', 'always', {
28
-        //     'js': 'never',
29
-        //     'vue': 'never'
30
-        // }],
31
-        // allow debugger during development
32
-        'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
33
-        /*
34
-         * Possible Errors
35
-         */
36
-
37
-        // disallow unnecessary parentheses
38
-        'no-extra-parens': ['error', 'all', {'nestedBinaryExpressions': false}],
39
-
40
-        // disallow negating the left operand of relational operators
41
-        'no-unsafe-negation': 'error',
42
-
43
-        // enforce valid JSDoc comments
44
-        'valid-jsdoc': 'off',
45
-
46
-        /*
47
-         * Best Practices
48
-         */
49
-
50
-        // enforce return statements in callbacks of array methods
51
-        'array-callback-return': 'error',
52
-
53
-        // enforce consistent brace style for all control statements
54
-        curly: ['error', 'multi-line'],
55
-
56
-        // enforce consistent newlines before and after dots
57
-        'dot-location': ['error', 'property'],
58
-
59
-        // enforce dot notation whenever possible
60
-        'dot-notation': 'error',
61
-
62
-        // require the use of === and !==
63
-        'eqeqeq': ['error', 'smart'],
64
-
65
-        // disallow the use of arguments.caller or arguments.callee
66
-        'no-caller': 'error',
67
-
68
-        // disallow empty functions
69
-        'no-empty-function': 'error',
70
-
71
-        // disallow unnecessary calls to .bind()
72
-        'no-extra-bind': 'error',
73
-
74
-        // disallow unnecessary labels
75
-        'no-extra-label': 'error',
76
-
77
-        // disallow leading or trailing decimal points in numeric literals
78
-        'no-floating-decimal': 'error',
79
-
80
-        // disallow assignments to native objects or read-only global variables
81
-        'no-global-assign': 'error',
82
-
83
-        // disallow the use of eval()-like methods
84
-        'no-implied-eval': 'error',
85
-
86
-        // disallow the use of the __iterator__ property
87
-        'no-iterator': 'error',
88
-
89
-        // disallow unnecessary nested blocks
90
-        'no-lone-blocks': 'error',
91
-
92
-        // disallow multiple spaces
93
-        'no-multi-spaces': 'error',
94
-
95
-        // disallow new operators with the String, Number, and Boolean objects
96
-        'no-new-wrappers': 'error',
97
-
98
-        // disallow octal escape sequences in string literals
99
-        'no-octal-escape': 'error',
100
-
101
-        // disallow the use of the __proto__ property
102
-        'no-proto': 'error',
103
-
104
-        // disallow comparisons where both sides are exactly the same
105
-        'no-self-compare': 'error',
106
-
107
-        // disallow throwing literals as exceptions
108
-        'no-throw-literal': 'error',
109
-
110
-        // disallow unused expressions
111
-        'no-unused-expressions': 'error',
112
-
113
-        // disallow unnecessary calls to .call() and .apply()
114
-        'no-useless-call': 'error',
115
-
116
-        // disallow unnecessary concatenation of literals or template literals
117
-        'no-useless-concat': 'error',
118
-
119
-        // disallow unnecessary escape characters
120
-        'no-useless-escape': 'error',
121
-
122
-        // disallow void operators
123
-        'no-void': 'error',
124
-
125
-        // require parentheses around immediate function invocations
126
-        'wrap-iife': 'error',
127
-
128
-        // require or disallow “Yoda” conditions
129
-        yoda: 'error',
130
-
131
-        /*
132
-         * Variables
133
-         */
134
-
135
-        // disallow labels that share a name with a variable
136
-        'no-label-var': 'error',
137
-
138
-        // disallow initializing variables to undefined
139
-        'no-undef-init': 'error',
140
-        'no-undef': 'off',
141
-        // disallow the use of variables before they are defined
142
-        'no-use-before-define': 'error',
143
-
144
-        /*
145
-         * Node.js and CommonJS
146
-         */
147
-
148
-        // disallow new operators with calls to require
149
-        'no-new-require': 'error',
150
-
151
-        /*
152
-         * Stylistic Issues
153
-         */
154
-
155
-        // enforce consistent spacing inside array brackets
156
-        'array-bracket-spacing': 'error',
157
-
158
-        // enforce consistent spacing inside single-line blocks
159
-        'block-spacing': 'error',
160
-
161
-        // enforce consistent brace style for blocks
162
-        'brace-style': ['error', '1tbs', {'allowSingleLine': true}],
163
-
164
-        // require or disallow trailing commas
165
-        'comma-dangle': 'error',
166
-
167
-        // enforce consistent spacing before and after commas
168
-        'comma-spacing': 'error',
169
-
170
-        // enforce consistent comma style
171
-        'comma-style': 'error',
172
-
173
-        // enforce consistent spacing inside computed property brackets
174
-        'computed-property-spacing': 'error',
175
-
176
-        // require or disallow spacing between function identifiers and their invocations
177
-        'func-call-spacing': 'error',
178
-
179
-        // enforce consistent indentation
180
-        indent: ['error', 2, {SwitchCase: 1}],
181
-
182
-        // enforce the consistent use of either double or single quotes in JSX attributes
183
-        'jsx-quotes': 'error',
184
-
185
-        // enforce consistent spacing between keys and values in object literal properties
186
-        'key-spacing': 'error',
187
-
188
-        // enforce consistent spacing before and after keywords
189
-        'keyword-spacing': 'error',
190
-
191
-        // enforce consistent linebreak style
192
-        'linebreak-style': 'error',
193
-
194
-        // require or disallow newlines around directives
195
-        'lines-around-directive': 'error',
196
-
197
-        // require constructor names to begin with a capital letter
198
-        'new-cap': 'off',
199
-
200
-        // require parentheses when invoking a constructor with no arguments
201
-        'new-parens': 'error',
202
-
203
-        // disallow Array constructors
204
-        'no-array-constructor': 'error',
205
-
206
-        // disallow Object constructors
207
-        'no-new-object': 'error',
208
-
209
-        // disallow trailing whitespace at the end of lines
210
-        'no-trailing-spaces': 'error',
211
-
212
-        // disallow ternary operators when simpler alternatives exist
213
-        'no-unneeded-ternary': 'error',
214
-
215
-        // disallow whitespace before properties
216
-        'no-whitespace-before-property': 'error',
217
-
218
-        // enforce consistent spacing inside braces
219
-        'object-curly-spacing': ['error', 'always'],
220
-
221
-        // require or disallow padding within blocks
222
-        'padded-blocks': ['error', 'never'],
223
-
224
-        // require quotes around object literal property names
225
-        'quote-props': ['error', 'as-needed'],
226
-
227
-        // enforce the consistent use of either backticks, double, or single quotes
228
-        quotes: ['error', 'single'],
229
-
230
-        // enforce consistent spacing before and after semicolons
231
-        'semi-spacing': 'error',
232
-
233
-        // require or disallow semicolons instead of ASI
234
-        // semi: ['error', 'never'],
235
-
236
-        // enforce consistent spacing before blocks
237
-        'space-before-blocks': 'error',
238
-
28
+        'accessor-pairs': 2,
29
+        'arrow-spacing': [2, { 'before': true, 'after': true }],
30
+        'block-spacing': [2, 'always'],
31
+        'brace-style': [2, '1tbs', { 'allowSingleLine': true }],
32
+        'camelcase': [0, { 'properties': 'always' }],
33
+        'comma-dangle': [2, 'never'],
34
+        'comma-spacing': [2, { 'before': false, 'after': true }],
35
+        'comma-style': [2, 'last'],
36
+        'constructor-super': 2,
37
+        'curly': [2, 'multi-line'],
38
+        'dot-location': [2, 'property'],
39
+        'eol-last': 2,
40
+        'eqeqeq': [2, 'allow-null'],
41
+        'generator-star-spacing': [2, { 'before': true, 'after': true }],
42
+        'handle-callback-err': [2, '^(err|error)$' ],
43
+        'indent': [2, 2, { 'SwitchCase': 1 }],
44
+        'jsx-quotes': [2, 'prefer-single'],
45
+        'key-spacing': [2, { 'beforeColon': false, 'afterColon': true }],
46
+        'keyword-spacing': [2, { 'before': true, 'after': true }],
47
+        'new-cap': [2, { 'newIsCap': true, 'capIsNew': false }],
48
+        'new-parens': 2,
49
+        'no-array-constructor': 2,
50
+        'no-caller': 2,
239 51
         'no-console': 'off',
240
-
241
-        // enforce consistent spacing before function definition opening parenthesis
242
-        'space-before-function-paren': ['error', 'never'],
243
-
244
-        // enforce consistent spacing inside parentheses
245
-        'space-in-parens': 'error',
246
-
247
-        // require spacing around infix operators
248
-        'space-infix-ops': 'error',
249
-
250
-        // enforce consistent spacing before or after unary operators
251
-        'space-unary-ops': 'error',
252
-
253
-        // enforce consistent spacing after the // or /* in a comment
254
-        'spaced-comment': 'error',
255
-
256
-        // require or disallow Unicode byte order mark (BOM)
257
-        'unicode-bom': 'error',
258
-
259
-
260
-        /*
261
-         * ECMAScript 6
262
-         */
263
-
264
-        // require braces around arrow function bodies
265
-        'arrow-body-style': 'error',
266
-
267
-        // require parentheses around arrow function arguments
268
-        'arrow-parens': ['error', 'as-needed'],
269
-
270
-        // enforce consistent spacing before and after the arrow in arrow functions
271
-        'arrow-spacing': 'error',
272
-
273
-        // enforce consistent spacing around * operators in generator functions
274
-        'generator-star-spacing': ['error', 'after'],
275
-
276
-        // disallow duplicate module imports
277
-        'no-duplicate-imports': 'error',
278
-
279
-        // disallow unnecessary computed property keys in object literals
280
-        'no-useless-computed-key': 'error',
281
-
282
-        // disallow unnecessary constructors
283
-        'no-useless-constructor': 'error',
284
-
285
-        // disallow renaming import, export, and destructured assignments to the same name
286
-        'no-useless-rename': 'error',
287
-
288
-        // require let or const instead of var
289
-        'no-var': 'error',
290
-
291
-        // require or disallow method and property shorthand syntax for object literals
292
-        'object-shorthand': 'error',
293
-
294
-        // require arrow functions as callbacks
295
-        'prefer-arrow-callback': 'error',
296
-
297
-        // require const declarations for variables that are never reassigned after declared
298
-        'prefer-const': 'error',
299
-
300
-        // disallow parseInt() in favor of binary, octal, and hexadecimal literals
301
-        'prefer-numeric-literals': 'error',
302
-
303
-        // require rest parameters instead of arguments
304
-        'prefer-rest-params': 'error',
305
-
306
-        // require spread operators instead of .apply()
307
-        'prefer-spread': 'error',
308
-
309
-        // enforce spacing between rest and spread operators and their expressions
310
-        'rest-spread-spacing': 'error',
311
-
312
-        // require or disallow spacing around embedded expressions of template strings
313
-        'template-curly-spacing': 'error',
314
-
315
-        // require or disallow spacing around the * in yield* expressions
316
-        'yield-star-spacing': 'error'
52
+        'no-class-assign': 2,
53
+        'no-cond-assign': 2,
54
+        'no-const-assign': 2,
55
+        'no-control-regex': 2,
56
+        'no-delete-var': 2,
57
+        'no-dupe-args': 2,
58
+        'no-dupe-class-members': 2,
59
+        'no-dupe-keys': 2,
60
+        'no-duplicate-case': 2,
61
+        'no-empty-character-class': 2,
62
+        'no-empty-pattern': 2,
63
+        'no-eval': 2,
64
+        'no-ex-assign': 2,
65
+        'no-extend-native': 2,
66
+        'no-extra-bind': 2,
67
+        'no-extra-boolean-cast': 2,
68
+        'no-extra-parens': [2, 'functions'],
69
+        'no-fallthrough': 2,
70
+        'no-floating-decimal': 2,
71
+        'no-func-assign': 2,
72
+        'no-implied-eval': 2,
73
+        'no-inner-declarations': [2, 'functions'],
74
+        'no-invalid-regexp': 2,
75
+        'no-irregular-whitespace': 2,
76
+        'no-iterator': 2,
77
+        'no-label-var': 2,
78
+        'no-labels': [2, { 'allowLoop': false, 'allowSwitch': false }],
79
+        'no-lone-blocks': 2,
80
+        'no-mixed-spaces-and-tabs': 2,
81
+        'no-multi-spaces': 2,
82
+        'no-multi-str': 2,
83
+        'no-multiple-empty-lines': [2, { 'max': 1 }],
84
+        'no-native-reassign': 2,
85
+        'no-negated-in-lhs': 2,
86
+        'no-new-object': 2,
87
+        'no-new-require': 2,
88
+        'no-new-symbol': 2,
89
+        'no-new-wrappers': 2,
90
+        'no-obj-calls': 2,
91
+        'no-octal': 2,
92
+        'no-octal-escape': 2,
93
+        'no-path-concat': 2,
94
+        'no-proto': 2,
95
+        'no-redeclare': 2,
96
+        'no-regex-spaces': 2,
97
+        'no-return-assign': [2, 'except-parens'],
98
+        'no-self-assign': 2,
99
+        'no-self-compare': 2,
100
+        'no-sequences': 2,
101
+        'no-shadow-restricted-names': 2,
102
+        'no-spaced-func': 2,
103
+        'no-sparse-arrays': 2,
104
+        'no-this-before-super': 2,
105
+        'no-throw-literal': 2,
106
+        'no-trailing-spaces': 2,
107
+        'no-undef': 2,
108
+        'no-undef-init': 2,
109
+        'no-unexpected-multiline': 2,
110
+        'no-unmodified-loop-condition': 2,
111
+        'no-unneeded-ternary': [2, { 'defaultAssignment': false }],
112
+        'no-unreachable': 2,
113
+        'no-unsafe-finally': 2,
114
+        'no-unused-vars': [2, { 'vars': 'all', 'args': 'none' }],
115
+        'no-useless-call': 2,
116
+        'no-useless-computed-key': 2,
117
+        'no-useless-constructor': 2,
118
+        'no-useless-escape': 0,
119
+        'no-whitespace-before-property': 2,
120
+        'no-with': 2,
121
+        'one-var': [2, { 'initialized': 'never' }],
122
+        'operator-linebreak': [2, 'after', { 'overrides': { '?': 'before', ':': 'before' } }],
123
+        'padded-blocks': [2, 'never'],
124
+        'quotes': [2, 'single', { 'avoidEscape': true, 'allowTemplateLiterals': true }],
125
+        'semi': [2, 'never'],
126
+        'semi-spacing': [2, { 'before': false, 'after': true }],
127
+        'space-before-blocks': [2, 'always'],
128
+        'space-before-function-paren': [2, 'never'],
129
+        'space-in-parens': [2, 'never'],
130
+        'space-infix-ops': 2,
131
+        'space-unary-ops': [2, { 'words': true, 'nonwords': false }],
132
+        'spaced-comment': [2, 'always', { 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] }],
133
+        'template-curly-spacing': [2, 'never'],
134
+        'use-isnan': 2,
135
+        'valid-typeof': 2,
136
+        'wrap-iife': [2, 'any'],
137
+        'yield-star-spacing': [2, 'both'],
138
+        'yoda': [2, 'never'],
139
+        'prefer-const': 2,
140
+        'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
141
+        'object-curly-spacing': [2, 'always', { objectsInObjects: false }],
142
+        'array-bracket-spacing': [2, 'never']
317 143
     }
318 144
 }

+ 10 - 1
build/webpack.base.conf.js

@@ -47,9 +47,18 @@ module.exports = {
47 47
         include: [resolve('src'), resolve('test')]
48 48
       },
49 49
       {
50
+        test: /\.svg$/,
51
+        loader: 'svg-sprite-loader',
52
+        include: [resolve('src/icons')],
53
+        options: {
54
+          symbolId: 'icon-[name]'
55
+        }
56
+      },
57
+      {
50 58
         test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
51 59
         loader: 'url-loader',
52
-        options: {
60
+        exclude: [resolve('src/icons')],
61
+        query: {
53 62
           limit: 10000,
54 63
           name: utils.assetsPath('img/[name].[hash:7].[ext]')
55 64
         }

+ 9 - 8
package.json

@@ -12,12 +12,12 @@
12 12
   },
13 13
   "dependencies": {
14 14
     "axios": "0.16.2",
15
-    "element-ui": "1.3.7",
16
-    "js-cookie": "^2.1.4",
17
-    "normalize.css": "3.0.2",
18
-    "nprogress": "^0.2.0",
19
-    "vue": "2.3.3",
20
-    "vue-router": "2.5.3",
15
+    "element-ui": "1.4.3",
16
+    "js-cookie": "2.1.4",
17
+    "normalize.css": "7.0.0",
18
+    "nprogress": "0.2.0",
19
+    "vue": "2.4.2",
20
+    "vue-router": "2.7.0",
21 21
     "vuex": "2.3.1"
22 22
   },
23 23
   "devDependencies": {
@@ -53,10 +53,11 @@
53 53
     "rimraf": "2.6.0",
54 54
     "node-sass": "^4.5.0",
55 55
     "sass-loader": "6.0.5",
56
+    "svg-sprite-loader": "3.2.4",
56 57
     "url-loader": "0.5.8",
57
-    "vue-loader": "12.1.0",
58
+    "vue-loader": "13.0.4",
58 59
     "vue-style-loader": "3.0.1",
59
-    "vue-template-compiler": "2.3.3",
60
+    "vue-template-compiler": "2.4.2",
60 61
     "webpack": "2.6.1",
61 62
     "webpack-dev-middleware": "1.10.0",
62 63
     "webpack-hot-middleware": "2.18.0",

+ 2 - 2
src/App.vue

@@ -9,8 +9,8 @@ export default {
9 9
   name: 'app'
10 10
 }
11 11
 </script>
12
+
12 13
 <style lang="scss">
14
+  @import '~normalize.css/normalize.css';// normalize.css 样式格式化
13 15
   @import './styles/index.scss'; // 全局自定义的css样式
14 16
 </style>
15
-
16
-

+ 4 - 7
src/api/login.js

@@ -1,4 +1,4 @@
1
-import fetch from '@/utils/fetch';
1
+import fetch from '@/utils/fetch'
2 2
 
3 3
 export function login(email, password) {
4 4
   return fetch({
@@ -8,7 +8,7 @@ export function login(email, password) {
8 8
       email,
9 9
       password
10 10
     }
11
-  });
11
+  })
12 12
 }
13 13
 
14 14
 export function getInfo(token) {
@@ -16,15 +16,12 @@ export function getInfo(token) {
16 16
     url: '/user/info',
17 17
     method: 'get',
18 18
     params: { token }
19
-  });
19
+  })
20 20
 }
21 21
 
22 22
 export function logout() {
23 23
   return fetch({
24 24
     url: '/user/logout',
25 25
     method: 'post'
26
-  });
26
+  })
27 27
 }
28
-
29
-
30
-

+ 2 - 4
src/api/table.js

@@ -1,11 +1,9 @@
1
-import fetch from '@/utils/fetch';
1
+import fetch from '@/utils/fetch'
2 2
 
3 3
 export function getList(params) {
4 4
   return fetch({
5 5
     url: '/table/list',
6 6
     method: 'get',
7 7
     params
8
-  });
8
+  })
9 9
 }
10
-
11
-

File diff suppressed because it is too large
+ 0 - 1
src/assets/iconfont/iconfont.js


+ 23 - 24
src/components/Hamburger/index.vue

@@ -1,32 +1,31 @@
1 1
 <template>
2
-    <div>
3
-        <svg t="1492500959545" @click="toggleClick" class="svg-icon hamburger" :class="{'is-active':isActive}" style="" viewBox="0 0 1024 1024"
4
-            version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1691" xmlns:xlink="http://www.w3.org/1999/xlink" width="64"
5
-            height="64">
6
-            <path d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"
7
-                p-id="1692"></path>
8
-            <path d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"
9
-                p-id="1693"></path>
10
-            <path d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"
11
-                p-id="1694"></path>
12
-        </svg>
13
-    </div>
2
+  <div>
3
+    <svg t="1492500959545" @click="toggleClick" class="svg-icon hamburger" :class="{'is-active':isActive}" style="" viewBox="0 0 1024 1024"
4
+      version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1691" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64">
5
+      <path d="M966.8023 568.849776 57.196677 568.849776c-31.397081 0-56.850799-25.452695-56.850799-56.850799l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 543.397081 998.200404 568.849776 966.8023 568.849776z"
6
+        p-id="1692"></path>
7
+      <path d="M966.8023 881.527125 57.196677 881.527125c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.849776 56.850799-56.849776l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.849776l0 0C1023.653099 856.07443 998.200404 881.527125 966.8023 881.527125z"
8
+        p-id="1693"></path>
9
+      <path d="M966.8023 256.17345 57.196677 256.17345c-31.397081 0-56.850799-25.452695-56.850799-56.849776l0 0c0-31.397081 25.452695-56.850799 56.850799-56.850799l909.605623 0c31.397081 0 56.849776 25.452695 56.849776 56.850799l0 0C1023.653099 230.720755 998.200404 256.17345 966.8023 256.17345z"
10
+        p-id="1694"></path>
11
+    </svg>
12
+  </div>
14 13
 </template>
15 14
 
16 15
 <script>
17
-    export default {
18
-      name: 'hamburger',
19
-      props: {
20
-        isActive: {
21
-          type: Boolean,
22
-          default: false
23
-        },
24
-        toggleClick: {
25
-          type: Function,
26
-          default: null
27
-        }
28
-      }
16
+export default {
17
+  name: 'hamburger',
18
+  props: {
19
+    isActive: {
20
+      type: Boolean,
21
+      default: false
22
+    },
23
+    toggleClick: {
24
+      type: Function,
25
+      default: null
29 26
     }
27
+  }
28
+}
30 29
 </script>
31 30
 
32 31
 <style scoped>

+ 9 - 0
src/icons/index.js

@@ -0,0 +1,9 @@
1
+import Vue from 'vue'
2
+import IconSvg from '@/components/Icon-svg'// svg组件
3
+
4
+// register globally
5
+Vue.component('icon-svg', IconSvg)
6
+
7
+const requireAll = requireContext => requireContext.keys().map(requireContext)
8
+const req = require.context('./svg', false, /\.svg$/)
9
+requireAll(req)

File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/404.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/EXCEL.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/QQ.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/a.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/b.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/bug.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/c.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/email.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/from.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/icons.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/mima.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/quanxian.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/shouce.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/tab.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/table.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/theme.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/tubiao.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/tuozhuai.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/weixin.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/wujiaoxing.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/xinrenzhinan.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/yanjing.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/yonghuming.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/zonghe.svg


File diff suppressed because it is too large
+ 1 - 0
src/icons/svg/zujian.svg


+ 6 - 46
src/main.js

@@ -1,55 +1,15 @@
1
-// The Vue build version to load with the `import` command
2
-// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 1
 import Vue from 'vue'
2
+import ElementUI from 'element-ui'
3
+import 'element-ui/lib/theme-default/index.css'
4 4
 import App from './App'
5 5
 import router from './router'
6 6
 import store from './store'
7
-import ElementUI from 'element-ui'
8
-import 'element-ui/lib/theme-default/index.css'
9
-import NProgress from 'nprogress'
10
-import 'nprogress/nprogress.css'
11
-import 'normalize.css/normalize.css'
12
-import '@/assets/iconfont/iconfont'
13
-import IconSvg from '@/components/Icon-svg/index.vue'
14
-import { getToken } from '@/utils/auth'
7
+import '@/icons' // icon
8
+import '@/permission' // 权限
15 9
 
16
-Vue.config.productionTip = false
17
-
18
-Vue.use(ElementUI);
19
-Vue.component('icon-svg', IconSvg)
10
+Vue.use(ElementUI)
20 11
 
21
-const whiteList = ['/login'];
22
-router.beforeEach((to, from, next) => {
23
-  NProgress.start();
24
-  if (getToken()) {
25
-    if (to.path === '/login') {
26
-      next({ path: '/' });
27
-    } else {
28
-      if (store.getters.roles.length === 0) {
29
-        store.dispatch('GetInfo').then(res => {
30
-          const roles = res.data.role;
31
-          store.dispatch('GenerateRoutes', { roles }).then(() => {
32
-            router.addRoutes(store.getters.addRouters);
33
-            next({ ...to });
34
-          })
35
-        })
36
-      } else {
37
-        next();
38
-      }
39
-    }
40
-  } else {
41
-    if (whiteList.indexOf(to.path) !== -1) {
42
-      next()
43
-    } else {
44
-      next('/login');
45
-      NProgress.done();
46
-    }
47
-  }
48
-});
49
-
50
-router.afterEach(() => {
51
-  NProgress.done();
52
-});
12
+Vue.config.productionTip = false
53 13
 
54 14
 new Vue({
55 15
   el: '#app',

+ 38 - 0
src/permission.js

@@ -0,0 +1,38 @@
1
+import router from './router'
2
+import store from './store'
3
+import NProgress from 'nprogress' // Progress 进度条
4
+import 'nprogress/nprogress.css'// Progress 进度条样式
5
+import { getToken } from '@/utils/auth' // 验权
6
+
7
+const whiteList = ['/login']
8
+router.beforeEach((to, from, next) => {
9
+  NProgress.start()
10
+  if (getToken()) {
11
+    if (to.path === '/login') {
12
+      next({ path: '/' })
13
+    } else {
14
+      if (store.getters.roles.length === 0) {
15
+        store.dispatch('GetInfo').then(res => {
16
+          const roles = res.data.role
17
+          store.dispatch('GenerateRoutes', { roles }).then(() => {
18
+            router.addRoutes(store.getters.addRouters)
19
+            next({ ...to })
20
+          })
21
+        })
22
+      } else {
23
+        next()
24
+      }
25
+    }
26
+  } else {
27
+    if (whiteList.indexOf(to.path) !== -1) {
28
+      next()
29
+    } else {
30
+      next('/login')
31
+      NProgress.done()
32
+    }
33
+  }
34
+})
35
+
36
+router.afterEach(() => {
37
+  NProgress.done() // 结束Progress
38
+})

+ 1 - 1
src/router/_import_development.js

@@ -1 +1 @@
1
-module.exports = file => require('@/views/' + file + '.vue')
1
+module.exports = file => require('@/views/' + file + '.vue').default

+ 15 - 15
src/router/index.js

@@ -1,25 +1,25 @@
1
-import Vue from 'vue';
2
-import Router from 'vue-router';
3
-const _import = require('./_import_' + process.env.NODE_ENV);
4
-// in development env not use Lazy Loading,because Lazy Loading large page will cause webpack hot update too slow.so only in production use Lazy Loading
1
+import Vue from 'vue'
2
+import Router from 'vue-router'
3
+const _import = require('./_import_' + process.env.NODE_ENV)
4
+// in development env not use Lazy Loading,because Lazy Loading too many pages will cause webpack hot update too slow.so only in production use Lazy Loading
5 5
 
6 6
 /* layout */
7
-import Layout from '../views/layout/Layout';
7
+import Layout from '../views/layout/Layout'
8 8
 
9 9
 /* login */
10
-const Login = _import('login/index');
10
+const Login = _import('login/index')
11 11
 
12 12
 /* dashboard */
13
-const dashboard = _import('dashboard/index');
13
+const dashboard = _import('dashboard/index')
14 14
 
15 15
 /* error page */
16
-const Err404 = _import('404');
16
+const Err404 = _import('404')
17 17
 
18 18
 /* demo page */
19
-const Form = _import('page/form');
20
-const Table = _import('table/index');
19
+const Form = _import('page/form')
20
+const Table = _import('table/index')
21 21
 
22
-Vue.use(Router);
22
+Vue.use(Router)
23 23
 
24 24
  /**
25 25
   * icon : the icon show in the sidebar
@@ -45,7 +45,7 @@ export default new Router({
45 45
   // mode: 'history', //后端支持可开
46 46
   scrollBehavior: () => ({ y: 0 }),
47 47
   routes: constantRouterMap
48
-});
48
+})
49 49
 
50 50
 export const asyncRouterMap = [
51 51
   {
@@ -63,10 +63,10 @@ export const asyncRouterMap = [
63 63
     path: '/table',
64 64
     component: Layout,
65 65
     redirect: '/table/index',
66
-    icon: 'tubiaoleixingzhengchang',
66
+    icon: 'tubiao',
67 67
     noDropdown: true,
68
-    children: [{ path: 'index', component: Table, name: 'Table', meta: { role: ['admin'] } }]
68
+    children: [{ path: 'index', component: Table, name: 'Table', meta: { role: ['admin'] }}]
69 69
   },
70 70
 
71 71
   { path: '*', redirect: '/404', hidden: true }
72
-];
72
+]

+ 1 - 1
src/store/getters.js

@@ -6,5 +6,5 @@ const getters = {
6 6
   roles: state => state.user.roles,
7 7
   permission_routers: state => state.permission.routers,
8 8
   addRouters: state => state.permission.addRouters
9
-};
9
+}
10 10
 export default getters

+ 8 - 8
src/store/index.js

@@ -1,11 +1,11 @@
1
-import Vue from 'vue';
2
-import Vuex from 'vuex';
3
-import app from './modules/app';
4
-import user from './modules/user';
5
-import permission from './modules/permission';
6
-import getters from './getters';
1
+import Vue from 'vue'
2
+import Vuex from 'vuex'
3
+import app from './modules/app'
4
+import user from './modules/user'
5
+import permission from './modules/permission'
6
+import getters from './getters'
7 7
 
8
-Vue.use(Vuex);
8
+Vue.use(Vuex)
9 9
 
10 10
 const store = new Vuex.Store({
11 11
   modules: {
@@ -14,6 +14,6 @@ const store = new Vuex.Store({
14 14
     permission
15 15
   },
16 16
   getters
17
-});
17
+})
18 18
 
19 19
 export default store

+ 6 - 6
src/store/modules/app.js

@@ -1,4 +1,4 @@
1
-import Cookies from 'js-cookie';
1
+import Cookies from 'js-cookie'
2 2
 
3 3
 const app = {
4 4
   state: {
@@ -9,11 +9,11 @@ const app = {
9 9
   mutations: {
10 10
     TOGGLE_SIDEBAR: state => {
11 11
       if (state.sidebar.opened) {
12
-        Cookies.set('sidebarStatus', 1);
12
+        Cookies.set('sidebarStatus', 1)
13 13
       } else {
14
-        Cookies.set('sidebarStatus', 0);
14
+        Cookies.set('sidebarStatus', 0)
15 15
       }
16
-      state.sidebar.opened = !state.sidebar.opened;
16
+      state.sidebar.opened = !state.sidebar.opened
17 17
     }
18 18
   },
19 19
   actions: {
@@ -21,6 +21,6 @@ const app = {
21 21
       commit('TOGGLE_SIDEBAR')
22 22
     }
23 23
   }
24
-};
24
+}
25 25
 
26
-export default app;
26
+export default app

+ 7 - 7
src/store/modules/permission.js

@@ -1,4 +1,4 @@
1
-import { asyncRouterMap, constantRouterMap } from '@/router/index';
1
+import { asyncRouterMap, constantRouterMap } from '@/router/index'
2 2
 
3 3
 /**
4 4
  * 通过meta.role判断是否与当前用户权限匹配
@@ -38,8 +38,8 @@ const permission = {
38 38
   },
39 39
   mutations: {
40 40
     SET_ROUTERS: (state, routers) => {
41
-      state.addRouters = routers;
42
-      state.routers = constantRouterMap.concat(routers);
41
+      state.addRouters = routers
42
+      state.routers = constantRouterMap.concat(routers)
43 43
     }
44 44
   },
45 45
   actions: {
@@ -52,11 +52,11 @@ const permission = {
52 52
         } else {
53 53
           accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
54 54
         }
55
-        commit('SET_ROUTERS', accessedRouters);
56
-        resolve();
55
+        commit('SET_ROUTERS', accessedRouters)
56
+        resolve()
57 57
       })
58 58
     }
59 59
   }
60
-};
60
+}
61 61
 
62
-export default permission;
62
+export default permission

+ 35 - 36
src/store/modules/user.js

@@ -1,5 +1,5 @@
1
-import { login, logout, getInfo } from '@/api/login';
2
-import { getToken, setToken, removeToken } from '@/utils/auth';
1
+import { login, logout, getInfo } from '@/api/login'
2
+import { getToken, setToken, removeToken } from '@/utils/auth'
3 3
 
4 4
 const user = {
5 5
   state: {
@@ -11,74 +11,73 @@ const user = {
11 11
 
12 12
   mutations: {
13 13
     SET_TOKEN: (state, token) => {
14
-      state.token = token;
14
+      state.token = token
15 15
     },
16 16
     SET_NAME: (state, name) => {
17
-      state.name = name;
17
+      state.name = name
18 18
     },
19 19
     SET_AVATAR: (state, avatar) => {
20
-      state.avatar = avatar;
20
+      state.avatar = avatar
21 21
     },
22 22
     SET_ROLES: (state, roles) => {
23
-      state.roles = roles;
23
+      state.roles = roles
24 24
     }
25 25
   },
26 26
 
27 27
   actions: {
28 28
     // 登录
29 29
     Login({ commit }, userInfo) {
30
-      const email = userInfo.email.trim();
30
+      const email = userInfo.email.trim()
31 31
       return new Promise((resolve, reject) => {
32 32
         login(email, userInfo.password).then(response => {
33
-          const data = response.data;
34
-          setToken(data.token);
35
-          commit('SET_TOKEN', data.token);
36
-          resolve();
33
+          const data = response.data
34
+          setToken(data.token)
35
+          commit('SET_TOKEN', data.token)
36
+          resolve()
37 37
         }).catch(error => {
38
-          reject(error);
39
-        });
40
-      });
38
+          reject(error)
39
+        })
40
+      })
41 41
     },
42 42
 
43
-
44 43
     // 获取用户信息
45 44
     GetInfo({ commit, state }) {
46 45
       return new Promise((resolve, reject) => {
47 46
         getInfo(state.token).then(response => {
48
-          const data = response.data;
49
-          commit('SET_ROLES', data.role);
50
-          commit('SET_NAME', data.name);
51
-          commit('SET_AVATAR', data.avatar);
52
-          resolve(response);
47
+          const data = response.data
48
+          commit('SET_ROLES', data.role)
49
+          commit('SET_NAME', data.name)
50
+          commit('SET_AVATAR', data.avatar)
51
+          resolve(response)
53 52
         }).catch(error => {
54
-          reject(error);
55
-        });
56
-      });
53
+          reject(error)
54
+        })
55
+      })
57 56
     },
58 57
 
59 58
     // 登出
60 59
     LogOut({ commit, state }) {
61 60
       return new Promise((resolve, reject) => {
62 61
         logout(state.token).then(() => {
63
-          commit('SET_TOKEN', '');
64
-          commit('SET_ROLES', []);
65
-          removeToken();
66
-          resolve();
62
+          commit('SET_TOKEN', '')
63
+          commit('SET_ROLES', [])
64
+          removeToken()
65
+          resolve()
67 66
         }).catch(error => {
68
-          reject(error);
69
-        });
70
-      });
67
+          reject(error)
68
+        })
69
+      })
71 70
     },
72 71
 
73 72
     // 前端 登出
74 73
     FedLogOut({ commit }) {
75 74
       return new Promise(resolve => {
76
-        commit('SET_TOKEN', '');
77
-        removeToken();
78
-        resolve();
79
-      });
75
+        commit('SET_TOKEN', '')
76
+        removeToken()
77
+        resolve()
78
+      })
80 79
     }
81 80
   }
82
-};
81
+}
83 82
 
84
-export default user;
83
+export default user

+ 19 - 20
src/utils/fetch.js

@@ -1,25 +1,24 @@
1
-import axios from 'axios';
2
-import { Message } from 'element-ui';
3
-import store from '../store';
4
-import { getToken } from '@/utils/auth';
5
-
1
+import axios from 'axios'
2
+import { Message } from 'element-ui'
3
+import store from '../store'
4
+import { getToken } from '@/utils/auth'
6 5
 
7 6
 // 创建axios实例
8 7
 const service = axios.create({
9 8
   baseURL: process.env.BASE_API, // api的base_url
10 9
   timeout: 15000                  // 请求超时时间
11
-});
10
+})
12 11
 
13 12
 // request拦截器
14 13
 service.interceptors.request.use(config => {
15 14
   if (store.getters.token) {
16
-    config.headers['X-Token'] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
15
+    config.headers['X-Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
17 16
   }
18
-  return config;
17
+  return config
19 18
 }, error => {
20 19
   // Do something with request error
21
-  console.log(error); // for debug
22
-  Promise.reject(error);
20
+  console.log(error) // for debug
21
+  Promise.reject(error)
23 22
 })
24 23
 
25 24
 // respone拦截器
@@ -28,13 +27,13 @@ service.interceptors.response.use(
28 27
   /**
29 28
   * code为非20000是抛错 可结合自己业务进行修改
30 29
   */
31
-    const res = response.data;
30
+    const res = response.data
32 31
     if (res.code !== 20000) {
33 32
       Message({
34 33
         message: res.data,
35 34
         type: 'error',
36 35
         duration: 5 * 1000
37
-      });
36
+      })
38 37
 
39 38
       // 50008:非法的token; 50012:其他客户端登录了;  50014:Token 过期了;
40 39
       if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
@@ -44,24 +43,24 @@ service.interceptors.response.use(
44 43
           type: 'warning'
45 44
         }).then(() => {
46 45
           store.dispatch('FedLogOut').then(() => {
47
-            location.reload();// 为了重新实例化vue-router对象 避免bug
48
-          });
46
+            location.reload()// 为了重新实例化vue-router对象 避免bug
47
+          })
49 48
         })
50 49
       }
51
-      return Promise.reject('error');
50
+      return Promise.reject('error')
52 51
     } else {
53
-      return response.data;
52
+      return response.data
54 53
     }
55 54
   },
56 55
   error => {
57
-    console.log('err' + error);// for debug
56
+    console.log('err' + error)// for debug
58 57
     Message({
59 58
       message: error.message,
60 59
       type: 'error',
61 60
       duration: 5 * 1000
62
-    });
63
-    return Promise.reject(error);
61
+    })
62
+    return Promise.reject(error)
64 63
   }
65 64
 )
66 65
 
67
-export default service;
66
+export default service

+ 18 - 18
src/utils/index.js

@@ -4,15 +4,15 @@
4 4
 
5 5
  export function parseTime(time, cFormat) {
6 6
    if (arguments.length === 0) {
7
-     return null;
7
+     return null
8 8
    }
9
-   const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
10
-   let date;
11
-   if (typeof time == 'object') {
12
-     date = time;
9
+   const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
10
+   let date
11
+   if (typeof time === 'object') {
12
+     date = time
13 13
    } else {
14
-     if (('' + time).length === 10) time = parseInt(time) * 1000;
15
-     date = new Date(time);
14
+     if (('' + time).length === 10) time = parseInt(time) * 1000
15
+     date = new Date(time)
16 16
    }
17 17
    const formatObj = {
18 18
      y: date.getFullYear(),
@@ -22,24 +22,24 @@
22 22
      i: date.getMinutes(),
23 23
      s: date.getSeconds(),
24 24
      a: date.getDay()
25
-   };
25
+   }
26 26
    const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
27
-     let value = formatObj[key];
28
-     if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1];
27
+     let value = formatObj[key]
28
+     if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
29 29
      if (result.length > 0 && value < 10) {
30
-       value = '0' + value;
30
+       value = '0' + value
31 31
      }
32
-     return value || 0;
33
-   });
34
-   return time_str;
32
+     return value || 0
33
+   })
34
+   return time_str
35 35
  }
36 36
 
37 37
  export function formatTime(time, option) {
38
-   time = +time * 1000;
39
-   const d = new Date(time);
40
-   const now = Date.now();
38
+   time = +time * 1000
39
+   const d = new Date(time)
40
+   const now = Date.now()
41 41
 
42
-   const diff = (now - d) / 1000;
42
+   const diff = (now - d) / 1000
43 43
 
44 44
    if (diff < 30) {
45 45
      return '刚刚'

+ 10 - 11
src/utils/validate.js

@@ -4,32 +4,31 @@
4 4
 
5 5
 /* 是否是公司邮箱*/
6 6
 export function isWscnEmail(str) {
7
-  const reg = /^[a-z0-9](?:[-_.+]?[a-z0-9]+)*@wallstreetcn\.com$/i;
8
-  return reg.test(str.trim());
7
+  const reg = /^[a-z0-9](?:[-_.+]?[a-z0-9]+)*@wallstreetcn\.com$/i
8
+  return reg.test(str.trim())
9 9
 }
10 10
 
11 11
 /* 合法uri*/
12 12
 export function validateURL(textval) {
13
-  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
14
-  return urlregex.test(textval);
13
+  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
14
+  return urlregex.test(textval)
15 15
 }
16 16
 
17 17
 /* 小写字母*/
18 18
 export function validateLowerCase(str) {
19
-  const reg = /^[a-z]+$/;
20
-  return reg.test(str);
19
+  const reg = /^[a-z]+$/
20
+  return reg.test(str)
21 21
 }
22 22
 
23 23
 /* 大写字母*/
24 24
 export function validateUpperCase(str) {
25
-  const reg = /^[A-Z]+$/;
26
-  return reg.test(str);
25
+  const reg = /^[A-Z]+$/
26
+  return reg.test(str)
27 27
 }
28 28
 
29 29
 /* 大小写字母*/
30 30
 export function validatAlphabets(str) {
31
-  const reg = /^[A-Za-z]+$/;
32
-  return reg.test(str);
31
+  const reg = /^[A-Za-z]+$/
32
+  return reg.test(str)
33 33
 }
34 34
 
35
-

+ 11 - 11
src/views/dashboard/index.vue

@@ -6,19 +6,19 @@
6 6
 </template>
7 7
 
8 8
 <script>
9
-    import { mapGetters } from 'vuex';
10
-    export default {
11
-      name: 'dashboard',
12
-      computed: {
13
-        ...mapGetters([
14
-          'name',
15
-          'roles'
16
-        ])
17
-      }
18
-    }
9
+import { mapGetters } from 'vuex'
10
+export default {
11
+  name: 'dashboard',
12
+  computed: {
13
+    ...mapGetters([
14
+      'name',
15
+      'roles'
16
+    ])
17
+  }
18
+}
19 19
 </script>
20 20
 
21
-<style rel="stylesheet/scss" lang="scss">
21
+<style rel="stylesheet/scss" lang="scss" scoped>
22 22
 .dashboard {
23 23
   &-container {
24 24
     margin: 30px;

+ 12 - 12
src/views/layout/AppMain.vue

@@ -1,18 +1,18 @@
1 1
 <template>
2
-    <section class="app-main">
3
-        <transition name="fade" mode="out-in">
4
-            <router-view :key="key"></router-view>
5
-        </transition>
6
-    </section>
2
+  <section class="app-main">
3
+    <transition name="fade" mode="out-in">
4
+      <router-view :key="key"></router-view>
5
+    </transition>
6
+  </section>
7 7
 </template>
8 8
 
9 9
 <script>
10
-    export default {
11
-      name: 'AppMain',
12
-      computed: {
13
-        key() {
14
-          return this.$route.name !== undefined ? this.$route.name + +new Date() : this.$route + +new Date()
15
-        }
16
-      }
10
+export default {
11
+  name: 'AppMain',
12
+  computed: {
13
+    key() {
14
+      return this.$route.name !== undefined ? this.$route.name + +new Date() : this.$route + +new Date()
17 15
     }
16
+  }
17
+}
18 18
 </script>

+ 22 - 21
src/views/layout/Layout.vue

@@ -1,31 +1,32 @@
1 1
 <template>
2
-    <div class="app-wrapper" :class="{hideSidebar:!sidebar.opened}">
3
-        <div class="sidebar-wrapper">
4
-            <sidebar class="sidebar-container"></sidebar>
5
-        </div>
6
-        <div class="main-container">
7
-            <navbar></navbar>
8
-            <app-main></app-main>
9
-        </div>
2
+  <div class="app-wrapper" :class="{hideSidebar:!sidebar.opened}">
3
+    <div class="sidebar-wrapper">
4
+      <sidebar class="sidebar-container"></sidebar>
10 5
     </div>
6
+    <div class="main-container">
7
+      <navbar></navbar>
8
+      <app-main></app-main>
9
+    </div>
10
+  </div>
11 11
 </template>
12 12
 
13
+
13 14
 <script>
14
-    import { Navbar, Sidebar, AppMain } from '@/views/layout';
15
+import { Navbar, Sidebar, AppMain } from '@/views/layout'
15 16
 
16
-    export default {
17
-      name: 'layout',
18
-      components: {
19
-        Navbar,
20
-        Sidebar,
21
-        AppMain
22
-      },
23
-      computed: {
24
-        sidebar() {
25
-          return this.$store.state.app.sidebar;
26
-        }
27
-      }
17
+export default {
18
+  name: 'layout',
19
+  components: {
20
+    Navbar,
21
+    Sidebar,
22
+    AppMain
23
+  },
24
+  computed: {
25
+    sidebar() {
26
+      return this.$store.state.app.sidebar
28 27
     }
28
+  }
29
+}
29 30
 </script>
30 31
 
31 32
 <style rel="stylesheet/scss" lang="scss" scoped>

+ 34 - 34
src/views/layout/Levelbar.vue

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
   <el-breadcrumb class="app-levelbar" separator="/">
3
-    <el-breadcrumb-item v-for="(item,index)  in levelList" :key="item">
3
+    <el-breadcrumb-item v-for="(item,index)  in levelList" :key="item.path">
4 4
       <router-link v-if='item.redirect==="noredirect"||index==levelList.length-1' to="" class="no-redirect">{{item.name}}</router-link>
5 5
       <router-link v-else :to="item.redirect||item.path">{{item.name}}</router-link>
6 6
     </el-breadcrumb-item>
@@ -8,42 +8,42 @@
8 8
 </template>
9 9
 
10 10
 <script>
11
-    export default {
12
-      created() {
13
-        this.getBreadcrumb()
14
-      },
15
-      data() {
16
-        return {
17
-          levelList: null
18
-        }
19
-      },
20
-      methods: {
21
-        getBreadcrumb() {
22
-          let matched = this.$route.matched.filter(item => item.name);
23
-          const first = matched[0];
24
-          if (first && (first.name !== '首页' || first.path !== '')) {
25
-            matched = [{ name: '首页', path: '/' }].concat(matched)
26
-          }
27
-          this.levelList = matched;
28
-        }
29
-      },
30
-      watch: {
31
-        $route() {
32
-          this.getBreadcrumb();
33
-        }
11
+export default {
12
+  created() {
13
+    this.getBreadcrumb()
14
+  },
15
+  data() {
16
+    return {
17
+      levelList: null
18
+    }
19
+  },
20
+  methods: {
21
+    getBreadcrumb() {
22
+      let matched = this.$route.matched.filter(item => item.name)
23
+      const first = matched[0]
24
+      if (first && (first.name !== '首页' || first.path !== '')) {
25
+        matched = [{ name: '首页', path: '/' }].concat(matched)
34 26
       }
27
+      this.levelList = matched
28
+    }
29
+  },
30
+  watch: {
31
+    $route() {
32
+      this.getBreadcrumb()
35 33
     }
34
+  }
35
+}
36 36
 </script>
37 37
 
38 38
 <style rel="stylesheet/scss" lang="scss" scoped>
39
-    .app-levelbar.el-breadcrumb {
40
-      display: inline-block;
41
-      font-size: 14px;
42
-      line-height: 50px;
43
-      margin-left: 10px;
44
-      .no-redirect {
45
-        color: #97a8be;
46
-        cursor: text;
47
-      }
48
-    }
39
+.app-levelbar.el-breadcrumb {
40
+  display: inline-block;
41
+  font-size: 14px;
42
+  line-height: 50px;
43
+  margin-left: 10px;
44
+  .no-redirect {
45
+    color: #97a8be;
46
+    cursor: text;
47
+  }
48
+}
49 49
 </style>

+ 42 - 44
src/views/layout/Navbar.vue

@@ -1,51 +1,51 @@
1 1
 <template>
2
-    <el-menu class="navbar" mode="horizontal">
3
-        <hamburger class="hamburger-container" :toggleClick="toggleSideBar" :isActive="sidebar.opened"></hamburger>
4
-        <levelbar></levelbar>
5
-        <el-dropdown class="avatar-container" trigger="click">
6
-            <div class="avatar-wrapper">
7
-                <img class="user-avatar" :src="avatar+'?imageView2/1/w/80/h/80'">
8
-                <i class="el-icon-caret-bottom"></i>
9
-            </div>
10
-            <el-dropdown-menu class="user-dropdown" slot="dropdown">
11
-                <router-link class='inlineBlock' to="/">
12
-                    <el-dropdown-item>
13
-                        Home
14
-                    </el-dropdown-item>
15
-                </router-link>
16
-                <el-dropdown-item divided><span @click="logout" style="display:block;">LogOut</span></el-dropdown-item>
17
-            </el-dropdown-menu>
18
-        </el-dropdown>
19
-    </el-menu>
2
+  <el-menu class="navbar" mode="horizontal">
3
+    <hamburger class="hamburger-container" :toggleClick="toggleSideBar" :isActive="sidebar.opened"></hamburger>
4
+    <levelbar></levelbar>
5
+    <el-dropdown class="avatar-container" trigger="click">
6
+      <div class="avatar-wrapper">
7
+        <img class="user-avatar" :src="avatar+'?imageView2/1/w/80/h/80'">
8
+        <i class="el-icon-caret-bottom"></i>
9
+      </div>
10
+      <el-dropdown-menu class="user-dropdown" slot="dropdown">
11
+        <router-link class='inlineBlock' to="/">
12
+          <el-dropdown-item>
13
+            Home
14
+          </el-dropdown-item>
15
+        </router-link>
16
+        <el-dropdown-item divided><span @click="logout" style="display:block;">LogOut</span></el-dropdown-item>
17
+      </el-dropdown-menu>
18
+    </el-dropdown>
19
+  </el-menu>
20 20
 </template>
21 21
 
22 22
 <script>
23
-    import { mapGetters } from 'vuex';
24
-    import Levelbar from './Levelbar';
25
-    import Hamburger from '@/components/Hamburger';
23
+import { mapGetters } from 'vuex'
24
+import Levelbar from './Levelbar'
25
+import Hamburger from '@/components/Hamburger'
26 26
 
27
-    export default {
28
-      components: {
29
-        Levelbar,
30
-        Hamburger
31
-      },
32
-      computed: {
33
-        ...mapGetters([
34
-          'sidebar',
35
-          'avatar'
36
-        ])
37
-      },
38
-      methods: {
39
-        toggleSideBar() {
40
-          this.$store.dispatch('ToggleSideBar')
41
-        },
42
-        logout() {
43
-          this.$store.dispatch('LogOut').then(() => {
44
-            location.reload();  // 为了重新实例化vue-router对象 避免bug
45
-          });
46
-        }
47
-      }
27
+export default {
28
+  components: {
29
+    Levelbar,
30
+    Hamburger
31
+  },
32
+  computed: {
33
+    ...mapGetters([
34
+      'sidebar',
35
+      'avatar'
36
+    ])
37
+  },
38
+  methods: {
39
+    toggleSideBar() {
40
+      this.$store.dispatch('ToggleSideBar')
41
+    },
42
+    logout() {
43
+      this.$store.dispatch('LogOut').then(() => {
44
+        location.reload()  // 为了重新实例化vue-router对象 避免bug
45
+      })
48 46
     }
47
+  }
48
+}
49 49
 </script>
50 50
 
51 51
 <style rel="stylesheet/scss" lang="scss" scoped>
@@ -95,5 +95,3 @@
95 95
     }
96 96
 </style>
97 97
 
98
-
99
-

+ 14 - 15
src/views/layout/Sidebar.vue

@@ -1,25 +1,24 @@
1 1
 <template>
2
-    <el-menu mode="vertical" theme="dark" :default-active="$route.path">
3
-        <sidebar-item :routes='permission_routers'></sidebar-item>
4
-    </el-menu>
2
+  <el-menu mode="vertical" theme="dark" :default-active="$route.path">
3
+    <sidebar-item :routes='permission_routers'></sidebar-item>
4
+  </el-menu>
5 5
 </template>
6 6
 
7 7
 <script>
8
-    import { mapGetters } from 'vuex';
9
-    import SidebarItem from './SidebarItem';
10
-    export default {
11
-      components: { SidebarItem },
12
-      computed: {
13
-        ...mapGetters([
14
-          'permission_routers'
15
-        ])
16
-      }
17
-    }
8
+import { mapGetters } from 'vuex'
9
+import SidebarItem from './SidebarItem'
10
+export default {
11
+  components: { SidebarItem },
12
+  computed: {
13
+    ...mapGetters([
14
+      'permission_routers'
15
+    ])
16
+  }
17
+}
18 18
 </script>
19 19
 
20 20
 <style rel="stylesheet/scss" lang="scss" scoped>
21 21
 .el-menu {
22
-    min-height: 100%;
22
+  min-height: 100%;
23 23
 }
24
-
25 24
 </style>

+ 35 - 35
src/views/layout/SidebarItem.vue

@@ -1,46 +1,46 @@
1 1
 <template>
2
-    <div>
3
-        <template v-for="item in routes">
4
-            <router-link v-if="!item.hidden&&item.noDropdown&&item.children.length>0" :to="item.path+'/'+item.children[0].path">
5
-                <el-menu-item :index="item.path+'/'+item.children[0].path">
6
-                    <icon-svg v-if='item.icon' :icon-class="item.icon" /> {{item.children[0].name}}
7
-                </el-menu-item>
8
-            </router-link>
9
-            <el-submenu :index="item.name" v-if="!item.noDropdown&&!item.hidden">
10
-                <template slot="title">
11
-                    <icon-svg v-if='item.icon' :icon-class="item.icon" /> {{item.name}}
12
-                </template>
13
-                <template v-for="child in item.children" v-if='!child.hidden'>
14
-                    <sidebar-item class='menu-indent' v-if='child.children&&child.children.length>0' :routes='[child]'> </sidebar-item>
15
-                    <router-link v-else class="menu-indent" :to="item.path+'/'+child.path">
16
-                        <el-menu-item :index="item.path+'/'+child.path">
17
-                            {{child.name}}
18
-                        </el-menu-item>
19
-                    </router-link>
20
-                </template>
21
-            </el-submenu>
2
+  <div>
3
+    <template v-for="item in routes">
4
+      <router-link v-if="!item.hidden&&item.noDropdown&&item.children.length>0" :to="item.path+'/'+item.children[0].path">
5
+        <el-menu-item :index="item.path+'/'+item.children[0].path">
6
+          <icon-svg v-if='item.icon' :icon-class="item.icon" /> {{item.children[0].name}}
7
+        </el-menu-item>
8
+      </router-link>
9
+      <el-submenu :index="item.name" v-if="!item.noDropdown&&!item.hidden">
10
+        <template slot="title">
11
+          <icon-svg v-if='item.icon' :icon-class="item.icon" /> {{item.name}}
22 12
         </template>
23
-    </div>
13
+        <template v-for="child in item.children" v-if='!child.hidden'>
14
+          <sidebar-item class='menu-indent' v-if='child.children&&child.children.length>0' :routes='[child]'> </sidebar-item>
15
+          <router-link v-else class="menu-indent" :to="item.path+'/'+child.path">
16
+            <el-menu-item :index="item.path+'/'+child.path">
17
+              {{child.name}}
18
+            </el-menu-item>
19
+          </router-link>
20
+        </template>
21
+      </el-submenu>
22
+    </template>
23
+  </div>
24 24
 </template>
25 25
 
26 26
 <script>
27
-    export default {
28
-      name: 'SidebarItem',
29
-      props: {
30
-        routes: {
31
-          type: Array
32
-        }
33
-      }
27
+export default {
28
+  name: 'SidebarItem',
29
+  props: {
30
+    routes: {
31
+      type: Array
34 32
     }
33
+  }
34
+}
35 35
 </script>
36 36
 
37 37
 <style rel="stylesheet/scss" lang="scss" scoped>
38
-    .svg-icon {
39
-        margin-right: 10px;
40
-    }
41
-    .hideSidebar .menu-indent{
42
-        display: block;
43
-        text-indent: 10px;
44
-    }
38
+.svg-icon {
39
+  margin-right: 10px;
40
+}
41
+.hideSidebar .menu-indent{
42
+  display: block;
43
+  text-indent: 10px;
44
+}
45 45
 </style>
46 46
 

+ 4 - 4
src/views/layout/index.js

@@ -1,7 +1,7 @@
1
-export { default as Navbar } from './Navbar';
1
+export { default as Navbar } from './Navbar'
2 2
 
3
-export { default as Sidebar } from './Sidebar';
3
+export { default as Sidebar } from './Sidebar'
4 4
 
5
-export { default as Levelbar } from './Levelbar';
5
+export { default as Levelbar } from './Levelbar'
6 6
 
7
-export { default as AppMain } from './AppMain';
7
+export { default as AppMain } from './AppMain'

+ 52 - 52
src/views/login/index.vue

@@ -5,14 +5,14 @@
5 5
       <h3 class="title">系统登录</h3>
6 6
       <el-form-item prop="email">
7 7
         <span class="svg-container">
8
-                  <icon-svg icon-class="jiedianyoujian"></icon-svg>
9
-                </span>
8
+          <icon-svg icon-class="email"></icon-svg>
9
+        </span>
10 10
         <el-input name="email" type="text" v-model="loginForm.email" autoComplete="on" placeholder="邮箱"></el-input>
11 11
       </el-form-item>
12 12
       <el-form-item prop="password">
13 13
         <span class="svg-container">
14
-                  <icon-svg icon-class="mima" ></icon-svg>
15
-                </span>
14
+          <icon-svg icon-class="mima" ></icon-svg>
15
+        </span>
16 16
         <el-input name="password" type="password" @keyup.enter.native="handleLogin" v-model="loginForm.password" autoComplete="on"
17 17
           placeholder="密码"></el-input>
18 18
       </el-form-item>
@@ -28,60 +28,60 @@
28 28
 </template>
29 29
 
30 30
 <script>
31
-    import { isWscnEmail } from '@/utils/validate';
31
+import { isWscnEmail } from '@/utils/validate'
32 32
 
33
-    export default {
34
-      name: 'login',
35
-      data() {
36
-        const validateEmail = (rule, value, callback) => {
37
-          if (!isWscnEmail(value)) {
38
-            callback(new Error('请输入正确的合法邮箱'));
39
-          } else {
40
-            callback();
41
-          }
42
-        };
43
-        const validatePass = (rule, value, callback) => {
44
-          if (value.length < 6) {
45
-            callback(new Error('密码不能小于6位'));
46
-          } else {
47
-            callback();
48
-          }
49
-        };
50
-        return {
51
-          loginForm: {
52
-            email: 'admin@wallstreetcn.com',
53
-            password: '111111'
54
-          },
55
-          loginRules: {
56
-            email: [
33
+export default {
34
+  name: 'login',
35
+  data() {
36
+    const validateEmail = (rule, value, callback) => {
37
+      if (!isWscnEmail(value)) {
38
+        callback(new Error('请输入正确的合法邮箱'))
39
+      } else {
40
+        callback()
41
+      }
42
+    }
43
+    const validatePass = (rule, value, callback) => {
44
+      if (value.length < 6) {
45
+        callback(new Error('密码不能小于6位'))
46
+      } else {
47
+        callback()
48
+      }
49
+    }
50
+    return {
51
+      loginForm: {
52
+        email: 'admin@wallstreetcn.com',
53
+        password: '111111'
54
+      },
55
+      loginRules: {
56
+        email: [
57 57
                 { required: true, trigger: 'blur', validator: validateEmail }
58
-            ],
59
-            password: [
58
+        ],
59
+        password: [
60 60
                 { required: true, trigger: 'blur', validator: validatePass }
61
-            ]
62
-          },
63
-          loading: false
64
-        }
61
+        ]
65 62
       },
66
-      methods: {
67
-        handleLogin() {
68
-          this.$refs.loginForm.validate(valid => {
69
-            if (valid) {
70
-              this.loading = true;
71
-              this.$store.dispatch('Login', this.loginForm).then(() => {
72
-                this.loading = false;
73
-                this.$router.push({ path: '/' });
74
-              }).catch(() => {
75
-                this.loading = false;
76
-              });
77
-            } else {
78
-              console.log('error submit!!');
79
-              return false;
80
-            }
81
-          });
63
+      loading: false
64
+    }
65
+  },
66
+  methods: {
67
+    handleLogin() {
68
+      this.$refs.loginForm.validate(valid => {
69
+        if (valid) {
70
+          this.loading = true
71
+          this.$store.dispatch('Login', this.loginForm).then(() => {
72
+            this.loading = false
73
+            this.$router.push({ path: '/' })
74
+          }).catch(() => {
75
+            this.loading = false
76
+          })
77
+        } else {
78
+          console.log('error submit!!')
79
+          return false
82 80
         }
83
-      }
81
+      })
84 82
     }
83
+  }
84
+}
85 85
 </script>
86 86
 
87 87
 <style rel="stylesheet/scss" lang="scss">

+ 64 - 64
src/views/page/form.vue

@@ -1,72 +1,72 @@
1 1
 <template>
2
-    <div class="app-container">
3
-        <el-form ref="form" :model="form" label-width="80px">
4
-            <el-form-item label="活动名称">
5
-                <el-input v-model="form.name"></el-input>
6
-            </el-form-item>
7
-            <el-form-item label="活动区域">
8
-                <el-select v-model="form.region" placeholder="请选择活动区域">
9
-                    <el-option label="区域一" value="shanghai"></el-option>
10
-                    <el-option label="区域二" value="beijing"></el-option>
11
-                </el-select>
12
-            </el-form-item>
13
-            <el-form-item label="活动时间">
14
-                <el-col :span="11">
15
-                    <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
16
-                </el-col>
17
-                <el-col class="line" :span="2">-</el-col>
18
-                <el-col :span="11">
19
-                    <el-time-picker type="fixed-time" placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
20
-                </el-col>
21
-            </el-form-item>
22
-            <el-form-item label="即时配送">
23
-                <el-switch on-text="" off-text="" v-model="form.delivery"></el-switch>
24
-            </el-form-item>
25
-            <el-form-item label="活动性质">
26
-                <el-checkbox-group v-model="form.type">
27
-                    <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
28
-                    <el-checkbox label="地推活动" name="type"></el-checkbox>
29
-                    <el-checkbox label="线下主题活动" name="type"></el-checkbox>
30
-                    <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
31
-                </el-checkbox-group>
32
-            </el-form-item>
33
-            <el-form-item label="特殊资源">
34
-                <el-radio-group v-model="form.resource">
35
-                    <el-radio label="线上品牌商赞助"></el-radio>
36
-                    <el-radio label="线下场地免费"></el-radio>
37
-                </el-radio-group>
38
-            </el-form-item>
39
-            <el-form-item label="活动形式">
40
-                <el-input type="textarea" v-model="form.desc"></el-input>
41
-            </el-form-item>
42
-            <el-form-item>
43
-                <el-button type="primary" @click="onSubmit">立即创建</el-button>
44
-                <el-button>取消</el-button>
45
-            </el-form-item>
46
-        </el-form>
47
-    </div>
2
+  <div class="app-container">
3
+    <el-form ref="form" :model="form" label-width="80px">
4
+      <el-form-item label="活动名称">
5
+        <el-input v-model="form.name"></el-input>
6
+      </el-form-item>
7
+      <el-form-item label="活动区域">
8
+        <el-select v-model="form.region" placeholder="请选择活动区域">
9
+          <el-option label="区域一" value="shanghai"></el-option>
10
+          <el-option label="区域二" value="beijing"></el-option>
11
+        </el-select>
12
+      </el-form-item>
13
+      <el-form-item label="活动时间">
14
+        <el-col :span="11">
15
+          <el-date-picker type="date" placeholder="选择日期" v-model="form.date1" style="width: 100%;"></el-date-picker>
16
+        </el-col>
17
+        <el-col class="line" :span="2">-</el-col>
18
+        <el-col :span="11">
19
+          <el-time-picker type="fixed-time" placeholder="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
20
+        </el-col>
21
+      </el-form-item>
22
+      <el-form-item label="即时配送">
23
+        <el-switch on-text="" off-text="" v-model="form.delivery"></el-switch>
24
+      </el-form-item>
25
+      <el-form-item label="活动性质">
26
+        <el-checkbox-group v-model="form.type">
27
+          <el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
28
+          <el-checkbox label="地推活动" name="type"></el-checkbox>
29
+          <el-checkbox label="线下主题活动" name="type"></el-checkbox>
30
+          <el-checkbox label="单纯品牌曝光" name="type"></el-checkbox>
31
+        </el-checkbox-group>
32
+      </el-form-item>
33
+      <el-form-item label="特殊资源">
34
+        <el-radio-group v-model="form.resource">
35
+          <el-radio label="线上品牌商赞助"></el-radio>
36
+          <el-radio label="线下场地免费"></el-radio>
37
+        </el-radio-group>
38
+      </el-form-item>
39
+      <el-form-item label="活动形式">
40
+        <el-input type="textarea" v-model="form.desc"></el-input>
41
+      </el-form-item>
42
+      <el-form-item>
43
+        <el-button type="primary" @click="onSubmit">立即创建</el-button>
44
+        <el-button>取消</el-button>
45
+      </el-form-item>
46
+    </el-form>
47
+  </div>
48 48
 </template>
49 49
 
50 50
 <script>
51
-  export default {
52
-    data() {
53
-      return {
54
-        form: {
55
-          name: '',
56
-          region: '',
57
-          date1: '',
58
-          date2: '',
59
-          delivery: false,
60
-          type: [],
61
-          resource: '',
62
-          desc: ''
63
-        }
64
-      }
65
-    },
66
-    methods: {
67
-      onSubmit() {
68
-        console.log('submit!');
51
+export default {
52
+  data() {
53
+    return {
54
+      form: {
55
+        name: '',
56
+        region: '',
57
+        date1: '',
58
+        date2: '',
59
+        delivery: false,
60
+        type: [],
61
+        resource: '',
62
+        desc: ''
69 63
       }
70 64
     }
65
+  },
66
+  methods: {
67
+    onSubmit() {
68
+      console.log('submit!')
69
+    }
71 70
   }
71
+}
72 72
 </script>

+ 20 - 20
src/views/table/index.vue

@@ -33,26 +33,26 @@
33 33
 </template>
34 34
 
35 35
 <script>
36
-  import { getList } from '@/api/table';
36
+import { getList } from '@/api/table'
37 37
 
38
-  export default {
39
-    data() {
40
-      return {
41
-        list: null,
42
-        listLoading: true
43
-      }
44
-    },
45
-    created() {
46
-      this.fetchData();
47
-    },
48
-    methods: {
49
-      fetchData() {
50
-        this.listLoading = true;
51
-        getList(this.listQuery).then(response => {
52
-          this.list = response.data.items;
53
-          this.listLoading = false;
54
-        })
55
-      }
38
+export default {
39
+  data() {
40
+    return {
41
+      list: null,
42
+      listLoading: true
56 43
     }
57
-  };
44
+  },
45
+  created() {
46
+    this.fetchData()
47
+  },
48
+  methods: {
49
+    fetchData() {
50
+      this.listLoading = true
51
+      getList(this.listQuery).then(response => {
52
+        this.list = response.data.items
53
+        this.listLoading = false
54
+      })
55
+    }
56
+  }
57
+}
58 58
 </script>