Przeglądaj źródła

香颂蔚澜后台管理端

andrew 4 lat temu
rodzic
commit
082eb35ce5
100 zmienionych plików z 5523 dodań i 0 usunięć
  1. 12
    0
      smart-property-manage/.babelrc
  2. 14
    0
      smart-property-manage/.editorconfig
  3. 3
    0
      smart-property-manage/.eslintignore
  4. 196
    0
      smart-property-manage/.eslintrc.js
  5. 15
    0
      smart-property-manage/.gitignore
  6. 10
    0
      smart-property-manage/.postcssrc.js
  7. 5
    0
      smart-property-manage/.travis.yml
  8. 21
    0
      smart-property-manage/LICENSE
  9. 96
    0
      smart-property-manage/README-zh.md
  10. 88
    0
      smart-property-manage/README.md
  11. 45
    0
      smart-property-manage/build/build.js
  12. 64
    0
      smart-property-manage/build/check-versions.js
  13. BIN
      smart-property-manage/build/logo.png
  14. 108
    0
      smart-property-manage/build/utils.js
  15. 5
    0
      smart-property-manage/build/vue-loader.conf.js
  16. 117
    0
      smart-property-manage/build/webpack.base.conf.js
  17. 95
    0
      smart-property-manage/build/webpack.dev.conf.js
  18. 178
    0
      smart-property-manage/build/webpack.prod.conf.js
  19. 8
    0
      smart-property-manage/config/dev.env.js
  20. 93
    0
      smart-property-manage/config/index.js
  21. 6
    0
      smart-property-manage/config/prod.env.js
  22. BIN
      smart-property-manage/favicon.ico
  23. 12
    0
      smart-property-manage/index.html
  24. 100
    0
      smart-property-manage/package.json
  25. 12
    0
      smart-property-manage/src/App.vue
  26. 118
    0
      smart-property-manage/src/api/activity.js
  27. 69
    0
      smart-property-manage/src/api/announcement.js
  28. 94
    0
      smart-property-manage/src/api/banner.js
  29. 61
    0
      smart-property-manage/src/api/batchImport.js
  30. 72
    0
      smart-property-manage/src/api/bill.js
  31. 149
    0
      smart-property-manage/src/api/billInvoice.js
  32. 36
    0
      smart-property-manage/src/api/billStatement.js
  33. 255
    0
      smart-property-manage/src/api/buildingOwnerInfo.js
  34. 9
    0
      smart-property-manage/src/api/buildingTree.js
  35. 60
    0
      smart-property-manage/src/api/community.js
  36. 49
    0
      smart-property-manage/src/api/equipment.js
  37. 81
    0
      smart-property-manage/src/api/grogshop.js
  38. 24
    0
      smart-property-manage/src/api/index.js
  39. 27
    0
      smart-property-manage/src/api/license.js
  40. 49
    0
      smart-property-manage/src/api/login.js
  41. 25
    0
      smart-property-manage/src/api/menu.js
  42. 41
    0
      smart-property-manage/src/api/message.js
  43. 52
    0
      smart-property-manage/src/api/rental.js
  44. 58
    0
      smart-property-manage/src/api/role.js
  45. 168
    0
      smart-property-manage/src/api/shopType.js
  46. 9
    0
      smart-property-manage/src/api/table.js
  47. 61
    0
      smart-property-manage/src/api/tels.js
  48. 85
    0
      smart-property-manage/src/api/ticket.js
  49. 143
    0
      smart-property-manage/src/api/transaction.js
  50. 136
    0
      smart-property-manage/src/api/user.js
  51. BIN
      smart-property-manage/src/assets/404_images/404.png
  52. BIN
      smart-property-manage/src/assets/404_images/404_cloud.png
  53. BIN
      smart-property-manage/src/assets/light1.png
  54. BIN
      smart-property-manage/src/assets/light2.png
  55. BIN
      smart-property-manage/src/assets/light3.png
  56. BIN
      smart-property-manage/src/assets/light4.png
  57. 61
    0
      smart-property-manage/src/components/Breadcrumb/index.vue
  58. 58
    0
      smart-property-manage/src/components/Hamburger/index.vue
  59. 99
    0
      smart-property-manage/src/components/Pagination/index.vue
  60. 43
    0
      smart-property-manage/src/components/SvgIcon/index.vue
  61. 122
    0
      smart-property-manage/src/components/Wangeditor/index.vue
  62. 134
    0
      smart-property-manage/src/components/XUploader/index.vue
  63. 111
    0
      smart-property-manage/src/components/chart/barChart.vue
  64. 120
    0
      smart-property-manage/src/components/chart/chart1.vue
  65. 96
    0
      smart-property-manage/src/components/chart/chart2.vue
  66. 93
    0
      smart-property-manage/src/components/chart/chart3.vue
  67. 126
    0
      smart-property-manage/src/components/chart/chart4.vue
  68. 125
    0
      smart-property-manage/src/components/chart/chart5.vue
  69. 163
    0
      smart-property-manage/src/components/chart/chart6.vue
  70. 123
    0
      smart-property-manage/src/components/chart/chart7.vue
  71. 158
    0
      smart-property-manage/src/components/chart/chart8.vue
  72. 116
    0
      smart-property-manage/src/components/chart/chart9.vue
  73. 136
    0
      smart-property-manage/src/components/chart/lineChart.vue
  74. 49
    0
      smart-property-manage/src/directive/clipboard/clipboard.js
  75. 13
    0
      smart-property-manage/src/directive/clipboard/index.js
  76. 77
    0
      smart-property-manage/src/directive/el-dragDialog/drag.js
  77. 13
    0
      smart-property-manage/src/directive/el-dragDialog/index.js
  78. 13
    0
      smart-property-manage/src/directive/permission/index.js
  79. 23
    0
      smart-property-manage/src/directive/permission/permission.js
  80. 91
    0
      smart-property-manage/src/directive/sticky.js
  81. 13
    0
      smart-property-manage/src/directive/waves/index.js
  82. 26
    0
      smart-property-manage/src/directive/waves/waves.css
  83. 42
    0
      smart-property-manage/src/directive/waves/waves.js
  84. 9
    0
      smart-property-manage/src/icons/index.js
  85. 1
    0
      smart-property-manage/src/icons/svg/banner.svg
  86. 1
    0
      smart-property-manage/src/icons/svg/community.svg
  87. 1
    0
      smart-property-manage/src/icons/svg/communitydata.svg
  88. 1
    0
      smart-property-manage/src/icons/svg/example.svg
  89. 1
    0
      smart-property-manage/src/icons/svg/eye.svg
  90. 1
    0
      smart-property-manage/src/icons/svg/form.svg
  91. 1
    0
      smart-property-manage/src/icons/svg/index.svg
  92. 1
    0
      smart-property-manage/src/icons/svg/link.svg
  93. 1
    0
      smart-property-manage/src/icons/svg/nested.svg
  94. 1
    0
      smart-property-manage/src/icons/svg/operate.svg
  95. 1
    0
      smart-property-manage/src/icons/svg/password.svg
  96. 1
    0
      smart-property-manage/src/icons/svg/table.svg
  97. 1
    0
      smart-property-manage/src/icons/svg/tree.svg
  98. 1
    0
      smart-property-manage/src/icons/svg/user.svg
  99. 22
    0
      smart-property-manage/src/icons/svgo.yml
  100. 0
    0
      smart-property-manage/src/main.js

+ 12
- 0
smart-property-manage/.babelrc Wyświetl plik

@@ -0,0 +1,12 @@
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
smart-property-manage/.editorconfig Wyświetl plik

@@ -0,0 +1,14 @@
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
smart-property-manage/.eslintignore Wyświetl plik

@@ -0,0 +1,3 @@
1
+build/*.js
2
+config/*.js
3
+src/assets

+ 196
- 0
smart-property-manage/.eslintrc.js Wyświetl plik

@@ -0,0 +1,196 @@
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
smart-property-manage/.gitignore Wyświetl plik

@@ -0,0 +1,15 @@
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
smart-property-manage/.postcssrc.js Wyświetl plik

@@ -0,0 +1,10 @@
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
smart-property-manage/.travis.yml Wyświetl plik

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

+ 21
- 0
smart-property-manage/LICENSE Wyświetl plik

@@ -0,0 +1,21 @@
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
smart-property-manage/README-zh.md Wyświetl plik

@@ -0,0 +1,96 @@
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
smart-property-manage/README.md Wyświetl plik

@@ -0,0 +1,88 @@
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
smart-property-manage/build/build.js Wyświetl plik

@@ -0,0 +1,45 @@
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
smart-property-manage/build/check-versions.js Wyświetl plik

@@ -0,0 +1,64 @@
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
+}

BIN
smart-property-manage/build/logo.png Wyświetl plik


+ 108
- 0
smart-property-manage/build/utils.js Wyświetl plik

@@ -0,0 +1,108 @@
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
smart-property-manage/build/vue-loader.conf.js Wyświetl plik

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

+ 117
- 0
smart-property-manage/build/webpack.base.conf.js Wyświetl plik

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

+ 95
- 0
smart-property-manage/build/webpack.dev.conf.js Wyświetl plik

@@ -0,0 +1,95 @@
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('zhihui.jpg'),
60
+      title: '智慧社区物业平台'
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
smart-property-manage/build/webpack.prod.conf.js Wyświetl plik

@@ -0,0 +1,178 @@
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('zhihui.jpg'),
58
+      title: '智慧社区物业平台',
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
smart-property-manage/config/dev.env.js Wyświetl plik

@@ -0,0 +1,8 @@
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:8086/property-api"',
8
+})

+ 93
- 0
smart-property-manage/config/index.js Wyświetl plik

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

+ 6
- 0
smart-property-manage/config/prod.env.js Wyświetl plik

@@ -0,0 +1,6 @@
1
+'use strict'
2
+module.exports = {
3
+  NODE_ENV: '"production"',
4
+  // BASE_API: '"http://106.14.20.193:8086/property-api"',
5
+  BASE_API: '"http://property.jcjyhn.com/property-api"',
6
+}

BIN
smart-property-manage/favicon.ico Wyświetl plik


+ 12
- 0
smart-property-manage/index.html Wyświetl plik

@@ -0,0 +1,12 @@
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>智慧社区物业平台</title>
7
+  </head>
8
+  <body>
9
+    <div id="app"></div>
10
+    <!-- built files will be auto injected -->
11
+  </body>
12
+</html>

+ 100
- 0
smart-property-manage/package.json Wyświetl plik

@@ -0,0 +1,100 @@
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
+    "add": "^2.0.6",
18
+    "axios": "0.18.0",
19
+    "dayjs": "^1.9.6",
20
+    "element-ui": "2.4.6",
21
+    "file-saver": "^2.0.0-rc.4",
22
+    "html2canvas": "^1.0.0-rc.1",
23
+    "jquery": "^2.2.3",
24
+    "js-cookie": "2.2.0",
25
+    "normalize.css": "7.0.0",
26
+    "nprogress": "0.2.0",
27
+    "qrcode": "^1.3.3",
28
+    "qs": "^6.6.0",
29
+    "vue": "2.5.17",
30
+    "vue-amap": "^0.5.8",
31
+    "vue-photo-preview": "^1.1.3",
32
+    "vue-router": "3.0.1",
33
+    "vuex": "3.0.1",
34
+    "wangeditor": "^3.1.1",
35
+    "xlsx": "^0.14.0"
36
+  },
37
+  "devDependencies": {
38
+    "@antv/data-set": "^0.10.1",
39
+    "@antv/g2": "^3.4.1",
40
+    "autoprefixer": "8.5.0",
41
+    "babel-core": "6.26.0",
42
+    "babel-eslint": "8.2.6",
43
+    "babel-helper-vue-jsx-merge-props": "2.0.3",
44
+    "babel-loader": "7.1.5",
45
+    "babel-plugin-syntax-jsx": "6.18.0",
46
+    "babel-plugin-transform-runtime": "6.23.0",
47
+    "babel-plugin-transform-vue-jsx": "3.7.0",
48
+    "babel-preset-env": "1.7.0",
49
+    "babel-preset-stage-2": "6.24.1",
50
+    "chalk": "2.4.1",
51
+    "copy-webpack-plugin": "4.5.2",
52
+    "css-loader": "1.0.0",
53
+    "eslint": "4.19.1",
54
+    "eslint-friendly-formatter": "4.0.1",
55
+    "eslint-loader": "2.0.0",
56
+    "eslint-plugin-vue": "4.7.1",
57
+    "eventsource-polyfill": "0.9.6",
58
+    "file-loader": "1.1.11",
59
+    "friendly-errors-webpack-plugin": "1.7.0",
60
+    "html-webpack-plugin": "4.0.0-alpha",
61
+    "jquery": "^2.2.3",
62
+    "mini-css-extract-plugin": "0.4.1",
63
+    "node-notifier": "5.2.1",
64
+    "node-sass": "^4.7.2",
65
+    "optimize-css-assets-webpack-plugin": "5.0.0",
66
+    "ora": "3.0.0",
67
+    "path-to-regexp": "2.4.0",
68
+    "portfinder": "1.0.16",
69
+    "postcss-import": "12.0.0",
70
+    "postcss-loader": "2.1.6",
71
+    "postcss-url": "7.3.2",
72
+    "rimraf": "2.6.2",
73
+    "sass-loader": "7.0.3",
74
+    "script-ext-html-webpack-plugin": "2.0.1",
75
+    "script-loader": "^0.7.2",
76
+    "semver": "5.5.0",
77
+    "shelljs": "0.8.2",
78
+    "svg-sprite-loader": "3.8.0",
79
+    "svgo": "1.0.5",
80
+    "uglifyjs-webpack-plugin": "1.2.7",
81
+    "url-loader": "1.0.1",
82
+    "vue-loader": "15.3.0",
83
+    "vue-style-loader": "4.1.2",
84
+    "vue-template-compiler": "2.5.17",
85
+    "webpack": "4.16.5",
86
+    "webpack-bundle-analyzer": "2.13.1",
87
+    "webpack-cli": "3.1.0",
88
+    "webpack-dev-server": "3.1.5",
89
+    "webpack-merge": "4.1.4"
90
+  },
91
+  "engines": {
92
+    "node": ">= 6.0.0",
93
+    "npm": ">= 3.0.0"
94
+  },
95
+  "browserslist": [
96
+    "> 1%",
97
+    "last 2 versions",
98
+    "not ie <= 8"
99
+  ]
100
+}

+ 12
- 0
smart-property-manage/src/App.vue Wyświetl plik

@@ -0,0 +1,12 @@
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>
12
+

+ 118
- 0
smart-property-manage/src/api/activity.js Wyświetl plik

@@ -0,0 +1,118 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询活动数据列表
4
+export function activityList(data) {
5
+  return request({
6
+    url: '/activity/list',
7
+    method: 'post',
8
+    data: {
9
+      id: data.id,
10
+      activityTitle: data.activityTitle,
11
+      pageNum: data.pageNum,
12
+      pageSize: data.pageSize
13
+    }
14
+  })
15
+}
16
+
17
+// 添加活动
18
+export function addActivity(data) {
19
+  return request({
20
+    url: '/activity/add',
21
+    method: 'post',
22
+    data: {
23
+      activityTitle: data.activityTitle,
24
+      activityCarouselImg: data.activityCarouselImg, // 轮播图
25
+      activityContent: data.activityContent, // 活动内容详细
26
+      contentImg: data.contentImg, // 活动内容配图
27
+      signUpMax: data.signUpMax, //  活动人数上限
28
+      registrationEndTime: data.registrationEndTime, // 报名活动结束时间
29
+      sort: data.sort, // 权重
30
+      status: data.status, // 状态 0 是已作废 1 是已发布   2 是草稿 3 是已修改
31
+      radio: data.radio // 是否需要二维码1需要,2不需要
32
+    }
33
+  })
34
+}
35
+
36
+// 修改活动
37
+export function updateActivity(data) {
38
+  return request({
39
+    url: '/activity/update',
40
+    method: 'put',
41
+    data: {
42
+      signInCode: data.signInCode,
43
+      id: data.id,
44
+      activityTitle: data.activityTitle,
45
+      activityCarouselImg: data.activityCarouselImg, // 轮播图
46
+      activityContent: data.activityContent, // 活动内容详细
47
+      contentImg: data.contentImg, // 活动内容配图
48
+      signUpMax: data.signUpMax, //  活动人数上限
49
+      registrationEndTime: data.registrationEndTime, // 报名活动结束时间
50
+      sort: data.sort, // 权重
51
+      status: data.status, // 状态 0 是已作废 1 是已发布   2 是草稿 3 是已修改
52
+      radio: data.signInCode
53
+    }
54
+  })
55
+}
56
+
57
+// 查询 活动详情
58
+export function activityById(id) {
59
+  return request({
60
+    url: '/activity/' + id,
61
+    method: 'get'
62
+  })
63
+}
64
+
65
+// 批量活动作废
66
+export function invalidActivity(data) {
67
+  return request({
68
+    url: '/activity/invalid',
69
+    method: 'put',
70
+    data: {
71
+      ids: data.ids,
72
+      status: data.status
73
+    }
74
+  })
75
+}
76
+
77
+// 查询活动报名人
78
+export function getSignUp(data) {
79
+  return request({
80
+    url: '/signUp',
81
+    method: 'post',
82
+    data: {
83
+      signUpId: data.signUpId,
84
+      id: data.id,
85
+      userName: data.userName,
86
+      phone: data.phone,
87
+      pageNum: data.pageNum,
88
+      pageSize: data.pageSize
89
+    }
90
+  })
91
+}
92
+
93
+// 删除活动报名人
94
+export function deleteSignUp(data) {
95
+  console.log(data)
96
+  return request({
97
+    url: '/signUp/' + data.deleteId,
98
+    method: 'delete',
99
+    data: {
100
+      sendSMS: data.sendSMS
101
+    }
102
+  })
103
+}
104
+
105
+// 根据活动id 获取所有签到人员列表
106
+export function getActivitySignIn(data) {
107
+  return request({
108
+    url: '/activity/signIn/' + data.activityId,
109
+    method: 'get',
110
+    params: {
111
+      userName: data.userName,
112
+      userTel: data.userTel,
113
+      pageNum: data.pageNum,
114
+      pageSize: data.pageSize
115
+    }
116
+  })
117
+}
118
+

+ 69
- 0
smart-property-manage/src/api/announcement.js Wyświetl plik

@@ -0,0 +1,69 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取当前小区的所有公告
4
+export function listAnnouncement(data) {
5
+  return request({
6
+    url: '/tpAnnouncement',
7
+    method: 'post',
8
+    data: {
9
+      announcementNumber: data.announcementNumber,
10
+      announcementTitle: data.announcementTitle,
11
+      pageNum: data.pageNum,
12
+      pageSize: data.pageSize
13
+    }
14
+  })
15
+}
16
+// 添加公告
17
+export function addAnnouncement(data) {
18
+  return request({
19
+    url: '/addAnnouncement',
20
+    method: 'post',
21
+    data: {
22
+      announcementTitle: data.announcementTitle,
23
+      announcementCarouselImg: data.announcementCarouselImg,
24
+      contentImg: data.contentImg,
25
+      announcementContent: data.announcementContent,
26
+      sort: data.sort,
27
+      status: data.status
28
+    }
29
+  })
30
+}
31
+// 根据id查询公告
32
+export function announcementById(data) {
33
+  console.log(123)
34
+  console.log(data)
35
+  return request({
36
+    url: '/announcementById',
37
+    method: 'post',
38
+    data: {
39
+      id: data.id
40
+    }
41
+  })
42
+}
43
+// 修改公告
44
+export function updateannouncement(data) {
45
+  return request({
46
+    url: '/updateAnnouncement',
47
+    method: 'post',
48
+    data: {
49
+      id: data.id,
50
+      announcementTitle: data.announcementTitle,
51
+      announcementCarouselImg: data.announcementCarouselImg,
52
+      contentImg: data.contentImg,
53
+      announcementContent: data.announcementContent,
54
+      sort: data.sort,
55
+      status: data.status
56
+    }
57
+  })
58
+}
59
+// 批量删除(data)里面是单子字段的多个id
60
+export function deleteAnnouncement(data) {
61
+  return request({
62
+    url: '/deleteAnnouncement',
63
+    method: 'post',
64
+    data: {
65
+      id: data.ids,
66
+      status: data.status
67
+    }
68
+  })
69
+}

+ 94
- 0
smart-property-manage/src/api/banner.js Wyświetl plik

@@ -0,0 +1,94 @@
1
+import request from '@/utils/request'
2
+
3
+// 根据条件查询 banner
4
+export function getBanner(banner) {
5
+  return request({
6
+    url: '/banner/list',
7
+    method: 'get',
8
+    params: banner
9
+  })
10
+}
11
+
12
+// 添加banner
13
+export function addBanner(banner) {
14
+  return request({
15
+    url: '/banner',
16
+    method: 'post',
17
+    data: banner
18
+  })
19
+}
20
+
21
+// 修改 banner
22
+export function updateBanner(banner) {
23
+  return request({
24
+    url: '/banner',
25
+    method: 'put',
26
+    data: banner
27
+  })
28
+}
29
+
30
+// 删除 banner, 批量[10,25,65]
31
+export function deleteBanner(bannerId) {
32
+  return request({
33
+    url: '/banner',
34
+    method: 'delete',
35
+    data: bannerId
36
+  })
37
+}
38
+
39
+// 根据bannerId 查询 banner
40
+export function getByBannerId(bannerId) {
41
+  return request({
42
+    url: '/banner/' + bannerId,
43
+    method: 'get'
44
+  })
45
+}
46
+
47
+// 修改公告的Banner数量
48
+export function carouselAnnouncementBanner(num) {
49
+  return request({
50
+    url: '/carousel/announcement/banner',
51
+    method: 'put',
52
+    data: {
53
+      carouselNum: num
54
+    }
55
+  })
56
+}
57
+
58
+// 修改活动的Banner数量
59
+export function carouselActivityBanner(num) {
60
+  return request({
61
+    url: '/carousel/activity/banner',
62
+    method: 'put',
63
+    data: {
64
+      carouselNum: num
65
+    }
66
+  })
67
+}
68
+
69
+//  获取banner的设置数量
70
+export function carouselGetBanner() {
71
+  return request({
72
+    url: '/carousel/getBanner',
73
+    method: 'get'
74
+  })
75
+}
76
+
77
+// 查看是否开启访客车辆邀请
78
+export function getVisitorLicenseSetting() {
79
+  return request({
80
+    url: '/visitor',
81
+    method: 'get'
82
+  })
83
+}
84
+
85
+// 是否开启访客邀请车辆
86
+export function visitorSaveOrDelete(visitorLicenseBool) {
87
+  return request({
88
+    url: '/visitor/saveOrDelete',
89
+    method: 'post',
90
+    params: {
91
+      visitorLicenseBool: visitorLicenseBool
92
+    }
93
+  })
94
+}

+ 61
- 0
smart-property-manage/src/api/batchImport.js Wyświetl plik

@@ -0,0 +1,61 @@
1
+import request from '@/utils/ajax'
2
+
3
+export function uploadBuildingExcel(query) {
4
+  return new Promise((resolve, reject) => {
5
+    request({
6
+      url: '/building/uploadExcel',
7
+      method: 'post',
8
+      data: query
9
+    }).then((res) => {
10
+      console.log('out')
11
+      resolve(res)
12
+    }).catch((err) => {
13
+      console.log(err)
14
+    })
15
+  })
16
+}
17
+
18
+export function submitBuildingExcel(query) {
19
+  return new Promise((resolve, reject) => {
20
+    request({
21
+      url: '/building/submitExcel',
22
+      method: 'post',
23
+      data: query
24
+    }).then((res) => {
25
+      console.log('out')
26
+      resolve(res)
27
+    }).catch((err) => {
28
+      console.log(err)
29
+    })
30
+  })
31
+}
32
+
33
+export function uploadBuildingTreeExcel(query) {
34
+  return new Promise((resolve, reject) => {
35
+    request({
36
+      url: '/tree/uploadExcel',
37
+      method: 'post',
38
+      data: query
39
+    }).then((res) => {
40
+      console.log('out')
41
+      resolve(res)
42
+    }).catch((err) => {
43
+      console.log(err)
44
+    })
45
+  })
46
+}
47
+
48
+export function submitBuildingTreeExcel(query) {
49
+  return new Promise((resolve, reject) => {
50
+    request({
51
+      url: '/tree/submitExcel',
52
+      method: 'post',
53
+      data: query
54
+    }).then((res) => {
55
+      console.log('out')
56
+      resolve(res)
57
+    }).catch((err) => {
58
+      console.log(err)
59
+    })
60
+  })
61
+}

+ 72
- 0
smart-property-manage/src/api/bill.js Wyświetl plik

@@ -0,0 +1,72 @@
1
+import request from '@/utils/request'
2
+
3
+export function fetchBillList(query) {
4
+  return request({
5
+    url: '/bills',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}
10
+
11
+// 保存草稿 或者 发布账单
12
+export function billUploadExcelAdd(data) {
13
+  return request({
14
+    url: '/bill/uploadExcel/add',
15
+    method: 'post',
16
+    header: {
17
+      'Content-Type': 'multipart/form-data'
18
+    },
19
+    data
20
+    // data: {
21
+    //   file: data.files,
22
+    //   billName: data.billName,
23
+    //   billExplain: data.billExplain,
24
+    //   endDate: data.endDate,
25
+    //   billStatus: data.billStatus
26
+    // }
27
+  })
28
+}
29
+
30
+// 根据 id 修改缴费项状态
31
+export function updateBillStatus(data) {
32
+  return request({
33
+    url: '/bill/updateBillStatus/' + data.id,
34
+    method: 'put',
35
+    params: {
36
+      billStatus: data.billStatus
37
+    }
38
+  })
39
+}
40
+
41
+//  根据 id集合 删除缴费项
42
+export function deleteBillBeach(data) {
43
+  return request({
44
+    url: '/bill/deleteBillBeach',
45
+    method: 'post',
46
+    data
47
+  })
48
+}
49
+
50
+// 下载excel模板
51
+export function billDownloadExcel() {
52
+  return request({
53
+    url: '/bill/downloadExcel',
54
+    method: 'get',
55
+    responseType: 'blob'
56
+  })
57
+}
58
+
59
+// 根据收费项ID查询,收费项详情
60
+export function getBillInfoBydId(id) {
61
+  return request({
62
+    url: '/bill/' + id,
63
+    method: 'get'
64
+  })
65
+}
66
+// 根据收费项ID查询订单号
67
+export function getOrderInfo(id) {
68
+  return request({
69
+    url: '/bill/order/getById/' + id,
70
+    method: 'get'
71
+  })
72
+}

+ 149
- 0
smart-property-manage/src/api/billInvoice.js Wyświetl plik

@@ -0,0 +1,149 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询缴费单
4
+export function getBillInvoiceList(data) {
5
+  return request({
6
+    url: '/bill/invoice/list',
7
+    method: 'post',
8
+    data: {
9
+      billId: data.billId, // 缴费项目id
10
+      phase: data.phase,
11
+      building: data.building,
12
+      unit: data.unit,
13
+      roomNo: data.roomNo,
14
+      ownerName: data.ownerName,
15
+      billStatus: data.billStatus,
16
+      payName: data.payName,
17
+      pageSize: data.pageSize,
18
+      pageNum: data.pageNum
19
+    }
20
+  })
21
+}
22
+
23
+// 修改缴费项 收费项名称,缴费项说明,截止时间
24
+export function updateBillNameAndBillExplainAndEndDate(data) {
25
+  return request({
26
+    url: '/bill/invoice/updateBill',
27
+    method: 'put',
28
+    data: {
29
+      id: data.id, // 收费项ID
30
+      billName: data.billName, // 收费项名称
31
+      billExplain: data.billExplain, // 缴费项说明
32
+      endDate: data.endDate // 截止时间
33
+    }
34
+  })
35
+}
36
+
37
+// 根据ID 查询缴费项信息
38
+export function getBillByIdInfo(id) {
39
+  return request({
40
+    url: '/bill/' + id,
41
+    method: 'get'
42
+  })
43
+}
44
+
45
+//  根据 id 批量删除 缴费单
46
+export function deleteBillInvoiceById(data) {
47
+  return request({
48
+    url: '/bill/invoice/delete',
49
+    method: 'post',
50
+    data
51
+  })
52
+}
53
+
54
+// 设置线下缴费
55
+export function billInvoiceOfflinePayment(data) {
56
+  return request({
57
+    url: '/bill/invoice/offlinePayment',
58
+    method: 'post',
59
+    data
60
+  })
61
+}
62
+
63
+// 由前台批量添加收费单, 默认定为 作废
64
+export function addTempBillInvoice(data) {
65
+  return request({
66
+    url: '/bill/invoice/addTempBillInvoice',
67
+    method: 'post',
68
+    data: {
69
+      billId: data.billId, //  收费项id
70
+      phase: data.phaseId, // 期/区
71
+      building: data.buildingId, // 栋
72
+      unit: data.unitId, // 单元
73
+      level: data.levelId, // 楼层
74
+      roomNo: data.roomNoId, // 户号
75
+      worthOf: data.worthOf, // 催缴日期
76
+      billInvoiceExplain: data.billInvoiceExplain, // 收费单说明
77
+      payPrice: data.payPrice // 收费金额
78
+    }
79
+  })
80
+}
81
+
82
+// 由前台批量添加收费单, 进行统一的提交, 修改为有效
83
+export function updateBillInvoiceStatus(data) {
84
+  return request({
85
+    url: '/bill/invoice/updateBillInvoiceStatus',
86
+    method: 'post',
87
+    data
88
+  })
89
+}
90
+
91
+// 查询前台批量添加的收费单, 状态是作废
92
+export function getTempBillInvoice(billId) {
93
+  return request({
94
+    url: '/bill/invoice/getTempBillInvoice/' + billId,
95
+    method: 'get'
96
+  })
97
+}
98
+
99
+// 根据id删除收费单, 只能删除作废的
100
+export function deleteTempBillInvoice(billId) {
101
+  return request({
102
+    url: '/bill/invoice/deleteTempBillInvoice/' + billId,
103
+    method: 'delete'
104
+  })
105
+}
106
+
107
+// 根据缴费单id, 修改金额
108
+export function updateBillInvoiceIdPayPrice(data) {
109
+  return request({
110
+    url: '/bill/invoice/updateBillInvoiceIdPayPrice/' + data.id,
111
+    method: 'post',
112
+    data: {
113
+      payPrice: data.payPrice
114
+    }
115
+  })
116
+}
117
+
118
+// 下载excel
119
+export function exportExcel(billId) {
120
+  return request({
121
+    url: '/bill/invoice/exportExcel/' + billId,
122
+    method: 'get',
123
+    responseType: 'blob'
124
+  })
125
+}
126
+
127
+// 根据缴费项id, 查询草稿
128
+export function billInvoiceGetInvoiceInvalid(data) {
129
+  return request({
130
+    url: '/bill/invoice/getInvoiceInvalid',
131
+    method: 'post',
132
+    data: {
133
+      billId: data.billId,
134
+      pageNum: data.pageNum,
135
+      pageSize: data.pageSize
136
+    }
137
+  })
138
+}
139
+
140
+// 根据收费单id, 修改收费说明
141
+export function updateBillInvoiceIdBillInvoiceExplain(data) {
142
+  return request({
143
+    url: '/bill/invoice/updateBillInvoiceIdBillInvoiceExplain/' + data.id,
144
+    method: 'post',
145
+    data: {
146
+      billInvoiceExplain: data.billInvoiceExplain
147
+    }
148
+  })
149
+}

+ 36
- 0
smart-property-manage/src/api/billStatement.js Wyświetl plik

@@ -0,0 +1,36 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取流水信息
4
+export function getBillStatementAll(data) {
5
+  return request({
6
+    url: '/bill/statement/all',
7
+    method: 'post',
8
+    data: {
9
+      orderBumber: data.orderBumber, // 订单号
10
+      billId: data.billId, // 缴费项 id
11
+      billName: data.billName, //  缴费项 名称
12
+      billInvoiceId: data.billInvoiceId, // 缴费单 编号
13
+      payPhone: data.payPhone, //  缴费人手机号
14
+      pageNum: data.pageNum,
15
+      pageSize: data.pageSize
16
+    }
17
+  })
18
+}
19
+
20
+// 下载excel
21
+export function exportExcel() {
22
+  return request({
23
+    url: '/bill/statement/exportExcel',
24
+    method: 'get',
25
+    responseType: 'blob'
26
+  })
27
+}
28
+
29
+// 根据点单查询,缴费单
30
+export function getByOrderNumberBillInvoice(orderNumber) {
31
+  return request({
32
+    url: '/bill/order/getByOrderNumberBillInvoice/' + orderNumber,
33
+    method: 'get'
34
+  })
35
+}
36
+

+ 255
- 0
smart-property-manage/src/api/buildingOwnerInfo.js Wyświetl plik

@@ -0,0 +1,255 @@
1
+import request from '@/utils/request'
2
+
3
+//  查询 楼栋/单元/楼层/户号
4
+export function getPhaseList(data) {
5
+  return request({
6
+    url: '/building/phase',
7
+    method: 'get',
8
+    params: data
9
+  })
10
+}
11
+
12
+//  查询 楼栋/单元/楼层/户号
13
+export function getBuildingList(data) {
14
+  return request({
15
+    url: '/building/building',
16
+    method: 'get',
17
+    params: data
18
+  })
19
+}
20
+
21
+//  查询 楼栋/单元/楼层/户号
22
+export function getUnitList(data) {
23
+  return request({
24
+    url: '/building/unit',
25
+    method: 'get',
26
+    params: data
27
+  })
28
+}
29
+
30
+//  查询 楼栋/单元/楼层/户号
31
+export function getLevelList(data) {
32
+  return request({
33
+    url: '/building/level',
34
+    method: 'get',
35
+    params: data
36
+  })
37
+}
38
+
39
+//  查询 楼栋/单元/楼层/户号
40
+export function getRoomNoList(data) {
41
+  return request({
42
+    url: '/building/roomno',
43
+    method: 'get',
44
+    params: data
45
+  })
46
+}
47
+
48
+// 获取楼栋户主信息列表
49
+export function buildingList(data) {
50
+  return request({
51
+    url: '/building/list',
52
+    method: 'post',
53
+    data: {
54
+      phaseId: data.phaseId,
55
+      buildingId: data.buildingId,
56
+      unitId: data.unitId,
57
+      levelId: data.levelId,
58
+      roomNoId: data.roomNoId,
59
+      ownerName: data.ownerName,
60
+      ownerTel: data.ownerTel,
61
+      idCard: data.idCard,
62
+      pageNum: data.pageNum,
63
+      pageSize: data.pageSize
64
+    }
65
+  })
66
+}
67
+// 认证通过户主信息
68
+export function userPassCertification(data) {
69
+  return request({
70
+    url: 'userPassCertification',
71
+    method: 'post',
72
+    data: {
73
+      ownerName: data.ownerName,
74
+      ownerTel: data.ownerTel,
75
+      pageNum: data.pageNum,
76
+      pageSize: data.pageSize,
77
+      verifyStatus: data.verifyStatus
78
+    }
79
+  })
80
+}
81
+// 修改停用或启用
82
+export function updataPassCertification(data) {
83
+  console.log('api: ', data)
84
+  return request({
85
+    url: '/updataPassCertification',
86
+    method: 'post',
87
+    data: {
88
+      ownerTel: data.ownerTel,
89
+      verifyStatus: data.verifyStatus
90
+    }
91
+  })
92
+}
93
+
94
+// 批量删除 楼栋户主信息
95
+export function deleteBuilding(data) {
96
+  return request({
97
+    url: '/building/delete',
98
+    method: 'delete',
99
+    data
100
+  })
101
+}
102
+
103
+// 添加楼栋户主信息
104
+export function addBuilding(data) {
105
+  return request({
106
+    url: '/building/add',
107
+    method: 'post',
108
+    data: {
109
+      phaseId: data.phaseId,
110
+      buildingId: data.buildingId,
111
+      unitId: data.unitId,
112
+      levelId: data.levelId,
113
+      roomNoId: data.roomNoId,
114
+      ownerName: data.ownerName,
115
+      ownerTel: data.ownerTel,
116
+      roleId: data.roleId,
117
+      gender: data.gender
118
+    }
119
+  })
120
+}
121
+
122
+// 修改楼栋户主信息
123
+export function updateBuilding(data) {
124
+  return request({
125
+    url: '/building/update',
126
+    method: 'put',
127
+    data: {
128
+      userVerifyId: data.userVerifyId,
129
+      roleId: data.roleId,
130
+      verifyStatus: data.verifyStatus,
131
+      remark: data.remark
132
+    }
133
+  })
134
+}
135
+
136
+// 根据楼栋信息 id 查询
137
+export function getByIdBuildingId(buildingId) {
138
+  return request({
139
+    url: '/building/verify/' + buildingId,
140
+    method: 'get'
141
+  })
142
+}
143
+
144
+// 获取楼栋户主信息列表
145
+export function communityBuildinglist(data) {
146
+  return request({
147
+    url: '/buildinglist',
148
+    method: 'post',
149
+    data: {
150
+      phase: data.phase,
151
+      building: data.building,
152
+      unit: data.unit,
153
+      level: data.level,
154
+      roomNo: data.roomNo,
155
+      ownerName: data.ownerName,
156
+      pageNum: data.pageNum,
157
+      pageSize: data.pageSize
158
+    }
159
+  })
160
+}
161
+// 查询小区楼栋资料库
162
+export function buildingHouse(data) {
163
+  const config = {
164
+    url: '/buildinghouse',
165
+    method: 'post',
166
+    data: {
167
+      phase: data.phase,
168
+      building: data.building,
169
+      unit: data.unit,
170
+      level: data.level,
171
+      roomNo: data.roomNo
172
+    }
173
+  }
174
+  return request(config)
175
+}
176
+
177
+// 查询小区楼栋资料库
178
+export function communityBuildingAdd(data) {
179
+  return request({
180
+    url: '/communitybuilding/update',
181
+    method: 'post',
182
+    data: {
183
+      phase: data.phase,
184
+      updatePhase: data.updatePhase,
185
+      building: data.building,
186
+      updateBuilding: data.updateBuilding,
187
+      unit: data.unit,
188
+      updateUnit: data.updateUnit,
189
+      level: data.level,
190
+      updateLevel: data.updateLevel,
191
+      roomNo: data.roomNo,
192
+      updateRoomNo: data.updateRoomNo
193
+    }
194
+  })
195
+}
196
+
197
+// 下载excel模板
198
+export function buildingDownloadExcel() {
199
+  return request({
200
+    url: '/building/downloadExcel',
201
+    method: 'get',
202
+    responseType: 'blob'
203
+  })
204
+}
205
+
206
+// 添加当前期/栋/单元/层/户/节点
207
+export function addNode(data) {
208
+  return request({
209
+    url: '/addnode',
210
+    method: 'post',
211
+    data: {
212
+      id: data.id,
213
+      name: data.name,
214
+      type: data.type,
215
+      nodeNumber: data.nodeNumber
216
+    }
217
+  })
218
+}
219
+
220
+// 删除当前期/栋/单元/层/户/节点
221
+export function deleteNode(data) {
222
+  return request({
223
+    url: '/deletenode',
224
+    method: 'post',
225
+    data: {
226
+      id: data.id,
227
+      name: data.name,
228
+      type: data.type,
229
+      nodeNumber: data.nodeNumber
230
+    }
231
+  })
232
+}
233
+// 查新楼栋信息详情
234
+export function buildingDetails(data) {
235
+  return request({
236
+    url: '/building/details',
237
+    method: 'post',
238
+    data: {
239
+      id: data.userVerifyId
240
+    }
241
+  })
242
+}
243
+// 楼栋详情审核用户
244
+export function verifyinfoAdd(data) {
245
+  return request({
246
+    url: '/user/verifyinfo/' + data.userVerifyId,
247
+    method: 'put',
248
+    params: {
249
+      verifyStatus: data.status,
250
+      roleState: data.roleId,
251
+      remark: data.remark
252
+
253
+    }
254
+  })
255
+}

+ 9
- 0
smart-property-manage/src/api/buildingTree.js Wyświetl plik

@@ -0,0 +1,9 @@
1
+import request from '@/utils/request'
2
+
3
+export function buildingTreeList(query) {
4
+  return request({
5
+    url: '/trees',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}

+ 60
- 0
smart-property-manage/src/api/community.js Wyświetl plik

@@ -0,0 +1,60 @@
1
+import request from '@/utils/request'
2
+
3
+export function fetchList(query) {
4
+  return request({
5
+    url: '/communitys',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}
10
+
11
+export function createCommunity(data) {
12
+  return request({
13
+    url: '/community/add',
14
+    method: 'post',
15
+    data
16
+  })
17
+}
18
+
19
+export function updateCommunity(data) {
20
+  return request({
21
+    url: '/community/update',
22
+    method: 'post',
23
+    data
24
+  })
25
+}
26
+
27
+export function fetchProvinceList() {
28
+  return request({
29
+    url: '/common/province',
30
+    method: 'get'
31
+  })
32
+}
33
+
34
+export function fetchCityList(query) {
35
+  return request({
36
+    url: '/common/city',
37
+    method: 'get',
38
+    params: { provinceId: query }
39
+  })
40
+}
41
+
42
+export function fetchDistrictList(query) {
43
+  return request({
44
+    url: '/common/district',
45
+    method: 'get',
46
+    params: { cityId: query }
47
+  })
48
+}
49
+
50
+// 根据 手机号 和 验证码 查询用管理的小区
51
+export function userCommunity(data) {
52
+  return request({
53
+    url: '/community/user',
54
+    method: 'post',
55
+    data: {
56
+      'loginName': data.username,
57
+      'code': data.password
58
+    }
59
+  })
60
+}

+ 49
- 0
smart-property-manage/src/api/equipment.js Wyświetl plik

@@ -0,0 +1,49 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询设备列表
4
+export function getAll(data) {
5
+  return request({
6
+    url: '/equipment/list',
7
+    method: 'get',
8
+    params: {
9
+      type: data.type
10
+    }
11
+  })
12
+}
13
+
14
+// 提交设备数据,进行保存
15
+export function equipmentMonitoring(data) {
16
+  return request({
17
+    url: '/equipment/monitoring',
18
+    method: 'post',
19
+    data
20
+  })
21
+}
22
+
23
+// 删除设备
24
+export function deleteEquipment(id) {
25
+  return request({
26
+    url: '/equipment/' + id,
27
+    method: 'delete'
28
+  })
29
+}
30
+
31
+// 根据设备id查询
32
+export function getMonitoringById(data) {
33
+  return request({
34
+    url: '/equipment/' + data.id,
35
+    method: 'get',
36
+    params: {
37
+      type: data.type
38
+    }
39
+  })
40
+}
41
+
42
+// 批量删除设备
43
+export function deleteMonitoringBachByIds(data) {
44
+  return request({
45
+    url: '/equipment/delete',
46
+    method: 'delete',
47
+    data
48
+  })
49
+}

+ 81
- 0
smart-property-manage/src/api/grogshop.js Wyświetl plik

@@ -0,0 +1,81 @@
1
+import request from '@/utils/request'
2
+
3
+export function hotelRoom(data) {
4
+  return request({
5
+    url: '/hotelRoomList',
6
+    method: 'post',
7
+    data: {
8
+      roomNo: data.roomNo,
9
+      roomName: data.roomName,
10
+      price: data.price,
11
+      roomStatus: data.roomStatus,
12
+      beginTime: data.beginTime,
13
+      endTime: data.endTime,
14
+      sort: data.sort,
15
+      pageNum: data.pageNum,
16
+      pageSize: data.pageSize
17
+    }
18
+  })
19
+}
20
+export function hotelRoomAdd(data) {
21
+  return request({
22
+    url: '/hotelRoomAdd',
23
+    method: 'post',
24
+    data: {
25
+      roomNo: data.roomNo,
26
+      roomName: data.roomName,
27
+      price: data.price,
28
+      roomStatus: data.roomStatus,
29
+      sort: data.sort,
30
+      remark: data.remark
31
+    }
32
+  })
33
+}
34
+export function hotelRoomEdit(data) {
35
+  return request({
36
+    url: '/hotelRoomEdit',
37
+    method: 'post',
38
+    data: {
39
+      id: data.id,
40
+      roomNo: data.roomNo,
41
+      roomName: data.roomName,
42
+      price: data.price,
43
+      roomStatus: data.roomStatus,
44
+      sort: data.sort,
45
+      remark: data.remark
46
+    }
47
+  })
48
+}
49
+export function getRoomId(data) {
50
+  return request({
51
+    url: '/getRoom',
52
+    method: 'post',
53
+    data: {
54
+      id: data.id
55
+    }
56
+  })
57
+}
58
+export function hotelRoomRoomStatus(data) {
59
+  return request({
60
+    url: '/hotelRoomRoomStatus',
61
+    method: 'post',
62
+    data: {
63
+      id: data.roomStatusIds,
64
+      roomStatus: data.roomStatus
65
+    }
66
+  })
67
+}
68
+export function updateHotel(data) {
69
+  return request({
70
+    url: '/addHotel',
71
+    method: 'post',
72
+    data: data
73
+  })
74
+}
75
+export function getHotelData(data) {
76
+  return request({
77
+    url: '/getHotelData',
78
+    method: 'get'
79
+  })
80
+}
81
+

+ 24
- 0
smart-property-manage/src/api/index.js Wyświetl plik

@@ -0,0 +1,24 @@
1
+import request from '@/utils/request'
2
+
3
+// 硬件数据统计
4
+export function getHardData() {
5
+  return request({
6
+    url: '/mq/open',
7
+    method: 'get'
8
+  })
9
+}
10
+
11
+// 注册用户统计
12
+export function getSignUser() {
13
+  return request({
14
+    url: '/user/count',
15
+    method: 'get'
16
+  })
17
+}
18
+// 首页图表数据
19
+export function getIndexCount() {
20
+  return request({
21
+    url: '/index/count',
22
+    method: 'get'
23
+  })
24
+}

+ 27
- 0
smart-property-manage/src/api/license.js Wyświetl plik

@@ -0,0 +1,27 @@
1
+import request from '@/utils/request'
2
+
3
+// 查询月租车记录
4
+export function getLicenseAll(data) {
5
+  return request({
6
+    url: '/user/license/order',
7
+    method: 'get',
8
+    params: {
9
+      id: data.id,
10
+      licensePlate: data.licensePlate,
11
+      orderNumber: data.orderNumber,
12
+      paymentName: data.paymentName,
13
+      paymentTel: data.paymentTel,
14
+      pageNum: data.pageNum,
15
+      pageSize: data.pageSize
16
+    }
17
+  })
18
+}
19
+
20
+// 导出月租车数据
21
+export function exportLicenseData() {
22
+  return request({
23
+    url: '/user/license/export',
24
+    method: 'get',
25
+    responseType: 'blob'
26
+  })
27
+}

+ 49
- 0
smart-property-manage/src/api/login.js Wyświetl plik

@@ -0,0 +1,49 @@
1
+import request from '@/utils/request'
2
+
3
+export function login(username, password, communityId) {
4
+  const config = {
5
+    url: '/user/login',
6
+    method: 'post',
7
+    data: {
8
+      'loginName': username,
9
+      'code': password,
10
+      'communityId': communityId
11
+    }
12
+  }
13
+
14
+  return request(config)
15
+}
16
+
17
+export function getInfo() {
18
+  return request({
19
+    url: '/user/info',
20
+    method: 'get'
21
+    // params: { token }
22
+  })
23
+}
24
+
25
+// 退出登陆
26
+export function logOut() {
27
+  return request({
28
+    url: '/user/logOut',
29
+    method: 'post'
30
+  })
31
+}
32
+
33
+// 发送验证码
34
+export function sendCode(phone) {
35
+  return request({
36
+    url: '/code/sendCode',
37
+    method: 'post',
38
+    params: { phone }
39
+  })
40
+}
41
+
42
+// 获取权限集合
43
+export function getPermission() {
44
+  return request({
45
+    url: '/user/permission',
46
+    method: 'get'
47
+  })
48
+}
49
+

+ 25
- 0
smart-property-manage/src/api/menu.js Wyświetl plik

@@ -0,0 +1,25 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取菜单列表
4
+export function getMenuList() {
5
+  return request({
6
+    url: '/ta/menu/list',
7
+    method: 'get'
8
+  })
9
+}
10
+
11
+// 启用菜单
12
+export function menuEnable(id) {
13
+  return request({
14
+    url: '/ta/menu/enable/' + id,
15
+    method: 'post'
16
+  })
17
+}
18
+
19
+// 停用菜单
20
+export function menuDisable(id) {
21
+  return request({
22
+    url: '/ta/menu/disable/' + id,
23
+    method: 'post'
24
+  })
25
+}

+ 41
- 0
smart-property-manage/src/api/message.js Wyświetl plik

@@ -0,0 +1,41 @@
1
+import request from '@/utils/request'
2
+
3
+export function listMessage(data) {
4
+  return request({
5
+    url: '/messageLiset',
6
+    method: 'post',
7
+    data: {
8
+      id: data.id,
9
+      messageContent: data.messageContent,
10
+      messageType: data.messageType,
11
+      createDate: data.dataValue,
12
+      pageNum: data.pageNum,
13
+      pageSize: data.pageSize,
14
+      status: data.status
15
+    }
16
+  })
17
+}
18
+export function myMessageList(data) {
19
+  return request({
20
+    url: '/myMessageList',
21
+    method: 'post',
22
+    data: {
23
+      id: data.id,
24
+      messageContent: data.messageContent,
25
+      messageType: data.messageType,
26
+      createDate: data.dataValue,
27
+      pageNum: data.pageNum,
28
+      pageSize: data.pageSize,
29
+      readStatus: data.readStatus
30
+    }
31
+  })
32
+}
33
+export function delectRead(data) {
34
+  return request({
35
+    url: '/delectRead',
36
+    method: 'post',
37
+    data: {
38
+      id: data
39
+    }
40
+  })
41
+}

+ 52
- 0
smart-property-manage/src/api/rental.js Wyświetl plik

@@ -0,0 +1,52 @@
1
+import request from '@/utils/request'
2
+
3
+export function fetchRentalList(query) {
4
+  return request({
5
+    url: '/rentals',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}
10
+
11
+export function obtainedRental(ids) {
12
+  return request({
13
+    url: '/rental/obtained',
14
+    method: 'post',
15
+    data: {
16
+      idArray: ids
17
+    }
18
+  })
19
+}
20
+
21
+export function shelfRental(ids) {
22
+  return request({
23
+    url: '/rental/shelf',
24
+    method: 'post',
25
+    data: {
26
+      idArray: ids
27
+    }
28
+  })
29
+}
30
+
31
+export function addRental(listQuery) {
32
+  return request({
33
+    url: '/rental/add',
34
+    method: 'post',
35
+    data: listQuery
36
+  })
37
+}
38
+
39
+export function updateRental(listQuery) {
40
+  return request({
41
+    url: '/rental/update',
42
+    method: 'post',
43
+    data: listQuery
44
+  })
45
+}
46
+
47
+export function getRental(id) {
48
+  return request({
49
+    url: '/rental/get/' + id,
50
+    method: 'get'
51
+  })
52
+}

+ 58
- 0
smart-property-manage/src/api/role.js Wyświetl plik

@@ -0,0 +1,58 @@
1
+import request from '@/utils/request'
2
+
3
+export function fetchList(query) {
4
+  return request({
5
+    url: '/roles',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}
10
+
11
+export function fetchMenuList() {
12
+  return request({
13
+    url: '/menus',
14
+    method: 'get'
15
+  })
16
+}
17
+
18
+export function addRoleInfo(data) {
19
+  return request({
20
+    url: '/role/add',
21
+    method: 'post',
22
+    data: {
23
+      roleName: data.roleName,
24
+      description: data.description,
25
+      menuArray: data.menuArray
26
+    }
27
+  })
28
+}
29
+
30
+export function updateRoleInfo(data) {
31
+  return request({
32
+    url: '/role/update/' + data.id,
33
+    method: 'put',
34
+    data: {
35
+      roleName: data.roleName,
36
+      description: data.description,
37
+      menuArray: data.menuArray
38
+    }
39
+  })
40
+}
41
+
42
+export function getRoleInfo(id) {
43
+  return request({
44
+    url: '/role/' + id,
45
+    method: 'get'
46
+  })
47
+}
48
+
49
+export function deleteRoles(ids) {
50
+  return request({
51
+    url: '/role/delete',
52
+    method: 'post',
53
+    data: {
54
+      idArray: ids
55
+    }
56
+  })
57
+}
58
+

+ 168
- 0
smart-property-manage/src/api/shopType.js Wyświetl plik

@@ -0,0 +1,168 @@
1
+import request from '@/utils/request'
2
+
3
+export function fetchShopTypeList(query) {
4
+  return request({
5
+    url: '/shop/types',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}
10
+
11
+export function changeShopSetting(shopSettingValue) {
12
+  return request({
13
+    url: '/shop/add/setting',
14
+    method: 'post',
15
+    data: {
16
+      shopSettingValue: shopSettingValue
17
+    }
18
+  })
19
+}
20
+
21
+export function addShopType(listQuery) {
22
+  return request({
23
+    url: '/shop/add/type',
24
+    method: 'post',
25
+    data: listQuery
26
+  })
27
+}
28
+
29
+export function addShop(listQuery) {
30
+  return request({
31
+    url: '/shop/add',
32
+    method: 'post',
33
+    data: listQuery
34
+  })
35
+}
36
+
37
+export function getShopType(id) {
38
+  return request({
39
+    url: '/shop/get/type/' + id,
40
+    method: 'get'
41
+  })
42
+}
43
+
44
+export function getShop(id) {
45
+  return request({
46
+    url: '/shop/get/' + id,
47
+    method: 'get'
48
+  })
49
+}
50
+
51
+export function updateShopType(listQuery) {
52
+  return request({
53
+    url: '/shop/update/type',
54
+    method: 'post',
55
+    data: listQuery
56
+  })
57
+}
58
+
59
+export function updateShop(listQuery) {
60
+  return request({
61
+    url: '/shop/update',
62
+    method: 'post',
63
+    data: listQuery
64
+  })
65
+}
66
+
67
+export function deleteShopType(ids) {
68
+  return request({
69
+    url: '/shop/delete/type',
70
+    method: 'delete',
71
+    data: {
72
+      idArray: ids
73
+    }
74
+  })
75
+}
76
+
77
+export function obtainedShop(ids) {
78
+  return request({
79
+    url: '/shop/obtained',
80
+    method: 'post',
81
+    data: {
82
+      idArray: ids
83
+    }
84
+  })
85
+}
86
+
87
+export function shelfShop(ids) {
88
+  return request({
89
+    url: '/shop/shelf',
90
+    method: 'post',
91
+    data: {
92
+      idArray: ids
93
+    }
94
+  })
95
+}
96
+
97
+export function fetchShopList(query) {
98
+  return request({
99
+    url: '/shops',
100
+    method: 'get',
101
+    params: query
102
+  })
103
+}
104
+
105
+export function fetchShopTypeSelect(query) {
106
+  return request({
107
+    url: '/shop/type/select',
108
+    method: 'get'
109
+  })
110
+}
111
+
112
+export function shopAppraisalList(data) {
113
+  return request({
114
+    url: '/shopAppraisalList',
115
+    method: 'get',
116
+    params: {
117
+      appraisalId: data.appraisalId,
118
+      id: data.shopId,
119
+      shopName: data.shopName,
120
+      score: data.score,
121
+      content: data.content,
122
+      appraisalPeople: data.appraisalPeople,
123
+      appraisalTel: data.appraisalTel,
124
+      pageSize: data.pageSize,
125
+      pageNum: data.pageNum
126
+    }
127
+  })
128
+}
129
+export function shopAppraisalDetails(data) {
130
+  return request({
131
+    url: '/shopAppraisal/details',
132
+    method: 'get',
133
+    params: {
134
+      id: data.id
135
+    }
136
+  })
137
+}
138
+export function shopAppraisalReplayAddandEditor(data) {
139
+  return request({
140
+    url: '/shopAppraisalReplay/AddandEditor',
141
+    method: 'post',
142
+    params: {
143
+      id: data.id,
144
+      replayContent: data.replayContent,
145
+      code: data.code
146
+    }
147
+  })
148
+}
149
+export function shopAppraisalStatuss(data) {
150
+  return request({
151
+    url: '/shopAppraisal/Status',
152
+    method: 'post',
153
+    data: {
154
+      id: data.ides,
155
+      status: data.status
156
+    }
157
+  })
158
+}
159
+export function shopAppraisalSort(data) {
160
+  return request({
161
+    url: '/shopAppraisalSort/Sort',
162
+    method: 'post',
163
+    params: {
164
+      id: data.id,
165
+      sort: data.sort
166
+    }
167
+  })
168
+}

+ 9
- 0
smart-property-manage/src/api/table.js Wyświetl plik

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

+ 61
- 0
smart-property-manage/src/api/tels.js Wyświetl plik

@@ -0,0 +1,61 @@
1
+import request from '@/utils/request'
2
+
3
+// 根据搜索条件获取物业端号码
4
+export function getTelsList(data) {
5
+  return request({
6
+    url: '/tels',
7
+    method: 'get',
8
+    params: {
9
+      name: data.name,
10
+      tel: data.tel,
11
+      remark: data.remark,
12
+      pageNum: data.pageNum,
13
+      pageSize: data.pageSize
14
+    }
15
+  })
16
+}
17
+
18
+// 添加 物业号码
19
+export function telAdd(data) {
20
+  return request({
21
+    url: '/tel/add',
22
+    method: 'post',
23
+    data: {
24
+      name: data.name,
25
+      tel: data.tel,
26
+      remark: data.remark
27
+    }
28
+  })
29
+}
30
+
31
+// 物业号码修改
32
+export function telUpdate(data) {
33
+  return request({
34
+    url: '/tel/update',
35
+    method: 'put',
36
+    data: {
37
+      id: data.id,
38
+      name: data.name,
39
+      tel: data.tel,
40
+      remark: data.remark
41
+    }
42
+  })
43
+}
44
+
45
+// 根据id查询 物业号码详情
46
+export function getTelById(id) {
47
+  return request({
48
+    url: '/tel/' + id,
49
+    method: 'get'
50
+  })
51
+}
52
+
53
+// 批量删除 物业号码
54
+export function telDeleteProperty(data) {
55
+  return request({
56
+    url: '/tel/delete',
57
+    method: 'post',
58
+    data
59
+  })
60
+}
61
+

+ 85
- 0
smart-property-manage/src/api/ticket.js Wyświetl plik

@@ -0,0 +1,85 @@
1
+import request from '@/utils/request'
2
+
3
+export function listTicket(data) {
4
+  return request({
5
+    url: '/ticketLiset',
6
+    method: 'post',
7
+    data: {
8
+      id: data.id,
9
+      type: data.type,
10
+      createUserNmae: data.createUserNmae,
11
+      ticketTitle: data.ticketTitle,
12
+      createUser: data.createUser,
13
+      status: data.status,
14
+      tpUserId: data.tpUserId,
15
+      updateUserNmae: data.updateUserNmae,
16
+      pageNum: data.pageNum,
17
+      pageSize: data.pageSize
18
+    }
19
+  })
20
+}
21
+export function ticketEdit(data) {
22
+  return request({
23
+    url: '/ticketDetails',
24
+    method: 'post',
25
+    data: {
26
+      id: data.id
27
+    }
28
+  })
29
+}
30
+export function addRecordComment(data) {
31
+  return request({
32
+    url: '/addRecordComment',
33
+    method: 'post',
34
+    data: {
35
+      ticketId: data.id,
36
+      content: data.textContent,
37
+      imageUrl: data.img
38
+    }
39
+  })
40
+}
41
+export function addRecord(data) {
42
+  return request({
43
+    url: '/addRecord',
44
+    method: 'post',
45
+    data: {
46
+      ticketId: data.id,
47
+      id: data.selectVale
48
+    }
49
+  })
50
+}
51
+
52
+export function updateTicketStatus(data) {
53
+  return request({
54
+    url: '/updateTicketStatus',
55
+    method: 'post',
56
+    data: {
57
+      ticketId: data.id,
58
+      textContent: data.noAcceptContent
59
+    }
60
+  })
61
+}
62
+
63
+export function updateTicket(data) {
64
+  return request({
65
+    url: '/updateTicket',
66
+    method: 'post',
67
+    data: {
68
+      ticketId: data.id,
69
+      content: data.relationContent,
70
+      imageUrl: data.imgIO
71
+    }
72
+  })
73
+}
74
+
75
+// // headers: {
76
+//   'Content-Type': 'application/x-www-form-urlencoded'
77
+// },
78
+export function imgAdd(data) {
79
+  return request({
80
+    url: '/uploadimageBase64',
81
+    method: 'post',
82
+    data: data
83
+  })
84
+}
85
+

+ 143
- 0
smart-property-manage/src/api/transaction.js Wyświetl plik

@@ -0,0 +1,143 @@
1
+import request from '@/utils/request'
2
+
3
+export function fetchList(query) {
4
+  return request({
5
+    url: '/transactions',
6
+    method: 'get',
7
+    params: query
8
+  })
9
+}
10
+
11
+// 查询 活动详情
12
+export function transactionById(id) {
13
+  return request({
14
+    url: '/transaction/' + id,
15
+    method: 'get'
16
+  })
17
+}
18
+
19
+// 作废 活动详情
20
+export function updateTransactionById(id) {
21
+  return request({
22
+    url: '/transaction/update/' + id,
23
+    method: 'post'
24
+  })
25
+}
26
+// 帖子列表
27
+export function transactionsList(data) {
28
+  return request({
29
+    url: '/transactions',
30
+    method: 'post',
31
+    data: {
32
+      transactionTitle: data.transactionTitle,
33
+      id: data.id,
34
+      userName: data.userName,
35
+      status: data.status,
36
+      pageNum: data.pageNum,
37
+      pageSize: data.pageSize
38
+    }
39
+  })
40
+}
41
+// 添加二手帖子
42
+export function transactionsAdd(data) {
43
+  return request({
44
+    url: '/transactions/add',
45
+    method: 'post',
46
+    data: {
47
+      transactionTitle: data.transactionTitle,
48
+      type: data.type,
49
+      id: data.id,
50
+      userName: data.userName,
51
+      status: data.status,
52
+      contentImg: data.contentImg,
53
+      transactionContent: data.transactionContent,
54
+      sort: data.sort
55
+    }
56
+  })
57
+}
58
+// 编辑二手帖子
59
+export function transactionsEdit(data) {
60
+  return request({
61
+    url: '/transactions/updata',
62
+    method: 'post',
63
+    data: {
64
+      transactionTitle: data.transactionTitle,
65
+      type: data.type,
66
+      id: data.id,
67
+      userName: data.userName,
68
+      status: data.status,
69
+      contentImg: data.contentImg,
70
+      transactionContent: data.transactionContent,
71
+      sort: data.sort
72
+    }
73
+  })
74
+}
75
+// 删除二手帖子
76
+export function transactionsDelete(data) {
77
+  console.log('1111')
78
+  console.log(data)
79
+  return request({
80
+    url: '/transactions/delete',
81
+    method: 'post',
82
+    data: {
83
+      id: data
84
+    }
85
+  })
86
+}
87
+// 评论列表
88
+export function transactionReplyList(data) {
89
+  return request({
90
+    url: '/transactionReplyList',
91
+    method: 'post',
92
+    data: {
93
+      replyId: data.replyId,
94
+      id: data.transactionId,
95
+      replyTaUserName: data.replyTaUserName,
96
+      taUserName: data.taUserName,
97
+      status: data.status,
98
+      pageNum: data.pageNum,
99
+      pageSize: data.pageSize,
100
+      createDate: data.dataValue
101
+    }
102
+  })
103
+}
104
+// 删除评论
105
+export function deleteReply(data) {
106
+  console.log(data)
107
+  return request({
108
+    url: '/deleteReply',
109
+    method: 'post',
110
+    data: {
111
+      id: data
112
+    }
113
+  })
114
+}
115
+// 添加评论
116
+export function transactionReplyAdd(data) {
117
+  return request({
118
+    url: '/transactionReply/add',
119
+    method: 'post',
120
+    data: {
121
+      id: data.id,
122
+      contentImg: data.contentImg,
123
+      replyContent: data.replyContent,
124
+      transactionId: data.transactionId,
125
+      replyType: data.replyType
126
+    }
127
+  })
128
+}
129
+// 举报列表
130
+export function transactionReportList(data) {
131
+  return request({
132
+    url: '/transactionReportList',
133
+    method: 'post',
134
+    data: {
135
+      transactionId: data.transactionId,
136
+      reportPhone: data.reportPhone,
137
+      reportUserNmae: data.taUserName,
138
+      pageNum: data.pageNum,
139
+      pageSize: data.pageSize,
140
+      createDate: data.dataValue
141
+    }
142
+  })
143
+}

+ 136
- 0
smart-property-manage/src/api/user.js Wyświetl plik

@@ -0,0 +1,136 @@
1
+import request from '@/utils/request'
2
+
3
+// 根据条件查询成员
4
+export function employeesList(data) {
5
+  return request({
6
+    url: '/user/userList',
7
+    method: 'post',
8
+    data: {
9
+      loginName: data.loginName,
10
+      userName: data.userName,
11
+      pageNum: data.pageNum,
12
+      pageSize: data.pageSize
13
+    }
14
+  })
15
+}
16
+// 获取角色暂定写死
17
+export function userRoleById(data) {
18
+  return request({
19
+    url: '/user/userRole',
20
+    method: 'post',
21
+    data: {
22
+      pageNum: data.pageNum,
23
+      pageSize: data.pageSize,
24
+      roleName: data.roleName
25
+    }
26
+  })
27
+}
28
+// 添加用户角色
29
+export function addUser(data) {
30
+  return request({
31
+    url: '/user/addUser',
32
+    method: 'post',
33
+    data: {
34
+      pageNum: data.pageNum,
35
+      pageSize: data.pageSize,
36
+      roleName: data.roleName,
37
+      remark: data.remark,
38
+      userName: data.userName,
39
+      loginName: data.loginName,
40
+      menuArray: data.menuArray
41
+    }
42
+  })
43
+}
44
+// 查看用户角色
45
+export function selectUser(data) {
46
+  return request({
47
+    url: '/user/selectById',
48
+    method: 'post',
49
+    data: {
50
+      id: data.id
51
+    }
52
+  })
53
+}
54
+// 修改用户角色
55
+export function upDate(data) {
56
+  return request({
57
+    url: '/user/upDate',
58
+    method: 'post',
59
+    data: {
60
+      id: data.id,
61
+      pageNum: data.pageNum,
62
+      pageSize: data.pageSize,
63
+      roleName: data.roleName,
64
+      remark: data.remark,
65
+      userName: data.userName,
66
+      loginName: data.loginName,
67
+      menuArray: data.menuArray
68
+    }
69
+  })
70
+}
71
+// 修改用户当前状态
72
+export function upDateStatus(data) {
73
+  return request({
74
+    url: '/user/upDateStatus',
75
+    method: 'post',
76
+    data: {
77
+      id: data.id,
78
+      status: data.status
79
+    }
80
+  })
81
+}
82
+
83
+// 获取审核列表
84
+export function userVerifyAll(data) {
85
+  return request({
86
+    url: '/user/verify/all',
87
+    method: 'get',
88
+    params: {
89
+      phone: data.phone,
90
+      userName: data.userName,
91
+      idCard: data.idCard,
92
+      pageNum: data.pageNum,
93
+      pageSize: data.pageSize
94
+    }
95
+  })
96
+}
97
+
98
+// 审核用户
99
+export function userVerifyAudit(data) {
100
+  return request({
101
+    url: '/user/verify/audit/' + data.userVerifyId,
102
+    method: 'put',
103
+    params: {
104
+      verifyStatus: data.verifyStatus,
105
+      roleState: data.type,
106
+      remark: data.remark
107
+    }
108
+  })
109
+}
110
+
111
+// 校验移动端手机号是否注册
112
+export function taUserHas(data) {
113
+  return request({
114
+    url: '/ta/user/has',
115
+    method: 'get',
116
+    params: {
117
+      ownerTel: data.ownerTel
118
+    }
119
+  })
120
+}
121
+
122
+// 校验移动端手机号是否注册以及户主
123
+export function taUserHasOwner(data) {
124
+  return request({
125
+    url: '/ta/user/hasOwner',
126
+    method: 'get',
127
+    params: {
128
+      phaseId: data.phaseId,
129
+      buildingId: data.buildingId,
130
+      unitId: data.unitId,
131
+      levelId: data.levelId,
132
+      roomNoId: data.roomNoId
133
+    }
134
+  })
135
+}
136
+

BIN
smart-property-manage/src/assets/404_images/404.png Wyświetl plik


BIN
smart-property-manage/src/assets/404_images/404_cloud.png Wyświetl plik


BIN
smart-property-manage/src/assets/light1.png Wyświetl plik


BIN
smart-property-manage/src/assets/light2.png Wyświetl plik


BIN
smart-property-manage/src/assets/light3.png Wyświetl plik


BIN
smart-property-manage/src/assets/light4.png Wyświetl plik


+ 61
- 0
smart-property-manage/src/components/Breadcrumb/index.vue Wyświetl plik

@@ -0,0 +1,61 @@
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
smart-property-manage/src/components/Hamburger/index.vue Wyświetl plik

@@ -0,0 +1,58 @@
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>

+ 99
- 0
smart-property-manage/src/components/Pagination/index.vue Wyświetl plik

@@ -0,0 +1,99 @@
1
+<template>
2
+  <div :class="{'hidden':hidden}" class="pagination-container">
3
+    <el-pagination
4
+      :background="background"
5
+      :current-page.sync="currentPage"
6
+      :page-size.sync="pageSize"
7
+      :layout="layout"
8
+      :total="total"
9
+      v-bind="$attrs"
10
+      @size-change="handleSizeChange"
11
+      @current-change="handleCurrentChange"/>
12
+  </div>
13
+</template>
14
+
15
+<script>
16
+import { scrollTo } from '@/utils/scrollTo'
17
+
18
+export default {
19
+  name: 'Pagination',
20
+  props: {
21
+    total: {
22
+      required: true,
23
+      type: Number
24
+    },
25
+    page: {
26
+      type: Number,
27
+      default: 1
28
+    },
29
+    limit: {
30
+      type: Number,
31
+      default: 20
32
+    },
33
+    pageSizes: {
34
+      type: Array,
35
+      default() {
36
+        return [10, 20, 30, 50]
37
+      }
38
+    },
39
+    layout: {
40
+      type: String,
41
+      default: 'total, sizes, prev, pager, next, jumper'
42
+    },
43
+    background: {
44
+      type: Boolean,
45
+      default: true
46
+    },
47
+    autoScroll: {
48
+      type: Boolean,
49
+      default: true
50
+    },
51
+    hidden: {
52
+      type: Boolean,
53
+      default: false
54
+    }
55
+  },
56
+  computed: {
57
+    currentPage: {
58
+      get() {
59
+        return this.page
60
+      },
61
+      set(val) {
62
+        this.$emit('update:page', val)
63
+      }
64
+    },
65
+    pageSize: {
66
+      get() {
67
+        return this.limit
68
+      },
69
+      set(val) {
70
+        this.$emit('update:limit', val)
71
+      }
72
+    }
73
+  },
74
+  methods: {
75
+    handleSizeChange(val) {
76
+      this.$emit('pagination', { page: this.currentPage, limit: val })
77
+      if (this.autoScroll) {
78
+        scrollTo(0, 800)
79
+      }
80
+    },
81
+    handleCurrentChange(val) {
82
+      this.$emit('pagination', { page: val, limit: this.pageSize })
83
+      if (this.autoScroll) {
84
+        scrollTo(0, 800)
85
+      }
86
+    }
87
+  }
88
+}
89
+</script>
90
+
91
+<style scoped>
92
+.pagination-container {
93
+  background: #fff;
94
+  padding: 32px 16px;
95
+}
96
+.pagination-container.hidden {
97
+  display: none;
98
+}
99
+</style>

+ 43
- 0
smart-property-manage/src/components/SvgIcon/index.vue Wyświetl plik

@@ -0,0 +1,43 @@
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>

+ 122
- 0
smart-property-manage/src/components/Wangeditor/index.vue Wyświetl plik

@@ -0,0 +1,122 @@
1
+<template>
2
+  <div id="wangeditor">
3
+    <div ref="editorElem" style="text-align:left" />
4
+  </div>
5
+</template>
6
+
7
+<script>
8
+import E from 'wangeditor'
9
+import { mapGetters } from 'vuex'
10
+export default {
11
+  name: 'EditorElem',
12
+  props: ['content'], // 接收父组件的方法
13
+  data() {
14
+    return {
15
+      editorContent: this.content, // 内容
16
+      editorObject: ''
17
+    }
18
+  },
19
+  watch: {
20
+    content(nw, old) {
21
+      window.console.log('---->', nw, old)
22
+      if (!old && nw) {
23
+        window.console.log('--1111-->', nw)
24
+        this.editorContent = nw
25
+        this.initEditor()
26
+      }
27
+    }
28
+  },
29
+  computed: {
30
+    ...mapGetters([
31
+      'token'
32
+    ])
33
+  },
34
+  mounted() {
35
+    this.$nextTick(() => {
36
+      this.initEditor()
37
+    })
38
+  },
39
+  methods: {
40
+    childWangeditorValue() {
41
+      console.log('富文本组件的值:', this.editorContent)
42
+      this.$emit('wangeditorEvent', this.editorContent)
43
+    },
44
+    setWangeditorValue(value) { // 父组件调用此方法传入参数
45
+      this.editorObject.txt.html(value)
46
+    },
47
+    initEditor() {
48
+      this.editorObject = new E(this.$refs.editorElem) // 创建富文本实例
49
+      var editor = this.editorObject
50
+      editor.customConfig.onchange = (html) => {
51
+        this.editorContent = html
52
+        this.childWangeditorValue() // 把这个html通过catchData的方法传入父组件
53
+        // this.catchData(html) // 把这个html通过catchData的方法传入父组件
54
+      }
55
+      editor.customConfig.zIndex = 100
56
+      editor.customConfig.uploadImgServer = process.env.BASE_API + '/uploadimage'
57
+      editor.customConfig.uploadFileName = 'uploadFiles'
58
+      editor.customConfig.uploadImgHeaders = {
59
+        'Accept': '*/*',
60
+        'Authorization': 'Bearer ' + this.token // 头部token
61
+      }
62
+      editor.customConfig.menus = [ // 菜单配置
63
+        'head',
64
+        'list', // 列表
65
+        'justify', // 对齐方式
66
+        'bold',
67
+        'fontSize', // 字号
68
+        'italic',
69
+        'underline',
70
+        'image', // 插入图片
71
+        'foreColor', // 文字颜色
72
+        'undo', // 撤销
73
+        'redo' // 重复
74
+      ]
75
+      // 下面是最重要的的方法
76
+      editor.customConfig.uploadImgHooks = {
77
+        before: function(xhr, editor, files) {
78
+          // 图片上传之前触发
79
+          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files是选择的图片文件
80
+          // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
81
+          // return {
82
+          //     prevent: true,
83
+          //     msg: '放弃上传'
84
+          // }
85
+        },
86
+        success: function(xhr, editor, result) {
87
+          // 图片上传并返回结果,图片插入成功之后触发
88
+          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
89
+          this.imgUrl = Object.values(result.data).toString()
90
+        },
91
+        fail: function(xhr, editor, result) {
92
+          // 图片上传并返回结果,但图片插入错误时触发
93
+          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
94
+        },
95
+        error: function(xhr, editor) {
96
+          // 图片上传出错时触发
97
+          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
98
+        },
99
+        timeout: function(xhr, editor) {
100
+          // 图片上传超时时触发
101
+          // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
102
+        },
103
+        // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
104
+        // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
105
+        customInsert: function(insertImg, result, editor) {
106
+          // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
107
+          // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
108
+          // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
109
+          const url = Object.values(result.data)// result.data就是服务器返回的图片名字和链接
110
+          JSON.stringify(url)// 在这里转成JSON格式
111
+          insertImg(url)
112
+          // result 必须是一个 JSON 格式字符串!!!否则报错
113
+        }
114
+      }
115
+      editor.create()
116
+      console.log('富文本接收到的值:', this.editorContent)
117
+      editor.txt.html(this.editorContent)
118
+    }
119
+  }
120
+}
121
+
122
+</script>

+ 134
- 0
smart-property-manage/src/components/XUploader/index.vue Wyświetl plik

@@ -0,0 +1,134 @@
1
+<template>
2
+  <el-upload
3
+    :class="{ 'avatar-uploader': !multi }"
4
+    :action="apiURL"
5
+    :show-file-list="multi == true"
6
+    :list-type="multi ? 'picture-card' : undefined"
7
+    :file-list="imgList"
8
+    :before-upload="beforeImgUpload"
9
+    :headers="headers"
10
+    :on-success="handleSuccess"
11
+    :on-remove="handleRemove"
12
+    name="uploadFiles"
13
+    >
14
+    <template v-if="multi">
15
+      <i class="el-icon-plus"></i>
16
+    </template>
17
+    <template v-else>
18
+      <img v-if="value" :src="value" class="avatar">
19
+      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
20
+    </template>
21
+  </el-upload>
22
+</template>
23
+
24
+<script>
25
+export default {
26
+  name: 'XUploader',
27
+  props: [
28
+    'multi',
29
+    'value',
30
+  ],
31
+  data () {
32
+    return {
33
+      loadding: false,
34
+    }
35
+  },
36
+  computed: {
37
+    apiURL () {
38
+      return process.env.BASE_API + '/uploadimage'
39
+    },
40
+    imgList () {
41
+      if (!this.value) return undefined
42
+
43
+      const imgs = Array.isArray(this.value) ? this.value : [this.value]
44
+      return imgs.map(img => ({ name: this.getFileName(img), url: img }))
45
+    },
46
+    headers () {
47
+      return {}
48
+    }
49
+  },
50
+  methods: {
51
+    getFileName(fullName) {
52
+      const nm = (fullName || '').split('/')
53
+      return !nm.length ? '' : nm[nm.length - 1]
54
+    },
55
+    beforeImgUpload (file) {
56
+      if (file.type !== 'image/jpeg' && file.type !== 'image/png') {
57
+        this.$message.error('上传图片只能是 JPG 或 PNG 格式!')
58
+        return false
59
+      }
60
+      // if (file.size / 1024 > 300) {
61
+      //   this.$message.error('图片大小不允许超过300k!')
62
+      //   return false
63
+      // }
64
+      this.loading = this.$loading({
65
+        lock: true,
66
+        text: '上传中...',
67
+        spinner: 'el-icon-loading',
68
+        background: 'rgba(0, 0, 0, 0.8)'
69
+      })
70
+
71
+      return true
72
+    },
73
+    handleSuccess (res) {
74
+      this.loading.close()
75
+
76
+      if (res.code - 0 !== 0) {
77
+        this.$notify.error({
78
+          title: '上传失败',
79
+          message: res.code.message
80
+        })
81
+        return
82
+      }
83
+
84
+      let newVals = res.data[0]
85
+      if (this.multi) {
86
+        newVals = [
87
+          ...(this.value || []),
88
+          newVals
89
+        ]
90
+      }
91
+
92
+      this.$emit('input', newVals)
93
+    },
94
+    handleRemove (file, fileList) {
95
+      if (!this.multi) {
96
+        this.$emit('input', '')
97
+      } else {
98
+        const leftImgs = fileList.map(({ url }) => url)
99
+        this.$emit('input', leftImgs)
100
+      }
101
+      return true
102
+    },
103
+  }
104
+}
105
+</script>
106
+
107
+<style>
108
+  .avatar-uploader .el-upload {
109
+    border: 1px dashed #d9d9d9;
110
+    border-radius: 6px;
111
+    cursor: pointer;
112
+    position: relative;
113
+    overflow: hidden;
114
+  }
115
+
116
+  .avatar-uploader .el-upload:hover {
117
+    border-color: #409EFF;
118
+  }
119
+
120
+  .avatar-uploader-icon {
121
+    font-size: 28px;
122
+    color: #8c939d;
123
+    width: 178px;
124
+    height: 178px;
125
+    line-height: 178px;
126
+    text-align: center;
127
+  }
128
+  
129
+  .avatar {
130
+    width: 178px;
131
+    height: 178px;
132
+    display: block;
133
+  }
134
+</style>

+ 111
- 0
smart-property-manage/src/components/chart/barChart.vue Wyświetl plik

@@ -0,0 +1,111 @@
1
+<template>
2
+  <div :id="id"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+
8
+export default {
9
+  name: 'BarChart',
10
+  props: [
11
+    'id',
12
+    'title',
13
+    'data',
14
+    'axisX',
15
+    'axisY'
16
+  ],
17
+  data () {
18
+    return {
19
+      chart: undefined,
20
+    }
21
+  },
22
+  mounted() {
23
+    this.rander();
24
+  },
25
+  watch: {
26
+    data() {
27
+      window.console.log(this.id, this.data)
28
+      this.rander()
29
+    }
30
+  },
31
+  methods: {
32
+    rander() {
33
+      const _self = this
34
+
35
+      if (this.chart) {
36
+        this.chart.clear();
37
+      } else {
38
+        this.chart = new G2.Chart({
39
+          container: _self.id,
40
+          forceFit: true,
41
+          height: 282,
42
+          padding: [80, 20, 30, 40]
43
+        });
44
+      }
45
+
46
+      const chart = this.chart;
47
+      chart.source(_self.data);
48
+
49
+      chart.scale('value', {});
50
+
51
+      chart.axis("value", {
52
+        line: {
53
+          lineWidth: 1, // 设置线的宽度
54
+          stroke: "#a4b6c5" // 设置线的颜色
55
+        },
56
+        grid: null,
57
+        label: {
58
+          textStyle: {
59
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
60
+            fill: "#a4b6c5", // 文本的颜色
61
+            fontSize: "12", // 文本大小
62
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
63
+          }
64
+        }
65
+      });
66
+      chart.axis("item", {
67
+        line: {
68
+          lineWidth: 1, // 设置线的宽度
69
+          stroke: "#a4b6c5" // 设置线的颜色
70
+        },
71
+        grid: null,
72
+        label: {
73
+          textStyle: {
74
+            fill: "#a4b6c5", // 文本的颜色
75
+            fontSize: "12" // 文本大小
76
+          }
77
+        }
78
+      });
79
+      // chart.tooltip({
80
+      //   crosshairs: true
81
+      // });
82
+
83
+      chart.guide().html({
84
+        position: ["5%", "-35%"],
85
+        html: `<div class="line-chat"><p class="title">${_self.title}</p></div>`
86
+      });
87
+      chart.guide().html({
88
+        position: ["1%", "-22%"],
89
+        html: `<div class="line-chat"><p class="title">${_self.axisY}</p></div>`
90
+      });
91
+      chart.guide().html({
92
+        position: ["102%", "100%"],
93
+        html: `<div class="line-chat"><p class="title">${_self.axisX}</p></div>`
94
+      });
95
+
96
+      chart.interval().position('item*value').color('item');
97
+
98
+      chart.render();
99
+    }
100
+  }
101
+};
102
+</script>
103
+<style lang="scss">
104
+.chart7-title {
105
+  .title {
106
+    font-size: 13px;
107
+    color: #a4b6c5;
108
+  }
109
+}
110
+</style>
111
+

+ 120
- 0
smart-property-manage/src/components/chart/chart1.vue Wyświetl plik

@@ -0,0 +1,120 @@
1
+<template>
2
+  <div id="node1"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from '@antv/g2'
7
+import DataSet from '@antv/data-set'
8
+
9
+export default {  
10
+  props: [
11
+    'data',  // [ { item: '实例1', count: 210, percent: 0.21 } ]
12
+  ],
13
+  computed: {
14
+    total () {
15
+      return (this.data || []).reduce((acc, it) => (acc + it.count), 0) || 0
16
+    }
17
+  },
18
+  watch: {
19
+    data () {
20
+      this.rander()
21
+    }
22
+  },
23
+  mounted() {
24
+    this.rander()
25
+  },
26
+  methods: {
27
+    rander() {
28
+      const _self = this
29
+      
30
+      if (this.chart) {
31
+        this.chart.clear();
32
+      } else {
33
+        this.chart = new G2.Chart({
34
+          container: 'node1',
35
+          forceFit: true,
36
+          height: 282,
37
+          animate: false,
38
+          padding: [40, 'auto', 'auto', 'auto']
39
+        });
40
+      }
41
+
42
+      var chart = this.chart
43
+
44
+      chart.source(_self.data, {
45
+        percent: {
46
+          formatter: function formatter(val) {
47
+            val = val * 100 + '%';
48
+            return val;
49
+          }
50
+        }
51
+      });
52
+
53
+      chart.coord('theta', {
54
+        radius: 0.75,
55
+        innerRadius: 0.6
56
+      });
57
+
58
+      chart.tooltip({
59
+        showTitle: false,
60
+        itemTpl: '<li><span style="background-color:{color};" class="g2-tooltip-marker"></span>{name}: {value}</li>'
61
+      });
62
+
63
+      chart.legend(false);
64
+
65
+      chart.guide().html({
66
+        position: ['50%', '-15%'],
67
+        html: '<div class="chart2-title"><p class="title">历史工单</p></div>'
68
+      })
69
+
70
+      // 辅助文本
71
+      chart.guide().html({
72
+        position: ['50%', '50%'],
73
+        html: `<div style="color:#8c8c8c;font-size: 14px;text-align: center;width: 10em;">总计<br><span style="color:#8c8c8c;font-size:20px">${_self.total}</span>单</div>`,
74
+        alignX: 'middle',
75
+        alignY: 'middle'
76
+      });
77
+
78
+      var interval = chart.intervalStack().position('percent').color('item').label('percent', {
79
+        formatter: function formatter(val, item) {
80
+          return item.point.item + ': ' + val;
81
+        },
82
+        textStyle: {
83
+          fill: '#a4b6c5', // 文本的颜色
84
+          fontSize: '12' // 文本大小
85
+        }
86
+      }).tooltip('item*percent', function(item, percent) {
87
+        // percent = percent * 100 + '%';
88
+        window.console.log('------>', _self.data, item)
89
+        return {
90
+          name: item,
91
+          value: _self.data.filter(({ item: it }) => (it == item))[0].count,
92
+        };
93
+      });
94
+
95
+      chart.render();
96
+      // interval.setSelected(this.data[0]);
97
+    }
98
+  }
99
+}
100
+</script>
101
+
102
+<style lang="scss">
103
+#node1 {
104
+  .g2-guide-html {
105
+    color: #a4b6c5;
106
+    .title {
107
+      text-align: "ceter";
108
+    }
109
+    .value {
110
+      text-align: center;
111
+    }
112
+  }
113
+  .g2-guide-title {
114
+    color: #a4b6c5;
115
+    .title {
116
+      font-size: 16px;
117
+    }
118
+  }
119
+}
120
+</style>

+ 96
- 0
smart-property-manage/src/components/chart/chart2.vue Wyświetl plik

@@ -0,0 +1,96 @@
1
+<template>
2
+  <div id="node2" />
3
+</template>
4
+
5
+<script>
6
+import G2 from '@antv/g2'
7
+
8
+export default {
9
+  props: [
10
+    'data',
11
+  ],
12
+  data () {
13
+    return {
14
+      chart: undefined,
15
+    }
16
+  },
17
+  mounted() {
18
+    this.rander()
19
+  },
20
+  watch: {
21
+    data() {
22
+      this.rander()
23
+    }
24
+  },
25
+  methods: {
26
+    rander() {
27
+      const _self = this
28
+
29
+      if (this.chart) {
30
+        this.chart.clear();
31
+      } else {
32
+        this.chart = new G2.Chart({
33
+          container: 'node2',
34
+          forceFit: true,
35
+          height: 282,
36
+          padding: [40, 'auto', 'auto', 'auto']
37
+        })
38
+      }
39
+
40
+      const chart = this.chart;
41
+
42
+      chart.source(this.data, {
43
+        percent: {
44
+          formatter: function formatter(val) {
45
+            val = val * 100 + '%'
46
+            return val
47
+          }
48
+        }
49
+      })
50
+
51
+      chart.coord('theta', {
52
+        radius: 0.75
53
+      })
54
+
55
+      chart.guide().html({
56
+        position: ['50%', '-15%'],
57
+        html: '<div class="chart2-title"><p class="title">今日新增工单</p></div>'
58
+      })
59
+
60
+      chart.tooltip({
61
+        showTitle: false,
62
+        itemTpl: '<li><span style="background-color:{color}" class="g2-tooltip-marker"></span>{name}: {value}</li>'
63
+      })
64
+      
65
+      chart.legend(false);
66
+
67
+      chart.intervalStack().position('percent').color('item').label('percent', {
68
+        formatter: function formatter(val, item) {
69
+          return item._origin.item + ': ' + val
70
+        },
71
+        textStyle: {
72
+          fill: '#a4b6c5', // 文本的颜色
73
+          fontSize: '12' // 文本大小
74
+        }
75
+      }).tooltip('item*percent', function(item, percent) {
76
+        // percent = percent * 100 + '%'
77
+        return {
78
+          name: item,
79
+          value: _self.data.filter(({ item: it }) => (it == item))[0].count,
80
+        }
81
+      })
82
+
83
+      chart.render()
84
+    }
85
+  }
86
+}
87
+</script>
88
+
89
+<style lang="scss">
90
+.chart2-title {
91
+  .title {
92
+    font-size: 16px;
93
+    color: #a4b6c5;
94
+  }
95
+}
96
+</style>

+ 93
- 0
smart-property-manage/src/components/chart/chart3.vue Wyświetl plik

@@ -0,0 +1,93 @@
1
+<template>
2
+  <div id="node3">
3
+    <div class="title">今日小区智能硬件数据统计</div>
4
+    <div class="table">
5
+      <div :class="bgHover==1?'active':''"  @mouseenter="divHover(1)">
6
+        <div>小区门禁开启</div>
7
+        <div>{{ hardwaremap.communityCount }}</div>
8
+      </div>
9
+      <div :class="bgHover==2?'active':''"  @mouseenter="divHover(2)">
10
+        <div>单元门开启</div>
11
+        <div>{{ hardwaremap.unitCount }}</div>
12
+      </div>
13
+      <div :class="bgHover==3?'active':''"  @mouseenter="divHover(3)">
14
+        <div>访客车辆进入数量</div>
15
+        <div>{{ hardwaremap.visitorCount }}</div>
16
+      </div>
17
+      <div :class="bgHover==4?'active':''"  @mouseenter="divHover(4)">
18
+        <div>公区摄像头查看</div>
19
+        <div>{{ hardwaremap.publicCameraCount }}</div>
20
+      </div>
21
+      <div :class="bgHover==5?'active':''"  @mouseenter="divHover(5)">
22
+        <div>单元门远程监控查看</div>
23
+        <div>{{ hardwaremap.remoteMonitoringCount }}</div>
24
+      </div>
25
+      <div :class="bgHover==6?'active':''"  @mouseenter="divHover(6)">
26
+        <div>单元门远程开门</div>
27
+        <div>{{ hardwaremap.remoteUnitCount }}</div>
28
+      </div>
29
+    </div>
30
+  </div>
31
+</template>
32
+
33
+<script>
34
+export default {
35
+  data() {
36
+    return {
37
+      bgHover:"",
38
+
39
+    };
40
+  },
41
+  props: ["hardwaremap"],
42
+ 
43
+  methods:{
44
+       divHover(index) {
45
+      this.bgHover = index;
46
+    }
47
+  }
48
+};
49
+</script>
50
+
51
+<style lang="scss" scoped>
52
+#node3 {
53
+  position: relative;
54
+  .title {
55
+    text-align: center;
56
+    padding: 3% 0 30px 0;
57
+    color: #a4b6c5;
58
+  }
59
+  .table {
60
+    display: flex;
61
+    flex-flow: row wrap;
62
+    border: 1px solid #a4b6c5;
63
+    width: 302px;
64
+    margin: 0 auto;
65
+    > div {
66
+      width: 100px;
67
+      height: 100px;
68
+      border: 1px solid #a4b6c5;
69
+      display: flex;
70
+      flex-flow: column nowrap;
71
+      justify-content: center;
72
+      align-items: center;
73
+      &:hover {
74
+        cursor: pointer;
75
+      }
76
+      div {
77
+        color: #a4b6c5;
78
+        margin: 5px;
79
+        font-size: 13px;
80
+        text-align: center;
81
+      }
82
+    }
83
+    .active {
84
+      outline: 2px solid #53f9ff;
85
+      z-index: 1;
86
+      div {
87
+        color: #53f9ff;
88
+        text-align: center;
89
+      }
90
+    }
91
+  }
92
+}
93
+</style>

+ 126
- 0
smart-property-manage/src/components/chart/chart4.vue Wyświetl plik

@@ -0,0 +1,126 @@
1
+<template>
2
+  <div id="node4"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+import DataSet from "@antv/data-set";
8
+
9
+export default {
10
+  props: [
11
+    'data',
12
+  ],
13
+  data () {
14
+    return {}
15
+  },
16
+  mounted() {
17
+    this.rander();
18
+    console.log(this.invoicelist,"chart4")
19
+  },
20
+  watch: {
21
+    data() {
22
+      this.rander()
23
+    }
24
+  },
25
+  methods: {
26
+    rander() {
27
+      var chart = new G2.Chart({
28
+        container: "node4",
29
+        forceFit: true,
30
+        height: 282,
31
+        padding: [80, 40, 30, 50]
32
+      });
33
+      chart.source(this.data);
34
+
35
+      chart.axis("value", {
36
+        line: {
37
+          lineWidth: 1, // 设置线的宽度
38
+          stroke: "#a4b6c5" // 设置线的颜色
39
+        },
40
+        grid: null,
41
+        label: {
42
+          textStyle: {
43
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
44
+            fill: "#a4b6c5", // 文本的颜色
45
+            fontSize: "12", // 文本大小
46
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
47
+          }
48
+        }
49
+      });
50
+      chart.axis("day", {
51
+        line: {
52
+          lineWidth: 1, // 设置线的宽度
53
+          stroke: "#a4b6c5" // 设置线的颜色
54
+        },
55
+        grid: null,
56
+        label: {
57
+          textStyle: {
58
+            fill: "#a4b6c5", // 文本的颜色
59
+            fontSize: "12" // 文本大小
60
+          }
61
+        }
62
+      });
63
+      chart.tooltip({
64
+        crosshairs: true
65
+      });
66
+
67
+      chart
68
+        .line()
69
+        .position("day*value")
70
+        .color("priceTotal", function(val) {
71
+          return "#83BB41";
72
+        })
73
+        .size(2)
74
+        .shape("smooth");
75
+      chart
76
+        .point()
77
+        .position("day*value")
78
+        .size(3)
79
+        .shape("circle")
80
+        .label("day*value",
81
+          function(day, value) {
82
+            return value;
83
+          },
84
+          {
85
+            textStyle: {
86
+              fill: "#fff",
87
+              fontSize: 12,
88
+              textAlign:'left',
89
+            }
90
+          }
91
+        )
92
+        .style({
93
+          fill: "#eee",
94
+          fontSize: 12,
95
+          stroke: "#83BB41",
96
+          lineWidth: 1
97
+        });
98
+      chart.guide().html({
99
+        position: ["5%", "-35%"],
100
+        html:
101
+          '<div class="chart4-title"><p class="title">收费组总缴费统计</p></div>'
102
+      });
103
+      chart.guide().html({
104
+        position: ["1%", "-22%"],
105
+        html:
106
+          '<div class="chart4-title"><p class="title">金额(元)</p></div>'
107
+      });
108
+      chart.guide().html({
109
+        position: ["102%", "100%"],
110
+        html:
111
+          '<div class="chart4-title"><p class="title">日期</p></div>'
112
+      });
113
+      chart.render();
114
+    }
115
+  }
116
+};
117
+</script>
118
+
119
+<style lang="scss">
120
+.chart4-title {
121
+  .title {
122
+    font-size: 13px;
123
+    color: #a4b6c5;
124
+  }
125
+}
126
+</style>

+ 125
- 0
smart-property-manage/src/components/chart/chart5.vue Wyświetl plik

@@ -0,0 +1,125 @@
1
+<template>
2
+  <div id="node5" />
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+import DataSet from "@antv/data-set";
8
+export default {
9
+  data () {
10
+    return {}
11
+  },
12
+  mounted() {
13
+    this.rander();
14
+  },
15
+  props:['data'],
16
+  watch: {
17
+    data() {
18
+      this.rander();
19
+    }
20
+  },
21
+  methods: {
22
+    rander() {
23
+      var chart = new G2.Chart({
24
+        container: "node5",
25
+        forceFit: true,
26
+        height: 282,
27
+        padding: [80, 40, 30, 40]
28
+      });
29
+      chart.source(this.data);
30
+
31
+      chart.axis("value", {
32
+        line: {
33
+          lineWidth: 1, // 设置线的宽度
34
+          stroke: "#a4b6c5" // 设置线的颜色
35
+        },
36
+        grid: null,
37
+        label: {
38
+          textStyle: {
39
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
40
+            fill: "#a4b6c5", // 文本的颜色
41
+            fontSize: "12", // 文本大小
42
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
43
+          }
44
+        }
45
+      });
46
+      chart.axis("day", {
47
+        line: {
48
+          lineWidth: 1, // 设置线的宽度
49
+          stroke: "#a4b6c5" // 设置线的颜色
50
+        },
51
+        grid: null,
52
+        label: {
53
+          textStyle: {
54
+            fill: "#a4b6c5", // 文本的颜色
55
+            fontSize: "12", // 文本大小
56
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
57
+          }
58
+        }
59
+      });
60
+      chart.tooltip({
61
+        crosshairs: true
62
+      });
63
+
64
+      chart
65
+        .line()
66
+        .position("day*value")
67
+        .color("type", function(val) {
68
+          return "#da70d6";
69
+        })
70
+        .size(2)
71
+        .shape("smooth");
72
+      chart
73
+        .point()
74
+        .position("day*value")
75
+        .size(3)
76
+        .shape("circle")
77
+        .label(
78
+          "day*value",
79
+          function(day, value) {
80
+            return value;
81
+          },
82
+          {
83
+            textStyle: {
84
+              fill: "#fff",
85
+              fontSize: 12,
86
+              textAlign: "left"
87
+            }
88
+          }
89
+        )
90
+        .style({
91
+          fill: "#eee",
92
+          fontSize: 12,
93
+          stroke: "#da70d6",
94
+          lineWidth: 1
95
+        });
96
+
97
+      chart.guide().html({
98
+        position: ["5%", "-35%"],
99
+        html:
100
+          '<div class="chart5-title"><p class="title">线上月租车总缴费统计</p></div>'
101
+      });
102
+        chart.guide().html({
103
+        position: ["1%", "-22%"],
104
+        html:
105
+          '<div class="chart4-title"><p class="title">金额(元)</p></div>'
106
+      });
107
+      chart.guide().html({
108
+        position: ["102%", "100%"],
109
+        html:
110
+          '<div class="chart4-title"><p class="title">日期</p></div>'
111
+      });
112
+      chart.render();
113
+    }
114
+  }
115
+};
116
+</script>
117
+
118
+<style lang="scss">
119
+.chart5-title {
120
+  .title {
121
+    font-size: 13px;
122
+    color: #a4b6c5;
123
+  }
124
+}
125
+</style>

+ 163
- 0
smart-property-manage/src/components/chart/chart6.vue Wyświetl plik

@@ -0,0 +1,163 @@
1
+<template>
2
+  <div id="node6"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+import DataSet from "@antv/data-set";
8
+export default {
9
+  mounted() {
10
+    this.rander();
11
+  },
12
+  props:['temporaryList'],
13
+  methods: {
14
+    rander() {
15
+      var data = [
16
+        {
17
+          year: "11.17",
18
+          ACME: 300
19
+        },
20
+        {
21
+          year: "11.18",
22
+          ACME: 280
23
+        },
24
+        {
25
+          year: "11.19",
26
+          ACME: 320
27
+        },
28
+        {
29
+          year: "11.20",
30
+          ACME: 250
31
+        },
32
+        {
33
+          year: "11.21",
34
+          ACME: 310
35
+        },
36
+        {
37
+          year: "11.22",
38
+          ACME: 323
39
+        },
40
+        {
41
+          year: "11.23",
42
+          ACME: 350
43
+        }
44
+      ];
45
+      var dv = new DataSet.View().source(data);
46
+      dv.transform({
47
+        type: "fold",
48
+        fields: ["ACME"],
49
+        key: "type",
50
+        value: "value"
51
+      });
52
+      var chart = new G2.Chart({
53
+        container: "node6",
54
+        forceFit: true,
55
+        height: 282,
56
+        padding: [80, 40, 30, 40],
57
+        itemStyle: { normal: { label: { show: true } } }
58
+      });
59
+      chart.source(dv, {
60
+        value: {
61
+          alias: "The Share Price in Dollars",
62
+          formatter: function formatter(val) {
63
+            return val;
64
+          }
65
+        },
66
+        year: {
67
+          // range: [0, 1]
68
+        }
69
+      });
70
+      chart.axis("value", {
71
+        line: {
72
+          lineWidth: 1, // 设置线的宽度
73
+          stroke: "#a4b6c5" // 设置线的颜色
74
+        },
75
+        grid: null,
76
+        label: {
77
+          textStyle: {
78
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
79
+            fill: "#a4b6c5", // 文本的颜色
80
+            fontSize: "12", // 文本大小
81
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
82
+          }
83
+        }
84
+      });
85
+      chart.axis("year", {
86
+        line: {
87
+          lineWidth: 1, // 设置线的宽度
88
+          stroke: "#a4b6c5" // 设置线的颜色
89
+        },
90
+        name: "wowow",
91
+        grid: null,
92
+        label: {
93
+          textStyle: {
94
+            fill: "#a4b6c5", // 文本的颜色
95
+            fontSize: "12" // 文本大小
96
+          }
97
+        }
98
+      });
99
+      chart.tooltip({
100
+        crosshairs: true
101
+      });
102
+      chart
103
+        .line()
104
+        .position("year*value")
105
+        .color("type", function(val) {
106
+          return "#6495ed";
107
+        })
108
+        .size(2)
109
+        .shape("smooth");
110
+      chart
111
+        .point()
112
+        .position("year*value")
113
+        .size(3)
114
+        .shape("circle")
115
+        .label(
116
+          "year*value",
117
+          function(year, value) {
118
+            return value;
119
+          },
120
+          {
121
+            textStyle: {
122
+              fill: "#fff",
123
+              fontSize: 12,
124
+              textAlign:'left',
125
+            }
126
+          }
127
+        )
128
+        .style({
129
+          fill: "#eee",
130
+          fontSize: 12,
131
+          stroke: "#6495ed",
132
+          lineWidth: 1
133
+        });
134
+
135
+      chart.guide().html({
136
+        position: ["5%", "-35%"],
137
+        html:
138
+          '<div class="chart4-title"><p class="title">线上临时车总缴费统计</p></div>'
139
+      });
140
+        chart.guide().html({
141
+        position: ["1%", "-22%"],
142
+        html:
143
+          '<div class="chart4-title"><p class="title">金额(元)</p></div>'
144
+      });
145
+      chart.guide().html({
146
+        position: ["102%", "100%"],
147
+        html:
148
+          '<div class="chart4-title"><p class="title">日期</p></div>'
149
+      });
150
+      chart.render();
151
+    }
152
+  }
153
+};
154
+</script>
155
+
156
+<style lang="scss">
157
+.chart4-title {
158
+  .title {
159
+    font-size: 13px;
160
+    color: #a4b6c5;
161
+  }
162
+}
163
+</style>

+ 123
- 0
smart-property-manage/src/components/chart/chart7.vue Wyświetl plik

@@ -0,0 +1,123 @@
1
+<template>
2
+  <div id="node7"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+
8
+export default {
9
+  mounted() {
10
+    this.rander();
11
+  },
12
+  methods: {
13
+    rander() {
14
+      var data = [
15
+        {
16
+          type: "户主",
17
+          sales: 500
18
+        },
19
+        {
20
+          type: "家属",
21
+          sales: 1000
22
+        },
23
+        {
24
+          type: "租客",
25
+          sales: 300
26
+        }
27
+      ];
28
+      var chart = new G2.Chart({
29
+        container: "node7",
30
+        forceFit: true,
31
+        height: 282,
32
+        padding: [80, 20, 30, 40]
33
+      });
34
+      chart.source(data);
35
+      chart.scale("", {
36
+        tickInterval: 200
37
+      });
38
+      chart.scale("sales", {
39
+        alias: "行数(万)"
40
+      });
41
+      chart.guide().html({
42
+        position: ["5%", "-35%"],
43
+        html:
44
+          '<div class="chart7-title"><p class="title">注册用户总数</p></div>'
45
+      });
46
+        chart.guide().html({
47
+        position: ["1%", "-22%"],
48
+        html:
49
+          '<div class="chart4-title"><p class="title">数量(个)</p></div>'
50
+      });
51
+   
52
+      // chart.guide().html({
53
+      //   position: ["90%", "-15%"],
54
+      //   html: `<div class="chart-right-btn"><span>发布数量</span>&nbsp;<i class='el-icon-arrow-down'></i></div>`
55
+      // });
56
+      chart.axis("sales", {
57
+        line: {
58
+          lineWidth: 1, // 设置线的宽度
59
+          stroke: "#a4b6c5" // 设置线的颜色
60
+        },
61
+        title: {}, //
62
+
63
+        grid: null,
64
+        label: {
65
+          textStyle: {
66
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
67
+            fill: "#a4b6c5", // 文本的颜色
68
+            fontSize: "12", // 文本大小
69
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
70
+          }
71
+        }
72
+      });
73
+      chart.axis("type", {
74
+        line: {
75
+          lineWidth: 1, // 设置线的宽度
76
+          stroke: "#a4b6c5" // 设置线的颜色
77
+        },
78
+        grid: null,
79
+        label: {
80
+          textStyle: {
81
+            fill: "#a4b6c5", // 文本的颜色
82
+            fontSize: "12" // 文本大小
83
+          }
84
+        }
85
+      });
86
+
87
+      chart
88
+        .interval()
89
+        .position("type*sales")
90
+        .color("type", function(val) {
91
+          if (val === "户主") {
92
+            return "#6699FF";
93
+          } else if (val === "家属") {
94
+            return "#30e0e0";
95
+          }
96
+          return "#3cb371";
97
+        })
98
+        .label(
99
+          "type*sales",
100
+          function(type, sales) {
101
+            return sales;
102
+          },
103
+          {
104
+            textStyle: {
105
+              fill: "#fff",
106
+              fontSize: 12
107
+            }
108
+          }
109
+        );
110
+      chart.render();
111
+    }
112
+  }
113
+};
114
+</script>
115
+<style lang="scss">
116
+.chart7-title {
117
+  .title {
118
+    font-size: 13px;
119
+    color: #a4b6c5;
120
+  }
121
+}
122
+</style>
123
+

+ 158
- 0
smart-property-manage/src/components/chart/chart8.vue Wyświetl plik

@@ -0,0 +1,158 @@
1
+<template>
2
+  <div id="node8"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+import DataSet from "@antv/data-set";
8
+export default {
9
+  mounted() {
10
+    this.rander();
11
+  },
12
+  methods: {
13
+    rander() {
14
+      var data = [
15
+        {
16
+          year: "11.17",
17
+          ACME: 300
18
+        },
19
+        {
20
+          year: "11.18",
21
+          ACME: 280
22
+        },
23
+        {
24
+          year: "11.19",
25
+          ACME: 320
26
+        },
27
+        {
28
+          year: "11.20",
29
+          ACME: 250
30
+        },
31
+        {
32
+          year: "11.21",
33
+          ACME: 310
34
+        },
35
+        {
36
+          year: "11.22",
37
+          ACME: 323
38
+        },
39
+        {
40
+          year: "11.23",
41
+          ACME: 350
42
+        }
43
+      ];
44
+      var dv = new DataSet.View().source(data);
45
+      dv.transform({
46
+        type: "fold",
47
+        fields: ["ACME"],
48
+        key: "type",
49
+        value: "value"
50
+      });
51
+      var chart = new G2.Chart({
52
+        container: "node8",
53
+        forceFit: true,
54
+        height: 282,
55
+        padding: [80, 40, 30, 40]
56
+      });
57
+      chart.source(dv, {
58
+        value: {
59
+          formatter: function formatter(val) {
60
+            return val;
61
+          }
62
+        },
63
+        year: {
64
+          // range: [0, 1]
65
+        }
66
+      });
67
+      chart.axis("value", {
68
+        line: {
69
+          lineWidth: 1, // 设置线的宽度
70
+          stroke: "#a4b6c5" // 设置线的颜色
71
+        },
72
+        grid: null,
73
+        label: {
74
+          textStyle: {
75
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
76
+            fill: "#a4b6c5", // 文本的颜色
77
+            fontSize: "12", // 文本大小
78
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
79
+          }
80
+        }
81
+      });
82
+      chart.axis("year", {
83
+        line: {
84
+          lineWidth: 1, // 设置线的宽度
85
+          stroke: "#a4b6c5" // 设置线的颜色
86
+        },
87
+        grid: null,
88
+        label: {
89
+          textStyle: {
90
+            fill: "#a4b6c5", // 文本的颜色
91
+            fontSize: "12" // 文本大小
92
+          }
93
+        }
94
+      });
95
+      chart.tooltip({
96
+        crosshairs: true
97
+      });
98
+      chart
99
+        .line()
100
+        .position("year*value")
101
+        .color("type", function(val) {
102
+          return "#ffd700";
103
+        })
104
+        .size(2)
105
+        .shape("smooth");
106
+      chart
107
+        .point()
108
+        .position("year*value")
109
+        .size(3)
110
+        .shape("circle")
111
+        .label(
112
+          "year*value",
113
+          function(year, ACME) {
114
+            return ACME;
115
+          },
116
+          {
117
+            textStyle: {
118
+              fill: "#fff",
119
+              fontSize: 12,
120
+              textAlign:'left',
121
+            }
122
+          }
123
+        )
124
+        .style({
125
+          fill: "#eee",
126
+          fontSize: 12,
127
+          stroke: "#ffd700",
128
+          lineWidth: 1
129
+        });
130
+
131
+      chart.guide().html({
132
+        position: ["5%", "-35%"],
133
+        html: '<div class="chart8-title"><p class="title">日活跃用户</p></div>'
134
+      });
135
+        chart.guide().html({
136
+        position: ["1%", "-22%"],
137
+        html:
138
+          '<div class="chart4-title"><p class="title">数量(个)</p></div>'
139
+      });
140
+      chart.guide().html({
141
+        position: ["102%", "100%"],
142
+        html:
143
+          '<div class="chart4-title"><p class="title">日期</p></div>'
144
+      });
145
+      chart.render();
146
+    }
147
+  }
148
+};
149
+</script>
150
+
151
+<style lang="scss">
152
+.chart8-title {
153
+  .title {
154
+    font-size: 13px;
155
+    color: #a4b6c5;
156
+  }
157
+}
158
+</style>

+ 116
- 0
smart-property-manage/src/components/chart/chart9.vue Wyświetl plik

@@ -0,0 +1,116 @@
1
+<template>
2
+  <div id="node9"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+
8
+export default {
9
+  mounted() {
10
+    this.rander();
11
+  },
12
+  methods: {
13
+    rander() {
14
+      var data = [
15
+        {
16
+          type: "公告",
17
+          sales: 500
18
+        },
19
+        {
20
+          type: "活动",
21
+          sales: 400
22
+        },
23
+        {
24
+          type: "话题",
25
+          sales: 1000
26
+        }
27
+      ];
28
+      var chart = new G2.Chart({
29
+        container: "node9",
30
+        forceFit: true,
31
+        height: 282,
32
+        padding: [80, 20, 30, 40]
33
+      });
34
+      chart.source(data);
35
+      chart.scale("", {
36
+        tickInterval: 200
37
+      });
38
+      chart.guide().html({
39
+        position: ["5%", "-35%"],
40
+        html:
41
+          '<div class="chart9-title"><p class="title">已发布内容统计</p></div>'
42
+      });
43
+      chart.guide().html({
44
+        position: ["1%", "-22%"],
45
+        html: '<div class="chart4-title"><p class="title">数量(个)</p></div>'
46
+      });
47
+
48
+      chart.axis("sales", {
49
+        line: {
50
+          lineWidth: 1, // 设置线的宽度
51
+          stroke: "#a4b6c5" // 设置线的颜色
52
+        },
53
+        grid: null,
54
+        label: {
55
+          textStyle: {
56
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
57
+            fill: "#a4b6c5", // 文本的颜色
58
+            fontSize: "12", // 文本大小
59
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
60
+          }
61
+        }
62
+      });
63
+      chart.axis("type", {
64
+        line: {
65
+          lineWidth: 1, // 设置线的宽度
66
+          stroke: "#a4b6c5" // 设置线的颜色
67
+        },
68
+        grid: null,
69
+        label: {
70
+          textStyle: {
71
+            fill: "#a4b6c5", // 文本的颜色
72
+            fontSize: "12" // 文本大小
73
+          }
74
+        }
75
+      });
76
+      chart
77
+        .interval()
78
+        .position("type*sales")
79
+        .color("type", function(val) {
80
+          if (val === "公告") {
81
+            return "#53F9FF";
82
+          } else if (val === "活动") {
83
+            return "#FF6666";
84
+          }
85
+          return "#3F688D";
86
+        })
87
+        .label(
88
+          "type*sales",
89
+          function(type, sales) {
90
+            return sales;
91
+          },
92
+          {
93
+            textStyle: {
94
+              fill: "#fff",
95
+              fontSize: 12
96
+            }
97
+          }
98
+        );
99
+      chart.render();
100
+    }
101
+  }
102
+};
103
+</script>
104
+
105
+<style lang="scss">
106
+.chart9-title {
107
+  .title {
108
+    font-size: 13px;
109
+    color: #a4b6c5;
110
+  }
111
+}
112
+.chart-right-btn {
113
+  font-size: 13px;
114
+  color: #a4b6c5;
115
+}
116
+</style>

+ 136
- 0
smart-property-manage/src/components/chart/lineChart.vue Wyświetl plik

@@ -0,0 +1,136 @@
1
+<template>
2
+  <div :id="id"/>
3
+</template>
4
+
5
+<script>
6
+import G2 from "@antv/g2";
7
+import DataSet from "@antv/data-set";
8
+
9
+export default {
10
+  name: 'LineChart',
11
+  props: [
12
+    'id',
13
+    'title',
14
+    'data',
15
+    'axisX',
16
+    'axisY'
17
+  ],
18
+  data () {
19
+    return {
20
+      chart: undefined,
21
+    }
22
+  },
23
+  mounted() {
24
+    this.rander();
25
+  },
26
+  watch: {
27
+    data() {
28
+      window.console.log(this.id, this.data)
29
+      this.rander()
30
+    }
31
+  },
32
+  methods: {
33
+    rander() {
34
+      const _self = this
35
+
36
+      if (this.chart) {
37
+        this.chart.clear();
38
+      } else {
39
+        this.chart = new G2.Chart({
40
+          container: _self.id,
41
+          forceFit: true,
42
+          height: 282,
43
+          padding: [80, 40, 30, 50]
44
+        });
45
+      }
46
+
47
+      const chart = this.chart;
48
+      chart.source(_self.data);
49
+
50
+      chart.axis("value", {
51
+        line: {
52
+          lineWidth: 1, // 设置线的宽度
53
+          stroke: "#a4b6c5" // 设置线的颜色
54
+        },
55
+        grid: null,
56
+        label: {
57
+          textStyle: {
58
+            textAlign: "end", // 文本对齐方向,可取值为: start middle end
59
+            fill: "#a4b6c5", // 文本的颜色
60
+            fontSize: "12", // 文本大小
61
+            textBaseline: "middle" // 文本基准线,可取 top middle bottom,默认为middle
62
+          }
63
+        }
64
+      });
65
+      chart.axis("item", {
66
+        line: {
67
+          lineWidth: 1, // 设置线的宽度
68
+          stroke: "#a4b6c5" // 设置线的颜色
69
+        },
70
+        grid: null,
71
+        label: {
72
+          textStyle: {
73
+            fill: "#a4b6c5", // 文本的颜色
74
+            fontSize: "12" // 文本大小
75
+          }
76
+        }
77
+      });
78
+      chart.tooltip({
79
+        crosshairs: true
80
+      });
81
+
82
+      chart
83
+        .line()
84
+        .position("item*value")
85
+        .color("value", () => '#83BB41')
86
+        .size(2)
87
+        .shape("smooth");
88
+      chart
89
+        .point()
90
+        .position("item*value")
91
+        .size(3)
92
+        .shape("circle")
93
+        .label("item*value",
94
+          function(item, value) {
95
+            return value;
96
+          },
97
+          {
98
+            textStyle: {
99
+              fill: "#fff",
100
+              fontSize: 12,
101
+              textAlign:'left',
102
+            }
103
+          }
104
+        )
105
+        .style({
106
+          fill: "#eee",
107
+          fontSize: 12,
108
+          stroke: "#83BB41",
109
+          lineWidth: 1
110
+        });
111
+      chart.guide().html({
112
+        position: ["5%", "-35%"],
113
+        html: `<div class="line-chat"><p class="title">${_self.title}</p></div>`
114
+      });
115
+      chart.guide().html({
116
+        position: ["1%", "-22%"],
117
+        html: `<div class="line-chat"><p class="title">${_self.axisY}</p></div>`
118
+      });
119
+      chart.guide().html({
120
+        position: ["102%", "100%"],
121
+        html: `<div class="line-chat"><p class="title">${_self.axisX}</p></div>`
122
+      });
123
+      chart.render();
124
+    }
125
+  }
126
+};
127
+</script>
128
+
129
+<style lang="scss">
130
+.line-chat {
131
+  .title {
132
+    font-size: 13px;
133
+    color: #a4b6c5;
134
+  }
135
+}
136
+</style>

+ 49
- 0
smart-property-manage/src/directive/clipboard/clipboard.js Wyświetl plik

@@ -0,0 +1,49 @@
1
+// Inspired by https://github.com/Inndy/vue-clipboard2
2
+const Clipboard = require('clipboard')
3
+if (!Clipboard) {
4
+  throw new Error('you should npm install `clipboard` --save at first ')
5
+}
6
+
7
+export default {
8
+  bind(el, binding) {
9
+    if (binding.arg === 'success') {
10
+      el._v_clipboard_success = binding.value
11
+    } else if (binding.arg === 'error') {
12
+      el._v_clipboard_error = binding.value
13
+    } else {
14
+      const clipboard = new Clipboard(el, {
15
+        text() { return binding.value },
16
+        action() { return binding.arg === 'cut' ? 'cut' : 'copy' }
17
+      })
18
+      clipboard.on('success', e => {
19
+        const callback = el._v_clipboard_success
20
+        callback && callback(e) // eslint-disable-line
21
+      })
22
+      clipboard.on('error', e => {
23
+        const callback = el._v_clipboard_error
24
+        callback && callback(e) // eslint-disable-line
25
+      })
26
+      el._v_clipboard = clipboard
27
+    }
28
+  },
29
+  update(el, binding) {
30
+    if (binding.arg === 'success') {
31
+      el._v_clipboard_success = binding.value
32
+    } else if (binding.arg === 'error') {
33
+      el._v_clipboard_error = binding.value
34
+    } else {
35
+      el._v_clipboard.text = function() { return binding.value }
36
+      el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }
37
+    }
38
+  },
39
+  unbind(el, binding) {
40
+    if (binding.arg === 'success') {
41
+      delete el._v_clipboard_success
42
+    } else if (binding.arg === 'error') {
43
+      delete el._v_clipboard_error
44
+    } else {
45
+      el._v_clipboard.destroy()
46
+      delete el._v_clipboard
47
+    }
48
+  }
49
+}

+ 13
- 0
smart-property-manage/src/directive/clipboard/index.js Wyświetl plik

@@ -0,0 +1,13 @@
1
+import Clipboard from './clipboard'
2
+
3
+const install = function(Vue) {
4
+  Vue.directive('Clipboard', Clipboard)
5
+}
6
+
7
+if (window.Vue) {
8
+  window.clipboard = Clipboard
9
+  Vue.use(install); // eslint-disable-line
10
+}
11
+
12
+Clipboard.install = install
13
+export default Clipboard

+ 77
- 0
smart-property-manage/src/directive/el-dragDialog/drag.js Wyświetl plik

