tongshanglei 2 yıl önce
işleme
de16a47f0e
100 değiştirilmiş dosya ile 1059 ekleme ve 0 silme
  1. 14 0
      .editorconfig
  2. 6 0
      .env.development
  3. 10 0
      .env.production
  4. 8 0
      .env.staging
  5. 4 0
      .eslintignore
  6. 198 0
      .eslintrc.js
  7. 5 0
      .gitignore
  8. 5 0
      .travis.yml
  9. 21 0
      LICENSE
  10. 159 0
      README.md
  11. 159 0
      README.zh-CN.md
  12. 14 0
      babel.config.js
  13. 35 0
      build/index.js
  14. 24 0
      jest.config.js
  15. 9 0
      jsconfig.json
  16. 132 0
      package.json
  17. 26 0
      plop-templates/component/index.hbs
  18. 55 0
      plop-templates/component/prompt.js
  19. 16 0
      plop-templates/store/index.hbs
  20. 62 0
      plop-templates/store/prompt.js
  21. 2 0
      plop-templates/utils.js
  22. 26 0
      plop-templates/view/index.hbs
  23. 55 0
      plop-templates/view/prompt.js
  24. 9 0
      plopfile.js
  25. 5 0
      postcss.config.js
  26. BIN
      public/favicon.ico
  27. BIN
      public/favicon_old.ico
  28. BIN
      public/icons/building.png
  29. BIN
      public/icons/chazuo.png
  30. BIN
      public/icons/lib_1f.jpg
  31. BIN
      public/icons/lib_2f.jpg
  32. BIN
      public/icons/picture-outline.png
  33. BIN
      public/icons/school_104.png
  34. BIN
      public/icons/school_blue.png
  35. BIN
      public/icons/station_blue.png
  36. BIN
      public/icons/student_104.png
  37. BIN
      public/icons/student_alarm.png
  38. BIN
      public/images/alarm_right.png
  39. BIN
      public/images/comprePipeline_lost_alarm.png
  40. BIN
      public/images/comprePipeline_lost_normal.png
  41. BIN
      public/images/comprePipeline_offline_alarm.png
  42. BIN
      public/images/comprePipeline_offline_normal.png
  43. BIN
      public/images/comprePipeline_online_alarm.png
  44. BIN
      public/images/comprePipeline_online_normal.png
  45. BIN
      public/images/comprePipeline_other_alarm.png
  46. BIN
      public/images/comprePipeline_other_normal.png
  47. BIN
      public/images/drainage_lost_alarm.png
  48. BIN
      public/images/drainage_lost_normal.png
  49. BIN
      public/images/drainage_offline_alarm.png
  50. BIN
      public/images/drainage_offline_normal.png
  51. BIN
      public/images/drainage_online_alarm.png
  52. BIN
      public/images/drainage_online_normal.png
  53. BIN
      public/images/drainage_other_alarm.png
  54. BIN
      public/images/drainage_other_normal.png
  55. BIN
      public/images/firehydrant_lost_alarm.png
  56. BIN
      public/images/firehydrant_lost_normal.png
  57. BIN
      public/images/firehydrant_offline_alarm.png
  58. BIN
      public/images/firehydrant_offline_normal.png
  59. BIN
      public/images/firehydrant_online_alarm.png
  60. BIN
      public/images/firehydrant_online_normal.png
  61. BIN
      public/images/firehydrant_other_alarm.png
  62. BIN
      public/images/firehydrant_other_normal.png
  63. BIN
      public/images/man160x160.png
  64. BIN
      public/images/mark_b.png
  65. BIN
      public/images/networkMonitor_lost_alarm.png
  66. BIN
      public/images/networkMonitor_lost_normal.png
  67. BIN
      public/images/networkMonitor_offline_alarm.png
  68. BIN
      public/images/networkMonitor_offline_normal.png
  69. BIN
      public/images/networkMonitor_online_alarm.png
  70. BIN
      public/images/networkMonitor_online_normal.png
  71. BIN
      public/images/networkMonitor_other_alarm.png
  72. BIN
      public/images/networkMonitor_other_normal.png
  73. BIN
      public/images/otherWell_lost_alarm.png
  74. BIN
      public/images/otherWell_lost_normal.png
  75. BIN
      public/images/otherWell_offline_alarm.png
  76. BIN
      public/images/otherWell_offline_normal.png
  77. BIN
      public/images/otherWell_online_alarm.png
  78. BIN
      public/images/otherWell_online_normal.png
  79. BIN
      public/images/otherWell_other_alarm.png
  80. BIN
      public/images/otherWell_other_normal.png
  81. BIN
      public/images/rain_lost_alarm.png
  82. BIN
      public/images/rain_lost_normal.png
  83. BIN
      public/images/rain_offline_alarm.png
  84. BIN
      public/images/rain_offline_normal.png
  85. BIN
      public/images/rain_online_alarm.png
  86. BIN
      public/images/rain_online_normal.png
  87. BIN
      public/images/rain_other_alarm.png
  88. BIN
      public/images/rain_other_normal.png
  89. BIN
      public/images/sewage_lost_alarm.png
  90. BIN
      public/images/sewage_lost_normal.png
  91. BIN
      public/images/sewage_offline_alarm.png
  92. BIN
      public/images/sewage_offline_normal.png
  93. BIN
      public/images/sewage_online_alarm.png
  94. BIN
      public/images/sewage_online_normal.png
  95. BIN
      public/images/sewage_other_alarm.png
  96. BIN
      public/images/sewage_other_normal.png
  97. BIN
      public/images/supply_lost_alarm.png
  98. BIN
      public/images/supply_lost_normal.png
  99. BIN
      public/images/supply_offline_alarm.png
  100. 0 0
      public/images/supply_offline_normal.png

+ 14 - 0
.editorconfig

@@ -0,0 +1,14 @@
+# https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false

+ 6 - 0
.env.development

@@ -0,0 +1,6 @@
+# just a flag
+ENV = 'development'
+
+# base api
+VUE_APP_BASE_API = 'http://127.0.0.1:8000'
+#VUE_APP_BASE_API = 'http://116.62.220.88:8109'

+ 10 - 0
.env.production

@@ -0,0 +1,10 @@
+# just a flag
+ENV = 'production'
+
+# base api
+
+#开发环境
+#VUE_APP_BASE_API = 'http://116.62.220.88:8109'
+
+#派狗smart  
+VUE_APP_BASE_API = 'http://47.114.185.186:8109'

+ 8 - 0
.env.staging

@@ -0,0 +1,8 @@
+NODE_ENV = production
+
+# just a flag
+ENV = 'staging'
+
+# base api
+VUE_APP_BASE_API = '/stage-api'
+

+ 4 - 0
.eslintignore

@@ -0,0 +1,4 @@
+build/*.js
+src/assets
+public
+dist

+ 198 - 0
.eslintrc.js

@@ -0,0 +1,198 @@
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint',
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  rules: {
+    "vue/max-attributes-per-line": [2, {
+      "singleline": 10,
+      "multiline": {
+        "max": 1,
+        "allowFirstLine": false
+      }
+    }],
+    "vue/singleline-html-element-content-newline": "off",
+    "vue/multiline-html-element-content-newline":"off",
+    "vue/name-property-casing": ["error", "PascalCase"],
+    "vue/no-v-html": "off",
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': ["error", "always", {"null": "ignore"}],
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'handle-callback-err': [2, '^(err|error)$'],
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    'new-parens': 2,
+    'no-array-constructor': 2,
+    'no-caller': 2,
+    'no-console': 'off',
+    'no-class-assign': 2,
+    'no-cond-assign': 2,
+    'no-const-assign': 2,
+    'no-control-regex': 0,
+    'no-delete-var': 2,
+    'no-dupe-args': 2,
+    'no-dupe-class-members': 2,
+    'no-dupe-keys': 2,
+    'no-duplicate-case': 2,
+    'no-empty-character-class': 2,
+    'no-empty-pattern': 2,
+    'no-eval': 2,
+    'no-ex-assign': 2,
+    'no-extend-native': 2,
+    'no-extra-bind': 2,
+    'no-extra-boolean-cast': 2,
+    'no-extra-parens': [2, 'functions'],
+    'no-fallthrough': 2,
+    'no-floating-decimal': 2,
+    'no-func-assign': 2,
+    'no-implied-eval': 2,
+    'no-inner-declarations': [2, 'functions'],
+    'no-invalid-regexp': 2,
+    'no-irregular-whitespace': 2,
+    'no-iterator': 2,
+    'no-label-var': 2,
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    'no-lone-blocks': 2,
+    'no-mixed-spaces-and-tabs': 2,
+    'no-multi-spaces': 2,
+    'no-multi-str': 2,
+    'no-multiple-empty-lines': [2, {
+      'max': 1
+    }],
+    'no-native-reassign': 2,
+    'no-negated-in-lhs': 2,
+    'no-new-object': 2,
+    'no-new-require': 2,
+    'no-new-symbol': 2,
+    'no-new-wrappers': 2,
+    'no-obj-calls': 2,
+    'no-octal': 2,
+    'no-octal-escape': 2,
+    'no-path-concat': 2,
+    'no-proto': 2,
+    'no-redeclare': 2,
+    'no-regex-spaces': 2,
+    'no-return-assign': [2, 'except-parens'],
+    'no-self-assign': 2,
+    'no-self-compare': 2,
+    'no-sequences': 2,
+    'no-shadow-restricted-names': 2,
+    'no-spaced-func': 2,
+    'no-sparse-arrays': 2,
+    'no-this-before-super': 2,
+    'no-throw-literal': 2,
+    'no-trailing-spaces': 2,
+    'no-undef': 2,
+    'no-undef-init': 2,
+    'no-unexpected-multiline': 2,
+    'no-unmodified-loop-condition': 2,
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    'no-unreachable': 2,
+    'no-unsafe-finally': 2,
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    'no-useless-call': 2,
+    'no-useless-computed-key': 2,
+    'no-useless-constructor': 2,
+    'no-useless-escape': 0,
+    'no-whitespace-before-property': 2,
+    'no-with': 2,
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    'padded-blocks': [2, 'never'],
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    'semi': [2, 'never'],
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'space-before-blocks': [2, 'always'],
+    'space-before-function-paren': [2, 'never'],
+    'space-in-parens': [2, 'never'],
+    'space-infix-ops': 2,
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    'template-curly-spacing': [2, 'never'],
+    'use-isnan': 2,
+    'valid-typeof': 2,
+    'wrap-iife': [2, 'any'],
+    'yield-star-spacing': [2, 'both'],
+    'yoda': [2, 'never'],
+    'prefer-const': 2,
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never']
+  }
+}

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+node_modules
+dist/
+yarn-error.log
+yarn.lock
+package-lock.json

+ 5 - 0
.travis.yml

@@ -0,0 +1,5 @@
+language: node_js
+node_js: 10
+script: npm run test
+notifications:
+  email: false

+ 21 - 0
LICENSE

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

+ 159 - 0
README.md

@@ -0,0 +1,159 @@
+<p align="center">
+    <img src="https://cdn.learnku.com/uploads/images/202005/17/18206/zSuf7Ce5kM.png!large">
+</p>
+
+
+<p align="center"><code>CatchAdmin</code>是一款基于<a href="http://www.thinkphp.cn/" target="_blank">thinkphp framework</a>和
+<a href="https://github.com/PanJiaChen/vue-element-admin/">element admin</a>二次开发而成后台管理系统。因为 thinkphp 的简单高效,文档齐全。在看了很多 thinkphp 生态中的后台管理系统,发现没有一款合适的前后端分离系统。遂开发了 CatchAdmin。
+完全利用了 thinkphp6 的新版本特性 ServiceProvider,将管理系统模块之间的耦合降到了最低限度。每个模块之间都有独立的 `controller,路由,模型,数据表`。在开发上尽可能将模块之间的影响降到最低,降低了开发上的难度。基于 CatchAdmin 可以开发 cms,CRM,OA 等
+等系统。也封装了很多实用的工具,提升开发体验。
+</p>
+
+<p align="center">
+<a href="http://doc.catchadmin.com/">文档</a> |
+<a href="http://vue.catchadmin.com">演示地址</a> |
+<a href="http://apidoc.catchadmin.com">接口文档</a> |
+<a href="https://gitee.com/jaguarjack/catchAdmin">项目源码</a> |
+<a href="https://www.kancloud.cn/akasishikelu/thinkphp6">看云分析</a> 
+<a href="#extensions">扩展</a>
+</p>
+
+<p align="center">
+    <a href="https://gitee.com/jaguarjack/catchAdmin" target="_blank">
+        <img src="https://svg.hamm.cn/gitee.svg?type=star&user=jaguarjack&project=catchAdmin"/>
+    </a >
+    <a href="https://gitee.com/jaguarjack/catchAdmin" target="_blank">
+        <img src="https://svg.hamm.cn/gitee.svg?type=fork&user=jaguarjack&project=catchAdmin"/>
+    </a >
+    <img src="https://svg.hamm.cn/badge.svg?key=Base&value=ThinkPHP6"/>
+    <img src="https://svg.hamm.cn/badge.svg?key=Data&value=MySQL5.5"/>
+    <img src="https://svg.hamm.cn/badge.svg?key=Runtime&value=PHP7.1"/>
+    <img src="https://svg.hamm.cn/badge.svg?key=License&value=Apache-2.0"/>
+</p >
+
+## 功能
+- [x] 用户管理 后台用户管理
+- [x] 部门管理 配置公司的部门结构,支持树形结构
+- [x] 岗位管理 配置后台用户的职务
+- [x] 菜单管理 配置系统菜单,按钮等等
+- [x] 角色管理 配置用户担当的角色,分配权限
+- [x] 数据字典 管理后台表结构
+- [x] 操作日志 后台用户操作记录
+- [x] 登录日志 后台系统用户的登录记录
+- [x] 代码生成 生成 API 端的 CURD 操作
+- [x] 敏感词  支持敏感词配置
+- [x] 附件管理 可管理上传的文件
+- [ ] 微信管理
+
+## 项目地址
+- [github 地址](https://github.com/yanwenwu/catch-admin)
+- [gitee 地址](https://gitee.com/jaguarjack/catchAdmin)
+- [前端 Vue 项目地址](https://github.com/yanwenwu/catch-admin-vue)
+- [文档地址](https://github.com/catch-admin/document)[个人精力实在有限,希望可以小伙伴们可以一起维护文档]
+## 预览
+<table>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucNXq.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucm6I.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucZpd.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuce1A.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucnXt.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucKnP.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuc3tg.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucM0f.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucQ78.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuc1AS.md.png"></td>
+    </tr>
+     <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuc8hQ.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucY1s.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucJpj.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuctcn.md.png"></td>
+    </tr>
+</table>
+
+## 环境要求
+- php7.1+ (需以下扩展)
+    - [x] mbstring
+    - [x] json
+    - [x] openssl
+    - [x] xml
+    - [x] pdo
+- nginx
+- mysql
+
+### 如何安装
+> 安装之前请确保已安装 Composer
+
+#### 下载项目
+- 通过 Git 下载(推荐)
+```shell
+git clone https://gitee.com/jaguarjack/catchAdmin && cd catchAdmin
+
+curl -sS https://install.phpcomposer.com/installer | php
+
+composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
+
+composer install
+
+```
+- composer 安装
+```shell
+composer create-project jaguarjack/catchadmin:dev-master
+```
+
+#### 安装
+下载完成之后通过命令来进行安装, 一键安装 🚀
+```shell
+ php think catch:install 
+```
+
+## 体验地址
+
+[体验地址](http://vue.catchadmin.com)
+- 账号: admin@gmail.com
+- 密码: admin
+
+[catchadmin 文档地址](http://doc.catchadmin.com)
+
+### 系列文章
+如果是刚开始使用 thinkphp6, 以下文章可能会对你有些许帮助,文章基于 RC3 版本。整体架构是不变的。
+- [Tp6 启动分析](https://www.kancloud.cn/akasishikelu/thinkphp6/1129385)
+- [Tp6 Request 解析](https://www.kancloud.cn/akasishikelu/thinkphp6/1134496)
+- [TP6 应用初始化](https://www.kancloud.cn/akasishikelu/thinkphp6/1130427)
+- [Tp6 中间件分析](https://www.kancloud.cn/akasishikelu/thinkphp6/1136616)
+- [Tp6 请求流程](https://www.kancloud.cn/akasishikelu/thinkphp6/1136608)
+
+### Donate
+如果你觉得项目对你有帮助,可以请作者喝杯咖啡☕️!鼓励下
+<img src="https://cdn.learnku.com/uploads/images/202008/11/18206/e6qAAM8Bod.jpg!large">
+
+### Talking
+- [论坛讨论](http://bbs.catchadmin.com)
+- 可以提 `ISSUE`,请按照 `issue` 模板提问
+- 加入 Q 群 `302266230` 讨论以及反馈一些问题。
+    - 加群需要付费,所以请使用能支持群费的客户端。(不喜勿喷,过滤一部分不看文档和 TP 框架文档并且衣来伸手饭来张口的用户)
+    - 不建议你付费入群,认真阅读文档可以解决所有问题
+    - 更愿意以 `ISSUE` 的方式提问
+    - 付费入群,群里的各位也是没有义务回答各种各样的基础问题。请 GOOGLE。
+
+### Thanks
+> 排名部分先后
+
+- [top-think/think](https://github.com/top-think/think)
+- [element-admin](https://panjiachen.gitee.io/vue-element-admin-site/zh/)
+- [thans/tp-jwt-auth](https://packagist.org/packages/thans/tp-jwt-auth)
+- [jaguarjack/think-filesystem-cloud](https://github.com/yanwenwu/think-filesystem-cloud)
+- [overtrue/wechat](https://github.com/overtrue/wechat)
+- [jaguarjack/migration-generator](https://github.com/yanwenwu/migration-generator)
+- [phpoffice/phpspreadsheet](https://github.com/PHPOffice/PhpSpreadsheet)

+ 159 - 0
README.zh-CN.md

@@ -0,0 +1,159 @@
+<p align="center">
+    <img src="https://cdn.learnku.com/uploads/images/202005/17/18206/zSuf7Ce5kM.png!large">
+</p>
+
+
+<p align="center"><code>CatchAdmin</code>是一款基于<a href="http://www.thinkphp.cn/" target="_blank">thinkphp framework</a>和
+<a href="https://github.com/PanJiaChen/vue-element-admin/">element admin</a>二次开发而成后台管理系统。因为 thinkphp 的简单高效,文档齐全。在看了很多 thinkphp 生态中的后台管理系统,发现没有一款合适的前后端分离系统。遂开发了 CatchAdmin。
+完全利用了 thinkphp6 的新版本特性 ServiceProvider,将管理系统模块之间的耦合降到了最低限度。每个模块之间都有独立的 `controller,路由,模型,数据表`。在开发上尽可能将模块之间的影响降到最低,降低了开发上的难度。基于 CatchAdmin 可以开发 cms,CRM,OA 等
+等系统。也封装了很多实用的工具,提升开发体验。
+</p>
+
+<p align="center">
+<a href="http://doc.catchadmin.com/">文档</a> |
+<a href="http://vue.catchadmin.com">演示地址</a> |
+<a href="http://apidoc.catchadmin.com">接口文档</a> |
+<a href="https://gitee.com/jaguarjack/catchAdmin">项目源码</a> |
+<a href="https://www.kancloud.cn/akasishikelu/thinkphp6">看云分析</a> 
+<a href="#extensions">扩展</a>
+</p>
+
+<p align="center">
+    <a href="https://gitee.com/jaguarjack/catchAdmin" target="_blank">
+        <img src="https://svg.hamm.cn/gitee.svg?type=star&user=jaguarjack&project=catchAdmin"/>
+    </a >
+    <a href="https://gitee.com/jaguarjack/catchAdmin" target="_blank">
+        <img src="https://svg.hamm.cn/gitee.svg?type=fork&user=jaguarjack&project=catchAdmin"/>
+    </a >
+    <img src="https://svg.hamm.cn/badge.svg?key=Base&value=ThinkPHP6"/>
+    <img src="https://svg.hamm.cn/badge.svg?key=Data&value=MySQL5.5"/>
+    <img src="https://svg.hamm.cn/badge.svg?key=Runtime&value=PHP7.1"/>
+    <img src="https://svg.hamm.cn/badge.svg?key=License&value=Apache-2.0"/>
+</p >
+
+## 功能
+- [x] 用户管理 后台用户管理
+- [x] 部门管理 配置公司的部门结构,支持树形结构
+- [x] 岗位管理 配置后台用户的职务
+- [x] 菜单管理 配置系统菜单,按钮等等
+- [x] 角色管理 配置用户担当的角色,分配权限
+- [x] 数据字典 管理后台表结构
+- [x] 操作日志 后台用户操作记录
+- [x] 登录日志 后台系统用户的登录记录
+- [x] 代码生成 生成 API 端的 CURD 操作
+- [x] 敏感词  支持敏感词配置
+- [x] 附件管理 可管理上传的文件
+- [ ] 微信管理
+
+## 项目地址
+- [github 地址](https://github.com/yanwenwu/catch-admin)
+- [gitee 地址](https://gitee.com/jaguarjack/catchAdmin)
+- [前端 Vue 项目地址](https://github.com/yanwenwu/catch-admin-vue)
+- [文档地址](https://github.com/catch-admin/document)[个人精力实在有限,希望可以小伙伴们可以一起维护文档]
+## 预览
+<table>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucNXq.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucm6I.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucZpd.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuce1A.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucnXt.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucKnP.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuc3tg.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucM0f.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucQ78.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuc1AS.md.png"></td>
+    </tr>
+     <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuc8hQ.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucY1s.md.png"></td>
+    </tr>
+    <tr>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wucJpj.md.png"></td>
+        <td><img src="https://s1.ax1x.com/2020/09/07/wuctcn.md.png"></td>
+    </tr>
+</table>
+
+## 环境要求
+- php7.1+ (需以下扩展)
+    - [x] mbstring
+    - [x] json
+    - [x] openssl
+    - [x] xml
+    - [x] pdo
+- nginx
+- mysql
+
+### 如何安装
+> 安装之前请确保已安装 Composer
+
+#### 下载项目
+- 通过 Git 下载(推荐)
+```shell
+git clone https://gitee.com/jaguarjack/catchAdmin && cd catchAdmin
+
+curl -sS https://install.phpcomposer.com/installer | php
+
+composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
+
+composer install
+
+```
+- composer 安装
+```shell
+composer create-project jaguarjack/catchadmin:dev-master
+```
+
+#### 安装
+下载完成之后通过命令来进行安装, 一键安装 🚀
+```shell
+ php think catch:install 
+```
+
+## 体验地址
+
+[体验地址](http://vue.catchadmin.com)
+- 账号: admin@gmail.com
+- 密码: admin
+
+[catchadmin 文档地址](http://doc.catchadmin.com)
+
+### 系列文章
+如果是刚开始使用 thinkphp6, 以下文章可能会对你有些许帮助,文章基于 RC3 版本。整体架构是不变的。
+- [Tp6 启动分析](https://www.kancloud.cn/akasishikelu/thinkphp6/1129385)
+- [Tp6 Request 解析](https://www.kancloud.cn/akasishikelu/thinkphp6/1134496)
+- [TP6 应用初始化](https://www.kancloud.cn/akasishikelu/thinkphp6/1130427)
+- [Tp6 中间件分析](https://www.kancloud.cn/akasishikelu/thinkphp6/1136616)
+- [Tp6 请求流程](https://www.kancloud.cn/akasishikelu/thinkphp6/1136608)
+
+### Donate
+如果你觉得项目对你有帮助,可以请作者喝杯咖啡☕️!鼓励下
+<img src="https://cdn.learnku.com/uploads/images/202008/11/18206/e6qAAM8Bod.jpg!large">
+
+### Talking
+- [论坛讨论](http://bbs.catchadmin.com)
+- 可以提 `ISSUE`,请按照 `issue` 模板提问
+- 加入 Q 群 `302266230` 讨论以及反馈一些问题。
+    - 加群需要付费,所以请使用能支持群费的客户端。(不喜勿喷,过滤一部分不看文档和 TP 框架文档并且衣来伸手饭来张口的用户)
+    - 不建议你付费入群,认真阅读文档可以解决所有问题
+    - 更愿意以 `ISSUE` 的方式提问
+    - 付费入群,群里的各位也是没有义务回答各种各样的基础问题。请 GOOGLE。
+
+### Thanks
+> 排名部分先后
+
+- [top-think/think](https://github.com/top-think/think)
+- [element-admin](https://panjiachen.gitee.io/vue-element-admin-site/zh/)
+- [thans/tp-jwt-auth](https://packagist.org/packages/thans/tp-jwt-auth)
+- [jaguarjack/think-filesystem-cloud](https://github.com/yanwenwu/think-filesystem-cloud)
+- [overtrue/wechat](https://github.com/overtrue/wechat)
+- [jaguarjack/migration-generator](https://github.com/yanwenwu/migration-generator)
+- [phpoffice/phpspreadsheet](https://github.com/PHPOffice/PhpSpreadsheet)

+ 14 - 0
babel.config.js

@@ -0,0 +1,14 @@
+module.exports = {
+  presets: [
+    // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
+    '@vue/cli-plugin-babel/preset'
+  ],
+  'env': {
+    'development': {
+      // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
+      // This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
+      // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html
+      'plugins': ['dynamic-import-node']
+    }
+  }
+}

+ 35 - 0
build/index.js

@@ -0,0 +1,35 @@
+const { run } = require('runjs')
+const chalk = require('chalk')
+const config = require('../vue.config.js')
+const rawArgv = process.argv.slice(2)
+const args = rawArgv.join(' ')
+
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
+  const report = rawArgv.includes('--report')
+
+  run(`vue-cli-service build ${args}`)
+
+  const port = 9526
+  const publicPath = config.publicPath
+
+  var connect = require('connect')
+  var serveStatic = require('serve-static')
+  const app = connect()
+
+  app.use(
+    publicPath,
+    serveStatic('./dist', {
+      index: ['index.html', '/']
+    })
+  )
+
+  app.listen(port, function () {
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
+    if (report) {
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
+    }
+
+  })
+} else {
+  run(`vue-cli-service build ${args}`)
+}

+ 24 - 0
jest.config.js

@@ -0,0 +1,24 @@
+module.exports = {
+  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
+  transform: {
+    '^.+\\.vue$': 'vue-jest',
+    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
+      'jest-transform-stub',
+    '^.+\\.jsx?$': 'babel-jest'
+  },
+  moduleNameMapper: {
+    '^@/(.*)$': '<rootDir>/src/$1'
+  },
+  snapshotSerializers: ['jest-serializer-vue'],
+  testMatch: [
+    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
+  ],
+  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
+  coverageDirectory: '<rootDir>/tests/unit/coverage',
+  // 'collectCoverage': true,
+  'coverageReporters': [
+    'lcov',
+    'text-summary'
+  ],
+  testURL: 'http://localhost/'
+}

+ 9 - 0
jsconfig.json

@@ -0,0 +1,9 @@
+{ 
+  "compilerOptions": {
+    "baseUrl": "./",
+    "paths": {
+        "@/*": ["src/*"]
+    }
+  },
+  "exclude": ["node_modules", "dist"]
+}

+ 132 - 0
package.json

@@ -0,0 +1,132 @@
+{
+  "name": "vue-element-admin",
+  "version": "4.4.0",
+  "description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
+  "author": "Pan <panfree23@gmail.com>",
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "lint": "eslint --ext .js,.vue src",
+    "build:prod": "vue-cli-service build",
+    "build:stage": "vue-cli-service build --mode staging",
+    "preview": "node build/index.js --preview",
+    "new": "plop",
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
+    "test:ci": "npm run lint && npm run test:unit"
+  },
+  "dependencies": {
+    "axios": "0.18.1",
+    "clipboard": "2.0.4",
+    "codemirror": "5.45.0",
+    "core-js": "3.6.5",
+    "driver.js": "0.9.5",
+    "dropzone": "5.5.1",
+    "echarts": "4.9.0",
+    "el-table-infinite-scroll": "^1.0.10",
+    "element-china-area-data": "^5.0.2",
+    "element-ui": "2.13.2",
+    "f-render": "^4.12.0",
+    "file-saver": "2.0.1",
+    "fuse.js": "3.4.4",
+    "jquery": "^3.5.1",
+    "js-cookie": "2.2.0",
+    "jsonlint": "1.6.3",
+    "jszip": "3.2.1",
+    "leaflet": "^1.7.1",
+    "manhole-theme-chalk": "^1.0.1",
+    "normalize.css": "7.0.0",
+    "nprogress": "0.2.0",
+    "or": "^0.2.0",
+    "path-to-regexp": "2.4.0",
+    "screenfull": "4.2.0",
+    "script-loader": "0.7.2",
+    "socket.io-client": "^3.1.0",
+    "sortablejs": "1.8.4",
+    "tui-editor": "1.3.3",
+    "vue": "2.6.10",
+    "vue-amap": "^0.5.10",
+    "vue-count-to": "1.0.13",
+    "vue-ele-form": "^0.8.52",
+    "vue-ele-form-bmap": "^0.1.0",
+    "vue-ele-form-dynamic": "^0.4.3",
+    "vue-ele-form-gallery": "^0.1.1",
+    "vue-ele-form-image-uploader": "^0.1.9",
+    "vue-ele-form-upload-file": "^0.0.7",
+    "vue-highlightjs": "^1.3.3",
+    "vue-router": "3.0.2",
+    "vue-seamless-scroll": "^1.1.23",
+    "vue-socket.io": "^3.0.10",
+    "vue-splitpane": "1.0.4",
+    "vuedraggable": "2.20.0",
+    "vuex": "3.1.0",
+    "wangeditor": "^4.7.5",
+    "xlsx": "0.14.1"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "4.4.4",
+    "@vue/cli-plugin-eslint": "4.4.4",
+    "@vue/cli-plugin-unit-jest": "4.4.4",
+    "@vue/cli-service": "4.4.4",
+    "@vue/test-utils": "1.0.0-beta.29",
+    "autoprefixer": "9.5.1",
+    "babel-eslint": "10.1.0",
+    "babel-jest": "^26.3.0",
+    "babel-plugin-dynamic-import-node": "2.3.3",
+    "chalk": "2.4.2",
+    "chokidar": "2.1.5",
+    "connect": "3.6.6",
+    "eslint": "6.7.2",
+    "eslint-plugin-vue": "6.2.2",
+    "highlight.js": "^10.2.0",
+    "html-webpack-plugin": "3.2.0",
+    "husky": "1.3.1",
+    "lint-staged": "8.1.5",
+    "lodash": "^4.17.20",
+    "mockjs": "1.0.1-beta3",
+    "plop": "2.3.0",
+    "runjs": "4.3.2",
+    "sass": "1.26.2",
+    "sass-loader": "8.0.2",
+    "script-ext-html-webpack-plugin": "2.1.3",
+    "serve-static": "1.13.2",
+    "svg-sprite-loader": "4.1.3",
+    "svgo": "1.2.0",
+    "vue-highlight.js": "^3.1.0",
+    "vue-seamless-scroll": "1.1.23",
+    "vue-template-compiler": "2.6.10"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ],
+  "bugs": {
+    "url": "https://github.com/PanJiaChen/vue-element-admin/issues"
+  },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "keywords": [
+    "vue",
+    "admin",
+    "dashboard",
+    "element-ui",
+    "boilerplate",
+    "admin-template",
+    "management-system"
+  ],
+  "license": "MIT",
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "husky": {
+    "hooks": {}
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
+  }
+}

+ 26 - 0
plop-templates/component/index.hbs

@@ -0,0 +1,26 @@
+{{#if template}}
+<template>
+  <div />
+</template>
+{{/if}}
+
+{{#if script}}
+<script>
+export default {
+  name: '{{ properCase name }}',
+  props: {},
+  data() {
+    return {}
+  },
+  created() {},
+  mounted() {},
+  methods: {}
+}
+</script>
+{{/if}}
+
+{{#if style}}
+<style lang="scss" scoped>
+
+</style>
+{{/if}}

+ 55 - 0
plop-templates/component/prompt.js

@@ -0,0 +1,55 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate vue component',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'component name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: '<template>',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '<script>',
+      value: 'script',
+      checked: true
+    },
+    {
+      name: 'style',
+      value: 'style',
+      checked: true
+    }
+    ],
+    validate(value) {
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
+        return 'Components require at least a <script> or <template> tag.'
+      }
+      return true
+    }
+  }
+  ],
+  actions: data => {
+    const name = '{{properCase name}}'
+    const actions = [{
+      type: 'add',
+      path: `src/components/${name}/index.vue`,
+      templateFile: 'plop-templates/component/index.hbs',
+      data: {
+        name: name,
+        template: data.blocks.includes('template'),
+        script: data.blocks.includes('script'),
+        style: data.blocks.includes('style')
+      }
+    }]
+
+    return actions
+  }
+}

+ 16 - 0
plop-templates/store/index.hbs

@@ -0,0 +1,16 @@
+{{#if state}}
+const state = {}
+{{/if}}
+
+{{#if mutations}}
+const mutations = {}
+{{/if}}
+
+{{#if actions}}
+const actions = {}
+{{/if}}
+
+export default {
+  namespaced: true,
+  {{options}}
+}

+ 62 - 0
plop-templates/store/prompt.js

@@ -0,0 +1,62 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate store',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'store name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: 'state',
+      value: 'state',
+      checked: true
+    },
+    {
+      name: 'mutations',
+      value: 'mutations',
+      checked: true
+    },
+    {
+      name: 'actions',
+      value: 'actions',
+      checked: true
+    }
+    ],
+    validate(value) {
+      if (!value.includes('state') || !value.includes('mutations')) {
+        return 'store require at least state and mutations'
+      }
+      return true
+    }
+  }
+  ],
+  actions(data) {
+    const name = '{{name}}'
+    const { blocks } = data
+    const options = ['state', 'mutations']
+    const joinFlag = `,
+  `
+    if (blocks.length === 3) {
+      options.push('actions')
+    }
+
+    const actions = [{
+      type: 'add',
+      path: `src/store/modules/${name}.js`,
+      templateFile: 'plop-templates/store/index.hbs',
+      data: {
+        options: options.join(joinFlag),
+        state: blocks.includes('state'),
+        mutations: blocks.includes('mutations'),
+        actions: blocks.includes('actions')
+      }
+    }]
+    return actions
+  }
+}

+ 2 - 0
plop-templates/utils.js

@@ -0,0 +1,2 @@
+exports.notEmpty = name => v =>
+  !v || v.trim() === '' ? `${name} is required` : true

+ 26 - 0
plop-templates/view/index.hbs

@@ -0,0 +1,26 @@
+{{#if template}}
+<template>
+  <div />
+</template>
+{{/if}}
+
+{{#if script}}
+<script>
+export default {
+  name: '{{ properCase name }}',
+  props: {},
+  data() {
+    return {}
+  },
+  created() {},
+  mounted() {},
+  methods: {}
+}
+</script>
+{{/if}}
+
+{{#if style}}
+<style lang="scss" scoped>
+
+</style>
+{{/if}}

+ 55 - 0
plop-templates/view/prompt.js

@@ -0,0 +1,55 @@
+const { notEmpty } = require('../utils.js')
+
+module.exports = {
+  description: 'generate a view',
+  prompts: [{
+    type: 'input',
+    name: 'name',
+    message: 'view name please',
+    validate: notEmpty('name')
+  },
+  {
+    type: 'checkbox',
+    name: 'blocks',
+    message: 'Blocks:',
+    choices: [{
+      name: '<template>',
+      value: 'template',
+      checked: true
+    },
+    {
+      name: '<script>',
+      value: 'script',
+      checked: true
+    },
+    {
+      name: 'style',
+      value: 'style',
+      checked: true
+    }
+    ],
+    validate(value) {
+      if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
+        return 'View require at least a <script> or <template> tag.'
+      }
+      return true
+    }
+  }
+  ],
+  actions: data => {
+    const name = '{{name}}'
+    const actions = [{
+      type: 'add',
+      path: `src/views/${name}/index.vue`,
+      templateFile: 'plop-templates/view/index.hbs',
+      data: {
+        name: name,
+        template: data.blocks.includes('template'),
+        script: data.blocks.includes('script'),
+        style: data.blocks.includes('style')
+      }
+    }]
+
+    return actions
+  }
+}

+ 9 - 0
plopfile.js

@@ -0,0 +1,9 @@
+const viewGenerator = require('./plop-templates/view/prompt')
+const componentGenerator = require('./plop-templates/component/prompt')
+const storeGenerator = require('./plop-templates/store/prompt.js')
+
+module.exports = function(plop) {
+  plop.setGenerator('view', viewGenerator)
+  plop.setGenerator('component', componentGenerator)
+  plop.setGenerator('store', storeGenerator)
+}

+ 5 - 0
postcss.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  plugins: {
+    autoprefixer: {}
+  }
+}

BIN
public/favicon.ico


BIN
public/favicon_old.ico


BIN
public/icons/building.png


BIN
public/icons/chazuo.png


BIN
public/icons/lib_1f.jpg


BIN
public/icons/lib_2f.jpg


BIN
public/icons/picture-outline.png


BIN
public/icons/school_104.png


BIN
public/icons/school_blue.png


BIN
public/icons/station_blue.png


BIN
public/icons/student_104.png


BIN
public/icons/student_alarm.png


BIN
public/images/alarm_right.png


BIN
public/images/comprePipeline_lost_alarm.png


BIN
public/images/comprePipeline_lost_normal.png


BIN
public/images/comprePipeline_offline_alarm.png


BIN
public/images/comprePipeline_offline_normal.png


BIN
public/images/comprePipeline_online_alarm.png


BIN
public/images/comprePipeline_online_normal.png


BIN
public/images/comprePipeline_other_alarm.png


BIN
public/images/comprePipeline_other_normal.png


BIN
public/images/drainage_lost_alarm.png


BIN
public/images/drainage_lost_normal.png


BIN
public/images/drainage_offline_alarm.png


BIN
public/images/drainage_offline_normal.png


BIN
public/images/drainage_online_alarm.png


BIN
public/images/drainage_online_normal.png


BIN
public/images/drainage_other_alarm.png


BIN
public/images/drainage_other_normal.png


BIN
public/images/firehydrant_lost_alarm.png


BIN
public/images/firehydrant_lost_normal.png


BIN
public/images/firehydrant_offline_alarm.png


BIN
public/images/firehydrant_offline_normal.png


BIN
public/images/firehydrant_online_alarm.png


BIN
public/images/firehydrant_online_normal.png


BIN
public/images/firehydrant_other_alarm.png


BIN
public/images/firehydrant_other_normal.png


BIN
public/images/man160x160.png


BIN
public/images/mark_b.png


BIN
public/images/networkMonitor_lost_alarm.png


BIN
public/images/networkMonitor_lost_normal.png


BIN
public/images/networkMonitor_offline_alarm.png


BIN
public/images/networkMonitor_offline_normal.png


BIN
public/images/networkMonitor_online_alarm.png


BIN
public/images/networkMonitor_online_normal.png


BIN
public/images/networkMonitor_other_alarm.png


BIN
public/images/networkMonitor_other_normal.png


BIN
public/images/otherWell_lost_alarm.png


BIN
public/images/otherWell_lost_normal.png


BIN
public/images/otherWell_offline_alarm.png


BIN
public/images/otherWell_offline_normal.png


BIN
public/images/otherWell_online_alarm.png


BIN
public/images/otherWell_online_normal.png


BIN
public/images/otherWell_other_alarm.png


BIN
public/images/otherWell_other_normal.png


BIN
public/images/rain_lost_alarm.png


BIN
public/images/rain_lost_normal.png


BIN
public/images/rain_offline_alarm.png


BIN
public/images/rain_offline_normal.png


BIN
public/images/rain_online_alarm.png


BIN
public/images/rain_online_normal.png


BIN
public/images/rain_other_alarm.png


BIN
public/images/rain_other_normal.png


BIN
public/images/sewage_lost_alarm.png


BIN
public/images/sewage_lost_normal.png


BIN
public/images/sewage_offline_alarm.png


BIN
public/images/sewage_offline_normal.png


BIN
public/images/sewage_online_alarm.png


BIN
public/images/sewage_online_normal.png


BIN
public/images/sewage_other_alarm.png


BIN
public/images/sewage_other_normal.png


BIN
public/images/supply_lost_alarm.png


BIN
public/images/supply_lost_normal.png


BIN
public/images/supply_offline_alarm.png


+ 0 - 0
public/images/supply_offline_normal.png


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor