傅行帆 6 年前
父节点
当前提交
1fef79e307
共有 84 个文件被更改,包括 3529 次插入8 次删除
  1. 12
    0
      VUECODE/smart-operate-manage/.babelrc
  2. 14
    0
      VUECODE/smart-operate-manage/.editorconfig
  3. 3
    0
      VUECODE/smart-operate-manage/.eslintignore
  4. 196
    0
      VUECODE/smart-operate-manage/.eslintrc.js
  5. 15
    0
      VUECODE/smart-operate-manage/.gitignore
  6. 10
    0
      VUECODE/smart-operate-manage/.postcssrc.js
  7. 5
    0
      VUECODE/smart-operate-manage/.travis.yml
  8. 21
    0
      VUECODE/smart-operate-manage/LICENSE
  9. 96
    0
      VUECODE/smart-operate-manage/README-zh.md
  10. 88
    0
      VUECODE/smart-operate-manage/README.md
  11. 45
    0
      VUECODE/smart-operate-manage/build/build.js
  12. 64
    0
      VUECODE/smart-operate-manage/build/check-versions.js
  13. 二进制
      VUECODE/smart-operate-manage/build/logo.png
  14. 108
    0
      VUECODE/smart-operate-manage/build/utils.js
  15. 5
    0
      VUECODE/smart-operate-manage/build/vue-loader.conf.js
  16. 107
    0
      VUECODE/smart-operate-manage/build/webpack.base.conf.js
  17. 95
    0
      VUECODE/smart-operate-manage/build/webpack.dev.conf.js
  18. 178
    0
      VUECODE/smart-operate-manage/build/webpack.prod.conf.js
  19. 8
    0
      VUECODE/smart-operate-manage/config/dev.env.js
  20. 87
    0
      VUECODE/smart-operate-manage/config/index.js
  21. 5
    0
      VUECODE/smart-operate-manage/config/prod.env.js
  22. 二进制
      VUECODE/smart-operate-manage/favicon.ico
  23. 12
    0
      VUECODE/smart-operate-manage/index.html
  24. 85
    0
      VUECODE/smart-operate-manage/package.json
  25. 11
    0
      VUECODE/smart-operate-manage/src/App.vue
  26. 38
    0
      VUECODE/smart-operate-manage/src/api/login.js
  27. 9
    0
      VUECODE/smart-operate-manage/src/api/table.js
  28. 二进制
      VUECODE/smart-operate-manage/src/assets/404_images/404.png
  29. 二进制
      VUECODE/smart-operate-manage/src/assets/404_images/404_cloud.png
  30. 61
    0
      VUECODE/smart-operate-manage/src/components/Breadcrumb/index.vue
  31. 58
    0
      VUECODE/smart-operate-manage/src/components/Hamburger/index.vue
  32. 43
    0
      VUECODE/smart-operate-manage/src/components/SvgIcon/index.vue
  33. 9
    0
      VUECODE/smart-operate-manage/src/icons/index.js
  34. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/example.svg
  35. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/eye.svg
  36. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/form.svg
  37. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/link.svg
  38. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/nested.svg
  39. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/password.svg
  40. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/table.svg
  41. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/tree.svg
  42. 1
    0
      VUECODE/smart-operate-manage/src/icons/svg/user.svg
  43. 22
    0
      VUECODE/smart-operate-manage/src/icons/svgo.yml
  44. 27
    0
      VUECODE/smart-operate-manage/src/main.js
  45. 41
    0
      VUECODE/smart-operate-manage/src/permission.js
  46. 79
    0
      VUECODE/smart-operate-manage/src/router/index.js
  47. 9
    0
      VUECODE/smart-operate-manage/src/store/getters.js
  48. 17
    0
      VUECODE/smart-operate-manage/src/store/index.js
  49. 43
    0
      VUECODE/smart-operate-manage/src/store/modules/app.js
  50. 99
    0
      VUECODE/smart-operate-manage/src/store/modules/user.js
  51. 29
    0
      VUECODE/smart-operate-manage/src/styles/element-ui.scss
  52. 78
    0
      VUECODE/smart-operate-manage/src/styles/index.scss
  53. 27
    0
      VUECODE/smart-operate-manage/src/styles/mixin.scss
  54. 133
    0
      VUECODE/smart-operate-manage/src/styles/sidebar.scss
  55. 46
    0
      VUECODE/smart-operate-manage/src/styles/transition.scss
  56. 4
    0
      VUECODE/smart-operate-manage/src/styles/variables.scss
  57. 15
    0
      VUECODE/smart-operate-manage/src/utils/auth.js
  58. 74
    0
      VUECODE/smart-operate-manage/src/utils/index.js
  59. 73
    0
      VUECODE/smart-operate-manage/src/utils/request.js
  60. 38
    0
      VUECODE/smart-operate-manage/src/utils/validate.js
  61. 228
    0
      VUECODE/smart-operate-manage/src/views/404.vue
  62. 32
    0
      VUECODE/smart-operate-manage/src/views/dashboard/index.vue
  63. 85
    0
      VUECODE/smart-operate-manage/src/views/form/index.vue
  64. 69
    0
      VUECODE/smart-operate-manage/src/views/layout/Layout.vue
  65. 29
    0
      VUECODE/smart-operate-manage/src/views/layout/components/AppMain.vue
  66. 94
    0
      VUECODE/smart-operate-manage/src/views/layout/components/Navbar.vue
  67. 29
    0
      VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/Item.vue
  68. 39
    0
      VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/Link.vue
  69. 101
    0
      VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/SidebarItem.vue
  70. 35
    0
      VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/index.vue
  71. 3
    0
      VUECODE/smart-operate-manage/src/views/layout/components/index.js
  72. 41
    0
      VUECODE/smart-operate-manage/src/views/layout/mixin/ResizeHandler.js
  73. 188
    0
      VUECODE/smart-operate-manage/src/views/login/index.vue
  74. 7
    0
      VUECODE/smart-operate-manage/src/views/nested/menu1/index.vue
  75. 7
    0
      VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-1/index.vue
  76. 7
    0
      VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-2/index.vue
  77. 5
    0
      VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue
  78. 5
    0
      VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue
  79. 5
    0
      VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-3/index.vue
  80. 5
    0
      VUECODE/smart-operate-manage/src/views/nested/menu2/index.vue
  81. 78
    0
      VUECODE/smart-operate-manage/src/views/table/index.vue
  82. 78
    0
      VUECODE/smart-operate-manage/src/views/tree/index.vue
  83. 0
    0
      VUECODE/smart-operate-manage/static/.gitkeep
  84. 8
    8
      文档/MYSQL/smartCommunity.pdm

+ 12
- 0
VUECODE/smart-operate-manage/.babelrc 查看文件

1
+{
2
+  "presets": [
3
+    ["env", {
4
+      "modules": false,
5
+      "targets": {
6
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7
+      }
8
+    }],
9
+    "stage-2"
10
+  ],
11
+  "plugins":["transform-vue-jsx", "transform-runtime"]
12
+}

+ 14
- 0
VUECODE/smart-operate-manage/.editorconfig 查看文件

1
+# http://editorconfig.org
2
+root = true
3
+
4
+[*]
5
+charset = utf-8
6
+indent_style = space
7
+indent_size = 2
8
+end_of_line = lf
9
+insert_final_newline = true
10
+trim_trailing_whitespace = true
11
+
12
+[*.md]
13
+insert_final_newline = false
14
+trim_trailing_whitespace = false

+ 3
- 0
VUECODE/smart-operate-manage/.eslintignore 查看文件