@@ -0,0 +1,77 @@
1
+export default{
2
+  bind(el, binding, vnode) {
3
+    const dialogHeaderEl = el.querySelector('.el-dialog__header')
4
+    const dragDom = el.querySelector('.el-dialog')
5
+    dialogHeaderEl.style.cssText += ';cursor:move;'
6
+    dragDom.style.cssText += ';top:0px;'
7
+
8
+    // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
9
+    const getStyle = (function() {
10
+      if (window.document.currentStyle) {
11
+        return (dom, attr) => dom.currentStyle[attr]
12
+      } else {
13
+        return (dom, attr) => getComputedStyle(dom, false)[attr]
14
+      }
15
+    })()
16
+
17
+    dialogHeaderEl.onmousedown = (e) => {
18
+      // 鼠标按下,计算当前元素距离可视区的距离
19
+      const disX = e.clientX - dialogHeaderEl.offsetLeft
20
+      const disY = e.clientY - dialogHeaderEl.offsetTop
21
+
22
+      const dragDomWidth = dragDom.offsetWidth
23
+      const dragDomHeight = dragDom.offsetHeight
24
+
25
+      const screenWidth = document.body.clientWidth
26
+      const screenHeight = document.body.clientHeight
27
+
28
+      const minDragDomLeft = dragDom.offsetLeft
29
+      const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
30
+
31
+      const minDragDomTop = dragDom.offsetTop
32
+      const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
33
+
34
+      // 获取到的值带px 正则匹配替换
35
+      let styL = getStyle(dragDom, 'left')
36
+      let styT = getStyle(dragDom, 'top')
37
+
38
+      if (styL.includes('%')) {
39
+        styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
40
+        styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
41
+      } else {
42
+        styL = +styL.replace(/\px/g, '')
43
+        styT = +styT.replace(/\px/g, '')
44
+      }
45
+
46
+      document.onmousemove = function(e) {
47
+        // 通过事件委托,计算移动的距离
48
+        let left = e.clientX - disX
49
+        let top = e.clientY - disY
50
+
51
+        // 边界处理
52
+        if (-(left) > minDragDomLeft) {
53
+          left = -minDragDomLeft
54
+        } else if (left > maxDragDomLeft) {
55
+          left = maxDragDomLeft
56
+        }
57
+
58
+        if (-(top) > minDragDomTop) {
59
+          top = -minDragDomTop
60
+        } else if (top > maxDragDomTop) {
61
+          top = maxDragDomTop
62
+        }
63
+
64
+        // 移动当前元素
65
+        dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
66
+
67
+        // emit onDrag event
68
+        vnode.child.$emit('dragDialog')
69
+      }
70
+
71
+      document.onmouseup = function(e) {
72
+        document.onmousemove = null
73
+        document.onmouseup = null
74
+      }
75
+    }
76
+  }
77
+}

+ 13
- 0
smart-property-manage/src/directive/el-dragDialog/index.js Wyświetl plik

@@ -0,0 +1,13 @@
1
+import drag from './drag'
2
+
3
+const install = function(Vue) {
4
+  Vue.directive('el-drag-dialog', drag)
5
+}
6
+
7
+if (window.Vue) {
8
+  window['el-drag-dialog'] = drag
9
+  Vue.use(install); // eslint-disable-line
10
+}
11
+
12
+drag.install = install
13
+export default drag

+ 13
- 0
smart-property-manage/src/directive/permission/index.js Wyświetl plik

@@ -0,0 +1,13 @@
1
+import permission from './permission'
2
+
3
+const install = function(Vue) {
4
+  Vue.directive('permission', permission)
5
+}
6
+
7
+if (window.Vue) {
8
+  window['permission'] = permission
9
+  Vue.use(install); // eslint-disable-line
10
+}
11
+
12
+permission.install = install
13
+export default permission

+ 23
- 0
smart-property-manage/src/directive/permission/permission.js Wyświetl plik

@@ -0,0 +1,23 @@
1
+
2
+import store from '@/store'
3
+
4
+export default{
5
+  inserted(el, binding, vnode) {
6
+    const { value } = binding
7
+    const roles = store.getters && store.getters.roles
8
+
9
+    if (value && value instanceof Array && value.length > 0) {
10
+      const permissionRoles = value
11
+
12
+      const hasPermission = roles.some(role => {
13
+        return permissionRoles.includes(role)
14
+      })
15
+
16
+      if (!hasPermission) {
17
+        el.parentNode && el.parentNode.removeChild(el)
18
+      }
19
+    } else {
20
+      throw new Error(`need roles! Like v-permission="['admin','editor']"`)
21
+    }
22
+  }
23
+}

+ 91
- 0
smart-property-manage/src/directive/sticky.js Wyświetl plik

@@ -0,0 +1,91 @@
1
+const vueSticky = {}
2
+let listenAction
3
+vueSticky.install = Vue => {
4
+  Vue.directive('sticky', {
5
+    inserted(el, binding) {
6
+      const params = binding.value || {}
7
+      const stickyTop = params.stickyTop || 0
8
+      const zIndex = params.zIndex || 1000
9
+      const elStyle = el.style
10
+
11
+      elStyle.position = '-webkit-sticky'
12
+      elStyle.position = 'sticky'
13
+      // if the browser support css sticky(Currently Safari, Firefox and Chrome Canary)
14
+      // if (~elStyle.position.indexOf('sticky')) {
15
+      //     elStyle.top = `${stickyTop}px`;
16
+      //     elStyle.zIndex = zIndex;
17
+      //     return
18
+      // }
19
+      const elHeight = el.getBoundingClientRect().height
20
+      const elWidth = el.getBoundingClientRect().width
21
+      elStyle.cssText = `top: ${stickyTop}px; z-index: ${zIndex}`
22
+
23
+      const parentElm = el.parentNode || document.documentElement
24
+      const placeholder = document.createElement('div')
25
+      placeholder.style.display = 'none'
26
+      placeholder.style.width = `${elWidth}px`
27
+      placeholder.style.height = `${elHeight}px`
28
+      parentElm.insertBefore(placeholder, el)
29
+
30
+      let active = false
31
+
32
+      const getScroll = (target, top) => {
33
+        const prop = top ? 'pageYOffset' : 'pageXOffset'
34
+        const method = top ? 'scrollTop' : 'scrollLeft'
35
+        let ret = target[prop]
36
+        if (typeof ret !== 'number') {
37
+          ret = window.document.documentElement[method]
38
+        }
39
+        return ret
40
+      }
41
+
42
+      const sticky = () => {
43
+        if (active) {
44
+          return
45
+        }
46
+        if (!elStyle.height) {
47
+          elStyle.height = `${el.offsetHeight}px`
48
+        }
49
+
50
+        elStyle.position = 'fixed'
51
+        elStyle.width = `${elWidth}px`
52
+        placeholder.style.display = 'inline-block'
53
+        active = true
54
+      }
55
+
56
+      const reset = () => {
57
+        if (!active) {
58
+          return
59
+        }
60
+
61
+        elStyle.position = ''
62
+        placeholder.style.display = 'none'
63
+        active = false
64
+      }
65
+
66
+      const check = () => {
67
+        const scrollTop = getScroll(window, true)
68
+        const offsetTop = el.getBoundingClientRect().top
69
+        if (offsetTop < stickyTop) {
70
+          sticky()
71
+        } else {
72
+          if (scrollTop < elHeight + stickyTop) {
73
+            reset()
74
+          }
75
+        }
76
+      }
77
+      listenAction = () => {
78
+        check()
79
+      }
80
+
81
+      window.addEventListener('scroll', listenAction)
82
+    },
83
+
84
+    unbind() {
85
+      window.removeEventListener('scroll', listenAction)
86
+    }
87
+  })
88
+}
89
+
90
+export default vueSticky
91
+

+ 13
- 0
smart-property-manage/src/directive/waves/index.js Wyświetl plik

@@ -0,0 +1,13 @@
1
+import waves from './waves'
2
+
3
+const install = function(Vue) {
4
+  Vue.directive('waves', waves)
5
+}
6
+
7
+if (window.Vue) {
8
+  window.waves = waves
9
+  Vue.use(install); // eslint-disable-line
10
+}
11
+
12
+waves.install = install
13
+export default waves

+ 26
- 0
smart-property-manage/src/directive/waves/waves.css Wyświetl plik

@@ -0,0 +1,26 @@
1
+.waves-ripple {
2
+    position: absolute;
3
+    border-radius: 100%;
4
+    background-color: rgba(0, 0, 0, 0.15);
5
+    background-clip: padding-box;
6
+    pointer-events: none;
7
+    -webkit-user-select: none;
8
+    -moz-user-select: none;
9
+    -ms-user-select: none;
10
+    user-select: none;
11
+    -webkit-transform: scale(0);
12
+    -ms-transform: scale(0);
13
+    transform: scale(0);
14
+    opacity: 1;
15
+}
16
+
17
+.waves-ripple.z-active {
18
+    opacity: 0;
19
+    -webkit-transform: scale(2);
20
+    -ms-transform: scale(2);
21
+    transform: scale(2);
22
+    -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
23
+    transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
24
+    transition: opacity 1.2s ease-out, transform 0.6s ease-out;
25
+    transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out;
26
+}

+ 42
- 0
smart-property-manage/src/directive/waves/waves.js Wyświetl plik

@@ -0,0 +1,42 @@
1
+import './waves.css'
2
+
3
+export default{
4
+  bind(el, binding) {
5
+    el.addEventListener('click', e => {
6
+      const customOpts = Object.assign({}, binding.value)
7
+      const opts = Object.assign({
8
+        ele: el, // 波纹作用元素
9
+        type: 'hit', // hit 点击位置扩散 center中心点扩展
10
+        color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
11
+      }, customOpts)
12
+      const target = opts.ele
13
+      if (target) {
14
+        target.style.position = 'relative'
15
+        target.style.overflow = 'hidden'
16
+        const rect = target.getBoundingClientRect()
17
+        let ripple = target.querySelector('.waves-ripple')
18
+        if (!ripple) {
19
+          ripple = document.createElement('span')
20
+          ripple.className = 'waves-ripple'
21
+          ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
22
+          target.appendChild(ripple)
23
+        } else {
24
+          ripple.className = 'waves-ripple'
25
+        }
26
+        switch (opts.type) {
27
+          case 'center':
28
+            ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px'
29
+            ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px'
30
+            break
31
+          default:
32
+            ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop || document.body.scrollTop) + 'px'
33
+            ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft || document.body.scrollLeft) + 'px'
34
+        }
35
+        ripple.style.backgroundColor = opts.color
36
+        ripple.className = 'waves-ripple z-active'
37
+        return false
38
+      }
39
+    }, false)
40
+  }
41
+}
42
+

+ 9
- 0
smart-property-manage/src/icons/index.js Wyświetl plik

@@ -0,0 +1,9 @@
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
smart-property-manage/src/icons/svg/banner.svg Wyświetl plik

@@ -0,0 +1 @@
1
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543202545074" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4972" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M895.461997 64.288189 128.54005 64.288189c-35.296901 0-63.908542 28.612665-63.908542 63.908542l0 638.941134c0 35.294854 28.611641 63.910589 63.908542 63.910589l766.91683 0c35.293831 0 63.910589-28.615735 63.910589-63.910589L959.367469 128.197754C959.367469 92.900853 930.750711 64.288189 895.461997 64.288189L895.461997 64.288189zM895.461997 767.137865l-248.417813-262.040065L524.378423 611.632161 340.300988 441.194374 156.237879 611.632161l-27.697829 31.635511 0-515.070942 766.91683 0L895.461997 767.137865 895.461997 767.137865 895.461997 767.137865zM732.900597 388.742768c54.035684 0 97.879238-43.922349 97.879238-98.031711 0-54.151317-43.844577-98.048083-97.879238-98.048083-54.05922 0-97.883331 43.896766-97.883331 98.048083C635.017266 344.825536 678.841378 388.742768 732.900597 388.742768L732.900597 388.742768zM732.900597 388.742768" p-id="4973"></path><path d="M927.628604 959.710788 96.36935 959.710788c-17.454534 0-31.737842-14.280238-31.737842-31.739888l0 0c0-17.455557 14.283308-31.732725 31.737842-31.732725l831.259254 0c17.454534 0 31.738865 14.277168 31.738865 31.732725l0 0C959.367469 945.43055 945.083138 959.710788 927.628604 959.710788L927.628604 959.710788zM927.628604 959.710788" p-id="4974"></path></svg>

+ 1
- 0
smart-property-manage/src/icons/svg/community.svg Wyświetl plik

@@ -0,0 +1 @@
1
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543202441123" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3897" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M874.7 382.5H805L525.8 103.2c-7.6-7.6-19.9-7.6-27.5 0L219 382.5h-69.7c-28.6 0-51.8 23.2-51.8 51.8v440.4c0 28.6 23.2 51.8 51.8 51.8h725.4c28.6 0 51.8-23.2 51.8-51.8V434.3c0-28.6-23.2-51.8-51.8-51.8zM512 144.4l238.1 238.1H274l238-238.1zM260 822.9c-21.5 0-38.9-17.4-38.9-38.9s17.4-38.9 38.9-38.9 38.9 17.4 38.9 38.9-17.4 38.9-38.9 38.9z m0-129.6c-21.5 0-38.9-17.4-38.9-38.9s17.4-38.9 38.9-38.9 38.9 17.4 38.9 38.9-17.4 38.9-38.9 38.9z m0-129.5c-21.5 0-38.9-17.4-38.9-38.9S238.5 486 260 486s38.9 17.4 38.9 38.9-17.4 38.9-38.9 38.9z m542.9 239.6H388.4c-10.7 0-19.4-8.7-19.4-19.4s8.7-19.4 19.4-19.4h414.5c10.7 0 19.4 8.7 19.4 19.4s-8.7 19.4-19.4 19.4z m0-129.5H388.4c-10.7 0-19.4-8.7-19.4-19.4s8.7-19.4 19.4-19.4h414.5c10.7 0 19.4 8.7 19.4 19.4s-8.7 19.4-19.4 19.4z m0-129.5H388.4c-10.7 0-19.4-8.7-19.4-19.4s8.7-19.4 19.4-19.4h414.5c10.7 0 19.4 8.7 19.4 19.4s-8.7 19.4-19.4 19.4z" p-id="3898"></path></svg>

+ 1
- 0
smart-property-manage/src/icons/svg/communitydata.svg Wyświetl plik

@@ -0,0 +1 @@
1
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543202407856" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3299" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M791.5 831H249l0.1-358.3H92.8L518.4 96.6l413.4 376.1H791.4l0.1 358.3zM299 781h442.4l-0.1-358.3h61.1l-284.6-259-293 259H299V781z" fill="#000000" p-id="3300"></path><path d="M519.3 726.9c-4.4 0-8.9-1.2-12.8-3.6-1.6-0.9-38.9-23.4-76.7-56-54.4-46.8-82-90.5-82-129.9 0-64.1 52.1-116.2 116.2-116.2 19.6 0 38.5 4.8 55.4 14 16.9-9.2 35.7-14 55.4-14 64.1 0 116.2 52.1 116.2 116.2 0 39.9-27.6 83.8-82 130.4-37.9 32.4-75.3 54.6-76.8 55.6-4.1 2.3-8.5 3.5-12.9 3.5z m-55.4-255.6c-36.5 0-66.2 29.7-66.2 66.2 0 23.4 22.8 55.9 64.1 91.6 21.9 18.9 44.1 34.4 57.6 43.3 13.4-8.8 35.6-24.1 57.5-42.9 41.3-35.5 64-68.1 64-92 0-36.5-29.7-66.2-66.2-66.2-14.7 0-28.6 4.7-40.2 13.6-9 6.9-21.4 6.9-30.4 0-11.6-8.9-25.5-13.6-40.2-13.6z" fill="#000000" p-id="3301"></path></svg>

+ 1
- 0
smart-property-manage/src/icons/svg/example.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/eye.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/form.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/index.svg Wyświetl plik

@@ -0,0 +1 @@
1
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543202883234" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10581" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M816.4 545.1l0 337.4c0 28.7-23.2 51.9-51.9 51.9L609.2 934.4 609.2 673.9c0-14.3-11.6-25.9-25.9-25.9L427.6 648c-14.3 0-25.9 11.6-25.9 25.9l0 260.4L246.3 934.3c-28.7 0-51.9-23.2-51.9-51.9L194.4 545.1 142 545.1l0 389.1c0 28.7 16.7 51.9 45.4 51.9l221.1 0 0-0.8 45.1 0L453.6 686.9l103 0 0.8 298.3 45.1 0 0 0.8 221.1 0c28.7 0 45.4-23.2 45.4-51.9L869 545.1 816.4 545.1zM505.4 63.8c-6.9 0-13.8 2.5-18.6 7.6L41.7 531.7c-10 10.3-9.7 26.7 0.6 36.7 5 4.9 11.5 7.3 18 7.3 6.8 0 13.6-2.6 18.7-7.9l426.4-441.1 426.4 441.1c5.1 5.3 11.9 7.9 18.6 7.9 6.5 0 13-2.4 18-7.3 10.3-10 10.6-26.4 0.6-36.7L524.1 71.3C519.2 66.3 512.3 63.8 505.4 63.8L505.4 63.8z" p-id="10582"></path></svg>

+ 1
- 0
smart-property-manage/src/icons/svg/link.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/nested.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/operate.svg Wyświetl plik

@@ -0,0 +1 @@
1
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543202499761" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4706" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M362.8 197.04a318.72 318.72 0 0 1 345.52 30.64 96 96 0 1 0 38.4-51.68 384 384 0 0 0-419.92-32.64l1.36 1.2a157.52 157.52 0 0 1 34.64 52.48zM192 480a317.52 317.52 0 0 1 26.96-128h6.08A96 96 0 1 0 160 326.48a384 384 0 0 0 200.88 506.64 160.64 160.64 0 0 1 14.48-64A320 320 0 0 1 192 480z m631.2-74.4a320 320 0 0 1-224.88 382.48 96 96 0 1 0 8.56 64 384 384 0 0 0 276.64-469.44 158.96 158.96 0 0 1-60.32 22.96z" p-id="4707"></path></svg>

+ 1
- 0
smart-property-manage/src/icons/svg/password.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/table.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/tree.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svg/user.svg Wyświetl plik

@@ -0,0 +1 @@
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
smart-property-manage/src/icons/svgo.yml Wyświetl plik

@@ -0,0 +1,22 @@
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'

+ 0
- 0
smart-property-manage/src/main.js Wyświetl plik


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików