From 17d37d246288ab8c60c2a60fa7c8b622a2249a7b Mon Sep 17 00:00:00 2001 From: icssoa <2570063477@qq.com> Date: Sun, 28 Feb 2021 01:55:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .browserslistrc | 2 + .eslintignore | 8 + .eslintrc.js | 14 + .gitignore | 21 + .prettierrc | 9 + .vscode/crud.code-snippets | 61 + LICENSE | 21 + README.md | 58 +- babel.config.js | 13 + cool/components/base/common/index.js | 22 + .../base/components/avatar/index.vue | 98 + .../components/base/components/dept/check.vue | 138 + cool/components/base/components/dept/move.vue | 100 + cool/components/base/components/dept/tree.vue | 422 ++ .../base/components/icon-svg/index.vue | 56 + cool/components/base/components/index.js | 35 + cool/components/base/components/menu/file.vue | 139 + .../components/base/components/menu/icons.vue | 95 + .../components/base/components/menu/perms.vue | 97 + .../base/components/menu/slider/index.js | 81 + .../base/components/menu/slider/index.scss | 94 + .../base/components/menu/topbar.vue | 85 + cool/components/base/components/menu/tree.vue | 108 + .../base/components/process/index.vue | 267 + .../components/base/components/role/perms.vue | 128 + .../base/components/role/select.vue | 55 + .../base/components/route-nav/index.vue | 104 + .../base/components/scrollbar/index.vue | 53 + cool/components/base/directives/index.js | 7 + cool/components/base/directives/permission.js | 42 + cool/components/base/filters/index.js | 17 + cool/components/base/index.js | 12 + cool/components/base/package.json | 9 + cool/components/base/pages/error-page/403.vue | 13 + cool/components/base/pages/error-page/404.vue | 13 + cool/components/base/pages/error-page/500.vue | 13 + cool/components/base/pages/error-page/502.vue | 13 + .../error-page/components/error-page.vue | 160 + cool/components/base/pages/iframe/index.vue | 43 + cool/components/base/pages/index.js | 22 + .../base/pages/login/components/captcha.vue | 64 + cool/components/base/pages/login/index.vue | 205 + cool/components/base/service/common.js | 80 + cool/components/base/service/dept.js | 15 + cool/components/base/service/index.js | 21 + cool/components/base/service/menu.js | 6 + cool/components/base/service/open.js | 56 + cool/components/base/service/plugin.js | 32 + cool/components/base/service/role.js | 6 + cool/components/base/service/user.js | 15 + cool/components/base/static/css/index.scss | 1 + cool/components/base/static/css/theme.scss | 126 + .../base/static/images/default-avatar.png | Bin 0 -> 3991 bytes cool/components/base/static/images/logo.png | Bin 0 -> 4528 bytes cool/components/base/store/app.js | 58 + cool/components/base/store/component.js | 33 + cool/components/base/store/index.js | 7 + cool/components/base/store/menu.js | 152 + cool/components/base/store/process.js | 57 + cool/components/base/store/user.js | 103 + cool/components/base/utils/index.js | 31 + cool/components/base/views/index.js | 35 + cool/components/base/views/info.vue | 90 + cool/components/base/views/menu.vue | 391 ++ cool/components/base/views/plugin.vue | 238 + cool/components/base/views/role.vue | 163 + cool/components/base/views/user.vue | 544 ++ cool/components/chat/components/box.vue | 807 +++ cool/components/chat/components/emoji.vue | 157 + .../components/chat/components/icon-voice.vue | 47 + cool/components/chat/components/index.js | 4 + cool/components/chat/components/message.vue | 345 ++ cool/components/chat/components/notice.vue | 58 + cool/components/chat/index.js | 4 + cool/components/chat/package.json | 10 + cool/components/chat/service/index.js | 9 + cool/components/chat/service/message.js | 15 + cool/components/chat/service/session.js | 13 + .../chat/static/images/custom-avatar.png | Bin 0 -> 4177 bytes cool/components/chat/static/images/emoji.png | Bin 0 -> 1891 bytes cool/components/chat/static/images/image.png | Bin 0 -> 845 bytes cool/components/chat/static/images/video.png | Bin 0 -> 724 bytes cool/components/chat/static/notify.mp3 | Bin 0 -> 46051 bytes cool/components/chat/utils/index.js | 31 + .../codemirror/components/index.vue | 268 + cool/components/codemirror/index.js | 7 + cool/components/codemirror/package.json | 11 + cool/components/copy/directives/index.js | 28 + cool/components/copy/index.js | 7 + cool/components/copy/package.json | 10 + cool/components/demo/index.js | 5 + cool/components/demo/package.json | 9 + cool/components/demo/utils/service.js | 107 + .../views/components/b-cl-context-menu.vue | 80 + .../demo/views/components/b-cl-crud.vue | 14 + .../views/components/b-cl-editor-quill.vue | 14 + .../demo/views/components/b-cl-form.vue | 140 + .../demo/views/components/b-cl-upload.vue | 41 + .../demo/views/components/b-error-page.vue | 29 + .../demo/views/components/b-icon-svg.vue | 26 + .../demo/views/components/b-v-copy.vue | 18 + cool/components/demo/views/crud.vue | 613 ++ cool/components/demo/views/demo.vue | 215 + cool/components/demo/views/editor-quill.vue | 31 + cool/components/demo/views/index.js | 26 + cool/components/demo/views/upload.vue | 80 + .../distpicker/components/data.json | 5312 +++++++++++++++++ .../distpicker/components/index.vue | 66 + cool/components/distpicker/index.js | 7 + .../editor-quill/components/index.vue | 243 + cool/components/editor-quill/index.js | 7 + cool/components/editor-quill/package.json | 9 + cool/components/log/index.js | 4 + cool/components/log/service/index.js | 7 + cool/components/log/service/log.js | 32 + cool/components/log/views/index.js | 8 + cool/components/log/views/log.vue | 151 + cool/components/param/index.js | 4 + cool/components/param/service/index.js | 7 + cool/components/param/service/param.js | 6 + cool/components/param/views/index.js | 8 + cool/components/param/views/param.vue | 216 + cool/components/perf/index.js | 4 + cool/components/perf/service/index.js | 7 + cool/components/perf/service/info.js | 13 + .../perf/views/components/common.js | 28 + cool/components/perf/views/components/ct.vue | 253 + .../perf/views/components/mysql.vue | 275 + .../perf/views/components/network.vue | 345 ++ .../perf/views/components/redis.vue | 324 + cool/components/perf/views/index.js | 8 + cool/components/perf/views/perf.vue | 82 + cool/components/task/index.js | 7 + cool/components/task/package.json | 9 + cool/components/task/service/index.js | 7 + cool/components/task/service/task.js | 41 + cool/components/task/views/index.js | 8 + cool/components/task/views/task.vue | 1133 ++++ cool/components/upload/components/index.js | 7 + cool/components/upload/components/index.vue | 583 ++ cool/components/upload/components/space.vue | 721 +++ cool/components/upload/index.js | 4 + cool/components/upload/service/index.js | 9 + cool/components/upload/service/info.js | 6 + cool/components/upload/service/type.js | 6 + cool/core/common/index.js | 11 + cool/core/index.js | 12 + cool/core/service/base.js | 118 + cool/core/service/desorator.js | 40 + cool/core/service/index.js | 4 + cool/core/set/component.js | 150 + cool/core/set/index.js | 5 + cool/core/set/router.js | 116 + cool/core/set/service.js | 53 + cool/core/utils/index.js | 256 + cool/core/utils/storage.js | 81 + cool/index.js | 55 + package.json | 53 + postcss.config.js | 5 + public/favicon.ico | Bin 0 -> 67646 bytes public/index.html | 99 + src/App.vue | 7 + src/assets/css/common.scss | 14 + src/assets/css/element-variables.scss | 9 + src/assets/css/index.scss | 40 + src/assets/icon/logo/silder-simple.png | Bin 0 -> 1403 bytes src/assets/icon/logo/silder.png | Bin 0 -> 3072 bytes src/config/env.js | 58 + src/element.js | 172 + src/icons/svg/icon-activity.svg | 1 + src/icons/svg/icon-app.svg | 1 + src/icons/svg/icon-approve.svg | 1 + src/icons/svg/icon-auth.svg | 1 + src/icons/svg/icon-ban.svg | 1 + src/icons/svg/icon-camera.svg | 1 + src/icons/svg/icon-card.svg | 1 + src/icons/svg/icon-cart.svg | 1 + src/icons/svg/icon-command.svg | 1 + src/icons/svg/icon-common.svg | 1 + src/icons/svg/icon-count.svg | 1 + src/icons/svg/icon-crown.svg | 1 + src/icons/svg/icon-dept.svg | 1 + src/icons/svg/icon-discover.svg | 1 + src/icons/svg/icon-emoji.svg | 1 + src/icons/svg/icon-favor.svg | 1 + src/icons/svg/icon-goods.svg | 1 + src/icons/svg/icon-home.svg | 1 + src/icons/svg/icon-hot.svg | 1 + src/icons/svg/icon-info.svg | 1 + src/icons/svg/icon-like.svg | 1 + src/icons/svg/icon-living.svg | 1 + src/icons/svg/icon-log.svg | 1 + src/icons/svg/icon-menu.svg | 1 + src/icons/svg/icon-message.svg | 1 + src/icons/svg/icon-monitor.svg | 1 + src/icons/svg/icon-new.svg | 1 + src/icons/svg/icon-news.svg | 1 + src/icons/svg/icon-pending.svg | 1 + src/icons/svg/icon-pic.svg | 1 + src/icons/svg/icon-question.svg | 1 + src/icons/svg/icon-rank.svg | 1 + src/icons/svg/icon-scan.svg | 1 + src/icons/svg/icon-search.svg | 1 + src/icons/svg/icon-system.svg | 1 + src/icons/svg/icon-tag (1).svg | 1 + src/icons/svg/icon-tag.svg | 1 + src/icons/svg/icon-task.svg | 1 + src/icons/svg/icon-time.svg | 1 + src/icons/svg/icon-user.svg | 1 + src/icons/svg/icon-video.svg | 1 + src/icons/svg/icon-wallet.svg | 1 + src/icons/svg/icon-warn.svg | 1 + src/icons/svg/icon-workbench.svg | 1 + src/icons/svg/perf-cache.svg | 1 + src/icons/svg/perf-connect.svg | 1 + src/icons/svg/perf-cpu.svg | 1 + src/icons/svg/perf-db.svg | 1 + src/icons/svg/perf-disk.svg | 1 + src/icons/svg/perf-lb.svg | 1 + src/icons/svg/perf-network.svg | 1 + src/main.js | 29 + src/pages/home/components/category-ratio.vue | 101 + src/pages/home/components/count-effect.vue | 79 + src/pages/home/components/count-paid.vue | 103 + src/pages/home/components/count-sales.vue | 74 + src/pages/home/components/count-views.vue | 150 + src/pages/home/components/hot-search.vue | 323 + src/pages/home/components/sales-rank.vue | 198 + src/pages/home/components/tab-chart.vue | 171 + src/pages/home/index.vue | 131 + src/pages/layout/index.vue | 176 + src/pages/layout/slider.vue | 57 + src/pages/layout/topbar.vue | 148 + src/router/index.js | 42 + src/service/request.js | 149 + src/store/index.js | 8 + vue.config.js | 121 + 237 files changed, 21991 insertions(+), 1 deletion(-) create mode 100644 .browserslistrc create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 .vscode/crud.code-snippets create mode 100644 LICENSE create mode 100644 babel.config.js create mode 100644 cool/components/base/common/index.js create mode 100644 cool/components/base/components/avatar/index.vue create mode 100644 cool/components/base/components/dept/check.vue create mode 100644 cool/components/base/components/dept/move.vue create mode 100644 cool/components/base/components/dept/tree.vue create mode 100644 cool/components/base/components/icon-svg/index.vue create mode 100644 cool/components/base/components/index.js create mode 100644 cool/components/base/components/menu/file.vue create mode 100644 cool/components/base/components/menu/icons.vue create mode 100644 cool/components/base/components/menu/perms.vue create mode 100644 cool/components/base/components/menu/slider/index.js create mode 100644 cool/components/base/components/menu/slider/index.scss create mode 100644 cool/components/base/components/menu/topbar.vue create mode 100644 cool/components/base/components/menu/tree.vue create mode 100644 cool/components/base/components/process/index.vue create mode 100644 cool/components/base/components/role/perms.vue create mode 100644 cool/components/base/components/role/select.vue create mode 100644 cool/components/base/components/route-nav/index.vue create mode 100644 cool/components/base/components/scrollbar/index.vue create mode 100644 cool/components/base/directives/index.js create mode 100644 cool/components/base/directives/permission.js create mode 100644 cool/components/base/filters/index.js create mode 100644 cool/components/base/index.js create mode 100644 cool/components/base/package.json create mode 100644 cool/components/base/pages/error-page/403.vue create mode 100644 cool/components/base/pages/error-page/404.vue create mode 100644 cool/components/base/pages/error-page/500.vue create mode 100644 cool/components/base/pages/error-page/502.vue create mode 100644 cool/components/base/pages/error-page/components/error-page.vue create mode 100644 cool/components/base/pages/iframe/index.vue create mode 100644 cool/components/base/pages/index.js create mode 100644 cool/components/base/pages/login/components/captcha.vue create mode 100644 cool/components/base/pages/login/index.vue create mode 100644 cool/components/base/service/common.js create mode 100644 cool/components/base/service/dept.js create mode 100644 cool/components/base/service/index.js create mode 100644 cool/components/base/service/menu.js create mode 100644 cool/components/base/service/open.js create mode 100644 cool/components/base/service/plugin.js create mode 100644 cool/components/base/service/role.js create mode 100644 cool/components/base/service/user.js create mode 100644 cool/components/base/static/css/index.scss create mode 100644 cool/components/base/static/css/theme.scss create mode 100644 cool/components/base/static/images/default-avatar.png create mode 100644 cool/components/base/static/images/logo.png create mode 100644 cool/components/base/store/app.js create mode 100644 cool/components/base/store/component.js create mode 100644 cool/components/base/store/index.js create mode 100644 cool/components/base/store/menu.js create mode 100644 cool/components/base/store/process.js create mode 100644 cool/components/base/store/user.js create mode 100644 cool/components/base/utils/index.js create mode 100644 cool/components/base/views/index.js create mode 100644 cool/components/base/views/info.vue create mode 100644 cool/components/base/views/menu.vue create mode 100644 cool/components/base/views/plugin.vue create mode 100644 cool/components/base/views/role.vue create mode 100644 cool/components/base/views/user.vue create mode 100644 cool/components/chat/components/box.vue create mode 100644 cool/components/chat/components/emoji.vue create mode 100644 cool/components/chat/components/icon-voice.vue create mode 100644 cool/components/chat/components/index.js create mode 100644 cool/components/chat/components/message.vue create mode 100644 cool/components/chat/components/notice.vue create mode 100644 cool/components/chat/index.js create mode 100644 cool/components/chat/package.json create mode 100644 cool/components/chat/service/index.js create mode 100644 cool/components/chat/service/message.js create mode 100644 cool/components/chat/service/session.js create mode 100644 cool/components/chat/static/images/custom-avatar.png create mode 100644 cool/components/chat/static/images/emoji.png create mode 100644 cool/components/chat/static/images/image.png create mode 100644 cool/components/chat/static/images/video.png create mode 100644 cool/components/chat/static/notify.mp3 create mode 100644 cool/components/chat/utils/index.js create mode 100644 cool/components/codemirror/components/index.vue create mode 100644 cool/components/codemirror/index.js create mode 100644 cool/components/codemirror/package.json create mode 100644 cool/components/copy/directives/index.js create mode 100644 cool/components/copy/index.js create mode 100644 cool/components/copy/package.json create mode 100644 cool/components/demo/index.js create mode 100644 cool/components/demo/package.json create mode 100644 cool/components/demo/utils/service.js create mode 100644 cool/components/demo/views/components/b-cl-context-menu.vue create mode 100644 cool/components/demo/views/components/b-cl-crud.vue create mode 100644 cool/components/demo/views/components/b-cl-editor-quill.vue create mode 100644 cool/components/demo/views/components/b-cl-form.vue create mode 100644 cool/components/demo/views/components/b-cl-upload.vue create mode 100644 cool/components/demo/views/components/b-error-page.vue create mode 100644 cool/components/demo/views/components/b-icon-svg.vue create mode 100644 cool/components/demo/views/components/b-v-copy.vue create mode 100644 cool/components/demo/views/crud.vue create mode 100644 cool/components/demo/views/demo.vue create mode 100644 cool/components/demo/views/editor-quill.vue create mode 100644 cool/components/demo/views/index.js create mode 100644 cool/components/demo/views/upload.vue create mode 100644 cool/components/distpicker/components/data.json create mode 100644 cool/components/distpicker/components/index.vue create mode 100644 cool/components/distpicker/index.js create mode 100644 cool/components/editor-quill/components/index.vue create mode 100644 cool/components/editor-quill/index.js create mode 100644 cool/components/editor-quill/package.json create mode 100644 cool/components/log/index.js create mode 100644 cool/components/log/service/index.js create mode 100644 cool/components/log/service/log.js create mode 100644 cool/components/log/views/index.js create mode 100644 cool/components/log/views/log.vue create mode 100644 cool/components/param/index.js create mode 100644 cool/components/param/service/index.js create mode 100644 cool/components/param/service/param.js create mode 100644 cool/components/param/views/index.js create mode 100644 cool/components/param/views/param.vue create mode 100644 cool/components/perf/index.js create mode 100644 cool/components/perf/service/index.js create mode 100644 cool/components/perf/service/info.js create mode 100644 cool/components/perf/views/components/common.js create mode 100644 cool/components/perf/views/components/ct.vue create mode 100644 cool/components/perf/views/components/mysql.vue create mode 100644 cool/components/perf/views/components/network.vue create mode 100644 cool/components/perf/views/components/redis.vue create mode 100644 cool/components/perf/views/index.js create mode 100644 cool/components/perf/views/perf.vue create mode 100644 cool/components/task/index.js create mode 100644 cool/components/task/package.json create mode 100644 cool/components/task/service/index.js create mode 100644 cool/components/task/service/task.js create mode 100644 cool/components/task/views/index.js create mode 100644 cool/components/task/views/task.vue create mode 100644 cool/components/upload/components/index.js create mode 100644 cool/components/upload/components/index.vue create mode 100644 cool/components/upload/components/space.vue create mode 100644 cool/components/upload/index.js create mode 100644 cool/components/upload/service/index.js create mode 100644 cool/components/upload/service/info.js create mode 100644 cool/components/upload/service/type.js create mode 100644 cool/core/common/index.js create mode 100644 cool/core/index.js create mode 100644 cool/core/service/base.js create mode 100644 cool/core/service/desorator.js create mode 100644 cool/core/service/index.js create mode 100644 cool/core/set/component.js create mode 100644 cool/core/set/index.js create mode 100644 cool/core/set/router.js create mode 100644 cool/core/set/service.js create mode 100644 cool/core/utils/index.js create mode 100644 cool/core/utils/storage.js create mode 100644 cool/index.js create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/favicon.ico create mode 100644 public/index.html create mode 100644 src/App.vue create mode 100644 src/assets/css/common.scss create mode 100644 src/assets/css/element-variables.scss create mode 100644 src/assets/css/index.scss create mode 100644 src/assets/icon/logo/silder-simple.png create mode 100644 src/assets/icon/logo/silder.png create mode 100644 src/config/env.js create mode 100644 src/element.js create mode 100644 src/icons/svg/icon-activity.svg create mode 100644 src/icons/svg/icon-app.svg create mode 100644 src/icons/svg/icon-approve.svg create mode 100644 src/icons/svg/icon-auth.svg create mode 100644 src/icons/svg/icon-ban.svg create mode 100644 src/icons/svg/icon-camera.svg create mode 100644 src/icons/svg/icon-card.svg create mode 100644 src/icons/svg/icon-cart.svg create mode 100644 src/icons/svg/icon-command.svg create mode 100644 src/icons/svg/icon-common.svg create mode 100644 src/icons/svg/icon-count.svg create mode 100644 src/icons/svg/icon-crown.svg create mode 100644 src/icons/svg/icon-dept.svg create mode 100644 src/icons/svg/icon-discover.svg create mode 100644 src/icons/svg/icon-emoji.svg create mode 100644 src/icons/svg/icon-favor.svg create mode 100644 src/icons/svg/icon-goods.svg create mode 100644 src/icons/svg/icon-home.svg create mode 100644 src/icons/svg/icon-hot.svg create mode 100644 src/icons/svg/icon-info.svg create mode 100644 src/icons/svg/icon-like.svg create mode 100644 src/icons/svg/icon-living.svg create mode 100644 src/icons/svg/icon-log.svg create mode 100644 src/icons/svg/icon-menu.svg create mode 100644 src/icons/svg/icon-message.svg create mode 100644 src/icons/svg/icon-monitor.svg create mode 100644 src/icons/svg/icon-new.svg create mode 100644 src/icons/svg/icon-news.svg create mode 100644 src/icons/svg/icon-pending.svg create mode 100644 src/icons/svg/icon-pic.svg create mode 100644 src/icons/svg/icon-question.svg create mode 100644 src/icons/svg/icon-rank.svg create mode 100644 src/icons/svg/icon-scan.svg create mode 100644 src/icons/svg/icon-search.svg create mode 100644 src/icons/svg/icon-system.svg create mode 100644 src/icons/svg/icon-tag (1).svg create mode 100644 src/icons/svg/icon-tag.svg create mode 100644 src/icons/svg/icon-task.svg create mode 100644 src/icons/svg/icon-time.svg create mode 100644 src/icons/svg/icon-user.svg create mode 100644 src/icons/svg/icon-video.svg create mode 100644 src/icons/svg/icon-wallet.svg create mode 100644 src/icons/svg/icon-warn.svg create mode 100644 src/icons/svg/icon-workbench.svg create mode 100644 src/icons/svg/perf-cache.svg create mode 100644 src/icons/svg/perf-connect.svg create mode 100644 src/icons/svg/perf-cpu.svg create mode 100644 src/icons/svg/perf-db.svg create mode 100644 src/icons/svg/perf-disk.svg create mode 100644 src/icons/svg/perf-lb.svg create mode 100644 src/icons/svg/perf-network.svg create mode 100644 src/main.js create mode 100644 src/pages/home/components/category-ratio.vue create mode 100644 src/pages/home/components/count-effect.vue create mode 100644 src/pages/home/components/count-paid.vue create mode 100644 src/pages/home/components/count-sales.vue create mode 100644 src/pages/home/components/count-views.vue create mode 100644 src/pages/home/components/hot-search.vue create mode 100644 src/pages/home/components/sales-rank.vue create mode 100644 src/pages/home/components/tab-chart.vue create mode 100644 src/pages/home/index.vue create mode 100644 src/pages/layout/index.vue create mode 100644 src/pages/layout/slider.vue create mode 100644 src/pages/layout/topbar.vue create mode 100644 src/router/index.js create mode 100644 src/service/request.js create mode 100644 src/store/index.js create mode 100644 vue.config.js diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..d6471a3 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,2 @@ +> 1% +last 2 versions diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..0d0f62a --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +/public/ +/dist/ +/node_modules/ +/src/icons/svg/ +/mock/ +/cool/ +/src/cool/ +vue.config.js \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..39bd413 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + root: true, + env: { + node: true + }, + extends: ["plugin:vue/essential", "@vue/prettier"], + rules: { + "no-console": "off", + "comma-dangle": [2, "never"] + }, + parserOptions: { + parser: "@typescript-eslint/parser" + } +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..27ef30a --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +yarn.lock + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..b82b0c6 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "tabWidth": 4, + "useTabs": true, + "semi": true, + "jsxBracketSameLine": true, + "singleQuote": false, + "printWidth": 100, + "trailingComma": "none" +} diff --git a/.vscode/crud.code-snippets b/.vscode/crud.code-snippets new file mode 100644 index 0000000..a86c776 --- /dev/null +++ b/.vscode/crud.code-snippets @@ -0,0 +1,61 @@ +{ + "cl-crud": { + "prefix": "cl-crud", + "body": [ + "", + "", + "", + "" + ], + "description": "cl-crud snippets" + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..83140ce --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 cool-team-official + +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. diff --git a/README.md b/README.md index f1ae8d2..1eadaef 100644 --- a/README.md +++ b/README.md @@ -1 +1,57 @@ -#cool-admin +#### 介绍 + +配置化编码,单表 CRUD 只需少量配置;写更少的代码,实现更多的功能;简洁、高效、可扩展、高度解耦 + +#### 浏览器兼容性 + +支持所有符合 ES5 标准的浏览器(不支持 IE8 及以下版本). + +#### 在线社区 + +[传送门](https://bbs.cool-js.com/) + +## 先决条件 + +请确保您的操作系统上安装了 Node.js(> = 8.9.0)、@vue/cli。 + +## 安装项目依赖 + +推荐使用 `yarn`: + +```shell +yarn +``` + +解决 `node-sass` 网络慢的方法: + +```shell +yarn config set sass-binary-site http://npm.taobao.org/mirrors/node-sass +``` + +## 安装扩展组件的依赖 + +安装 `cl-admin-cli` 脚手架: + +```shell +npm install cl-admin-cli -g +``` + +安装扩展组件依赖: + +```shell +cl install +``` + +## 运行应用程序 + +安装过程完成后,运行以下命令启动服务。您可以在浏览器中预览网站 [http://localhost:9000](http://localhost:9000) + +```shell +yarn serve +``` + +## 分析包内容 + +```shell +yarn report +``` diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..32df09b --- /dev/null +++ b/babel.config.js @@ -0,0 +1,13 @@ +module.exports = { + presets: ["@vue/app"], + plugins: [ + ["jsx-v-model"], + [ + "component", + { + libraryName: "element-ui", + styleLibraryName: "theme-chalk" + } + ] + ] +}; diff --git a/cool/components/base/common/index.js b/cool/components/base/common/index.js new file mode 100644 index 0000000..cfee74b --- /dev/null +++ b/cool/components/base/common/index.js @@ -0,0 +1,22 @@ +import { iconfontUrl } from "@/config/env"; + +if (iconfontUrl) { + const link = document.createElement("link"); + link.type = "text/css"; + link.rel = "stylesheet"; + link.href = iconfontUrl; + document.getElementsByTagName("head")[0].appendChild(link); +} + +const requireAll = (requireContext) => requireContext.keys().map(requireContext); +const req = require.context("@/icons/svg/", false, /\.svg$/); +requireAll(req); + +export function iconList() { + return req + .keys() + .map(req) + .map((e) => e.default.id) + .filter((e) => e.includes("icon")) + .sort(); +} diff --git a/cool/components/base/components/avatar/index.vue b/cool/components/base/components/avatar/index.vue new file mode 100644 index 0000000..77bb3a6 --- /dev/null +++ b/cool/components/base/components/avatar/index.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/cool/components/base/components/dept/check.vue b/cool/components/base/components/dept/check.vue new file mode 100644 index 0000000..5c67d97 --- /dev/null +++ b/cool/components/base/components/dept/check.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/cool/components/base/components/dept/move.vue b/cool/components/base/components/dept/move.vue new file mode 100644 index 0000000..8b5f72c --- /dev/null +++ b/cool/components/base/components/dept/move.vue @@ -0,0 +1,100 @@ + + + diff --git a/cool/components/base/components/dept/tree.vue b/cool/components/base/components/dept/tree.vue new file mode 100644 index 0000000..574f597 --- /dev/null +++ b/cool/components/base/components/dept/tree.vue @@ -0,0 +1,422 @@ + + + + + diff --git a/cool/components/base/components/icon-svg/index.vue b/cool/components/base/components/icon-svg/index.vue new file mode 100644 index 0000000..ae4ebdb --- /dev/null +++ b/cool/components/base/components/icon-svg/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/cool/components/base/components/index.js b/cool/components/base/components/index.js new file mode 100644 index 0000000..1172189 --- /dev/null +++ b/cool/components/base/components/index.js @@ -0,0 +1,35 @@ +import Avatar from "./avatar"; +import Scrollbar from "./scrollbar"; +import RouteNav from "./route-nav"; +import Process from "./process"; +import IconSvg from "./icon-svg"; +import DeptCheck from "./dept/check"; +import DeptMove from "./dept/move"; +import DeptTree from "./dept/tree"; +import MenuSlider from "./menu/slider"; +import MenuTopbar from "./menu/topbar"; +import MenuFile from "./menu/file"; +import MenuIcons from "./menu/icons"; +import MenuPerms from "./menu/perms"; +import MenuTree from "./menu/tree"; +import RoleSelect from "./role/select"; +import RolePerms from "./role/perms"; + +export default { + Avatar, + Scrollbar, + RouteNav, + Process, + IconSvg, + DeptCheck, + DeptMove, + DeptTree, + MenuSlider, + MenuTopbar, + MenuFile, + MenuIcons, + MenuPerms, + MenuTree, + RoleSelect, + RolePerms +}; diff --git a/cool/components/base/components/menu/file.vue b/cool/components/base/components/menu/file.vue new file mode 100644 index 0000000..197adc8 --- /dev/null +++ b/cool/components/base/components/menu/file.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/cool/components/base/components/menu/icons.vue b/cool/components/base/components/menu/icons.vue new file mode 100644 index 0000000..af0820e --- /dev/null +++ b/cool/components/base/components/menu/icons.vue @@ -0,0 +1,95 @@ + + + + +. + diff --git a/cool/components/base/components/menu/perms.vue b/cool/components/base/components/menu/perms.vue new file mode 100644 index 0000000..25b63a2 --- /dev/null +++ b/cool/components/base/components/menu/perms.vue @@ -0,0 +1,97 @@ + + + diff --git a/cool/components/base/components/menu/slider/index.js b/cool/components/base/components/menu/slider/index.js new file mode 100644 index 0000000..a645698 --- /dev/null +++ b/cool/components/base/components/menu/slider/index.js @@ -0,0 +1,81 @@ +import { mapGetters } from "vuex"; +import "./index.scss"; + +export default { + name: "cl-menu-slider", + + data() { + return { + visible: true + }; + }, + + computed: { + ...mapGetters(["menuList", "menuCollapse", "browser"]) + }, + + watch: { + menuList() { + this.visible = false; + + setTimeout(() => { + this.visible = true; + }, 0); + } + }, + + methods: { + toView(url) { + if (url != this.$route.path) { + this.$router.push(url); + } + } + }, + + render() { + const fn = (list) => { + return list + .filter((e) => e.isShow) + .map((e) => { + let html = null; + + if (e.type == 0) { + html = ( + + + {fn(e.children)} + + ); + } else { + html = ( + + + {e.name} + + ); + } + + return html; + }); + }; + + let el = fn(this.menuList); + + return ( + this.visible && ( +
+ + {el} + +
+ ) + ); + } +}; diff --git a/cool/components/base/components/menu/slider/index.scss b/cool/components/base/components/menu/slider/index.scss new file mode 100644 index 0000000..2fda6ae --- /dev/null +++ b/cool/components/base/components/menu/slider/index.scss @@ -0,0 +1,94 @@ +.cl-slider-menu { + height: 100%; + overflow-y: auto; + + &::-webkit-scrollbar { + width: 0; + height: 0; + } + + .el-menu { + border-right: 0; + background-color: $color-main; + + &-item { + &.is-active { + background-color: $color-primary; + color: #fff; + } + } + + .el-submenu__title, + .el-menu-item { + &:hover { + background-color: $color-primary; + } + } + + .el-submenu { + &.is-opened { + background-color: #2b3043; + + .el-menu { + background-color: #2b3043; + } + } + } + + .el-submenu__title, + &-item, + &__title { + color: #eee; + letter-spacing: 0.5px; + height: 50px; + line-height: 50px; + + .icon-svg { + font-size: 16px; + margin: 0 15px 0 5px; + position: relative; + } + + span { + font-size: 12px; + letter-spacing: 1px; + display: inline-block; + } + } + + &--collapse { + .el-submenu__title { + .icon-svg { + margin-left: 2px; + font-size: 19px; + } + } + } + } +} + +.el-menu { + &--vertical { + .el-submenu { + &__title { + display: flex; + align-items: center; + + .icon-svg { + font-size: 18px; + margin-right: 10px; + } + } + } + + .el-menu-item { + display: flex; + align-items: center; + + .icon-svg { + font-size: 18px; + margin-right: 10px; + } + } + } +} diff --git a/cool/components/base/components/menu/topbar.vue b/cool/components/base/components/menu/topbar.vue new file mode 100644 index 0000000..e8e5ea9 --- /dev/null +++ b/cool/components/base/components/menu/topbar.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/cool/components/base/components/menu/tree.vue b/cool/components/base/components/menu/tree.vue new file mode 100644 index 0000000..176d0db --- /dev/null +++ b/cool/components/base/components/menu/tree.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/cool/components/base/components/process/index.vue b/cool/components/base/components/process/index.vue new file mode 100644 index 0000000..673e96a --- /dev/null +++ b/cool/components/base/components/process/index.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/cool/components/base/components/role/perms.vue b/cool/components/base/components/role/perms.vue new file mode 100644 index 0000000..541c025 --- /dev/null +++ b/cool/components/base/components/role/perms.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/cool/components/base/components/role/select.vue b/cool/components/base/components/role/select.vue new file mode 100644 index 0000000..59f0bd0 --- /dev/null +++ b/cool/components/base/components/role/select.vue @@ -0,0 +1,55 @@ + + + diff --git a/cool/components/base/components/route-nav/index.vue b/cool/components/base/components/route-nav/index.vue new file mode 100644 index 0000000..1d6ace8 --- /dev/null +++ b/cool/components/base/components/route-nav/index.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/cool/components/base/components/scrollbar/index.vue b/cool/components/base/components/scrollbar/index.vue new file mode 100644 index 0000000..bb3035f --- /dev/null +++ b/cool/components/base/components/scrollbar/index.vue @@ -0,0 +1,53 @@ + + + diff --git a/cool/components/base/directives/index.js b/cool/components/base/directives/index.js new file mode 100644 index 0000000..97eac95 --- /dev/null +++ b/cool/components/base/directives/index.js @@ -0,0 +1,7 @@ +import permission, { checkPerm } from "./permission"; + +export { checkPerm }; + +export default { + permission +}; diff --git a/cool/components/base/directives/permission.js b/cool/components/base/directives/permission.js new file mode 100644 index 0000000..ad7c274 --- /dev/null +++ b/cool/components/base/directives/permission.js @@ -0,0 +1,42 @@ +import store from "@/store"; + +function change(el, binding) { + el.style.display = checkPerm(binding.value) ? el.getAttribute("_display") : "none"; +} + +function parse(value) { + const permission = store.getters.permission; + + if (typeof value == "string") { + return value ? permission.some((e) => e.includes(value.replace(/\s/g, ""))) : false; + } else { + return Boolean(value); + } +} + +export default { + inserted(el, binding) { + el.setAttribute("_display", el.style.display || ""); + + change(el, binding); + }, + update: change +}; + +export const checkPerm = (value) => { + if (!value) { + return false; + } + + if (Object.prototype.toString.call(value) === "[object Object]") { + if (value.or) { + return value.or.some(parse); + } + + if (value.and) { + return value.and.some((e) => !parse(e)) ? false : true; + } + } + + return parse(value); +}; diff --git a/cool/components/base/filters/index.js b/cool/components/base/filters/index.js new file mode 100644 index 0000000..dcbd3d3 --- /dev/null +++ b/cool/components/base/filters/index.js @@ -0,0 +1,17 @@ +export default { + default_avatar(url) { + if (!url) { + return require("../static/images/default-avatar.png"); + } + + return url; + }, + + default_name(name) { + if (!name) { + return "未命名"; + } + + return name; + } +}; diff --git a/cool/components/base/index.js b/cool/components/base/index.js new file mode 100644 index 0000000..0ab89dc --- /dev/null +++ b/cool/components/base/index.js @@ -0,0 +1,12 @@ +import components from "./components"; +import filters from "./filters"; +import pages from "./pages"; +import views from "./views"; +import store from "./store"; +import service from "./service"; +import directives, { checkPerm } from "./directives"; +import { iconList } from "./common"; +import "./static/css/index.scss"; + +export { iconList, checkPerm }; +export default { components, filters, pages, views, store, service, directives }; diff --git a/cool/components/base/package.json b/cool/components/base/package.json new file mode 100644 index 0000000..5999d0b --- /dev/null +++ b/cool/components/base/package.json @@ -0,0 +1,9 @@ +{ + "name": "base", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "uuid": "^8.3.2" + } +} diff --git a/cool/components/base/pages/error-page/403.vue b/cool/components/base/pages/error-page/403.vue new file mode 100644 index 0000000..4efc96d --- /dev/null +++ b/cool/components/base/pages/error-page/403.vue @@ -0,0 +1,13 @@ + + + diff --git a/cool/components/base/pages/error-page/404.vue b/cool/components/base/pages/error-page/404.vue new file mode 100644 index 0000000..4822d17 --- /dev/null +++ b/cool/components/base/pages/error-page/404.vue @@ -0,0 +1,13 @@ + + + diff --git a/cool/components/base/pages/error-page/500.vue b/cool/components/base/pages/error-page/500.vue new file mode 100644 index 0000000..6b98d87 --- /dev/null +++ b/cool/components/base/pages/error-page/500.vue @@ -0,0 +1,13 @@ + + + diff --git a/cool/components/base/pages/error-page/502.vue b/cool/components/base/pages/error-page/502.vue new file mode 100644 index 0000000..479cfe6 --- /dev/null +++ b/cool/components/base/pages/error-page/502.vue @@ -0,0 +1,13 @@ + + + diff --git a/cool/components/base/pages/error-page/components/error-page.vue b/cool/components/base/pages/error-page/components/error-page.vue new file mode 100644 index 0000000..7f86d5b --- /dev/null +++ b/cool/components/base/pages/error-page/components/error-page.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/cool/components/base/pages/iframe/index.vue b/cool/components/base/pages/iframe/index.vue new file mode 100644 index 0000000..28faf0d --- /dev/null +++ b/cool/components/base/pages/iframe/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/cool/components/base/pages/index.js b/cool/components/base/pages/index.js new file mode 100644 index 0000000..38070f4 --- /dev/null +++ b/cool/components/base/pages/index.js @@ -0,0 +1,22 @@ +export default [ + { + path: '/403', + component: () => import("./error-page/403") + }, + { + path: '/404', + component: () => import("./error-page/404") + }, + { + path: '/500', + component: () => import("./error-page/500") + }, + { + path: '/502', + component: () => import("./error-page/502") + }, + { + path: '/login', + component: () => import("./login") + } +] diff --git a/cool/components/base/pages/login/components/captcha.vue b/cool/components/base/pages/login/components/captcha.vue new file mode 100644 index 0000000..a1b6af5 --- /dev/null +++ b/cool/components/base/pages/login/components/captcha.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/cool/components/base/pages/login/index.vue b/cool/components/base/pages/login/index.vue new file mode 100644 index 0000000..ed0e2aa --- /dev/null +++ b/cool/components/base/pages/login/index.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/cool/components/base/service/common.js b/cool/components/base/service/common.js new file mode 100644 index 0000000..ce733a7 --- /dev/null +++ b/cool/components/base/service/common.js @@ -0,0 +1,80 @@ +import { BaseService, Service } from "cl-admin"; + +@Service("comm") +class Common extends BaseService { + /** + * 文件上传模式 + */ + uploadMode() { + return this.request({ + url: "/uploadMode" + }); + } + + /** + * 文件上传,如果模式是 cloud,返回对应参数 + * + * @returns + * @memberof CommonService + */ + upload(params) { + return this.request({ + url: "/upload", + method: "POST", + params + }); + } + + /** + * 用户退出 + */ + userLogout() { + return this.request({ + url: "/logout", + method: "POST" + }); + } + + /** + * 用户信息 + * + * @returns + * @memberof CommonService + */ + userInfo() { + return this.request({ + url: "/person" + }); + } + + /** + * 用户信息修改 + * + * @param {*} params + * @returns + * @memberof CommonService + */ + userUpdate(params) { + return this.request({ + url: "/personUpdate", + method: "POST", + data: { + ...params + } + }); + } + + /** + * 权限信息 + * + * @returns + * @memberof CommonService + */ + permMenu() { + return this.request({ + url: "/permmenu" + }); + } +} + +export default Common; diff --git a/cool/components/base/service/dept.js b/cool/components/base/service/dept.js new file mode 100644 index 0000000..fb77c36 --- /dev/null +++ b/cool/components/base/service/dept.js @@ -0,0 +1,15 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("sys/department") +class SysDepartment extends BaseService { + @Permission("order") + order(data) { + return this.request({ + url: "/order", + method: "POST", + data + }); + } +} + +export default SysDepartment; diff --git a/cool/components/base/service/index.js b/cool/components/base/service/index.js new file mode 100644 index 0000000..b076d8f --- /dev/null +++ b/cool/components/base/service/index.js @@ -0,0 +1,21 @@ +import Common from "./common"; +import Open from "./open"; +import SysUser from "./user"; +import SysMenu from "./menu"; +import SysRole from "./role"; +import SysDept from "./dept"; +import PluginInfo from "./plugin"; + +export default { + common: new Common(), + open: new Open(), + system: { + user: new SysUser(), + menu: new SysMenu(), + role: new SysRole(), + dept: new SysDept() + }, + plugin: { + info: new PluginInfo() + } +}; diff --git a/cool/components/base/service/menu.js b/cool/components/base/service/menu.js new file mode 100644 index 0000000..e866c19 --- /dev/null +++ b/cool/components/base/service/menu.js @@ -0,0 +1,6 @@ +import { BaseService, Service } from "cl-admin"; + +@Service("sys/menu") +class SysMenu extends BaseService {} + +export default SysMenu; diff --git a/cool/components/base/service/open.js b/cool/components/base/service/open.js new file mode 100644 index 0000000..4dddacb --- /dev/null +++ b/cool/components/base/service/open.js @@ -0,0 +1,56 @@ +import { BaseService, Service } from "cl-admin"; + +@Service("open") +class Open extends BaseService { + /** + * 用户登录 + * + * @param {*} { username, password, captchaId, verifyCode } + * @returns + * @memberof CommonService + */ + userLogin({ username, password, captchaId, verifyCode }) { + return this.request({ + url: "/login", + method: "POST", + data: { + username, + password, + captchaId, + verifyCode + } + }); + } + + /** + * 图片验证码 svg + * + * @param {*} { height, width } + * @returns + * @memberof CommonService + */ + captcha({ height, width }) { + return this.request({ + url: "/captcha", + params: { + height, + width + } + }); + } + + /** + * 刷新 token + * @param {string} token + */ + refreshToken(token) { + return this.request({ + url: "/refreshToken", + params: { + refreshToken: token + } + }); + } +} + +export default Open; diff --git a/cool/components/base/service/plugin.js b/cool/components/base/service/plugin.js new file mode 100644 index 0000000..d3bef7d --- /dev/null +++ b/cool/components/base/service/plugin.js @@ -0,0 +1,32 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("plugin/info") +class PluginInfo extends BaseService { + @Permission("config") + config(data) { + return this.request({ + url: "/config", + method: "POST", + data + }); + } + + @Permission("getConfig") + getConfig(params) { + return this.request({ + url: "/getConfig", + params + }); + } + + @Permission("enable") + enable(data) { + return this.request({ + url: "/enable", + method: "POST", + data + }); + } +} + +export default PluginInfo; diff --git a/cool/components/base/service/role.js b/cool/components/base/service/role.js new file mode 100644 index 0000000..05d8de0 --- /dev/null +++ b/cool/components/base/service/role.js @@ -0,0 +1,6 @@ +import { BaseService, Service } from "cl-admin"; + +@Service("sys/role") +class SysRole extends BaseService {} + +export default SysRole; diff --git a/cool/components/base/service/user.js b/cool/components/base/service/user.js new file mode 100644 index 0000000..9819a95 --- /dev/null +++ b/cool/components/base/service/user.js @@ -0,0 +1,15 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("sys/user") +class SysUser extends BaseService { + @Permission("move") + move(data) { + return this.request({ + url: "/move", + method: "POST", + data + }); + } +} + +export default SysUser; diff --git a/cool/components/base/static/css/index.scss b/cool/components/base/static/css/index.scss new file mode 100644 index 0000000..1dd00b9 --- /dev/null +++ b/cool/components/base/static/css/index.scss @@ -0,0 +1 @@ +@import "./theme.scss"; diff --git a/cool/components/base/static/css/theme.scss b/cool/components/base/static/css/theme.scss new file mode 100644 index 0000000..4ab24dc --- /dev/null +++ b/cool/components/base/static/css/theme.scss @@ -0,0 +1,126 @@ +// customize style +.scroller1 { + overflow: hidden auto; + position: relative; + z-index: 9; + + &::-webkit-scrollbar-track { + background: transparent; + } + + &::-webkit-scrollbar-thumb { + background-color: rgba(144, 147, 153, 0.3); + border-radius: 6px; + } + + &::-webkit-scrollbar { + height: 6px; + width: 6px; + } +} + +// Element-ui theme +.el-input-number { + .el-input-number__decrease, + .el-input-number__increase { + border: 0 !important; + background-color: transparent; + } +} + +.el-dialog { + .el-dialog__header { + padding: 10px; + text-align: center; + border-bottom: 1px solid #f7f7f7; + + .el-dialog__title { + font-size: 15px; + letter-spacing: 0.5px; + } + + .el-dialog__headerbtn { + top: 13px; + + .el-dialog__close { + font-size: 18px; + } + } + } + + .el-dialog__body { + padding: 20px; + } + + .el-dialog__footer { + padding-bottom: 15px; + } +} + +.el-message { + &.el-message--success, + &.el-message--error, + &.el-message--info, + &.el-message--warning { + min-width: auto; + background-color: #fff; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + border: 0; + padding: 12px 20px 12px 15px; + + .el-message__icon { + font-size: 16px; + } + + .el-message__content { + color: #999; + } + } +} + +.el-table { + &__header { + th { + padding: 0 !important; + background-color: #ebeef5 !important; + height: 36px; + line-height: 36px; + } + + .cell { + color: $color-main; + font-weight: normal; + } + } + + &__body { + &-wrapper { + @media only screen and (max-width: 768px) { + &::-webkit-scrollbar { + height: 6px; + width: 6px; + } + } + } + } + + &__column { + &-filter-trigger { + margin-left: 5px; + } + } + + &-column--selection { + .cell { + padding: 0 14px !important; + } + } +} + +.el-table-filter { + margin-top: 5px !important; + + .el-checkbox__label { + font-size: 12px; + } +} diff --git a/cool/components/base/static/images/default-avatar.png b/cool/components/base/static/images/default-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..1ede40f529b013d4e4bbcc06241249d082512971 GIT binary patch literal 3991 zcmY*cc{mha7rrxwVT2hihAe|DBb0q9jD6oG6xj+{vSiny8Cxk!WRSAg&{*adDIulE zP9#aPO*EDy+sHC})1TiTcX^)sJm;SGyyu+z-aB?SraTBC1OR}?+{_5iT8aM#CkJb8 z)xFRI0H3?Lk-kHW`;r@X>M>)%z5T+`g4w8h1r>$%&^Ma)t%h7EB+?-xHy-);`<>H? ze~?m$X$5o}CVy4)Pm+YuAqcxfr(wenD9!xy8P&V_Fr>{%(Vp>$$mQnf=*FJiEJ5YK zsQOAV$8jAE!l#BL%Jw4RhTF!-Vo0KH(9n^VAeWsts{`;Bb>4VgunoSpD?Cf9oLq+d z-*!%iJEpK+1^oK8vj;T_Wb%Lz2yyy195w$|-=cvFsDCmfNJ=o9gn*MI&2l{&39DS( z*sg58R9!d+5lU;PCdXv>IGb8x^-2cKc_nlY!QOo;DJePJ+S-}~H@X0sx;ioaW|?pR z@EWvjUXIwVsv?u_ozHpkev?Ul;S%I?MEO|Ib31@E5atByIbvzaO)`$Uv)ji}E19Kn zB}i~Zm~I6$c~G0yqyCLwQRtg(=$#rW$0ypO%b-q#aLLK-2Et@d2YheS+BZhLu6x!g z1+KNM3>Cbn<4L?-7o!9ja)q=+jwg^w0&FcPu88g+N2AvwAm?QJUZ#L}ID}YJQ={Q1 zmz_c;(PuxLY@Er!2Xhb?6?!BvF^%8sXCG++7R)X(eqI?n+vJ$^J2Pw_O8k(&cB=NX zj0!Nr(i^Bd*5EHbhoe(}Y?7AmaX(u)53sJ}Gskvq?f8;o`oG0~-DIw@;ctIP{V zB0pX}MQEw3y&BAi@?W05(f*YwJ*$cU;%$8Zm!ci}@Bw9_&FFM_y_{pOA%j1-%8W?1RC|h%@ zbAC9Y_>7DKi^~DwqA%-dpITaQJuB;99!Z4l&CDDN9B+J~=I!?+E22uMjF*Kq30z4t zG3@PpDExLjYAi39vBBWvgh8)GWU>;

o)CXr@RGBqAe>7B&14Pv0NEOpop{gZ%i} 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 literal 0 HcmV?d00001 diff --git a/cool/components/base/static/images/logo.png b/cool/components/base/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..035b79c207d1155c3dad43d5226cd1d4cac3e7ef GIT binary patch literal 4528 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 state.info, + // 应用配置 + conf: (state) => state.conf, + // 浏览器信息 + browser: (state) => state.browser, + // 左侧菜单是否收起 + menuCollapse: (state) => state.collapse, + // 上传配置 + upload: (state) => state.upload + }, + actions: { + appLoad({ getters, dispatch }) { + if (getters.token) { + // 读取菜单权限 + dispatch("permMenu"); + // 获取用户信息 + dispatch("userInfo"); + // 设置上传配置 + dispatch("setUpload"); + } + }, + setUpload({ state }) { + this.$service.common.uploadMode().then((res) => { + state.upload = res; + }); + } + }, + mutations: { + SET_BROWSER(state) { + state.browser = getBrowser(); + }, + + COLLAPSE_MENU(state, val = false) { + state.collapse = val; + } + } +}; diff --git a/cool/components/base/store/component.js b/cool/components/base/store/component.js new file mode 100644 index 0000000..59d8f72 --- /dev/null +++ b/cool/components/base/store/component.js @@ -0,0 +1,33 @@ +export default { + state: { + info: {}, + list: [], + modules: [] + }, + + getters: { + // 组件信息 + components: (state) => state.info, + // 组件列表 + componentList: (state) => state.list, + // 组件模块 + componentModules: (state) => state.modules + }, + + mutations: { + SET_COMPONENT(state, list) { + let d = {}; + + list.forEach((e) => { + d[e.name] = e; + }); + + state.list = list; + state.info = d; + }, + + SET_COMPONENT_MODULES(state, list) { + state.modules = list; + } + } +}; diff --git a/cool/components/base/store/index.js b/cool/components/base/store/index.js new file mode 100644 index 0000000..ab8c304 --- /dev/null +++ b/cool/components/base/store/index.js @@ -0,0 +1,7 @@ +import user from "./user"; +import app from "./app"; +import process from "./process"; +import component from "./component"; +import menu from "./menu"; + +export default { user, app, process, component, menu }; diff --git a/cool/components/base/store/menu.js b/cool/components/base/store/menu.js new file mode 100644 index 0000000..0279aed --- /dev/null +++ b/cool/components/base/store/menu.js @@ -0,0 +1,152 @@ +import store from "store"; +import { Message } from "element-ui"; +import { deepTree, revDeepTree, isArray, isEmpty } from "cl-admin/utils"; +import { revisePath } from "cool/components/base/utils"; +import router from "@/router"; +import { menuList } from "@/config/env"; + +export default { + state: { + // 视图路由,type=1 + routes: store.get("viewRoutes") || [], + // 树形菜单 + group: store.get("menuGroup") || [], + // showAMenu 模式下,顶级菜单的序号 + index: 0, + // 左侧菜单 + menu: [], + // 权限列表 + permission: [] + }, + getters: { + // 树形菜单列表 + menuGroup: (state) => state.group, + // 左侧菜单 + menuList: (state) => state.menu, + // 视图路由 + routes: (state) => state.routes, + // 权限列表 + permission: (state) => state.permission + }, + actions: { + // 设置菜单、权限 + permMenu({ commit, state, getters }) { + return new Promise((resolve, reject) => { + const next = (res) => { + if (!isArray(res.menus)) { + res.menus = []; + } + + if (!isArray(res.perms)) { + res.perms = []; + } + + const routes = res.menus + .filter((e) => e.type != 2) + .map((e) => { + let r = { + moduleName: + e.moduleName || (e.router || "").substr(1).replace(/\//g, "-"), + id: e.id, + parentId: e.parentId, + path: revisePath(e.router || e.id), + viewPath: e.viewPath, + type: e.type, + name: e.name, + icon: e.icon, + orderNum: e.orderNum, + isShow: isEmpty(e.isShow) ? true : e.isShow, + meta: { + label: e.name, + keepAlive: e.keepAlive + }, + children: [] + }; + + // 匹配存储的组件模块 + let m = getters.componentModules.find( + (m) => m.moduleName === r.moduleName + ); + + if (m) { + // 注册组件实例 + r.component = m.component; + } + + return r; + }); + + // 转成树形菜单 + const menuGroup = deepTree(routes); + + // 设置权限 + commit("SET_PERMIESSION", res.perms); + // 设置菜单组 + commit("SET_MENU_GROUP", menuGroup); + // 设置视图路由 + commit( + "SET_VIEW_ROUTES", + routes.filter((e) => e.type == 1) + ); + // 设置菜单 + commit("SET_MENU_LIST", state.index); + + resolve(menuGroup); + }; + + // 监测自定义菜单 + if (!getters.conf.customMenu) { + this.$service.common + .permMenu() + .then((res) => { + next(res); + }) + .catch((err) => { + Message.error("菜单加载异常"); + console.error(err); + reject(err); + }); + } else { + next({ + menus: revDeepTree(menuList) + }); + } + }); + } + }, + mutations: { + // 设置树形菜单列表 + SET_MENU_GROUP(state, list) { + state.group = list; + store.set("menuGroup", list); + }, + + // 设置视图路由 + SET_VIEW_ROUTES(state, list) { + router.$plugin.addViews(list); + + state.routes = list; + store.set("viewRoutes", list); + }, + + // 设置左侧菜单 + SET_MENU_LIST(state, index) { + const { showAMenu } = this.getters.conf; + + if (showAMenu) { + const { children = [] } = state.group[index] || {}; + + state.index = index; + state.menu = children; + } else { + state.menu = state.group; + } + }, + + // 设置权限 + SET_PERMIESSION(state, list) { + state.permission = list; + store.set("permission", list); + } + } +}; diff --git a/cool/components/base/store/process.js b/cool/components/base/store/process.js new file mode 100644 index 0000000..d6f163c --- /dev/null +++ b/cool/components/base/store/process.js @@ -0,0 +1,57 @@ +const fMenu = { + label: "首页", + value: "/", + active: true +}; + +export default { + state: { + list: [fMenu] + }, + getters: { + // 窗口列表 + processList: (state) => state.list + }, + mutations: { + ADD_PROCESS(state, item) { + const index = state.list.findIndex( + (e) => e.value.split("?")[0] === item.value.split("?")[0] + ); + + state.list.map((e) => { + e.active = e.value == item.value; + }); + + if (index < 0) { + if (item.value == "/") { + item.label = fMenu.label; + } + + if (item.label) { + state.list.push({ + ...item, + active: true + }); + } + } else { + state.list[index].active = true; + state.list[index].label = item.label; + state.list[index].value = item.value; + } + }, + + DEL_PROCESS(state, index) { + if (index != 0) { + state.list.splice(index, 1); + } + }, + + SET_PROCESS(state, list) { + state.list = list; + }, + + RESET_PROCESS(state) { + state.list = [fMenu]; + } + } +}; diff --git a/cool/components/base/store/user.js b/cool/components/base/store/user.js new file mode 100644 index 0000000..0f05e3a --- /dev/null +++ b/cool/components/base/store/user.js @@ -0,0 +1,103 @@ +import { storage, href } from "cl-admin/utils"; + +// 用户信息 +let info = storage.get("userInfo") || {}; +// 授权标识 +let token = storage.get("token") || null; + +export default { + state: { + token, + info + }, + getters: { + userInfo: (state) => state.info, + token: (state) => state.token + }, + actions: { + // 用户登录 + userLogin({ commit }, form) { + return this.$service.open.userLogin(form).then((res) => { + commit("SET_TOKEN", res); + return res; + }); + }, + + // 用户退出 + userLogout({ dispatch }) { + return new Promise((resolve) => { + this.$service.common.userLogout().done(() => { + dispatch("userRemove").then(() => { + resolve(); + }); + }); + }); + }, + + // 用户信息 + userInfo({ commit }) { + return this.$service.common.userInfo().then((res) => { + commit("SET_USERINFO", res); + return res; + }); + }, + + // 用户移除 + userRemove({ commit }) { + console.log(222); + commit("CLEAR_USER"); + commit("CLEAR_TOKEN"); + commit("RESET_PROCESS"); + commit("SET_MENU_GROUP", []); + commit("SET_VIEW_ROUTES", []); + commit("SET_MENU_LIST", 0); + }, + + // 刷新token + refreshToken({ commit, dispatch }) { + return new Promise((resolve, reject) => { + this.$service.open + .refreshToken(storage.get("refreshToken")) + .then((res) => { + commit("SET_TOKEN", res); + resolve(res.token); + }) + .catch((err) => { + dispatch("userRemove"); + href("/login"); + reject(err); + }); + }); + } + }, + mutations: { + // 设置用户信息 + SET_USERINFO(state, val) { + state.info = val; + storage.set("userInfo", val); + }, + + // 设置授权标识 + SET_TOKEN(state, { token, expire, refreshToken, refreshExpire }) { + // 请求的唯一标识 + state.token = token; + storage.set("token", token, expire); + + // 刷新 token 的唯一标识 + storage.set("refreshToken", refreshToken, refreshExpire); + }, + + // 移除授权标识 + CLEAR_TOKEN(state) { + state.token = null; + storage.remove("token"); + storage.remove("refreshToken"); + }, + + // 移除用户信息 + CLEAR_USER(state) { + state.info = {}; + storage.remove("userInfo"); + } + } +}; diff --git a/cool/components/base/utils/index.js b/cool/components/base/utils/index.js new file mode 100644 index 0000000..2f50527 --- /dev/null +++ b/cool/components/base/utils/index.js @@ -0,0 +1,31 @@ +export const revisePath = (path) => { + if (!path) { + return ""; + } + + if (path[0] == "/") { + return path; + } else { + return `/${path}`; + } +}; + +export function firstMenu(list) { + let path = ""; + + const fn = (arr) => { + arr.forEach((e) => { + if (e.type == 1) { + if (!path) { + path = e.path; + } + } else { + fn(e.children); + } + }); + }; + + fn(list); + + return path || "/404"; +} diff --git a/cool/components/base/views/index.js b/cool/components/base/views/index.js new file mode 100644 index 0000000..5c92f33 --- /dev/null +++ b/cool/components/base/views/index.js @@ -0,0 +1,35 @@ +export default [ + { + label: "个人中心", + path: "/my/info", + component: () => import("./info") + }, + { + moduleName: "sys-user", + label: "用户列表", + path: "/sys/user", + icon: "icon-user", + component: () => import("./user") + }, + { + moduleName: "sys-menu", + label: "菜单列表", + path: "/sys/menu", + icon: "icon-menu", + component: () => import("./menu") + }, + { + moduleName: "sys-role", + label: "角色列表", + path: "/sys/role", + icon: "icon-common", + component: () => import("./role") + }, + { + moduleName: "plugin", + label: "插件列表", + path: "/plugin", + icon: "icon-menu", + component: () => import("./plugin") + } +]; diff --git a/cool/components/base/views/info.vue b/cool/components/base/views/info.vue new file mode 100644 index 0000000..32a3eda --- /dev/null +++ b/cool/components/base/views/info.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/cool/components/base/views/menu.vue b/cool/components/base/views/menu.vue new file mode 100644 index 0000000..d643ac4 --- /dev/null +++ b/cool/components/base/views/menu.vue @@ -0,0 +1,391 @@ + + + diff --git a/cool/components/base/views/plugin.vue b/cool/components/base/views/plugin.vue new file mode 100644 index 0000000..0120af9 --- /dev/null +++ b/cool/components/base/views/plugin.vue @@ -0,0 +1,238 @@ + + + diff --git a/cool/components/base/views/role.vue b/cool/components/base/views/role.vue new file mode 100644 index 0000000..28a1ec9 --- /dev/null +++ b/cool/components/base/views/role.vue @@ -0,0 +1,163 @@ + + + diff --git a/cool/components/base/views/user.vue b/cool/components/base/views/user.vue new file mode 100644 index 0000000..81d06ea --- /dev/null +++ b/cool/components/base/views/user.vue @@ -0,0 +1,544 @@ + + + + + diff --git a/cool/components/chat/components/box.vue b/cool/components/chat/components/box.vue new file mode 100644 index 0000000..62f7eb4 --- /dev/null +++ b/cool/components/chat/components/box.vue @@ -0,0 +1,807 @@ + + + + + diff --git a/cool/components/chat/components/emoji.vue b/cool/components/chat/components/emoji.vue new file mode 100644 index 0000000..6e9ace2 --- /dev/null +++ b/cool/components/chat/components/emoji.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/cool/components/chat/components/icon-voice.vue b/cool/components/chat/components/icon-voice.vue new file mode 100644 index 0000000..f08a09d --- /dev/null +++ b/cool/components/chat/components/icon-voice.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/cool/components/chat/components/index.js b/cool/components/chat/components/index.js new file mode 100644 index 0000000..1fb09af --- /dev/null +++ b/cool/components/chat/components/index.js @@ -0,0 +1,4 @@ +import ChatBox from "./box"; +import Notice from "./notice"; + +export default { ChatBox, Notice }; diff --git a/cool/components/chat/components/message.vue b/cool/components/chat/components/message.vue new file mode 100644 index 0000000..450dc4b --- /dev/null +++ b/cool/components/chat/components/message.vue @@ -0,0 +1,345 @@ + + + + + diff --git a/cool/components/chat/components/notice.vue b/cool/components/chat/components/notice.vue new file mode 100644 index 0000000..df0b6dc --- /dev/null +++ b/cool/components/chat/components/notice.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/cool/components/chat/index.js b/cool/components/chat/index.js new file mode 100644 index 0000000..532ee77 --- /dev/null +++ b/cool/components/chat/index.js @@ -0,0 +1,4 @@ +import components from "./components"; +import service from "./service"; + +export default { components, service }; diff --git a/cool/components/chat/package.json b/cool/components/chat/package.json new file mode 100644 index 0000000..3b674eb --- /dev/null +++ b/cool/components/chat/package.json @@ -0,0 +1,10 @@ +{ + "name": "chat", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "dayjs": "^1.10.4", + "socket.io-client": "^3.1.1" + } +} diff --git a/cool/components/chat/service/index.js b/cool/components/chat/service/index.js new file mode 100644 index 0000000..5764dc9 --- /dev/null +++ b/cool/components/chat/service/index.js @@ -0,0 +1,9 @@ +import ImMessage from "./message"; +import ImSession from "./session"; + +export default { + im: { + message: new ImMessage(), + session: new ImSession() + } +}; diff --git a/cool/components/chat/service/message.js b/cool/components/chat/service/message.js new file mode 100644 index 0000000..6e0185d --- /dev/null +++ b/cool/components/chat/service/message.js @@ -0,0 +1,15 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("app/im/message") +class ImMessage extends BaseService { + @Permission("read") + read(data) { + return this.request({ + url: "/read", + method: "POST", + data + }); + } +} + +export default ImMessage; diff --git a/cool/components/chat/service/session.js b/cool/components/chat/service/session.js new file mode 100644 index 0000000..ce436a7 --- /dev/null +++ b/cool/components/chat/service/session.js @@ -0,0 +1,13 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("app/im/session") +class ImSession extends BaseService { + @Permission("unreadCount") + unreadCount() { + return this.request({ + url: "/unreadCount" + }); + } +} + +export default ImSession; diff --git a/cool/components/chat/static/images/custom-avatar.png b/cool/components/chat/static/images/custom-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c80f7990faff0e8ac890382981da28abb1f5d GIT binary patch literal 4177 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 literal 0 HcmV?d00001 diff --git a/cool/components/chat/static/images/video.png b/cool/components/chat/static/images/video.png new file mode 100644 index 0000000000000000000000000000000000000000..80dd1be042c76dd7ade2309668dc50ecaba51f12 GIT binary patch literal 724 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 ZL4kF3{7F-tINd8-aqxG;^MAaa{|D^0TLl0B literal 0 HcmV?d00001 diff --git a/cool/components/chat/utils/index.js b/cool/components/chat/utils/index.js new file mode 100644 index 0000000..0a7140b --- /dev/null +++ b/cool/components/chat/utils/index.js @@ -0,0 +1,31 @@ +import { isObject } from "cl-admin/utils"; + +export function parseContent({ content, contentType }) { + let data = isObject(content) ? content : JSON.parse(content); + let text = ""; + + switch (contentType) { + case 0: + text = data.text; + break; + case 1: + text = "[图片]"; + break; + case 2: + text = "[表情]"; + break; + case 3: + text = "[语音]"; + break; + case 4: + text = "[视频]"; + break; + case 5: + text = "[商品信息]"; + break; + } + + data._text = text; + + return data; +} diff --git a/cool/components/codemirror/components/index.vue b/cool/components/codemirror/components/index.vue new file mode 100644 index 0000000..6e97848 --- /dev/null +++ b/cool/components/codemirror/components/index.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/cool/components/codemirror/index.js b/cool/components/codemirror/index.js new file mode 100644 index 0000000..0878c4e --- /dev/null +++ b/cool/components/codemirror/index.js @@ -0,0 +1,7 @@ +import Codemirror from "./components"; + +export default { + components: { + Codemirror + } +}; diff --git a/cool/components/codemirror/package.json b/cool/components/codemirror/package.json new file mode 100644 index 0000000..7cb4639 --- /dev/null +++ b/cool/components/codemirror/package.json @@ -0,0 +1,11 @@ +{ + "name": "codemirror", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "codemirror": "^5.59.2", + "js-beautify": "^1.13.5", + "vue-codemirror": "^4.0.6" + } +} diff --git a/cool/components/copy/directives/index.js b/cool/components/copy/directives/index.js new file mode 100644 index 0000000..a51d939 --- /dev/null +++ b/cool/components/copy/directives/index.js @@ -0,0 +1,28 @@ +import { Message } from "element-ui"; +import Clipboard from "clipboard"; + +function copyboard() { + const clipboard = new Clipboard("._copy-btn"); + + clipboard.on("success", (e) => { + Message.success("复制成功"); + e.clearSelection(); + }); + + clipboard.on("error", (err) => { + console.error(err); + Message.success("复制失败"); + }); +} + +copyboard(); + +export default { + inserted: (el, binding) => { + el.className = el.className + " _copy-btn"; + el.setAttribute("data-clipboard-text", binding.value); + }, + update: (el, binding) => { + el.setAttribute("data-clipboard-text", binding.value); + } +}; diff --git a/cool/components/copy/index.js b/cool/components/copy/index.js new file mode 100644 index 0000000..c93b2bd --- /dev/null +++ b/cool/components/copy/index.js @@ -0,0 +1,7 @@ +import copy from "./directives"; + +export default { + directives: { + copy + } +}; diff --git a/cool/components/copy/package.json b/cool/components/copy/package.json new file mode 100644 index 0000000..818daa5 --- /dev/null +++ b/cool/components/copy/package.json @@ -0,0 +1,10 @@ +{ + "name": "copy", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "clipboard": "^2.0.6", + "tape": "^5.1.1" + } +} diff --git a/cool/components/demo/index.js b/cool/components/demo/index.js new file mode 100644 index 0000000..3c5dcb8 --- /dev/null +++ b/cool/components/demo/index.js @@ -0,0 +1,5 @@ +import views from './views' + +export default { + views +}; diff --git a/cool/components/demo/package.json b/cool/components/demo/package.json new file mode 100644 index 0000000..7859683 --- /dev/null +++ b/cool/components/demo/package.json @@ -0,0 +1,9 @@ +{ + "name": "demo", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "dayjs": "^1.10.4" + } +} diff --git a/cool/components/demo/utils/service.js b/cool/components/demo/utils/service.js new file mode 100644 index 0000000..4ad2503 --- /dev/null +++ b/cool/components/demo/utils/service.js @@ -0,0 +1,107 @@ +import dayjs from 'dayjs' + +let id = 10 + +export const UserList = [ + { + id: 1, + name: "刘一", + createTime: "2019年09月02日", + price: 75.99, + status: 1 + }, + { + id: 2, + name: "陈二", + createTime: "2019年09月05日", + price: 242.1, + status: 1 + }, + { + id: 3, + name: "张三", + createTime: "2019年09月12日", + price: 74.11, + status: 0 + }, + { + id: 4, + name: "李四", + createTime: "2019年09月13日", + price: 276.64, + status: 0 + }, + { + id: 5, + name: "王五", + createTime: "2019年09月18日", + price: 160.23, + status: 1 + } +]; + +export const TestService = { + page: (p) => { + console.log("GET[page]", p); + console.log(p) + + let total = 0 + + let list = UserList.filter((e, i) => { + if (p.name) { + return e.name.includes(p.name) + } + + if (![undefined, null, ''].includes(p.status)) { + return e.status === p.status + } + + total++ + + if (i >= (p.page - 1) * p.size && i < p.page * p.size) { + return true + } else { + return false + } + }) + + return Promise.resolve({ + list, + pagination: { + page: p.page, + size: p.size, + total + } + }); + }, + info: (d) => { + console.log("GET[info]", d); + return new Promise((resolve) => { + resolve(UserList.find(e.id == d.id)); + }); + }, + add: (d) => { + console.log("POST[add]", d); + UserList.push({ + ...d, + id: id++, + createTime: dayjs().format('YYYY年MM月DD日') + }) + return Promise.resolve(); + }, + delete: (d) => { + console.log("POST[delete]", d); + let ids = d.ids.split(',') + ids.forEach(id => { + const index = UserList.findIndex(e => e.id == id) + UserList.splice(index, 1) + }) + return Promise.resolve(); + }, + update: (d) => { + console.log("POST[update]", d); + let item = UserList.find(e => e.id == d.id) + Object.assign(item, d) + return Promise.resolve(); + } +}; diff --git a/cool/components/demo/views/components/b-cl-context-menu.vue b/cool/components/demo/views/components/b-cl-context-menu.vue new file mode 100644 index 0000000..d5e031c --- /dev/null +++ b/cool/components/demo/views/components/b-cl-context-menu.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/cool/components/demo/views/components/b-cl-crud.vue b/cool/components/demo/views/components/b-cl-crud.vue new file mode 100644 index 0000000..fcc1352 --- /dev/null +++ b/cool/components/demo/views/components/b-cl-crud.vue @@ -0,0 +1,14 @@ + diff --git a/cool/components/demo/views/components/b-cl-editor-quill.vue b/cool/components/demo/views/components/b-cl-editor-quill.vue new file mode 100644 index 0000000..36f7166 --- /dev/null +++ b/cool/components/demo/views/components/b-cl-editor-quill.vue @@ -0,0 +1,14 @@ + diff --git a/cool/components/demo/views/components/b-cl-form.vue b/cool/components/demo/views/components/b-cl-form.vue new file mode 100644 index 0000000..3b047aa --- /dev/null +++ b/cool/components/demo/views/components/b-cl-form.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/cool/components/demo/views/components/b-cl-upload.vue b/cool/components/demo/views/components/b-cl-upload.vue new file mode 100644 index 0000000..502efbb --- /dev/null +++ b/cool/components/demo/views/components/b-cl-upload.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/cool/components/demo/views/components/b-error-page.vue b/cool/components/demo/views/components/b-error-page.vue new file mode 100644 index 0000000..86ce9ac --- /dev/null +++ b/cool/components/demo/views/components/b-error-page.vue @@ -0,0 +1,29 @@ + + + diff --git a/cool/components/demo/views/components/b-icon-svg.vue b/cool/components/demo/views/components/b-icon-svg.vue new file mode 100644 index 0000000..2bd9d41 --- /dev/null +++ b/cool/components/demo/views/components/b-icon-svg.vue @@ -0,0 +1,26 @@ + + + diff --git a/cool/components/demo/views/components/b-v-copy.vue b/cool/components/demo/views/components/b-v-copy.vue new file mode 100644 index 0000000..5c73373 --- /dev/null +++ b/cool/components/demo/views/components/b-v-copy.vue @@ -0,0 +1,18 @@ + diff --git a/cool/components/demo/views/crud.vue b/cool/components/demo/views/crud.vue new file mode 100644 index 0000000..9b3b257 --- /dev/null +++ b/cool/components/demo/views/crud.vue @@ -0,0 +1,613 @@ + + + diff --git a/cool/components/demo/views/demo.vue b/cool/components/demo/views/demo.vue new file mode 100644 index 0000000..f5cfcba --- /dev/null +++ b/cool/components/demo/views/demo.vue @@ -0,0 +1,215 @@ + + + + + diff --git a/cool/components/demo/views/editor-quill.vue b/cool/components/demo/views/editor-quill.vue new file mode 100644 index 0000000..b662b95 --- /dev/null +++ b/cool/components/demo/views/editor-quill.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/cool/components/demo/views/index.js b/cool/components/demo/views/index.js new file mode 100644 index 0000000..97e2dbf --- /dev/null +++ b/cool/components/demo/views/index.js @@ -0,0 +1,26 @@ +export default [ + { + moduleName: "crud", + label: "crud 示例", + path: "/crud", + component: () => import("./crud") + }, + { + moduleName: "editor-quill", + label: "quill 富文本编辑器", + path: "/editor-quill", + component: () => import("./editor-quill") + }, + { + moduleName: "upload", + label: "文件上传", + path: "/upload", + component: () => import("./upload") + }, + { + moduleName: "demo", + label: "组件预览", + path: "/demo", + component: () => import("./demo") + } +]; diff --git a/cool/components/demo/views/upload.vue b/cool/components/demo/views/upload.vue new file mode 100644 index 0000000..e62d159 --- /dev/null +++ b/cool/components/demo/views/upload.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/cool/components/distpicker/components/data.json b/cool/components/distpicker/components/data.json new file mode 100644 index 0000000..4d5647f --- /dev/null +++ b/cool/components/distpicker/components/data.json @@ -0,0 +1,5312 @@ +[ + { + "code": "11", + "name": "北京市", + "children": [ + { + "code": "1101", + "name": "市辖区", + "children": [ + { "code": "110101", "name": "东城区" }, + { "code": "110102", "name": "西城区" }, + { "code": "110105", "name": "朝阳区" }, + { "code": "110106", "name": "丰台区" }, + { "code": "110107", "name": "石景山区" }, + { "code": "110108", "name": "海淀区" }, + { "code": "110109", "name": "门头沟区" }, + { "code": "110111", "name": "房山区" }, + { "code": "110112", "name": "通州区" }, + { "code": "110113", "name": "顺义区" }, + { "code": "110114", "name": "昌平区" }, + { "code": "110115", "name": "大兴区" }, + { "code": "110116", "name": "怀柔区" }, + { "code": "110117", "name": "平谷区" }, + { "code": "110118", "name": "密云区" }, + { "code": "110119", "name": "延庆区" } + ] + } + ] + }, + { + "code": "12", + "name": "天津市", + "children": [ + { + "code": "1201", + "name": "市辖区", + "children": [ + { "code": "120101", "name": "和平区" }, + { "code": "120102", "name": "河东区" }, + { "code": "120103", "name": "河西区" }, + { "code": "120104", "name": "南开区" }, + { "code": "120105", "name": "河北区" }, + { "code": "120106", "name": "红桥区" }, + { "code": "120110", "name": "东丽区" }, + { "code": "120111", "name": "西青区" }, + { "code": "120112", "name": "津南区" }, + { "code": "120113", "name": "北辰区" }, + { "code": "120114", "name": "武清区" }, + { "code": "120115", "name": "宝坻区" }, + { "code": "120116", "name": "滨海新区" }, + { "code": "120117", "name": "宁河区" }, + { "code": "120118", "name": "静海区" }, + { "code": "120119", "name": "蓟州区" } + ] + } + ] + }, + { + "code": "13", + "name": "河北省", + "children": [ + { + "code": "1301", + "name": "石家庄市", + "children": [ + { "code": "130102", "name": "长安区" }, + { "code": "130104", "name": "桥西区" }, + { "code": "130105", "name": "新华区" }, + { "code": "130107", "name": "井陉矿区" }, + { "code": "130108", "name": "裕华区" }, + { "code": "130109", "name": "藁城区" }, + { "code": "130110", "name": "鹿泉区" }, + { "code": "130111", "name": "栾城区" }, + { "code": "130121", "name": "井陉县" }, + { "code": "130123", "name": "正定县" }, + { "code": "130125", "name": "行唐县" }, + { "code": "130126", "name": "灵寿县" }, + { "code": "130127", "name": "高邑县" }, + { "code": "130128", "name": "深泽县" }, + { "code": "130129", "name": "赞皇县" }, + { "code": "130130", "name": "无极县" }, + { "code": "130131", "name": "平山县" }, + { "code": "130132", "name": "元氏县" }, + { "code": "130133", "name": "赵县" }, + { "code": "130171", "name": "石家庄高新技术产业开发区" }, + { "code": "130172", "name": "石家庄循环化工园区" }, + { "code": "130181", "name": "辛集市" }, + { "code": "130183", "name": "晋州市" }, + { "code": "130184", "name": "新乐市" } + ] + }, + { + "code": "1302", + "name": "唐山市", + "children": [ + { "code": "130202", "name": "路南区" }, + { "code": "130203", "name": "路北区" }, + { "code": "130204", "name": "古冶区" }, + { "code": "130205", "name": "开平区" }, + { "code": "130207", "name": "丰南区" }, + { "code": "130208", "name": "丰润区" }, + { "code": "130209", "name": "曹妃甸区" }, + { "code": "130224", "name": "滦南县" }, + { "code": "130225", "name": "乐亭县" }, + { "code": "130227", "name": "迁西县" }, + { "code": "130229", "name": "玉田县" }, + { "code": "130271", "name": "河北唐山芦台经济开发区" }, + { "code": "130272", "name": "唐山市汉沽管理区" }, + { "code": "130273", "name": "唐山高新技术产业开发区" }, + { "code": "130274", "name": "河北唐山海港经济开发区" }, + { "code": "130281", "name": "遵化市" }, + { "code": "130283", "name": "迁安市" }, + { "code": "130284", "name": "滦州市" } + ] + }, + { + "code": "1303", + "name": "秦皇岛市", + "children": [ + { "code": "130302", "name": "海港区" }, + { "code": "130303", "name": "山海关区" }, + { "code": "130304", "name": "北戴河区" }, + { "code": "130306", "name": "抚宁区" }, + { "code": "130321", "name": "青龙满族自治县" }, + { "code": "130322", "name": "昌黎县" }, + { "code": "130324", "name": "卢龙县" }, + { "code": "130371", "name": "秦皇岛市经济技术开发区" }, + { "code": "130372", "name": "北戴河新区" } + ] + }, + { + "code": "1304", + "name": "邯郸市", + "children": [ + { "code": "130402", "name": "邯山区" }, + { "code": "130403", "name": "丛台区" }, + { "code": "130404", "name": "复兴区" }, + { "code": "130406", "name": "峰峰矿区" }, + { "code": "130407", "name": "肥乡区" }, + { "code": "130408", "name": "永年区" }, + { "code": "130423", "name": "临漳县" }, + { "code": "130424", "name": "成安县" }, + { "code": "130425", "name": "大名县" }, + { "code": "130426", "name": "涉县" }, + { "code": "130427", "name": "磁县" }, + { "code": "130430", "name": "邱县" }, + { "code": "130431", "name": "鸡泽县" }, + { "code": "130432", "name": "广平县" }, + { "code": "130433", "name": "馆陶县" }, + { "code": "130434", "name": "魏县" }, + { "code": "130435", "name": "曲周县" }, + { "code": "130471", "name": "邯郸经济技术开发区" }, + { "code": "130473", "name": "邯郸冀南新区" }, + { "code": "130481", "name": "武安市" } + ] + }, + { + "code": "1305", + "name": "邢台市", + "children": [ + { "code": "130502", "name": "桥东区" }, + { "code": "130503", "name": "桥西区" }, + { "code": "130521", "name": "邢台县" }, + { "code": "130522", "name": "临城县" }, + { "code": "130523", "name": "内丘县" }, + { "code": "130524", "name": "柏乡县" }, + { "code": "130525", "name": "隆尧县" }, + { "code": "130526", "name": "任县" }, + { "code": "130527", "name": "南和县" }, + { "code": "130528", "name": "宁晋县" }, + { "code": "130529", "name": "巨鹿县" }, + { "code": "130530", "name": "新河县" }, + { "code": "130531", "name": "广宗县" }, + { "code": "130532", "name": "平乡县" }, + { "code": "130533", "name": "威县" }, + { "code": "130534", "name": "清河县" }, + { "code": "130535", "name": "临西县" }, + { "code": "130571", "name": "河北邢台经济开发区" }, + { "code": "130581", "name": "南宫市" }, + { "code": "130582", "name": "沙河市" } + ] + }, + { + "code": "1306", + "name": "保定市", + "children": [ + { "code": "130602", "name": "竞秀区" }, + { "code": "130606", "name": "莲池区" }, + { "code": "130607", "name": "满城区" }, + { "code": "130608", "name": "清苑区" }, + { "code": "130609", "name": "徐水区" }, + { "code": "130623", "name": "涞水县" }, + { "code": "130624", "name": "阜平县" }, + { "code": "130626", "name": "定兴县" }, + { "code": "130627", "name": "唐县" }, + { "code": "130628", "name": "高阳县" }, + { "code": "130629", "name": "容城县" }, + { "code": "130630", "name": "涞源县" }, + { "code": "130631", "name": "望都县" }, + { "code": "130632", "name": "安新县" }, + { "code": "130633", "name": "易县" }, + { "code": "130634", "name": "曲阳县" }, + { "code": "130635", "name": "蠡县" }, + { "code": "130636", "name": "顺平县" }, + { "code": "130637", "name": "博野县" }, + { "code": "130638", "name": "雄县" }, + { "code": "130671", "name": "保定高新技术产业开发区" }, + { "code": "130672", "name": "保定白沟新城" }, + { "code": "130681", "name": "涿州市" }, + { "code": "130682", "name": "定州市" }, + { "code": "130683", "name": "安国市" }, + { "code": "130684", "name": "高碑店市" } + ] + }, + { + "code": "1307", + "name": "张家口市", + "children": [ + { "code": "130702", "name": "桥东区" }, + { "code": "130703", "name": "桥西区" }, + { "code": "130705", "name": "宣化区" }, + { "code": "130706", "name": "下花园区" }, + { "code": "130708", "name": "万全区" }, + { "code": "130709", "name": "崇礼区" }, + { "code": "130722", "name": "张北县" }, + { "code": "130723", "name": "康保县" }, + { "code": "130724", "name": "沽源县" }, + { "code": "130725", "name": "尚义县" }, + { "code": "130726", "name": "蔚县" }, + { "code": "130727", "name": "阳原县" }, + { "code": "130728", "name": "怀安县" }, + { "code": "130730", "name": "怀来县" }, + { "code": "130731", "name": "涿鹿县" }, + { "code": "130732", "name": "赤城县" }, + { "code": "130771", "name": "张家口经济开发区" }, + { "code": "130772", "name": "张家口市察北管理区" }, + { "code": "130773", "name": "张家口市塞北管理区" } + ] + }, + { + "code": "1308", + "name": "承德市", + "children": [ + { "code": "130802", "name": "双桥区" }, + { "code": "130803", "name": "双滦区" }, + { "code": "130804", "name": "鹰手营子矿区" }, + { "code": "130821", "name": "承德县" }, + { "code": "130822", "name": "兴隆县" }, + { "code": "130824", "name": "滦平县" }, + { "code": "130825", "name": "隆化县" }, + { "code": "130826", "name": "丰宁满族自治县" }, + { "code": "130827", "name": "宽城满族自治县" }, + { "code": "130828", "name": "围场满族蒙古族自治县" }, + { "code": "130871", "name": "承德高新技术产业开发区" }, + { "code": "130881", "name": "平泉市" } + ] + }, + { + "code": "1309", + "name": "沧州市", + "children": [ + { "code": "130902", "name": "新华区" }, + { "code": "130903", "name": "运河区" }, + { "code": "130921", "name": "沧县" }, + { "code": "130922", "name": "青县" }, + { "code": "130923", "name": "东光县" }, + { "code": "130924", "name": "海兴县" }, + { "code": "130925", "name": "盐山县" }, + { "code": "130926", "name": "肃宁县" }, + { "code": "130927", "name": "南皮县" }, + { "code": "130928", "name": "吴桥县" }, + { "code": "130929", "name": "献县" }, + { "code": "130930", "name": "孟村回族自治县" }, + { "code": "130971", "name": "河北沧州经济开发区" }, + { "code": "130972", "name": "沧州高新技术产业开发区" }, + { "code": "130973", "name": "沧州渤海新区" }, + { "code": "130981", "name": "泊头市" }, + { "code": "130982", "name": "任丘市" }, + { "code": "130983", "name": "黄骅市" }, + { "code": "130984", "name": "河间市" } + ] + }, + { + "code": "1310", + "name": "廊坊市", + "children": [ + { "code": "131002", "name": "安次区" }, + { "code": "131003", "name": "广阳区" }, + { "code": "131022", "name": "固安县" }, + { "code": "131023", "name": "永清县" }, + { "code": "131024", "name": "香河县" }, + { "code": "131025", "name": "大城县" }, + { "code": "131026", "name": "文安县" }, + { "code": "131028", "name": "大厂回族自治县" }, + { "code": "131071", "name": "廊坊经济技术开发区" }, + { "code": "131081", "name": "霸州市" }, + { "code": "131082", "name": "三河市" } + ] + }, + { + "code": "1311", + "name": "衡水市", + "children": [ + { "code": "131102", "name": "桃城区" }, + { "code": "131103", "name": "冀州区" }, + { "code": "131121", "name": "枣强县" }, + { "code": "131122", "name": "武邑县" }, + { "code": "131123", "name": "武强县" }, + { "code": "131124", "name": "饶阳县" }, + { "code": "131125", "name": "安平县" }, + { "code": "131126", "name": "故城县" }, + { "code": "131127", "name": "景县" }, + { "code": "131128", "name": "阜城县" }, + { "code": "131171", "name": "河北衡水高新技术产业开发区" }, + { "code": "131172", "name": "衡水滨湖新区" }, + { "code": "131182", "name": "深州市" } + ] + } + ] + }, + { + "code": "14", + "name": "山西省", + "children": [ + { + "code": "1401", + "name": "太原市", + "children": [ + { "code": "140105", "name": "小店区" }, + { "code": "140106", "name": "迎泽区" }, + { "code": "140107", "name": "杏花岭区" }, + { "code": "140108", "name": "尖草坪区" }, + { "code": "140109", "name": "万柏林区" }, + { "code": "140110", "name": "晋源区" }, + { "code": "140121", "name": "清徐县" }, + { "code": "140122", "name": "阳曲县" }, + { "code": "140123", "name": "娄烦县" }, + { "code": "140171", "name": "山西转型综合改革示范区" }, + { "code": "140181", "name": "古交市" } + ] + }, + { + "code": "1402", + "name": "大同市", + "children": [ + { "code": "140212", "name": "新荣区" }, + { "code": "140213", "name": "平城区" }, + { "code": "140214", "name": "云冈区" }, + { "code": "140215", "name": "云州区" }, + { "code": "140221", "name": "阳高县" }, + { "code": "140222", "name": "天镇县" }, + { "code": "140223", "name": "广灵县" }, + { "code": "140224", "name": "灵丘县" }, + { "code": "140225", "name": "浑源县" }, + { "code": "140226", "name": "左云县" }, + { "code": "140271", "name": "山西大同经济开发区" } + ] + }, + { + "code": "1403", + "name": "阳泉市", + "children": [ + { "code": "140302", "name": "城区" }, + { "code": "140303", "name": "矿区" }, + { "code": "140311", "name": "郊区" }, + { "code": "140321", "name": "平定县" }, + { "code": "140322", "name": "盂县" } + ] + }, + { + "code": "1404", + "name": "长治市", + "children": [ + { "code": "140403", "name": "潞州区" }, + { "code": "140404", "name": "上党区" }, + { "code": "140405", "name": "屯留区" }, + { "code": "140406", "name": "潞城区" }, + { "code": "140423", "name": "襄垣县" }, + { "code": "140425", "name": "平顺县" }, + { "code": "140426", "name": "黎城县" }, + { "code": "140427", "name": "壶关县" }, + { "code": "140428", "name": "长子县" }, + { "code": "140429", "name": "武乡县" }, + { "code": "140430", "name": "沁县" }, + { "code": "140431", "name": "沁源县" }, + { "code": "140471", "name": "山西长治高新技术产业园区" } + ] + }, + { + "code": "1405", + "name": "晋城市", + "children": [ + { "code": "140502", "name": "城区" }, + { "code": "140521", "name": "沁水县" }, + { "code": "140522", "name": "阳城县" }, + { "code": "140524", "name": "陵川县" }, + { "code": "140525", "name": "泽州县" }, + { "code": "140581", "name": "高平市" } + ] + }, + { + "code": "1406", + "name": "朔州市", + "children": [ + { "code": "140602", "name": "朔城区" }, + { "code": "140603", "name": "平鲁区" }, + { "code": "140621", "name": "山阴县" }, + { "code": "140622", "name": "应县" }, + { "code": "140623", "name": "右玉县" }, + { "code": "140671", "name": "山西朔州经济开发区" }, + { "code": "140681", "name": "怀仁市" } + ] + }, + { + "code": "1407", + "name": "晋中市", + "children": [ + { "code": "140702", "name": "榆次区" }, + { "code": "140721", "name": "榆社县" }, + { "code": "140722", "name": "左权县" }, + { "code": "140723", "name": "和顺县" }, + { "code": "140724", "name": "昔阳县" }, + { "code": "140725", "name": "寿阳县" }, + { "code": "140726", "name": "太谷县" }, + { "code": "140727", "name": "祁县" }, + { "code": "140728", "name": "平遥县" }, + { "code": "140729", "name": "灵石县" }, + { "code": "140781", "name": "介休市" } + ] + }, + { + "code": "1408", + "name": "运城市", + "children": [ + { "code": "140802", "name": "盐湖区" }, + { "code": "140821", "name": "临猗县" }, + { "code": "140822", "name": "万荣县" }, + { "code": "140823", "name": "闻喜县" }, + { "code": "140824", "name": "稷山县" }, + { "code": "140825", "name": "新绛县" }, + { "code": "140826", "name": "绛县" }, + { "code": "140827", "name": "垣曲县" }, + { "code": "140828", "name": "夏县" }, + { "code": "140829", "name": "平陆县" }, + { "code": "140830", "name": "芮城县" }, + { "code": "140881", "name": "永济市" }, + { "code": "140882", "name": "河津市" } + ] + }, + { + "code": "1409", + "name": "忻州市", + "children": [ + { "code": "140902", "name": "忻府区" }, + { "code": "140921", "name": "定襄县" }, + { "code": "140922", "name": "五台县" }, + { "code": "140923", "name": "代县" }, + { "code": "140924", "name": "繁峙县" }, + { "code": "140925", "name": "宁武县" }, + { "code": "140926", "name": "静乐县" }, + { "code": "140927", "name": "神池县" }, + { "code": "140928", "name": "五寨县" }, + { "code": "140929", "name": "岢岚县" }, + { "code": "140930", "name": "河曲县" }, + { "code": "140931", "name": "保德县" }, + { "code": "140932", "name": "偏关县" }, + { "code": "140971", "name": "五台山风景名胜区" }, + { "code": "140981", "name": "原平市" } + ] + }, + { + "code": "1410", + "name": "临汾市", + "children": [ + { "code": "141002", "name": "尧都区" }, + { "code": "141021", "name": "曲沃县" }, + { "code": "141022", "name": "翼城县" }, + { "code": "141023", "name": "襄汾县" }, + { "code": "141024", "name": "洪洞县" }, + { "code": "141025", "name": "古县" }, + { "code": "141026", "name": "安泽县" }, + { "code": "141027", "name": "浮山县" }, + { "code": "141028", "name": "吉县" }, + { "code": "141029", "name": "乡宁县" }, + { "code": "141030", "name": "大宁县" }, + { "code": "141031", "name": "隰县" }, + { "code": "141032", "name": "永和县" }, + { "code": "141033", "name": "蒲县" }, + { "code": "141034", "name": "汾西县" }, + { "code": "141081", "name": "侯马市" }, + { "code": "141082", "name": "霍州市" } + ] + }, + { + "code": "1411", + "name": "吕梁市", + "children": [ + { "code": "141102", "name": "离石区" }, + { "code": "141121", "name": "文水县" }, + { "code": "141122", "name": "交城县" }, + { "code": "141123", "name": "兴县" }, + { "code": "141124", "name": "临县" }, + { "code": "141125", "name": "柳林县" }, + { "code": "141126", "name": "石楼县" }, + { "code": "141127", "name": "岚县" }, + { "code": "141128", "name": "方山县" }, + { "code": "141129", "name": "中阳县" }, + { "code": "141130", "name": "交口县" }, + { "code": "141181", "name": "孝义市" }, + { "code": "141182", "name": "汾阳市" } + ] + } + ] + }, + { + "code": "15", + "name": "内蒙古自治区", + "children": [ + { + "code": "1501", + "name": "呼和浩特市", + "children": [ + { "code": "150102", "name": "新城区" }, + { "code": "150103", "name": "回民区" }, + { "code": "150104", "name": "玉泉区" }, + { "code": "150105", "name": "赛罕区" }, + { "code": "150121", "name": "土默特左旗" }, + { "code": "150122", "name": "托克托县" }, + { "code": "150123", "name": "和林格尔县" }, + { "code": "150124", "name": "清水河县" }, + { "code": "150125", "name": "武川县" }, + { "code": "150171", "name": "呼和浩特金海工业园区" }, + { "code": "150172", "name": "呼和浩特经济技术开发区" } + ] + }, + { + "code": "1502", + "name": "包头市", + "children": [ + { "code": "150202", "name": "东河区" }, + { "code": "150203", "name": "昆都仑区" }, + { "code": "150204", "name": "青山区" }, + { "code": "150205", "name": "石拐区" }, + { "code": "150206", "name": "白云鄂博矿区" }, + { "code": "150207", "name": "九原区" }, + { "code": "150221", "name": "土默特右旗" }, + { "code": "150222", "name": "固阳县" }, + { "code": "150223", "name": "达尔罕茂明安联合旗" }, + { "code": "150271", "name": "包头稀土高新技术产业开发区" } + ] + }, + { + "code": "1503", + "name": "乌海市", + "children": [ + { "code": "150302", "name": "海勃湾区" }, + { "code": "150303", "name": "海南区" }, + { "code": "150304", "name": "乌达区" } + ] + }, + { + "code": "1504", + "name": "赤峰市", + "children": [ + { "code": "150402", "name": "红山区" }, + { "code": "150403", "name": "元宝山区" }, + { "code": "150404", "name": "松山区" }, + { "code": "150421", "name": "阿鲁科尔沁旗" }, + { "code": "150422", "name": "巴林左旗" }, + { "code": "150423", "name": "巴林右旗" }, + { "code": "150424", "name": "林西县" }, + { "code": "150425", "name": "克什克腾旗" }, + { "code": "150426", "name": "翁牛特旗" }, + { "code": "150428", "name": "喀喇沁旗" }, + { "code": "150429", "name": "宁城县" }, + { "code": "150430", "name": "敖汉旗" } + ] + }, + { + "code": "1505", + "name": "通辽市", + "children": [ + { "code": "150502", "name": "科尔沁区" }, + { "code": "150521", "name": "科尔沁左翼中旗" }, + { "code": "150522", "name": "科尔沁左翼后旗" }, + { "code": "150523", "name": "开鲁县" }, + { "code": "150524", "name": "库伦旗" }, + { "code": "150525", "name": "奈曼旗" }, + { "code": "150526", "name": "扎鲁特旗" }, + { "code": "150571", "name": "通辽经济技术开发区" }, + { "code": "150581", "name": "霍林郭勒市" } + ] + }, + { + "code": "1506", + "name": "鄂尔多斯市", + "children": [ + { "code": "150602", "name": "东胜区" }, + { "code": "150603", "name": "康巴什区" }, + { "code": "150621", "name": "达拉特旗" }, + { "code": "150622", "name": "准格尔旗" }, + { "code": "150623", "name": "鄂托克前旗" }, + { "code": "150624", "name": "鄂托克旗" }, + { "code": "150625", "name": "杭锦旗" }, + { "code": "150626", "name": "乌审旗" }, + { "code": "150627", "name": "伊金霍洛旗" } + ] + }, + { + "code": "1507", + "name": "呼伦贝尔市", + "children": [ + { "code": "150702", "name": "海拉尔区" }, + { "code": "150703", "name": "扎赉诺尔区" }, + { "code": "150721", "name": "阿荣旗" }, + { "code": "150722", "name": "莫力达瓦达斡尔族自治旗" }, + { "code": "150723", "name": "鄂伦春自治旗" }, + { "code": "150724", "name": "鄂温克族自治旗" }, + { "code": "150725", "name": "陈巴尔虎旗" }, + { "code": "150726", "name": "新巴尔虎左旗" }, + { "code": "150727", "name": "新巴尔虎右旗" }, + { "code": "150781", "name": "满洲里市" }, + { "code": "150782", "name": "牙克石市" }, + { "code": "150783", "name": "扎兰屯市" }, + { "code": "150784", "name": "额尔古纳市" }, + { "code": "150785", "name": "根河市" } + ] + }, + { + "code": "1508", + "name": "巴彦淖尔市", + "children": [ + { "code": "150802", "name": "临河区" }, + { "code": "150821", "name": "五原县" }, + { "code": "150822", "name": "磴口县" }, + { "code": "150823", "name": "乌拉特前旗" }, + { "code": "150824", "name": "乌拉特中旗" }, + { "code": "150825", "name": "乌拉特后旗" }, + { "code": "150826", "name": "杭锦后旗" } + ] + }, + { + "code": "1509", + "name": "乌兰察布市", + "children": [ + { "code": "150902", "name": "集宁区" }, + { "code": "150921", "name": "卓资县" }, + { "code": "150922", "name": "化德县" }, + { "code": "150923", "name": "商都县" }, + { "code": "150924", "name": "兴和县" }, + { "code": "150925", "name": "凉城县" }, + { "code": "150926", "name": "察哈尔右翼前旗" }, + { "code": "150927", "name": "察哈尔右翼中旗" }, + { "code": "150928", "name": "察哈尔右翼后旗" }, + { "code": "150929", "name": "四子王旗" }, + { "code": "150981", "name": "丰镇市" } + ] + }, + { + "code": "1522", + "name": "兴安盟", + "children": [ + { "code": "152201", "name": "乌兰浩特市" }, + { "code": "152202", "name": "阿尔山市" }, + { "code": "152221", "name": "科尔沁右翼前旗" }, + { "code": "152222", "name": "科尔沁右翼中旗" }, + { "code": "152223", "name": "扎赉特旗" }, + { "code": "152224", "name": "突泉县" } + ] + }, + { + "code": "1525", + "name": "锡林郭勒盟", + "children": [ + { "code": "152501", "name": "二连浩特市" }, + { "code": "152502", "name": "锡林浩特市" }, + { "code": "152522", "name": "阿巴嘎旗" }, + { "code": "152523", "name": "苏尼特左旗" }, + { "code": "152524", "name": "苏尼特右旗" }, + { "code": "152525", "name": "东乌珠穆沁旗" }, + { "code": "152526", "name": "西乌珠穆沁旗" }, + { "code": "152527", "name": "太仆寺旗" }, + { "code": "152528", "name": "镶黄旗" }, + { "code": "152529", "name": "正镶白旗" }, + { "code": "152530", "name": "正蓝旗" }, + { "code": "152531", "name": "多伦县" }, + { "code": "152571", "name": "乌拉盖管委会" } + ] + }, + { + "code": "1529", + "name": "阿拉善盟", + "children": [ + { "code": "152921", "name": "阿拉善左旗" }, + { "code": "152922", "name": "阿拉善右旗" }, + { "code": "152923", "name": "额济纳旗" }, + { "code": "152971", "name": "内蒙古阿拉善经济开发区" } + ] + } + ] + }, + { + "code": "21", + "name": "辽宁省", + "children": [ + { + "code": "2101", + "name": "沈阳市", + "children": [ + { "code": "210102", "name": "和平区" }, + { "code": "210103", "name": "沈河区" }, + { "code": "210104", "name": "大东区" }, + { "code": "210105", "name": "皇姑区" }, + { "code": "210106", "name": "铁西区" }, + { "code": "210111", "name": "苏家屯区" }, + { "code": "210112", "name": "浑南区" }, + { "code": "210113", "name": "沈北新区" }, + { "code": "210114", "name": "于洪区" }, + { "code": "210115", "name": "辽中区" }, + { "code": "210123", "name": "康平县" }, + { "code": "210124", "name": "法库县" }, + { "code": "210181", "name": "新民市" } + ] + }, + { + "code": "2102", + "name": "大连市", + "children": [ + { "code": "210202", "name": "中山区" }, + { "code": "210203", "name": "西岗区" }, + { "code": "210204", "name": "沙河口区" }, + { "code": "210211", "name": "甘井子区" }, + { "code": "210212", "name": "旅顺口区" }, + { "code": "210213", "name": "金州区" }, + { "code": "210214", "name": "普兰店区" }, + { "code": "210224", "name": "长海县" }, + { "code": "210281", "name": "瓦房店市" }, + { "code": "210283", "name": "庄河市" } + ] + }, + { + "code": "2103", + "name": "鞍山市", + "children": [ + { "code": "210302", "name": "铁东区" }, + { "code": "210303", "name": "铁西区" }, + { "code": "210304", "name": "立山区" }, + { "code": "210311", "name": "千山区" }, + { "code": "210321", "name": "台安县" }, + { "code": "210323", "name": "岫岩满族自治县" }, + { "code": "210381", "name": "海城市" } + ] + }, + { + "code": "2104", + "name": "抚顺市", + "children": [ + { "code": "210402", "name": "新抚区" }, + { "code": "210403", "name": "东洲区" }, + { "code": "210404", "name": "望花区" }, + { "code": "210411", "name": "顺城区" }, + { "code": "210421", "name": "抚顺县" }, + { "code": "210422", "name": "新宾满族自治县" }, + { "code": "210423", "name": "清原满族自治县" } + ] + }, + { + "code": "2105", + "name": "本溪市", + "children": [ + { "code": "210502", "name": "平山区" }, + { "code": "210503", "name": "溪湖区" }, + { "code": "210504", "name": "明山区" }, + { "code": "210505", "name": "南芬区" }, + { "code": "210521", "name": "本溪满族自治县" }, + { "code": "210522", "name": "桓仁满族自治县" } + ] + }, + { + "code": "2106", + "name": "丹东市", + "children": [ + { "code": "210602", "name": "元宝区" }, + { "code": "210603", "name": "振兴区" }, + { "code": "210604", "name": "振安区" }, + { "code": "210624", "name": "宽甸满族自治县" }, + { "code": "210681", "name": "东港市" }, + { "code": "210682", "name": "凤城市" } + ] + }, + { + "code": "2107", + "name": "锦州市", + "children": [ + { "code": "210702", "name": "古塔区" }, + { "code": "210703", "name": "凌河区" }, + { "code": "210711", "name": "太和区" }, + { "code": "210726", "name": "黑山县" }, + { "code": "210727", "name": "义县" }, + { "code": "210781", "name": "凌海市" }, + { "code": "210782", "name": "北镇市" } + ] + }, + { + "code": "2108", + "name": "营口市", + "children": [ + { "code": "210802", "name": "站前区" }, + { "code": "210803", "name": "西市区" }, + { "code": "210804", "name": "鲅鱼圈区" }, + { "code": "210811", "name": "老边区" }, + { "code": "210881", "name": "盖州市" }, + { "code": "210882", "name": "大石桥市" } + ] + }, + { + "code": "2109", + "name": "阜新市", + "children": [ + { "code": "210902", "name": "海州区" }, + { "code": "210903", "name": "新邱区" }, + { "code": "210904", "name": "太平区" }, + { "code": "210905", "name": "清河门区" }, + { "code": "210911", "name": "细河区" }, + { "code": "210921", "name": "阜新蒙古族自治县" }, + { "code": "210922", "name": "彰武县" } + ] + }, + { + "code": "2110", + "name": "辽阳市", + "children": [ + { "code": "211002", "name": "白塔区" }, + { "code": "211003", "name": "文圣区" }, + { "code": "211004", "name": "宏伟区" }, + { "code": "211005", "name": "弓长岭区" }, + { "code": "211011", "name": "太子河区" }, + { "code": "211021", "name": "辽阳县" }, + { "code": "211081", "name": "灯塔市" } + ] + }, + { + "code": "2111", + "name": "盘锦市", + "children": [ + { "code": "211102", "name": "双台子区" }, + { "code": "211103", "name": "兴隆台区" }, + { "code": "211104", "name": "大洼区" }, + { "code": "211122", "name": "盘山县" } + ] + }, + { + "code": "2112", + "name": "铁岭市", + "children": [ + { "code": "211202", "name": "银州区" }, + { "code": "211204", "name": "清河区" }, + { "code": "211221", "name": "铁岭县" }, + { "code": "211223", "name": "西丰县" }, + { "code": "211224", "name": "昌图县" }, + { "code": "211281", "name": "调兵山市" }, + { "code": "211282", "name": "开原市" } + ] + }, + { + "code": "2113", + "name": "朝阳市", + "children": [ + { "code": "211302", "name": "双塔区" }, + { "code": "211303", "name": "龙城区" }, + { "code": "211321", "name": "朝阳县" }, + { "code": "211322", "name": "建平县" }, + { "code": "211324", "name": "喀喇沁左翼蒙古族自治县" }, + { "code": "211381", "name": "北票市" }, + { "code": "211382", "name": "凌源市" } + ] + }, + { + "code": "2114", + "name": "葫芦岛市", + "children": [ + { "code": "211402", "name": "连山区" }, + { "code": "211403", "name": "龙港区" }, + { "code": "211404", "name": "南票区" }, + { "code": "211421", "name": "绥中县" }, + { "code": "211422", "name": "建昌县" }, + { "code": "211481", "name": "兴城市" } + ] + } + ] + }, + { + "code": "22", + "name": "吉林省", + "children": [ + { + "code": "2201", + "name": "长春市", + "children": [ + { "code": "220102", "name": "南关区" }, + { "code": "220103", "name": "宽城区" }, + { "code": "220104", "name": "朝阳区" }, + { "code": "220105", "name": "二道区" }, + { "code": "220106", "name": "绿园区" }, + { "code": "220112", "name": "双阳区" }, + { "code": "220113", "name": "九台区" }, + { "code": "220122", "name": "农安县" }, + { "code": "220171", "name": "长春经济技术开发区" }, + { "code": "220172", "name": "长春净月高新技术产业开发区" }, + { "code": "220173", "name": "长春高新技术产业开发区" }, + { "code": "220174", "name": "长春汽车经济技术开发区" }, + { "code": "220182", "name": "榆树市" }, + { "code": "220183", "name": "德惠市" } + ] + }, + { + "code": "2202", + "name": "吉林市", + "children": [ + { "code": "220202", "name": "昌邑区" }, + { "code": "220203", "name": "龙潭区" }, + { "code": "220204", "name": "船营区" }, + { "code": "220211", "name": "丰满区" }, + { "code": "220221", "name": "永吉县" }, + { "code": "220271", "name": "吉林经济开发区" }, + { "code": "220272", "name": "吉林高新技术产业开发区" }, + { "code": "220273", "name": "吉林中国新加坡食品区" }, + { "code": "220281", "name": "蛟河市" }, + { "code": "220282", "name": "桦甸市" }, + { "code": "220283", "name": "舒兰市" }, + { "code": "220284", "name": "磐石市" } + ] + }, + { + "code": "2203", + "name": "四平市", + "children": [ + { "code": "220302", "name": "铁西区" }, + { "code": "220303", "name": "铁东区" }, + { "code": "220322", "name": "梨树县" }, + { "code": "220323", "name": "伊通满族自治县" }, + { "code": "220381", "name": "公主岭市" }, + { "code": "220382", "name": "双辽市" } + ] + }, + { + "code": "2204", + "name": "辽源市", + "children": [ + { "code": "220402", "name": "龙山区" }, + { "code": "220403", "name": "西安区" }, + { "code": "220421", "name": "东丰县" }, + { "code": "220422", "name": "东辽县" } + ] + }, + { + "code": "2205", + "name": "通化市", + "children": [ + { "code": "220502", "name": "东昌区" }, + { "code": "220503", "name": "二道江区" }, + { "code": "220521", "name": "通化县" }, + { "code": "220523", "name": "辉南县" }, + { "code": "220524", "name": "柳河县" }, + { "code": "220581", "name": "梅河口市" }, + { "code": "220582", "name": "集安市" } + ] + }, + { + "code": "2206", + "name": "白山市", + "children": [ + { "code": "220602", "name": "浑江区" }, + { "code": "220605", "name": "江源区" }, + { "code": "220621", "name": "抚松县" }, + { "code": "220622", "name": "靖宇县" }, + { "code": "220623", "name": "长白朝鲜族自治县" }, + { "code": "220681", "name": "临江市" } + ] + }, + { + "code": "2207", + "name": "松原市", + "children": [ + { "code": "220702", "name": "宁江区" }, + { "code": "220721", "name": "前郭尔罗斯蒙古族自治县" }, + { "code": "220722", "name": "长岭县" }, + { "code": "220723", "name": "乾安县" }, + { "code": "220771", "name": "吉林松原经济开发区" }, + { "code": "220781", "name": "扶余市" } + ] + }, + { + "code": "2208", + "name": "白城市", + "children": [ + { "code": "220802", "name": "洮北区" }, + { "code": "220821", "name": "镇赉县" }, + { "code": "220822", "name": "通榆县" }, + { "code": "220871", "name": "吉林白城经济开发区" }, + { "code": "220881", "name": "洮南市" }, + { "code": "220882", "name": "大安市" } + ] + }, + { + "code": "2224", + "name": "延边朝鲜族自治州", + "children": [ + { "code": "222401", "name": "延吉市" }, + { "code": "222402", "name": "图们市" }, + { "code": "222403", "name": "敦化市" }, + { "code": "222404", "name": "珲春市" }, + { "code": "222405", "name": "龙井市" }, + { "code": "222406", "name": "和龙市" }, + { "code": "222424", "name": "汪清县" }, + { "code": "222426", "name": "安图县" } + ] + } + ] + }, + { + "code": "23", + "name": "黑龙江省", + "children": [ + { + "code": "2301", + "name": "哈尔滨市", + "children": [ + { "code": "230102", "name": "道里区" }, + { "code": "230103", "name": "南岗区" }, + { "code": "230104", "name": "道外区" }, + { "code": "230108", "name": "平房区" }, + { "code": "230109", "name": "松北区" }, + { "code": "230110", "name": "香坊区" }, + { "code": "230111", "name": "呼兰区" }, + { "code": "230112", "name": "阿城区" }, + { "code": "230113", "name": "双城区" }, + { "code": "230123", "name": "依兰县" }, + { "code": "230124", "name": "方正县" }, + { "code": "230125", "name": "宾县" }, + { "code": "230126", "name": "巴彦县" }, + { "code": "230127", "name": "木兰县" }, + { "code": "230128", "name": "通河县" }, + { "code": "230129", "name": "延寿县" }, + { "code": "230183", "name": "尚志市" }, + { "code": "230184", "name": "五常市" } + ] + }, + { + "code": "2302", + "name": "齐齐哈尔市", + "children": [ + { "code": "230202", "name": "龙沙区" }, + { "code": "230203", "name": "建华区" }, + { "code": "230204", "name": "铁锋区" }, + { "code": "230205", "name": "昂昂溪区" }, + { "code": "230206", "name": "富拉尔基区" }, + { "code": "230207", "name": "碾子山区" }, + { "code": "230208", "name": "梅里斯达斡尔族区" }, + { "code": "230221", "name": "龙江县" }, + { "code": "230223", "name": "依安县" }, + { "code": "230224", "name": "泰来县" }, + { "code": "230225", "name": "甘南县" }, + { "code": "230227", "name": "富裕县" }, + { "code": "230229", "name": "克山县" }, + { "code": "230230", "name": "克东县" }, + { "code": "230231", "name": "拜泉县" }, + { "code": "230281", "name": "讷河市" } + ] + }, + { + "code": "2303", + "name": "鸡西市", + "children": [ + { "code": "230302", "name": "鸡冠区" }, + { "code": "230303", "name": "恒山区" }, + { "code": "230304", "name": "滴道区" }, + { "code": "230305", "name": "梨树区" }, + { "code": "230306", "name": "城子河区" }, + { "code": "230307", "name": "麻山区" }, + { "code": "230321", "name": "鸡东县" }, + { "code": "230381", "name": "虎林市" }, + { "code": "230382", "name": "密山市" } + ] + }, + { + "code": "2304", + "name": "鹤岗市", + "children": [ + { "code": "230402", "name": "向阳区" }, + { "code": "230403", "name": "工农区" }, + { "code": "230404", "name": "南山区" }, + { "code": "230405", "name": "兴安区" }, + { "code": "230406", "name": "东山区" }, + { "code": "230407", "name": "兴山区" }, + { "code": "230421", "name": "萝北县" }, + { "code": "230422", "name": "绥滨县" } + ] + }, + { + "code": "2305", + "name": "双鸭山市", + "children": [ + { "code": "230502", "name": "尖山区" }, + { "code": "230503", "name": "岭东区" }, + { "code": "230505", "name": "四方台区" }, + { "code": "230506", "name": "宝山区" }, + { "code": "230521", "name": "集贤县" }, + { "code": "230522", "name": "友谊县" }, + { "code": "230523", "name": "宝清县" }, + { "code": "230524", "name": "饶河县" } + ] + }, + { + "code": "2306", + "name": "大庆市", + "children": [ + { "code": "230602", "name": "萨尔图区" }, + { "code": "230603", "name": "龙凤区" }, + { "code": "230604", "name": "让胡路区" }, + { "code": "230605", "name": "红岗区" }, + { "code": "230606", "name": "大同区" }, + { "code": "230621", "name": "肇州县" }, + { "code": "230622", "name": "肇源县" }, + { "code": "230623", "name": "林甸县" }, + { "code": "230624", "name": "杜尔伯特蒙古族自治县" }, + { "code": "230671", "name": "大庆高新技术产业开发区" } + ] + }, + { + "code": "2307", + "name": "伊春市", + "children": [ + { "code": "230717", "name": "伊美区" }, + { "code": "230718", "name": "乌翠区" }, + { "code": "230719", "name": "友好区" }, + { "code": "230722", "name": "嘉荫县" }, + { "code": "230723", "name": "汤旺县" }, + { "code": "230724", "name": "丰林县" }, + { "code": "230725", "name": "大箐山县" }, + { "code": "230726", "name": "南岔县" }, + { "code": "230751", "name": "金林区" }, + { "code": "230781", "name": "铁力市" } + ] + }, + { + "code": "2308", + "name": "佳木斯市", + "children": [ + { "code": "230803", "name": "向阳区" }, + { "code": "230804", "name": "前进区" }, + { "code": "230805", "name": "东风区" }, + { "code": "230811", "name": "郊区" }, + { "code": "230822", "name": "桦南县" }, + { "code": "230826", "name": "桦川县" }, + { "code": "230828", "name": "汤原县" }, + { "code": "230881", "name": "同江市" }, + { "code": "230882", "name": "富锦市" }, + { "code": "230883", "name": "抚远市" } + ] + }, + { + "code": "2309", + "name": "七台河市", + "children": [ + { "code": "230902", "name": "新兴区" }, + { "code": "230903", "name": "桃山区" }, + { "code": "230904", "name": "茄子河区" }, + { "code": "230921", "name": "勃利县" } + ] + }, + { + "code": "2310", + "name": "牡丹江市", + "children": [ + { "code": "231002", "name": "东安区" }, + { "code": "231003", "name": "阳明区" }, + { "code": "231004", "name": "爱民区" }, + { "code": "231005", "name": "西安区" }, + { "code": "231025", "name": "林口县" }, + { "code": "231071", "name": "牡丹江经济技术开发区" }, + { "code": "231081", "name": "绥芬河市" }, + { "code": "231083", "name": "海林市" }, + { "code": "231084", "name": "宁安市" }, + { "code": "231085", "name": "穆棱市" }, + { "code": "231086", "name": "东宁市" } + ] + }, + { + "code": "2311", + "name": "黑河市", + "children": [ + { "code": "231102", "name": "爱辉区" }, + { "code": "231123", "name": "逊克县" }, + { "code": "231124", "name": "孙吴县" }, + { "code": "231181", "name": "北安市" }, + { "code": "231182", "name": "五大连池市" }, + { "code": "231183", "name": "嫩江市" } + ] + }, + { + "code": "2312", + "name": "绥化市", + "children": [ + { "code": "231202", "name": "北林区" }, + { "code": "231221", "name": "望奎县" }, + { "code": "231222", "name": "兰西县" }, + { "code": "231223", "name": "青冈县" }, + { "code": "231224", "name": "庆安县" }, + { "code": "231225", "name": "明水县" }, + { "code": "231226", "name": "绥棱县" }, + { "code": "231281", "name": "安达市" }, + { "code": "231282", "name": "肇东市" }, + { "code": "231283", "name": "海伦市" } + ] + }, + { + "code": "2327", + "name": "大兴安岭地区", + "children": [ + { "code": "232701", "name": "漠河市" }, + { "code": "232721", "name": "呼玛县" }, + { "code": "232722", "name": "塔河县" }, + { "code": "232761", "name": "加格达奇区" }, + { "code": "232762", "name": "松岭区" }, + { "code": "232763", "name": "新林区" }, + { "code": "232764", "name": "呼中区" } + ] + } + ] + }, + { + "code": "31", + "name": "上海市", + "children": [ + { + "code": "3101", + "name": "市辖区", + "children": [ + { "code": "310101", "name": "黄浦区" }, + { "code": "310104", "name": "徐汇区" }, + { "code": "310105", "name": "长宁区" }, + { "code": "310106", "name": "静安区" }, + { "code": "310107", "name": "普陀区" }, + { "code": "310109", "name": "虹口区" }, + { "code": "310110", "name": "杨浦区" }, + { "code": "310112", "name": "闵行区" }, + { "code": "310113", "name": "宝山区" }, + { "code": "310114", "name": "嘉定区" }, + { "code": "310115", "name": "浦东新区" }, + { "code": "310116", "name": "金山区" }, + { "code": "310117", "name": "松江区" }, + { "code": "310118", "name": "青浦区" }, + { "code": "310120", "name": "奉贤区" }, + { "code": "310151", "name": "崇明区" } + ] + } + ] + }, + { + "code": "32", + "name": "江苏省", + "children": [ + { + "code": "3201", + "name": "南京市", + "children": [ + { "code": "320102", "name": "玄武区" }, + { "code": "320104", "name": "秦淮区" }, + { "code": "320105", "name": "建邺区" }, + { "code": "320106", "name": "鼓楼区" }, + { "code": "320111", "name": "浦口区" }, + { "code": "320113", "name": "栖霞区" }, + { "code": "320114", "name": "雨花台区" }, + { "code": "320115", "name": "江宁区" }, + { "code": "320116", "name": "六合区" }, + { "code": "320117", "name": "溧水区" }, + { "code": "320118", "name": "高淳区" } + ] + }, + { + "code": "3202", + "name": "无锡市", + "children": [ + { "code": "320205", "name": "锡山区" }, + { "code": "320206", "name": "惠山区" }, + { "code": "320211", "name": "滨湖区" }, + { "code": "320213", "name": "梁溪区" }, + { "code": "320214", "name": "新吴区" }, + { "code": "320281", "name": "江阴市" }, + { "code": "320282", "name": "宜兴市" } + ] + }, + { + "code": "3203", + "name": "徐州市", + "children": [ + { "code": "320302", "name": "鼓楼区" }, + { "code": "320303", "name": "云龙区" }, + { "code": "320305", "name": "贾汪区" }, + { "code": "320311", "name": "泉山区" }, + { "code": "320312", "name": "铜山区" }, + { "code": "320321", "name": "丰县" }, + { "code": "320322", "name": "沛县" }, + { "code": "320324", "name": "睢宁县" }, + { "code": "320371", "name": "徐州经济技术开发区" }, + { "code": "320381", "name": "新沂市" }, + { "code": "320382", "name": "邳州市" } + ] + }, + { + "code": "3204", + "name": "常州市", + "children": [ + { "code": "320402", "name": "天宁区" }, + { "code": "320404", "name": "钟楼区" }, + { "code": "320411", "name": "新北区" }, + { "code": "320412", "name": "武进区" }, + { "code": "320413", "name": "金坛区" }, + { "code": "320481", "name": "溧阳市" } + ] + }, + { + "code": "3205", + "name": "苏州市", + "children": [ + { "code": "320505", "name": "虎丘区" }, + { "code": "320506", "name": "吴中区" }, + { "code": "320507", "name": "相城区" }, + { "code": "320508", "name": "姑苏区" }, + { "code": "320509", "name": "吴江区" }, + { "code": "320571", "name": "苏州工业园区" }, + { "code": "320581", "name": "常熟市" }, + { "code": "320582", "name": "张家港市" }, + { "code": "320583", "name": "昆山市" }, + { "code": "320585", "name": "太仓市" } + ] + }, + { + "code": "3206", + "name": "南通市", + "children": [ + { "code": "320602", "name": "崇川区" }, + { "code": "320611", "name": "港闸区" }, + { "code": "320612", "name": "通州区" }, + { "code": "320623", "name": "如东县" }, + { "code": "320671", "name": "南通经济技术开发区" }, + { "code": "320681", "name": "启东市" }, + { "code": "320682", "name": "如皋市" }, + { "code": "320684", "name": "海门市" }, + { "code": "320685", "name": "海安市" } + ] + }, + { + "code": "3207", + "name": "连云港市", + "children": [ + { "code": "320703", "name": "连云区" }, + { "code": "320706", "name": "海州区" }, + { "code": "320707", "name": "赣榆区" }, + { "code": "320722", "name": "东海县" }, + { "code": "320723", "name": "灌云县" }, + { "code": "320724", "name": "灌南县" }, + { "code": "320771", "name": "连云港经济技术开发区" }, + { "code": "320772", "name": "连云港高新技术产业开发区" } + ] + }, + { + "code": "3208", + "name": "淮安市", + "children": [ + { "code": "320803", "name": "淮安区" }, + { "code": "320804", "name": "淮阴区" }, + { "code": "320812", "name": "清江浦区" }, + { "code": "320813", "name": "洪泽区" }, + { "code": "320826", "name": "涟水县" }, + { "code": "320830", "name": "盱眙县" }, + { "code": "320831", "name": "金湖县" }, + { "code": "320871", "name": "淮安经济技术开发区" } + ] + }, + { + "code": "3209", + "name": "盐城市", + "children": [ + { "code": "320902", "name": "亭湖区" }, + { "code": "320903", "name": "盐都区" }, + { "code": "320904", "name": "大丰区" }, + { "code": "320921", "name": "响水县" }, + { "code": "320922", "name": "滨海县" }, + { "code": "320923", "name": "阜宁县" }, + { "code": "320924", "name": "射阳县" }, + { "code": "320925", "name": "建湖县" }, + { "code": "320971", "name": "盐城经济技术开发区" }, + { "code": "320981", "name": "东台市" } + ] + }, + { + "code": "3210", + "name": "扬州市", + "children": [ + { "code": "321002", "name": "广陵区" }, + { "code": "321003", "name": "邗江区" }, + { "code": "321012", "name": "江都区" }, + { "code": "321023", "name": "宝应县" }, + { "code": "321071", "name": "扬州经济技术开发区" }, + { "code": "321081", "name": "仪征市" }, + { "code": "321084", "name": "高邮市" } + ] + }, + { + "code": "3211", + "name": "镇江市", + "children": [ + { "code": "321102", "name": "京口区" }, + { "code": "321111", "name": "润州区" }, + { "code": "321112", "name": "丹徒区" }, + { "code": "321171", "name": "镇江新区" }, + { "code": "321181", "name": "丹阳市" }, + { "code": "321182", "name": "扬中市" }, + { "code": "321183", "name": "句容市" } + ] + }, + { + "code": "3212", + "name": "泰州市", + "children": [ + { "code": "321202", "name": "海陵区" }, + { "code": "321203", "name": "高港区" }, + { "code": "321204", "name": "姜堰区" }, + { "code": "321271", "name": "泰州医药高新技术产业开发区" }, + { "code": "321281", "name": "兴化市" }, + { "code": "321282", "name": "靖江市" }, + { "code": "321283", "name": "泰兴市" } + ] + }, + { + "code": "3213", + "name": "宿迁市", + "children": [ + { "code": "321302", "name": "宿城区" }, + { "code": "321311", "name": "宿豫区" }, + { "code": "321322", "name": "沭阳县" }, + { "code": "321323", "name": "泗阳县" }, + { "code": "321324", "name": "泗洪县" }, + { "code": "321371", "name": "宿迁经济技术开发区" } + ] + } + ] + }, + { + "code": "33", + "name": "浙江省", + "children": [ + { + "code": "3301", + "name": "杭州市", + "children": [ + { "code": "330102", "name": "上城区" }, + { "code": "330103", "name": "下城区" }, + { "code": "330104", "name": "江干区" }, + { "code": "330105", "name": "拱墅区" }, + { "code": "330106", "name": "西湖区" }, + { "code": "330108", "name": "滨江区" }, + { "code": "330109", "name": "萧山区" }, + { "code": "330110", "name": "余杭区" }, + { "code": "330111", "name": "富阳区" }, + { "code": "330112", "name": "临安区" }, + { "code": "330122", "name": "桐庐县" }, + { "code": "330127", "name": "淳安县" }, + { "code": "330182", "name": "建德市" } + ] + }, + { + "code": "3302", + "name": "宁波市", + "children": [ + { "code": "330203", "name": "海曙区" }, + { "code": "330205", "name": "江北区" }, + { "code": "330206", "name": "北仑区" }, + { "code": "330211", "name": "镇海区" }, + { "code": "330212", "name": "鄞州区" }, + { "code": "330213", "name": "奉化区" }, + { "code": "330225", "name": "象山县" }, + { "code": "330226", "name": "宁海县" }, + { "code": "330281", "name": "余姚市" }, + { "code": "330282", "name": "慈溪市" } + ] + }, + { + "code": "3303", + "name": "温州市", + "children": [ + { "code": "330302", "name": "鹿城区" }, + { "code": "330303", "name": "龙湾区" }, + { "code": "330304", "name": "瓯海区" }, + { "code": "330305", "name": "洞头区" }, + { "code": "330324", "name": "永嘉县" }, + { "code": "330326", "name": "平阳县" }, + { "code": "330327", "name": "苍南县" }, + { "code": "330328", "name": "文成县" }, + { "code": "330329", "name": "泰顺县" }, + { "code": "330371", "name": "温州经济技术开发区" }, + { "code": "330381", "name": "瑞安市" }, + { "code": "330382", "name": "乐清市" }, + { "code": "330383", "name": "龙港市" } + ] + }, + { + "code": "3304", + "name": "嘉兴市", + "children": [ + { "code": "330402", "name": "南湖区" }, + { "code": "330411", "name": "秀洲区" }, + { "code": "330421", "name": "嘉善县" }, + { "code": "330424", "name": "海盐县" }, + { "code": "330481", "name": "海宁市" }, + { "code": "330482", "name": "平湖市" }, + { "code": "330483", "name": "桐乡市" } + ] + }, + { + "code": "3305", + "name": "湖州市", + "children": [ + { "code": "330502", "name": "吴兴区" }, + { "code": "330503", "name": "南浔区" }, + { "code": "330521", "name": "德清县" }, + { "code": "330522", "name": "长兴县" }, + { "code": "330523", "name": "安吉县" } + ] + }, + { + "code": "3306", + "name": "绍兴市", + "children": [ + { "code": "330602", "name": "越城区" }, + { "code": "330603", "name": "柯桥区" }, + { "code": "330604", "name": "上虞区" }, + { "code": "330624", "name": "新昌县" }, + { "code": "330681", "name": "诸暨市" }, + { "code": "330683", "name": "嵊州市" } + ] + }, + { + "code": "3307", + "name": "金华市", + "children": [ + { "code": "330702", "name": "婺城区" }, + { "code": "330703", "name": "金东区" }, + { "code": "330723", "name": "武义县" }, + { "code": "330726", "name": "浦江县" }, + { "code": "330727", "name": "磐安县" }, + { "code": "330781", "name": "兰溪市" }, + { "code": "330782", "name": "义乌市" }, + { "code": "330783", "name": "东阳市" }, + { "code": "330784", "name": "永康市" } + ] + }, + { + "code": "3308", + "name": "衢州市", + "children": [ + { "code": "330802", "name": "柯城区" }, + { "code": "330803", "name": "衢江区" }, + { "code": "330822", "name": "常山县" }, + { "code": "330824", "name": "开化县" }, + { "code": "330825", "name": "龙游县" }, + { "code": "330881", "name": "江山市" } + ] + }, + { + "code": "3309", + "name": "舟山市", + "children": [ + { "code": "330902", "name": "定海区" }, + { "code": "330903", "name": "普陀区" }, + { "code": "330921", "name": "岱山县" }, + { "code": "330922", "name": "嵊泗县" } + ] + }, + { + "code": "3310", + "name": "台州市", + "children": [ + { "code": "331002", "name": "椒江区" }, + { "code": "331003", "name": "黄岩区" }, + { "code": "331004", "name": "路桥区" }, + { "code": "331022", "name": "三门县" }, + { "code": "331023", "name": "天台县" }, + { "code": "331024", "name": "仙居县" }, + { "code": "331081", "name": "温岭市" }, + { "code": "331082", "name": "临海市" }, + { "code": "331083", "name": "玉环市" } + ] + }, + { + "code": "3311", + "name": "丽水市", + "children": [ + { "code": "331102", "name": "莲都区" }, + { "code": "331121", "name": "青田县" }, + { "code": "331122", "name": "缙云县" }, + { "code": "331123", "name": "遂昌县" }, + { "code": "331124", "name": "松阳县" }, + { "code": "331125", "name": "云和县" }, + { "code": "331126", "name": "庆元县" }, + { "code": "331127", "name": "景宁畲族自治县" }, + { "code": "331181", "name": "龙泉市" } + ] + } + ] + }, + { + "code": "34", + "name": "安徽省", + "children": [ + { + "code": "3401", + "name": "合肥市", + "children": [ + { "code": "340102", "name": "瑶海区" }, + { "code": "340103", "name": "庐阳区" }, + { "code": "340104", "name": "蜀山区" }, + { "code": "340111", "name": "包河区" }, + { "code": "340121", "name": "长丰县" }, + { "code": "340122", "name": "肥东县" }, + { "code": "340123", "name": "肥西县" }, + { "code": "340124", "name": "庐江县" }, + { "code": "340171", "name": "合肥高新技术产业开发区" }, + { "code": "340172", "name": "合肥经济技术开发区" }, + { "code": "340173", "name": "合肥新站高新技术产业开发区" }, + { "code": "340181", "name": "巢湖市" } + ] + }, + { + "code": "3402", + "name": "芜湖市", + "children": [ + { "code": "340202", "name": "镜湖区" }, + { "code": "340203", "name": "弋江区" }, + { "code": "340207", "name": "鸠江区" }, + { "code": "340208", "name": "三山区" }, + { "code": "340221", "name": "芜湖县" }, + { "code": "340222", "name": "繁昌县" }, + { "code": "340223", "name": "南陵县" }, + { "code": "340225", "name": "无为县" }, + { "code": "340271", "name": "芜湖经济技术开发区" }, + { "code": "340272", "name": "安徽芜湖长江大桥经济开发区" } + ] + }, + { + "code": "3403", + "name": "蚌埠市", + "children": [ + { "code": "340302", "name": "龙子湖区" }, + { "code": "340303", "name": "蚌山区" }, + { "code": "340304", "name": "禹会区" }, + { "code": "340311", "name": "淮上区" }, + { "code": "340321", "name": "怀远县" }, + { "code": "340322", "name": "五河县" }, + { "code": "340323", "name": "固镇县" }, + { "code": "340371", "name": "蚌埠市高新技术开发区" }, + { "code": "340372", "name": "蚌埠市经济开发区" } + ] + }, + { + "code": "3404", + "name": "淮南市", + "children": [ + { "code": "340402", "name": "大通区" }, + { "code": "340403", "name": "田家庵区" }, + { "code": "340404", "name": "谢家集区" }, + { "code": "340405", "name": "八公山区" }, + { "code": "340406", "name": "潘集区" }, + { "code": "340421", "name": "凤台县" }, + { "code": "340422", "name": "寿县" } + ] + }, + { + "code": "3405", + "name": "马鞍山市", + "children": [ + { "code": "340503", "name": "花山区" }, + { "code": "340504", "name": "雨山区" }, + { "code": "340506", "name": "博望区" }, + { "code": "340521", "name": "当涂县" }, + { "code": "340522", "name": "含山县" }, + { "code": "340523", "name": "和县" } + ] + }, + { + "code": "3406", + "name": "淮北市", + "children": [ + { "code": "340602", "name": "杜集区" }, + { "code": "340603", "name": "相山区" }, + { "code": "340604", "name": "烈山区" }, + { "code": "340621", "name": "濉溪县" } + ] + }, + { + "code": "3407", + "name": "铜陵市", + "children": [ + { "code": "340705", "name": "铜官区" }, + { "code": "340706", "name": "义安区" }, + { "code": "340711", "name": "郊区" }, + { "code": "340722", "name": "枞阳县" } + ] + }, + { + "code": "3408", + "name": "安庆市", + "children": [ + { "code": "340802", "name": "迎江区" }, + { "code": "340803", "name": "大观区" }, + { "code": "340811", "name": "宜秀区" }, + { "code": "340822", "name": "怀宁县" }, + { "code": "340825", "name": "太湖县" }, + { "code": "340826", "name": "宿松县" }, + { "code": "340827", "name": "望江县" }, + { "code": "340828", "name": "岳西县" }, + { "code": "340871", "name": "安徽安庆经济开发区" }, + { "code": "340881", "name": "桐城市" }, + { "code": "340882", "name": "潜山市" } + ] + }, + { + "code": "3410", + "name": "黄山市", + "children": [ + { "code": "341002", "name": "屯溪区" }, + { "code": "341003", "name": "黄山区" }, + { "code": "341004", "name": "徽州区" }, + { "code": "341021", "name": "歙县" }, + { "code": "341022", "name": "休宁县" }, + { "code": "341023", "name": "黟县" }, + { "code": "341024", "name": "祁门县" } + ] + }, + { + "code": "3411", + "name": "滁州市", + "children": [ + { "code": "341102", "name": "琅琊区" }, + { "code": "341103", "name": "南谯区" }, + { "code": "341122", "name": "来安县" }, + { "code": "341124", "name": "全椒县" }, + { "code": "341125", "name": "定远县" }, + { "code": "341126", "name": "凤阳县" }, + { "code": "341171", "name": "苏滁现代产业园" }, + { "code": "341172", "name": "滁州经济技术开发区" }, + { "code": "341181", "name": "天长市" }, + { "code": "341182", "name": "明光市" } + ] + }, + { + "code": "3412", + "name": "阜阳市", + "children": [ + { "code": "341202", "name": "颍州区" }, + { "code": "341203", "name": "颍东区" }, + { "code": "341204", "name": "颍泉区" }, + { "code": "341221", "name": "临泉县" }, + { "code": "341222", "name": "太和县" }, + { "code": "341225", "name": "阜南县" }, + { "code": "341226", "name": "颍上县" }, + { "code": "341271", "name": "阜阳合肥现代产业园区" }, + { "code": "341272", "name": "阜阳经济技术开发区" }, + { "code": "341282", "name": "界首市" } + ] + }, + { + "code": "3413", + "name": "宿州市", + "children": [ + { "code": "341302", "name": "埇桥区" }, + { "code": "341321", "name": "砀山县" }, + { "code": "341322", "name": "萧县" }, + { "code": "341323", "name": "灵璧县" }, + { "code": "341324", "name": "泗县" }, + { "code": "341371", "name": "宿州马鞍山现代产业园区" }, + { "code": "341372", "name": "宿州经济技术开发区" } + ] + }, + { + "code": "3415", + "name": "六安市", + "children": [ + { "code": "341502", "name": "金安区" }, + { "code": "341503", "name": "裕安区" }, + { "code": "341504", "name": "叶集区" }, + { "code": "341522", "name": "霍邱县" }, + { "code": "341523", "name": "舒城县" }, + { "code": "341524", "name": "金寨县" }, + { "code": "341525", "name": "霍山县" } + ] + }, + { + "code": "3416", + "name": "亳州市", + "children": [ + { "code": "341602", "name": "谯城区" }, + { "code": "341621", "name": "涡阳县" }, + { "code": "341622", "name": "蒙城县" }, + { "code": "341623", "name": "利辛县" } + ] + }, + { + "code": "3417", + "name": "池州市", + "children": [ + { "code": "341702", "name": "贵池区" }, + { "code": "341721", "name": "东至县" }, + { "code": "341722", "name": "石台县" }, + { "code": "341723", "name": "青阳县" } + ] + }, + { + "code": "3418", + "name": "宣城市", + "children": [ + { "code": "341802", "name": "宣州区" }, + { "code": "341821", "name": "郎溪县" }, + { "code": "341823", "name": "泾县" }, + { "code": "341824", "name": "绩溪县" }, + { "code": "341825", "name": "旌德县" }, + { "code": "341871", "name": "宣城市经济开发区" }, + { "code": "341881", "name": "宁国市" }, + { "code": "341882", "name": "广德市" } + ] + } + ] + }, + { + "code": "35", + "name": "福建省", + "children": [ + { + "code": "3501", + "name": "福州市", + "children": [ + { "code": "350102", "name": "鼓楼区" }, + { "code": "350103", "name": "台江区" }, + { "code": "350104", "name": "仓山区" }, + { "code": "350105", "name": "马尾区" }, + { "code": "350111", "name": "晋安区" }, + { "code": "350112", "name": "长乐区" }, + { "code": "350121", "name": "闽侯县" }, + { "code": "350122", "name": "连江县" }, + { "code": "350123", "name": "罗源县" }, + { "code": "350124", "name": "闽清县" }, + { "code": "350125", "name": "永泰县" }, + { "code": "350128", "name": "平潭县" }, + { "code": "350181", "name": "福清市" } + ] + }, + { + "code": "3502", + "name": "厦门市", + "children": [ + { "code": "350203", "name": "思明区" }, + { "code": "350205", "name": "海沧区" }, + { "code": "350206", "name": "湖里区" }, + { "code": "350211", "name": "集美区" }, + { "code": "350212", "name": "同安区" }, + { "code": "350213", "name": "翔安区" } + ] + }, + { + "code": "3503", + "name": "莆田市", + "children": [ + { "code": "350302", "name": "城厢区" }, + { "code": "350303", "name": "涵江区" }, + { "code": "350304", "name": "荔城区" }, + { "code": "350305", "name": "秀屿区" }, + { "code": "350322", "name": "仙游县" } + ] + }, + { + "code": "3504", + "name": "三明市", + "children": [ + { "code": "350402", "name": "梅列区" }, + { "code": "350403", "name": "三元区" }, + { "code": "350421", "name": "明溪县" }, + { "code": "350423", "name": "清流县" }, + { "code": "350424", "name": "宁化县" }, + { "code": "350425", "name": "大田县" }, + { "code": "350426", "name": "尤溪县" }, + { "code": "350427", "name": "沙县" }, + { "code": "350428", "name": "将乐县" }, + { "code": "350429", "name": "泰宁县" }, + { "code": "350430", "name": "建宁县" }, + { "code": "350481", "name": "永安市" } + ] + }, + { + "code": "3505", + "name": "泉州市", + "children": [ + { "code": "350502", "name": "鲤城区" }, + { "code": "350503", "name": "丰泽区" }, + { "code": "350504", "name": "洛江区" }, + { "code": "350505", "name": "泉港区" }, + { "code": "350521", "name": "惠安县" }, + { "code": "350524", "name": "安溪县" }, + { "code": "350525", "name": "永春县" }, + { "code": "350526", "name": "德化县" }, + { "code": "350527", "name": "金门县" }, + { "code": "350581", "name": "石狮市" }, + { "code": "350582", "name": "晋江市" }, + { "code": "350583", "name": "南安市" } + ] + }, + { + "code": "3506", + "name": "漳州市", + "children": [ + { "code": "350602", "name": "芗城区" }, + { "code": "350603", "name": "龙文区" }, + { "code": "350622", "name": "云霄县" }, + { "code": "350623", "name": "漳浦县" }, + { "code": "350624", "name": "诏安县" }, + { "code": "350625", "name": "长泰县" }, + { "code": "350626", "name": "东山县" }, + { "code": "350627", "name": "南靖县" }, + { "code": "350628", "name": "平和县" }, + { "code": "350629", "name": "华安县" }, + { "code": "350681", "name": "龙海市" } + ] + }, + { + "code": "3507", + "name": "南平市", + "children": [ + { "code": "350702", "name": "延平区" }, + { "code": "350703", "name": "建阳区" }, + { "code": "350721", "name": "顺昌县" }, + { "code": "350722", "name": "浦城县" }, + { "code": "350723", "name": "光泽县" }, + { "code": "350724", "name": "松溪县" }, + { "code": "350725", "name": "政和县" }, + { "code": "350781", "name": "邵武市" }, + { "code": "350782", "name": "武夷山市" }, + { "code": "350783", "name": "建瓯市" } + ] + }, + { + "code": "3508", + "name": "龙岩市", + "children": [ + { "code": "350802", "name": "新罗区" }, + { "code": "350803", "name": "永定区" }, + { "code": "350821", "name": "长汀县" }, + { "code": "350823", "name": "上杭县" }, + { "code": "350824", "name": "武平县" }, + { "code": "350825", "name": "连城县" }, + { "code": "350881", "name": "漳平市" } + ] + }, + { + "code": "3509", + "name": "宁德市", + "children": [ + { "code": "350902", "name": "蕉城区" }, + { "code": "350921", "name": "霞浦县" }, + { "code": "350922", "name": "古田县" }, + { "code": "350923", "name": "屏南县" }, + { "code": "350924", "name": "寿宁县" }, + { "code": "350925", "name": "周宁县" }, + { "code": "350926", "name": "柘荣县" }, + { "code": "350981", "name": "福安市" }, + { "code": "350982", "name": "福鼎市" } + ] + } + ] + }, + { + "code": "36", + "name": "江西省", + "children": [ + { + "code": "3601", + "name": "南昌市", + "children": [ + { "code": "360102", "name": "东湖区" }, + { "code": "360103", "name": "西湖区" }, + { "code": "360104", "name": "青云谱区" }, + { "code": "360105", "name": "湾里区" }, + { "code": "360111", "name": "青山湖区" }, + { "code": "360112", "name": "新建区" }, + { "code": "360121", "name": "南昌县" }, + { "code": "360123", "name": "安义县" }, + { "code": "360124", "name": "进贤县" } + ] + }, + { + "code": "3602", + "name": "景德镇市", + "children": [ + { "code": "360202", "name": "昌江区" }, + { "code": "360203", "name": "珠山区" }, + { "code": "360222", "name": "浮梁县" }, + { "code": "360281", "name": "乐平市" } + ] + }, + { + "code": "3603", + "name": "萍乡市", + "children": [ + { "code": "360302", "name": "安源区" }, + { "code": "360313", "name": "湘东区" }, + { "code": "360321", "name": "莲花县" }, + { "code": "360322", "name": "上栗县" }, + { "code": "360323", "name": "芦溪县" } + ] + }, + { + "code": "3604", + "name": "九江市", + "children": [ + { "code": "360402", "name": "濂溪区" }, + { "code": "360403", "name": "浔阳区" }, + { "code": "360404", "name": "柴桑区" }, + { "code": "360423", "name": "武宁县" }, + { "code": "360424", "name": "修水县" }, + { "code": "360425", "name": "永修县" }, + { "code": "360426", "name": "德安县" }, + { "code": "360428", "name": "都昌县" }, + { "code": "360429", "name": "湖口县" }, + { "code": "360430", "name": "彭泽县" }, + { "code": "360481", "name": "瑞昌市" }, + { "code": "360482", "name": "共青城市" }, + { "code": "360483", "name": "庐山市" } + ] + }, + { + "code": "3605", + "name": "新余市", + "children": [ + { "code": "360502", "name": "渝水区" }, + { "code": "360521", "name": "分宜县" } + ] + }, + { + "code": "3606", + "name": "鹰潭市", + "children": [ + { "code": "360602", "name": "月湖区" }, + { "code": "360603", "name": "余江区" }, + { "code": "360681", "name": "贵溪市" } + ] + }, + { + "code": "3607", + "name": "赣州市", + "children": [ + { "code": "360702", "name": "章贡区" }, + { "code": "360703", "name": "南康区" }, + { "code": "360704", "name": "赣县区" }, + { "code": "360722", "name": "信丰县" }, + { "code": "360723", "name": "大余县" }, + { "code": "360724", "name": "上犹县" }, + { "code": "360725", "name": "崇义县" }, + { "code": "360726", "name": "安远县" }, + { "code": "360727", "name": "龙南县" }, + { "code": "360728", "name": "定南县" }, + { "code": "360729", "name": "全南县" }, + { "code": "360730", "name": "宁都县" }, + { "code": "360731", "name": "于都县" }, + { "code": "360732", "name": "兴国县" }, + { "code": "360733", "name": "会昌县" }, + { "code": "360734", "name": "寻乌县" }, + { "code": "360735", "name": "石城县" }, + { "code": "360781", "name": "瑞金市" } + ] + }, + { + "code": "3608", + "name": "吉安市", + "children": [ + { "code": "360802", "name": "吉州区" }, + { "code": "360803", "name": "青原区" }, + { "code": "360821", "name": "吉安县" }, + { "code": "360822", "name": "吉水县" }, + { "code": "360823", "name": "峡江县" }, + { "code": "360824", "name": "新干县" }, + { "code": "360825", "name": "永丰县" }, + { "code": "360826", "name": "泰和县" }, + { "code": "360827", "name": "遂川县" }, + { "code": "360828", "name": "万安县" }, + { "code": "360829", "name": "安福县" }, + { "code": "360830", "name": "永新县" }, + { "code": "360881", "name": "井冈山市" } + ] + }, + { + "code": "3609", + "name": "宜春市", + "children": [ + { "code": "360902", "name": "袁州区" }, + { "code": "360921", "name": "奉新县" }, + { "code": "360922", "name": "万载县" }, + { "code": "360923", "name": "上高县" }, + { "code": "360924", "name": "宜丰县" }, + { "code": "360925", "name": "靖安县" }, + { "code": "360926", "name": "铜鼓县" }, + { "code": "360981", "name": "丰城市" }, + { "code": "360982", "name": "樟树市" }, + { "code": "360983", "name": "高安市" } + ] + }, + { + "code": "3610", + "name": "抚州市", + "children": [ + { "code": "361002", "name": "临川区" }, + { "code": "361003", "name": "东乡区" }, + { "code": "361021", "name": "南城县" }, + { "code": "361022", "name": "黎川县" }, + { "code": "361023", "name": "南丰县" }, + { "code": "361024", "name": "崇仁县" }, + { "code": "361025", "name": "乐安县" }, + { "code": "361026", "name": "宜黄县" }, + { "code": "361027", "name": "金溪县" }, + { "code": "361028", "name": "资溪县" }, + { "code": "361030", "name": "广昌县" } + ] + }, + { + "code": "3611", + "name": "上饶市", + "children": [ + { "code": "361102", "name": "信州区" }, + { "code": "361103", "name": "广丰区" }, + { "code": "361104", "name": "广信区" }, + { "code": "361123", "name": "玉山县" }, + { "code": "361124", "name": "铅山县" }, + { "code": "361125", "name": "横峰县" }, + { "code": "361126", "name": "弋阳县" }, + { "code": "361127", "name": "余干县" }, + { "code": "361128", "name": "鄱阳县" }, + { "code": "361129", "name": "万年县" }, + { "code": "361130", "name": "婺源县" }, + { "code": "361181", "name": "德兴市" } + ] + } + ] + }, + { + "code": "37", + "name": "山东省", + "children": [ + { + "code": "3701", + "name": "济南市", + "children": [ + { "code": "370102", "name": "历下区" }, + { "code": "370103", "name": "市中区" }, + { "code": "370104", "name": "槐荫区" }, + { "code": "370105", "name": "天桥区" }, + { "code": "370112", "name": "历城区" }, + { "code": "370113", "name": "长清区" }, + { "code": "370114", "name": "章丘区" }, + { "code": "370115", "name": "济阳区" }, + { "code": "370116", "name": "莱芜区" }, + { "code": "370117", "name": "钢城区" }, + { "code": "370124", "name": "平阴县" }, + { "code": "370126", "name": "商河县" }, + { "code": "370171", "name": "济南高新技术产业开发区" } + ] + }, + { + "code": "3702", + "name": "青岛市", + "children": [ + { "code": "370202", "name": "市南区" }, + { "code": "370203", "name": "市北区" }, + { "code": "370211", "name": "黄岛区" }, + { "code": "370212", "name": "崂山区" }, + { "code": "370213", "name": "李沧区" }, + { "code": "370214", "name": "城阳区" }, + { "code": "370215", "name": "即墨区" }, + { "code": "370271", "name": "青岛高新技术产业开发区" }, + { "code": "370281", "name": "胶州市" }, + { "code": "370283", "name": "平度市" }, + { "code": "370285", "name": "莱西市" } + ] + }, + { + "code": "3703", + "name": "淄博市", + "children": [ + { "code": "370302", "name": "淄川区" }, + { "code": "370303", "name": "张店区" }, + { "code": "370304", "name": "博山区" }, + { "code": "370305", "name": "临淄区" }, + { "code": "370306", "name": "周村区" }, + { "code": "370321", "name": "桓台县" }, + { "code": "370322", "name": "高青县" }, + { "code": "370323", "name": "沂源县" } + ] + }, + { + "code": "3704", + "name": "枣庄市", + "children": [ + { "code": "370402", "name": "市中区" }, + { "code": "370403", "name": "薛城区" }, + { "code": "370404", "name": "峄城区" }, + { "code": "370405", "name": "台儿庄区" }, + { "code": "370406", "name": "山亭区" }, + { "code": "370481", "name": "滕州市" } + ] + }, + { + "code": "3705", + "name": "东营市", + "children": [ + { "code": "370502", "name": "东营区" }, + { "code": "370503", "name": "河口区" }, + { "code": "370505", "name": "垦利区" }, + { "code": "370522", "name": "利津县" }, + { "code": "370523", "name": "广饶县" }, + { "code": "370571", "name": "东营经济技术开发区" }, + { "code": "370572", "name": "东营港经济开发区" } + ] + }, + { + "code": "3706", + "name": "烟台市", + "children": [ + { "code": "370602", "name": "芝罘区" }, + { "code": "370611", "name": "福山区" }, + { "code": "370612", "name": "牟平区" }, + { "code": "370613", "name": "莱山区" }, + { "code": "370634", "name": "长岛县" }, + { "code": "370671", "name": "烟台高新技术产业开发区" }, + { "code": "370672", "name": "烟台经济技术开发区" }, + { "code": "370681", "name": "龙口市" }, + { "code": "370682", "name": "莱阳市" }, + { "code": "370683", "name": "莱州市" }, + { "code": "370684", "name": "蓬莱市" }, + { "code": "370685", "name": "招远市" }, + { "code": "370686", "name": "栖霞市" }, + { "code": "370687", "name": "海阳市" } + ] + }, + { + "code": "3707", + "name": "潍坊市", + "children": [ + { "code": "370702", "name": "潍城区" }, + { "code": "370703", "name": "寒亭区" }, + { "code": "370704", "name": "坊子区" }, + { "code": "370705", "name": "奎文区" }, + { "code": "370724", "name": "临朐县" }, + { "code": "370725", "name": "昌乐县" }, + { "code": "370772", "name": "潍坊滨海经济技术开发区" }, + { "code": "370781", "name": "青州市" }, + { "code": "370782", "name": "诸城市" }, + { "code": "370783", "name": "寿光市" }, + { "code": "370784", "name": "安丘市" }, + { "code": "370785", "name": "高密市" }, + { "code": "370786", "name": "昌邑市" } + ] + }, + { + "code": "3708", + "name": "济宁市", + "children": [ + { "code": "370811", "name": "任城区" }, + { "code": "370812", "name": "兖州区" }, + { "code": "370826", "name": "微山县" }, + { "code": "370827", "name": "鱼台县" }, + { "code": "370828", "name": "金乡县" }, + { "code": "370829", "name": "嘉祥县" }, + { "code": "370830", "name": "汶上县" }, + { "code": "370831", "name": "泗水县" }, + { "code": "370832", "name": "梁山县" }, + { "code": "370871", "name": "济宁高新技术产业开发区" }, + { "code": "370881", "name": "曲阜市" }, + { "code": "370883", "name": "邹城市" } + ] + }, + { + "code": "3709", + "name": "泰安市", + "children": [ + { "code": "370902", "name": "泰山区" }, + { "code": "370911", "name": "岱岳区" }, + { "code": "370921", "name": "宁阳县" }, + { "code": "370923", "name": "东平县" }, + { "code": "370982", "name": "新泰市" }, + { "code": "370983", "name": "肥城市" } + ] + }, + { + "code": "3710", + "name": "威海市", + "children": [ + { "code": "371002", "name": "环翠区" }, + { "code": "371003", "name": "文登区" }, + { "code": "371071", "name": "威海火炬高技术产业开发区" }, + { "code": "371072", "name": "威海经济技术开发区" }, + { "code": "371073", "name": "威海临港经济技术开发区" }, + { "code": "371082", "name": "荣成市" }, + { "code": "371083", "name": "乳山市" } + ] + }, + { + "code": "3711", + "name": "日照市", + "children": [ + { "code": "371102", "name": "东港区" }, + { "code": "371103", "name": "岚山区" }, + { "code": "371121", "name": "五莲县" }, + { "code": "371122", "name": "莒县" }, + { "code": "371171", "name": "日照经济技术开发区" } + ] + }, + { + "code": "3713", + "name": "临沂市", + "children": [ + { "code": "371302", "name": "兰山区" }, + { "code": "371311", "name": "罗庄区" }, + { "code": "371312", "name": "河东区" }, + { "code": "371321", "name": "沂南县" }, + { "code": "371322", "name": "郯城县" }, + { "code": "371323", "name": "沂水县" }, + { "code": "371324", "name": "兰陵县" }, + { "code": "371325", "name": "费县" }, + { "code": "371326", "name": "平邑县" }, + { "code": "371327", "name": "莒南县" }, + { "code": "371328", "name": "蒙阴县" }, + { "code": "371329", "name": "临沭县" }, + { "code": "371371", "name": "临沂高新技术产业开发区" }, + { "code": "371372", "name": "临沂经济技术开发区" }, + { "code": "371373", "name": "临沂临港经济开发区" } + ] + }, + { + "code": "3714", + "name": "德州市", + "children": [ + { "code": "371402", "name": "德城区" }, + { "code": "371403", "name": "陵城区" }, + { "code": "371422", "name": "宁津县" }, + { "code": "371423", "name": "庆云县" }, + { "code": "371424", "name": "临邑县" }, + { "code": "371425", "name": "齐河县" }, + { "code": "371426", "name": "平原县" }, + { "code": "371427", "name": "夏津县" }, + { "code": "371428", "name": "武城县" }, + { "code": "371471", "name": "德州经济技术开发区" }, + { "code": "371472", "name": "德州运河经济开发区" }, + { "code": "371481", "name": "乐陵市" }, + { "code": "371482", "name": "禹城市" } + ] + }, + { + "code": "3715", + "name": "聊城市", + "children": [ + { "code": "371502", "name": "东昌府区" }, + { "code": "371503", "name": "茌平区" }, + { "code": "371521", "name": "阳谷县" }, + { "code": "371522", "name": "莘县" }, + { "code": "371524", "name": "东阿县" }, + { "code": "371525", "name": "冠县" }, + { "code": "371526", "name": "高唐县" }, + { "code": "371581", "name": "临清市" } + ] + }, + { + "code": "3716", + "name": "滨州市", + "children": [ + { "code": "371602", "name": "滨城区" }, + { "code": "371603", "name": "沾化区" }, + { "code": "371621", "name": "惠民县" }, + { "code": "371622", "name": "阳信县" }, + { "code": "371623", "name": "无棣县" }, + { "code": "371625", "name": "博兴县" }, + { "code": "371681", "name": "邹平市" } + ] + }, + { + "code": "3717", + "name": "菏泽市", + "children": [ + { "code": "371702", "name": "牡丹区" }, + { "code": "371703", "name": "定陶区" }, + { "code": "371721", "name": "曹县" }, + { "code": "371722", "name": "单县" }, + { "code": "371723", "name": "成武县" }, + { "code": "371724", "name": "巨野县" }, + { "code": "371725", "name": "郓城县" }, + { "code": "371726", "name": "鄄城县" }, + { "code": "371728", "name": "东明县" }, + { "code": "371771", "name": "菏泽经济技术开发区" }, + { "code": "371772", "name": "菏泽高新技术开发区" } + ] + } + ] + }, + { + "code": "41", + "name": "河南省", + "children": [ + { + "code": "4101", + "name": "郑州市", + "children": [ + { "code": "410102", "name": "中原区" }, + { "code": "410103", "name": "二七区" }, + { "code": "410104", "name": "管城回族区" }, + { "code": "410105", "name": "金水区" }, + { "code": "410106", "name": "上街区" }, + { "code": "410108", "name": "惠济区" }, + { "code": "410122", "name": "中牟县" }, + { "code": "410171", "name": "郑州经济技术开发区" }, + { "code": "410172", "name": "郑州高新技术产业开发区" }, + { "code": "410173", "name": "郑州航空港经济综合实验区" }, + { "code": "410181", "name": "巩义市" }, + { "code": "410182", "name": "荥阳市" }, + { "code": "410183", "name": "新密市" }, + { "code": "410184", "name": "新郑市" }, + { "code": "410185", "name": "登封市" } + ] + }, + { + "code": "4102", + "name": "开封市", + "children": [ + { "code": "410202", "name": "龙亭区" }, + { "code": "410203", "name": "顺河回族区" }, + { "code": "410204", "name": "鼓楼区" }, + { "code": "410205", "name": "禹王台区" }, + { "code": "410212", "name": "祥符区" }, + { "code": "410221", "name": "杞县" }, + { "code": "410222", "name": "通许县" }, + { "code": "410223", "name": "尉氏县" }, + { "code": "410225", "name": "兰考县" } + ] + }, + { + "code": "4103", + "name": "洛阳市", + "children": [ + { "code": "410302", "name": "老城区" }, + { "code": "410303", "name": "西工区" }, + { "code": "410304", "name": "瀍河回族区" }, + { "code": "410305", "name": "涧西区" }, + { "code": "410306", "name": "吉利区" }, + { "code": "410311", "name": "洛龙区" }, + { "code": "410322", "name": "孟津县" }, + { "code": "410323", "name": "新安县" }, + { "code": "410324", "name": "栾川县" }, + { "code": "410325", "name": "嵩县" }, + { "code": "410326", "name": "汝阳县" }, + { "code": "410327", "name": "宜阳县" }, + { "code": "410328", "name": "洛宁县" }, + { "code": "410329", "name": "伊川县" }, + { "code": "410371", "name": "洛阳高新技术产业开发区" }, + { "code": "410381", "name": "偃师市" } + ] + }, + { + "code": "4104", + "name": "平顶山市", + "children": [ + { "code": "410402", "name": "新华区" }, + { "code": "410403", "name": "卫东区" }, + { "code": "410404", "name": "石龙区" }, + { "code": "410411", "name": "湛河区" }, + { "code": "410421", "name": "宝丰县" }, + { "code": "410422", "name": "叶县" }, + { "code": "410423", "name": "鲁山县" }, + { "code": "410425", "name": "郏县" }, + { "code": "410471", "name": "平顶山高新技术产业开发区" }, + { "code": "410472", "name": "平顶山市城乡一体化示范区" }, + { "code": "410481", "name": "舞钢市" }, + { "code": "410482", "name": "汝州市" } + ] + }, + { + "code": "4105", + "name": "安阳市", + "children": [ + { "code": "410502", "name": "文峰区" }, + { "code": "410503", "name": "北关区" }, + { "code": "410505", "name": "殷都区" }, + { "code": "410506", "name": "龙安区" }, + { "code": "410522", "name": "安阳县" }, + { "code": "410523", "name": "汤阴县" }, + { "code": "410526", "name": "滑县" }, + { "code": "410527", "name": "内黄县" }, + { "code": "410571", "name": "安阳高新技术产业开发区" }, + { "code": "410581", "name": "林州市" } + ] + }, + { + "code": "4106", + "name": "鹤壁市", + "children": [ + { "code": "410602", "name": "鹤山区" }, + { "code": "410603", "name": "山城区" }, + { "code": "410611", "name": "淇滨区" }, + { "code": "410621", "name": "浚县" }, + { "code": "410622", "name": "淇县" }, + { "code": "410671", "name": "鹤壁经济技术开发区" } + ] + }, + { + "code": "4107", + "name": "新乡市", + "children": [ + { "code": "410702", "name": "红旗区" }, + { "code": "410703", "name": "卫滨区" }, + { "code": "410704", "name": "凤泉区" }, + { "code": "410711", "name": "牧野区" }, + { "code": "410721", "name": "新乡县" }, + { "code": "410724", "name": "获嘉县" }, + { "code": "410725", "name": "原阳县" }, + { "code": "410726", "name": "延津县" }, + { "code": "410727", "name": "封丘县" }, + { "code": "410771", "name": "新乡高新技术产业开发区" }, + { "code": "410772", "name": "新乡经济技术开发区" }, + { "code": "410773", "name": "新乡市平原城乡一体化示范区" }, + { "code": "410781", "name": "卫辉市" }, + { "code": "410782", "name": "辉县市" }, + { "code": "410783", "name": "长垣市" } + ] + }, + { + "code": "4108", + "name": "焦作市", + "children": [ + { "code": "410802", "name": "解放区" }, + { "code": "410803", "name": "中站区" }, + { "code": "410804", "name": "马村区" }, + { "code": "410811", "name": "山阳区" }, + { "code": "410821", "name": "修武县" }, + { "code": "410822", "name": "博爱县" }, + { "code": "410823", "name": "武陟县" }, + { "code": "410825", "name": "温县" }, + { "code": "410871", "name": "焦作城乡一体化示范区" }, + { "code": "410882", "name": "沁阳市" }, + { "code": "410883", "name": "孟州市" } + ] + }, + { + "code": "4109", + "name": "濮阳市", + "children": [ + { "code": "410902", "name": "华龙区" }, + { "code": "410922", "name": "清丰县" }, + { "code": "410923", "name": "南乐县" }, + { "code": "410926", "name": "范县" }, + { "code": "410927", "name": "台前县" }, + { "code": "410928", "name": "濮阳县" }, + { "code": "410971", "name": "河南濮阳工业园区" }, + { "code": "410972", "name": "濮阳经济技术开发区" } + ] + }, + { + "code": "4110", + "name": "许昌市", + "children": [ + { "code": "411002", "name": "魏都区" }, + { "code": "411003", "name": "建安区" }, + { "code": "411024", "name": "鄢陵县" }, + { "code": "411025", "name": "襄城县" }, + { "code": "411071", "name": "许昌经济技术开发区" }, + { "code": "411081", "name": "禹州市" }, + { "code": "411082", "name": "长葛市" } + ] + }, + { + "code": "4111", + "name": "漯河市", + "children": [ + { "code": "411102", "name": "源汇区" }, + { "code": "411103", "name": "郾城区" }, + { "code": "411104", "name": "召陵区" }, + { "code": "411121", "name": "舞阳县" }, + { "code": "411122", "name": "临颍县" }, + { "code": "411171", "name": "漯河经济技术开发区" } + ] + }, + { + "code": "4112", + "name": "三门峡市", + "children": [ + { "code": "411202", "name": "湖滨区" }, + { "code": "411203", "name": "陕州区" }, + { "code": "411221", "name": "渑池县" }, + { "code": "411224", "name": "卢氏县" }, + { "code": "411271", "name": "河南三门峡经济开发区" }, + { "code": "411281", "name": "义马市" }, + { "code": "411282", "name": "灵宝市" } + ] + }, + { + "code": "4113", + "name": "南阳市", + "children": [ + { "code": "411302", "name": "宛城区" }, + { "code": "411303", "name": "卧龙区" }, + { "code": "411321", "name": "南召县" }, + { "code": "411322", "name": "方城县" }, + { "code": "411323", "name": "西峡县" }, + { "code": "411324", "name": "镇平县" }, + { "code": "411325", "name": "内乡县" }, + { "code": "411326", "name": "淅川县" }, + { "code": "411327", "name": "社旗县" }, + { "code": "411328", "name": "唐河县" }, + { "code": "411329", "name": "新野县" }, + { "code": "411330", "name": "桐柏县" }, + { "code": "411371", "name": "南阳高新技术产业开发区" }, + { "code": "411372", "name": "南阳市城乡一体化示范区" }, + { "code": "411381", "name": "邓州市" } + ] + }, + { + "code": "4114", + "name": "商丘市", + "children": [ + { "code": "411402", "name": "梁园区" }, + { "code": "411403", "name": "睢阳区" }, + { "code": "411421", "name": "民权县" }, + { "code": "411422", "name": "睢县" }, + { "code": "411423", "name": "宁陵县" }, + { "code": "411424", "name": "柘城县" }, + { "code": "411425", "name": "虞城县" }, + { "code": "411426", "name": "夏邑县" }, + { "code": "411471", "name": "豫东综合物流产业聚集区" }, + { "code": "411472", "name": "河南商丘经济开发区" }, + { "code": "411481", "name": "永城市" } + ] + }, + { + "code": "4115", + "name": "信阳市", + "children": [ + { "code": "411502", "name": "浉河区" }, + { "code": "411503", "name": "平桥区" }, + { "code": "411521", "name": "罗山县" }, + { "code": "411522", "name": "光山县" }, + { "code": "411523", "name": "新县" }, + { "code": "411524", "name": "商城县" }, + { "code": "411525", "name": "固始县" }, + { "code": "411526", "name": "潢川县" }, + { "code": "411527", "name": "淮滨县" }, + { "code": "411528", "name": "息县" }, + { "code": "411571", "name": "信阳高新技术产业开发区" } + ] + }, + { + "code": "4116", + "name": "周口市", + "children": [ + { "code": "411602", "name": "川汇区" }, + { "code": "411603", "name": "淮阳区" }, + { "code": "411621", "name": "扶沟县" }, + { "code": "411622", "name": "西华县" }, + { "code": "411623", "name": "商水县" }, + { "code": "411624", "name": "沈丘县" }, + { "code": "411625", "name": "郸城县" }, + { "code": "411627", "name": "太康县" }, + { "code": "411628", "name": "鹿邑县" }, + { "code": "411671", "name": "河南周口经济开发区" }, + { "code": "411681", "name": "项城市" } + ] + }, + { + "code": "4117", + "name": "驻马店市", + "children": [ + { "code": "411702", "name": "驿城区" }, + { "code": "411721", "name": "西平县" }, + { "code": "411722", "name": "上蔡县" }, + { "code": "411723", "name": "平舆县" }, + { "code": "411724", "name": "正阳县" }, + { "code": "411725", "name": "确山县" }, + { "code": "411726", "name": "泌阳县" }, + { "code": "411727", "name": "汝南县" }, + { "code": "411728", "name": "遂平县" }, + { "code": "411729", "name": "新蔡县" }, + { "code": "411771", "name": "河南驻马店经济开发区" } + ] + }, + { + "code": "4190", + "name": "省直辖县级行政区划", + "children": [{ "code": "419001", "name": "济源市" }] + } + ] + }, + { + "code": "42", + "name": "湖北省", + "children": [ + { + "code": "4201", + "name": "武汉市", + "children": [ + { "code": "420102", "name": "江岸区" }, + { "code": "420103", "name": "江汉区" }, + { "code": "420104", "name": "硚口区" }, + { "code": "420105", "name": "汉阳区" }, + { "code": "420106", "name": "武昌区" }, + { "code": "420107", "name": "青山区" }, + { "code": "420111", "name": "洪山区" }, + { "code": "420112", "name": "东西湖区" }, + { "code": "420113", "name": "汉南区" }, + { "code": "420114", "name": "蔡甸区" }, + { "code": "420115", "name": "江夏区" }, + { "code": "420116", "name": "黄陂区" }, + { "code": "420117", "name": "新洲区" } + ] + }, + { + "code": "4202", + "name": "黄石市", + "children": [ + { "code": "420202", "name": "黄石港区" }, + { "code": "420203", "name": "西塞山区" }, + { "code": "420204", "name": "下陆区" }, + { "code": "420205", "name": "铁山区" }, + { "code": "420222", "name": "阳新县" }, + { "code": "420281", "name": "大冶市" } + ] + }, + { + "code": "4203", + "name": "十堰市", + "children": [ + { "code": "420302", "name": "茅箭区" }, + { "code": "420303", "name": "张湾区" }, + { "code": "420304", "name": "郧阳区" }, + { "code": "420322", "name": "郧西县" }, + { "code": "420323", "name": "竹山县" }, + { "code": "420324", "name": "竹溪县" }, + { "code": "420325", "name": "房县" }, + { "code": "420381", "name": "丹江口市" } + ] + }, + { + "code": "4205", + "name": "宜昌市", + "children": [ + { "code": "420502", "name": "西陵区" }, + { "code": "420503", "name": "伍家岗区" }, + { "code": "420504", "name": "点军区" }, + { "code": "420505", "name": "猇亭区" }, + { "code": "420506", "name": "夷陵区" }, + { "code": "420525", "name": "远安县" }, + { "code": "420526", "name": "兴山县" }, + { "code": "420527", "name": "秭归县" }, + { "code": "420528", "name": "长阳土家族自治县" }, + { "code": "420529", "name": "五峰土家族自治县" }, + { "code": "420581", "name": "宜都市" }, + { "code": "420582", "name": "当阳市" }, + { "code": "420583", "name": "枝江市" } + ] + }, + { + "code": "4206", + "name": "襄阳市", + "children": [ + { "code": "420602", "name": "襄城区" }, + { "code": "420606", "name": "樊城区" }, + { "code": "420607", "name": "襄州区" }, + { "code": "420624", "name": "南漳县" }, + { "code": "420625", "name": "谷城县" }, + { "code": "420626", "name": "保康县" }, + { "code": "420682", "name": "老河口市" }, + { "code": "420683", "name": "枣阳市" }, + { "code": "420684", "name": "宜城市" } + ] + }, + { + "code": "4207", + "name": "鄂州市", + "children": [ + { "code": "420702", "name": "梁子湖区" }, + { "code": "420703", "name": "华容区" }, + { "code": "420704", "name": "鄂城区" } + ] + }, + { + "code": "4208", + "name": "荆门市", + "children": [ + { "code": "420802", "name": "东宝区" }, + { "code": "420804", "name": "掇刀区" }, + { "code": "420822", "name": "沙洋县" }, + { "code": "420881", "name": "钟祥市" }, + { "code": "420882", "name": "京山市" } + ] + }, + { + "code": "4209", + "name": "孝感市", + "children": [ + { "code": "420902", "name": "孝南区" }, + { "code": "420921", "name": "孝昌县" }, + { "code": "420922", "name": "大悟县" }, + { "code": "420923", "name": "云梦县" }, + { "code": "420981", "name": "应城市" }, + { "code": "420982", "name": "安陆市" }, + { "code": "420984", "name": "汉川市" } + ] + }, + { + "code": "4210", + "name": "荆州市", + "children": [ + { "code": "421002", "name": "沙市区" }, + { "code": "421003", "name": "荆州区" }, + { "code": "421022", "name": "公安县" }, + { "code": "421023", "name": "监利县" }, + { "code": "421024", "name": "江陵县" }, + { "code": "421071", "name": "荆州经济技术开发区" }, + { "code": "421081", "name": "石首市" }, + { "code": "421083", "name": "洪湖市" }, + { "code": "421087", "name": "松滋市" } + ] + }, + { + "code": "4211", + "name": "黄冈市", + "children": [ + { "code": "421102", "name": "黄州区" }, + { "code": "421121", "name": "团风县" }, + { "code": "421122", "name": "红安县" }, + { "code": "421123", "name": "罗田县" }, + { "code": "421124", "name": "英山县" }, + { "code": "421125", "name": "浠水县" }, + { "code": "421126", "name": "蕲春县" }, + { "code": "421127", "name": "黄梅县" }, + { "code": "421171", "name": "龙感湖管理区" }, + { "code": "421181", "name": "麻城市" }, + { "code": "421182", "name": "武穴市" } + ] + }, + { + "code": "4212", + "name": "咸宁市", + "children": [ + { "code": "421202", "name": "咸安区" }, + { "code": "421221", "name": "嘉鱼县" }, + { "code": "421222", "name": "通城县" }, + { "code": "421223", "name": "崇阳县" }, + { "code": "421224", "name": "通山县" }, + { "code": "421281", "name": "赤壁市" } + ] + }, + { + "code": "4213", + "name": "随州市", + "children": [ + { "code": "421303", "name": "曾都区" }, + { "code": "421321", "name": "随县" }, + { "code": "421381", "name": "广水市" } + ] + }, + { + "code": "4228", + "name": "恩施土家族苗族自治州", + "children": [ + { "code": "422801", "name": "恩施市" }, + { "code": "422802", "name": "利川市" }, + { "code": "422822", "name": "建始县" }, + { "code": "422823", "name": "巴东县" }, + { "code": "422825", "name": "宣恩县" }, + { "code": "422826", "name": "咸丰县" }, + { "code": "422827", "name": "来凤县" }, + { "code": "422828", "name": "鹤峰县" } + ] + }, + { + "code": "4290", + "name": "省直辖县级行政区划", + "children": [ + { "code": "429004", "name": "仙桃市" }, + { "code": "429005", "name": "潜江市" }, + { "code": "429006", "name": "天门市" }, + { "code": "429021", "name": "神农架林区" } + ] + } + ] + }, + { + "code": "43", + "name": "湖南省", + "children": [ + { + "code": "4301", + "name": "长沙市", + "children": [ + { "code": "430102", "name": "芙蓉区" }, + { "code": "430103", "name": "天心区" }, + { "code": "430104", "name": "岳麓区" }, + { "code": "430105", "name": "开福区" }, + { "code": "430111", "name": "雨花区" }, + { "code": "430112", "name": "望城区" }, + { "code": "430121", "name": "长沙县" }, + { "code": "430181", "name": "浏阳市" }, + { "code": "430182", "name": "宁乡市" } + ] + }, + { + "code": "4302", + "name": "株洲市", + "children": [ + { "code": "430202", "name": "荷塘区" }, + { "code": "430203", "name": "芦淞区" }, + { "code": "430204", "name": "石峰区" }, + { "code": "430211", "name": "天元区" }, + { "code": "430212", "name": "渌口区" }, + { "code": "430223", "name": "攸县" }, + { "code": "430224", "name": "茶陵县" }, + { "code": "430225", "name": "炎陵县" }, + { "code": "430271", "name": "云龙示范区" }, + { "code": "430281", "name": "醴陵市" } + ] + }, + { + "code": "4303", + "name": "湘潭市", + "children": [ + { "code": "430302", "name": "雨湖区" }, + { "code": "430304", "name": "岳塘区" }, + { "code": "430321", "name": "湘潭县" }, + { "code": "430371", "name": "湖南湘潭高新技术产业园区" }, + { "code": "430372", "name": "湘潭昭山示范区" }, + { "code": "430373", "name": "湘潭九华示范区" }, + { "code": "430381", "name": "湘乡市" }, + { "code": "430382", "name": "韶山市" } + ] + }, + { + "code": "4304", + "name": "衡阳市", + "children": [ + { "code": "430405", "name": "珠晖区" }, + { "code": "430406", "name": "雁峰区" }, + { "code": "430407", "name": "石鼓区" }, + { "code": "430408", "name": "蒸湘区" }, + { "code": "430412", "name": "南岳区" }, + { "code": "430421", "name": "衡阳县" }, + { "code": "430422", "name": "衡南县" }, + { "code": "430423", "name": "衡山县" }, + { "code": "430424", "name": "衡东县" }, + { "code": "430426", "name": "祁东县" }, + { "code": "430471", "name": "衡阳综合保税区" }, + { "code": "430472", "name": "湖南衡阳高新技术产业园区" }, + { "code": "430473", "name": "湖南衡阳松木经济开发区" }, + { "code": "430481", "name": "耒阳市" }, + { "code": "430482", "name": "常宁市" } + ] + }, + { + "code": "4305", + "name": "邵阳市", + "children": [ + { "code": "430502", "name": "双清区" }, + { "code": "430503", "name": "大祥区" }, + { "code": "430511", "name": "北塔区" }, + { "code": "430522", "name": "新邵县" }, + { "code": "430523", "name": "邵阳县" }, + { "code": "430524", "name": "隆回县" }, + { "code": "430525", "name": "洞口县" }, + { "code": "430527", "name": "绥宁县" }, + { "code": "430528", "name": "新宁县" }, + { "code": "430529", "name": "城步苗族自治县" }, + { "code": "430581", "name": "武冈市" }, + { "code": "430582", "name": "邵东市" } + ] + }, + { + "code": "4306", + "name": "岳阳市", + "children": [ + { "code": "430602", "name": "岳阳楼区" }, + { "code": "430603", "name": "云溪区" }, + { "code": "430611", "name": "君山区" }, + { "code": "430621", "name": "岳阳县" }, + { "code": "430623", "name": "华容县" }, + { "code": "430624", "name": "湘阴县" }, + { "code": "430626", "name": "平江县" }, + { "code": "430671", "name": "岳阳市屈原管理区" }, + { "code": "430681", "name": "汨罗市" }, + { "code": "430682", "name": "临湘市" } + ] + }, + { + "code": "4307", + "name": "常德市", + "children": [ + { "code": "430702", "name": "武陵区" }, + { "code": "430703", "name": "鼎城区" }, + { "code": "430721", "name": "安乡县" }, + { "code": "430722", "name": "汉寿县" }, + { "code": "430723", "name": "澧县" }, + { "code": "430724", "name": "临澧县" }, + { "code": "430725", "name": "桃源县" }, + { "code": "430726", "name": "石门县" }, + { "code": "430771", "name": "常德市西洞庭管理区" }, + { "code": "430781", "name": "津市市" } + ] + }, + { + "code": "4308", + "name": "张家界市", + "children": [ + { "code": "430802", "name": "永定区" }, + { "code": "430811", "name": "武陵源区" }, + { "code": "430821", "name": "慈利县" }, + { "code": "430822", "name": "桑植县" } + ] + }, + { + "code": "4309", + "name": "益阳市", + "children": [ + { "code": "430902", "name": "资阳区" }, + { "code": "430903", "name": "赫山区" }, + { "code": "430921", "name": "南县" }, + { "code": "430922", "name": "桃江县" }, + { "code": "430923", "name": "安化县" }, + { "code": "430971", "name": "益阳市大通湖管理区" }, + { "code": "430972", "name": "湖南益阳高新技术产业园区" }, + { "code": "430981", "name": "沅江市" } + ] + }, + { + "code": "4310", + "name": "郴州市", + "children": [ + { "code": "431002", "name": "北湖区" }, + { "code": "431003", "name": "苏仙区" }, + { "code": "431021", "name": "桂阳县" }, + { "code": "431022", "name": "宜章县" }, + { "code": "431023", "name": "永兴县" }, + { "code": "431024", "name": "嘉禾县" }, + { "code": "431025", "name": "临武县" }, + { "code": "431026", "name": "汝城县" }, + { "code": "431027", "name": "桂东县" }, + { "code": "431028", "name": "安仁县" }, + { "code": "431081", "name": "资兴市" } + ] + }, + { + "code": "4311", + "name": "永州市", + "children": [ + { "code": "431102", "name": "零陵区" }, + { "code": "431103", "name": "冷水滩区" }, + { "code": "431121", "name": "祁阳县" }, + { "code": "431122", "name": "东安县" }, + { "code": "431123", "name": "双牌县" }, + { "code": "431124", "name": "道县" }, + { "code": "431125", "name": "江永县" }, + { "code": "431126", "name": "宁远县" }, + { "code": "431127", "name": "蓝山县" }, + { "code": "431128", "name": "新田县" }, + { "code": "431129", "name": "江华瑶族自治县" }, + { "code": "431171", "name": "永州经济技术开发区" }, + { "code": "431172", "name": "永州市金洞管理区" }, + { "code": "431173", "name": "永州市回龙圩管理区" } + ] + }, + { + "code": "4312", + "name": "怀化市", + "children": [ + { "code": "431202", "name": "鹤城区" }, + { "code": "431221", "name": "中方县" }, + { "code": "431222", "name": "沅陵县" }, + { "code": "431223", "name": "辰溪县" }, + { "code": "431224", "name": "溆浦县" }, + { "code": "431225", "name": "会同县" }, + { "code": "431226", "name": "麻阳苗族自治县" }, + { "code": "431227", "name": "新晃侗族自治县" }, + { "code": "431228", "name": "芷江侗族自治县" }, + { "code": "431229", "name": "靖州苗族侗族自治县" }, + { "code": "431230", "name": "通道侗族自治县" }, + { "code": "431271", "name": "怀化市洪江管理区" }, + { "code": "431281", "name": "洪江市" } + ] + }, + { + "code": "4313", + "name": "娄底市", + "children": [ + { "code": "431302", "name": "娄星区" }, + { "code": "431321", "name": "双峰县" }, + { "code": "431322", "name": "新化县" }, + { "code": "431381", "name": "冷水江市" }, + { "code": "431382", "name": "涟源市" } + ] + }, + { + "code": "4331", + "name": "湘西土家族苗族自治州", + "children": [ + { "code": "433101", "name": "吉首市" }, + { "code": "433122", "name": "泸溪县" }, + { "code": "433123", "name": "凤凰县" }, + { "code": "433124", "name": "花垣县" }, + { "code": "433125", "name": "保靖县" }, + { "code": "433126", "name": "古丈县" }, + { "code": "433127", "name": "永顺县" }, + { "code": "433130", "name": "龙山县" }, + { "code": "433173", "name": "湖南永顺经济开发区" } + ] + } + ] + }, + { + "code": "44", + "name": "广东省", + "children": [ + { + "code": "4401", + "name": "广州市", + "children": [ + { "code": "440103", "name": "荔湾区" }, + { "code": "440104", "name": "越秀区" }, + { "code": "440105", "name": "海珠区" }, + { "code": "440106", "name": "天河区" }, + { "code": "440111", "name": "白云区" }, + { "code": "440112", "name": "黄埔区" }, + { "code": "440113", "name": "番禺区" }, + { "code": "440114", "name": "花都区" }, + { "code": "440115", "name": "南沙区" }, + { "code": "440117", "name": "从化区" }, + { "code": "440118", "name": "增城区" } + ] + }, + { + "code": "4402", + "name": "韶关市", + "children": [ + { "code": "440203", "name": "武江区" }, + { "code": "440204", "name": "浈江区" }, + { "code": "440205", "name": "曲江区" }, + { "code": "440222", "name": "始兴县" }, + { "code": "440224", "name": "仁化县" }, + { "code": "440229", "name": "翁源县" }, + { "code": "440232", "name": "乳源瑶族自治县" }, + { "code": "440233", "name": "新丰县" }, + { "code": "440281", "name": "乐昌市" }, + { "code": "440282", "name": "南雄市" } + ] + }, + { + "code": "4403", + "name": "深圳市", + "children": [ + { "code": "440303", "name": "罗湖区" }, + { "code": "440304", "name": "福田区" }, + { "code": "440305", "name": "南山区" }, + { "code": "440306", "name": "宝安区" }, + { "code": "440307", "name": "龙岗区" }, + { "code": "440308", "name": "盐田区" }, + { "code": "440309", "name": "龙华区" }, + { "code": "440310", "name": "坪山区" }, + { "code": "440311", "name": "光明区" } + ] + }, + { + "code": "4404", + "name": "珠海市", + "children": [ + { "code": "440402", "name": "香洲区" }, + { "code": "440403", "name": "斗门区" }, + { "code": "440404", "name": "金湾区" } + ] + }, + { + "code": "4405", + "name": "汕头市", + "children": [ + { "code": "440507", "name": "龙湖区" }, + { "code": "440511", "name": "金平区" }, + { "code": "440512", "name": "濠江区" }, + { "code": "440513", "name": "潮阳区" }, + { "code": "440514", "name": "潮南区" }, + { "code": "440515", "name": "澄海区" }, + { "code": "440523", "name": "南澳县" } + ] + }, + { + "code": "4406", + "name": "佛山市", + "children": [ + { "code": "440604", "name": "禅城区" }, + { "code": "440605", "name": "南海区" }, + { "code": "440606", "name": "顺德区" }, + { "code": "440607", "name": "三水区" }, + { "code": "440608", "name": "高明区" } + ] + }, + { + "code": "4407", + "name": "江门市", + "children": [ + { "code": "440703", "name": "蓬江区" }, + { "code": "440704", "name": "江海区" }, + { "code": "440705", "name": "新会区" }, + { "code": "440781", "name": "台山市" }, + { "code": "440783", "name": "开平市" }, + { "code": "440784", "name": "鹤山市" }, + { "code": "440785", "name": "恩平市" } + ] + }, + { + "code": "4408", + "name": "湛江市", + "children": [ + { "code": "440802", "name": "赤坎区" }, + { "code": "440803", "name": "霞山区" }, + { "code": "440804", "name": "坡头区" }, + { "code": "440811", "name": "麻章区" }, + { "code": "440823", "name": "遂溪县" }, + { "code": "440825", "name": "徐闻县" }, + { "code": "440881", "name": "廉江市" }, + { "code": "440882", "name": "雷州市" }, + { "code": "440883", "name": "吴川市" } + ] + }, + { + "code": "4409", + "name": "茂名市", + "children": [ + { "code": "440902", "name": "茂南区" }, + { "code": "440904", "name": "电白区" }, + { "code": "440981", "name": "高州市" }, + { "code": "440982", "name": "化州市" }, + { "code": "440983", "name": "信宜市" } + ] + }, + { + "code": "4412", + "name": "肇庆市", + "children": [ + { "code": "441202", "name": "端州区" }, + { "code": "441203", "name": "鼎湖区" }, + { "code": "441204", "name": "高要区" }, + { "code": "441223", "name": "广宁县" }, + { "code": "441224", "name": "怀集县" }, + { "code": "441225", "name": "封开县" }, + { "code": "441226", "name": "德庆县" }, + { "code": "441284", "name": "四会市" } + ] + }, + { + "code": "4413", + "name": "惠州市", + "children": [ + { "code": "441302", "name": "惠城区" }, + { "code": "441303", "name": "惠阳区" }, + { "code": "441322", "name": "博罗县" }, + { "code": "441323", "name": "惠东县" }, + { "code": "441324", "name": "龙门县" } + ] + }, + { + "code": "4414", + "name": "梅州市", + "children": [ + { "code": "441402", "name": "梅江区" }, + { "code": "441403", "name": "梅县区" }, + { "code": "441422", "name": "大埔县" }, + { "code": "441423", "name": "丰顺县" }, + { "code": "441424", "name": "五华县" }, + { "code": "441426", "name": "平远县" }, + { "code": "441427", "name": "蕉岭县" }, + { "code": "441481", "name": "兴宁市" } + ] + }, + { + "code": "4415", + "name": "汕尾市", + "children": [ + { "code": "441502", "name": "城区" }, + { "code": "441521", "name": "海丰县" }, + { "code": "441523", "name": "陆河县" }, + { "code": "441581", "name": "陆丰市" } + ] + }, + { + "code": "4416", + "name": "河源市", + "children": [ + { "code": "441602", "name": "源城区" }, + { "code": "441621", "name": "紫金县" }, + { "code": "441622", "name": "龙川县" }, + { "code": "441623", "name": "连平县" }, + { "code": "441624", "name": "和平县" }, + { "code": "441625", "name": "东源县" } + ] + }, + { + "code": "4417", + "name": "阳江市", + "children": [ + { "code": "441702", "name": "江城区" }, + { "code": "441704", "name": "阳东区" }, + { "code": "441721", "name": "阳西县" }, + { "code": "441781", "name": "阳春市" } + ] + }, + { + "code": "4418", + "name": "清远市", + "children": [ + { "code": "441802", "name": "清城区" }, + { "code": "441803", "name": "清新区" }, + { "code": "441821", "name": "佛冈县" }, + { "code": "441823", "name": "阳山县" }, + { "code": "441825", "name": "连山壮族瑶族自治县" }, + { "code": "441826", "name": "连南瑶族自治县" }, + { "code": "441881", "name": "英德市" }, + { "code": "441882", "name": "连州市" } + ] + }, + { + "code": "4419", + "name": "东莞市", + "children": [ + { "code": "441900003", "name": "东城街道" }, + { "code": "441900004", "name": "南城街道" }, + { "code": "441900005", "name": "万江街道" }, + { "code": "441900006", "name": "莞城街道" }, + { "code": "441900101", "name": "石碣镇" }, + { "code": "441900102", "name": "石龙镇" }, + { "code": "441900103", "name": "茶山镇" }, + { "code": "441900104", "name": "石排镇" }, + { "code": "441900105", "name": "企石镇" }, + { "code": "441900106", "name": "横沥镇" }, + { "code": "441900107", "name": "桥头镇" }, + { "code": "441900108", "name": "谢岗镇" }, + { "code": "441900109", "name": "东坑镇" }, + { "code": "441900110", "name": "常平镇" }, + { "code": "441900111", "name": "寮步镇" }, + { "code": "441900112", "name": "樟木头镇" }, + { "code": "441900113", "name": "大朗镇" }, + { "code": "441900114", "name": "黄江镇" }, + { "code": "441900115", "name": "清溪镇" }, + { "code": "441900116", "name": "塘厦镇" }, + { "code": "441900117", "name": "凤岗镇" }, + { "code": "441900118", "name": "大岭山镇" }, + { "code": "441900119", "name": "长安镇" }, + { "code": "441900121", "name": "虎门镇" }, + { "code": "441900122", "name": "厚街镇" }, + { "code": "441900123", "name": "沙田镇" }, + { "code": "441900124", "name": "道滘镇" }, + { "code": "441900125", "name": "洪梅镇" }, + { "code": "441900126", "name": "麻涌镇" }, + { "code": "441900127", "name": "望牛墩镇" }, + { "code": "441900128", "name": "中堂镇" }, + { "code": "441900129", "name": "高埗镇" }, + { "code": "441900401", "name": "松山湖" }, + { "code": "441900402", "name": "东莞港" }, + { "code": "441900403", "name": "东莞生态园" } + ] + }, + { + "code": "4420", + "name": "中山市", + "children": [ + { "code": "442000001", "name": "石岐街道" }, + { "code": "442000002", "name": "东区街道" }, + { "code": "442000003", "name": "中山港街道" }, + { "code": "442000004", "name": "西区街道" }, + { "code": "442000005", "name": "南区街道" }, + { "code": "442000006", "name": "五桂山街道" }, + { "code": "442000100", "name": "小榄镇" }, + { "code": "442000101", "name": "黄圃镇" }, + { "code": "442000102", "name": "民众镇" }, + { "code": "442000103", "name": "东凤镇" }, + { "code": "442000104", "name": "东升镇" }, + { "code": "442000105", "name": "古镇镇" }, + { "code": "442000106", "name": "沙溪镇" }, + { "code": "442000107", "name": "坦洲镇" }, + { "code": "442000108", "name": "港口镇" }, + { "code": "442000109", "name": "三角镇" }, + { "code": "442000110", "name": "横栏镇" }, + { "code": "442000111", "name": "南头镇" }, + { "code": "442000112", "name": "阜沙镇" }, + { "code": "442000113", "name": "南朗镇" }, + { "code": "442000114", "name": "三乡镇" }, + { "code": "442000115", "name": "板芙镇" }, + { "code": "442000116", "name": "大涌镇" }, + { "code": "442000117", "name": "神湾镇" } + ] + }, + { + "code": "4451", + "name": "潮州市", + "children": [ + { "code": "445102", "name": "湘桥区" }, + { "code": "445103", "name": "潮安区" }, + { "code": "445122", "name": "饶平县" } + ] + }, + { + "code": "4452", + "name": "揭阳市", + "children": [ + { "code": "445202", "name": "榕城区" }, + { "code": "445203", "name": "揭东区" }, + { "code": "445222", "name": "揭西县" }, + { "code": "445224", "name": "惠来县" }, + { "code": "445281", "name": "普宁市" } + ] + }, + { + "code": "4453", + "name": "云浮市", + "children": [ + { "code": "445302", "name": "云城区" }, + { "code": "445303", "name": "云安区" }, + { "code": "445321", "name": "新兴县" }, + { "code": "445322", "name": "郁南县" }, + { "code": "445381", "name": "罗定市" } + ] + } + ] + }, + { + "code": "45", + "name": "广西壮族自治区", + "children": [ + { + "code": "4501", + "name": "南宁市", + "children": [ + { "code": "450102", "name": "兴宁区" }, + { "code": "450103", "name": "青秀区" }, + { "code": "450105", "name": "江南区" }, + { "code": "450107", "name": "西乡塘区" }, + { "code": "450108", "name": "良庆区" }, + { "code": "450109", "name": "邕宁区" }, + { "code": "450110", "name": "武鸣区" }, + { "code": "450123", "name": "隆安县" }, + { "code": "450124", "name": "马山县" }, + { "code": "450125", "name": "上林县" }, + { "code": "450126", "name": "宾阳县" }, + { "code": "450127", "name": "横县" } + ] + }, + { + "code": "4502", + "name": "柳州市", + "children": [ + { "code": "450202", "name": "城中区" }, + { "code": "450203", "name": "鱼峰区" }, + { "code": "450204", "name": "柳南区" }, + { "code": "450205", "name": "柳北区" }, + { "code": "450206", "name": "柳江区" }, + { "code": "450222", "name": "柳城县" }, + { "code": "450223", "name": "鹿寨县" }, + { "code": "450224", "name": "融安县" }, + { "code": "450225", "name": "融水苗族自治县" }, + { "code": "450226", "name": "三江侗族自治县" } + ] + }, + { + "code": "4503", + "name": "桂林市", + "children": [ + { "code": "450302", "name": "秀峰区" }, + { "code": "450303", "name": "叠彩区" }, + { "code": "450304", "name": "象山区" }, + { "code": "450305", "name": "七星区" }, + { "code": "450311", "name": "雁山区" }, + { "code": "450312", "name": "临桂区" }, + { "code": "450321", "name": "阳朔县" }, + { "code": "450323", "name": "灵川县" }, + { "code": "450324", "name": "全州县" }, + { "code": "450325", "name": "兴安县" }, + { "code": "450326", "name": "永福县" }, + { "code": "450327", "name": "灌阳县" }, + { "code": "450328", "name": "龙胜各族自治县" }, + { "code": "450329", "name": "资源县" }, + { "code": "450330", "name": "平乐县" }, + { "code": "450332", "name": "恭城瑶族自治县" }, + { "code": "450381", "name": "荔浦市" } + ] + }, + { + "code": "4504", + "name": "梧州市", + "children": [ + { "code": "450403", "name": "万秀区" }, + { "code": "450405", "name": "长洲区" }, + { "code": "450406", "name": "龙圩区" }, + { "code": "450421", "name": "苍梧县" }, + { "code": "450422", "name": "藤县" }, + { "code": "450423", "name": "蒙山县" }, + { "code": "450481", "name": "岑溪市" } + ] + }, + { + "code": "4505", + "name": "北海市", + "children": [ + { "code": "450502", "name": "海城区" }, + { "code": "450503", "name": "银海区" }, + { "code": "450512", "name": "铁山港区" }, + { "code": "450521", "name": "合浦县" } + ] + }, + { + "code": "4506", + "name": "防城港市", + "children": [ + { "code": "450602", "name": "港口区" }, + { "code": "450603", "name": "防城区" }, + { "code": "450621", "name": "上思县" }, + { "code": "450681", "name": "东兴市" } + ] + }, + { + "code": "4507", + "name": "钦州市", + "children": [ + { "code": "450702", "name": "钦南区" }, + { "code": "450703", "name": "钦北区" }, + { "code": "450721", "name": "灵山县" }, + { "code": "450722", "name": "浦北县" } + ] + }, + { + "code": "4508", + "name": "贵港市", + "children": [ + { "code": "450802", "name": "港北区" }, + { "code": "450803", "name": "港南区" }, + { "code": "450804", "name": "覃塘区" }, + { "code": "450821", "name": "平南县" }, + { "code": "450881", "name": "桂平市" } + ] + }, + { + "code": "4509", + "name": "玉林市", + "children": [ + { "code": "450902", "name": "玉州区" }, + { "code": "450903", "name": "福绵区" }, + { "code": "450921", "name": "容县" }, + { "code": "450922", "name": "陆川县" }, + { "code": "450923", "name": "博白县" }, + { "code": "450924", "name": "兴业县" }, + { "code": "450981", "name": "北流市" } + ] + }, + { + "code": "4510", + "name": "百色市", + "children": [ + { "code": "451002", "name": "右江区" }, + { "code": "451003", "name": "田阳区" }, + { "code": "451022", "name": "田东县" }, + { "code": "451023", "name": "平果县" }, + { "code": "451024", "name": "德保县" }, + { "code": "451026", "name": "那坡县" }, + { "code": "451027", "name": "凌云县" }, + { "code": "451028", "name": "乐业县" }, + { "code": "451029", "name": "田林县" }, + { "code": "451030", "name": "西林县" }, + { "code": "451031", "name": "隆林各族自治县" }, + { "code": "451081", "name": "靖西市" } + ] + }, + { + "code": "4511", + "name": "贺州市", + "children": [ + { "code": "451102", "name": "八步区" }, + { "code": "451103", "name": "平桂区" }, + { "code": "451121", "name": "昭平县" }, + { "code": "451122", "name": "钟山县" }, + { "code": "451123", "name": "富川瑶族自治县" } + ] + }, + { + "code": "4512", + "name": "河池市", + "children": [ + { "code": "451202", "name": "金城江区" }, + { "code": "451203", "name": "宜州区" }, + { "code": "451221", "name": "南丹县" }, + { "code": "451222", "name": "天峨县" }, + { "code": "451223", "name": "凤山县" }, + { "code": "451224", "name": "东兰县" }, + { "code": "451225", "name": "罗城仫佬族自治县" }, + { "code": "451226", "name": "环江毛南族自治县" }, + { "code": "451227", "name": "巴马瑶族自治县" }, + { "code": "451228", "name": "都安瑶族自治县" }, + { "code": "451229", "name": "大化瑶族自治县" } + ] + }, + { + "code": "4513", + "name": "来宾市", + "children": [ + { "code": "451302", "name": "兴宾区" }, + { "code": "451321", "name": "忻城县" }, + { "code": "451322", "name": "象州县" }, + { "code": "451323", "name": "武宣县" }, + { "code": "451324", "name": "金秀瑶族自治县" }, + { "code": "451381", "name": "合山市" } + ] + }, + { + "code": "4514", + "name": "崇左市", + "children": [ + { "code": "451402", "name": "江州区" }, + { "code": "451421", "name": "扶绥县" }, + { "code": "451422", "name": "宁明县" }, + { "code": "451423", "name": "龙州县" }, + { "code": "451424", "name": "大新县" }, + { "code": "451425", "name": "天等县" }, + { "code": "451481", "name": "凭祥市" } + ] + } + ] + }, + { + "code": "46", + "name": "海南省", + "children": [ + { + "code": "4601", + "name": "海口市", + "children": [ + { "code": "460105", "name": "秀英区" }, + { "code": "460106", "name": "龙华区" }, + { "code": "460107", "name": "琼山区" }, + { "code": "460108", "name": "美兰区" } + ] + }, + { + "code": "4602", + "name": "三亚市", + "children": [ + { "code": "460202", "name": "海棠区" }, + { "code": "460203", "name": "吉阳区" }, + { "code": "460204", "name": "天涯区" }, + { "code": "460205", "name": "崖州区" } + ] + }, + { + "code": "4603", + "name": "三沙市", + "children": [ + { "code": "460321", "name": "西沙群岛" }, + { "code": "460322", "name": "南沙群岛" }, + { "code": "460323", "name": "中沙群岛的岛礁及其海域" } + ] + }, + { + "code": "4604", + "name": "儋州市", + "children": [ + { "code": "460400100", "name": "那大镇" }, + { "code": "460400101", "name": "和庆镇" }, + { "code": "460400102", "name": "南丰镇" }, + { "code": "460400103", "name": "大成镇" }, + { "code": "460400104", "name": "雅星镇" }, + { "code": "460400105", "name": "兰洋镇" }, + { "code": "460400106", "name": "光村镇" }, + { "code": "460400107", "name": "木棠镇" }, + { "code": "460400108", "name": "海头镇" }, + { "code": "460400109", "name": "峨蔓镇" }, + { "code": "460400111", "name": "王五镇" }, + { "code": "460400112", "name": "白马井镇" }, + { "code": "460400113", "name": "中和镇" }, + { "code": "460400114", "name": "排浦镇" }, + { "code": "460400115", "name": "东成镇" }, + { "code": "460400116", "name": "新州镇" }, + { "code": "460400499", "name": "洋浦经济开发区" }, + { "code": "460400500", "name": "华南热作学院" } + ] + }, + { + "code": "4690", + "name": "省直辖县级行政区划", + "children": [ + { "code": "469001", "name": "五指山市" }, + { "code": "469002", "name": "琼海市" }, + { "code": "469005", "name": "文昌市" }, + { "code": "469006", "name": "万宁市" }, + { "code": "469007", "name": "东方市" }, + { "code": "469021", "name": "定安县" }, + { "code": "469022", "name": "屯昌县" }, + { "code": "469023", "name": "澄迈县" }, + { "code": "469024", "name": "临高县" }, + { "code": "469025", "name": "白沙黎族自治县" }, + { "code": "469026", "name": "昌江黎族自治县" }, + { "code": "469027", "name": "乐东黎族自治县" }, + { "code": "469028", "name": "陵水黎族自治县" }, + { "code": "469029", "name": "保亭黎族苗族自治县" }, + { "code": "469030", "name": "琼中黎族苗族自治县" } + ] + } + ] + }, + { + "code": "50", + "name": "重庆市", + "children": [ + { + "code": "5001", + "name": "市辖区", + "children": [ + { "code": "500101", "name": "万州区" }, + { "code": "500102", "name": "涪陵区" }, + { "code": "500103", "name": "渝中区" }, + { "code": "500104", "name": "大渡口区" }, + { "code": "500105", "name": "江北区" }, + { "code": "500106", "name": "沙坪坝区" }, + { "code": "500107", "name": "九龙坡区" }, + { "code": "500108", "name": "南岸区" }, + { "code": "500109", "name": "北碚区" }, + { "code": "500110", "name": "綦江区" }, + { "code": "500111", "name": "大足区" }, + { "code": "500112", "name": "渝北区" }, + { "code": "500113", "name": "巴南区" }, + { "code": "500114", "name": "黔江区" }, + { "code": "500115", "name": "长寿区" }, + { "code": "500116", "name": "江津区" }, + { "code": "500117", "name": "合川区" }, + { "code": "500118", "name": "永川区" }, + { "code": "500119", "name": "南川区" }, + { "code": "500120", "name": "璧山区" }, + { "code": "500151", "name": "铜梁区" }, + { "code": "500152", "name": "潼南区" }, + { "code": "500153", "name": "荣昌区" }, + { "code": "500154", "name": "开州区" }, + { "code": "500155", "name": "梁平区" }, + { "code": "500156", "name": "武隆区" } + ] + }, + { + "code": "5002", + "name": "县", + "children": [ + { "code": "500229", "name": "城口县" }, + { "code": "500230", "name": "丰都县" }, + { "code": "500231", "name": "垫江县" }, + { "code": "500233", "name": "忠县" }, + { "code": "500235", "name": "云阳县" }, + { "code": "500236", "name": "奉节县" }, + { "code": "500237", "name": "巫山县" }, + { "code": "500238", "name": "巫溪县" }, + { "code": "500240", "name": "石柱土家族自治县" }, + { "code": "500241", "name": "秀山土家族苗族自治县" }, + { "code": "500242", "name": "酉阳土家族苗族自治县" }, + { "code": "500243", "name": "彭水苗族土家族自治县" } + ] + } + ] + }, + { + "code": "51", + "name": "四川省", + "children": [ + { + "code": "5101", + "name": "成都市", + "children": [ + { "code": "510104", "name": "锦江区" }, + { "code": "510105", "name": "青羊区" }, + { "code": "510106", "name": "金牛区" }, + { "code": "510107", "name": "武侯区" }, + { "code": "510108", "name": "成华区" }, + { "code": "510112", "name": "龙泉驿区" }, + { "code": "510113", "name": "青白江区" }, + { "code": "510114", "name": "新都区" }, + { "code": "510115", "name": "温江区" }, + { "code": "510116", "name": "双流区" }, + { "code": "510117", "name": "郫都区" }, + { "code": "510121", "name": "金堂县" }, + { "code": "510129", "name": "大邑县" }, + { "code": "510131", "name": "蒲江县" }, + { "code": "510132", "name": "新津县" }, + { "code": "510181", "name": "都江堰市" }, + { "code": "510182", "name": "彭州市" }, + { "code": "510183", "name": "邛崃市" }, + { "code": "510184", "name": "崇州市" }, + { "code": "510185", "name": "简阳市" } + ] + }, + { + "code": "5103", + "name": "自贡市", + "children": [ + { "code": "510302", "name": "自流井区" }, + { "code": "510303", "name": "贡井区" }, + { "code": "510304", "name": "大安区" }, + { "code": "510311", "name": "沿滩区" }, + { "code": "510321", "name": "荣县" }, + { "code": "510322", "name": "富顺县" } + ] + }, + { + "code": "5104", + "name": "攀枝花市", + "children": [ + { "code": "510402", "name": "东区" }, + { "code": "510403", "name": "西区" }, + { "code": "510411", "name": "仁和区" }, + { "code": "510421", "name": "米易县" }, + { "code": "510422", "name": "盐边县" } + ] + }, + { + "code": "5105", + "name": "泸州市", + "children": [ + { "code": "510502", "name": "江阳区" }, + { "code": "510503", "name": "纳溪区" }, + { "code": "510504", "name": "龙马潭区" }, + { "code": "510521", "name": "泸县" }, + { "code": "510522", "name": "合江县" }, + { "code": "510524", "name": "叙永县" }, + { "code": "510525", "name": "古蔺县" } + ] + }, + { + "code": "5106", + "name": "德阳市", + "children": [ + { "code": "510603", "name": "旌阳区" }, + { "code": "510604", "name": "罗江区" }, + { "code": "510623", "name": "中江县" }, + { "code": "510681", "name": "广汉市" }, + { "code": "510682", "name": "什邡市" }, + { "code": "510683", "name": "绵竹市" } + ] + }, + { + "code": "5107", + "name": "绵阳市", + "children": [ + { "code": "510703", "name": "涪城区" }, + { "code": "510704", "name": "游仙区" }, + { "code": "510705", "name": "安州区" }, + { "code": "510722", "name": "三台县" }, + { "code": "510723", "name": "盐亭县" }, + { "code": "510725", "name": "梓潼县" }, + { "code": "510726", "name": "北川羌族自治县" }, + { "code": "510727", "name": "平武县" }, + { "code": "510781", "name": "江油市" } + ] + }, + { + "code": "5108", + "name": "广元市", + "children": [ + { "code": "510802", "name": "利州区" }, + { "code": "510811", "name": "昭化区" }, + { "code": "510812", "name": "朝天区" }, + { "code": "510821", "name": "旺苍县" }, + { "code": "510822", "name": "青川县" }, + { "code": "510823", "name": "剑阁县" }, + { "code": "510824", "name": "苍溪县" } + ] + }, + { + "code": "5109", + "name": "遂宁市", + "children": [ + { "code": "510903", "name": "船山区" }, + { "code": "510904", "name": "安居区" }, + { "code": "510921", "name": "蓬溪县" }, + { "code": "510923", "name": "大英县" }, + { "code": "510981", "name": "射洪市" } + ] + }, + { + "code": "5110", + "name": "内江市", + "children": [ + { "code": "511002", "name": "市中区" }, + { "code": "511011", "name": "东兴区" }, + { "code": "511024", "name": "威远县" }, + { "code": "511025", "name": "资中县" }, + { "code": "511071", "name": "内江经济开发区" }, + { "code": "511083", "name": "隆昌市" } + ] + }, + { + "code": "5111", + "name": "乐山市", + "children": [ + { "code": "511102", "name": "市中区" }, + { "code": "511111", "name": "沙湾区" }, + { "code": "511112", "name": "五通桥区" }, + { "code": "511113", "name": "金口河区" }, + { "code": "511123", "name": "犍为县" }, + { "code": "511124", "name": "井研县" }, + { "code": "511126", "name": "夹江县" }, + { "code": "511129", "name": "沐川县" }, + { "code": "511132", "name": "峨边彝族自治县" }, + { "code": "511133", "name": "马边彝族自治县" }, + { "code": "511181", "name": "峨眉山市" } + ] + }, + { + "code": "5113", + "name": "南充市", + "children": [ + { "code": "511302", "name": "顺庆区" }, + { "code": "511303", "name": "高坪区" }, + { "code": "511304", "name": "嘉陵区" }, + { "code": "511321", "name": "南部县" }, + { "code": "511322", "name": "营山县" }, + { "code": "511323", "name": "蓬安县" }, + { "code": "511324", "name": "仪陇县" }, + { "code": "511325", "name": "西充县" }, + { "code": "511381", "name": "阆中市" } + ] + }, + { + "code": "5114", + "name": "眉山市", + "children": [ + { "code": "511402", "name": "东坡区" }, + { "code": "511403", "name": "彭山区" }, + { "code": "511421", "name": "仁寿县" }, + { "code": "511423", "name": "洪雅县" }, + { "code": "511424", "name": "丹棱县" }, + { "code": "511425", "name": "青神县" } + ] + }, + { + "code": "5115", + "name": "宜宾市", + "children": [ + { "code": "511502", "name": "翠屏区" }, + { "code": "511503", "name": "南溪区" }, + { "code": "511504", "name": "叙州区" }, + { "code": "511523", "name": "江安县" }, + { "code": "511524", "name": "长宁县" }, + { "code": "511525", "name": "高县" }, + { "code": "511526", "name": "珙县" }, + { "code": "511527", "name": "筠连县" }, + { "code": "511528", "name": "兴文县" }, + { "code": "511529", "name": "屏山县" } + ] + }, + { + "code": "5116", + "name": "广安市", + "children": [ + { "code": "511602", "name": "广安区" }, + { "code": "511603", "name": "前锋区" }, + { "code": "511621", "name": "岳池县" }, + { "code": "511622", "name": "武胜县" }, + { "code": "511623", "name": "邻水县" }, + { "code": "511681", "name": "华蓥市" } + ] + }, + { + "code": "5117", + "name": "达州市", + "children": [ + { "code": "511702", "name": "通川区" }, + { "code": "511703", "name": "达川区" }, + { "code": "511722", "name": "宣汉县" }, + { "code": "511723", "name": "开江县" }, + { "code": "511724", "name": "大竹县" }, + { "code": "511725", "name": "渠县" }, + { "code": "511771", "name": "达州经济开发区" }, + { "code": "511781", "name": "万源市" } + ] + }, + { + "code": "5118", + "name": "雅安市", + "children": [ + { "code": "511802", "name": "雨城区" }, + { "code": "511803", "name": "名山区" }, + { "code": "511822", "name": "荥经县" }, + { "code": "511823", "name": "汉源县" }, + { "code": "511824", "name": "石棉县" }, + { "code": "511825", "name": "天全县" }, + { "code": "511826", "name": "芦山县" }, + { "code": "511827", "name": "宝兴县" } + ] + }, + { + "code": "5119", + "name": "巴中市", + "children": [ + { "code": "511902", "name": "巴州区" }, + { "code": "511903", "name": "恩阳区" }, + { "code": "511921", "name": "通江县" }, + { "code": "511922", "name": "南江县" }, + { "code": "511923", "name": "平昌县" }, + { "code": "511971", "name": "巴中经济开发区" } + ] + }, + { + "code": "5120", + "name": "资阳市", + "children": [ + { "code": "512002", "name": "雁江区" }, + { "code": "512021", "name": "安岳县" }, + { "code": "512022", "name": "乐至县" } + ] + }, + { + "code": "5132", + "name": "阿坝藏族羌族自治州", + "children": [ + { "code": "513201", "name": "马尔康市" }, + { "code": "513221", "name": "汶川县" }, + { "code": "513222", "name": "理县" }, + { "code": "513223", "name": "茂县" }, + { "code": "513224", "name": "松潘县" }, + { "code": "513225", "name": "九寨沟县" }, + { "code": "513226", "name": "金川县" }, + { "code": "513227", "name": "小金县" }, + { "code": "513228", "name": "黑水县" }, + { "code": "513230", "name": "壤塘县" }, + { "code": "513231", "name": "阿坝县" }, + { "code": "513232", "name": "若尔盖县" }, + { "code": "513233", "name": "红原县" } + ] + }, + { + "code": "5133", + "name": "甘孜藏族自治州", + "children": [ + { "code": "513301", "name": "康定市" }, + { "code": "513322", "name": "泸定县" }, + { "code": "513323", "name": "丹巴县" }, + { "code": "513324", "name": "九龙县" }, + { "code": "513325", "name": "雅江县" }, + { "code": "513326", "name": "道孚县" }, + { "code": "513327", "name": "炉霍县" }, + { "code": "513328", "name": "甘孜县" }, + { "code": "513329", "name": "新龙县" }, + { "code": "513330", "name": "德格县" }, + { "code": "513331", "name": "白玉县" }, + { "code": "513332", "name": "石渠县" }, + { "code": "513333", "name": "色达县" }, + { "code": "513334", "name": "理塘县" }, + { "code": "513335", "name": "巴塘县" }, + { "code": "513336", "name": "乡城县" }, + { "code": "513337", "name": "稻城县" }, + { "code": "513338", "name": "得荣县" } + ] + }, + { + "code": "5134", + "name": "凉山彝族自治州", + "children": [ + { "code": "513401", "name": "西昌市" }, + { "code": "513422", "name": "木里藏族自治县" }, + { "code": "513423", "name": "盐源县" }, + { "code": "513424", "name": "德昌县" }, + { "code": "513425", "name": "会理县" }, + { "code": "513426", "name": "会东县" }, + { "code": "513427", "name": "宁南县" }, + { "code": "513428", "name": "普格县" }, + { "code": "513429", "name": "布拖县" }, + { "code": "513430", "name": "金阳县" }, + { "code": "513431", "name": "昭觉县" }, + { "code": "513432", "name": "喜德县" }, + { "code": "513433", "name": "冕宁县" }, + { "code": "513434", "name": "越西县" }, + { "code": "513435", "name": "甘洛县" }, + { "code": "513436", "name": "美姑县" }, + { "code": "513437", "name": "雷波县" } + ] + } + ] + }, + { + "code": "52", + "name": "贵州省", + "children": [ + { + "code": "5201", + "name": "贵阳市", + "children": [ + { "code": "520102", "name": "南明区" }, + { "code": "520103", "name": "云岩区" }, + { "code": "520111", "name": "花溪区" }, + { "code": "520112", "name": "乌当区" }, + { "code": "520113", "name": "白云区" }, + { "code": "520115", "name": "观山湖区" }, + { "code": "520121", "name": "开阳县" }, + { "code": "520122", "name": "息烽县" }, + { "code": "520123", "name": "修文县" }, + { "code": "520181", "name": "清镇市" } + ] + }, + { + "code": "5202", + "name": "六盘水市", + "children": [ + { "code": "520201", "name": "钟山区" }, + { "code": "520203", "name": "六枝特区" }, + { "code": "520221", "name": "水城县" }, + { "code": "520281", "name": "盘州市" } + ] + }, + { + "code": "5203", + "name": "遵义市", + "children": [ + { "code": "520302", "name": "红花岗区" }, + { "code": "520303", "name": "汇川区" }, + { "code": "520304", "name": "播州区" }, + { "code": "520322", "name": "桐梓县" }, + { "code": "520323", "name": "绥阳县" }, + { "code": "520324", "name": "正安县" }, + { "code": "520325", "name": "道真仡佬族苗族自治县" }, + { "code": "520326", "name": "务川仡佬族苗族自治县" }, + { "code": "520327", "name": "凤冈县" }, + { "code": "520328", "name": "湄潭县" }, + { "code": "520329", "name": "余庆县" }, + { "code": "520330", "name": "习水县" }, + { "code": "520381", "name": "赤水市" }, + { "code": "520382", "name": "仁怀市" } + ] + }, + { + "code": "5204", + "name": "安顺市", + "children": [ + { "code": "520402", "name": "西秀区" }, + { "code": "520403", "name": "平坝区" }, + { "code": "520422", "name": "普定县" }, + { "code": "520423", "name": "镇宁布依族苗族自治县" }, + { "code": "520424", "name": "关岭布依族苗族自治县" }, + { "code": "520425", "name": "紫云苗族布依族自治县" } + ] + }, + { + "code": "5205", + "name": "毕节市", + "children": [ + { "code": "520502", "name": "七星关区" }, + { "code": "520521", "name": "大方县" }, + { "code": "520522", "name": "黔西县" }, + { "code": "520523", "name": "金沙县" }, + { "code": "520524", "name": "织金县" }, + { "code": "520525", "name": "纳雍县" }, + { "code": "520526", "name": "威宁彝族回族苗族自治县" }, + { "code": "520527", "name": "赫章县" } + ] + }, + { + "code": "5206", + "name": "铜仁市", + "children": [ + { "code": "520602", "name": "碧江区" }, + { "code": "520603", "name": "万山区" }, + { "code": "520621", "name": "江口县" }, + { "code": "520622", "name": "玉屏侗族自治县" }, + { "code": "520623", "name": "石阡县" }, + { "code": "520624", "name": "思南县" }, + { "code": "520625", "name": "印江土家族苗族自治县" }, + { "code": "520626", "name": "德江县" }, + { "code": "520627", "name": "沿河土家族自治县" }, + { "code": "520628", "name": "松桃苗族自治县" } + ] + }, + { + "code": "5223", + "name": "黔西南布依族苗族自治州", + "children": [ + { "code": "522301", "name": "兴义市" }, + { "code": "522302", "name": "兴仁市" }, + { "code": "522323", "name": "普安县" }, + { "code": "522324", "name": "晴隆县" }, + { "code": "522325", "name": "贞丰县" }, + { "code": "522326", "name": "望谟县" }, + { "code": "522327", "name": "册亨县" }, + { "code": "522328", "name": "安龙县" } + ] + }, + { + "code": "5226", + "name": "黔东南苗族侗族自治州", + "children": [ + { "code": "522601", "name": "凯里市" }, + { "code": "522622", "name": "黄平县" }, + { "code": "522623", "name": "施秉县" }, + { "code": "522624", "name": "三穗县" }, + { "code": "522625", "name": "镇远县" }, + { "code": "522626", "name": "岑巩县" }, + { "code": "522627", "name": "天柱县" }, + { "code": "522628", "name": "锦屏县" }, + { "code": "522629", "name": "剑河县" }, + { "code": "522630", "name": "台江县" }, + { "code": "522631", "name": "黎平县" }, + { "code": "522632", "name": "榕江县" }, + { "code": "522633", "name": "从江县" }, + { "code": "522634", "name": "雷山县" }, + { "code": "522635", "name": "麻江县" }, + { "code": "522636", "name": "丹寨县" } + ] + }, + { + "code": "5227", + "name": "黔南布依族苗族自治州", + "children": [ + { "code": "522701", "name": "都匀市" }, + { "code": "522702", "name": "福泉市" }, + { "code": "522722", "name": "荔波县" }, + { "code": "522723", "name": "贵定县" }, + { "code": "522725", "name": "瓮安县" }, + { "code": "522726", "name": "独山县" }, + { "code": "522727", "name": "平塘县" }, + { "code": "522728", "name": "罗甸县" }, + { "code": "522729", "name": "长顺县" }, + { "code": "522730", "name": "龙里县" }, + { "code": "522731", "name": "惠水县" }, + { "code": "522732", "name": "三都水族自治县" } + ] + } + ] + }, + { + "code": "53", + "name": "云南省", + "children": [ + { + "code": "5301", + "name": "昆明市", + "children": [ + { "code": "530102", "name": "五华区" }, + { "code": "530103", "name": "盘龙区" }, + { "code": "530111", "name": "官渡区" }, + { "code": "530112", "name": "西山区" }, + { "code": "530113", "name": "东川区" }, + { "code": "530114", "name": "呈贡区" }, + { "code": "530115", "name": "晋宁区" }, + { "code": "530124", "name": "富民县" }, + { "code": "530125", "name": "宜良县" }, + { "code": "530126", "name": "石林彝族自治县" }, + { "code": "530127", "name": "嵩明县" }, + { "code": "530128", "name": "禄劝彝族苗族自治县" }, + { "code": "530129", "name": "寻甸回族彝族自治县" }, + { "code": "530181", "name": "安宁市" } + ] + }, + { + "code": "5303", + "name": "曲靖市", + "children": [ + { "code": "530302", "name": "麒麟区" }, + { "code": "530303", "name": "沾益区" }, + { "code": "530304", "name": "马龙区" }, + { "code": "530322", "name": "陆良县" }, + { "code": "530323", "name": "师宗县" }, + { "code": "530324", "name": "罗平县" }, + { "code": "530325", "name": "富源县" }, + { "code": "530326", "name": "会泽县" }, + { "code": "530381", "name": "宣威市" } + ] + }, + { + "code": "5304", + "name": "玉溪市", + "children": [ + { "code": "530402", "name": "红塔区" }, + { "code": "530403", "name": "江川区" }, + { "code": "530422", "name": "澄江县" }, + { "code": "530423", "name": "通海县" }, + { "code": "530424", "name": "华宁县" }, + { "code": "530425", "name": "易门县" }, + { "code": "530426", "name": "峨山彝族自治县" }, + { "code": "530427", "name": "新平彝族傣族自治县" }, + { "code": "530428", "name": "元江哈尼族彝族傣族自治县" } + ] + }, + { + "code": "5305", + "name": "保山市", + "children": [ + { "code": "530502", "name": "隆阳区" }, + { "code": "530521", "name": "施甸县" }, + { "code": "530523", "name": "龙陵县" }, + { "code": "530524", "name": "昌宁县" }, + { "code": "530581", "name": "腾冲市" } + ] + }, + { + "code": "5306", + "name": "昭通市", + "children": [ + { "code": "530602", "name": "昭阳区" }, + { "code": "530621", "name": "鲁甸县" }, + { "code": "530622", "name": "巧家县" }, + { "code": "530623", "name": "盐津县" }, + { "code": "530624", "name": "大关县" }, + { "code": "530625", "name": "永善县" }, + { "code": "530626", "name": "绥江县" }, + { "code": "530627", "name": "镇雄县" }, + { "code": "530628", "name": "彝良县" }, + { "code": "530629", "name": "威信县" }, + { "code": "530681", "name": "水富市" } + ] + }, + { + "code": "5307", + "name": "丽江市", + "children": [ + { "code": "530702", "name": "古城区" }, + { "code": "530721", "name": "玉龙纳西族自治县" }, + { "code": "530722", "name": "永胜县" }, + { "code": "530723", "name": "华坪县" }, + { "code": "530724", "name": "宁蒗彝族自治县" } + ] + }, + { + "code": "5308", + "name": "普洱市", + "children": [ + { "code": "530802", "name": "思茅区" }, + { "code": "530821", "name": "宁洱哈尼族彝族自治县" }, + { "code": "530822", "name": "墨江哈尼族自治县" }, + { "code": "530823", "name": "景东彝族自治县" }, + { "code": "530824", "name": "景谷傣族彝族自治县" }, + { "code": "530825", "name": "镇沅彝族哈尼族拉祜族自治县" }, + { "code": "530826", "name": "江城哈尼族彝族自治县" }, + { "code": "530827", "name": "孟连傣族拉祜族佤族自治县" }, + { "code": "530828", "name": "澜沧拉祜族自治县" }, + { "code": "530829", "name": "西盟佤族自治县" } + ] + }, + { + "code": "5309", + "name": "临沧市", + "children": [ + { "code": "530902", "name": "临翔区" }, + { "code": "530921", "name": "凤庆县" }, + { "code": "530922", "name": "云县" }, + { "code": "530923", "name": "永德县" }, + { "code": "530924", "name": "镇康县" }, + { "code": "530925", "name": "双江拉祜族佤族布朗族傣族自治县" }, + { "code": "530926", "name": "耿马傣族佤族自治县" }, + { "code": "530927", "name": "沧源佤族自治县" } + ] + }, + { + "code": "5323", + "name": "楚雄彝族自治州", + "children": [ + { "code": "532301", "name": "楚雄市" }, + { "code": "532322", "name": "双柏县" }, + { "code": "532323", "name": "牟定县" }, + { "code": "532324", "name": "南华县" }, + { "code": "532325", "name": "姚安县" }, + { "code": "532326", "name": "大姚县" }, + { "code": "532327", "name": "永仁县" }, + { "code": "532328", "name": "元谋县" }, + { "code": "532329", "name": "武定县" }, + { "code": "532331", "name": "禄丰县" } + ] + }, + { + "code": "5325", + "name": "红河哈尼族彝族自治州", + "children": [ + { "code": "532501", "name": "个旧市" }, + { "code": "532502", "name": "开远市" }, + { "code": "532503", "name": "蒙自市" }, + { "code": "532504", "name": "弥勒市" }, + { "code": "532523", "name": "屏边苗族自治县" }, + { "code": "532524", "name": "建水县" }, + { "code": "532525", "name": "石屏县" }, + { "code": "532527", "name": "泸西县" }, + { "code": "532528", "name": "元阳县" }, + { "code": "532529", "name": "红河县" }, + { "code": "532530", "name": "金平苗族瑶族傣族自治县" }, + { "code": "532531", "name": "绿春县" }, + { "code": "532532", "name": "河口瑶族自治县" } + ] + }, + { + "code": "5326", + "name": "文山壮族苗族自治州", + "children": [ + { "code": "532601", "name": "文山市" }, + { "code": "532622", "name": "砚山县" }, + { "code": "532623", "name": "西畴县" }, + { "code": "532624", "name": "麻栗坡县" }, + { "code": "532625", "name": "马关县" }, + { "code": "532626", "name": "丘北县" }, + { "code": "532627", "name": "广南县" }, + { "code": "532628", "name": "富宁县" } + ] + }, + { + "code": "5328", + "name": "西双版纳傣族自治州", + "children": [ + { "code": "532801", "name": "景洪市" }, + { "code": "532822", "name": "勐海县" }, + { "code": "532823", "name": "勐腊县" } + ] + }, + { + "code": "5329", + "name": "大理白族自治州", + "children": [ + { "code": "532901", "name": "大理市" }, + { "code": "532922", "name": "漾濞彝族自治县" }, + { "code": "532923", "name": "祥云县" }, + { "code": "532924", "name": "宾川县" }, + { "code": "532925", "name": "弥渡县" }, + { "code": "532926", "name": "南涧彝族自治县" }, + { "code": "532927", "name": "巍山彝族回族自治县" }, + { "code": "532928", "name": "永平县" }, + { "code": "532929", "name": "云龙县" }, + { "code": "532930", "name": "洱源县" }, + { "code": "532931", "name": "剑川县" }, + { "code": "532932", "name": "鹤庆县" } + ] + }, + { + "code": "5331", + "name": "德宏傣族景颇族自治州", + "children": [ + { "code": "533102", "name": "瑞丽市" }, + { "code": "533103", "name": "芒市" }, + { "code": "533122", "name": "梁河县" }, + { "code": "533123", "name": "盈江县" }, + { "code": "533124", "name": "陇川县" } + ] + }, + { + "code": "5333", + "name": "怒江傈僳族自治州", + "children": [ + { "code": "533301", "name": "泸水市" }, + { "code": "533323", "name": "福贡县" }, + { "code": "533324", "name": "贡山独龙族怒族自治县" }, + { "code": "533325", "name": "兰坪白族普米族自治县" } + ] + }, + { + "code": "5334", + "name": "迪庆藏族自治州", + "children": [ + { "code": "533401", "name": "香格里拉市" }, + { "code": "533422", "name": "德钦县" }, + { "code": "533423", "name": "维西傈僳族自治县" } + ] + } + ] + }, + { + "code": "54", + "name": "西藏自治区", + "children": [ + { + "code": "5401", + "name": "拉萨市", + "children": [ + { "code": "540102", "name": "城关区" }, + { "code": "540103", "name": "堆龙德庆区" }, + { "code": "540104", "name": "达孜区" }, + { "code": "540121", "name": "林周县" }, + { "code": "540122", "name": "当雄县" }, + { "code": "540123", "name": "尼木县" }, + { "code": "540124", "name": "曲水县" }, + { "code": "540127", "name": "墨竹工卡县" }, + { "code": "540171", "name": "格尔木藏青工业园区" }, + { "code": "540172", "name": "拉萨经济技术开发区" }, + { "code": "540173", "name": "西藏文化旅游创意园区" }, + { "code": "540174", "name": "达孜工业园区" } + ] + }, + { + "code": "5402", + "name": "日喀则市", + "children": [ + { "code": "540202", "name": "桑珠孜区" }, + { "code": "540221", "name": "南木林县" }, + { "code": "540222", "name": "江孜县" }, + { "code": "540223", "name": "定日县" }, + { "code": "540224", "name": "萨迦县" }, + { "code": "540225", "name": "拉孜县" }, + { "code": "540226", "name": "昂仁县" }, + { "code": "540227", "name": "谢通门县" }, + { "code": "540228", "name": "白朗县" }, + { "code": "540229", "name": "仁布县" }, + { "code": "540230", "name": "康马县" }, + { "code": "540231", "name": "定结县" }, + { "code": "540232", "name": "仲巴县" }, + { "code": "540233", "name": "亚东县" }, + { "code": "540234", "name": "吉隆县" }, + { "code": "540235", "name": "聂拉木县" }, + { "code": "540236", "name": "萨嘎县" }, + { "code": "540237", "name": "岗巴县" } + ] + }, + { + "code": "5403", + "name": "昌都市", + "children": [ + { "code": "540302", "name": "卡若区" }, + { "code": "540321", "name": "江达县" }, + { "code": "540322", "name": "贡觉县" }, + { "code": "540323", "name": "类乌齐县" }, + { "code": "540324", "name": "丁青县" }, + { "code": "540325", "name": "察雅县" }, + { "code": "540326", "name": "八宿县" }, + { "code": "540327", "name": "左贡县" }, + { "code": "540328", "name": "芒康县" }, + { "code": "540329", "name": "洛隆县" }, + { "code": "540330", "name": "边坝县" } + ] + }, + { + "code": "5404", + "name": "林芝市", + "children": [ + { "code": "540402", "name": "巴宜区" }, + { "code": "540421", "name": "工布江达县" }, + { "code": "540422", "name": "米林县" }, + { "code": "540423", "name": "墨脱县" }, + { "code": "540424", "name": "波密县" }, + { "code": "540425", "name": "察隅县" }, + { "code": "540426", "name": "朗县" } + ] + }, + { + "code": "5405", + "name": "山南市", + "children": [ + { "code": "540502", "name": "乃东区" }, + { "code": "540521", "name": "扎囊县" }, + { "code": "540522", "name": "贡嘎县" }, + { "code": "540523", "name": "桑日县" }, + { "code": "540524", "name": "琼结县" }, + { "code": "540525", "name": "曲松县" }, + { "code": "540526", "name": "措美县" }, + { "code": "540527", "name": "洛扎县" }, + { "code": "540528", "name": "加查县" }, + { "code": "540529", "name": "隆子县" }, + { "code": "540530", "name": "错那县" }, + { "code": "540531", "name": "浪卡子县" } + ] + }, + { + "code": "5406", + "name": "那曲市", + "children": [ + { "code": "540602", "name": "色尼区" }, + { "code": "540621", "name": "嘉黎县" }, + { "code": "540622", "name": "比如县" }, + { "code": "540623", "name": "聂荣县" }, + { "code": "540624", "name": "安多县" }, + { "code": "540625", "name": "申扎县" }, + { "code": "540626", "name": "索县" }, + { "code": "540627", "name": "班戈县" }, + { "code": "540628", "name": "巴青县" }, + { "code": "540629", "name": "尼玛县" }, + { "code": "540630", "name": "双湖县" } + ] + }, + { + "code": "5425", + "name": "阿里地区", + "children": [ + { "code": "542521", "name": "普兰县" }, + { "code": "542522", "name": "札达县" }, + { "code": "542523", "name": "噶尔县" }, + { "code": "542524", "name": "日土县" }, + { "code": "542525", "name": "革吉县" }, + { "code": "542526", "name": "改则县" }, + { "code": "542527", "name": "措勤县" } + ] + } + ] + }, + { + "code": "61", + "name": "陕西省", + "children": [ + { + "code": "6101", + "name": "西安市", + "children": [ + { "code": "610102", "name": "新城区" }, + { "code": "610103", "name": "碑林区" }, + { "code": "610104", "name": "莲湖区" }, + { "code": "610111", "name": "灞桥区" }, + { "code": "610112", "name": "未央区" }, + { "code": "610113", "name": "雁塔区" }, + { "code": "610114", "name": "阎良区" }, + { "code": "610115", "name": "临潼区" }, + { "code": "610116", "name": "长安区" }, + { "code": "610117", "name": "高陵区" }, + { "code": "610118", "name": "鄠邑区" }, + { "code": "610122", "name": "蓝田县" }, + { "code": "610124", "name": "周至县" } + ] + }, + { + "code": "6102", + "name": "铜川市", + "children": [ + { "code": "610202", "name": "王益区" }, + { "code": "610203", "name": "印台区" }, + { "code": "610204", "name": "耀州区" }, + { "code": "610222", "name": "宜君县" } + ] + }, + { + "code": "6103", + "name": "宝鸡市", + "children": [ + { "code": "610302", "name": "渭滨区" }, + { "code": "610303", "name": "金台区" }, + { "code": "610304", "name": "陈仓区" }, + { "code": "610322", "name": "凤翔县" }, + { "code": "610323", "name": "岐山县" }, + { "code": "610324", "name": "扶风县" }, + { "code": "610326", "name": "眉县" }, + { "code": "610327", "name": "陇县" }, + { "code": "610328", "name": "千阳县" }, + { "code": "610329", "name": "麟游县" }, + { "code": "610330", "name": "凤县" }, + { "code": "610331", "name": "太白县" } + ] + }, + { + "code": "6104", + "name": "咸阳市", + "children": [ + { "code": "610402", "name": "秦都区" }, + { "code": "610403", "name": "杨陵区" }, + { "code": "610404", "name": "渭城区" }, + { "code": "610422", "name": "三原县" }, + { "code": "610423", "name": "泾阳县" }, + { "code": "610424", "name": "乾县" }, + { "code": "610425", "name": "礼泉县" }, + { "code": "610426", "name": "永寿县" }, + { "code": "610428", "name": "长武县" }, + { "code": "610429", "name": "旬邑县" }, + { "code": "610430", "name": "淳化县" }, + { "code": "610431", "name": "武功县" }, + { "code": "610481", "name": "兴平市" }, + { "code": "610482", "name": "彬州市" } + ] + }, + { + "code": "6105", + "name": "渭南市", + "children": [ + { "code": "610502", "name": "临渭区" }, + { "code": "610503", "name": "华州区" }, + { "code": "610522", "name": "潼关县" }, + { "code": "610523", "name": "大荔县" }, + { "code": "610524", "name": "合阳县" }, + { "code": "610525", "name": "澄城县" }, + { "code": "610526", "name": "蒲城县" }, + { "code": "610527", "name": "白水县" }, + { "code": "610528", "name": "富平县" }, + { "code": "610581", "name": "韩城市" }, + { "code": "610582", "name": "华阴市" } + ] + }, + { + "code": "6106", + "name": "延安市", + "children": [ + { "code": "610602", "name": "宝塔区" }, + { "code": "610603", "name": "安塞区" }, + { "code": "610621", "name": "延长县" }, + { "code": "610622", "name": "延川县" }, + { "code": "610625", "name": "志丹县" }, + { "code": "610626", "name": "吴起县" }, + { "code": "610627", "name": "甘泉县" }, + { "code": "610628", "name": "富县" }, + { "code": "610629", "name": "洛川县" }, + { "code": "610630", "name": "宜川县" }, + { "code": "610631", "name": "黄龙县" }, + { "code": "610632", "name": "黄陵县" }, + { "code": "610681", "name": "子长市" } + ] + }, + { + "code": "6107", + "name": "汉中市", + "children": [ + { "code": "610702", "name": "汉台区" }, + { "code": "610703", "name": "南郑区" }, + { "code": "610722", "name": "城固县" }, + { "code": "610723", "name": "洋县" }, + { "code": "610724", "name": "西乡县" }, + { "code": "610725", "name": "勉县" }, + { "code": "610726", "name": "宁强县" }, + { "code": "610727", "name": "略阳县" }, + { "code": "610728", "name": "镇巴县" }, + { "code": "610729", "name": "留坝县" }, + { "code": "610730", "name": "佛坪县" } + ] + }, + { + "code": "6108", + "name": "榆林市", + "children": [ + { "code": "610802", "name": "榆阳区" }, + { "code": "610803", "name": "横山区" }, + { "code": "610822", "name": "府谷县" }, + { "code": "610824", "name": "靖边县" }, + { "code": "610825", "name": "定边县" }, + { "code": "610826", "name": "绥德县" }, + { "code": "610827", "name": "米脂县" }, + { "code": "610828", "name": "佳县" }, + { "code": "610829", "name": "吴堡县" }, + { "code": "610830", "name": "清涧县" }, + { "code": "610831", "name": "子洲县" }, + { "code": "610881", "name": "神木市" } + ] + }, + { + "code": "6109", + "name": "安康市", + "children": [ + { "code": "610902", "name": "汉滨区" }, + { "code": "610921", "name": "汉阴县" }, + { "code": "610922", "name": "石泉县" }, + { "code": "610923", "name": "宁陕县" }, + { "code": "610924", "name": "紫阳县" }, + { "code": "610925", "name": "岚皋县" }, + { "code": "610926", "name": "平利县" }, + { "code": "610927", "name": "镇坪县" }, + { "code": "610928", "name": "旬阳县" }, + { "code": "610929", "name": "白河县" } + ] + }, + { + "code": "6110", + "name": "商洛市", + "children": [ + { "code": "611002", "name": "商州区" }, + { "code": "611021", "name": "洛南县" }, + { "code": "611022", "name": "丹凤县" }, + { "code": "611023", "name": "商南县" }, + { "code": "611024", "name": "山阳县" }, + { "code": "611025", "name": "镇安县" }, + { "code": "611026", "name": "柞水县" } + ] + } + ] + }, + { + "code": "62", + "name": "甘肃省", + "children": [ + { + "code": "6201", + "name": "兰州市", + "children": [ + { "code": "620102", "name": "城关区" }, + { "code": "620103", "name": "七里河区" }, + { "code": "620104", "name": "西固区" }, + { "code": "620105", "name": "安宁区" }, + { "code": "620111", "name": "红古区" }, + { "code": "620121", "name": "永登县" }, + { "code": "620122", "name": "皋兰县" }, + { "code": "620123", "name": "榆中县" }, + { "code": "620171", "name": "兰州新区" } + ] + }, + { + "code": "6202", + "name": "嘉峪关市", + "children": [ + { "code": "620201100", "name": "新城镇" }, + { "code": "620201101", "name": "峪泉镇" }, + { "code": "620201102", "name": "文殊镇" }, + { "code": "620201401", "name": "雄关区" }, + { "code": "620201402", "name": "镜铁区" }, + { "code": "620201403", "name": "长城区" } + ] + }, + { + "code": "6203", + "name": "金昌市", + "children": [ + { "code": "620302", "name": "金川区" }, + { "code": "620321", "name": "永昌县" } + ] + }, + { + "code": "6204", + "name": "白银市", + "children": [ + { "code": "620402", "name": "白银区" }, + { "code": "620403", "name": "平川区" }, + { "code": "620421", "name": "靖远县" }, + { "code": "620422", "name": "会宁县" }, + { "code": "620423", "name": "景泰县" } + ] + }, + { + "code": "6205", + "name": "天水市", + "children": [ + { "code": "620502", "name": "秦州区" }, + { "code": "620503", "name": "麦积区" }, + { "code": "620521", "name": "清水县" }, + { "code": "620522", "name": "秦安县" }, + { "code": "620523", "name": "甘谷县" }, + { "code": "620524", "name": "武山县" }, + { "code": "620525", "name": "张家川回族自治县" } + ] + }, + { + "code": "6206", + "name": "武威市", + "children": [ + { "code": "620602", "name": "凉州区" }, + { "code": "620621", "name": "民勤县" }, + { "code": "620622", "name": "古浪县" }, + { "code": "620623", "name": "天祝藏族自治县" } + ] + }, + { + "code": "6207", + "name": "张掖市", + "children": [ + { "code": "620702", "name": "甘州区" }, + { "code": "620721", "name": "肃南裕固族自治县" }, + { "code": "620722", "name": "民乐县" }, + { "code": "620723", "name": "临泽县" }, + { "code": "620724", "name": "高台县" }, + { "code": "620725", "name": "山丹县" } + ] + }, + { + "code": "6208", + "name": "平凉市", + "children": [ + { "code": "620802", "name": "崆峒区" }, + { "code": "620821", "name": "泾川县" }, + { "code": "620822", "name": "灵台县" }, + { "code": "620823", "name": "崇信县" }, + { "code": "620825", "name": "庄浪县" }, + { "code": "620826", "name": "静宁县" }, + { "code": "620881", "name": "华亭市" } + ] + }, + { + "code": "6209", + "name": "酒泉市", + "children": [ + { "code": "620902", "name": "肃州区" }, + { "code": "620921", "name": "金塔县" }, + { "code": "620922", "name": "瓜州县" }, + { "code": "620923", "name": "肃北蒙古族自治县" }, + { "code": "620924", "name": "阿克塞哈萨克族自治县" }, + { "code": "620981", "name": "玉门市" }, + { "code": "620982", "name": "敦煌市" } + ] + }, + { + "code": "6210", + "name": "庆阳市", + "children": [ + { "code": "621002", "name": "西峰区" }, + { "code": "621021", "name": "庆城县" }, + { "code": "621022", "name": "环县" }, + { "code": "621023", "name": "华池县" }, + { "code": "621024", "name": "合水县" }, + { "code": "621025", "name": "正宁县" }, + { "code": "621026", "name": "宁县" }, + { "code": "621027", "name": "镇原县" } + ] + }, + { + "code": "6211", + "name": "定西市", + "children": [ + { "code": "621102", "name": "安定区" }, + { "code": "621121", "name": "通渭县" }, + { "code": "621122", "name": "陇西县" }, + { "code": "621123", "name": "渭源县" }, + { "code": "621124", "name": "临洮县" }, + { "code": "621125", "name": "漳县" }, + { "code": "621126", "name": "岷县" } + ] + }, + { + "code": "6212", + "name": "陇南市", + "children": [ + { "code": "621202", "name": "武都区" }, + { "code": "621221", "name": "成县" }, + { "code": "621222", "name": "文县" }, + { "code": "621223", "name": "宕昌县" }, + { "code": "621224", "name": "康县" }, + { "code": "621225", "name": "西和县" }, + { "code": "621226", "name": "礼县" }, + { "code": "621227", "name": "徽县" }, + { "code": "621228", "name": "两当县" } + ] + }, + { + "code": "6229", + "name": "临夏回族自治州", + "children": [ + { "code": "622901", "name": "临夏市" }, + { "code": "622921", "name": "临夏县" }, + { "code": "622922", "name": "康乐县" }, + { "code": "622923", "name": "永靖县" }, + { "code": "622924", "name": "广河县" }, + { "code": "622925", "name": "和政县" }, + { "code": "622926", "name": "东乡族自治县" }, + { "code": "622927", "name": "积石山保安族东乡族撒拉族自治县" } + ] + }, + { + "code": "6230", + "name": "甘南藏族自治州", + "children": [ + { "code": "623001", "name": "合作市" }, + { "code": "623021", "name": "临潭县" }, + { "code": "623022", "name": "卓尼县" }, + { "code": "623023", "name": "舟曲县" }, + { "code": "623024", "name": "迭部县" }, + { "code": "623025", "name": "玛曲县" }, + { "code": "623026", "name": "碌曲县" }, + { "code": "623027", "name": "夏河县" } + ] + } + ] + }, + { + "code": "63", + "name": "青海省", + "children": [ + { + "code": "6301", + "name": "西宁市", + "children": [ + { "code": "630102", "name": "城东区" }, + { "code": "630103", "name": "城中区" }, + { "code": "630104", "name": "城西区" }, + { "code": "630105", "name": "城北区" }, + { "code": "630121", "name": "大通回族土族自治县" }, + { "code": "630122", "name": "湟中县" }, + { "code": "630123", "name": "湟源县" } + ] + }, + { + "code": "6302", + "name": "海东市", + "children": [ + { "code": "630202", "name": "乐都区" }, + { "code": "630203", "name": "平安区" }, + { "code": "630222", "name": "民和回族土族自治县" }, + { "code": "630223", "name": "互助土族自治县" }, + { "code": "630224", "name": "化隆回族自治县" }, + { "code": "630225", "name": "循化撒拉族自治县" } + ] + }, + { + "code": "6322", + "name": "海北藏族自治州", + "children": [ + { "code": "632221", "name": "门源回族自治县" }, + { "code": "632222", "name": "祁连县" }, + { "code": "632223", "name": "海晏县" }, + { "code": "632224", "name": "刚察县" } + ] + }, + { + "code": "6323", + "name": "黄南藏族自治州", + "children": [ + { "code": "632321", "name": "同仁县" }, + { "code": "632322", "name": "尖扎县" }, + { "code": "632323", "name": "泽库县" }, + { "code": "632324", "name": "河南蒙古族自治县" } + ] + }, + { + "code": "6325", + "name": "海南藏族自治州", + "children": [ + { "code": "632521", "name": "共和县" }, + { "code": "632522", "name": "同德县" }, + { "code": "632523", "name": "贵德县" }, + { "code": "632524", "name": "兴海县" }, + { "code": "632525", "name": "贵南县" } + ] + }, + { + "code": "6326", + "name": "果洛藏族自治州", + "children": [ + { "code": "632621", "name": "玛沁县" }, + { "code": "632622", "name": "班玛县" }, + { "code": "632623", "name": "甘德县" }, + { "code": "632624", "name": "达日县" }, + { "code": "632625", "name": "久治县" }, + { "code": "632626", "name": "玛多县" } + ] + }, + { + "code": "6327", + "name": "玉树藏族自治州", + "children": [ + { "code": "632701", "name": "玉树市" }, + { "code": "632722", "name": "杂多县" }, + { "code": "632723", "name": "称多县" }, + { "code": "632724", "name": "治多县" }, + { "code": "632725", "name": "囊谦县" }, + { "code": "632726", "name": "曲麻莱县" } + ] + }, + { + "code": "6328", + "name": "海西蒙古族藏族自治州", + "children": [ + { "code": "632801", "name": "格尔木市" }, + { "code": "632802", "name": "德令哈市" }, + { "code": "632803", "name": "茫崖市" }, + { "code": "632821", "name": "乌兰县" }, + { "code": "632822", "name": "都兰县" }, + { "code": "632823", "name": "天峻县" }, + { "code": "632857", "name": "大柴旦行政委员会" } + ] + } + ] + }, + { + "code": "64", + "name": "宁夏回族自治区", + "children": [ + { + "code": "6401", + "name": "银川市", + "children": [ + { "code": "640104", "name": "兴庆区" }, + { "code": "640105", "name": "西夏区" }, + { "code": "640106", "name": "金凤区" }, + { "code": "640121", "name": "永宁县" }, + { "code": "640122", "name": "贺兰县" }, + { "code": "640181", "name": "灵武市" } + ] + }, + { + "code": "6402", + "name": "石嘴山市", + "children": [ + { "code": "640202", "name": "大武口区" }, + { "code": "640205", "name": "惠农区" }, + { "code": "640221", "name": "平罗县" } + ] + }, + { + "code": "6403", + "name": "吴忠市", + "children": [ + { "code": "640302", "name": "利通区" }, + { "code": "640303", "name": "红寺堡区" }, + { "code": "640323", "name": "盐池县" }, + { "code": "640324", "name": "同心县" }, + { "code": "640381", "name": "青铜峡市" } + ] + }, + { + "code": "6404", + "name": "固原市", + "children": [ + { "code": "640402", "name": "原州区" }, + { "code": "640422", "name": "西吉县" }, + { "code": "640423", "name": "隆德县" }, + { "code": "640424", "name": "泾源县" }, + { "code": "640425", "name": "彭阳县" } + ] + }, + { + "code": "6405", + "name": "中卫市", + "children": [ + { "code": "640502", "name": "沙坡头区" }, + { "code": "640521", "name": "中宁县" }, + { "code": "640522", "name": "海原县" } + ] + } + ] + }, + { + "code": "65", + "name": "新疆维吾尔自治区", + "children": [ + { + "code": "6501", + "name": "乌鲁木齐市", + "children": [ + { "code": "650102", "name": "天山区" }, + { "code": "650103", "name": "沙依巴克区" }, + { "code": "650104", "name": "新市区" }, + { "code": "650105", "name": "水磨沟区" }, + { "code": "650106", "name": "头屯河区" }, + { "code": "650107", "name": "达坂城区" }, + { "code": "650109", "name": "米东区" }, + { "code": "650121", "name": "乌鲁木齐县" } + ] + }, + { + "code": "6502", + "name": "克拉玛依市", + "children": [ + { "code": "650202", "name": "独山子区" }, + { "code": "650203", "name": "克拉玛依区" }, + { "code": "650204", "name": "白碱滩区" }, + { "code": "650205", "name": "乌尔禾区" } + ] + }, + { + "code": "6504", + "name": "吐鲁番市", + "children": [ + { "code": "650402", "name": "高昌区" }, + { "code": "650421", "name": "鄯善县" }, + { "code": "650422", "name": "托克逊县" } + ] + }, + { + "code": "6505", + "name": "哈密市", + "children": [ + { "code": "650502", "name": "伊州区" }, + { "code": "650521", "name": "巴里坤哈萨克自治县" }, + { "code": "650522", "name": "伊吾县" } + ] + }, + { + "code": "6523", + "name": "昌吉回族自治州", + "children": [ + { "code": "652301", "name": "昌吉市" }, + { "code": "652302", "name": "阜康市" }, + { "code": "652323", "name": "呼图壁县" }, + { "code": "652324", "name": "玛纳斯县" }, + { "code": "652325", "name": "奇台县" }, + { "code": "652327", "name": "吉木萨尔县" }, + { "code": "652328", "name": "木垒哈萨克自治县" } + ] + }, + { + "code": "6527", + "name": "博尔塔拉蒙古自治州", + "children": [ + { "code": "652701", "name": "博乐市" }, + { "code": "652702", "name": "阿拉山口市" }, + { "code": "652722", "name": "精河县" }, + { "code": "652723", "name": "温泉县" } + ] + }, + { + "code": "6528", + "name": "巴音郭楞蒙古自治州", + "children": [ + { "code": "652801", "name": "库尔勒市" }, + { "code": "652822", "name": "轮台县" }, + { "code": "652823", "name": "尉犁县" }, + { "code": "652824", "name": "若羌县" }, + { "code": "652825", "name": "且末县" }, + { "code": "652826", "name": "焉耆回族自治县" }, + { "code": "652827", "name": "和静县" }, + { "code": "652828", "name": "和硕县" }, + { "code": "652829", "name": "博湖县" }, + { "code": "652871", "name": "库尔勒经济技术开发区" } + ] + }, + { + "code": "6529", + "name": "阿克苏地区", + "children": [ + { "code": "652901", "name": "阿克苏市" }, + { "code": "652922", "name": "温宿县" }, + { "code": "652923", "name": "库车县" }, + { "code": "652924", "name": "沙雅县" }, + { "code": "652925", "name": "新和县" }, + { "code": "652926", "name": "拜城县" }, + { "code": "652927", "name": "乌什县" }, + { "code": "652928", "name": "阿瓦提县" }, + { "code": "652929", "name": "柯坪县" } + ] + }, + { + "code": "6530", + "name": "克孜勒苏柯尔克孜自治州", + "children": [ + { "code": "653001", "name": "阿图什市" }, + { "code": "653022", "name": "阿克陶县" }, + { "code": "653023", "name": "阿合奇县" }, + { "code": "653024", "name": "乌恰县" } + ] + }, + { + "code": "6531", + "name": "喀什地区", + "children": [ + { "code": "653101", "name": "喀什市" }, + { "code": "653121", "name": "疏附县" }, + { "code": "653122", "name": "疏勒县" }, + { "code": "653123", "name": "英吉沙县" }, + { "code": "653124", "name": "泽普县" }, + { "code": "653125", "name": "莎车县" }, + { "code": "653126", "name": "叶城县" }, + { "code": "653127", "name": "麦盖提县" }, + { "code": "653128", "name": "岳普湖县" }, + { "code": "653129", "name": "伽师县" }, + { "code": "653130", "name": "巴楚县" }, + { "code": "653131", "name": "塔什库尔干塔吉克自治县" } + ] + }, + { + "code": "6532", + "name": "和田地区", + "children": [ + { "code": "653201", "name": "和田市" }, + { "code": "653221", "name": "和田县" }, + { "code": "653222", "name": "墨玉县" }, + { "code": "653223", "name": "皮山县" }, + { "code": "653224", "name": "洛浦县" }, + { "code": "653225", "name": "策勒县" }, + { "code": "653226", "name": "于田县" }, + { "code": "653227", "name": "民丰县" } + ] + }, + { + "code": "6540", + "name": "伊犁哈萨克自治州", + "children": [ + { "code": "654002", "name": "伊宁市" }, + { "code": "654003", "name": "奎屯市" }, + { "code": "654004", "name": "霍尔果斯市" }, + { "code": "654021", "name": "伊宁县" }, + { "code": "654022", "name": "察布查尔锡伯自治县" }, + { "code": "654023", "name": "霍城县" }, + { "code": "654024", "name": "巩留县" }, + { "code": "654025", "name": "新源县" }, + { "code": "654026", "name": "昭苏县" }, + { "code": "654027", "name": "特克斯县" }, + { "code": "654028", "name": "尼勒克县" } + ] + }, + { + "code": "6542", + "name": "塔城地区", + "children": [ + { "code": "654201", "name": "塔城市" }, + { "code": "654202", "name": "乌苏市" }, + { "code": "654221", "name": "额敏县" }, + { "code": "654223", "name": "沙湾县" }, + { "code": "654224", "name": "托里县" }, + { "code": "654225", "name": "裕民县" }, + { "code": "654226", "name": "和布克赛尔蒙古自治县" } + ] + }, + { + "code": "6543", + "name": "阿勒泰地区", + "children": [ + { "code": "654301", "name": "阿勒泰市" }, + { "code": "654321", "name": "布尔津县" }, + { "code": "654322", "name": "富蕴县" }, + { "code": "654323", "name": "福海县" }, + { "code": "654324", "name": "哈巴河县" }, + { "code": "654325", "name": "青河县" }, + { "code": "654326", "name": "吉木乃县" } + ] + }, + { + "code": "6590", + "name": "自治区直辖县级行政区划", + "children": [ + { "code": "659001", "name": "石河子市" }, + { "code": "659002", "name": "阿拉尔市" }, + { "code": "659003", "name": "图木舒克市" }, + { "code": "659004", "name": "五家渠市" }, + { "code": "659006", "name": "铁门关市" } + ] + } + ] + } +] diff --git a/cool/components/distpicker/components/index.vue b/cool/components/distpicker/components/index.vue new file mode 100644 index 0000000..12ab7be --- /dev/null +++ b/cool/components/distpicker/components/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/cool/components/distpicker/index.js b/cool/components/distpicker/index.js new file mode 100644 index 0000000..20b96b7 --- /dev/null +++ b/cool/components/distpicker/index.js @@ -0,0 +1,7 @@ +import Distpicker from "./components"; + +export default { + components: { + Distpicker + } +}; diff --git a/cool/components/editor-quill/components/index.vue b/cool/components/editor-quill/components/index.vue new file mode 100644 index 0000000..0966f9d --- /dev/null +++ b/cool/components/editor-quill/components/index.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/cool/components/editor-quill/index.js b/cool/components/editor-quill/index.js new file mode 100644 index 0000000..90bbfd1 --- /dev/null +++ b/cool/components/editor-quill/index.js @@ -0,0 +1,7 @@ +import EditorQuill from "./components"; + +export default { + components: { + EditorQuill + } +}; diff --git a/cool/components/editor-quill/package.json b/cool/components/editor-quill/package.json new file mode 100644 index 0000000..30b5cc1 --- /dev/null +++ b/cool/components/editor-quill/package.json @@ -0,0 +1,9 @@ +{ + "name": "editor-quill", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "quill": "^1.3.7" + } +} diff --git a/cool/components/log/index.js b/cool/components/log/index.js new file mode 100644 index 0000000..ae50073 --- /dev/null +++ b/cool/components/log/index.js @@ -0,0 +1,4 @@ +import service from "./service"; +import views from "./views"; + +export default { service, views }; diff --git a/cool/components/log/service/index.js b/cool/components/log/service/index.js new file mode 100644 index 0000000..afe78ea --- /dev/null +++ b/cool/components/log/service/index.js @@ -0,0 +1,7 @@ +import SysLog from "./log"; + +export default { + system: { + log: new SysLog() + } +}; diff --git a/cool/components/log/service/log.js b/cool/components/log/service/log.js new file mode 100644 index 0000000..03b3776 --- /dev/null +++ b/cool/components/log/service/log.js @@ -0,0 +1,32 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("sys/log") +class SysLog extends BaseService { + @Permission("clear") + clear() { + return this.request({ + url: "/clear", + method: "POST" + }); + } + + @Permission("getKeep") + getKeep() { + return this.request({ + url: "/getKeep" + }); + } + + @Permission("setKeep") + setKeep(value) { + return this.request({ + url: "/setKeep", + method: "POST", + data: { + value + } + }); + } +} + +export default SysLog; diff --git a/cool/components/log/views/index.js b/cool/components/log/views/index.js new file mode 100644 index 0000000..b84bd84 --- /dev/null +++ b/cool/components/log/views/index.js @@ -0,0 +1,8 @@ +export default [ + { + moduleName: "sys.log", + label: "请求日志", + path: "/sys/log", + component: () => import("./log") + } +]; diff --git a/cool/components/log/views/log.vue b/cool/components/log/views/log.vue new file mode 100644 index 0000000..3504640 --- /dev/null +++ b/cool/components/log/views/log.vue @@ -0,0 +1,151 @@ + + + diff --git a/cool/components/param/index.js b/cool/components/param/index.js new file mode 100644 index 0000000..743cb9d --- /dev/null +++ b/cool/components/param/index.js @@ -0,0 +1,4 @@ +import service from "./service"; +import views from './views' + +export default { service, views }; diff --git a/cool/components/param/service/index.js b/cool/components/param/service/index.js new file mode 100644 index 0000000..8c27eca --- /dev/null +++ b/cool/components/param/service/index.js @@ -0,0 +1,7 @@ +import SysParam from "./param"; + +export default { + system: { + param: new SysParam() + } +}; diff --git a/cool/components/param/service/param.js b/cool/components/param/service/param.js new file mode 100644 index 0000000..bc0be39 --- /dev/null +++ b/cool/components/param/service/param.js @@ -0,0 +1,6 @@ +import { BaseService, Service } from "cl-admin"; + +@Service("sys/param") +class SysParam extends BaseService {} + +export default SysParam; diff --git a/cool/components/param/views/index.js b/cool/components/param/views/index.js new file mode 100644 index 0000000..ecdaa4c --- /dev/null +++ b/cool/components/param/views/index.js @@ -0,0 +1,8 @@ +export default [ + { + moduleName: "sys.param", + label: "参数列表", + path: "/sys/param", + component: () => import("./param") + } +]; diff --git a/cool/components/param/views/param.vue b/cool/components/param/views/param.vue new file mode 100644 index 0000000..ba135f8 --- /dev/null +++ b/cool/components/param/views/param.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/cool/components/perf/index.js b/cool/components/perf/index.js new file mode 100644 index 0000000..743cb9d --- /dev/null +++ b/cool/components/perf/index.js @@ -0,0 +1,4 @@ +import service from "./service"; +import views from './views' + +export default { service, views }; diff --git a/cool/components/perf/service/index.js b/cool/components/perf/service/index.js new file mode 100644 index 0000000..d2fef22 --- /dev/null +++ b/cool/components/perf/service/index.js @@ -0,0 +1,7 @@ +import SysInfo from "./info"; + +export default { + system: { + info: new SysInfo() + } +}; diff --git a/cool/components/perf/service/info.js b/cool/components/perf/service/info.js new file mode 100644 index 0000000..06f5aa1 --- /dev/null +++ b/cool/components/perf/service/info.js @@ -0,0 +1,13 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("sys/info") +class SysInfo extends BaseService { + @Permission("record") + record() { + return this.request({ + url: "/record" + }); + } +} + +export default SysInfo; diff --git a/cool/components/perf/views/components/common.js b/cool/components/perf/views/components/common.js new file mode 100644 index 0000000..2f8b7ba --- /dev/null +++ b/cool/components/perf/views/components/common.js @@ -0,0 +1,28 @@ +import VueEcharts from "vue-echarts"; + +function unit_size(v) { + if (v === 0) return "0 B"; + let k = 1024; + let sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + let i = Math.floor(Math.log(v) / Math.log(k)); + + return (v / Math.pow(k, i)).toPrecision(3) + " " + sizes[i]; +} + +export default { + components: { + VueEcharts + }, + + filters: { + unit_size, + + fixed2(v) { + return v ? parseFloat(parseFloat(v).toFixed(2)) : 0; + } + }, + + methods: { + conByte: unit_size + } +}; diff --git a/cool/components/perf/views/components/ct.vue b/cool/components/perf/views/components/ct.vue new file mode 100644 index 0000000..1a69a0f --- /dev/null +++ b/cool/components/perf/views/components/ct.vue @@ -0,0 +1,253 @@ + + + + + + + diff --git a/cool/components/perf/views/components/mysql.vue b/cool/components/perf/views/components/mysql.vue new file mode 100644 index 0000000..a5ac86d --- /dev/null +++ b/cool/components/perf/views/components/mysql.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/cool/components/perf/views/components/network.vue b/cool/components/perf/views/components/network.vue new file mode 100644 index 0000000..6633ecc --- /dev/null +++ b/cool/components/perf/views/components/network.vue @@ -0,0 +1,345 @@ + + + + + diff --git a/cool/components/perf/views/components/redis.vue b/cool/components/perf/views/components/redis.vue new file mode 100644 index 0000000..64c5e33 --- /dev/null +++ b/cool/components/perf/views/components/redis.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/cool/components/perf/views/index.js b/cool/components/perf/views/index.js new file mode 100644 index 0000000..7bb72a8 --- /dev/null +++ b/cool/components/perf/views/index.js @@ -0,0 +1,8 @@ +export default [ + { + moduleName: "sys.perf", + label: "状态监控", + path: "/sys/perf", + component: () => import("./perf") + } +]; diff --git a/cool/components/perf/views/perf.vue b/cool/components/perf/views/perf.vue new file mode 100644 index 0000000..5efc1f1 --- /dev/null +++ b/cool/components/perf/views/perf.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/cool/components/task/index.js b/cool/components/task/index.js new file mode 100644 index 0000000..0683c4e --- /dev/null +++ b/cool/components/task/index.js @@ -0,0 +1,7 @@ +import service from "./service"; +import views from './views' + +export default { + service, + views +}; diff --git a/cool/components/task/package.json b/cool/components/task/package.json new file mode 100644 index 0000000..50af67e --- /dev/null +++ b/cool/components/task/package.json @@ -0,0 +1,9 @@ +{ + "name": "task", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "vuedraggable": "^2.24.3" + } +} diff --git a/cool/components/task/service/index.js b/cool/components/task/service/index.js new file mode 100644 index 0000000..e256a3d --- /dev/null +++ b/cool/components/task/service/index.js @@ -0,0 +1,7 @@ +import SysTask from "./task"; + +export default { + system: { + task: new SysTask() + } +}; diff --git a/cool/components/task/service/task.js b/cool/components/task/service/task.js new file mode 100644 index 0000000..2126402 --- /dev/null +++ b/cool/components/task/service/task.js @@ -0,0 +1,41 @@ +import { BaseService, Service, Permission } from "cl-admin"; + +@Service("sys/task") +class SysTask extends BaseService { + @Permission("stop") + stop(data) { + return this.request({ + url: "/stop", + method: "POST", + data + }); + } + + @Permission("start") + start(data) { + return this.request({ + url: "/start", + method: "POST", + data + }); + } + + @Permission("once") + once(data) { + return this.request({ + url: "/once", + method: "POST", + data + }); + } + + @Permission("log") + log(params) { + return this.request({ + url: "/log", + params + }); + } +} + +export default SysTask; diff --git a/cool/components/task/views/index.js b/cool/components/task/views/index.js new file mode 100644 index 0000000..c4f4ad4 --- /dev/null +++ b/cool/components/task/views/index.js @@ -0,0 +1,8 @@ +export default [ + { + moduleName: "sys.task", + label: "任务列表", + path: "/sys/task", + component: () => import("./task") + } +]; diff --git a/cool/components/task/views/task.vue b/cool/components/task/views/task.vue new file mode 100644 index 0000000..308e528 --- /dev/null +++ b/cool/components/task/views/task.vue @@ -0,0 +1,1133 @@ + + + + + diff --git a/cool/components/upload/components/index.js b/cool/components/upload/components/index.js new file mode 100644 index 0000000..a0568ea --- /dev/null +++ b/cool/components/upload/components/index.js @@ -0,0 +1,7 @@ +import Upload from "./index.vue"; +import UploadSpace from "./space"; + +export default { + Upload, + UploadSpace +}; diff --git a/cool/components/upload/components/index.vue b/cool/components/upload/components/index.vue new file mode 100644 index 0000000..d9a4166 --- /dev/null +++ b/cool/components/upload/components/index.vue @@ -0,0 +1,583 @@ + + + + + diff --git a/cool/components/upload/components/space.vue b/cool/components/upload/components/space.vue new file mode 100644 index 0000000..a87eacb --- /dev/null +++ b/cool/components/upload/components/space.vue @@ -0,0 +1,721 @@ + + + + + diff --git a/cool/components/upload/index.js b/cool/components/upload/index.js new file mode 100644 index 0000000..21a489c --- /dev/null +++ b/cool/components/upload/index.js @@ -0,0 +1,4 @@ +import service from "./service"; +import components from "./components"; + +export default { components, service }; diff --git a/cool/components/upload/service/index.js b/cool/components/upload/service/index.js new file mode 100644 index 0000000..010e0f9 --- /dev/null +++ b/cool/components/upload/service/index.js @@ -0,0 +1,9 @@ +import SpaceInfo from "./info"; +import SpaceType from "./type"; + +export default { + space: { + info: new SpaceInfo(), + type: new SpaceType() + } +}; diff --git a/cool/components/upload/service/info.js b/cool/components/upload/service/info.js new file mode 100644 index 0000000..a83958b --- /dev/null +++ b/cool/components/upload/service/info.js @@ -0,0 +1,6 @@ +import { BaseService, Service } from "cl-admin"; + +@Service("app/space/info") +class SpaceInfo extends BaseService {} + +export default SpaceInfo; diff --git a/cool/components/upload/service/type.js b/cool/components/upload/service/type.js new file mode 100644 index 0000000..5e17bc4 --- /dev/null +++ b/cool/components/upload/service/type.js @@ -0,0 +1,6 @@ +import { BaseService, Service } from "cl-admin"; + +@Service("app/space/type") +class SpaceType extends BaseService { } + +export default SpaceType; diff --git a/cool/core/common/index.js b/cool/core/common/index.js new file mode 100644 index 0000000..fc56843 --- /dev/null +++ b/cool/core/common/index.js @@ -0,0 +1,11 @@ +Promise.prototype.done = function (cb) { + let P = this.constructor; + + return this.then( + (value) => P.resolve(cb()).then(() => value), + (reason) => + P.resolve(cb()).then(() => { + throw reason; + }) + ); +}; diff --git a/cool/core/index.js b/cool/core/index.js new file mode 100644 index 0000000..9a476e7 --- /dev/null +++ b/cool/core/index.js @@ -0,0 +1,12 @@ +import { BaseService, Service, Permission } from "./service"; +import { SET_SERVICE, SET_ROUTER, SET_COMPONENT } from "./set"; +import "./common"; + +async function bootstrap(options = {}) { + const { components } = options; + + SET_ROUTER(); + SET_SERVICE(); + SET_COMPONENT({ events: components }); +} +export { Service, Permission, BaseService, bootstrap }; diff --git a/cool/core/service/base.js b/cool/core/service/base.js new file mode 100644 index 0000000..cb47aeb --- /dev/null +++ b/cool/core/service/base.js @@ -0,0 +1,118 @@ +import request from "@/service/request"; +import { baseUrl } from "@/config/env"; + +export default class BaseService { + constructor() { + const crud = { + page: "page", + list: "list", + info: "info", + add: "add", + delete: "delete", + update: "update" + }; + + if (!this.permission) { + this.permission = {}; + } + + for (let i in crud) { + if (this.namespace) { + this.permission[i] = this.namespace.replace(/\//g, ":") + ":" + crud[i]; + } else { + this.permission[i] = crud[i]; + } + } + } + + request(options = {}) { + if (!options.params) { + options.params = {}; + } + + let path = ""; + + if (process.env.NODE_ENV == "development") { + path = this.proxy || baseUrl; + } else { + if (this.proxy) { + path = this.url; + } else { + path = baseUrl; + } + } + + if (this.namespace) { + path += "/" + this.namespace; + } + + if (options.url.indexOf("http") !== 0) { + if (options.url[0] === "@") { + options.url = options.url.replace("@", ""); + } else { + options.url = path + options.url; + } + } + + return request(options); + } + + list(params) { + return this.request({ + url: "/list", + method: "POST", + data: { + ...params + } + }); + } + + page(params) { + return this.request({ + url: "/page", + method: "POST", + data: { + ...params + } + }); + } + + info(params) { + return this.request({ + url: "/info", + params: { + ...params + } + }); + } + + update(params) { + return this.request({ + url: "/update", + method: "POST", + data: { + ...params + } + }); + } + + delete(params) { + return this.request({ + url: "/delete", + method: "POST", + data: { + ...params + } + }); + } + + add(params) { + return this.request({ + url: "/add", + method: "POST", + data: { + ...params + } + }); + } +} diff --git a/cool/core/service/desorator.js b/cool/core/service/desorator.js new file mode 100644 index 0000000..4d60563 --- /dev/null +++ b/cool/core/service/desorator.js @@ -0,0 +1,40 @@ +import { isObject } from "../utils"; + +export function Permission(value) { + return function (target, key, descriptor) { + if (!target.permission) { + target.permission = {}; + } + + setTimeout(() => { + target.permission[key] = ( + (target.namespace ? target.namespace + "/" : "") + value + ).replace(/\//g, ":"); + }, 0); + + return descriptor; + }; +} + +export function Service(value) { + const { devServer } = require("@/../vue.config.js"); + + return function (target) { + // 命名 + if (typeof value == "string") { + target.prototype.namespace = value; + } + + // 复杂项 + if (isObject(value)) { + let { proxy, namespace, url } = value; + + target.prototype.namespace = namespace; + + if (proxy) { + target.prototype.proxy = proxy; + target.prototype.url = url || devServer.proxy[proxy].target; + } + } + }; +} diff --git a/cool/core/service/index.js b/cool/core/service/index.js new file mode 100644 index 0000000..f96b8cd --- /dev/null +++ b/cool/core/service/index.js @@ -0,0 +1,4 @@ +import BaseService from "./base"; +import { Service, Permission } from "./desorator"; + +export { BaseService, Service, Permission }; diff --git a/cool/core/set/component.js b/cool/core/set/component.js new file mode 100644 index 0000000..a9139be --- /dev/null +++ b/cool/core/set/component.js @@ -0,0 +1,150 @@ +import Vue from "vue"; +import Cool from "cool"; +import store from '@/store' +import router from '@/router' +import { deepMerge, isFunction, isObject } from "../utils"; + +export default function (options = {}) { + if (!options.events) { + options.events = {}; + } + + // 组件模块 + let componentModules = []; + + // 组件列表 + let components = []; + + // 安装组件 + function install(comp) { + let { store: _store, components, service, directives, filters, pages, views, name } = comp; + let { onInstall, onSuccess, onFail } = options.events[name] || {}; + + try { + const next = () => { + // 注册vuex模块 + if (_store) { + for (let i in _store) { + store.registerModule(`${name}-${i}`, _store[i]); + } + } + + // 注册组件 + if (components) { + for (let i in components) { + Vue.component(components[i].name, components[i]); + } + } + + // 注册请求服务 + if (service) { + deepMerge(store.$service, service); + } + + // 注册指令 + if (directives) { + for (let i in directives) { + Vue.directive(i, directives[i]); + } + } + + // 注册过滤器 + if (filters) { + for (let i in filters) { + Vue.filter(i, filters[i]); + } + } + + // 注册页面 + if (pages) { + pages.forEach((e) => { + router.addRoute(e); + }); + } + + // 注册视图 + if (views) { + views.forEach((e) => { + if (!e.meta) { + e.meta = {}; + } + + if (e.moduleName) { + componentModules.push(e); + } else { + e.meta.label = e.label; + + if (e.path) { + router.$plugin.addViews([e], { + ignore404: true + }); + } else { + console.error(`[${name}-views]:path in null`); + } + } + }); + } + + // 包安装成功 + if (onSuccess) onSuccess(comp); + }; + + // 安装前 + if (onInstall) { + onInstall(comp, { next }); + } else { + next(); + } + } catch (e) { + console.error(e); + + // 安装失败 + if (onFail) onFail(comp, e); + } + } + + // 解析组件 + Cool.components.map((e) => { + if (!e) { + return null; + } + + let comp = null; + + if (isObject(e)) { + comp = e; + } else { + comp = { + name: e[0], + value: e[1], + options: e[2] + }; + } + + if (comp.value) { + if (isFunction(comp.value.install)) { + comp.value = comp.value.install(Vue, comp.options); + } + } + + // 是否开启 + if (comp.options && comp.options.enable === false) { + return null; + } + + if (comp) { + comp = { + name: comp.name, + options: comp.options, + ...comp.value + }; + + components.push(comp); + install(comp); + } + }); + + // 设置缓存 + store.commit("SET_COMPONENT_MODULES", componentModules); + store.commit("SET_COMPONENT", components); +} diff --git a/cool/core/set/index.js b/cool/core/set/index.js new file mode 100644 index 0000000..6029c5d --- /dev/null +++ b/cool/core/set/index.js @@ -0,0 +1,5 @@ +import SET_SERVICE from "./service"; +import SET_ROUTER from "./router"; +import SET_COMPONENT from "./component"; + +export { SET_SERVICE, SET_ROUTER, SET_COMPONENT }; diff --git a/cool/core/set/router.js b/cool/core/set/router.js new file mode 100644 index 0000000..4d10f12 --- /dev/null +++ b/cool/core/set/router.js @@ -0,0 +1,116 @@ +import VueRouter from 'vue-router' +import { Message } from "element-ui"; +import store from "@/store"; +import router, { ignore } from '@/router' +import storage from '../utils/storage' + +// Remove Navigating to current location (XXX) is not allowed +const routerPush = VueRouter.prototype.push; +VueRouter.prototype.push = function push(location) { + return routerPush.call(this, location).catch((error) => error); +}; + +export default function () { + router.$plugin = { + addViews: (list, options) => { + if (!options) { + options = {}; + } + + // Parse route config + list.map((e) => { + if (!e.component) { + let url = e.viewPath; + + if (url) { + if ( + /^(http[s]?:\/\/)([0-9a-z.]+)(:[0-9]+)?([/0-9a-z.]+)?(\?[0-9a-z&=]+)?(#[0-9-a-z]+)?/i.test( + url + ) + ) { + e.meta.iframeUrl = url; + e.component = () => import(`cool/components/base/pages/iframe/index.vue`); + } else { + if (url.indexOf("views/") === 0) { + e.component = () => import(`@/${url}`); + } else { + console.error(url, "异常"); + } + } + } else { + e.redirect = "/404"; + } + } + }); + + // Batch add route + list.forEach((e) => { + router.addRoute("index", e); + }); + + // Add 404 rule + if (!options.ignore404) { + router.addRoute({ + path: "*", + redirect: "/404" + }); + } + }, + + to: (url) => { + if (router.path != url) { + router.push(url); + } + } + }; + + router.beforeEach((to, from, next) => { + const { token, browser } = store.getters + + if (token) { + if (to.path.indexOf('/login') === 0) { + // 登录成功且 token 未过期,回到首页 + if (!storage.isExpired('token')) { + return next('/') + } + } else { + // 添加路由进程 + store.commit("ADD_PROCESS", { + label: (to.meta && to.meta.label) || to.name, + value: to.fullPath + }); + } + } else { + if (!ignore.token.some((e) => to.path.indexOf(e) === 0)) { + return next("/login"); + } + } + + // H5 下关闭左侧菜单 + if (browser.isMobile) { + store.commit("COLLAPSE_MENU", true); + } + + next() + }) + + let lock = false; + + router.onError((err) => { + if (!lock) { + lock = true; + + if (err.code == "MODULE_NOT_FOUND") { + console.error(err.message.replace("Cannot find module ", ""), "路由组件不存在"); + + Message.error(`路由组件路径错误`); + } else { + console.error(err); + } + + setTimeout(() => { + lock = false; + }, 0); + } + }); +} diff --git a/cool/core/set/service.js b/cool/core/set/service.js new file mode 100644 index 0000000..c91bac0 --- /dev/null +++ b/cool/core/set/service.js @@ -0,0 +1,53 @@ +import Vue from "vue"; +import path from "path"; +import store from '@/store' + +export default function () { + const files = require.context("@/service/", true, /\.js$/); + const ignore = ["./request.js"]; + + let modules = {}; + + files + .keys() + .filter((e) => !ignore.includes(e)) + .map((e) => { + if (e.includes("--ignore")) { + return false; + } + + let list = e.substr(2).split("/"); + let parents = list.slice(0, list.length - 1); + let name = path.basename(e, ".js"); + + let curr = modules; + let prev = null; + let key = null; + + parents.forEach((k) => { + if (!curr[k]) { + curr[k] = {}; + } + + prev = curr; + curr = curr[k]; + key = k; + }); + + let ep = files(e); + + if (ep.default) { + let service = new ep.default(); + + if (name == "index") { + prev[key] = service; + } else { + curr[name] = service; + } + } else { + console.error(`Service must export default [${e}]`); + } + }); + + Vue.prototype.$service = store.$service = modules; +} diff --git a/cool/core/utils/index.js b/cool/core/utils/index.js new file mode 100644 index 0000000..8d5553b --- /dev/null +++ b/cool/core/utils/index.js @@ -0,0 +1,256 @@ +import { routerMode } from "@/config/env"; + +export function getUrlParam(name) { + let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + let r = window.location.search.substr(1).match(reg); + if (r != null) return decodeURIComponent(r[2]); + return null; +} + +export function isPc() { + const userAgentInfo = navigator.userAgent; + const Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; + let flag = true; + for (let v = 0; v < Agents.length; v++) { + if (userAgentInfo.indexOf(Agents[v]) > 0) { + flag = false; + break; + } + } + return flag; +} + +export const isIOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); + +export function getBrowser() { + let ua = navigator.userAgent.toLowerCase(); + let btypeInfo = (ua.match(/firefox|chrome|safari|opera/g) || "other")[0]; + if ((ua.match(/msie|trident/g) || [])[0]) { + btypeInfo = "msie"; + } + let pc = ""; + let prefix = ""; + let plat = ""; + + let isTocuh = + "ontouchstart" in window || ua.indexOf("touch") !== -1 || ua.indexOf("mobile") !== -1; + if (isTocuh) { + if (ua.indexOf("ipad") !== -1) { + pc = "pad"; + } else if (ua.indexOf("mobile") !== -1) { + pc = "mobile"; + } else if (ua.indexOf("android") !== -1) { + pc = "androidPad"; + } else { + pc = "pc"; + } + } else { + pc = "pc"; + } + switch (btypeInfo) { + case "chrome": + case "safari": + case "mobile": + prefix = "webkit"; + break; + case "msie": + prefix = "ms"; + break; + case "firefox": + prefix = "Moz"; + break; + case "opera": + prefix = "O"; + break; + default: + prefix = "webkit"; + break; + } + plat = ua.indexOf("android") > 0 ? "android" : navigator.platform.toLowerCase(); + return { + version: (ua.match(/[\s\S]+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1], + plat: plat, + type: btypeInfo, + pc: pc, + prefix: prefix, + isMobile: pc == "pc" ? false : true + }; +} + +export function href(path, newWindow) { + let { search, origin } = window.location; + + let url = ""; + + if (routerMode == "history") { + url = origin + path; + } else { + url = origin + search + "#" + path; + } + + if (newWindow) { + window.open(url); + } else { + window.location.href = url; + } +} + +export function orderBy(list, key) { + return list.sort((a, b) => a[key] - b[key]); +} + +export function deepTree(list) { + let newList = []; + let map = {}; + + list.forEach((e) => (map[e.id] = e)); + + list.forEach((e) => { + let parent = map[e.parentId]; + + if (parent) { + (parent.children || (parent.children = [])).push(e); + } else { + newList.push(e); + } + }); + + const fn = (list) => { + list.map((e) => { + if (e.children instanceof Array) { + e.children = orderBy(e.children, "orderNum"); + + fn(e.children); + } + }); + }; + + fn(newList); + + return orderBy(newList, "orderNum"); +} + +export function revDeepTree(list = []) { + let d = []; + let id = 0; + + const deep = (list, parentId) => { + list.forEach((e) => { + e.id = id++; + e.parentId = parentId; + + d.push(e); + + if (e.children && isArray(e.children)) { + deep(e.children, e.id); + } + }); + }; + + deep(list || [], null); + + return d; +} + +export function debounce(fn, delay) { + let timer = null; + + return function () { + let args = arguments; + let context = this; + + if (timer) { + clearTimeout(timer); + + timer = setTimeout(function () { + fn.apply(context, args); + }, delay); + } else { + timer = setTimeout(function () { + fn.apply(context, args); + }, delay); + } + }; +} + +export function isArray(value) { + if (typeof Array.isArray === "function") { + return Array.isArray(value); + } else { + return Object.prototype.toString.call(value) === "[object Array]"; + } +} + +export function isObject(value) { + return Object.prototype.toString.call(value) === "[object Object]"; +} + +export function isNumber(value) { + return !isNaN(Number(value)); +} + +export function isFunction(value) { + return typeof value == "function"; +} + +export function isString(value) { + return typeof value == "string"; +} + +export function isEmpty(value) { + if (isArray(value)) { + return value.length === 0; + } + + if (isObject(value)) { + return Object.keys(value).length === 0; + } + + return value === "" || value === undefined || value === null; +} + +export function last(data) { + if (isArray(data) || isString(data)) { + return data[data.length - 1]; + } +} + +export function cloneDeep(obj) { + let d = isArray(obj) ? obj : {}; + + if (isObject(obj)) { + for (let key in obj) { + if (obj.hasOwnProperty && obj.hasOwnProperty(key)) { + if (obj[key] && typeof obj[key] === "object") { + d[key] = cloneDeep(obj[key]); + } else { + d[key] = obj[key]; + } + } + } + } + + return d; +} + +export function clone(obj) { + return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj)); +} + +export function deepMerge(a, b) { + let k; + for (k in b) { + a[k] = + a[k] && a[k].toString() === "[object Object]" ? deepMerge(a[k], b[k]) : (a[k] = b[k]); + } + return a; +} + +export function contains(parent, node) { + if (document.documentElement.contains) { + return parent !== node && parent.contains(node); + } else { + while (node && (node = node.parentNode)) if (node === parent) return true; + return false; + } +} diff --git a/cool/core/utils/storage.js b/cool/core/utils/storage.js new file mode 100644 index 0000000..e350abb --- /dev/null +++ b/cool/core/utils/storage.js @@ -0,0 +1,81 @@ +import store from 'store' + +export default { + // 后缀标识 + suffix: "_deadtime", + + /** + * 获取 + * @param {string} key 关键字 + */ + get(key) { + return store.get(key) + }, + + /** + * 获取全部 + */ + info() { + let d = {} + + store.each(function (value, key) { + d[key] = value + }) + + return d + }, + + /** + * 设置 + * @param {string} key 关键字 + * @param {*} value 值 + * @param {number} expires 过期时间 + */ + set(key, value, expires) { + store.set(key, value); + + if (expires) { + store.set(`${key}${this.suffix}`, Date.parse(new Date()) + expires * 1000); + } + }, + + /** + * 是否过期 + * @param {string} key 关键字 + */ + isExpired(key) { + return (this.getExpiration(key) || 0) - Date.parse(new Date()) <= 2000; + }, + + /** + * 获取到期时间 + * @param {string} key 关键字 + */ + getExpiration(key) { + return this.get(key + this.suffix) + }, + + /** + * 移除 + * @param {string} key 关键字 + */ + remove(key) { + store.remove(key) + this.removeExpiration(key) + }, + + /** + * 移除到期时间 + * @param {string} key 关键字 + */ + removeExpiration(key) { + store.remove(key + this.suffix) + }, + + /** + * 清理 + */ + clearAll() { + store.clearAll() + } +}; diff --git a/cool/index.js b/cool/index.js new file mode 100644 index 0000000..e4ea4c8 --- /dev/null +++ b/cool/index.js @@ -0,0 +1,55 @@ +import Base from "./components/base"; +import Upload from "./components/upload"; +import Chat from "./components/chat"; +import Codemirror from "./components/codemirror"; +import Copy from "./components/copy"; +import Demo from "./components/demo"; +import Distpicker from "./components/distpicker"; +import EditorQuill from "./components/editor-quill"; +import Log from "./components/log"; +import Param from "./components/param"; +import Perf from "./components/perf"; +import Task from "./components/task"; +import Crud from "cl-admin-crud"; +import Export from "cl-admin-export"; + +export default { + components: [ + ["base", Base], + [ + "upload", + Upload, + { + icon: "el-icon-picture", + text: "选择图片", + limitSize: 1, + rename: true + } + ], + [ + "crud", + Crud, + { + crud: { + dict: { + sort: { + prop: "order", + order: "sort" + } + } + } + } + ], + ["export", Export], + // ["chat", Chat], + ["codemirror", Codemirror], + ["copy", Copy], + ["demo", Demo], + ["distpicker", Distpicker], + ["editor-quill", EditorQuill], + ["log", Log], + ["param", Param], + ["perf", Perf], + ["task", Task] + ] +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..e91c1e1 --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "cool-admin-vue", + "version": "3.0.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "report": "vue-cli-service build --report", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "axios": "^0.21.1", + "cl-admin": "^1.1.13", + "cl-admin-crud": "^1.2.7", + "cl-admin-export": "^1.0.5", + "core-js": "^3.9.0", + "dayjs": "^1.10.3", + "echarts": "^4.5.0", + "element-ui": "^2.13.0", + "nprogress": "^0.2.0", + "qs": "^6.9.1", + "store": "^2.0.12", + "vue": "^2.6.10", + "vue-echarts": "^5.0.0-beta.0", + "vue-router": "^3.5.1", + "vuex": "^3.6.2" + }, + "devDependencies": { + "@typescript-eslint/parser": "^3.0.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", + "@vue/babel-preset-jsx": "^1.1.2", + "@vue/cli-plugin-babel": "^4.1.0", + "@vue/cli-plugin-eslint": "^4.1.0", + "@vue/cli-plugin-router": "^4.1.0", + "@vue/cli-plugin-vuex": "^4.1.0", + "@vue/cli-service": "^4.1.0", + "@vue/eslint-config-prettier": "^6.0.0", + "babel-eslint": "^10.0.3", + "babel-plugin-component": "^1.1.1", + "babel-plugin-jsx-v-model": "^2.0.3", + "clean-webpack-plugin": "^3.0.0", + "eslint": "^7.0.0", + "eslint-plugin-prettier": "^3.1.1", + "eslint-plugin-vue": "^6.2.2", + "node-sass": "^4.13.0", + "prettier": "^2.0.5", + "sass-loader": "^8.0.0", + "svg-sprite-loader": "^5.0.0", + "typescript": "^3.9.3", + "vue-template-compiler": "^2.6.10", + "webpack-cli": "^3.3.12" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..3080304 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +}; diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0b823a3934267be14403e19338226b5c33cc5a56 GIT binary patch literal 67646 zcmeI5f2dVe7RT=^DGA945ebtq63?dOCypo8BkO+~Gi1|Y#L}G{t3F$ov2@#P9 zkwGLPBqBomLn1$~7o7yYoWUhgXqR`MtLzCdmLfTaU=G?B=wH z{yTQgA@UxgT^|w>3pe*AGzF~&$6DkTQY6<|V`NU9KsE;rsshg7{|54q<~afT z4*f}^8lOoAr}#ie2!zY5$glIpUTO-Tx;3pV;*4V z9wh19GfwV&j;-zb0Qd5K>o=qbUzZrS3n~1Wim@LS^j!q6k1@4cAK?Cw2mWtj<1fgH zJm&=ZpY-6{M^1~{sPy^(_p~tM`*p0>jV7nRmy?z zaTeKdpez+m|x97ve*9SP?9Dw)3X}Ry^e>FIYe)hCEt!jB9 z>jRu?f996`II=Y`^N)U~k*em;7w%x|16)6Xh(BN0huJxunfP7@aBNh@G7Mjt>r~eV zxIP+yZ`l$&@*jBQJLfXzWK!6?t`Bg$0+DMpn(T^m~+?91n>cacBkInL-W-?QCBGM2b0|wTyk%RCbl}-z9zicJSLUt zC*RX)bMR7<|EzkjEkk6li8jW%**}!Ut+d1IC1q|UcZI(P?qPgg8DrgYFY%1>UE8(* zyuLolJWT5Y#)pt!0${DnJoqAw&$taf&na^%IrFkV5IZN7vDPK`5=Z9RPoGBv@OdJh zYvaCxbsgf~=jl6VH}UaZ0A76Kw(ZI1_|)%LBp3A2-eV)VS~qUq?eWB2-@+RWTUy_~2Vjg|Ig8Lg~?D8CmCHJ;aw+4~>9m>2uB<`z;b0D!H5@S-{eAIsv z`}6$@?&p=UOZ?c4oObN*SB^o>0Z-?_NdHN%51(h@m6!tXwm%EUxb4Is_XPf^9Lq@8 zP=>_Pm(aN`L zmssR{oA&G{AMay7aQzn5dw8`zKm0Wd7yds$d~lLvLvpbu3y05k{GCybN%mJ{zNg9? z6E=OX52>HEB?d%dNy?p%`ZIZX7`H$1RQj9-ejn?@cUe5*C&WEnu|G@0pxH)jPa#RU^HqO9GX~c-@r=4Y$Y=i4 zHJA1S0r+{!jUl8?e6rukSFVTI`8)PiuW1b93!ho*L+WuSm=VD~EGA!dBV8*S7N4&= z;(J*+M&arOUwDhy!T+%JVRxD>!5n~>m(wtWXd^~BPPF$3s(q)Cmm^}8^+EQ-Ecu?w zwne-4cV)tPDh3;mW*Hm@5nt!DBs-65#^BR7Ts$6tkAprjk7J8iWsjito`z4x!5DHZ zTzsOOf8pB8-acQvfJdG~mvrpwMwWvLhG~!RjOCBpdH(;V){psd2k}!9!z@ z17eqF5GKu8AN8d>@7eh$_7Lmfr?$^Bm5IMm?|WSCiNEphgW;etpL^{56L+IN2ivjR zWq4@Bbq_mcDHC_?uY-O#D807gL#a_>%8ND*N06ms?`d{*FtyD#hMDH};}B@q~Ep$=0Iy zMjb~SL7#&&Dz38kgSSdP_sHdyID$L}%k^6a9qvvdzCITZv!l945bPoL_MNOlu7||{ zf9sX=FLT1%a}V7Z#C8Du>s`Nf(&6u%GKarl-}~NZv5AQ7VdouRb?54o>tV6L-!^3q zB^P5q_t?cQHUr?!e14#dtBN{2mj1ctHm~3f@f`e1w$D13;d57jV`+~s4#B!70N!1` z@Rr>UT*~#+o64MC^~D1?uPS2|E`s0V?u(xyc8IsMzk6iI1I``FxtI4Vui8GFP$uRT zh&($@;@6VgzkB9#54H=6_#|%OV1?_q2|95fRpwUs&Goy7Ht#Yv0KTKP&nA`OHpCvm z%xCf^aSp!I%K5MC-o7Nx^47y|X@2+E#tyF4i1yyT4{e`KEW>dre)rtv9$beJt@kCd z-OaAwChG8fQJHJ`ea_6^<%zkMzKD#8^Q7^5G4|K=S9pF_nQO`4zEOFWz5(z&J1U+g z^n>r~%ADW8e&#h6>4QjLjblExdA$ia%@ZSh?^WhpxPLASlk^FIV{aCYrnSSl>=FDy znftG@c*Xx$$`~ZZTJ7!2;&jw@csZoZy_^FQ_XtW`0RJQXHuR{R)u|ucuR?xP&cR1X zoZG7jTuU7yZSi|Fjn`AI-&P-F0RA^9=Rop$e9)_z zcgF+x-QfCd^`#7uhx5w0kbQg)#-62&Xz%SiANy-x(-|Na+YycPuWhrxM-X2j_V#U0 zkGgHO86YQ@mFK`eurK@iM5Jub4d3O7GsHdh*Wr4zN-3(y>{zL5DPntjddkBU=YpVhkDAyE82R1NRUG2(@*QzyNa~#Jzj& z99VJ>VFJ9iTA2azAL8C!JO4xPAyy8vHJ`!&b3psveLMe&&k#s~*fuFLK>oKPc8)a5 ziO&#G46!wx!2tRHI=~$GIs-=AJRt_i{muaS-#MZ1TDKVtkbCWC_l@)n!3>yfvmyh` zfmamI0k0@RZ%un(fZWR-!5fO$uey1}%P;t96IN;~b;DCkB;(!@O&UY3EtVExKo}R(G_fkNO2i)z7Pe*ztX(bt%&p1uH7qf01&M2|?C7J9luXcY8}l#FhW8EVnZCZypHh*hd@ zp<~$SGrasBIWh!@E{Vv$|A?g@+iwTP9i3y6`#stN%VuE7WhJa}kh6yVsB&KJn9<{`@ z#Y8UZ5kcr!mA}Z-d|!`{pwF1*9zk<`J&FWAxJRA?SggA(uE-O*|=R| z<*%;`A^gS7hLBW!PP&_eD;neK^U~g@#}G82FGzcz4nxp@4mlPbhM)l*0xUYrj7ilY z#G=C-QUkgnWRVVYNLlnmge=mtRG%B5!^{|qo~8Qy03C)Pi!MWmMbA>*o;`xg)gfrw I#+$7FA7}!`OaK4? literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..340e6c7 --- /dev/null +++ b/public/index.html @@ -0,0 +1,99 @@ + + + + + + + + + + COOL-ADMIN + <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %> + + <% } %> + + + + +
+
+
+

COOL-ADMIN

+

正在加载资源...

+

初次加载资源可能需要较多时间 请耐心等待

+
+ + +
+
+ + <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %> + + <% } %> + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..fca4b9f --- /dev/null +++ b/src/App.vue @@ -0,0 +1,7 @@ + + + diff --git a/src/assets/css/common.scss b/src/assets/css/common.scss new file mode 100644 index 0000000..b82fc7b --- /dev/null +++ b/src/assets/css/common.scss @@ -0,0 +1,14 @@ +$color-main: #2f3447; +$color-danger: #f56c6c; +$color-primary: #4165d7; +$color-success: #67c23a; +$color-info: #909399; +$color-warning: #e6a23c; + +@mixin text_ellipsis($line: 1) { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: $line; +} diff --git a/src/assets/css/element-variables.scss b/src/assets/css/element-variables.scss new file mode 100644 index 0000000..28b86c4 --- /dev/null +++ b/src/assets/css/element-variables.scss @@ -0,0 +1,9 @@ +$--color-primary: $color-primary; +$--color-success: $color-success; +$--color-danger: $color-danger; +$--color-warning: $color-warning; +$--color-info: $color-info; + +$--font-path: "~element-ui/lib/theme-chalk/fonts"; + +@import "~element-ui/packages/theme-chalk/src/index"; diff --git a/src/assets/css/index.scss b/src/assets/css/index.scss new file mode 100644 index 0000000..1619837 --- /dev/null +++ b/src/assets/css/index.scss @@ -0,0 +1,40 @@ +* { + padding: 0; + margin: 0; + font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", + "微软雅黑", Arial, sans-serif; +} + +*::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +*::-webkit-scrollbar-thumb { + background-color: rgba(144, 147, 153, 0.3); +} + +*::-webkit-scrollbar-track { + background: transparent; +} + +#app { + height: 100vh; + width: 100vw; + overflow: hidden; +} + +a { + text-decoration: none; +} + +input, +button { + outline: none; +} + +input { + &:-webkit-autofill { + box-shadow: 0 0 0px 1000px white inset; + } +} diff --git a/src/assets/icon/logo/silder-simple.png b/src/assets/icon/logo/silder-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..a75c6187a4c8ebd40815ca264db6518574605f21 GIT binary patch literal 1403 zcmV->1%&#EP)bj)RKO&~I*-$z3=m5uWmUjk#0#4K0Jg3WuML(1*!q{U zD_{p-+^FL;~80cYPKP5N~vF zp9hTkyPe-KNGj5{%Eq#!{wf>&?z)AoMdD5fQ33mm@*fg!aME0H*UR*qO@T~~7)MQ# zhB9mo<*+r9H}-_06<}SSeonlxsmD3@eVP92lQWACN?I|F*ybiSHyiD(xH$fk3fPP7 zyzdNfqKV82Y2=@?k8W@f;=EYxL18`xF~*#T1CJFF@W0t{Zi(J3R~g z$omk+khv|!QMoN?opJP&w$ABW*iv={SWjd=11=bK5-vD>3;9lrJhL`z91Tg@m}BJA zZDS6f!#=hXEEQl~aC`}zGU`-w%Gt4CUl@60Y^|h4{=e#cz^Ukg> zeZ+A$rC9>nfISAs0Pg`ejXKrz0*|Ktzv=8+*n{sBZ}kl*qqR#Km2^nbUy@E$eIN8j z?3;i^qrHkIb%GFS$=&IP}(9y@n&b2;!$qIbd_GP#h6b57L1OL zXV}RqaUU)_y|kU<#<&*h#nUVSAvYq8O5BHMtLz2YkTpxdexsAKlA@HpZ;AVGq$;+^ z`LnQJh6Ln2jL1{sJ}gV>tBP^lXrty(CZXQ%;DxGd z9|M;SHo9r_^g5N9F6E!AWpY}z)AS9ajU~nXYghr>fB{2hTg3)y-#oLfI0uOPw~Fcn zgnQr^jwRr2YWD(p_8j&5=gPwRSgK6^l=P9}nA()Rw#fZ>u3iF;1q!|hCndcksYm`x z=}(M4jwzLZZ<|&;2+yfWUvps@lbemK225vAbvjILwvkkWTEoE<{yyJ+^F}Tg2Dg*002ov JPDHLkV1f{#oVEY} literal 0 HcmV?d00001 diff --git a/src/assets/icon/logo/silder.png b/src/assets/icon/logo/silder.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf6856daa0636a61b17865301b0d1ab051ff264 GIT binary patch literal 3072 zcmV+b4FB_qP) zd$bi*8Nh${a-rmP0eM;mB7!L(mWpd-2~mMW`64TP1bHzcLO}9S>3DpkEFK|Zpv6P6 z(kxk}0b#mAphcyK+ASUy2F9y+8IW*=+aKSV&YnGc&+M6V4&KF`-&$wgvuF0~nKQG$ zy}#G&TTx$MPYQ+s<A93iM0UU}Ghh%N2FJ=XoW%l8pBP|M^#@JpLxj_H%$iDcj7* zXtbme#E$?2BKA*8cPSYejh8fnXqydvh5{c>(QZaYqa~>zeh|3Ip!5sZf&1W64ki-*J!25l#f4KG z>Qo~4cp}pA??LXVjZVt0x6Z|b5EOomm-)*ybYl40K4&dVv=U3b5XJ%VWVW=m2k>2_6S*=RxsMH< zcE~KE(*pQnnaM@-B^ru2uf>&&B51R8M;@k$slZ7}`5>Z#_6JTwk{4zn>XJ`4WW+Pk#c-}# zU}XLpdjVG>>a@xj&+{&{wAoO&8nJCmT%WSdDaiBlKjVQ%2-|Dl0?tj)?hNeO(rF|c zDAUpd_?}Be7eTbe1dky$6^LE+xTW3z#F;N2TJ}vR_>9WQc%n1WfOtXd0oa@g zPXn8k^7M#yN;NAE)5>E3n+Nfyh!FU+MP?+G&uHZb5F60M65uJN+#Jysbo4gAj#*nc zhB&|uD%%Dd>NOP3L)3hqC4|+*ua@w9yAhRLeZE6U=5x4%u-!KR@hu!LDu4wPyxvCQ ze$)i)MzSt=>yd|J;ws?Om~*+Hj<{Qa*JJ8WMI0t8fZq^yD)rRLrZ-Ad^xxOZP)FUi z8JPub>;qOSV>S6$Pv6M1ev?U3v)SE><5k53ca966}^P;FV+Mhzc4**x=UF_w>=*IQnUnBjG`%B@)s(C+1^|yPW}iLMg8% z*vUcSWj+pXwa%WOjtcL@d)BNZeiFrnP34It5j|9Wx zyp1mywp9UN(YD<~*w)hN27D69sV$Z>wX%x?%x5CfpH;hZGw}UlFDfCoBF;kJqaI50 zGYO(C=2wRVTV2?P*bydA=>WQY@#5Drz1CCSLJ+K6O2Xf&gF7@BF>+dX(^8zisaa)p@!lGu>--l>>iT6RkH!< zv#N%76ZR~ya`6t5S+yFArl4=^jXkLR1kuy^$%upJzI=HmcK2}FH~62`%0IwvD_%+P zx9mj{yH%buT$fE77)&sq@-X2vHB*~&FlTX8AoobMJC|F|{a#UwbM11X^Ks*7gJ@2w zR<(rW&aK-J;maYJSy7J0a`MjMhS>%RINg$+>yZN5PiN5@eKLi)!~NYE<>_* z-Z1QoViA%D>d!bAA#Y(!K|EmZBD2t!3BQ8%Xnw!S1|-;jalYINiIGl4Qm=L)D)1FZ z`k89;EyQfk{RmM-e069bGRsZ_UP1<^-bnh@0PWbhhW1R1@H{WhmV6z#H)-iiPy_fI z@ha&c;F|pRX8G@N0rVk=D(lk%S@Y;i1Y@!g(UBuKlJdB6a64iyg;D`kLF`O8Khx)V zyqkAnf-RnZ=Gcx~o4bsU? zj3S-tvH%fAR~6+o#LlqUUauf(?0+2F+lIVjxFe#@orHtAQ9MKG1L3xJAYG^+m^b<^ zqK(9{m7sdv2gy+_hI&Nfxw*)88VWCANO$uEu{n}SW5SPx>_A51^DXsM&ZUr6WK#>8 zBMH%In1+n@i?O@2HzLlO{)k!?#S%naco=(j%?@OiJe#0)V4@yTJqIGHuWitH8BwDz zjamM}X-N%@-6@XosV3-^UPOHQpU+H!p^)C%ewVO8Jz_S@M%2_>i4Mc4*H%X`kvEKxWNK#FN;hq|VXspH0F z$G8OTRn#?Wk_aNmv#Fr8Yt}&gJ!?WC52K+XT3PK<=eO#_ywZA{wZZ!85t)OzK3Tn;yt=w*>?OhMermmTu?PX+~5d06J{(4>rIv$k( O0000 \ No newline at end of file diff --git a/src/icons/svg/icon-app.svg b/src/icons/svg/icon-app.svg new file mode 100644 index 0000000..1d82a1c --- /dev/null +++ b/src/icons/svg/icon-app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-approve.svg b/src/icons/svg/icon-approve.svg new file mode 100644 index 0000000..e77593c --- /dev/null +++ b/src/icons/svg/icon-approve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-auth.svg b/src/icons/svg/icon-auth.svg new file mode 100644 index 0000000..b299f59 --- /dev/null +++ b/src/icons/svg/icon-auth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-ban.svg b/src/icons/svg/icon-ban.svg new file mode 100644 index 0000000..0376a77 --- /dev/null +++ b/src/icons/svg/icon-ban.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-camera.svg b/src/icons/svg/icon-camera.svg new file mode 100644 index 0000000..c277464 --- /dev/null +++ b/src/icons/svg/icon-camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-card.svg b/src/icons/svg/icon-card.svg new file mode 100644 index 0000000..f6ae0e8 --- /dev/null +++ b/src/icons/svg/icon-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-cart.svg b/src/icons/svg/icon-cart.svg new file mode 100644 index 0000000..f6833eb --- /dev/null +++ b/src/icons/svg/icon-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-command.svg b/src/icons/svg/icon-command.svg new file mode 100644 index 0000000..172c809 --- /dev/null +++ b/src/icons/svg/icon-command.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-common.svg b/src/icons/svg/icon-common.svg new file mode 100644 index 0000000..7fe6060 --- /dev/null +++ b/src/icons/svg/icon-common.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-count.svg b/src/icons/svg/icon-count.svg new file mode 100644 index 0000000..daf26ba --- /dev/null +++ b/src/icons/svg/icon-count.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-crown.svg b/src/icons/svg/icon-crown.svg new file mode 100644 index 0000000..71429de --- /dev/null +++ b/src/icons/svg/icon-crown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-dept.svg b/src/icons/svg/icon-dept.svg new file mode 100644 index 0000000..1182824 --- /dev/null +++ b/src/icons/svg/icon-dept.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-discover.svg b/src/icons/svg/icon-discover.svg new file mode 100644 index 0000000..3747d7e --- /dev/null +++ b/src/icons/svg/icon-discover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-emoji.svg b/src/icons/svg/icon-emoji.svg new file mode 100644 index 0000000..2809858 --- /dev/null +++ b/src/icons/svg/icon-emoji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-favor.svg b/src/icons/svg/icon-favor.svg new file mode 100644 index 0000000..98ad58e --- /dev/null +++ b/src/icons/svg/icon-favor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-goods.svg b/src/icons/svg/icon-goods.svg new file mode 100644 index 0000000..391d0ea --- /dev/null +++ b/src/icons/svg/icon-goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-home.svg b/src/icons/svg/icon-home.svg new file mode 100644 index 0000000..94cf445 --- /dev/null +++ b/src/icons/svg/icon-home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-hot.svg b/src/icons/svg/icon-hot.svg new file mode 100644 index 0000000..b907eeb --- /dev/null +++ b/src/icons/svg/icon-hot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-info.svg b/src/icons/svg/icon-info.svg new file mode 100644 index 0000000..797ed3a --- /dev/null +++ b/src/icons/svg/icon-info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-like.svg b/src/icons/svg/icon-like.svg new file mode 100644 index 0000000..c49af81 --- /dev/null +++ b/src/icons/svg/icon-like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-living.svg b/src/icons/svg/icon-living.svg new file mode 100644 index 0000000..47fd717 --- /dev/null +++ b/src/icons/svg/icon-living.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-log.svg b/src/icons/svg/icon-log.svg new file mode 100644 index 0000000..190b185 --- /dev/null +++ b/src/icons/svg/icon-log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-menu.svg b/src/icons/svg/icon-menu.svg new file mode 100644 index 0000000..7b16097 --- /dev/null +++ b/src/icons/svg/icon-menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-message.svg b/src/icons/svg/icon-message.svg new file mode 100644 index 0000000..0110fc8 --- /dev/null +++ b/src/icons/svg/icon-message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-monitor.svg b/src/icons/svg/icon-monitor.svg new file mode 100644 index 0000000..29f7eee --- /dev/null +++ b/src/icons/svg/icon-monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-new.svg b/src/icons/svg/icon-new.svg new file mode 100644 index 0000000..3ebc4bf --- /dev/null +++ b/src/icons/svg/icon-new.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-news.svg b/src/icons/svg/icon-news.svg new file mode 100644 index 0000000..5cec609 --- /dev/null +++ b/src/icons/svg/icon-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-pending.svg b/src/icons/svg/icon-pending.svg new file mode 100644 index 0000000..90be6b0 --- /dev/null +++ b/src/icons/svg/icon-pending.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-pic.svg b/src/icons/svg/icon-pic.svg new file mode 100644 index 0000000..0c68a0d --- /dev/null +++ b/src/icons/svg/icon-pic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-question.svg b/src/icons/svg/icon-question.svg new file mode 100644 index 0000000..8fbe696 --- /dev/null +++ b/src/icons/svg/icon-question.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-rank.svg b/src/icons/svg/icon-rank.svg new file mode 100644 index 0000000..60916c5 --- /dev/null +++ b/src/icons/svg/icon-rank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-scan.svg b/src/icons/svg/icon-scan.svg new file mode 100644 index 0000000..6e1e2c7 --- /dev/null +++ b/src/icons/svg/icon-scan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-search.svg b/src/icons/svg/icon-search.svg new file mode 100644 index 0000000..166aebf --- /dev/null +++ b/src/icons/svg/icon-search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-system.svg b/src/icons/svg/icon-system.svg new file mode 100644 index 0000000..a370d13 --- /dev/null +++ b/src/icons/svg/icon-system.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-tag (1).svg b/src/icons/svg/icon-tag (1).svg new file mode 100644 index 0000000..4079665 --- /dev/null +++ b/src/icons/svg/icon-tag (1).svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-tag.svg b/src/icons/svg/icon-tag.svg new file mode 100644 index 0000000..84adbce --- /dev/null +++ b/src/icons/svg/icon-tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-task.svg b/src/icons/svg/icon-task.svg new file mode 100644 index 0000000..1a3ff3b --- /dev/null +++ b/src/icons/svg/icon-task.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-time.svg b/src/icons/svg/icon-time.svg new file mode 100644 index 0000000..7ac6296 --- /dev/null +++ b/src/icons/svg/icon-time.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-user.svg b/src/icons/svg/icon-user.svg new file mode 100644 index 0000000..66d8df7 --- /dev/null +++ b/src/icons/svg/icon-user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-video.svg b/src/icons/svg/icon-video.svg new file mode 100644 index 0000000..1eee5b9 --- /dev/null +++ b/src/icons/svg/icon-video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-wallet.svg b/src/icons/svg/icon-wallet.svg new file mode 100644 index 0000000..d9a1412 --- /dev/null +++ b/src/icons/svg/icon-wallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-warn.svg b/src/icons/svg/icon-warn.svg new file mode 100644 index 0000000..3eab18d --- /dev/null +++ b/src/icons/svg/icon-warn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/icon-workbench.svg b/src/icons/svg/icon-workbench.svg new file mode 100644 index 0000000..e67c8ed --- /dev/null +++ b/src/icons/svg/icon-workbench.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/perf-cache.svg b/src/icons/svg/perf-cache.svg new file mode 100644 index 0000000..5212052 --- /dev/null +++ b/src/icons/svg/perf-cache.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/perf-connect.svg b/src/icons/svg/perf-connect.svg new file mode 100644 index 0000000..3e37961 --- /dev/null +++ b/src/icons/svg/perf-connect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/perf-cpu.svg b/src/icons/svg/perf-cpu.svg new file mode 100644 index 0000000..9a9cc0c --- /dev/null +++ b/src/icons/svg/perf-cpu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/perf-db.svg b/src/icons/svg/perf-db.svg new file mode 100644 index 0000000..2b8ca77 --- /dev/null +++ b/src/icons/svg/perf-db.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/perf-disk.svg b/src/icons/svg/perf-disk.svg new file mode 100644 index 0000000..8fcd4a6 --- /dev/null +++ b/src/icons/svg/perf-disk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/perf-lb.svg b/src/icons/svg/perf-lb.svg new file mode 100644 index 0000000..ff0c36b --- /dev/null +++ b/src/icons/svg/perf-lb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/perf-network.svg b/src/icons/svg/perf-network.svg new file mode 100644 index 0000000..38176a8 --- /dev/null +++ b/src/icons/svg/perf-network.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..6baca22 --- /dev/null +++ b/src/main.js @@ -0,0 +1,29 @@ +import Vue from "vue"; +import App from "./App.vue"; +import { bootstrap } from "cool/core"; +// import { bootstrap } from "cl-admin"; +import "./element"; + +// 路由 +import router from "@/router"; + +// 缓存 +import store from "@/store"; + +// 阻止显示生产模式的消息 +Vue.config.productionTip = false; + +// 配置 +bootstrap() + .then(() => { + store.dispatch("appLoad"); + + new Vue({ + router, + store, + render: (h) => h(App) + }).$mount("#app"); + }) + .catch((err) => { + console.error("COOL-ADMIN 启动失败", err); + }); diff --git a/src/pages/home/components/category-ratio.vue b/src/pages/home/components/category-ratio.vue new file mode 100644 index 0000000..c35af69 --- /dev/null +++ b/src/pages/home/components/category-ratio.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/pages/home/components/count-effect.vue b/src/pages/home/components/count-effect.vue new file mode 100644 index 0000000..65f6e27 --- /dev/null +++ b/src/pages/home/components/count-effect.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/pages/home/components/count-paid.vue b/src/pages/home/components/count-paid.vue new file mode 100644 index 0000000..bcd92fa --- /dev/null +++ b/src/pages/home/components/count-paid.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/pages/home/components/count-sales.vue b/src/pages/home/components/count-sales.vue new file mode 100644 index 0000000..c0649b8 --- /dev/null +++ b/src/pages/home/components/count-sales.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/pages/home/components/count-views.vue b/src/pages/home/components/count-views.vue new file mode 100644 index 0000000..58af33d --- /dev/null +++ b/src/pages/home/components/count-views.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/src/pages/home/components/hot-search.vue b/src/pages/home/components/hot-search.vue new file mode 100644 index 0000000..de7b54b --- /dev/null +++ b/src/pages/home/components/hot-search.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/src/pages/home/components/sales-rank.vue b/src/pages/home/components/sales-rank.vue new file mode 100644 index 0000000..11eab08 --- /dev/null +++ b/src/pages/home/components/sales-rank.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/src/pages/home/components/tab-chart.vue b/src/pages/home/components/tab-chart.vue new file mode 100644 index 0000000..5df0e56 --- /dev/null +++ b/src/pages/home/components/tab-chart.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/pages/home/index.vue b/src/pages/home/index.vue new file mode 100644 index 0000000..37ce7ad --- /dev/null +++ b/src/pages/home/index.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/pages/layout/index.vue b/src/pages/layout/index.vue new file mode 100644 index 0000000..de9d715 --- /dev/null +++ b/src/pages/layout/index.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/src/pages/layout/slider.vue b/src/pages/layout/slider.vue new file mode 100644 index 0000000..8f23396 --- /dev/null +++ b/src/pages/layout/slider.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/pages/layout/topbar.vue b/src/pages/layout/topbar.vue new file mode 100644 index 0000000..66a6f7b --- /dev/null +++ b/src/pages/layout/topbar.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..ade11be --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,42 @@ +import Vue from "vue"; +import VueRouter from "vue-router"; +import { routerMode } from "@/config/env"; + +Vue.use(VueRouter); + +// 忽略规则 +const ignore = { + token: ["/login", "/403", "/404", "/500", "/502"] +}; + +// 路由列表 +const routes = [ + { + path: "/", + name: "index", + component: () => import(`@/pages/layout/index.vue`), + children: [ + { + path: "/", + name: "数据统计", + component: () => import("@/pages/home/index.vue") + } + ] + } +]; + +const Router = new VueRouter({ + mode: routerMode || "history", + base: process.env.BASE_URL, + routes, + scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return savedPosition; + } else { + return { x: 0, y: 0 }; + } + } +}); + +export { ignore, routes }; +export default Router; diff --git a/src/service/request.js b/src/service/request.js new file mode 100644 index 0000000..eaf5dc6 --- /dev/null +++ b/src/service/request.js @@ -0,0 +1,149 @@ +import axios from "axios"; +import store from "@/store"; +import { isDev } from "@/config/env"; +import { href, storage } from "cl-admin/utils"; +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; + +axios.defaults.timeout = 30000; +axios.defaults.withCredentials = true; + +NProgress.configure({ + showSpinner: false +}); + +// 请求队列 +let requests = []; + +// Token 是否刷新中 +let isRefreshing = false; + +// 忽略规则 +const ignore = { + NProgress: ["/sys/info/record"], + token: ["/login", "/captcha"] +}; + +// Request +axios.interceptors.request.use( + (config) => { + const token = store.getters.token || ""; + + if (config.url) { + if (!ignore.token.some((e) => config.url.includes(e))) { + config.headers["Authorization"] = token; + } + + if (!ignore.NProgress.some((e) => config.url.includes(e))) { + NProgress.start(); + } + } + + // 请求信息 + if (isDev) { + console.group(config.url); + console.log("method:", config.method); + console.table("data:", config.method == "get" ? config.params : config.data); + console.groupEnd(); + } + + // 验证 token + if (token) { + if (config.url.includes("refreshToken")) { + return config; + } + + // 判断 token 是否过期 + if (storage.isExpired("token")) { + // 判断 refreshToken 是否过期 + if (storage.isExpired("refreshToken")) { + store.dispatch("userRemove"); + return href("/login"); + } + + // 是否在刷新中 + if (!isRefreshing) { + isRefreshing = true; + + store.dispatch("refreshToken").then((token) => { + requests.forEach((cb) => cb(token)); + requests = []; + isRefreshing = false; + }); + } + + return new Promise((resolve) => { + // 继续请求 + requests.push((token) => { + // 重新设置 token + config.headers["Authorization"] = token; + resolve(config); + }); + }); + } + } + + return config; + }, + (error) => { + return Promise.reject(error); + } +); + +// Response +axios.interceptors.response.use( + (res) => { + NProgress.done(); + const { code, data, message } = res.data; + + if (!res.data) { + return res; + } + + switch (code) { + case 1000: + return data; + default: + return Promise.reject(message); + } + }, + async (error) => { + NProgress.done(); + + if (error.response) { + const { status, config } = error.response; + + switch (status) { + case 401: + await store.dispatch("userRemove"); + href("/login"); + break; + + case 403: + console.error(`${config.url} 无权限访问!!`); + href("/403"); + break; + + case 404: + break; + + case 500: + if (!isDev) { + href("/500"); + } + break; + + case 502: + href("/502"); + break; + + default: + console.error(status, config.url); + } + } + + return Promise.reject(error.message); + } +); + +export default axios; diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..383da6e --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,8 @@ +import Vue from "vue"; +import Vuex from "vuex"; + +Vue.use(Vuex); + +export default new Vuex.Store({ + modules: {} +}); diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 0000000..c1beab9 --- /dev/null +++ b/vue.config.js @@ -0,0 +1,121 @@ +const path = require("path"); + +const isProduction = process.env.NODE_ENV === "production"; + +function resolve(dir) { + return path.join(__dirname, dir); +} + +module.exports = { + publicPath: "/", + lintOnSave: true, + productionSourceMap: false, + parallel: require("os").cpus().length > 1, + + css: { + extract: isProduction, + sourceMap: false, + loaderOptions: { + sass: { + prependData: `@import "@/assets/css/common.scss";` + } + } + }, + + devServer: { + port: 9000, + open: false, + compress: false, + overlay: { + warnings: false, + errors: true + }, + disableHostCheck: true, + proxy: { + "/dev": { + target: "https://admin.cn.utools.club", + changeOrigin: true, + pathRewrite: { + "^/dev": "" + } + }, + + "/oss-upload": { + target: "https://cool-admin-pro.oss-cn-shanghai.aliyuncs.com", + changeOrigin: true, + pathRewrite: { + "^/oss-upload": "" + } + }, + + "/pro": { + target: "https://show.cool-admin.com", + changeOrigin: true, + pathRewrite: { + "^/pro": "/api" + } + } + } + }, + + chainWebpack: (config) => { + // svg + config.module.rule("svg").uses.clear(); + + config.module + .rule("svg-sprite-loader") + .test(/.svg$/) + .exclude.add(/node_modules/) + .end() + .use("svg-sprite-loader") + .loader("svg-sprite-loader") + .options({ + symbolId: "[name]" + }); + + // 去掉元素之间空格 + config.module + .rule("vue") + .use("vue-loader") + .loader("vue-loader") + .tap((options) => { + options.compilerOptions.preserveWhitespace = true; + return options; + }) + .end(); + + // 移除 prefetch 插件 + config.plugins.delete("prefetch-index"); + + // 移除 preload 插件,避免加载多余的资源 + config.plugins.delete("preload-index"); + + // 设置别名 + config.resolve.alias.set("cool", resolve("cool")); + + // 生产模式下 + if (isProduction) { + config.performance.set("hints", false); + + config.optimization.splitChunks({ + chunks: "all", + cacheGroups: { + // 公用模块抽离 + common: { + chunks: "initial", + minSize: 0, + minChunks: 2 + }, + // 第三方库抽离 + vendor: { + priority: 1, + test: /node_modules/, + chunks: "initial", + minSize: 0, + minChunks: 2 + } + } + }); + } + } +};