1
+build/*.js
2
+config/*.js
3
+src/assets

+ 196
- 0
VUECODE/smart-operate-manage/.eslintrc.js 查看文件

1
+module.exports = {
2
+  root: true,
3
+  parserOptions: {
4
+    parser: 'babel-eslint',
5
+    sourceType: 'module'
6
+  },
7
+  env: {
8
+    browser: true,
9
+    node: true,
10
+    es6: true,
11
+  },
12
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
13
+
14
+  // add your custom rules here
15
+  //it is base on https://github.com/vuejs/eslint-config-vue
16
+  rules: {
17
+    "vue/max-attributes-per-line": [2, {
18
+      "singleline": 10,
19
+      "multiline": {
20
+        "max": 1,
21
+        "allowFirstLine": false
22
+      }
23
+    }],
24
+    "vue/name-property-casing": ["error", "PascalCase"],
25
+    'accessor-pairs': 2,
26
+    'arrow-spacing': [2, {
27
+      'before': true,
28
+      'after': true
29
+    }],
30
+    'block-spacing': [2, 'always'],
31
+    'brace-style': [2, '1tbs', {
32
+      'allowSingleLine': true
33
+    }],
34
+    'camelcase': [0, {
35
+      'properties': 'always'
36
+    }],
37
+    'comma-dangle': [2, 'never'],
38
+    'comma-spacing': [2, {
39
+      'before': false,
40
+      'after': true
41
+    }],
42
+    'comma-style': [2, 'last'],
43
+    'constructor-super': 2,
44
+    'curly': [2, 'multi-line'],
45
+    'dot-location': [2, 'property'],
46
+    'eol-last': 2,
47
+    'eqeqeq': [2, 'allow-null'],
48
+    'generator-star-spacing': [2, {
49
+      'before': true,
50
+      'after': true
51
+    }],
52
+    'handle-callback-err': [2, '^(err|error)$'],
53
+    'indent': [2, 2, {
54
+      'SwitchCase': 1
55
+    }],
56
+    'jsx-quotes': [2, 'prefer-single'],
57
+    'key-spacing': [2, {
58
+      'beforeColon': false,
59
+      'afterColon': true
60
+    }],
61
+    'keyword-spacing': [2, {
62
+      'before': true,
63
+      'after': true
64
+    }],
65
+    'new-cap': [2, {
66
+      'newIsCap': true,
67
+      'capIsNew': false
68
+    }],
69
+    'new-parens': 2,
70
+    'no-array-constructor': 2,
71
+    'no-caller': 2,
72
+    'no-console': 'off',
73
+    'no-class-assign': 2,
74
+    'no-cond-assign': 2,
75
+    'no-const-assign': 2,
76
+    'no-control-regex': 2,
77
+    'no-delete-var': 2,
78
+    'no-dupe-args': 2,
79
+    'no-dupe-class-members': 2,
80
+    'no-dupe-keys': 2,
81
+    'no-duplicate-case': 2,
82
+    'no-empty-character-class': 2,
83
+    'no-empty-pattern': 2,
84
+    'no-eval': 2,
85
+    'no-ex-assign': 2,
86
+    'no-extend-native': 2,
87
+    'no-extra-bind': 2,
88
+    'no-extra-boolean-cast': 2,
89
+    'no-extra-parens': [2, 'functions'],
90
+    'no-fallthrough': 2,
91
+    'no-floating-decimal': 2,
92
+    'no-func-assign': 2,
93
+    'no-implied-eval': 2,
94
+    'no-inner-declarations': [2, 'functions'],
95
+    'no-invalid-regexp': 2,
96
+    'no-irregular-whitespace': 2,
97
+    'no-iterator': 2,
98
+    'no-label-var': 2,
99
+    'no-labels': [2, {
100
+      'allowLoop': false,
101
+      'allowSwitch': false
102
+    }],
103
+    'no-lone-blocks': 2,
104
+    'no-mixed-spaces-and-tabs': 2,
105
+    'no-multi-spaces': 2,
106
+    'no-multi-str': 2,
107
+    'no-multiple-empty-lines': [2, {
108
+      'max': 1
109
+    }],
110
+    'no-native-reassign': 2,
111
+    'no-negated-in-lhs': 2,
112
+    'no-new-object': 2,
113
+    'no-new-require': 2,
114
+    'no-new-symbol': 2,
115
+    'no-new-wrappers': 2,
116
+    'no-obj-calls': 2,
117
+    'no-octal': 2,
118
+    'no-octal-escape': 2,
119
+    'no-path-concat': 2,
120
+    'no-proto': 2,
121
+    'no-redeclare': 2,
122
+    'no-regex-spaces': 2,
123
+    'no-return-assign': [2, 'except-parens'],
124
+    'no-self-assign': 2,
125
+    'no-self-compare': 2,
126
+    'no-sequences': 2,
127
+    'no-shadow-restricted-names': 2,
128
+    'no-spaced-func': 2,
129
+    'no-sparse-arrays': 2,
130
+    'no-this-before-super': 2,
131
+    'no-throw-literal': 2,
132
+    'no-trailing-spaces': 2,
133
+    'no-undef': 2,
134
+    'no-undef-init': 2,
135
+    'no-unexpected-multiline': 2,
136
+    'no-unmodified-loop-condition': 2,
137
+    'no-unneeded-ternary': [2, {
138
+      'defaultAssignment': false
139
+    }],
140
+    'no-unreachable': 2,
141
+    'no-unsafe-finally': 2,
142
+    'no-unused-vars': [2, {
143
+      'vars': 'all',
144
+      'args': 'none'
145
+    }],
146
+    'no-useless-call': 2,
147
+    'no-useless-computed-key': 2,
148
+    'no-useless-constructor': 2,
149
+    'no-useless-escape': 0,
150
+    'no-whitespace-before-property': 2,
151
+    'no-with': 2,
152
+    'one-var': [2, {
153
+      'initialized': 'never'
154
+    }],
155
+    'operator-linebreak': [2, 'after', {
156
+      'overrides': {
157
+        '?': 'before',
158
+        ':': 'before'
159
+      }
160
+    }],
161
+    'padded-blocks': [2, 'never'],
162
+    'quotes': [2, 'single', {
163
+      'avoidEscape': true,
164
+      'allowTemplateLiterals': true
165
+    }],
166
+    'semi': [2, 'never'],
167
+    'semi-spacing': [2, {
168
+      'before': false,
169
+      'after': true
170
+    }],
171
+    'space-before-blocks': [2, 'always'],
172
+    'space-before-function-paren': [2, 'never'],
173
+    'space-in-parens': [2, 'never'],
174
+    'space-infix-ops': 2,
175
+    'space-unary-ops': [2, {
176
+      'words': true,
177
+      'nonwords': false
178
+    }],
179
+    'spaced-comment': [2, 'always', {
180
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
181
+    }],
182
+    'template-curly-spacing': [2, 'never'],
183
+    'use-isnan': 2,
184
+    'valid-typeof': 2,
185
+    'wrap-iife': [2, 'any'],
186
+    'yield-star-spacing': [2, 'both'],
187
+    'yoda': [2, 'never'],
188
+    'prefer-const': 2,
189
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
190
+    'object-curly-spacing': [2, 'always', {
191
+      objectsInObjects: false
192
+    }],
193
+    'array-bracket-spacing': [2, 'never']
194
+  }
195
+}
196
+

+ 15
- 0
VUECODE/smart-operate-manage/.gitignore 查看文件

1
+.DS_Store
2
+node_modules/
3
+dist/
4
+npm-debug.log*
5
+yarn-debug.log*
6
+yarn-error.log*
7
+package-lock.json
8
+
9
+# Editor directories and files
10
+.idea
11
+.vscode
12
+*.suo
13
+*.ntvs*
14
+*.njsproj
15
+*.sln

+ 10
- 0
VUECODE/smart-operate-manage/.postcssrc.js 查看文件

1
+// https://github.com/michael-ciniawsky/postcss-load-config
2
+
3
+module.exports = {
4
+  "plugins": {
5
+    "postcss-import": {},
6
+    "postcss-url": {},
7
+    // to edit target browsers: use "browserslist" field in package.json
8
+    "autoprefixer": {}
9
+  }
10
+}

+ 5
- 0
VUECODE/smart-operate-manage/.travis.yml 查看文件

1
+language: node_js
2
+node_js: stable
3
+script: npm run test
4
+notifications:
5
+  email: false

+ 21
- 0
VUECODE/smart-operate-manage/LICENSE 查看文件

1
+MIT License
2
+
3
+Copyright (c) 2017-present PanJiaChen
4
+
5
+Permission is hereby granted, free of charge, to any person obtaining a copy
6
+of this software and associated documentation files (the "Software"), to deal
7
+in the Software without restriction, including without limitation the rights
8
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+copies of the Software, and to permit persons to whom the Software is
10
+furnished to do so, subject to the following conditions:
11
+
12
+The above copyright notice and this permission notice shall be included in all
13
+copies or substantial portions of the Software.
14
+
15
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+SOFTWARE.

+ 96
- 0
VUECODE/smart-operate-manage/README-zh.md 查看文件

1
+# vue-admin-template
2
+
3
+> 这是一个 极简的 vue admin 管理后台 它只包含了 Element UI & axios & iconfont & permission control & lint,这些搭建后台必要的东西。
4
+
5
+[线上地址](http://panjiachen.github.io/vue-admin-template)
6
+
7
+[国内访问](https://panjiachen.gitee.io/vue-admin-template)
8
+
9
+## Extra
10
+
11
+如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用改分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
12
+
13
+本项目基于`webpack4`开发,若还想使用`webpack3`开发,请使用该分支[webpack3](https://github.com/PanJiaChen/vue-admin-template/tree/webpack3)
14
+
15
+如果你想使用基于 vue + typescript 的管理后台, 可以看看这个项目: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour))
16
+
17
+## 相关项目
18
+
19
+[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
20
+
21
+[electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
22
+
23
+[vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
24
+
25
+写了一个系列的教程配套文章,如何从零构建后一个完整的后台项目:
26
+
27
+- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
28
+- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
29
+- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
30
+- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板,专门针对本项目的文章,算作是一篇文档)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)
31
+- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)
32
+
33
+## Build Setup
34
+
35
+```bash
36
+# Clone project
37
+git clone https://github.com/PanJiaChen/vue-admin-template.git
38
+
39
+# Install dependencies
40
+npm install
41
+
42
+# 建议不要用cnpm  安装有各种诡异的bug 可以通过如下操作解决npm速度慢的问题
43
+npm install --registry=https://registry.npm.taobao.org
44
+
45
+# Serve with hot reload at localhost:9528
46
+npm run dev
47
+
48
+# Build for production with minification
49
+npm run build
50
+
51
+# Build for production and view the bundle analyzer report
52
+npm run build --report
53
+```
54
+
55
+## Demo
56
+
57
+![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
58
+
59
+### Element-Ui 使用 cdn 教程
60
+
61
+首先找到 `index.html` ([根目录下](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/index.html))
62
+
63
+引入 Element 的 css 和 js ,并且引入 vue 。因为 Element-Ui 是依赖 vue 的,所以必须在它之前引入 vue 。
64
+
65
+之后找到 [webpack.base.conf.js](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/build/webpack.base.conf.js) 加入 `externals` 让 webpack 不打包 vue 和 element
66
+
67
+```
68
+externals: {
69
+  vue: 'Vue',
70
+  'element-ui':'ELEMENT'
71
+}
72
+```
73
+
74
+之后还有一个小细节是如果你用了全局对象方式引入 vue,就不需要 手动 `Vue.use(Vuex)` ,它会自动挂载,具体见 [issue](https://github.com/vuejs/vuex/issues/731)
75
+
76
+最终你可以使用 `npm run build --report` 查看效果
77
+如图:
78
+![demo](https://panjiachen.github.io/images/element-cdn.png)
79
+
80
+**[具体代码](https://github.com/PanJiaChen/vue-admin-template/commit/746aff560932704ae821f82f10b8b2a9681d5177)**
81
+
82
+**[对应分支](https://github.com/PanJiaChen/vue-admin-template/tree/element-ui-cdn)**
83
+
84
+## Browsers support
85
+
86
+Modern browsers and Internet Explorer 10+.
87
+
88
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
89
+| --------- | --------- | --------- | --------- |
90
+| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
91
+
92
+## License
93
+
94
+[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
95
+
96
+Copyright (c) 2017-present PanJiaChen

+ 88
- 0
VUECODE/smart-operate-manage/README.md 查看文件

1
+# vue-admin-template
2
+
3
+> A minimal vue admin template with Element UI & axios & iconfont & permission control & lint
4
+
5
+**Live demo:** http://panjiachen.github.io/vue-admin-template
6
+
7
+[中文文档](https://github.com/PanJiaChen/vue-admin-template/blob/master/README-zh.md)
8
+
9
+## Build Setup
10
+
11
+```bash
12
+# Clone project
13
+git clone https://github.com/PanJiaChen/vue-admin-template.git
14
+
15
+# Install dependencies
16
+npm install
17
+
18
+# Serve with hot reload at localhost:9528
19
+npm run dev
20
+
21
+# Build for production with minification
22
+npm run build
23
+
24
+# Build for production and view the bundle analyzer report
25
+npm run build --report
26
+```
27
+
28
+## Demo
29
+
30
+![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif)
31
+
32
+## Extra
33
+
34
+If you want router permission && generate menu by user roles , you can use this branch [permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control)
35
+
36
+This project is based on `webpack4` development. If you want to use `webpack3` development, please use this branch [webpack3](https://github.com/PanJiaChen/vue-admin-template/tree/webpack3)
37
+
38
+For `typescript` version, you can use [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour))
39
+
40
+## Related Project
41
+
42
+[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
43
+
44
+[electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
45
+
46
+[vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template)
47
+
48
+### Element-Ui using cdn tutorial
49
+
50
+First find `index.html`([root directory](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/index.html))
51
+
52
+Import css and js of `Element`, and then import vue. Because `Element` is vue-dependent, vue must be import before it.
53
+
54
+Then find [webpack.base.conf.js](https://github.com/PanJiaChen/vue-admin-template/blob/element-ui-cdn/build/webpack.base.conf.js)
55
+Add `externals` to make webpack not package vue and element.
56
+
57
+```
58
+externals: {
59
+  vue: 'Vue',
60
+  'element-ui':'ELEMENT'
61
+}
62
+```
63
+
64
+Finally there is a small detail to pay attention to that if you import vue in global, you don't need to manually `Vue.use(Vuex)`, it will be automatically mounted, see
65
+[issue](https://github.com/vuejs/vuex/issues/731)
66
+
67
+And you can use `npm run build --report` to see the effect
68
+
69
+Pictured:
70
+![demo](https://panjiachen.github.io/images/element-cdn.png)
71
+
72
+**[Detailed code](https://github.com/PanJiaChen/vue-admin-template/commit/746aff560932704ae821f82f10b8b2a9681d5177)**
73
+
74
+**[Branch](https://github.com/PanJiaChen/vue-admin-template/tree/element-ui-cdn)**
75
+
76
+## Browsers support
77
+
78
+Modern browsers and Internet Explorer 10+.
79
+
80
+| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
81
+| --------- | --------- | --------- | --------- |
82
+| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
83
+
84
+## License
85
+
86
+[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license.
87
+
88
+Copyright (c) 2017-present PanJiaChen

+ 45
- 0
VUECODE/smart-operate-manage/build/build.js 查看文件

1
+'use strict'
2
+require('./check-versions')()
3
+
4
+process.env.NODE_ENV = 'production'
5
+
6
+const ora = require('ora')
7
+const rm = require('rimraf')
8
+const path = require('path')
9
+const chalk = require('chalk')
10
+const webpack = require('webpack')
11
+const config = require('../config')
12
+const webpackConfig = require('./webpack.prod.conf')
13
+
14
+const spinner = ora('building for production...')
15
+spinner.start()
16
+
17
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
18
+  if (err) throw err
19
+  webpack(webpackConfig, (err, stats) => {
20
+    spinner.stop()
21
+    if (err) throw err
22
+    process.stdout.write(
23
+      stats.toString({
24
+        colors: true,
25
+        modules: false,
26
+        children: false,
27
+        chunks: false,
28
+        chunkModules: false
29
+      }) + '\n\n'
30
+    )
31
+
32
+    if (stats.hasErrors()) {
33
+      console.log(chalk.red('  Build failed with errors.\n'))
34
+      process.exit(1)
35
+    }
36
+
37
+    console.log(chalk.cyan('  Build complete.\n'))
38
+    console.log(
39
+      chalk.yellow(
40
+        '  Tip: built files are meant to be served over an HTTP server.\n' +
41
+          "  Opening index.html over file:// won't work.\n"
42
+      )
43
+    )
44
+  })
45
+})

+ 64
- 0
VUECODE/smart-operate-manage/build/check-versions.js 查看文件

1
+'use strict'
2
+const chalk = require('chalk')
3
+const semver = require('semver')
4
+const packageConfig = require('../package.json')
5
+const shell = require('shelljs')
6
+
7
+function exec(cmd) {
8
+  return require('child_process')
9
+    .execSync(cmd)
10
+    .toString()
11
+    .trim()
12
+}
13
+
14
+const versionRequirements = [
15
+  {
16
+    name: 'node',
17
+    currentVersion: semver.clean(process.version),
18
+    versionRequirement: packageConfig.engines.node
19
+  }
20
+]
21
+
22
+if (shell.which('npm')) {
23
+  versionRequirements.push({
24
+    name: 'npm',
25
+    currentVersion: exec('npm --version'),
26
+    versionRequirement: packageConfig.engines.npm
27
+  })
28
+}
29
+
30
+module.exports = function() {
31
+  const warnings = []
32
+
33
+  for (let i = 0; i < versionRequirements.length; i++) {
34
+    const mod = versionRequirements[i]
35
+
36
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
37
+      warnings.push(
38
+        mod.name +
39
+          ': ' +
40
+          chalk.red(mod.currentVersion) +
41
+          ' should be ' +
42
+          chalk.green(mod.versionRequirement)
43
+      )
44
+    }
45
+  }
46
+
47
+  if (warnings.length) {
48
+    console.log('')
49
+    console.log(
50
+      chalk.yellow(
51
+        'To use this template, you must update following to modules:'
52
+      )
53
+    )
54
+    console.log()
55
+
56
+    for (let i = 0; i < warnings.length; i++) {
57
+      const warning = warnings[i]
58
+      console.log('  ' + warning)
59
+    }
60
+
61
+    console.log()
62
+    process.exit(1)
63
+  }
64
+}

二进制
VUECODE/smart-operate-manage/build/logo.png 查看文件


+ 108
- 0
VUECODE/smart-operate-manage/build/utils.js 查看文件

1
+'use strict'
2
+const path = require('path')
3
+const config = require('../config')
4
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
5
+const packageConfig = require('../package.json')
6
+
7
+exports.assetsPath = function(_path) {
8
+  const assetsSubDirectory =
9
+    process.env.NODE_ENV === 'production'
10
+      ? config.build.assetsSubDirectory
11
+      : config.dev.assetsSubDirectory
12
+
13
+  return path.posix.join(assetsSubDirectory, _path)
14
+}
15
+
16
+exports.cssLoaders = function(options) {
17
+  options = options || {}
18
+
19
+  const cssLoader = {
20
+    loader: 'css-loader',
21
+    options: {
22
+      sourceMap: options.sourceMap
23
+    }
24
+  }
25
+
26
+  const postcssLoader = {
27
+    loader: 'postcss-loader',
28
+    options: {
29
+      sourceMap: options.sourceMap
30
+    }
31
+  }
32
+
33
+  // generate loader string to be used with extract text plugin
34
+  function generateLoaders(loader, loaderOptions) {
35
+    const loaders = []
36
+
37
+    // Extract CSS when that option is specified
38
+    // (which is the case during production build)
39
+    if (options.extract) {
40
+      loaders.push(MiniCssExtractPlugin.loader)
41
+    } else {
42
+      loaders.push('vue-style-loader')
43
+    }
44
+
45
+    loaders.push(cssLoader)
46
+
47
+    if (options.usePostCSS) {
48
+      loaders.push(postcssLoader)
49
+    }
50
+
51
+    if (loader) {
52
+      loaders.push({
53
+        loader: loader + '-loader',
54
+        options: Object.assign({}, loaderOptions, {
55
+          sourceMap: options.sourceMap
56
+        })
57
+      })
58
+    }
59
+
60
+    return loaders
61
+  }
62
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
63
+  return {
64
+    css: generateLoaders(),
65
+    postcss: generateLoaders(),
66
+    less: generateLoaders('less'),
67
+    sass: generateLoaders('sass', {
68
+      indentedSyntax: true
69
+    }),
70
+    scss: generateLoaders('sass'),
71
+    stylus: generateLoaders('stylus'),
72
+    styl: generateLoaders('stylus')
73
+  }
74
+}
75
+
76
+// Generate loaders for standalone style files (outside of .vue)
77
+exports.styleLoaders = function(options) {
78
+  const output = []
79
+  const loaders = exports.cssLoaders(options)
80
+
81
+  for (const extension in loaders) {
82
+    const loader = loaders[extension]
83
+    output.push({
84
+      test: new RegExp('\\.' + extension + '$'),
85
+      use: loader
86
+    })
87
+  }
88
+
89
+  return output
90
+}
91
+
92
+exports.createNotifierCallback = () => {
93
+  const notifier = require('node-notifier')
94
+
95
+  return (severity, errors) => {
96
+    if (severity !== 'error') return
97
+
98
+    const error = errors[0]
99
+    const filename = error.file && error.file.split('!').pop()
100
+
101
+    notifier.notify({
102
+      title: packageConfig.name,
103
+      message: severity + ': ' + error.name,
104
+      subtitle: filename || '',
105
+      icon: path.join(__dirname, 'logo.png')
106
+    })
107
+  }
108
+}

+ 5
- 0
VUECODE/smart-operate-manage/build/vue-loader.conf.js 查看文件

1
+'use strict'
2
+
3
+module.exports = {
4
+  //You can set the vue-loader configuration by yourself.
5
+}

+ 107
- 0
VUECODE/smart-operate-manage/build/webpack.base.conf.js 查看文件

1
+'use strict'
2
+const path = require('path')
3
+const utils = require('./utils')
4
+const config = require('../config')
5
+const { VueLoaderPlugin } = require('vue-loader')
6
+const vueLoaderConfig = require('./vue-loader.conf')
7
+
8
+function resolve(dir) {
9
+  return path.join(__dirname, '..', dir)
10
+}
11
+
12
+const createLintingRule = () => ({
13
+  test: /\.(js|vue)$/,
14
+  loader: 'eslint-loader',
15
+  enforce: 'pre',
16
+  include: [resolve('src'), resolve('test')],
17
+  options: {
18
+    formatter: require('eslint-friendly-formatter'),
19
+    emitWarning: !config.dev.showEslintErrorsInOverlay
20
+  }
21
+})
22
+
23
+module.exports = {
24
+  context: path.resolve(__dirname, '../'),
25
+  entry: {
26
+    app: './src/main.js'
27
+  },
28
+  output: {
29
+    path: config.build.assetsRoot,
30
+    filename: '[name].js',
31
+    publicPath:
32
+      process.env.NODE_ENV === 'production'
33
+        ? config.build.assetsPublicPath
34
+        : config.dev.assetsPublicPath
35
+  },
36
+  resolve: {
37
+    extensions: ['.js', '.vue', '.json'],
38
+    alias: {
39
+      '@': resolve('src')
40
+    }
41
+  },
42
+  module: {
43
+    rules: [
44
+      ...(config.dev.useEslint ? [createLintingRule()] : []),
45
+      {
46
+        test: /\.vue$/,
47
+        loader: 'vue-loader',
48
+        options: vueLoaderConfig
49
+      },
50
+      {
51
+        test: /\.js$/,
52
+        loader: 'babel-loader',
53
+        include: [
54
+          resolve('src'),
55
+          resolve('test'),
56
+          resolve('node_modules/webpack-dev-server/client')
57
+        ]
58
+      },
59
+      {
60
+        test: /\.svg$/,
61
+        loader: 'svg-sprite-loader',
62
+        include: [resolve('src/icons')],
63
+        options: {
64
+          symbolId: 'icon-[name]'
65
+        }
66
+      },
67
+      {
68
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
69
+        loader: 'url-loader',
70
+        exclude: [resolve('src/icons')],
71
+        options: {
72
+          limit: 10000,
73
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
74
+        }
75
+      },
76
+      {
77
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
78
+        loader: 'url-loader',
79
+        options: {
80
+          limit: 10000,
81
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
82
+        }
83
+      },
84
+      {
85
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
86
+        loader: 'url-loader',
87
+        options: {
88
+          limit: 10000,
89
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
90
+        }
91
+      }
92
+    ]
93
+  },
94
+  plugins: [new VueLoaderPlugin()],
95
+  node: {
96
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
97
+    // source contains it (although only uses it if it's native).
98
+    setImmediate: false,
99
+    // prevent webpack from injecting mocks to Node native modules
100
+    // that does not make sense for the client
101
+    dgram: 'empty',
102
+    fs: 'empty',
103
+    net: 'empty',
104
+    tls: 'empty',
105
+    child_process: 'empty'
106
+  }
107
+}

+ 95
- 0
VUECODE/smart-operate-manage/build/webpack.dev.conf.js 查看文件

1
+'use strict'
2
+const path = require('path')
3
+const utils = require('./utils')
4
+const webpack = require('webpack')
5
+const config = require('../config')
6
+const merge = require('webpack-merge')
7
+const baseWebpackConfig = require('./webpack.base.conf')
8
+const HtmlWebpackPlugin = require('html-webpack-plugin')
9
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
10
+const portfinder = require('portfinder')
11
+
12
+function resolve(dir) {
13
+  return path.join(__dirname, '..', dir)
14
+}
15
+
16
+const HOST = process.env.HOST
17
+const PORT = process.env.PORT && Number(process.env.PORT)
18
+
19
+const devWebpackConfig = merge(baseWebpackConfig, {
20
+  mode: 'development',
21
+  module: {
22
+    rules: utils.styleLoaders({
23
+      sourceMap: config.dev.cssSourceMap,
24
+      usePostCSS: true
25
+    })
26
+  },
27
+  // cheap-module-eval-source-map is faster for development
28
+  devtool: config.dev.devtool,
29
+
30
+  // these devServer options should be customized in /config/index.js
31
+  devServer: {
32
+    clientLogLevel: 'warning',
33
+    historyApiFallback: true,
34
+    hot: true,
35
+    compress: true,
36
+    host: HOST || config.dev.host,
37
+    port: PORT || config.dev.port,
38
+    open: config.dev.autoOpenBrowser,
39
+    overlay: config.dev.errorOverlay
40
+      ? { warnings: false, errors: true }
41
+      : false,
42
+    publicPath: config.dev.assetsPublicPath,
43
+    proxy: config.dev.proxyTable,
44
+    quiet: true, // necessary for FriendlyErrorsPlugin
45
+    watchOptions: {
46
+      poll: config.dev.poll
47
+    }
48
+  },
49
+  plugins: [
50
+    new webpack.DefinePlugin({
51
+      'process.env': require('../config/dev.env')
52
+    }),
53
+    new webpack.HotModuleReplacementPlugin(),
54
+    // https://github.com/ampedandwired/html-webpack-plugin
55
+    new HtmlWebpackPlugin({
56
+      filename: 'index.html',
57
+      template: 'index.html',
58
+      inject: true,
59
+      favicon: resolve('favicon.ico'),
60
+      title: 'vue-admin-template'
61
+    })
62
+  ]
63
+})
64
+
65
+module.exports = new Promise((resolve, reject) => {
66
+  portfinder.basePort = process.env.PORT || config.dev.port
67
+  portfinder.getPort((err, port) => {
68
+    if (err) {
69
+      reject(err)
70
+    } else {
71
+      // publish the new Port, necessary for e2e tests
72
+      process.env.PORT = port
73
+      // add port to devServer config
74
+      devWebpackConfig.devServer.port = port
75
+
76
+      // Add FriendlyErrorsPlugin
77
+      devWebpackConfig.plugins.push(
78
+        new FriendlyErrorsPlugin({
79
+          compilationSuccessInfo: {
80
+            messages: [
81
+              `Your application is running here: http://${
82
+                devWebpackConfig.devServer.host
83
+              }:${port}`
84
+            ]
85
+          },
86
+          onErrors: config.dev.notifyOnErrors
87
+            ? utils.createNotifierCallback()
88
+            : undefined
89
+        })
90
+      )
91
+
92
+      resolve(devWebpackConfig)
93
+    }
94
+  })
95
+})

+ 178
- 0
VUECODE/smart-operate-manage/build/webpack.prod.conf.js 查看文件

1
+'use strict'
2
+const path = require('path')
3
+const utils = require('./utils')
4
+const webpack = require('webpack')
5
+const config = require('../config')
6
+const merge = require('webpack-merge')
7
+const baseWebpackConfig = require('./webpack.base.conf')
8
+const CopyWebpackPlugin = require('copy-webpack-plugin')
9
+const HtmlWebpackPlugin = require('html-webpack-plugin')
10
+const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')
11
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
12
+const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
13
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
14
+
15
+function resolve(dir) {
16
+  return path.join(__dirname, '..', dir)
17
+}
18
+
19
+const env = require('../config/prod.env')
20
+
21
+// For NamedChunksPlugin
22
+const seen = new Set()
23
+const nameLength = 4
24
+
25
+const webpackConfig = merge(baseWebpackConfig, {
26
+  mode: 'production',
27
+  module: {
28
+    rules: utils.styleLoaders({
29
+      sourceMap: config.build.productionSourceMap,
30
+      extract: true,
31
+      usePostCSS: true
32
+    })
33
+  },
34
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
35
+  output: {
36
+    path: config.build.assetsRoot,
37
+    filename: utils.assetsPath('js/[name].[chunkhash:8].js'),
38
+    chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js')
39
+  },
40
+  plugins: [
41
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
42
+    new webpack.DefinePlugin({
43
+      'process.env': env
44
+    }),
45
+    // extract css into its own file
46
+    new MiniCssExtractPlugin({
47
+      filename: utils.assetsPath('css/[name].[contenthash:8].css'),
48
+      chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css')
49
+    }),
50
+    // generate dist index.html with correct asset hash for caching.
51
+    // you can customize output by editing /index.html
52
+    // see https://github.com/ampedandwired/html-webpack-plugin
53
+    new HtmlWebpackPlugin({
54
+      filename: config.build.index,
55
+      template: 'index.html',
56
+      inject: true,
57
+      favicon: resolve('favicon.ico'),
58
+      title: 'vue-admin-template',
59
+      minify: {
60
+        removeComments: true,
61
+        collapseWhitespace: true,
62
+        removeAttributeQuotes: true
63
+        // more options:
64
+        // https://github.com/kangax/html-minifier#options-quick-reference
65
+      }
66
+      // default sort mode uses toposort which cannot handle cyclic deps
67
+      // in certain cases, and in webpack 4, chunk order in HTML doesn't
68
+      // matter anyway
69
+    }),
70
+    new ScriptExtHtmlWebpackPlugin({
71
+      //`runtime` must same as runtimeChunk name. default is `runtime`
72
+      inline: /runtime\..*\.js$/
73
+    }),
74
+    // keep chunk.id stable when chunk has no name
75
+    new webpack.NamedChunksPlugin(chunk => {
76
+      if (chunk.name) {
77
+        return chunk.name
78
+      }
79
+      const modules = Array.from(chunk.modulesIterable)
80
+      if (modules.length > 1) {
81
+        const hash = require('hash-sum')
82
+        const joinedHash = hash(modules.map(m => m.id).join('_'))
83
+        let len = nameLength
84
+        while (seen.has(joinedHash.substr(0, len))) len++
85
+        seen.add(joinedHash.substr(0, len))
86
+        return `chunk-${joinedHash.substr(0, len)}`
87
+      } else {
88
+        return modules[0].id
89
+      }
90
+    }),
91
+    // keep module.id stable when vender modules does not change
92
+    new webpack.HashedModuleIdsPlugin(),
93
+    // copy custom static assets
94
+    new CopyWebpackPlugin([
95
+      {
96
+        from: path.resolve(__dirname, '../static'),
97
+        to: config.build.assetsSubDirectory,
98
+        ignore: ['.*']
99
+      }
100
+    ])
101
+  ],
102
+  optimization: {
103
+    splitChunks: {
104
+      chunks: 'all',
105
+      cacheGroups: {
106
+        libs: {
107
+          name: 'chunk-libs',
108
+          test: /[\\/]node_modules[\\/]/,
109
+          priority: 10,
110
+          chunks: 'initial' // 只打包初始时依赖的第三方
111
+        },
112
+        elementUI: {
113
+          name: 'chunk-elementUI', // 单独将 elementUI 拆包
114
+          priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
115
+          test: /[\\/]node_modules[\\/]element-ui[\\/]/
116
+        }
117
+      }
118
+    },
119
+    runtimeChunk: 'single',
120
+    minimizer: [
121
+      new UglifyJsPlugin({
122
+        uglifyOptions: {
123
+          mangle: {
124
+            safari10: true
125
+          }
126
+        },
127
+        sourceMap: config.build.productionSourceMap,
128
+        cache: true,
129
+        parallel: true
130
+      }),
131
+      // Compress extracted CSS. We are using this plugin so that possible
132
+      // duplicated CSS from different components can be deduped.
133
+      new OptimizeCSSAssetsPlugin()
134
+    ]
135
+  }
136
+})
137
+
138
+if (config.build.productionGzip) {
139
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
140
+
141
+  webpackConfig.plugins.push(
142
+    new CompressionWebpackPlugin({
143
+      asset: '[path].gz[query]',
144
+      algorithm: 'gzip',
145
+      test: new RegExp(
146
+        '\\.(' + config.build.productionGzipExtensions.join('|') + ')$'
147
+      ),
148
+      threshold: 10240,
149
+      minRatio: 0.8
150
+    })
151
+  )
152
+}
153
+
154
+if (config.build.generateAnalyzerReport || config.build.bundleAnalyzerReport) {
155
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
156
+    .BundleAnalyzerPlugin
157
+
158
+  if (config.build.bundleAnalyzerReport) {
159
+    webpackConfig.plugins.push(
160
+      new BundleAnalyzerPlugin({
161
+        analyzerPort: 8080,
162
+        generateStatsFile: false
163
+      })
164
+    )
165
+  }
166
+
167
+  if (config.build.generateAnalyzerReport) {
168
+    webpackConfig.plugins.push(
169
+      new BundleAnalyzerPlugin({
170
+        analyzerMode: 'static',
171
+        reportFilename: 'bundle-report.html',
172
+        openAnalyzer: false
173
+      })
174
+    )
175
+  }
176
+}
177
+
178
+module.exports = webpackConfig

+ 8
- 0
VUECODE/smart-operate-manage/config/dev.env.js 查看文件

1
+'use strict'
2
+const merge = require('webpack-merge')
3
+const prodEnv = require('./prod.env')
4
+
5
+module.exports = merge(prodEnv, {
6
+  NODE_ENV: '"development"',
7
+  BASE_API: '"http://localhost:8085/operate-api"',
8
+})

+ 87
- 0
VUECODE/smart-operate-manage/config/index.js 查看文件

1
+'use strict'
2
+// Template version: 1.2.6
3
+// see http://vuejs-templates.github.io/webpack for documentation.
4
+
5
+const path = require('path')
6
+
7
+module.exports = {
8
+  dev: {
9
+    // Paths
10
+    assetsSubDirectory: 'static',
11
+    assetsPublicPath: '/',
12
+    proxyTable: {
13
+    },
14
+
15
+    // Various Dev Server settings
16
+    host: 'localhost', // can be overwritten by process.env.HOST
17
+    port: 9528, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
18
+    autoOpenBrowser: true,
19
+    errorOverlay: true,
20
+    notifyOnErrors: false,
21
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
22
+
23
+    // Use Eslint Loader?
24
+    // If true, your code will be linted during bundling and
25
+    // linting errors and warnings will be shown in the console.
26
+    useEslint: true,
27
+    // If true, eslint errors and warnings will also be shown in the error overlay
28
+    // in the browser.
29
+    showEslintErrorsInOverlay: false,
30
+
31
+    /**
32
+     * Source Maps
33
+     */
34
+
35
+    // https://webpack.js.org/configuration/devtool/#development
36
+    devtool: 'cheap-source-map',
37
+
38
+    // CSS Sourcemaps off by default because relative paths are "buggy"
39
+    // with this option, according to the CSS-Loader README
40
+    // (https://github.com/webpack/css-loader#sourcemaps)
41
+    // In our experience, they generally work as expected,
42
+    // just be aware of this issue when enabling this option.
43
+    cssSourceMap: false
44
+  },
45
+
46
+  build: {
47
+    // Template for index.html
48
+    index: path.resolve(__dirname, '../dist/index.html'),
49
+
50
+    // Paths
51
+    assetsRoot: path.resolve(__dirname, '../dist'),
52
+    assetsSubDirectory: 'static',
53
+
54
+    /**
55
+     * You can set by youself according to actual condition
56
+     * You will need to set this if you plan to deploy your site under a sub path,
57
+     * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
58
+     * then assetsPublicPath should be set to "/bar/".
59
+     * In most cases please use '/' !!!
60
+     */
61
+    assetsPublicPath: '/',
62
+
63
+    /**
64
+     * Source Maps
65
+     */
66
+
67
+    productionSourceMap: false,
68
+    // https://webpack.js.org/configuration/devtool/#production
69
+    devtool: 'source-map',
70
+
71
+    // Gzip off by default as many popular static hosts such as
72
+    // Surge or Netlify already gzip all static assets for you.
73
+    // Before setting to `true`, make sure to:
74
+    // npm install --save-dev compression-webpack-plugin
75
+    productionGzip: false,
76
+    productionGzipExtensions: ['js', 'css'],
77
+
78
+    // Run the build command with an extra argument to
79
+    // View the bundle analyzer report after build finishes:
80
+    // `npm run build --report`
81
+    // Set to `true` or `false` to always turn it on or off
82
+    bundleAnalyzerReport: process.env.npm_config_report || false,
83
+
84
+    // `npm run build:prod --generate_report`
85
+    generateAnalyzerReport: process.env.npm_config_generate_report || false
86
+  }
87
+}

+ 5
- 0
VUECODE/smart-operate-manage/config/prod.env.js 查看文件

1
+'use strict'
2
+module.exports = {
3
+  NODE_ENV: '"production"',
4
+  BASE_API: '"https://easy-mock.com/mock/5950a2419adc231f356a6636/vue-admin"',
5
+}

二进制
VUECODE/smart-operate-manage/favicon.ico 查看文件


+ 12
- 0
VUECODE/smart-operate-manage/index.html 查看文件

1
+<!DOCTYPE html>
2
+<html>
3
+  <head>
4
+    <meta charset="utf-8">
5
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
6
+    <title>vue-admin-template</title>
7
+  </head>
8
+  <body>
9
+    <div id="app"></div>
10
+    <!-- built files will be auto injected -->
11
+  </body>
12
+</html>

+ 85
- 0
VUECODE/smart-operate-manage/package.json 查看文件

1
+{
2
+  "name": "vue-admin-template",
3
+  "version": "3.8.0",
4
+  "license": "MIT",
5
+  "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
6
+  "author": "Pan <panfree23@gmail.com>",
7
+  "scripts": {
8
+    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
9
+    "start": "npm run dev",
10
+    "build": "node build/build.js",
11
+    "build:report": "npm_config_report=true npm run build",
12
+    "lint": "eslint --ext .js,.vue src",
13
+    "test": "npm run lint",
14
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"
15
+  },
16
+  "dependencies": {
17
+    "axios": "0.18.0",
18
+    "element-ui": "2.4.6",
19
+    "js-cookie": "2.2.0",
20
+    "normalize.css": "7.0.0",
21
+    "nprogress": "0.2.0",
22
+    "vue": "2.5.17",
23
+    "vue-router": "3.0.1",
24
+    "vuex": "3.0.1"
25
+  },
26
+  "devDependencies": {
27
+    "autoprefixer": "8.5.0",
28
+    "babel-core": "6.26.0",
29
+    "babel-eslint": "8.2.6",
30
+    "babel-helper-vue-jsx-merge-props": "2.0.3",
31
+    "babel-loader": "7.1.5",
32
+    "babel-plugin-syntax-jsx": "6.18.0",
33
+    "babel-plugin-transform-runtime": "6.23.0",
34
+    "babel-plugin-transform-vue-jsx": "3.7.0",
35
+    "babel-preset-env": "1.7.0",
36
+    "babel-preset-stage-2": "6.24.1",
37
+    "chalk": "2.4.1",
38
+    "copy-webpack-plugin": "4.5.2",
39
+    "css-loader": "1.0.0",
40
+    "eslint": "4.19.1",
41
+    "eslint-friendly-formatter": "4.0.1",
42
+    "eslint-loader": "2.0.0",
43
+    "eslint-plugin-vue": "4.7.1",
44
+    "eventsource-polyfill": "0.9.6",
45
+    "file-loader": "1.1.11",
46
+    "friendly-errors-webpack-plugin": "1.7.0",
47
+    "html-webpack-plugin": "4.0.0-alpha",
48
+    "mini-css-extract-plugin": "0.4.1",
49
+    "node-notifier": "5.2.1",
50
+    "node-sass": "^4.7.2",
51
+    "optimize-css-assets-webpack-plugin": "5.0.0",
52
+    "ora": "3.0.0",
53
+    "path-to-regexp": "2.4.0",
54
+    "portfinder": "1.0.16",
55
+    "postcss-import": "12.0.0",
56
+    "postcss-loader": "2.1.6",
57
+    "postcss-url": "7.3.2",
58
+    "rimraf": "2.6.2",
59
+    "sass-loader": "7.0.3",
60
+    "script-ext-html-webpack-plugin": "2.0.1",
61
+    "semver": "5.5.0",
62
+    "shelljs": "0.8.2",
63
+    "svg-sprite-loader": "3.8.0",
64
+    "svgo": "1.0.5",
65
+    "uglifyjs-webpack-plugin": "1.2.7",
66
+    "url-loader": "1.0.1",
67
+    "vue-loader": "15.3.0",
68
+    "vue-style-loader": "4.1.2",
69
+    "vue-template-compiler": "2.5.17",
70
+    "webpack": "4.16.5",
71
+    "webpack-bundle-analyzer": "2.13.1",
72
+    "webpack-cli": "3.1.0",
73
+    "webpack-dev-server": "3.1.5",
74
+    "webpack-merge": "4.1.4"
75
+  },
76
+  "engines": {
77
+    "node": ">= 6.0.0",
78
+    "npm": ">= 3.0.0"
79
+  },
80
+  "browserslist": [
81
+    "> 1%",
82
+    "last 2 versions",
83
+    "not ie <= 8"
84
+  ]
85
+}

+ 11
- 0
VUECODE/smart-operate-manage/src/App.vue 查看文件

1
+<template>
2
+  <div id="app">
3
+    <router-view/>
4
+  </div>
5
+</template>
6
+
7
+<script>
8
+export default {
9
+  name: 'App'
10
+}
11
+</script>

+ 38
- 0
VUECODE/smart-operate-manage/src/api/login.js 查看文件

1
+import request from '@/utils/request'
2
+
3
+export function login(username, password) {
4
+  const config = {
5
+    url: '/user/login',
6
+    method: 'post',
7
+    data: {
8
+      'loginName': username,
9
+      'code': password
10
+    }
11
+  }
12
+
13
+  return request(config)
14
+}
15
+
16
+export function getInfo(token) {
17
+  return request({
18
+    url: '/user/info',
19
+    method: 'get',
20
+    params: { token }
21
+  })
22
+}
23
+
24
+export function logout() {
25
+  return request({
26
+    url: '/user/logout',
27
+    method: 'post'
28
+  })
29
+}
30
+
31
+// 发送验证码
32
+export function sendCode(phone) {
33
+  return request({
34
+    url: '/code/sendCode',
35
+    method: 'post',
36
+    params: { phone }
37
+  })
38
+}

+ 9
- 0
VUECODE/smart-operate-manage/src/api/table.js 查看文件

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

二进制
VUECODE/smart-operate-manage/src/assets/404_images/404.png 查看文件


二进制
VUECODE/smart-operate-manage/src/assets/404_images/404_cloud.png 查看文件


+ 61
- 0
VUECODE/smart-operate-manage/src/components/Breadcrumb/index.vue 查看文件

1
+<template>
2
+  <el-breadcrumb class="app-breadcrumb" separator="/">
3
+    <transition-group name="breadcrumb">
4
+      <el-breadcrumb-item v-for="(item,index) in levelList" v-if="item.meta.title" :key="item.path">
5
+        <span v-if="item.redirect==='noredirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
6
+        <router-link v-else :to="item.redirect||item.path">{{ item.meta.title }}</router-link>
7
+      </el-breadcrumb-item>
8
+    </transition-group>
9
+  </el-breadcrumb>
10
+</template>
11
+
12
+<script>
13
+import pathToRegexp from 'path-to-regexp'
14
+
15
+export default {
16
+  data() {
17
+    return {
18
+      levelList: null
19
+    }
20
+  },
21
+  watch: {
22
+    $route() {
23
+      this.getBreadcrumb()
24
+    }
25
+  },
26
+  created() {
27
+    this.getBreadcrumb()
28
+  },
29
+  methods: {
30
+    getBreadcrumb() {
31
+      const { params } = this.$route
32
+      let matched = this.$route.matched.filter(item => {
33
+        if (item.name) {
34
+          // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
35
+          var toPath = pathToRegexp.compile(item.path)
36
+          item.path = toPath(params)
37
+          return true
38
+        }
39
+      })
40
+      const first = matched[0]
41
+      if (first && first.name !== 'dashboard') {
42
+        matched = [{ path: '/dashboard', meta: { title: 'Dashboard' }}].concat(matched)
43
+      }
44
+      this.levelList = matched
45
+    }
46
+  }
47
+}
48
+</script>
49
+
50
+<style rel="stylesheet/scss" lang="scss" scoped>
51
+  .app-breadcrumb.el-breadcrumb {
52
+    display: inline-block;
53
+    font-size: 14px;
54
+    line-height: 50px;
55
+    margin-left: 10px;
56
+    .no-redirect {
57
+      color: #97a8be;
58
+      cursor: text;
59
+    }
60
+  }
61
+</style>

+ 58
- 0
VUECODE/smart-operate-manage/src/components/Hamburger/index.vue 查看文件

1
+<template>
2
+  <div>
3
+    <svg
4
+      :class="{'is-active':isActive}"
5
+      t="1492500959545"
6
+      class="hamburger"
7
+      style=""
8
+      viewBox="0 0 1024 1024"
9
+      version="1.1"
10
+      xmlns="http://www.w3.org/2000/svg"
11
+      p-id="1691"
12
+      xmlns:xlink="http://www.w3.org/1999/xlink"
13
+      width="64"
14
+      height="64"
15
+      @click="toggleClick">
16
+      <path
17
+        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"
18
+        p-id="1692" />
19
+      <path
20
+        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"
21
+        p-id="1693" />
22
+      <path
23
+        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"
24
+        p-id="1694" />
25
+    </svg>
26
+  </div>
27
+</template>
28
+
29
+<script>
30
+export default {
31
+  name: 'Hamburger',
32
+  props: {
33
+    isActive: {
34
+      type: Boolean,
35
+      default: false
36
+    },
37
+    toggleClick: {
38
+      type: Function,
39
+      default: null
40
+    }
41
+  }
42
+}
43
+</script>
44
+
45
+<style scoped>
46
+.hamburger {
47
+	display: inline-block;
48
+	cursor: pointer;
49
+	width: 20px;
50
+	height: 20px;
51
+	transform: rotate(90deg);
52
+	transition: .38s;
53
+	transform-origin: 50% 50%;
54
+}
55
+.hamburger.is-active {
56
+	transform: rotate(0deg);
57
+}
58
+</style>

+ 43
- 0
VUECODE/smart-operate-manage/src/components/SvgIcon/index.vue 查看文件

1
+<template>
2
+  <svg :class="svgClass" aria-hidden="true">
3
+    <use :xlink:href="iconName"/>
4
+  </svg>
5
+</template>
6
+
7
+<script>
8
+export default {
9
+  name: 'SvgIcon',
10
+  props: {
11
+    iconClass: {
12
+      type: String,
13
+      required: true
14
+    },
15
+    className: {
16
+      type: String,
17
+      default: ''
18
+    }
19
+  },
20
+  computed: {
21
+    iconName() {
22
+      return `#icon-${this.iconClass}`
23
+    },
24
+    svgClass() {
25
+      if (this.className) {
26
+        return 'svg-icon ' + this.className
27
+      } else {
28
+        return 'svg-icon'
29
+      }
30
+    }
31
+  }
32
+}
33
+</script>
34
+
35
+<style scoped>
36
+.svg-icon {
37
+  width: 1em;
38
+  height: 1em;
39
+  vertical-align: -0.15em;
40
+  fill: currentColor;
41
+  overflow: hidden;
42
+}
43
+</style>

+ 9
- 0
VUECODE/smart-operate-manage/src/icons/index.js 查看文件

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

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/example.svg 查看文件

1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/eye.svg 查看文件

1
+<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/form.svg 查看文件

1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/link.svg 查看文件

1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></g></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/nested.svg 查看文件

1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/password.svg 查看文件

1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/table.svg 查看文件

1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><g><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></g></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/tree.svg 查看文件

1
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>

+ 1
- 0
VUECODE/smart-operate-manage/src/icons/svg/user.svg 查看文件

1
+<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>

+ 22
- 0
VUECODE/smart-operate-manage/src/icons/svgo.yml 查看文件

1
+# replace default config
2
+
3
+# multipass: true
4
+# full: true
5
+
6
+plugins:
7
+
8
+  # - name
9
+  #
10
+  # or:
11
+  # - name: false
12
+  # - name: true
13
+  #
14
+  # or:
15
+  # - name:
16
+  #     param1: 1
17
+  #     param2: 2
18
+
19
+- removeAttrs:
20
+    attrs:
21
+      - 'fill'
22
+      - 'fill-rule'

+ 27
- 0
VUECODE/smart-operate-manage/src/main.js 查看文件

1
+import Vue from 'vue'
2
+
3
+import 'normalize.css/normalize.css' // A modern alternative to CSS resets
4
+
5
+import ElementUI from 'element-ui'
6
+import 'element-ui/lib/theme-chalk/index.css'
7
+import locale from 'element-ui/lib/locale/lang/en' // lang i18n
8
+
9
+import '@/styles/index.scss' // global css
10
+
11
+import App from './App'
12
+import router from './router'
13
+import store from './store'
14
+
15
+import '@/icons' // icon
16
+import '@/permission' // permission control
17
+
18
+Vue.use(ElementUI, { locale })
19
+
20
+Vue.config.productionTip = false
21
+
22
+new Vue({
23
+  el: '#app',
24
+  router,
25
+  store,
26
+  render: h => h(App)
27
+})

+ 41
- 0
VUECODE/smart-operate-manage/src/permission.js 查看文件

1
+import router from './router'
2
+import store from './store'
3
+import NProgress from 'nprogress' // Progress 进度条
4
+import 'nprogress/nprogress.css'// Progress 进度条样式
5
+import { Message } from 'element-ui'
6
+import { getToken } from '@/utils/auth' // 验权
7
+
8
+const whiteList = ['/login'] // 不重定向白名单
9
+router.beforeEach((to, from, next) => {
10
+  NProgress.start()
11
+  if (getToken()) {
12
+    if (to.path === '/login') {
13
+      next({ path: '/' })
14
+      NProgress.done() // if current page is dashboard will not trigger	afterEach hook, so manually handle it
15
+    } else {
16
+      if (store.getters.roles.length === 0) {
17
+        store.dispatch('GetInfo').then(res => { // 拉取用户信息
18
+          next()
19
+        }).catch((err) => {
20
+          store.dispatch('FedLogOut').then(() => {
21
+            Message.error(err || 'Verification failed, please login again')
22
+            next({ path: '/' })
23
+          })
24
+        })
25
+      } else {
26
+        next()
27
+      }
28
+    }
29
+  } else {
30
+    if (whiteList.indexOf(to.path) !== -1) {
31
+      next()
32
+    } else {
33
+      next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
34
+      NProgress.done()
35
+    }
36
+  }
37
+})
38
+
39
+router.afterEach(() => {
40
+  NProgress.done() // 结束Progress
41
+})

+ 79
- 0
VUECODE/smart-operate-manage/src/router/index.js 查看文件

1
+import Vue from 'vue'
2
+import Router from 'vue-router'
3
+
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
+// detail: https://panjiachen.github.io/vue-element-admin-site/#/lazy-loading
6
+
7
+Vue.use(Router)
8
+
9
+/* Layout */
10
+import Layout from '../views/layout/Layout'
11
+
12
+/**
13
+* hidden: true                   if `hidden:true` will not show in the sidebar(default is false)
14
+* alwaysShow: true               if set true, will always show the root menu, whatever its child routes length
15
+*                                if not set alwaysShow, only more than one route under the children
16
+*                                it will becomes nested mode, otherwise not show the root menu
17
+* redirect: noredirect           if `redirect:noredirect` will no redirect in the breadcrumb
18
+* name:'router-name'             the name is used by <keep-alive> (must set!!!)
19
+* meta : {
20
+    title: 'title'               the name show in submenu and breadcrumb (recommend set)
21
+    icon: 'svg-name'             the icon show in the sidebar,
22
+  }
23
+**/
24
+export const constantRouterMap = [
25
+  { path: '/login', component: () => import('@/views/login/index'), hidden: true },
26
+  { path: '/404', component: () => import('@/views/404'), hidden: true },
27
+
28
+  {
29
+    path: '/',
30
+    component: Layout,
31
+    redirect: '/dashboard',
32
+    name: 'Dashboard',
33
+    hidden: true,
34
+    children: [{
35
+      path: 'dashboard',
36
+      component: () => import('@/views/dashboard/index')
37
+    }]
38
+  },
39
+
40
+  {
41
+    path: '/community',
42
+    component: Layout,
43
+    redirect: '/conmmunity/download',
44
+    alwaysShow: true,
45
+    meta: { title: '社区数据', icon: 'zip' },
46
+    children: [
47
+      {
48
+        path: 'download',
49
+        component: () => import('@/views/table/index'),
50
+        name: 'ExportZip',
51
+        meta: { title: '社区列表', icon: 'table' }
52
+      }
53
+    ]
54
+  },
55
+
56
+  {
57
+    path: '/banner',
58
+    component: Layout,
59
+    redirect: '/banner/download',
60
+    alwaysShow: true,
61
+    meta: { title: '运营数据', icon: 'zip' },
62
+    children: [   
63
+      {
64
+        path: 'download',
65
+        component: () => import('@/views/table/index'),
66
+        name: 'ExportZip',
67
+        meta: { title: 'banner运营', icon: 'table' }
68
+      }
69
+    ]
70
+  },
71
+
72
+  { path: '*', redirect: '/404', hidden: true }
73
+]
74
+
75
+export default new Router({
76
+  // mode: 'history', //后端支持可开
77
+  scrollBehavior: () => ({ y: 0 }),
78
+  routes: constantRouterMap
79
+})

+ 9
- 0
VUECODE/smart-operate-manage/src/store/getters.js 查看文件

1
+const getters = {
2
+  sidebar: state => state.app.sidebar,
3
+  device: state => state.app.device,
4
+  token: state => state.user.token,
5
+  avatar: state => state.user.avatar,
6
+  name: state => state.user.name,
7
+  roles: state => state.user.roles
8
+}
9
+export default getters

+ 17
- 0
VUECODE/smart-operate-manage/src/store/index.js 查看文件

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

+ 43
- 0
VUECODE/smart-operate-manage/src/store/modules/app.js 查看文件

1
+import Cookies from 'js-cookie'
2
+
3
+const app = {
4
+  state: {
5
+    sidebar: {
6
+      opened: !+Cookies.get('sidebarStatus'),
7
+      withoutAnimation: false
8
+    },
9
+    device: 'desktop'
10
+  },
11
+  mutations: {
12
+    TOGGLE_SIDEBAR: state => {
13
+      if (state.sidebar.opened) {
14
+        Cookies.set('sidebarStatus', 1)
15
+      } else {
16
+        Cookies.set('sidebarStatus', 0)
17
+      }
18
+      state.sidebar.opened = !state.sidebar.opened
19
+      state.sidebar.withoutAnimation = false
20
+    },
21
+    CLOSE_SIDEBAR: (state, withoutAnimation) => {
22
+      Cookies.set('sidebarStatus', 1)
23
+      state.sidebar.opened = false
24
+      state.sidebar.withoutAnimation = withoutAnimation
25
+    },
26
+    TOGGLE_DEVICE: (state, device) => {
27
+      state.device = device
28
+    }
29
+  },
30
+  actions: {
31
+    ToggleSideBar: ({ commit }) => {
32
+      commit('TOGGLE_SIDEBAR')
33
+    },
34
+    CloseSideBar({ commit }, { withoutAnimation }) {
35
+      commit('CLOSE_SIDEBAR', withoutAnimation)
36
+    },
37
+    ToggleDevice({ commit }, device) {
38
+      commit('TOGGLE_DEVICE', device)
39
+    }
40
+  }
41
+}
42
+
43
+export default app

+ 99
- 0
VUECODE/smart-operate-manage/src/store/modules/user.js 查看文件

1
+import { login, logout, getInfo, sendCode } from '@/api/login'
2
+import { getToken, setToken, removeToken } from '@/utils/auth'
3
+
4
+const user = {
5
+  state: {
6
+    token: getToken(),
7
+    name: '',
8
+    avatar: '',
9
+    roles: []
10
+  },
11
+
12
+  mutations: {
13
+    SET_TOKEN: (state, token) => {
14
+      state.token = token
15
+    },
16
+    SET_NAME: (state, name) => {
17
+      state.name = name
18
+    },
19
+    SET_AVATAR: (state, avatar) => {
20
+      state.avatar = avatar
21
+    },
22
+    SET_ROLES: (state, roles) => {
23
+      state.roles = roles
24
+    }
25
+  },
26
+
27
+  actions: {
28
+    // 登录
29
+    Login({ commit }, userInfo) {
30
+      const username = userInfo.username.trim()
31
+      return new Promise((resolve, reject) => {
32
+        login(username, userInfo.password).then(response => {
33
+          const data = response.data
34
+          setToken(data.token)
35
+          commit('SET_TOKEN', data.token)
36
+          resolve()
37
+        }).catch(error => {
38
+          reject(error)
39
+        })
40
+      })
41
+    },
42
+
43
+    // 获取用户信息
44
+    GetInfo({ commit, state }) {
45
+      return new Promise((resolve, reject) => {
46
+        getInfo(state.token).then(response => {
47
+          const data = response.data
48
+          if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
49
+            commit('SET_ROLES', data.roles)
50
+          } else {
51
+            reject('getInfo: roles must be a non-null array !')
52
+          }
53
+          commit('SET_NAME', data.name)
54
+          commit('SET_AVATAR', data.avatar)
55
+          resolve(response)
56
+        }).catch(error => {
57
+          reject(error)
58
+        })
59
+      })
60
+    },
61
+
62
+    // 发送验证码
63
+    SendCode({ commit, state }, userName) {
64
+      return new Promise((resolve, reject) => {
65
+        sendCode(userName).then(response => {
66
+          const data = response.message
67
+          resolve(data)
68
+        }).catch(error => {
69
+          reject(error)
70
+        })
71
+      })
72
+    },
73
+
74
+    // 登出
75
+    LogOut({ commit, state }) {
76
+      return new Promise((resolve, reject) => {
77
+        logout(state.token).then(() => {
78
+          commit('SET_TOKEN', '')
79
+          commit('SET_ROLES', [])
80
+          removeToken()
81
+          resolve()
82
+        }).catch(error => {
83
+          reject(error)
84
+        })
85
+      })
86
+    },
87
+
88
+    // 前端 登出
89
+    FedLogOut({ commit }) {
90
+      return new Promise(resolve => {
91
+        commit('SET_TOKEN', '')
92
+        removeToken()
93
+        resolve()
94
+      })
95
+    }
96
+  }
97
+}
98
+
99
+export default user

+ 29
- 0
VUECODE/smart-operate-manage/src/styles/element-ui.scss 查看文件

1
+ //to reset element-ui default css
2
+.el-upload {
3
+  input[type="file"] {
4
+    display: none !important;
5
+  }
6
+}
7
+
8
+.el-upload__input {
9
+  display: none;
10
+}
11
+
12
+//暂时性解决diolag 问题 https://github.com/ElemeFE/element/issues/2461
13
+.el-dialog {
14
+  transform: none;
15
+  left: 0;
16
+  position: relative;
17
+  margin: 0 auto;
18
+}
19
+
20
+//element ui upload
21
+.upload-container {
22
+  .el-upload {
23
+    width: 100%;
24
+    .el-upload-dragger {
25
+      width: 100%;
26
+      height: 200px;
27
+    }
28
+  }
29
+}

+ 78
- 0
VUECODE/smart-operate-manage/src/styles/index.scss 查看文件

1
+@import './variables.scss';
2
+@import './mixin.scss';
3
+@import './transition.scss';
4
+@import './element-ui.scss';
5
+@import './sidebar.scss';
6
+
7
+body {
8
+  height: 100%;
9
+  -moz-osx-font-smoothing: grayscale;
10
+  -webkit-font-smoothing: antialiased;
11
+  text-rendering: optimizeLegibility;
12
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
13
+}
14
+
15
+label {
16
+  font-weight: 700;
17
+}
18
+
19
+html {
20
+  height: 100%;
21
+  box-sizing: border-box;
22
+}
23
+
24
+#app{
25
+  height: 100%;
26
+}
27
+
28
+*,
29
+*:before,
30
+*:after {
31
+  box-sizing: inherit;
32
+}
33
+
34
+a,
35
+a:focus,
36
+a:hover {
37
+  cursor: pointer;
38
+  color: inherit;
39
+  outline: none;
40
+  text-decoration: none;
41
+}
42
+
43
+div:focus{
44
+  outline: none;
45
+ }
46
+
47
+a:focus,
48
+a:active {
49
+  outline: none;
50
+}
51
+
52
+a,
53
+a:focus,
54
+a:hover {
55
+  cursor: pointer;
56
+  color: inherit;
57
+  text-decoration: none;
58
+}
59
+
60
+.clearfix {
61
+  &:after {
62
+    visibility: hidden;
63
+    display: block;
64
+    font-size: 0;
65
+    content: " ";
66
+    clear: both;
67
+    height: 0;
68
+  }
69
+}
70
+
71
+//main-container全局样式
72
+.app-main{
73
+  min-height: 100%
74
+}
75
+
76
+.app-container {
77
+  padding: 20px;
78
+}

+ 27
- 0
VUECODE/smart-operate-manage/src/styles/mixin.scss 查看文件

1
+@mixin clearfix {
2
+  &:after {
3
+    content: "";
4
+    display: table;
5
+    clear: both;
6
+  }
7
+}
8
+
9
+@mixin scrollBar {
10
+  &::-webkit-scrollbar-track-piece {
11
+    background: #d3dce6;
12
+  }
13
+  &::-webkit-scrollbar {
14
+    width: 6px;
15
+  }
16
+  &::-webkit-scrollbar-thumb {
17
+    background: #99a9bf;
18
+    border-radius: 20px;
19
+  }
20
+}
21
+
22
+@mixin relative {
23
+  position: relative;
24
+  width: 100%;
25
+  height: 100%;
26
+}
27
+

+ 133
- 0
VUECODE/smart-operate-manage/src/styles/sidebar.scss 查看文件

1
+#app {
2
+  // 主体区域
3
+  .main-container {
4
+    min-height: 100%;
5
+    transition: margin-left .28s;
6
+    margin-left: 180px;
7
+    position: relative;
8
+  }
9
+  // 侧边栏
10
+  .sidebar-container {
11
+    transition: width 0.28s;
12
+    width: 180px !important;
13
+    height: 100%;
14
+    position: fixed;
15
+    font-size: 0px;
16
+    top: 0;
17
+    bottom: 0;
18
+    left: 0;
19
+    z-index: 1001;
20
+    overflow: hidden;
21
+    //reset element-ui css
22
+    .horizontal-collapse-transition {
23
+      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
24
+    }
25
+    .el-scrollbar__bar.is-vertical{
26
+      right: 0px;
27
+    }
28
+    .scrollbar-wrapper {
29
+      overflow-x: hidden!important;
30
+      .el-scrollbar__view {
31
+        height: 100%;
32
+      }
33
+    }
34
+    .is-horizontal {
35
+      display: none;
36
+    }
37
+    a {
38
+      display: inline-block;
39
+      width: 100%;
40
+      overflow: hidden;
41
+    }
42
+    .svg-icon {
43
+      margin-right: 16px;
44
+    }
45
+    .el-menu {
46
+      border: none;
47
+      height: 100%;
48
+      width: 100% !important;
49
+    }
50
+    .is-active > .el-submenu__title{
51
+      color: #f4f4f5!important;
52
+    }
53
+  }
54
+  .hideSidebar {
55
+    .sidebar-container {
56
+      width: 36px !important;
57
+    }
58
+    .main-container {
59
+      margin-left: 36px;
60
+    }
61
+    .submenu-title-noDropdown {
62
+      padding-left: 10px !important;
63
+      position: relative;
64
+      .el-tooltip {
65
+        padding: 0 10px !important;
66
+      }
67
+    }
68
+    .el-submenu {
69
+      overflow: hidden;
70
+      &>.el-submenu__title {
71
+        padding-left: 10px !important;
72
+        .el-submenu__icon-arrow {
73
+          display: none;
74
+        }
75
+      }
76
+    }
77
+    .el-menu--collapse {
78
+      .el-submenu {
79
+        &>.el-submenu__title {
80
+          &>span {
81
+            height: 0;
82
+            width: 0;
83
+            overflow: hidden;
84
+            visibility: hidden;
85
+            display: inline-block;
86
+          }
87
+        }
88
+      }
89
+    }
90
+  }
91
+  .sidebar-container .nest-menu .el-submenu>.el-submenu__title,
92
+  .sidebar-container .el-submenu .el-menu-item {
93
+    min-width: 180px !important;
94
+    background-color: $subMenuBg !important;
95
+    &:hover {
96
+      background-color: $menuHover !important;
97
+    }
98
+  }
99
+  .el-menu--collapse .el-menu .el-submenu {
100
+    min-width: 180px !important;
101
+  }
102
+
103
+  //适配移动端
104
+  .mobile {
105
+    .main-container {
106
+      margin-left: 0px;
107
+    }
108
+    .sidebar-container {
109
+      transition: transform .28s;
110
+      width: 180px !important;
111
+    }
112
+    &.hideSidebar {
113
+      .sidebar-container {
114
+        transition-duration: 0.3s;
115
+        transform: translate3d(-180px, 0, 0);
116
+      }
117
+    }
118
+  }
119
+  .withoutAnimation {
120
+    .main-container,
121
+    .sidebar-container {
122
+      transition: none;
123
+    }
124
+  }
125
+}
126
+
127
+.el-menu--vertical{
128
+  & >.el-menu{
129
+    .svg-icon{
130
+      margin-right: 16px;
131
+    }
132
+  }
133
+}

+ 46
- 0
VUECODE/smart-operate-manage/src/styles/transition.scss 查看文件

1
+//globl transition css
2
+
3
+/*fade*/
4
+.fade-enter-active,
5
+.fade-leave-active {
6
+  transition: opacity 0.28s;
7
+}
8
+
9
+.fade-enter,
10
+.fade-leave-active {
11
+  opacity: 0;
12
+}
13
+
14
+/*fade-transform*/
15
+.fade-transform-leave-active,
16
+.fade-transform-enter-active {
17
+  transition: all .5s;
18
+}
19
+.fade-transform-enter {
20
+  opacity: 0;
21
+  transform: translateX(-30px);
22
+}
23
+.fade-transform-leave-to {
24
+  opacity: 0;
25
+  transform: translateX(30px);
26
+}
27
+
28
+/*fade*/
29
+.breadcrumb-enter-active,
30
+.breadcrumb-leave-active {
31
+  transition: all .5s;
32
+}
33
+
34
+.breadcrumb-enter,
35
+.breadcrumb-leave-active {
36
+  opacity: 0;
37
+  transform: translateX(20px);
38
+}
39
+
40
+.breadcrumb-move {
41
+  transition: all .5s;
42
+}
43
+
44
+.breadcrumb-leave-active {
45
+  position: absolute;
46
+}

+ 4
- 0
VUECODE/smart-operate-manage/src/styles/variables.scss 查看文件

1
+//sidebar
2
+$menuBg:#304156;
3
+$subMenuBg:#1f2d3d;
4
+$menuHover:#001528;

+ 15
- 0
VUECODE/smart-operate-manage/src/utils/auth.js 查看文件

1
+import Cookies from 'js-cookie'
2
+
3
+const TokenKey = 'Admin-Token'
4
+
5
+export function getToken() {
6
+  return Cookies.get(TokenKey)
7
+}
8
+
9
+export function setToken(token) {
10
+  return Cookies.set(TokenKey, token)
11
+}
12
+
13
+export function removeToken() {
14
+  return Cookies.remove(TokenKey)
15
+}

+ 74
- 0
VUECODE/smart-operate-manage/src/utils/index.js 查看文件

1
+/**
2
+ * Created by jiachenpan on 16/11/18.
3
+ */
4
+
5
+export function parseTime(time, cFormat) {
6
+  if (arguments.length === 0) {
7
+    return null
8
+  }
9
+  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
10
+  let date
11
+  if (typeof time === 'object') {
12
+    date = time
13
+  } else {
14
+    if (('' + time).length === 10) time = parseInt(time) * 1000
15
+    date = new Date(time)
16
+  }
17
+  const formatObj = {
18
+    y: date.getFullYear(),
19
+    m: date.getMonth() + 1,
20
+    d: date.getDate(),
21
+    h: date.getHours(),
22
+    i: date.getMinutes(),
23
+    s: date.getSeconds(),
24
+    a: date.getDay()
25
+  }
26
+  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
27
+    let value = formatObj[key]
28
+    // Note: getDay() returns 0 on Sunday
29
+    if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }
30
+    if (result.length > 0 && value < 10) {
31
+      value = '0' + value
32
+    }
33
+    return value || 0
34
+  })
35
+  return time_str
36
+}
37
+
38
+export function formatTime(time, option) {
39
+  time = +time * 1000
40
+  const d = new Date(time)
41
+  const now = Date.now()
42
+
43
+  const diff = (now - d) / 1000
44
+
45
+  if (diff < 30) {
46
+    return '刚刚'
47
+  } else if (diff < 3600) {
48
+    // less 1 hour
49
+    return Math.ceil(diff / 60) + '分钟前'
50
+  } else if (diff < 3600 * 24) {
51
+    return Math.ceil(diff / 3600) + '小时前'
52
+  } else if (diff < 3600 * 24 * 2) {
53
+    return '1天前'
54
+  }
55
+  if (option) {
56
+    return parseTime(time, option)
57
+  } else {
58
+    return (
59
+      d.getMonth() +
60
+      1 +
61
+      '月' +
62
+      d.getDate() +
63
+      '日' +
64
+      d.getHours() +
65
+      '时' +
66
+      d.getMinutes() +
67
+      '分'
68
+    )
69
+  }
70
+}
71
+
72
+export function isExternal(path) {
73
+  return /^(https?:|mailto:|tel:)/.test(path)
74
+}

+ 73
- 0
VUECODE/smart-operate-manage/src/utils/request.js 查看文件

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

+ 38
- 0
VUECODE/smart-operate-manage/src/utils/validate.js 查看文件

1
+/**
2
+ * Created by jiachenpan on 16/11/18.
3
+ */
4
+/* 手机号码*/
5
+export function isvalidUsername(str) {
6
+  const reg = /^1(3|4|5|7|8)\d{9}$/
7
+  return reg.test(str)
8
+}
9
+
10
+/* 合法uri*/
11
+export function validateURL(textval) {
12
+  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.,?'\\+&%$#=~_-]+))*$/
13
+  return urlregex.test(textval)
14
+}
15
+
16
+/* 小写字母*/
17
+export function validateLowerCase(str) {
18
+  const reg = /^[a-z]+$/
19
+  return reg.test(str)
20
+}
21
+
22
+/* 大写字母*/
23
+export function validateUpperCase(str) {
24
+  const reg = /^[A-Z]+$/
25
+  return reg.test(str)
26
+}
27
+
28
+/* 大小写字母*/
29
+export function validatAlphabets(str) {
30
+  const reg = /^[A-Za-z]+$/
31
+  return reg.test(str)
32
+}
33
+
34
+/* 四位数字验证码*/
35
+export function validatCode(str) {
36
+  const reg = /^\d{4}$/
37
+  return reg.test(str)
38
+}

+ 228
- 0
VUECODE/smart-operate-manage/src/views/404.vue 查看文件

1
+<template>
2
+  <div class="wscn-http404-container">
3
+    <div class="wscn-http404">
4
+      <div class="pic-404">
5
+        <img class="pic-404__parent" src="@/assets/404_images/404.png" alt="404">
6
+        <img class="pic-404__child left" src="@/assets/404_images/404_cloud.png" alt="404">
7
+        <img class="pic-404__child mid" src="@/assets/404_images/404_cloud.png" alt="404">
8
+        <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404">
9
+      </div>
10
+      <div class="bullshit">
11
+        <div class="bullshit__oops">OOPS!</div>
12
+        <div class="bullshit__info">版权所有
13
+          <a class="link-type" href="https://wallstreetcn.com" target="_blank">华尔街见闻</a>
14
+        </div>
15
+        <div class="bullshit__headline">{{ message }}</div>
16
+        <div class="bullshit__info">请检查您输入的网址是否正确,请点击以下按钮返回主页或者发送错误报告</div>
17
+        <a href="" class="bullshit__return-home">返回首页</a>
18
+      </div>
19
+    </div>
20
+  </div>
21
+</template>
22
+
23
+<script>
24
+
25
+export default {
26
+  name: 'Page404',
27
+  computed: {
28
+    message() {
29
+      return '网管说这个页面你不能进......'
30
+    }
31
+  }
32
+}
33
+</script>
34
+
35
+<style rel="stylesheet/scss" lang="scss" scoped>
36
+.wscn-http404-container{
37
+  transform: translate(-50%,-50%);
38
+  position: absolute;
39
+  top: 40%;
40
+  left: 50%;
41
+}
42
+.wscn-http404 {
43
+  position: relative;
44
+  width: 1200px;
45
+  padding: 0 50px;
46
+  overflow: hidden;
47
+  .pic-404 {
48
+    position: relative;
49
+    float: left;
50
+    width: 600px;
51
+    overflow: hidden;
52
+    &__parent {
53
+      width: 100%;
54
+    }
55
+    &__child {
56
+      position: absolute;
57
+      &.left {
58
+        width: 80px;
59
+        top: 17px;
60
+        left: 220px;
61
+        opacity: 0;
62
+        animation-name: cloudLeft;
63
+        animation-duration: 2s;
64
+        animation-timing-function: linear;
65
+        animation-fill-mode: forwards;
66
+        animation-delay: 1s;
67
+      }
68
+      &.mid {
69
+        width: 46px;
70
+        top: 10px;
71
+        left: 420px;
72
+        opacity: 0;
73
+        animation-name: cloudMid;
74
+        animation-duration: 2s;
75
+        animation-timing-function: linear;
76
+        animation-fill-mode: forwards;
77
+        animation-delay: 1.2s;
78
+      }
79
+      &.right {
80
+        width: 62px;
81
+        top: 100px;
82
+        left: 500px;
83
+        opacity: 0;
84
+        animation-name: cloudRight;
85
+        animation-duration: 2s;
86
+        animation-timing-function: linear;
87
+        animation-fill-mode: forwards;
88
+        animation-delay: 1s;
89
+      }
90
+      @keyframes cloudLeft {
91
+        0% {
92
+          top: 17px;
93
+          left: 220px;
94
+          opacity: 0;
95
+        }
96
+        20% {
97
+          top: 33px;
98
+          left: 188px;
99
+          opacity: 1;
100
+        }
101
+        80% {
102
+          top: 81px;
103
+          left: 92px;
104
+          opacity: 1;
105
+        }
106
+        100% {
107
+          top: 97px;
108
+          left: 60px;
109
+          opacity: 0;
110
+        }
111
+      }
112
+      @keyframes cloudMid {
113
+        0% {
114
+          top: 10px;
115
+          left: 420px;
116
+          opacity: 0;
117
+        }
118
+        20% {
119
+          top: 40px;
120
+          left: 360px;
121
+          opacity: 1;
122
+        }
123
+        70% {
124
+          top: 130px;
125
+          left: 180px;
126
+          opacity: 1;
127
+        }
128
+        100% {
129
+          top: 160px;
130
+          left: 120px;
131
+          opacity: 0;
132
+        }
133
+      }
134
+      @keyframes cloudRight {
135
+        0% {
136
+          top: 100px;
137
+          left: 500px;
138
+          opacity: 0;
139
+        }
140
+        20% {
141
+          top: 120px;
142
+          left: 460px;
143
+          opacity: 1;
144
+        }
145
+        80% {
146
+          top: 180px;
147
+          left: 340px;
148
+          opacity: 1;
149
+        }
150
+        100% {
151
+          top: 200px;
152
+          left: 300px;
153
+          opacity: 0;
154
+        }
155
+      }
156
+    }
157
+  }
158
+  .bullshit {
159
+    position: relative;
160
+    float: left;
161
+    width: 300px;
162
+    padding: 30px 0;
163
+    overflow: hidden;
164
+    &__oops {
165
+      font-size: 32px;
166
+      font-weight: bold;
167
+      line-height: 40px;
168
+      color: #1482f0;
169
+      opacity: 0;
170
+      margin-bottom: 20px;
171
+      animation-name: slideUp;
172
+      animation-duration: 0.5s;
173
+      animation-fill-mode: forwards;
174
+    }
175
+    &__headline {
176
+      font-size: 20px;
177
+      line-height: 24px;
178
+      color: #222;
179
+      font-weight: bold;
180
+      opacity: 0;
181
+      margin-bottom: 10px;
182
+      animation-name: slideUp;
183
+      animation-duration: 0.5s;
184
+      animation-delay: 0.1s;
185
+      animation-fill-mode: forwards;
186
+    }
187
+    &__info {
188
+      font-size: 13px;
189
+      line-height: 21px;
190
+      color: grey;
191
+      opacity: 0;
192
+      margin-bottom: 30px;
193
+      animation-name: slideUp;
194
+      animation-duration: 0.5s;
195
+      animation-delay: 0.2s;
196
+      animation-fill-mode: forwards;
197
+    }
198
+    &__return-home {
199
+      display: block;
200
+      float: left;
201
+      width: 110px;
202
+      height: 36px;
203
+      background: #1482f0;
204
+      border-radius: 100px;
205
+      text-align: center;
206
+      color: #ffffff;
207
+      opacity: 0;
208
+      font-size: 14px;
209
+      line-height: 36px;
210
+      cursor: pointer;
211
+      animation-name: slideUp;
212
+      animation-duration: 0.5s;
213
+      animation-delay: 0.3s;
214
+      animation-fill-mode: forwards;
215
+    }
216
+    @keyframes slideUp {
217
+      0% {
218
+        transform: translateY(60px);
219
+        opacity: 0;
220
+      }
221
+      100% {
222
+        transform: translateY(0);
223
+        opacity: 1;
224
+      }
225
+    }
226
+  }
227
+}
228
+</style>

+ 32
- 0
VUECODE/smart-operate-manage/src/views/dashboard/index.vue 查看文件

1
+<template>
2
+  <div class="dashboard-container">
3
+    <div class="dashboard-text">name:{{ name }}</div>
4
+    <div class="dashboard-text">roles:<span v-for="role in roles" :key="role">{{ role }}</span></div>
5
+  </div>
6
+</template>
7
+
8
+<script>
9
+import { mapGetters } from 'vuex'
10
+
11
+export default {
12
+  name: 'Dashboard',
13
+  computed: {
14
+    ...mapGetters([
15
+      'name',
16
+      'roles'
17
+    ])
18
+  }
19
+}
20
+</script>
21
+
22
+<style rel="stylesheet/scss" lang="scss" scoped>
23
+.dashboard {
24
+  &-container {
25
+    margin: 30px;
26
+  }
27
+  &-text {
28
+    font-size: 30px;
29
+    line-height: 46px;
30
+  }
31
+}
32
+</style>

+ 85
- 0
VUECODE/smart-operate-manage/src/views/form/index.vue 查看文件

1
+<template>
2
+  <div class="app-container">
3
+    <el-form ref="form" :model="form" label-width="120px">
4
+      <el-form-item label="Activity name">
5
+        <el-input v-model="form.name"/>
6
+      </el-form-item>
7
+      <el-form-item label="Activity zone">
8
+        <el-select v-model="form.region" placeholder="please select your zone">
9
+          <el-option label="Zone one" value="shanghai"/>
10
+          <el-option label="Zone two" value="beijing"/>
11
+        </el-select>
12
+      </el-form-item>
13
+      <el-form-item label="Activity time">
14
+        <el-col :span="11">
15
+          <el-date-picker v-model="form.date1" type="date" placeholder="Pick a date" style="width: 100%;"/>
16
+        </el-col>
17
+        <el-col :span="2" class="line">-</el-col>
18
+        <el-col :span="11">
19
+          <el-time-picker v-model="form.date2" type="fixed-time" placeholder="Pick a time" style="width: 100%;"/>
20
+        </el-col>
21
+      </el-form-item>
22
+      <el-form-item label="Instant delivery">
23
+        <el-switch v-model="form.delivery"/>
24
+      </el-form-item>
25
+      <el-form-item label="Activity type">
26
+        <el-checkbox-group v-model="form.type">
27
+          <el-checkbox label="Online activities" name="type"/>
28
+          <el-checkbox label="Promotion activities" name="type"/>
29
+          <el-checkbox label="Offline activities" name="type"/>
30
+          <el-checkbox label="Simple brand exposure" name="type"/>
31
+        </el-checkbox-group>
32
+      </el-form-item>
33
+      <el-form-item label="Resources">
34
+        <el-radio-group v-model="form.resource">
35
+          <el-radio label="Sponsor"/>
36
+          <el-radio label="Venue"/>
37
+        </el-radio-group>
38
+      </el-form-item>
39
+      <el-form-item label="Activity form">
40
+        <el-input v-model="form.desc" type="textarea"/>
41
+      </el-form-item>
42
+      <el-form-item>
43
+        <el-button type="primary" @click="onSubmit">Create</el-button>
44
+        <el-button @click="onCancel">Cancel</el-button>
45
+      </el-form-item>
46
+    </el-form>
47
+  </div>
48
+</template>
49
+
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
+      this.$message('submit!')
69
+    },
70
+    onCancel() {
71
+      this.$message({
72
+        message: 'cancel!',
73
+        type: 'warning'
74
+      })
75
+    }
76
+  }
77
+}
78
+</script>
79
+
80
+<style scoped>
81
+.line{
82
+  text-align: center;
83
+}
84
+</style>
85
+

+ 69
- 0
VUECODE/smart-operate-manage/src/views/layout/Layout.vue 查看文件

1
+<template>
2
+  <div :class="classObj" class="app-wrapper">
3
+    <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
4
+    <sidebar class="sidebar-container"/>
5
+    <div class="main-container">
6
+      <navbar/>
7
+      <app-main/>
8
+    </div>
9
+  </div>
10
+</template>
11
+
12
+<script>
13
+import { Navbar, Sidebar, AppMain } from './components'
14
+import ResizeMixin from './mixin/ResizeHandler'
15
+
16
+export default {
17
+  name: 'Layout',
18
+  components: {
19
+    Navbar,
20
+    Sidebar,
21
+    AppMain
22
+  },
23
+  mixins: [ResizeMixin],
24
+  computed: {
25
+    sidebar() {
26
+      return this.$store.state.app.sidebar
27
+    },
28
+    device() {
29
+      return this.$store.state.app.device
30
+    },
31
+    classObj() {
32
+      return {
33
+        hideSidebar: !this.sidebar.opened,
34
+        openSidebar: this.sidebar.opened,
35
+        withoutAnimation: this.sidebar.withoutAnimation,
36
+        mobile: this.device === 'mobile'
37
+      }
38
+    }
39
+  },
40
+  methods: {
41
+    handleClickOutside() {
42
+      this.$store.dispatch('CloseSideBar', { withoutAnimation: false })
43
+    }
44
+  }
45
+}
46
+</script>
47
+
48
+<style rel="stylesheet/scss" lang="scss" scoped>
49
+  @import "src/styles/mixin.scss";
50
+  .app-wrapper {
51
+    @include clearfix;
52
+    position: relative;
53
+    height: 100%;
54
+    width: 100%;
55
+    &.mobile.openSidebar{
56
+      position: fixed;
57
+      top: 0;
58
+    }
59
+  }
60
+  .drawer-bg {
61
+    background: #000;
62
+    opacity: 0.3;
63
+    width: 100%;
64
+    top: 0;
65
+    height: 100%;
66
+    position: absolute;
67
+    z-index: 999;
68
+  }
69
+</style>

+ 29
- 0
VUECODE/smart-operate-manage/src/views/layout/components/AppMain.vue 查看文件

1
+<template>
2
+  <section class="app-main">
3
+    <transition name="fade-transform" mode="out-in">
4
+      <!-- or name="fade" -->
5
+      <!-- <router-view :key="key"></router-view> -->
6
+      <router-view/>
7
+    </transition>
8
+  </section>
9
+</template>
10
+
11
+<script>
12
+export default {
13
+  name: 'AppMain',
14
+  computed: {
15
+    // key() {
16
+    //   return this.$route.name !== undefined ? this.$route.name + +new Date() : this.$route + +new Date()
17
+    // }
18
+  }
19
+}
20
+</script>
21
+
22
+<style scoped>
23
+.app-main {
24
+  /*50 = navbar  */
25
+  min-height: calc(100vh - 50px);
26
+  position: relative;
27
+  overflow: hidden;
28
+}
29
+</style>

+ 94
- 0
VUECODE/smart-operate-manage/src/views/layout/components/Navbar.vue 查看文件

1
+<template>
2
+  <el-menu class="navbar" mode="horizontal">
3
+    <hamburger :toggle-click="toggleSideBar" :is-active="sidebar.opened" class="hamburger-container"/>
4
+    <breadcrumb />
5
+    <el-dropdown class="avatar-container" trigger="click">
6
+      <div class="avatar-wrapper">
7
+        <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar">
8
+        <i class="el-icon-caret-bottom"/>
9
+      </div>
10
+      <el-dropdown-menu slot="dropdown" class="user-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>
17
+          <span style="display:block;" @click="logout">LogOut</span>
18
+        </el-dropdown-item>
19
+      </el-dropdown-menu>
20
+    </el-dropdown>
21
+  </el-menu>
22
+</template>
23
+
24
+<script>
25
+import { mapGetters } from 'vuex'
26
+import Breadcrumb from '@/components/Breadcrumb'
27
+import Hamburger from '@/components/Hamburger'
28
+
29
+export default {
30
+  components: {
31
+    Breadcrumb,
32
+    Hamburger
33
+  },
34
+  computed: {
35
+    ...mapGetters([
36
+      'sidebar',
37
+      'avatar'
38
+    ])
39
+  },
40
+  methods: {
41
+    toggleSideBar() {
42
+      this.$store.dispatch('ToggleSideBar')
43
+    },
44
+    logout() {
45
+      this.$store.dispatch('LogOut').then(() => {
46
+        location.reload() // 为了重新实例化vue-router对象 避免bug
47
+      })
48
+    }
49
+  }
50
+}
51
+</script>
52
+
53
+<style rel="stylesheet/scss" lang="scss" scoped>
54
+.navbar {
55
+  height: 50px;
56
+  line-height: 50px;
57
+  border-radius: 0px !important;
58
+  .hamburger-container {
59
+    line-height: 58px;
60
+    height: 50px;
61
+    float: left;
62
+    padding: 0 10px;
63
+  }
64
+  .screenfull {
65
+    position: absolute;
66
+    right: 90px;
67
+    top: 16px;
68
+    color: red;
69
+  }
70
+  .avatar-container {
71
+    height: 50px;
72
+    display: inline-block;
73
+    position: absolute;
74
+    right: 35px;
75
+    .avatar-wrapper {
76
+      cursor: pointer;
77
+      margin-top: 5px;
78
+      position: relative;
79
+      .user-avatar {
80
+        width: 40px;
81
+        height: 40px;
82
+        border-radius: 10px;
83
+      }
84
+      .el-icon-caret-bottom {
85
+        position: absolute;
86
+        right: -20px;
87
+        top: 25px;
88
+        font-size: 12px;
89
+      }
90
+    }
91
+  }
92
+}
93
+</style>
94
+

+ 29
- 0
VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/Item.vue 查看文件

1
+<script>
2
+export default {
3
+  name: 'MenuItem',
4
+  functional: true,
5
+  props: {
6
+    icon: {
7
+      type: String,
8
+      default: ''
9
+    },
10
+    title: {
11
+      type: String,
12
+      default: ''
13
+    }
14
+  },
15
+  render(h, context) {
16
+    const { icon, title } = context.props
17
+    const vnodes = []
18
+
19
+    if (icon) {
20
+      vnodes.push(<svg-icon icon-class={icon}/>)
21
+    }
22
+
23
+    if (title) {
24
+      vnodes.push(<span slot='title'>{(title)}</span>)
25
+    }
26
+    return vnodes
27
+  }
28
+}
29
+</script>

+ 39
- 0
VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/Link.vue 查看文件

1
+
2
+<template>
3
+  <!-- eslint-disable vue/require-component-is -->
4
+  <component v-bind="linkProps(to)">
5
+    <slot/>
6
+  </component>
7
+</template>
8
+
9
+<script>
10
+import { isExternal } from '@/utils'
11
+
12
+export default {
13
+  props: {
14
+    to: {
15
+      type: String,
16
+      required: true
17
+    }
18
+  },
19
+  methods: {
20
+    isExternalLink(routePath) {
21
+      return isExternal(routePath)
22
+    },
23
+    linkProps(url) {
24
+      if (this.isExternalLink(url)) {
25
+        return {
26
+          is: 'a',
27
+          href: url,
28
+          target: '_blank',
29
+          rel: 'noopener'
30
+        }
31
+      }
32
+      return {
33
+        is: 'router-link',
34
+        to: url
35
+      }
36
+    }
37
+  }
38
+}
39
+</script>

+ 101
- 0
VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/SidebarItem.vue 查看文件

1
+<template>
2
+  <div v-if="!item.hidden&&item.children" class="menu-wrapper">
3
+
4
+    <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow">
5
+      <app-link :to="resolvePath(onlyOneChild.path)">
6
+        <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
7
+          <item v-if="onlyOneChild.meta" :icon="onlyOneChild.meta.icon||item.meta.icon" :title="onlyOneChild.meta.title" />
8
+        </el-menu-item>
9
+      </app-link>
10
+    </template>
11
+
12
+    <el-submenu v-else :index="resolvePath(item.path)">
13
+      <template slot="title">
14
+        <item v-if="item.meta" :icon="item.meta.icon" :title="item.meta.title" />
15
+      </template>
16
+
17
+      <template v-for="child in item.children" v-if="!child.hidden">
18
+        <sidebar-item
19
+          v-if="child.children&&child.children.length>0"
20
+          :is-nest="true"
21
+          :item="child"
22
+          :key="child.path"
23
+          :base-path="resolvePath(child.path)"
24
+          class="nest-menu" />
25
+        <app-link v-else :to="resolvePath(child.path)" :key="child.name">
26
+          <el-menu-item :index="resolvePath(child.path)">
27
+            <item v-if="child.meta" :icon="child.meta.icon" :title="child.meta.title" />
28
+          </el-menu-item>
29
+        </app-link>
30
+      </template>
31
+    </el-submenu>
32
+
33
+  </div>
34
+</template>
35
+
36
+<script>
37
+import path from 'path'
38
+import { isExternal } from '@/utils'
39
+import Item from './Item'
40
+import AppLink from './Link'
41
+
42
+export default {
43
+  name: 'SidebarItem',
44
+  components: { Item, AppLink },
45
+  props: {
46
+    // route object
47
+    item: {
48
+      type: Object,
49
+      required: true
50
+    },
51
+    isNest: {
52
+      type: Boolean,
53
+      default: false
54
+    },
55
+    basePath: {
56
+      type: String,
57
+      default: ''
58
+    }
59
+  },
60
+  data() {
61
+    return {
62
+      onlyOneChild: null
63
+    }
64
+  },
65
+  methods: {
66
+    hasOneShowingChild(children, parent) {
67
+      const showingChildren = children.filter(item => {
68
+        if (item.hidden) {
69
+          return false
70
+        } else {
71
+          // Temp set(will be used if only has one showing child)
72
+          this.onlyOneChild = item
73
+          return true
74
+        }
75
+      })
76
+
77
+      // When there is only one child router, the child router is displayed by default
78
+      if (showingChildren.length === 1) {
79
+        return true
80
+      }
81
+
82
+      // Show parent if there are no child router to display
83
+      if (showingChildren.length === 0) {
84
+        this.onlyOneChild = { ... parent, path: '', noShowingChildren: true }
85
+        return true
86
+      }
87
+
88
+      return false
89
+    },
90
+    resolvePath(routePath) {
91
+      if (this.isExternalLink(routePath)) {
92
+        return routePath
93
+      }
94
+      return path.resolve(this.basePath, routePath)
95
+    },
96
+    isExternalLink(routePath) {
97
+      return isExternal(routePath)
98
+    }
99
+  }
100
+}
101
+</script>

+ 35
- 0
VUECODE/smart-operate-manage/src/views/layout/components/Sidebar/index.vue 查看文件

1
+<template>
2
+  <el-scrollbar wrap-class="scrollbar-wrapper">
3
+    <el-menu
4
+      :show-timeout="200"
5
+      :default-active="$route.path"
6
+      :collapse="isCollapse"
7
+      mode="vertical"
8
+      background-color="#304156"
9
+      text-color="#bfcbd9"
10
+      active-text-color="#409EFF"
11
+    >
12
+      <sidebar-item v-for="route in routes" :key="route.path" :item="route" :base-path="route.path"/>
13
+    </el-menu>
14
+  </el-scrollbar>
15
+</template>
16
+
17
+<script>
18
+import { mapGetters } from 'vuex'
19
+import SidebarItem from './SidebarItem'
20
+
21
+export default {
22
+  components: { SidebarItem },
23
+  computed: {
24
+    ...mapGetters([
25
+      'sidebar'
26
+    ]),
27
+    routes() {
28
+      return this.$router.options.routes
29
+    },
30
+    isCollapse() {
31
+      return !this.sidebar.opened
32
+    }
33
+  }
34
+}
35
+</script>

+ 3
- 0
VUECODE/smart-operate-manage/src/views/layout/components/index.js 查看文件

1
+export { default as Navbar } from './Navbar'
2
+export { default as Sidebar } from './Sidebar'
3
+export { default as AppMain } from './AppMain'

+ 41
- 0
VUECODE/smart-operate-manage/src/views/layout/mixin/ResizeHandler.js 查看文件

1
+import store from '@/store'
2
+
3
+const { body } = document
4
+const WIDTH = 1024
5
+const RATIO = 3
6
+
7
+export default {
8
+  watch: {
9
+    $route(route) {
10
+      if (this.device === 'mobile' && this.sidebar.opened) {
11
+        store.dispatch('CloseSideBar', { withoutAnimation: false })
12
+      }
13
+    }
14
+  },
15
+  beforeMount() {
16
+    window.addEventListener('resize', this.resizeHandler)
17
+  },
18
+  mounted() {
19
+    const isMobile = this.isMobile()
20
+    if (isMobile) {
21
+      store.dispatch('ToggleDevice', 'mobile')
22
+      store.dispatch('CloseSideBar', { withoutAnimation: true })
23
+    }
24
+  },
25
+  methods: {
26
+    isMobile() {
27
+      const rect = body.getBoundingClientRect()
28
+      return rect.width - RATIO < WIDTH
29
+    },
30
+    resizeHandler() {
31
+      if (!document.hidden) {
32
+        const isMobile = this.isMobile()
33
+        store.dispatch('ToggleDevice', isMobile ? 'mobile' : 'desktop')
34
+
35
+        if (isMobile) {
36
+          store.dispatch('CloseSideBar', { withoutAnimation: true })
37
+        }
38
+      }
39
+    }
40
+  }
41
+}

+ 188
- 0
VUECODE/smart-operate-manage/src/views/login/index.vue 查看文件

1
+<template>
2
+  <div class="login-container">
3
+    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on" label-position="left">
4
+      <h3 class="title">智慧社区运营系统</h3>
5
+      <el-form-item prop="username">
6
+        <span class="svg-container">
7
+          <svg-icon icon-class="user" />
8
+        </span>
9
+        <el-input v-model="loginForm.username" name="username" type="text" auto-complete="on" placeholder="请输入手机号" />
10
+      </el-form-item>
11
+      <el-form-item prop="password">
12
+        <span class="svg-container">
13
+          <svg-icon icon-class="password" />
14
+        </span>
15
+        <el-input
16
+          v-model="loginForm.password"
17
+          name="password"
18
+          type="text"
19
+          auto-complete="on"
20
+          placeholder="请输入验证码"
21
+          @keyup.enter.native="handleLogin" />
22
+      </el-form-item>
23
+      <el-button type="primary" @click="sendCode();">发送验证码</el-button>
24
+      <el-form-item>
25
+        <el-button :loading="loading" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
26
+          登录
27
+        </el-button>
28
+      </el-form-item>
29
+    </el-form>
30
+  </div>
31
+</template>
32
+
33
+<script>
34
+import { isvalidUsername, validatCode } from '@/utils/validate'
35
+
36
+export default {
37
+  name: 'Login',
38
+  data() {
39
+    const validateUsername = (rule, value, callback) => {
40
+      if (!isvalidUsername(value)) {
41
+        callback(new Error('请输入正确的手机号码'))
42
+      } else {
43
+        callback()
44
+      }
45
+    }
46
+    const validateIndexCode = (rule, value, callback) => {
47
+      if (!validatCode(value)) {
48
+        callback(new Error('请输入四位验证码'))
49
+      } else {
50
+        callback()
51
+      }
52
+    }
53
+    return {
54
+      loginForm: {
55
+        username: '',
56
+        password: ''
57
+      },
58
+      loginRules: {
59
+        username: [{ required: true, trigger: 'blur', validator: validateUsername }],
60
+        password: [{ required: true, trigger: 'blur', validator: validateIndexCode }]
61
+      },
62
+      loading: false,
63
+      redirect: undefined
64
+    }
65
+  },
66
+  watch: {
67
+    $route: {
68
+      handler: function(route) {
69
+        this.redirect = route.query && route.query.redirect
70
+      },
71
+      immediate: true
72
+    }
73
+  },
74
+  methods: {
75
+    handleLogin() {
76
+      this.$refs.loginForm.validate(valid => {
77
+        if (valid) {
78
+          this.loading = true
79
+          this.$store.dispatch('Login', this.loginForm).then(() => {
80
+            this.loading = false
81
+            this.$router.push({ path: this.redirect || '/' })
82
+          }).catch(() => {
83
+            this.loading = false
84
+          })
85
+        } else {
86
+          console.log('error submit!!')
87
+          return false
88
+        }
89
+      })
90
+    },
91
+    sendCode() {
92
+      this.$store.dispatch('SendCode', this.loginForm.username).then((res) => {
93
+      }).catch(() => {
94
+        console.log('error sendcode')
95
+      })
96
+    }
97
+  }
98
+}
99
+</script>
100
+
101
+<style rel="stylesheet/scss" lang="scss">
102
+$bg:#2d3a4b;
103
+$light_gray:#eee;
104
+
105
+/* reset element-ui css */
106
+.login-container {
107
+  .el-input {
108
+    display: inline-block;
109
+    height: 47px;
110
+    width: 85%;
111
+    input {
112
+      background: transparent;
113
+      border: 0px;
114
+      -webkit-appearance: none;
115
+      border-radius: 0px;
116
+      padding: 12px 5px 12px 15px;
117
+      color: $light_gray;
118
+      height: 47px;
119
+      &:-webkit-autofill {
120
+        -webkit-box-shadow: 0 0 0px 1000px $bg inset !important;
121
+        -webkit-text-fill-color: #fff !important;
122
+      }
123
+    }
124
+  }
125
+  .el-form-item {
126
+    border: 1px solid rgba(255, 255, 255, 0.1);
127
+    background: rgba(0, 0, 0, 0.1);
128
+    border-radius: 5px;
129
+    color: #454545;
130
+  }
131
+}
132
+
133
+</style>
134
+
135
+<style rel="stylesheet/scss" lang="scss" scoped>
136
+$bg:#2d3a4b;
137
+$dark_gray:#889aa4;
138
+$light_gray:#eee;
139
+.login-container {
140
+  position: fixed;
141
+  height: 100%;
142
+  width: 100%;
143
+  background-color: $bg;
144
+  .login-form {
145
+    position: absolute;
146
+    left: 0;
147
+    right: 0;
148
+    width: 520px;
149
+    max-width: 100%;
150
+    padding: 35px 35px 15px 35px;
151
+    margin: 120px auto;
152
+  }
153
+  .tips {
154
+    font-size: 14px;
155
+    color: #fff;
156
+    margin-bottom: 10px;
157
+    span {
158
+      &:first-of-type {
159
+        margin-right: 16px;
160
+      }
161
+    }
162
+  }
163
+  .svg-container {
164
+    padding: 6px 5px 6px 15px;
165
+    color: $dark_gray;
166
+    vertical-align: middle;
167
+    width: 30px;
168
+    display: inline-block;
169
+  }
170
+  .title {
171
+    font-size: 26px;
172
+    font-weight: 400;
173
+    color: $light_gray;
174
+    margin: 0px auto 40px auto;
175
+    text-align: center;
176
+    font-weight: bold;
177
+  }
178
+  .show-pwd {
179
+    position: absolute;
180
+    right: 10px;
181
+    top: 7px;
182
+    font-size: 16px;
183
+    color: $dark_gray;
184
+    cursor: pointer;
185
+    user-select: none;
186
+  }
187
+}
188
+</style>

+ 7
- 0
VUECODE/smart-operate-manage/src/views/nested/menu1/index.vue 查看文件

1
+<template >
2
+  <div style="padding:30px;">
3
+    <el-alert :closable="false" title="menu 1">
4
+      <router-view />
5
+    </el-alert>
6
+  </div>
7
+</template>

+ 7
- 0
VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-1/index.vue 查看文件

1
+<template >
2
+  <div style="padding:30px;">
3
+    <el-alert :closable="false" title="menu 1-1" type="success">
4
+      <router-view />
5
+    </el-alert>
6
+  </div>
7
+</template>

+ 7
- 0
VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-2/index.vue 查看文件

1
+<template>
2
+  <div style="padding:30px;">
3
+    <el-alert :closable="false" title="menu 1-2" type="success">
4
+      <router-view />
5
+    </el-alert>
6
+  </div>
7
+</template>

+ 5
- 0
VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue 查看文件

1
+<template functional>
2
+  <div style="padding:30px;">
3
+    <el-alert :closable="false" title="menu 1-2-1" type="warning" />
4
+  </div>
5
+</template>

+ 5
- 0
VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue 查看文件

1
+<template functional>
2
+  <div style="padding:30px;">
3
+    <el-alert :closable="false" title="menu 1-2-2" type="warning" />
4
+  </div>
5
+</template>

+ 5
- 0
VUECODE/smart-operate-manage/src/views/nested/menu1/menu1-3/index.vue 查看文件

1
+<template functional>
2
+  <div style="padding:30px;">
3
+    <el-alert :closable="false" title="menu 1-3" type="success" />
4
+  </div>
5
+</template>

+ 5
- 0
VUECODE/smart-operate-manage/src/views/nested/menu2/index.vue 查看文件

1
+<template>
2
+  <div style="padding:30px;">
3
+    <el-alert :closable="false" title="menu 2" />
4
+  </div>
5
+</template>

+ 78
- 0
VUECODE/smart-operate-manage/src/views/table/index.vue 查看文件

1
+<template>
2
+  <div class="app-container">
3
+    <el-table
4
+      v-loading="listLoading"
5
+      :data="list"
6
+      element-loading-text="Loading"
7
+      border
8
+      fit
9
+      highlight-current-row>
10
+      <el-table-column align="center" label="ID" width="95">
11
+        <template slot-scope="scope">
12
+          {{ scope.$index }}
13
+        </template>
14
+      </el-table-column>
15
+      <el-table-column label="Title">
16
+        <template slot-scope="scope">
17
+          {{ scope.row.title }}
18
+        </template>
19
+      </el-table-column>
20
+      <el-table-column label="Author" width="110" align="center">
21
+        <template slot-scope="scope">
22
+          <span>{{ scope.row.author }}</span>
23
+        </template>
24
+      </el-table-column>
25
+      <el-table-column label="Pageviews" width="110" align="center">
26
+        <template slot-scope="scope">
27
+          {{ scope.row.pageviews }}
28
+        </template>
29
+      </el-table-column>
30
+      <el-table-column class-name="status-col" label="Status" width="110" align="center">
31
+        <template slot-scope="scope">
32
+          <el-tag :type="scope.row.status | statusFilter">{{ scope.row.status }}</el-tag>
33
+        </template>
34
+      </el-table-column>
35
+      <el-table-column align="center" prop="created_at" label="Display_time" width="200">
36
+        <template slot-scope="scope">
37
+          <i class="el-icon-time"/>
38
+          <span>{{ scope.row.display_time }}</span>
39
+        </template>
40
+      </el-table-column>
41
+    </el-table>
42
+  </div>
43
+</template>
44
+
45
+<script>
46
+import { getList } from '@/api/table'
47
+
48
+export default {
49
+  filters: {
50
+    statusFilter(status) {
51
+      const statusMap = {
52
+        published: 'success',
53
+        draft: 'gray',
54
+        deleted: 'danger'
55
+      }
56
+      return statusMap[status]
57
+    }
58
+  },
59
+  data() {
60
+    return {
61
+      list: null,
62
+      listLoading: true
63
+    }
64
+  },
65
+  created() {
66
+    this.fetchData()
67
+  },
68
+  methods: {
69
+    fetchData() {
70
+      this.listLoading = true
71
+      getList(this.listQuery).then(response => {
72
+        this.list = response.data.items
73
+        this.listLoading = false
74
+      })
75
+    }
76
+  }
77
+}
78
+</script>

+ 78
- 0
VUECODE/smart-operate-manage/src/views/tree/index.vue 查看文件

1
+<template>
2
+  <div class="app-container">
3
+    <el-input v-model="filterText" placeholder="Filter keyword" style="margin-bottom:30px;" />
4
+
5
+    <el-tree
6
+      ref="tree2"
7
+      :data="data2"
8
+      :props="defaultProps"
9
+      :filter-node-method="filterNode"
10
+      class="filter-tree"
11
+      default-expand-all
12
+    />
13
+
14
+  </div>
15
+</template>
16
+
17
+<script>
18
+export default {
19
+
20
+  data() {
21
+    return {
22
+      filterText: '',
23
+      data2: [{
24
+        id: 1,
25
+        label: 'Level one 1',
26
+        children: [{
27
+          id: 4,
28
+          label: 'Level two 1-1',
29
+          children: [{
30
+            id: 9,
31
+            label: 'Level three 1-1-1'
32
+          }, {
33
+            id: 10,
34
+            label: 'Level three 1-1-2'
35
+          }]
36
+        }]
37
+      }, {
38
+        id: 2,
39
+        label: 'Level one 2',
40
+        children: [{
41
+          id: 5,
42
+          label: 'Level two 2-1'
43
+        }, {
44
+          id: 6,
45
+          label: 'Level two 2-2'
46
+        }]
47
+      }, {
48
+        id: 3,
49
+        label: 'Level one 3',
50
+        children: [{
51
+          id: 7,
52
+          label: 'Level two 3-1'
53
+        }, {
54
+          id: 8,
55
+          label: 'Level two 3-2'
56
+        }]
57
+      }],
58
+      defaultProps: {
59
+        children: 'children',
60
+        label: 'label'
61
+      }
62
+    }
63
+  },
64
+  watch: {
65
+    filterText(val) {
66
+      this.$refs.tree2.filter(val)
67
+    }
68
+  },
69
+
70
+  methods: {
71
+    filterNode(value, data) {
72
+      if (!value) return true
73
+      return data.label.indexOf(value) !== -1
74
+    }
75
+  }
76
+}
77
+</script>
78
+

+ 0
- 0
VUECODE/smart-operate-manage/static/.gitkeep 查看文件


+ 8
- 8
文档/MYSQL/smartCommunity.pdm 查看文件

1
 <?xml version="1.0" encoding="UTF-8"?>
1
 <?xml version="1.0" encoding="UTF-8"?>
2
-<?PowerDesigner AppLocale="UTF16" ID="{1EFA7B8F-E5BE-422B-A0AE-B907AA87924F}" Label="" LastModificationDate="1540980036" Name="smartCommunity" Objects="619" Symbols="74" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?>
2
+<?PowerDesigner AppLocale="UTF16" ID="{1EFA7B8F-E5BE-422B-A0AE-B907AA87924F}" Label="" LastModificationDate="1541056830" Name="smartCommunity" Objects="619" Symbols="74" Target="MySQL 5.0" Type="{CDE44E21-9669-11D1-9914-006097355D9B}" signature="PDM_DATA_MODEL_XML" version="16.5.0.3982"?>
3
 <!-- do not edit this file -->
3
 <!-- do not edit this file -->
4
 
4
 
5
 <Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
5
 <Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
4713
 <o:ExtendedDependencySymbol Id="o90">
4713
 <o:ExtendedDependencySymbol Id="o90">
4714
 <a:CreationDate>1540878858</a:CreationDate>
4714
 <a:CreationDate>1540878858</a:CreationDate>
4715
 <a:ModificationDate>1540881753</a:ModificationDate>
4715
 <a:ModificationDate>1540881753</a:ModificationDate>
4716
-<a:Rect>((-77886,-340), (129,3700))</a:Rect>
4717
-<a:ListOfPoints>((-77486,60),(-571,60),(-571,3300))</a:ListOfPoints>
4716
+<a:Rect>((-85810,5549), (-5449,15284))</a:Rect>
4717
+<a:ListOfPoints>((-85410,5949),(-85410,14584),(-5849,14584))</a:ListOfPoints>
4718
 <a:CornerStyle>1</a:CornerStyle>
4718
 <a:CornerStyle>1</a:CornerStyle>
4719
 <a:ArrowStyle>8</a:ArrowStyle>
4719
 <a:ArrowStyle>8</a:ArrowStyle>
4720
 <a:LineColor>16744576</a:LineColor>
4720
 <a:LineColor>16744576</a:LineColor>
4752
 </o:ExtendedDependencySymbol>
4752
 </o:ExtendedDependencySymbol>
4753
 <o:ExtendedDependencySymbol Id="o96">
4753
 <o:ExtendedDependencySymbol Id="o96">
4754
 <a:CreationDate>1540880736</a:CreationDate>
4754
 <a:CreationDate>1540880736</a:CreationDate>
4755
-<a:ModificationDate>1540881758</a:ModificationDate>
4756
-<a:Rect>((-77667,-18610), (-71117,-16761))</a:Rect>
4757
-<a:ListOfPoints>((-77267,-17161),(-75467,-17161),(-75467,-17910),(-71517,-17910))</a:ListOfPoints>
4755
+<a:ModificationDate>1541056830</a:ModificationDate>
4756
+<a:Rect>((-77667,-18910), (-69137,-16761))</a:Rect>
4757
+<a:ListOfPoints>((-77267,-17161),(-75467,-17161),(-75467,-18210),(-69537,-18210))</a:ListOfPoints>
4758
 <a:CornerStyle>1</a:CornerStyle>
4758
 <a:CornerStyle>1</a:CornerStyle>
4759
 <a:ArrowStyle>8</a:ArrowStyle>
4759
 <a:ArrowStyle>8</a:ArrowStyle>
4760
 <a:LineColor>16744576</a:LineColor>
4760
 <a:LineColor>16744576</a:LineColor>
5846
 </o:TableSymbol>
5846
 </o:TableSymbol>
5847
 <o:TableSymbol Id="o97">
5847
 <o:TableSymbol Id="o97">
5848
 <a:CreationDate>1540880446</a:CreationDate>
5848
 <a:CreationDate>1540880446</a:CreationDate>
5849
-<a:ModificationDate>1540881758</a:ModificationDate>
5849
+<a:ModificationDate>1541056830</a:ModificationDate>
5850
 <a:IconMode>-1</a:IconMode>
5850
 <a:IconMode>-1</a:IconMode>
5851
-<a:Rect>((-72825,-24751), (-58247,-12851))</a:Rect>
5851
+<a:Rect>((-70845,-25051), (-56267,-13151))</a:Rect>
5852
 <a:AutoAdjustToText>0</a:AutoAdjustToText>
5852
 <a:AutoAdjustToText>0</a:AutoAdjustToText>
5853
 <a:LineColor>12615680</a:LineColor>
5853
 <a:LineColor>12615680</a:LineColor>
5854
 <a:FillColor>16570034</a:FillColor>
5854
 <a:FillColor>16570034</a:FillColor>