Repository: RKQF-JVS/jvs-knowledge-ui Branch: main Commit: 8e8e742249ab Files: 139 Total size: 829.6 KB Directory structure: gitextract_eh24v6ax/ ├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── CHANGELOG.sh ├── LICENSE ├── README.en.md ├── README.md ├── babel.config.js ├── docker/ │ ├── Dockerfile │ ├── docker-compose.yml │ └── my.conf ├── expendPlugins/ │ └── chart/ │ └── chartmix.css ├── package.json ├── public/ │ ├── index.html │ └── jvs-ui-public/ │ ├── cdn/ │ │ ├── animate/ │ │ │ └── 3.5.2/ │ │ │ └── animate.css │ │ ├── iconfont/ │ │ │ └── 1.0.0/ │ │ │ └── index.css │ │ ├── jvs/ │ │ │ └── jvs.css │ │ └── store/ │ │ └── 1.3.20/ │ │ └── store.js │ ├── icon.js │ └── svg/ │ └── favicon.ico1 ├── src/ │ ├── App.vue │ ├── api/ │ │ ├── common.js │ │ ├── index.js │ │ ├── login.js │ │ └── newDesign.js │ ├── components/ │ │ ├── QRcode/ │ │ │ └── index.vue │ │ ├── api.js │ │ ├── basic-assembly/ │ │ │ ├── button.vue │ │ │ ├── form.vue │ │ │ ├── formcard.vue │ │ │ ├── formitem.vue │ │ │ ├── levelForm.vue │ │ │ ├── stepForm.vue │ │ │ ├── tab.vue │ │ │ ├── table.vue │ │ │ ├── userForm.vue │ │ │ └── userSelector.vue │ │ ├── basic-container/ │ │ │ ├── loading.vue │ │ │ ├── login/ │ │ │ │ └── loginForm.vue │ │ │ └── main.vue │ │ ├── doc-lib/ │ │ │ ├── api.js │ │ │ ├── excel/ │ │ │ │ └── index.vue │ │ │ ├── flow/ │ │ │ │ └── index.vue │ │ │ ├── html/ │ │ │ │ └── index.vue │ │ │ ├── index.vue │ │ │ ├── map/ │ │ │ │ └── index.vue │ │ │ └── show.vue │ │ ├── error-page/ │ │ │ └── 404.vue │ │ ├── iframe/ │ │ │ └── main.vue │ │ ├── index.js │ │ ├── page-footer/ │ │ │ └── FooterContent.vue │ │ └── page-header/ │ │ ├── PageHeader.vue │ │ └── titlePageHeader.vue │ ├── config/ │ │ └── env.js │ ├── const/ │ │ ├── chinaArea.js │ │ ├── columnTypeList.js │ │ ├── const.js │ │ ├── errorCode.js │ │ ├── iconList.js │ │ ├── iconfont.js │ │ ├── systemIcon.js │ │ └── website.js │ ├── error.js │ ├── filters/ │ │ └── index.js │ ├── main.js │ ├── permission.js │ ├── router/ │ │ ├── axios.js │ │ ├── jvs-router.js │ │ ├── page/ │ │ │ └── index.js │ │ ├── router.js │ │ └── views/ │ │ └── index.js │ ├── store/ │ │ ├── getters.js │ │ ├── index.js │ │ ├── modules/ │ │ │ ├── common.js │ │ │ ├── konwledge.js │ │ │ ├── tags.js │ │ │ └── user.js │ │ └── types/ │ │ └── global.js │ ├── styles/ │ │ ├── animate/ │ │ │ └── vue-transition.scss │ │ ├── common.scss │ │ ├── element-ui.scss │ │ ├── login.scss │ │ ├── media.scss │ │ ├── mixin.scss │ │ ├── normalize.scss │ │ ├── reset2.0.scss │ │ ├── resetAll.scss │ │ ├── sidebar.scss │ │ ├── tags.scss │ │ ├── themes/ │ │ │ ├── common/ │ │ │ │ ├── mixins.scss │ │ │ │ └── variables.scss │ │ │ └── index.scss │ │ ├── tiptap.scss │ │ ├── tiptapView.scss │ │ ├── top.scss │ │ └── variables.scss │ ├── util/ │ │ ├── date.js │ │ ├── eventBus.js │ │ ├── login.js │ │ ├── permision.js │ │ ├── store.js │ │ ├── url.js │ │ ├── util.js │ │ └── validate.js │ └── views/ │ ├── catalogview/ │ │ └── index.vue │ ├── common/ │ │ ├── Comment.vue │ │ ├── KnowSet.vue │ │ ├── LuckySheet.vue │ │ ├── MemberSet.vue │ │ ├── MindElixir.vue │ │ ├── Tiptap.vue │ │ ├── Topology.vue │ │ ├── api.js │ │ ├── draw.js │ │ ├── search.vue │ │ ├── show.vue │ │ ├── tiptap/ │ │ │ ├── extension.js │ │ │ └── tiptapPlugin.js │ │ ├── toolbar.vue │ │ └── topbar.vue │ ├── companyInfo/ │ │ └── index.vue │ ├── index/ │ │ ├── api.js │ │ ├── baseInfo.vue │ │ ├── index.vue │ │ └── page.vue │ ├── info/ │ │ ├── icon/ │ │ │ ├── demo.css │ │ │ ├── demo_index.html │ │ │ ├── iconfont.css │ │ │ ├── iconfont.js │ │ │ └── iconfont.json │ │ └── index.vue │ ├── main/ │ │ └── wx/ │ │ └── login.vue │ ├── my/ │ │ └── icon/ │ │ └── index.js │ └── view/ │ ├── api.js │ ├── diclibApi.js │ └── index.vue └── vue.config.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .browserslistrc ================================================ > 1% last 2 versions not ie <= 8 ================================================ FILE: .editorconfig ================================================ # http://editorconfig.org root = true [*] charset = utf-8 indent_style = space indent_size = 2 end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true [*.md] insert_final_newline = false trim_trailing_whitespace = false ================================================ FILE: .eslintrc.js ================================================ module.exports = { root: true, env: { node: true }, 'extends': [ "plugin:vue/essential" ], rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' }, parserOptions: { parser: 'babel-eslint' } } ================================================ FILE: .gitignore ================================================ .DS_Store node_modules /dist # local env files .env.local .env.*.local # Log files npm-debug.log* yarn-debug.log* yarn-error.log* # Editor directories and files .idea .vscode *.suo *.ntvs* *.njsproj *.sln *.sw? ================================================ FILE: .postcssrc.js ================================================ module.exports = { plugins: { autoprefixer: {} } } ================================================ FILE: CHANGELOG.sh ================================================ #!/bin/bash ## Author LinkinStar # solve the space by IFS IFS=`echo -en "\n\b"` echo -en $IFS if [ -f "CHANGELOG.md" ];then rm -f CHANGELOG.md touch CHANGELOG.md else touch CHANGELOG.md fi function printFeat(){ for i in ${feat[@]} do echo "- "$i >> CHANGELOG.md done echo >> CHANGELOG.md } function printFix(){ for i in ${fix[@]} do echo "- "$i >> CHANGELOG.md done echo >> CHANGELOG.md } function printOther(){ for i in ${other[@]} do echo "- "$i >> CHANGELOG.md done echo >> CHANGELOG.md } function checkLog(){ if [[ $1 == "feat"* ]] then feat[featIndex]=$1 let featIndex++ elif [[ $1 == "fix"* ]] then fix[fixIndex]=$1 let fixIndex++ else other[otherIndex]=$1 let otherIndex++ fi } function printLog(){ if [[ $featIndex -ne 0 ]]; then echo "### Features" >> CHANGELOG.md printFeat fi if [[ $fixIndex -ne 0 ]]; then echo "### Bug Fixes" >> CHANGELOG.md printFix fi if [[ $otherIndex -ne 0 ]]; then echo "### Other Changes" >> CHANGELOG.md printOther fi feat=() featIndex=0 fix=() fixIndex=0 other=() otherIndex=0 } curDate="" function checkDate() { if [[ $curDate = $1 ]]; then return fi curDate=$1 printLog echo >> CHANGELOG.md echo "## "$curDate >> CHANGELOG.md } commitMessageList=`git log --date=format:'%Y-%m-%d' --pretty=format:'%cd%n%s'` index=0 for i in ${commitMessageList[@]} do if [[ $index%2 -eq 0 ]] then checkDate $i else #echo "- "$i >> CHANGELOG.md checkLog $i fi let index++ done printLog ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: README.en.md ================================================ ![输入图片说明](img/1.png) ### Applicable scenarios: *Applicable to enterprises and teams, it provides online notes, knowledge precipitation, online product manuals, knowledge bases, online electronic tutorials and other functions. ###Problems solved: -* * problem of data capitalization * *: without appropriate document management tools, it is difficult to transform the intangible knowledge of employees into tangible assets of the enterprise, resulting in a waste of a lot of resources in training, learning and display, and the effect is not satisfactory. -* * unified control of files * *: data files are scattered in employees' computers, so it is difficult to form effective unified control. Unstructured content needs to be managed from the whole process of file generation, use and flow -* * problem of knowledge flow * *: the flow speed of information is an important guarantee for the efficient operation of enterprises. The deconstructed data is managed by the business system, but the unstructured information is a reliable flow channel, which basically depends on roaring, USB flash disk and inquiry -* * information retrieval problem * *: because the file is not deconstructed, it is not easy to retrieve and find, which is the lack of an effective enterprise level "Baidu" -* * information security problems * *: the enterprise cannot effectively manage files at different levels, and there is a risk of information disclosure on the SaaS platform on the Internet. Privatization + internal authority control is the basis **Worry free · enterprise document = enterprise knowledge base + online editing tool set + enterprise search engine + content display platform** ### Technology stack selection -Front end: Vue + element UI -Back end: Spring_ cloud_ alibaba、spring boot、Mybatis plus、Nacos、RabbitMq、Xxl-job -Data: MySQL, elasticsearch, redis, MariaDB (as appropriate) -Operation and maintenance: k8s + docker ### Project value *When using low-cost products with more than 30 users, the cost is lower than SaaS products, and the number of useless households is limited *Information security, privatization deployment (physical server or private cloud). The core of privatization is data control. There is no data control and it belongs to a third party *Technology is open, using general technology stack, supporting 100% code opening, supporting secondary development, and will not be kidnapped by any service provider *Corporate operation. The project is a company level commercial operation project and an important guarantee for continuous iteration and support services of the project *Technical support, the team supporting the project promotion belongs to senior personnel in the industry *Expansibility thinking: the project is a part of the enterprise's digital transformation. It has learned a lot from the experience of nailing, flying book and other large platforms, made a lot of tailoring and adjustment to the Internet and C-end related capabilities, and absorbed a lot of ideas and experience of to B product design. ### Core functions: *Integrate multiple file editors (rich text editor, online form, online brain map, online flow chart, etc., and the editor will continue to expand) *Preview and analysis of various files (preview of PDF, word, PPT, Excel and other files) *Collaborative editing of core documents (rich text and online forms) *Support teamwork () *Provide enterprise search engine (title based, content-based) *Support document content comments and document collection *Support document sharing (password secondary verification setting) *Support document templates *Enterprise level organizational structure and authority management (rigid organization + flexible group) #### Corpus (knowledge base) management *The whole station intelligent search engine supports document level and content level retrieval *Addition, deletion, modification and query of Anthology *Collaboration of team members of the collection (viewable and editable) *Directory structured management of Anthology *Basic introduction of the anthology *Participants and collaborators of knowledge base *Support multi role collaboration (member, manager, owner) #### Document management: *Support rich text (word like), brain map (XMIND like) and flow chart (VISO like) *Addition, deletion, modification and query of documents, online editing of documents *Document sharing settings #### Rich text editing: *Text outline, subtitle navigation *Support WYSIWYG *Support form *Support rich text expression plug-ins such as pictures, tables, third-party applications, audio, video, etc *Support code block, reference *Support source code viewing ## Project composition Enterprise documents are divided into business foreground and management background. The project is composed of business foreground and business background: -Business front end address: https://gitee.com/software-minister/jvs-knowledge-ui -Business front end address: https://gitee.com/software-minister/jvs-apply-document -Management background front end address: https://gitee.com/software-minister/jvs-ui -Back end address of management background: https://gitee.com/software-minister/jvs ## Demo address Demo address: http://knowledge.bctools.cn/ Trial account: you can log in by scanning the wechat code. If you need to try the account password, please contact us with QR code Partial screenshot: ![输入图片说明](img/2.png) ![输入图片说明](img/3.png) - ![输入图片说明](img/4.png) - ![输入图片说明](img/5.png) - ![输入图片说明](img/6.png) ![输入图片说明](img/7.png) ![输入图片说明](img/8.png) ### Rapid deployment document https://gitee.com/software-minister/jvs-docker-compose/blob/master/readme.md ### Use and authorization The worry free enterprise document community version is 100% open source. Under the condition of compliance filing, it supports self-use and commercial use, and commercial use provides 100% source code. ### Version Description: Use purpose | fee mode | use conditions | authorization time -|-|-|- Individual study | free | free filing | permanent Commercial, secondary development | charge, code delivery | technical service contract + Commercial filing | permanent ### Description of commercial expenses: >Technical service fee, required. Please contact the business department for the specific fee >Customized development fee, optional, 1500 yuan/person day >Deployment cost, optional, 500 yuan/time >Long term operation and maintenance, optional, negotiation Filing instructions: contact our business personnel for online filing. Filing content: project name, use mode (self use/commercial use), filing subject, filing contact personnel. ### Prohibited behaviors (to ensure the product goes further): *Code distribution in any form (including but not limited to code copy, code disclosure, code open source, code sharing, etc.) is prohibited without our approval *It is prohibited to use without filing (including self use and commercial use) ### Technical exchange and business support ![输入图片说明] (img/image20220522.png) ### Update history: V1.3 20211202 *Modify some UI display diagrams *Add online preview of multiple file formats *Add software introduction page *Add the view of personnel under the current tenant and within the organization *Add knowledge base background replacement *Fix some bugs ### Current version V1.5 *Support multi person online collaborative editing at the same time *Optimize drawing function *Document knowledge base sharing *Template management *Access WPS ================================================ FILE: README.md ================================================ ![输入图片说明](img/1.png) ### 适用场景: * 适用于企业、团队,提供在线笔记、知识沉淀、在线产品手册、知识库、在线电子教程等功能。 ### 解决的问题: - **数据资产化的问题** :没有合适的文件管理工具,很难对员工无形知识转化为企业的有形资产,导致培训、学习、展示上浪费了大量的资源,而且效果还不尽人意。 - **文件统一管控问题** :数据文件分散在员工各自的电脑中,很难形成有效的统一管控,需要从文件的生成、使用、流动整个过程对 非结构化内容进行管理 - **知识流动的问题** :信息的流动速度是企业高效运转的重要保障,解构化的数据由业务系统管理起来,但是非结构化的信息确实可靠的流动渠道,基本靠吼、靠U盘,靠问 - **信息的检索问题** :文件由于没有解构化,所以不便于检索查找,是缺乏一个有效的企业级“百度” - **信息安全的问题** :企业内部无法有效的分级管理文件,放在互联网上的SaaS平台又存在信息泄露风险,私有化+内部权限管控是基础 **无忧·企业文档=企业级知识库+在线编辑工具集+企业搜索引擎+内容展示平台** ![输入图片说明](img/%E5%9C%BA%E6%99%AF%E5%9B%BE%E7%89%87%E4%BB%8B%E7%BB%8D.png) ### 技术栈选择 - 前端:VUE+Element-ui - 后端:spring_cloud_alibaba、spring boot、Mybatis plus、Nacos、RabbitMq、Xxl-job - 数据:Mysql、ElasticSearch、Redis、MariaDB(根据情况) - 运维:K8S+docker ### 项目价值 * 使用低成本,超过30个用户产品的使用时,成本低于SaaS产品,且无用户数的限制 * 信息安全,私有化部署(实体服务器或者私有云),私有化的核心是数据可控,不存在数据控制归第三方 * 技术开放,采用通用技术栈,支持100%代码开放,支持二次开发,不会被任何服务商绑架 * 公司化运作,项目是公司级商业运营项目,是项目持续化迭代与支持服务的重要保障 * 技术支持,支持项目推进的团队属于行业行业资深人员 * 扩展性思考,项目属于企业数字化转型的其中一部分,吸取钉钉、飞书、等大平台的很多经验借鉴,且对互联网、C端相关的能力做了大量裁剪与调整,吸收了大量的to B的产品设计的思路与经验。 ### 核心功能: * 集成多种文件编辑器(富文本编辑器、在线表格、在线脑图、在线流程图等,编辑器将会持续扩展) * 多种文件的预览解析(PDF、Word、PPT、Excel等多种文件预览) * 核心文档的协同编辑(富文本与在线表格) * 支持团队化协同操作() * 提供企业级搜索引擎(基于标题、基于内容) * 支持文档内容评论与文档收藏 * 支持文档分享(密码二次校验设置) * 支持文档模板 * 企业级组织构架与权限管理(刚性组织+柔性群组) #### 文集(知识库)管理 * 全站智能搜索引擎,支持文档级、内容级检索 * 文集的增删改查 * 文集的团队成员协作(可查看、可编辑) * 文集的目录结构化管理 * 文集的基础介绍 * 知识库的参与协作人员 * 支持多种角色协同(成员、管理者、所有者) #### 文档管理: * 支持富文本(类word)、脑图(类Xmind)、流程图(类viso) * 文档的增删改查、文档在线编辑 * 文档的分享设置 #### 富文本编辑: * 文本大纲,小标题导航 * 支持所见即所得 * 支持表格 * 支持图片、表格、三方应用、音频、视频、等富文本表达插件 * 支持代码块、引用、 * 支持源代码查看 ## 项目组成 企业文档分为业务前台与管理后台,项目由 业务前台与业务后台组成: - 业务前台前端地址:https://github.com/RKQF-JVS/jvs-knowledge-ui - 业务前台后端地址:https://github.com/RKQF-JVS/jvs-apply-document - 管理后台前端地址:https://github.com/RKQF-JVS/jvs-ui/tree/2.1.0/ - 管理后台后端地址:https://github.com/RKQF-JVS/jvs/tree/2.1.0/ ## 部署视频 https://www.bilibili.com/video/BV1BN411q79Y ### **体验地址与账号说明** ![输入图片说明](img/image%E8%B4%A6%E5%8F%B7.png) 账号说明: - 普通用户端:体验者自有微信扫码登录 - 管理端(全网共享):testadmin 123456 - 管理端+应用编辑:联系运营微信号 ruanjbz,开设独立环境与独立账号 - 管理端+平台配置+应用编辑:联系运营微信号 ruanjbz,获取私有化部署文档与安装包 地址说明: ![输入图片说明](img/jvs%E4%BA%A7%E5%93%81%E4%BD%93%E7%B3%BB.png) - 管理平台(含管理平台、低代码):https://frame.bctools.cn/ - 数据智仓(数据分析平台):http://bi.bctools.cn/ - 企业文档:http://knowledge.bctools.cn/ - 企业计划(项目管理):http://teamwork.bctools.cn/ - 企业邮筒(Web邮箱客户端):http://mailbox.bctools.cn/ - 规则引擎:http://rules.bctools.cn/ - 逻辑引擎:http://logic.bctools.cn/ - 视频会议:http://meeting.bctools.cn/ - APS(智能排产):https://aps.bctools.cn/ 部分截图: ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/bcbbfb87-708c-43d6-91ff-51c4b28b94b5) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/64c35f5a-8883-4172-81af-b616d63358c1) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/f8db8da0-5b2a-44d5-a66b-2105932445f1) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/381bddbf-8a54-4ff0-9e55-73d83216c36a) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/9064a8c0-6654-4d18-92ce-3d0852cde622) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/b59eb016-e933-44a1-be57-1ef14875b2d9) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/b55a225a-4592-41b2-93f4-258487f47830) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/e2243775-9d0a-470e-b65a-bc13b7baf8f4) - ![image](https://github.com/RKQF-JVS/jvs-knowledge-ui/assets/94048608/08bca2d9-b472-41a2-bcc2-0ac1afd6fe3f) - ### 快速部署文档 https://github.com/RKQF-JVS/jvs-docker-compose/blob/master/readme.md ### 技术交流与商务支持 0b3c772279ce09b82231b8bae7812a24 如因人数限制无法加群时,可加运营同学拉入技术交流群 ![谭京](https://github.com/user-attachments/assets/53838ea6-d0c7-4bb1-abf2-cdfb99cb9743) ### 历史更新记录: V1.3 20211202 * 修改部分UI展示图 * 添加多种文件格式在线预览 * 添加软件介绍页 * 添加当前租户下与组织内人员查看 * 添加知识库背景替换 * 修复部分BUG ### 当前版本 V1.5 * 支持多人在线同时协同编辑 * 优化画图功能 * 文档知识库分享 * 模板管理 * 接入WPS ================================================ FILE: babel.config.js ================================================ module.exports = { presets: [ ['@vue/app', { useBuiltIns: "entry" }] ] } ================================================ FILE: docker/Dockerfile ================================================ FROM nginx:1.15.4 VOLUME /tmp ENV LANG en_US.UTF-8 COPY dist /usr/share/nginx/html/ ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone #这个地方一定要把之前的默认给替换掉,不然使用这个默认nginx的镜像会无法替换配置 COPY my.conf /etc/nginx/conf.d/default.conf EXPOSE 80 EXPOSE 443 ================================================ FILE: docker/docker-compose.yml ================================================ version: '3' services: jvs-knowledge-ui: build: context: . restart: always container_name: jvs-knowledge-ui image: jvs-knowledge-ui networks: - jvs_jvs external_links: - gateway ports: - 80:80 networks: jvs_jvs: external: true ================================================ FILE: docker/my.conf ================================================ server { listen 80; server_name localhost; add_header X-Content-Type-Options nosniff; charset utf-8; client_header_buffer_size 1024k; large_client_header_buffers 4 1024k; client_max_body_size 50m; #前端 root /usr/share/nginx/html/; # 跳转至登录页 location = / { index index.html; try_files /usr/share/nginx/html /jvs-knowledge-ui/index.html; } location ^~ /jvs-knowledge-ui/ { index index.html ; try_files $uri $uri/ /jvs-knowledge-ui/index.html; } #静态资源 location ^~ /static/ { root /usr/share/nginx/html/; } location ^~ /jvs-ui-public/ { root /usr/share/nginx/html/; } #其它路径全部代理到网关接口中 location /api/ { proxy_cookie_path /jvs-knowledge-ui /jvs-knowledge-ui; proxy_cookie_path / /; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://gateway:10000/api/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } #其它路径全部代理到网关接口中 location / { proxy_cookie_path /jvs-knowledge-ui /jvs-knowledge-ui; proxy_cookie_path / /; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-real-ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto http; proxy_pass http://gateway:10000/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } } ================================================ FILE: expendPlugins/chart/chartmix.css ================================================ .luckysheet-datavisual-quick-menu{width:120px;overflow:auto;margin-top:15px}.luckysheet-datavisual-quick-menu::-webkit-scrollbar{display:none}.luckysheet-datavisual-quick-menu>div{text-align:left;padding:4px 4px;border-right:3px solid #fff;color:#777;cursor:pointer;line-height:1.4em;word-wrap:break-word}.luckysheet-datavisual-quick-menu>div:hover{color:#000}.luckysheet-datavisual-quick-menu>div i{width:15px}.luckysheet-datavisual-quick-menu>div:hover i{color:#ff7e7e}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active{border-right:3px solid #ff7e7e;color:#000;font-weight:700}.luckysheet-datavisual-quick-menu>div.luckysheet-datavisual-quick-menu-active:hover i{color:#000}.luckysheet-datavisual-quick-range{padding:5px 0}.luckysheet-datavisual-range-container{background:#fff;border:1px solid #d9d9d9;border-top:1px solid silver;min-width:20px;width:100%;max-width:200px;display:inline-block}.luckysheet-datavisual-range-container-focus{border:1px solid #4d90fe;box-shadow:inset 0 1px 2px rgba(0,0,0,.3);outline:none}.luckysheet-datavisual-range-input,.luckysheet-datavisual-range-input:focus{background:transparent!important;border:none!important;box-sizing:border-box;box-shadow:none;height:25px;margin:0;outline:none!important;padding:1px 8px!important;width:100%}.luckysheet-datavisual-range-button-container{overflow:hidden;padding:0 0 0 8px;text-align:right;width:21px}.luckysheet-datavisual-range-button-container div{padding:2px 10px 0 10px;font-size:18px;cursor:pointer;color:#6598f3}.luckysheet-datavisual-range-button-container div:hover{color:#ff7e7e}.luckysheet-datavisual-quick-m{margin-top:5px;min-height:500px;top:50px;font-size:12px}.luckysheet-datavisual-quick-list{left:110px;right:0;bottom:0;top:80px;position:absolute;overflow:auto;border-top:1px solid #e5e5e5;padding:5px 3px 35px 3px}.luckysheet-datavisual-quick-list-title{padding:4px 6px;background:#e5e5e5;margin-top:10px}.luckysheet-datavisual-quick-list-ul{overflow:hidden}.luckysheet-datavisual-quick-list-item{display:inline-block;margin:5px 8px;border:1px solid #dadada;width:100px;height:80px}.luckysheet-datavisual-quick-list-item:hover{border:1px solid #ff7e7e;box-shadow:0 0 20px #ff7e7e}.luckysheet-datavisual-quick-list-item img{display:inline-block;width:100px;height:80px}.luckysheet-datavisual-quick-list-item-active{border:1px solid #6598f3;box-shadow:0 0 20px #6598f3}.chart-base-slider .el-slider__runway.show-input{margin-right:72px}.chart-base-slider .el-slider__input.el-input-number--mini{width:56px}.chart-base-slider .input_content{margin:6px 0 0 5px}.title{font-weight:700}.el-row{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chartSetting{width:100%;height:100%} ================================================ FILE: package.json ================================================ { "name": "jvs-knowledge-ui", "version": "2020.09.24", "private": true, "scripts": { "pre": "cnpm install || yarn --registry https://registry.npm.taobao.org || npm install --registry https://registry.npm.taobao.org ", "dev": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint", "connect": "node server/index.js" }, "dependencies": { "axios": "^0.19.0", "babel-polyfill": "^6.26.0", "classlist-polyfill": "^1.2.0", "crypto-js": "^3.1.9-1", "element-tiptap": "^1.26.2", "element-ui": "^2.13.0", "js-cookie": "^2.2.1", "js-base64": "^3.6.1", "luckyexcel": "^1.0.0", "mind-elixir": "^0.14.0", "nprogress": "^0.2.0", "qrcodejs2": "^0.0.2", "script-loader": "^0.7.2", "topology-vue": "^0.5.22", "uuid": "^8.3.2", "vue": "^2.6.10", "vue-axios": "^2.1.4", "vue-clipboard2": "^0.3.1", "vue-router": "^3.1.3", "vuex": "^3.1.1", "wangeditor": "^4.5.2" }, "devDependencies": { "@vue/cli-plugin-babel": "^3.11.0", "@vue/cli-plugin-eslint": "^3.8.0", "@vue/cli-service": "^3.11.0", "chai": "^4.2.0", "node-sass": "^4.13.1", "sass-loader": "^8.0.0", "sass-resources-loader": "^2.0.3", "socket.io": "^2.3.0", "socket.io-client": "^2.3.0", "vue-json-viewer": "^2.2.12", "vue-socket.io": "^2.1.1-a", "vue-template-compiler": "^2.6.10" }, "lint-staged": { "*.js": [ "vue-cli-service lint", "git add" ], "*.vue": [ "vue-cli-service lint", "git add" ] } } ================================================ FILE: public/index.html ================================================ 无忧 - 企业文档
正在加载资源
初次加载资源可能需要较多时间 请耐心等待
================================================ FILE: public/jvs-ui-public/cdn/animate/3.5.2/animate.css ================================================ @charset "UTF-8"; /*! * animate.css -http://daneden.me/animate * Version - 3.5.1 * Licensed under the MIT license - http://opensource.org/licenses/MIT * * Copyright (c) 2016 Daniel Eden */ .animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounce{0%,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);transform:translateZ(0)}40%,43%{-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}40%,43%,70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}70%{-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);transform:translateZ(0)}40%,43%{-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}40%,43%,70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}70%{-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}.headShake{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-name:headShake;animation-name:headShake}@-webkit-keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{0%,11.1%,to{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes jello{0%,11.1%,to{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotateY(-1turn);transform:perspective(400px) rotateY(-1turn)}0%,40%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-190deg);transform:perspective(400px) translateZ(150px) rotateY(-190deg)}50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-170deg);transform:perspective(400px) translateZ(150px) rotateY(-170deg)}50%,80%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95)}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotateY(-1turn);transform:perspective(400px) rotateY(-1turn)}0%,40%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-190deg);transform:perspective(400px) translateZ(150px) rotateY(-190deg)}50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-170deg);transform:perspective(400px) translateZ(150px) rotateY(-170deg)}50%,80%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95)}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg)}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg)}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg)}60%,80%{opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg)}60%,80%{opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{transform-origin:center;-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{transform-origin:center;-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{transform-origin:right bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{transform-origin:right bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{transform-origin:right bottom;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{transform-origin:right bottom;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{transform-origin:center;opacity:1}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}@keyframes rotateOut{0%{transform-origin:center;opacity:1}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{transform-origin:top left}0%,20%,60%{-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg);transform-origin:top left}40%,80%{-webkit-transform:rotate(60deg);transform:rotate(60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{transform-origin:top left}0%,20%,60%{-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg);transform-origin:top left}40%,80%{-webkit-transform:rotate(60deg);transform:rotate(60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate(120deg);transform:translate3d(100%,0,0) rotate(120deg)}}@keyframes rollOut{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate(120deg);transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%,to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%,to{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp} ================================================ FILE: public/jvs-ui-public/cdn/iconfont/1.0.0/index.css ================================================ [class^="icon-"]{ font-family: "iconfont" !important; /* 以下内容参照第三方图标库本身的规则 */ font-size: 18px !important; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .jvs-icon-select__item i { font-family: "iconfont" !important; /* 以下内容参照第三方图标库本身的规则 */ font-size: 24px !important; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .el-menu-item [class^=icon-] { margin-right: 5px; width: 24px; text-align: center; font-size: 18px; vertical-align: middle; } .el-submenu [class^=icon-] { vertical-align: middle; margin-right: 5px; width: 24px; text-align: center; font-size: 18px; } ================================================ FILE: public/jvs-ui-public/cdn/jvs/jvs.css ================================================ html, body, #app { height: 100%; margin: 0; padding: 0; } .jvs-home { /* background-color: #303133; */ background-color: #fff; height: 100%; display: flex; flex-direction: column; } .jvs-home__main { user-select: none; width: 100%; flex-grow: 1; display: flex; justify-content: center; align-items: center; flex-direction: column; position: relative; } .jvs-home__footer { width: 100%; flex-grow: 0; text-align: center; padding: 1em 0; } .jvs-home__footer > a { font-size: 12px; color: #ABABAB; text-decoration: none; } .jvs-home__loading { height: 32px; width: 32px; margin-bottom: 20px; } .jvs-home__title { /* color: #FFF; */ font-size: 14px; margin-bottom: 10px; color: #303133; display: none; } .jvs-home__sub-title { /* color: #ABABAB; */ font-size: 12px; color: #303133; display: none; } .jvs-home__loading { height: 32px; width: 32px; margin-bottom: 20px; color: #303133; animation: loadingAll 1.5s linear infinite; } @keyframes loadingAll{ 0%{-webkit-transform:rotate(0deg);} 25%{-webkit-transform:rotate(90deg);} 50%{-webkit-transform:rotate(180deg);} 75%{-webkit-transform:rotate(270deg);} 100%{-webkit-transform:rotate(360deg);} } .jvs-home__loading_gif{ display:block; width: 450px; height: 360px; /* position: absolute; */ /* top: 50px; */ } ================================================ FILE: public/jvs-ui-public/cdn/store/1.3.20/store.js ================================================ 'use strict' // Module export pattern from // https://github.com/umdjs/umd/blob/master/returnExports.js ;(function (root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define([], factory) } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory() } else { // Browser globals (root is window) root.store = factory() } }(this, function () { // Store.js var store = {} var win = (typeof window !== 'undefined' ? window : global) var doc = win.document var localStorageName = 'localStorage' var scriptTag = 'script' var storage store.disabled = false store.version = '1.3.20' store.set = function (key, value) {} store.get = function (key, defaultVal) {} store.has = function (key) { return store.get(key) !== undefined } store.remove = function (key) {} store.clear = function () {} store.transact = function (key, defaultVal, transactionFn) { if (transactionFn == null) { transactionFn = defaultVal defaultVal = null } if (defaultVal == null) { defaultVal = {} } var val = store.get(key, defaultVal) transactionFn(val) store.set(key, val) } store.getAll = function () {} store.forEach = function () {} store.serialize = function (value) { return JSON.stringify(value) } store.deserialize = function (value) { if (typeof value !== 'string') { return undefined } try { return JSON.parse(value) } catch (e) { return value || undefined } } // Functions to encapsulate questionable FireFox 3.6.13 behavior // when about.config::dom.storage.enabled === false // See https://github.com/marcuswestin/store.js/issues#issue/13 function isLocalStorageNameSupported () { try { return (localStorageName in win && win[localStorageName]) } catch (err) { return false } } if (isLocalStorageNameSupported()) { storage = win[localStorageName] store.set = function (key, val) { if (val === undefined) { return store.remove(key) } storage.setItem(key, store.serialize(val)) return val } store.get = function (key, defaultVal) { var val = store.deserialize(storage.getItem(key)) return (val === undefined ? defaultVal : val) } store.remove = function (key) { storage.removeItem(key) } store.clear = function () { storage.clear() } store.getAll = function () { var ret = {} store.forEach(function (key, val) { ret[key] = val }) return ret } store.forEach = function (callback) { for (var i = 0; i < storage.length; i++) { var key = storage.key(i) callback(key, store.get(key)) } } } else if (doc && doc.documentElement.addBehavior) { var storageOwner, storageContainer // Since #userData storage applies only to specific paths, we need to // somehow link our data to a specific path. We choose /favicon.ico1 // as a pretty safe option, since all browsers already make a request to // this URL anyway and being a 404 will not hurt us here. We wrap an // iframe pointing to the favicon in an ActiveXObject(htmlfile) object // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx) // since the iframe access rules appear to allow direct access and // manipulation of the document element, even for a 404 page. This // document can be used instead of the current document (which would // have been limited to the current path) to perform #userData storage. try { storageContainer = new ActiveXObject('htmlfile') storageContainer.open() // storageContainer.write('<' + scriptTag + '>document.w=window') storageContainer.write('<' + scriptTag + '>document.w=window') storageContainer.close() storageOwner = storageContainer.w.frames[0].document storage = storageOwner.createElement('div') } catch (e) { // somehow ActiveXObject instantiation failed (perhaps some special // security settings or otherwse), fall back to per-path storage storage = doc.createElement('div') storageOwner = doc.body } var withIEStorage = function (storeFunction) { return function () { var args = Array.prototype.slice.call(arguments, 0) args.unshift(storage) // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx storageOwner.appendChild(storage) storage.addBehavior('#default#userData') storage.load(localStorageName) var result = storeFunction.apply(store, args) storageOwner.removeChild(storage) return result } } // In IE7, keys cannot start with a digit or contain certain chars. // See https://github.com/marcuswestin/store.js/issues/40 // See https://github.com/marcuswestin/store.js/issues/83 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", 'g') var ieKeyFix = function (key) { return key.replace(/^d/, '___$&').replace(forbiddenCharsRegex, '___') } store.set = withIEStorage(function (storage, key, val) { key = ieKeyFix(key) if (val === undefined) { return store.remove(key) } storage.setAttribute(key, store.serialize(val)) storage.save(localStorageName) return val }) store.get = withIEStorage(function (storage, key, defaultVal) { key = ieKeyFix(key) var val = store.deserialize(storage.getAttribute(key)) return (val === undefined ? defaultVal : val) }) store.remove = withIEStorage(function (storage, key) { key = ieKeyFix(key) storage.removeAttribute(key) storage.save(localStorageName) }) store.clear = withIEStorage(function (storage) { var attributes = storage.XMLDocument.documentElement.attributes storage.load(localStorageName) for (var i = attributes.length - 1; i >= 0; i--) { storage.removeAttribute(attributes[i].name) } storage.save(localStorageName) }) store.getAll = function (storage) { var ret = {} store.forEach(function (key, val) { ret[key] = val }) return ret } store.forEach = withIEStorage(function (storage, callback) { var attributes = storage.XMLDocument.documentElement.attributes for (var i = 0, attr; attr = attributes[i]; ++i) { callback(attr.name, store.deserialize(storage.getAttribute(attr.name))) } }) } try { var testKey = '__storejs__' store.set(testKey, testKey) if (store.get(testKey) != testKey) { store.disabled = true } store.remove(testKey) } catch (e) { store.disabled = true } store.enabled = !store.disabled return store })) ================================================ FILE: public/jvs-ui-public/icon.js ================================================ $(document).ready(function(){ htmlobj=$.ajax({url:"/admin/mainPage/getMainIcon",async:false, success:function(data){ // console.log(data); var link = document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'shortcut icon'; link.src = 'data:image/jpg;base64,'+data.data; document.getElementsByTagName('head')[0].appendChild(link); console.log($("[rel='shortcut icon']").attr("src")); } }); }); ================================================ FILE: src/App.vue ================================================ ================================================ FILE: src/api/common.js ================================================ import request from '@/router/axios' // 公共的字典转换接口 export function byKeyDicData (url) { return request({ url: url, method: 'get' }) } // 部门人员树 export function getDeptUserTree(){ return request({ url: `/mgr/jvs-auth//dept/user/tree`, method:'get' }) } // 搜索用户 export function searchUser(params){ return request({ url: `/mgr/jvs-auth//user/user/search`, method:'get', params: params }) } ================================================ FILE: src/api/index.js ================================================ import request from "@/router/axios" // 获取下拉列表 export const getSelectData = (str) => { return request({ url: str, method: 'get', }) } ================================================ FILE: src/api/login.js ================================================ import request from "@/router/axios"; import {scope, client_id, client_secret, grant_type} from '@/const/const' export const loginByUsername = (username, password, code, randomStr) => { return request({ url: `/auth/oauth/token`, headers: { isToken: false, }, method: "post", params: { username, password, grant_type, scope, client_id, client_secret } }); }; export const refreshToken = (refresh_token, tenantId) => { const grant_type = "refresh_token"; return request({ url: "/auth/oauth/token", headers: { isToken: false, }, method: "post", params: { grant_type, scope, client_id, client_secret, refresh_token: refresh_token, switch: tenantId } }); }; export function getQRcode(params) { return request({ url: "/mgr/upms/oauth", method: "get", params: params }); } export function getCheck(data) { return request({ url: "/weixin/check", method: "get", params: data, // 设置超时时间,直接进行下一次请求 timeout: 30 * 1000 }); } // 发送验证码 export function getPhone(data) { return request({ url: `/auth/phone/sms/verification/${data.phone}`, method: "get" }); } // 忘记密码---发送验证码 export function getPhoneCode(data) { return request({ url: `/mgr/upms/reset/code/${data.phone}/${data.idStr}`, // /mgr/upms/user/phone/${data.phone} method: "get" }); } // 验证码登录 export function codeLogin(data) { return request({ url: "/auth/login/other", method: "get", headers: { isToken: false, // tenantId: store.getters.tenantId ? store.getters.tenantId : 0 }, params: { client_id, client_secret, login_other_auth_parameter: data } }); } // 微信登录 export function wxOpenidLogin(data) { return request({ url: "/auth/login/wx/token", method: "get", headers: { isToken: false, }, params: data }); } // APP二维码登录 export function appQrLogin(data) { return request({ url: "/mgr/upms/app/oauth", method: "get", headers: { isToken: false, }, params: data }); } // 检查APP扫码 export function appCheck(data){ return request({ url: `/mgr/upms/app/check/${data.uuid}`, method: "get", headers: { isToken: false, }, params: data }); } // app登录 export function appLogin(data) { return request({ url: "/auth/login/app/token", method: "get", headers: { isToken: false, }, params: data }); } export const resetPass = (data) => { return request({ url: "/mgr/upms/reset/verify/password", headers: { isToken: false, // Accept: "application/x-www-form-urlencoded" "Content-type": "text/plain", // "application/json" }, method: "post", data, // {ciphertext: str} }); }; // 退出登录 export const loginoutHandle = () => { return request({ url: `/auth/token/logout`, method: "get" }); }; ================================================ FILE: src/api/newDesign.js ================================================ import request from '@/router/axios' // 默认请求 export const sendRequire = (url, method, data) => { let obj = { url: url, method: method } if(data) { if(method == 'get' || method == 'delete') { obj.params = data }else{ obj.data = data } } return request(obj) } // 自定义请求 export const sendMyRequire = (http, data) => { let obj = { url: http.url, method: http.httpMethod, headers: { 'Content-Type': http.requestContentType } } if(data) { if(http.requestContentType == 'application/x-www-form-urlencoded') { obj.params = data }else{ obj.data = data } } if(http.headers) { obj.headers = Object.assign(http.headers, http.headers) } return request(obj) } // 绑定手机 export function bindPhone(data) { return request({ url: "/mgr/jvs-auth/index/bind/phone", method: "put", params: data }); } // 发送手机验证码 export function sendPhoneCode(phone) { return request({ url: `/auth/phone/sms/bind/${phone}`, // `/auth/phone/sms/verification/${phone}`, method: "get", }); } ================================================ FILE: src/components/QRcode/index.vue ================================================ ================================================ FILE: src/components/api.js ================================================ import request from '@/router/axios' // 用户列表 export function getUserList(query) { return request({ url: "/mgr/jvs-auth//user/page", method: "get", params: query }); } // 所有用户 export function getUserAll(query) { return request({ url: "/mgr/jvs-auth//user/user/search", method: "get", params: query }); } ================================================ FILE: src/components/basic-assembly/button.vue ================================================ ================================================ FILE: src/components/basic-assembly/form.vue ================================================ ================================================ FILE: src/components/basic-assembly/formcard.vue ================================================ ================================================ FILE: src/components/basic-assembly/formitem.vue ================================================ ================================================ FILE: src/components/basic-assembly/levelForm.vue ================================================ ================================================ FILE: src/components/basic-assembly/stepForm.vue ================================================ ================================================ FILE: src/components/basic-assembly/tab.vue ================================================ ================================================ FILE: src/components/basic-assembly/table.vue ================================================ ================================================ FILE: src/components/basic-assembly/userForm.vue ================================================ ================================================ FILE: src/components/basic-assembly/userSelector.vue ================================================ ================================================ FILE: src/components/basic-container/loading.vue ================================================ ================================================ FILE: src/components/basic-container/login/loginForm.vue ================================================ ================================================ FILE: src/components/basic-container/main.vue ================================================ ================================================ FILE: src/components/doc-lib/api.js ================================================ import request from '@/router/axios' // 保存文档 export const saveContent = (contentId, data) => { return request({ url: `/mgr/document/dcLibrary/save/content/${contentId}`, method: 'post', data: data }) } // 预览文档 export const preview = (id) => { return request({ url: `/mgr/document/dcLibrary/preview/document/${id}`, method: 'get' }) } // 更新文档为编辑状态 export const changeStatus = (id, action) => { return request({ url: `/mgr/document/dcLibrary/status/document/${id}/${action}`, method: 'put' }) } // 修改文档设置 export const editLib = (data) => { return request({ url: `/mgr/document/dcLibrary`, method: 'put', data: data }) } ================================================ FILE: src/components/doc-lib/excel/index.vue ================================================ ================================================ FILE: src/components/doc-lib/flow/index.vue ================================================ ================================================ FILE: src/components/doc-lib/html/index.vue ================================================ ================================================ FILE: src/components/doc-lib/index.vue ================================================ ================================================ FILE: src/components/doc-lib/map/index.vue ================================================ ================================================ FILE: src/components/doc-lib/show.vue ================================================ ================================================ FILE: src/components/error-page/404.vue ================================================ ================================================ FILE: src/components/iframe/main.vue ================================================ ================================================ FILE: src/components/index.js ================================================ import Vue from 'vue' import basicContainer from './basic-container/main' import jvsForm from './basic-assembly/form' import jvsTable from './basic-assembly/table' import jvsTab from './basic-assembly/tab' import jvsButton from './basic-assembly/button' import jvsFormLevel from './basic-assembly/levelForm' import jvsFromStep from './basic-assembly/stepForm' import titlePageHeader from './page-header/titlePageHeader' // 注册全局容器 Vue.component('basicContainer', basicContainer) Vue.component('jvs-form', jvsForm) Vue.component('jvs-table', jvsTable) Vue.component('jvs-tab', jvsTab) Vue.component('jvs-button', jvsButton) Vue.component('jvs-form-level', jvsFormLevel) Vue.component('jvs-form-step', jvsFromStep) Vue.component('title-page-header', titlePageHeader) ================================================ FILE: src/components/page-footer/FooterContent.vue ================================================ ================================================ FILE: src/components/page-header/PageHeader.vue ================================================ ================================================ FILE: src/components/page-header/titlePageHeader.vue ================================================ ================================================ FILE: src/config/env.js ================================================ // 配置编译环境和线上环境之间的切换 const env = process.env let baseUrl = '' let iconfontVersion = ['567566_qo5lxgtishg', '667895_v7uduh4zui', '2052824_mnq40bpm1w', '2514494_kvtmaqepi8f'] let iconfontUrl = `//at.alicdn.com/t/font_$key.css` let codeUrl = `${window.location.origin}/code` let actUrl = `${window.location.origin}/act/modeler.html?modelId=` if (env.NODE_ENV == 'development') { } else if (env.NODE_ENV == 'production') { } else if (env.NODE_ENV == 'test') { } export { baseUrl, actUrl, iconfontUrl, iconfontVersion, codeUrl, env } ================================================ FILE: src/const/chinaArea.js ================================================ export const areaList = [ { "code": "110000", "name": "北京市", "children": [ { "code": "110000", "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": "120000", "name": "天津市", "children": [ { "code": "120000", "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": "130000", "name": "河北省", "children": [ { "code": "130100", "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": "130181", "name": "辛集市" }, { "code": "130183", "name": "晋州市" }, { "code": "130184", "name": "新乐市" } ] }, { "code": "130200", "name": "唐山市", "children": [ { "code": "130202", "name": "路南区" }, { "code": "130203", "name": "路北区" }, { "code": "130204", "name": "古冶区" }, { "code": "130205", "name": "开平区" }, { "code": "130207", "name": "丰南区" }, { "code": "130208", "name": "丰润区" }, { "code": "130209", "name": "曹妃甸区" }, { "code": "130223", "name": "滦县" }, { "code": "130224", "name": "滦南县" }, { "code": "130225", "name": "乐亭县" }, { "code": "130227", "name": "迁西县" }, { "code": "130229", "name": "玉田县" }, { "code": "130281", "name": "遵化市" }, { "code": "130283", "name": "迁安市" } ] }, { "code": "130300", "name": "秦皇岛市", "children": [ { "code": "130302", "name": "海港区" }, { "code": "130303", "name": "山海关区" }, { "code": "130304", "name": "北戴河区" }, { "code": "130306", "name": "抚宁区" }, { "code": "130321", "name": "青龙满族自治县" }, { "code": "130322", "name": "昌黎县" }, { "code": "130324", "name": "卢龙县" } ] }, { "code": "130400", "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": "130481", "name": "武安市" } ] }, { "code": "130500", "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": "130581", "name": "南宫市" }, { "code": "130582", "name": "沙河市" } ] }, { "code": "130600", "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": "130681", "name": "涿州市" }, { "code": "130682", "name": "定州市" }, { "code": "130683", "name": "安国市" }, { "code": "130684", "name": "高碑店市" } ] }, { "code": "130700", "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": "130800", "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": "130881", "name": "平泉市" } ] }, { "code": "130900", "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": "130981", "name": "泊头市" }, { "code": "130982", "name": "任丘市" }, { "code": "130983", "name": "黄骅市" }, { "code": "130984", "name": "河间市" } ] }, { "code": "131000", "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": "131081", "name": "霸州市" }, { "code": "131082", "name": "三河市" } ] }, { "code": "131100", "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": "131182", "name": "深州市" } ] } ] }, { "code": "140000", "name": "山西省", "children": [ { "code": "140100", "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": "140181", "name": "古交市" } ] }, { "code": "140200", "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": "140300", "name": "阳泉市", "children": [ { "code": "140302", "name": "城区" }, { "code": "140303", "name": "矿区" }, { "code": "140311", "name": "郊区" }, { "code": "140321", "name": "平定县" }, { "code": "140322", "name": "盂县" } ] }, { "code": "140400", "name": "长治市", "children": [ { "code": "140402", "name": "城区" }, { "code": "140411", "name": "郊区" }, { "code": "140421", "name": "长治县" }, { "code": "140423", "name": "襄垣县" }, { "code": "140424", "name": "屯留县" }, { "code": "140425", "name": "平顺县" }, { "code": "140426", "name": "黎城县" }, { "code": "140427", "name": "壶关县" }, { "code": "140428", "name": "长子县" }, { "code": "140429", "name": "武乡县" }, { "code": "140430", "name": "沁县" }, { "code": "140431", "name": "沁源县" }, { "code": "140481", "name": "潞城市" } ] }, { "code": "140500", "name": "晋城市", "children": [ { "code": "140502", "name": "城区" }, { "code": "140521", "name": "沁水县" }, { "code": "140522", "name": "阳城县" }, { "code": "140524", "name": "陵川县" }, { "code": "140525", "name": "泽州县" }, { "code": "140581", "name": "高平市" } ] }, { "code": "140600", "name": "朔州市", "children": [ { "code": "140602", "name": "朔城区" }, { "code": "140603", "name": "平鲁区" }, { "code": "140621", "name": "山阴县" }, { "code": "140622", "name": "应县" }, { "code": "140623", "name": "右玉县" }, { "code": "140681", "name": "怀仁市" } ] }, { "code": "140700", "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": "140800", "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": "140900", "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": "140981", "name": "原平市" } ] }, { "code": "141000", "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": "141100", "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": "150000", "name": "内蒙古自治区", "children": [ { "code": "150100", "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": "150200", "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": "150300", "name": "乌海市", "children": [ { "code": "150302", "name": "海勃湾区" }, { "code": "150303", "name": "海南区" }, { "code": "150304", "name": "乌达区" } ] }, { "code": "150400", "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": "150500", "name": "通辽市", "children": [ { "code": "150502", "name": "科尔沁区" }, { "code": "150521", "name": "科尔沁左翼中旗" }, { "code": "150522", "name": "科尔沁左翼后旗" }, { "code": "150523", "name": "开鲁县" }, { "code": "150524", "name": "库伦旗" }, { "code": "150525", "name": "奈曼旗" }, { "code": "150526", "name": "扎鲁特旗" }, { "code": "150581", "name": "霍林郭勒市" } ] }, { "code": "150600", "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": "150700", "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": "150800", "name": "巴彦淖尔市", "children": [ { "code": "150802", "name": "临河区" }, { "code": "150821", "name": "五原县" }, { "code": "150822", "name": "磴口县" }, { "code": "150823", "name": "乌拉特前旗" }, { "code": "150824", "name": "乌拉特中旗" }, { "code": "150825", "name": "乌拉特后旗" }, { "code": "150826", "name": "杭锦后旗" } ] }, { "code": "150900", "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": "152200", "name": "兴安盟", "children": [ { "code": "152201", "name": "乌兰浩特市" }, { "code": "152202", "name": "阿尔山市" }, { "code": "152221", "name": "科尔沁右翼前旗" }, { "code": "152222", "name": "科尔沁右翼中旗" }, { "code": "152223", "name": "扎赉特旗" }, { "code": "152224", "name": "突泉县" } ] }, { "code": "152500", "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": "152900", "name": "阿拉善盟", "children": [ { "code": "152921", "name": "阿拉善左旗" }, { "code": "152922", "name": "阿拉善右旗" }, { "code": "152923", "name": "额济纳旗" } ] } ] }, { "code": "210000", "name": "辽宁省", "children": [ { "code": "210100", "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": "210200", "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": "210300", "name": "鞍山市", "children": [ { "code": "210302", "name": "铁东区" }, { "code": "210303", "name": "铁西区" }, { "code": "210304", "name": "立山区" }, { "code": "210311", "name": "千山区" }, { "code": "210321", "name": "台安县" }, { "code": "210323", "name": "岫岩满族自治县" }, { "code": "210381", "name": "海城市" } ] }, { "code": "210400", "name": "抚顺市", "children": [ { "code": "210402", "name": "新抚区" }, { "code": "210403", "name": "东洲区" }, { "code": "210404", "name": "望花区" }, { "code": "210411", "name": "顺城区" }, { "code": "210421", "name": "抚顺县" }, { "code": "210422", "name": "新宾满族自治县" }, { "code": "210423", "name": "清原满族自治县" } ] }, { "code": "210500", "name": "本溪市", "children": [ { "code": "210502", "name": "平山区" }, { "code": "210503", "name": "溪湖区" }, { "code": "210504", "name": "明山区" }, { "code": "210505", "name": "南芬区" }, { "code": "210521", "name": "本溪满族自治县" }, { "code": "210522", "name": "桓仁满族自治县" } ] }, { "code": "210600", "name": "丹东市", "children": [ { "code": "210602", "name": "元宝区" }, { "code": "210603", "name": "振兴区" }, { "code": "210604", "name": "振安区" }, { "code": "210624", "name": "宽甸满族自治县" }, { "code": "210681", "name": "东港市" }, { "code": "210682", "name": "凤城市" } ] }, { "code": "210700", "name": "锦州市", "children": [ { "code": "210702", "name": "古塔区" }, { "code": "210703", "name": "凌河区" }, { "code": "210711", "name": "太和区" }, { "code": "210726", "name": "黑山县" }, { "code": "210727", "name": "义县" }, { "code": "210781", "name": "凌海市" }, { "code": "210782", "name": "北镇市" } ] }, { "code": "210800", "name": "营口市", "children": [ { "code": "210802", "name": "站前区" }, { "code": "210803", "name": "西市区" }, { "code": "210804", "name": "鲅鱼圈区" }, { "code": "210811", "name": "老边区" }, { "code": "210881", "name": "盖州市" }, { "code": "210882", "name": "大石桥市" } ] }, { "code": "210900", "name": "阜新市", "children": [ { "code": "210902", "name": "海州区" }, { "code": "210903", "name": "新邱区" }, { "code": "210904", "name": "太平区" }, { "code": "210905", "name": "清河门区" }, { "code": "210911", "name": "细河区" }, { "code": "210921", "name": "阜新蒙古族自治县" }, { "code": "210922", "name": "彰武县" } ] }, { "code": "211000", "name": "辽阳市", "children": [ { "code": "211002", "name": "白塔区" }, { "code": "211003", "name": "文圣区" }, { "code": "211004", "name": "宏伟区" }, { "code": "211005", "name": "弓长岭区" }, { "code": "211011", "name": "太子河区" }, { "code": "211021", "name": "辽阳县" }, { "code": "211081", "name": "灯塔市" } ] }, { "code": "211100", "name": "盘锦市", "children": [ { "code": "211102", "name": "双台子区" }, { "code": "211103", "name": "兴隆台区" }, { "code": "211104", "name": "大洼区" }, { "code": "211122", "name": "盘山县" } ] }, { "code": "211200", "name": "铁岭市", "children": [ { "code": "211202", "name": "银州区" }, { "code": "211204", "name": "清河区" }, { "code": "211221", "name": "铁岭县" }, { "code": "211223", "name": "西丰县" }, { "code": "211224", "name": "昌图县" }, { "code": "211281", "name": "调兵山市" }, { "code": "211282", "name": "开原市" } ] }, { "code": "211300", "name": "朝阳市", "children": [ { "code": "211302", "name": "双塔区" }, { "code": "211303", "name": "龙城区" }, { "code": "211321", "name": "朝阳县" }, { "code": "211322", "name": "建平县" }, { "code": "211324", "name": "喀喇沁左翼蒙古族自治县" }, { "code": "211381", "name": "北票市" }, { "code": "211382", "name": "凌源市" } ] }, { "code": "211400", "name": "葫芦岛市", "children": [ { "code": "211402", "name": "连山区" }, { "code": "211403", "name": "龙港区" }, { "code": "211404", "name": "南票区" }, { "code": "211421", "name": "绥中县" }, { "code": "211422", "name": "建昌县" }, { "code": "211481", "name": "兴城市" } ] } ] }, { "code": "220000", "name": "吉林省", "children": [ { "code": "220100", "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": "220182", "name": "榆树市" }, { "code": "220183", "name": "德惠市" } ] }, { "code": "220200", "name": "吉林市", "children": [ { "code": "220202", "name": "昌邑区" }, { "code": "220203", "name": "龙潭区" }, { "code": "220204", "name": "船营区" }, { "code": "220211", "name": "丰满区" }, { "code": "220221", "name": "永吉县" }, { "code": "220281", "name": "蛟河市" }, { "code": "220282", "name": "桦甸市" }, { "code": "220283", "name": "舒兰市" }, { "code": "220284", "name": "磐石市" } ] }, { "code": "220300", "name": "四平市", "children": [ { "code": "220302", "name": "铁西区" }, { "code": "220303", "name": "铁东区" }, { "code": "220322", "name": "梨树县" }, { "code": "220323", "name": "伊通满族自治县" }, { "code": "220381", "name": "公主岭市" }, { "code": "220382", "name": "双辽市" } ] }, { "code": "220400", "name": "辽源市", "children": [ { "code": "220402", "name": "龙山区" }, { "code": "220403", "name": "西安区" }, { "code": "220421", "name": "东丰县" }, { "code": "220422", "name": "东辽县" } ] }, { "code": "220500", "name": "通化市", "children": [ { "code": "220502", "name": "东昌区" }, { "code": "220503", "name": "二道江区" }, { "code": "220521", "name": "通化县" }, { "code": "220523", "name": "辉南县" }, { "code": "220524", "name": "柳河县" }, { "code": "220581", "name": "梅河口市" }, { "code": "220582", "name": "集安市" } ] }, { "code": "220600", "name": "白山市", "children": [ { "code": "220602", "name": "浑江区" }, { "code": "220605", "name": "江源区" }, { "code": "220621", "name": "抚松县" }, { "code": "220622", "name": "靖宇县" }, { "code": "220623", "name": "长白朝鲜族自治县" }, { "code": "220681", "name": "临江市" } ] }, { "code": "220700", "name": "松原市", "children": [ { "code": "220702", "name": "宁江区" }, { "code": "220721", "name": "前郭尔罗斯蒙古族自治县" }, { "code": "220722", "name": "长岭县" }, { "code": "220723", "name": "乾安县" }, { "code": "220781", "name": "扶余市" } ] }, { "code": "220800", "name": "白城市", "children": [ { "code": "220802", "name": "洮北区" }, { "code": "220821", "name": "镇赉县" }, { "code": "220822", "name": "通榆县" }, { "code": "220881", "name": "洮南市" }, { "code": "220882", "name": "大安市" } ] }, { "code": "222400", "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": "230000", "name": "黑龙江省", "children": [ { "code": "230100", "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": "230200", "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": "230300", "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": "230400", "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": "230500", "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": "230600", "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": "230700", "name": "伊春市", "children": [ { "code": "230702", "name": "伊春区" }, { "code": "230703", "name": "南岔区" }, { "code": "230704", "name": "友好区" }, { "code": "230705", "name": "西林区" }, { "code": "230706", "name": "翠峦区" }, { "code": "230707", "name": "新青区" }, { "code": "230708", "name": "美溪区" }, { "code": "230709", "name": "金山屯区" }, { "code": "230710", "name": "五营区" }, { "code": "230711", "name": "乌马河区" }, { "code": "230712", "name": "汤旺河区" }, { "code": "230713", "name": "带岭区" }, { "code": "230714", "name": "乌伊岭区" }, { "code": "230715", "name": "红星区" }, { "code": "230716", "name": "上甘岭区" }, { "code": "230722", "name": "嘉荫县" }, { "code": "230781", "name": "铁力市" } ] }, { "code": "230800", "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": "230900", "name": "七台河市", "children": [ { "code": "230902", "name": "新兴区" }, { "code": "230903", "name": "桃山区" }, { "code": "230904", "name": "茄子河区" }, { "code": "230921", "name": "勃利县" } ] }, { "code": "231000", "name": "牡丹江市", "children": [ { "code": "231002", "name": "东安区" }, { "code": "231003", "name": "阳明区" }, { "code": "231004", "name": "爱民区" }, { "code": "231005", "name": "西安区" }, { "code": "231025", "name": "林口县" }, { "code": "231081", "name": "绥芬河市" }, { "code": "231083", "name": "海林市" }, { "code": "231084", "name": "宁安市" }, { "code": "231085", "name": "穆棱市" }, { "code": "231086", "name": "东宁市" } ] }, { "code": "231100", "name": "黑河市", "children": [ { "code": "231102", "name": "爱辉区" }, { "code": "231121", "name": "嫩江县" }, { "code": "231123", "name": "逊克县" }, { "code": "231124", "name": "孙吴县" }, { "code": "231181", "name": "北安市" }, { "code": "231182", "name": "五大连池市" } ] }, { "code": "231200", "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": "232700", "name": "大兴安岭地区", "children": [ { "code": "232701", "name": "漠河市" }, { "code": "232721", "name": "呼玛县" }, { "code": "232722", "name": "塔河县" } ] } ] }, { "code": "310000", "name": "上海市", "children": [ { "code": "310000", "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": "320000", "name": "江苏省", "children": [ { "code": "320100", "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": "320200", "name": "无锡市", "children": [ { "code": "320205", "name": "锡山区" }, { "code": "320206", "name": "惠山区" }, { "code": "320211", "name": "滨湖区" }, { "code": "320213", "name": "梁溪区" }, { "code": "320214", "name": "新吴区" }, { "code": "320281", "name": "江阴市" }, { "code": "320282", "name": "宜兴市" } ] }, { "code": "320300", "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": "320381", "name": "新沂市" }, { "code": "320382", "name": "邳州市" } ] }, { "code": "320400", "name": "常州市", "children": [ { "code": "320402", "name": "天宁区" }, { "code": "320404", "name": "钟楼区" }, { "code": "320411", "name": "新北区" }, { "code": "320412", "name": "武进区" }, { "code": "320413", "name": "金坛区" }, { "code": "320481", "name": "溧阳市" } ] }, { "code": "320500", "name": "苏州市", "children": [ { "code": "320505", "name": "虎丘区" }, { "code": "320506", "name": "吴中区" }, { "code": "320507", "name": "相城区" }, { "code": "320508", "name": "姑苏区" }, { "code": "320509", "name": "吴江区" }, { "code": "320581", "name": "常熟市" }, { "code": "320582", "name": "张家港市" }, { "code": "320583", "name": "昆山市" }, { "code": "320585", "name": "太仓市" } ] }, { "code": "320600", "name": "南通市", "children": [ { "code": "320602", "name": "崇川区" }, { "code": "320611", "name": "港闸区" }, { "code": "320612", "name": "通州区" }, { "code": "320623", "name": "如东县" }, { "code": "320681", "name": "启东市" }, { "code": "320682", "name": "如皋市" }, { "code": "320684", "name": "海门市" }, { "code": "320685", "name": "海安市" } ] }, { "code": "320700", "name": "连云港市", "children": [ { "code": "320703", "name": "连云区" }, { "code": "320706", "name": "海州区" }, { "code": "320707", "name": "赣榆区" }, { "code": "320722", "name": "东海县" }, { "code": "320723", "name": "灌云县" }, { "code": "320724", "name": "灌南县" } ] }, { "code": "320800", "name": "淮安市", "children": [ { "code": "320803", "name": "淮安区" }, { "code": "320804", "name": "淮阴区" }, { "code": "320812", "name": "清江浦区" }, { "code": "320813", "name": "洪泽区" }, { "code": "320826", "name": "涟水县" }, { "code": "320830", "name": "盱眙县" }, { "code": "320831", "name": "金湖县" } ] }, { "code": "320900", "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": "320981", "name": "东台市" } ] }, { "code": "321000", "name": "扬州市", "children": [ { "code": "321002", "name": "广陵区" }, { "code": "321003", "name": "邗江区" }, { "code": "321012", "name": "江都区" }, { "code": "321023", "name": "宝应县" }, { "code": "321081", "name": "仪征市" }, { "code": "321084", "name": "高邮市" } ] }, { "code": "321100", "name": "镇江市", "children": [ { "code": "321102", "name": "京口区" }, { "code": "321111", "name": "润州区" }, { "code": "321112", "name": "丹徒区" }, { "code": "321181", "name": "丹阳市" }, { "code": "321182", "name": "扬中市" }, { "code": "321183", "name": "句容市" } ] }, { "code": "321200", "name": "泰州市", "children": [ { "code": "321202", "name": "海陵区" }, { "code": "321203", "name": "高港区" }, { "code": "321204", "name": "姜堰区" }, { "code": "321281", "name": "兴化市" }, { "code": "321282", "name": "靖江市" }, { "code": "321283", "name": "泰兴市" } ] }, { "code": "321300", "name": "宿迁市", "children": [ { "code": "321302", "name": "宿城区" }, { "code": "321311", "name": "宿豫区" }, { "code": "321322", "name": "沭阳县" }, { "code": "321323", "name": "泗阳县" }, { "code": "321324", "name": "泗洪县" } ] } ] }, { "code": "330000", "name": "浙江省", "children": [ { "code": "330100", "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": "330200", "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": "330300", "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": "330381", "name": "瑞安市" }, { "code": "330382", "name": "乐清市" } ] }, { "code": "330400", "name": "嘉兴市", "children": [ { "code": "330402", "name": "南湖区" }, { "code": "330411", "name": "秀洲区" }, { "code": "330421", "name": "嘉善县" }, { "code": "330424", "name": "海盐县" }, { "code": "330481", "name": "海宁市" }, { "code": "330482", "name": "平湖市" }, { "code": "330483", "name": "桐乡市" } ] }, { "code": "330500", "name": "湖州市", "children": [ { "code": "330502", "name": "吴兴区" }, { "code": "330503", "name": "南浔区" }, { "code": "330521", "name": "德清县" }, { "code": "330522", "name": "长兴县" }, { "code": "330523", "name": "安吉县" } ] }, { "code": "330600", "name": "绍兴市", "children": [ { "code": "330602", "name": "越城区" }, { "code": "330603", "name": "柯桥区" }, { "code": "330604", "name": "上虞区" }, { "code": "330624", "name": "新昌县" }, { "code": "330681", "name": "诸暨市" }, { "code": "330683", "name": "嵊州市" } ] }, { "code": "330700", "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": "330800", "name": "衢州市", "children": [ { "code": "330802", "name": "柯城区" }, { "code": "330803", "name": "衢江区" }, { "code": "330822", "name": "常山县" }, { "code": "330824", "name": "开化县" }, { "code": "330825", "name": "龙游县" }, { "code": "330881", "name": "江山市" } ] }, { "code": "330900", "name": "舟山市", "children": [ { "code": "330902", "name": "定海区" }, { "code": "330903", "name": "普陀区" }, { "code": "330921", "name": "岱山县" }, { "code": "330922", "name": "嵊泗县" } ] }, { "code": "331000", "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": "331100", "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": "340000", "name": "安徽省", "children": [ { "code": "340100", "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": "340181", "name": "巢湖市" } ] }, { "code": "340200", "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": "340300", "name": "蚌埠市", "children": [ { "code": "340302", "name": "龙子湖区" }, { "code": "340303", "name": "蚌山区" }, { "code": "340304", "name": "禹会区" }, { "code": "340311", "name": "淮上区" }, { "code": "340321", "name": "怀远县" }, { "code": "340322", "name": "五河县" }, { "code": "340323", "name": "固镇县" } ] }, { "code": "340400", "name": "淮南市", "children": [ { "code": "340402", "name": "大通区" }, { "code": "340403", "name": "田家庵区" }, { "code": "340404", "name": "谢家集区" }, { "code": "340405", "name": "八公山区" }, { "code": "340406", "name": "潘集区" }, { "code": "340421", "name": "凤台县" }, { "code": "340422", "name": "寿县" } ] }, { "code": "340500", "name": "马鞍山市", "children": [ { "code": "340503", "name": "花山区" }, { "code": "340504", "name": "雨山区" }, { "code": "340506", "name": "博望区" }, { "code": "340521", "name": "当涂县" }, { "code": "340522", "name": "含山县" }, { "code": "340523", "name": "和县" } ] }, { "code": "340600", "name": "淮北市", "children": [ { "code": "340602", "name": "杜集区" }, { "code": "340603", "name": "相山区" }, { "code": "340604", "name": "烈山区" }, { "code": "340621", "name": "濉溪县" } ] }, { "code": "340700", "name": "铜陵市", "children": [ { "code": "340705", "name": "铜官区" }, { "code": "340706", "name": "义安区" }, { "code": "340711", "name": "郊区" }, { "code": "340722", "name": "枞阳县" } ] }, { "code": "340800", "name": "安庆市", "children": [ { "code": "340802", "name": "迎江区" }, { "code": "340803", "name": "大观区" }, { "code": "340811", "name": "宜秀区" }, { "code": "340822", "name": "怀宁县" }, { "code": "340824", "name": "潜山县" }, { "code": "340825", "name": "太湖县" }, { "code": "340826", "name": "宿松县" }, { "code": "340827", "name": "望江县" }, { "code": "340828", "name": "岳西县" }, { "code": "340881", "name": "桐城市" } ] }, { "code": "341000", "name": "黄山市", "children": [ { "code": "341002", "name": "屯溪区" }, { "code": "341003", "name": "黄山区" }, { "code": "341004", "name": "徽州区" }, { "code": "341021", "name": "歙县" }, { "code": "341022", "name": "休宁县" }, { "code": "341023", "name": "黟县" }, { "code": "341024", "name": "祁门县" } ] }, { "code": "341100", "name": "滁州市", "children": [ { "code": "341102", "name": "琅琊区" }, { "code": "341103", "name": "南谯区" }, { "code": "341122", "name": "来安县" }, { "code": "341124", "name": "全椒县" }, { "code": "341125", "name": "定远县" }, { "code": "341126", "name": "凤阳县" }, { "code": "341181", "name": "天长市" }, { "code": "341182", "name": "明光市" } ] }, { "code": "341200", "name": "阜阳市", "children": [ { "code": "341202", "name": "颍州区" }, { "code": "341203", "name": "颍东区" }, { "code": "341204", "name": "颍泉区" }, { "code": "341221", "name": "临泉县" }, { "code": "341222", "name": "太和县" }, { "code": "341225", "name": "阜南县" }, { "code": "341226", "name": "颍上县" }, { "code": "341282", "name": "界首市" } ] }, { "code": "341300", "name": "宿州市", "children": [ { "code": "341302", "name": "埇桥区" }, { "code": "341321", "name": "砀山县" }, { "code": "341322", "name": "萧县" }, { "code": "341323", "name": "灵璧县" }, { "code": "341324", "name": "泗县" } ] }, { "code": "341500", "name": "六安市", "children": [ { "code": "341502", "name": "金安区" }, { "code": "341503", "name": "裕安区" }, { "code": "341504", "name": "叶集区" }, { "code": "341522", "name": "霍邱县" }, { "code": "341523", "name": "舒城县" }, { "code": "341524", "name": "金寨县" }, { "code": "341525", "name": "霍山县" } ] }, { "code": "341600", "name": "亳州市", "children": [ { "code": "341602", "name": "谯城区" }, { "code": "341621", "name": "涡阳县" }, { "code": "341622", "name": "蒙城县" }, { "code": "341623", "name": "利辛县" } ] }, { "code": "341700", "name": "池州市", "children": [ { "code": "341702", "name": "贵池区" }, { "code": "341721", "name": "东至县" }, { "code": "341722", "name": "石台县" }, { "code": "341723", "name": "青阳县" } ] }, { "code": "341800", "name": "宣城市", "children": [ { "code": "341802", "name": "宣州区" }, { "code": "341821", "name": "郎溪县" }, { "code": "341822", "name": "广德县" }, { "code": "341823", "name": "泾县" }, { "code": "341824", "name": "绩溪县" }, { "code": "341825", "name": "旌德县" }, { "code": "341881", "name": "宁国市" } ] } ] }, { "code": "350000", "name": "福建省", "children": [ { "code": "350100", "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": "350200", "name": "厦门市", "children": [ { "code": "350203", "name": "思明区" }, { "code": "350205", "name": "海沧区" }, { "code": "350206", "name": "湖里区" }, { "code": "350211", "name": "集美区" }, { "code": "350212", "name": "同安区" }, { "code": "350213", "name": "翔安区" } ] }, { "code": "350300", "name": "莆田市", "children": [ { "code": "350302", "name": "城厢区" }, { "code": "350303", "name": "涵江区" }, { "code": "350304", "name": "荔城区" }, { "code": "350305", "name": "秀屿区" }, { "code": "350322", "name": "仙游县" } ] }, { "code": "350400", "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": "350500", "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": "350600", "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": "350700", "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": "350800", "name": "龙岩市", "children": [ { "code": "350802", "name": "新罗区" }, { "code": "350803", "name": "永定区" }, { "code": "350821", "name": "长汀县" }, { "code": "350823", "name": "上杭县" }, { "code": "350824", "name": "武平县" }, { "code": "350825", "name": "连城县" }, { "code": "350881", "name": "漳平市" } ] }, { "code": "350900", "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": "360000", "name": "江西省", "children": [ { "code": "360100", "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": "360200", "name": "景德镇市", "children": [ { "code": "360202", "name": "昌江区" }, { "code": "360203", "name": "珠山区" }, { "code": "360222", "name": "浮梁县" }, { "code": "360281", "name": "乐平市" } ] }, { "code": "360300", "name": "萍乡市", "children": [ { "code": "360302", "name": "安源区" }, { "code": "360313", "name": "湘东区" }, { "code": "360321", "name": "莲花县" }, { "code": "360322", "name": "上栗县" }, { "code": "360323", "name": "芦溪县" } ] }, { "code": "360400", "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": "360500", "name": "新余市", "children": [ { "code": "360502", "name": "渝水区" }, { "code": "360521", "name": "分宜县" } ] }, { "code": "360600", "name": "鹰潭市", "children": [ { "code": "360602", "name": "月湖区" }, { "code": "360603", "name": "余江区" }, { "code": "360681", "name": "贵溪市" } ] }, { "code": "360700", "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": "360800", "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": "360900", "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": "361000", "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": "361100", "name": "上饶市", "children": [ { "code": "361102", "name": "信州区" }, { "code": "361103", "name": "广丰区" }, { "code": "361121", "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": "370000", "name": "山东省", "children": [ { "code": "370100", "name": "济南市", "children": [ { "code": "370102", "name": "历下区" }, { "code": "370103", "name": "市中区" }, { "code": "370104", "name": "槐荫区" }, { "code": "370105", "name": "天桥区" }, { "code": "370112", "name": "历城区" }, { "code": "370113", "name": "长清区" }, { "code": "370114", "name": "章丘区" }, { "code": "370124", "name": "平阴县" }, { "code": "370125", "name": "济阳县" }, { "code": "370126", "name": "商河县" } ] }, { "code": "370200", "name": "青岛市", "children": [ { "code": "370202", "name": "市南区" }, { "code": "370203", "name": "市北区" }, { "code": "370211", "name": "黄岛区" }, { "code": "370212", "name": "崂山区" }, { "code": "370213", "name": "李沧区" }, { "code": "370214", "name": "城阳区" }, { "code": "370215", "name": "即墨区" }, { "code": "370281", "name": "胶州市" }, { "code": "370283", "name": "平度市" }, { "code": "370285", "name": "莱西市" } ] }, { "code": "370300", "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": "370400", "name": "枣庄市", "children": [ { "code": "370402", "name": "市中区" }, { "code": "370403", "name": "薛城区" }, { "code": "370404", "name": "峄城区" }, { "code": "370405", "name": "台儿庄区" }, { "code": "370406", "name": "山亭区" }, { "code": "370481", "name": "滕州市" } ] }, { "code": "370500", "name": "东营市", "children": [ { "code": "370502", "name": "东营区" }, { "code": "370503", "name": "河口区" }, { "code": "370505", "name": "垦利区" }, { "code": "370522", "name": "利津县" }, { "code": "370523", "name": "广饶县" } ] }, { "code": "370600", "name": "烟台市", "children": [ { "code": "370602", "name": "芝罘区" }, { "code": "370611", "name": "福山区" }, { "code": "370612", "name": "牟平区" }, { "code": "370613", "name": "莱山区" }, { "code": "370634", "name": "长岛县" }, { "code": "370681", "name": "龙口市" }, { "code": "370682", "name": "莱阳市" }, { "code": "370683", "name": "莱州市" }, { "code": "370684", "name": "蓬莱市" }, { "code": "370685", "name": "招远市" }, { "code": "370686", "name": "栖霞市" }, { "code": "370687", "name": "海阳市" } ] }, { "code": "370700", "name": "潍坊市", "children": [ { "code": "370702", "name": "潍城区" }, { "code": "370703", "name": "寒亭区" }, { "code": "370704", "name": "坊子区" }, { "code": "370705", "name": "奎文区" }, { "code": "370724", "name": "临朐县" }, { "code": "370725", "name": "昌乐县" }, { "code": "370781", "name": "青州市" }, { "code": "370782", "name": "诸城市" }, { "code": "370783", "name": "寿光市" }, { "code": "370784", "name": "安丘市" }, { "code": "370785", "name": "高密市" }, { "code": "370786", "name": "昌邑市" } ] }, { "code": "370800", "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": "370881", "name": "曲阜市" }, { "code": "370883", "name": "邹城市" } ] }, { "code": "370900", "name": "泰安市", "children": [ { "code": "370902", "name": "泰山区" }, { "code": "370911", "name": "岱岳区" }, { "code": "370921", "name": "宁阳县" }, { "code": "370923", "name": "东平县" }, { "code": "370982", "name": "新泰市" }, { "code": "370983", "name": "肥城市" } ] }, { "code": "371000", "name": "威海市", "children": [ { "code": "371002", "name": "环翠区" }, { "code": "371003", "name": "文登区" }, { "code": "371082", "name": "荣成市" }, { "code": "371083", "name": "乳山市" } ] }, { "code": "371100", "name": "日照市", "children": [ { "code": "371102", "name": "东港区" }, { "code": "371103", "name": "岚山区" }, { "code": "371121", "name": "五莲县" }, { "code": "371122", "name": "莒县" } ] }, { "code": "371200", "name": "莱芜市", "children": [ { "code": "371202", "name": "莱城区" }, { "code": "371203", "name": "钢城区" } ] }, { "code": "371300", "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": "371400", "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": "371481", "name": "乐陵市" }, { "code": "371482", "name": "禹城市" } ] }, { "code": "371500", "name": "聊城市", "children": [ { "code": "371502", "name": "东昌府区" }, { "code": "371521", "name": "阳谷县" }, { "code": "371522", "name": "莘县" }, { "code": "371523", "name": "茌平县" }, { "code": "371524", "name": "东阿县" }, { "code": "371525", "name": "冠县" }, { "code": "371526", "name": "高唐县" }, { "code": "371581", "name": "临清市" } ] }, { "code": "371600", "name": "滨州市", "children": [ { "code": "371602", "name": "滨城区" }, { "code": "371603", "name": "沾化区" }, { "code": "371621", "name": "惠民县" }, { "code": "371622", "name": "阳信县" }, { "code": "371623", "name": "无棣县" }, { "code": "371625", "name": "博兴县" }, { "code": "371626", "name": "邹平县" } ] }, { "code": "371700", "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": "410000", "name": "河南省", "children": [ { "code": "410100", "name": "郑州市", "children": [ { "code": "410102", "name": "中原区" }, { "code": "410103", "name": "二七区" }, { "code": "410104", "name": "管城回族区" }, { "code": "410105", "name": "金水区" }, { "code": "410106", "name": "上街区" }, { "code": "410108", "name": "惠济区" }, { "code": "410122", "name": "中牟县" }, { "code": "410181", "name": "巩义市" }, { "code": "410182", "name": "荥阳市" }, { "code": "410183", "name": "新密市" }, { "code": "410184", "name": "新郑市" }, { "code": "410185", "name": "登封市" } ] }, { "code": "410200", "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": "410300", "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": "410381", "name": "偃师市" } ] }, { "code": "410400", "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": "410481", "name": "舞钢市" }, { "code": "410482", "name": "汝州市" } ] }, { "code": "410500", "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": "410581", "name": "林州市" } ] }, { "code": "410600", "name": "鹤壁市", "children": [ { "code": "410602", "name": "鹤山区" }, { "code": "410603", "name": "山城区" }, { "code": "410611", "name": "淇滨区" }, { "code": "410621", "name": "浚县" }, { "code": "410622", "name": "淇县" } ] }, { "code": "410700", "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": "410728", "name": "长垣县" }, { "code": "410781", "name": "卫辉市" }, { "code": "410782", "name": "辉县市" } ] }, { "code": "410800", "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": "410882", "name": "沁阳市" }, { "code": "410883", "name": "孟州市" } ] }, { "code": "410900", "name": "濮阳市", "children": [ { "code": "410902", "name": "华龙区" }, { "code": "410922", "name": "清丰县" }, { "code": "410923", "name": "南乐县" }, { "code": "410926", "name": "范县" }, { "code": "410927", "name": "台前县" }, { "code": "410928", "name": "濮阳县" } ] }, { "code": "411000", "name": "许昌市", "children": [ { "code": "411002", "name": "魏都区" }, { "code": "411003", "name": "建安区" }, { "code": "411024", "name": "鄢陵县" }, { "code": "411025", "name": "襄城县" }, { "code": "411081", "name": "禹州市" }, { "code": "411082", "name": "长葛市" } ] }, { "code": "411100", "name": "漯河市", "children": [ { "code": "411102", "name": "源汇区" }, { "code": "411103", "name": "郾城区" }, { "code": "411104", "name": "召陵区" }, { "code": "411121", "name": "舞阳县" }, { "code": "411122", "name": "临颍县" } ] }, { "code": "411200", "name": "三门峡市", "children": [ { "code": "411202", "name": "湖滨区" }, { "code": "411203", "name": "陕州区" }, { "code": "411221", "name": "渑池县" }, { "code": "411224", "name": "卢氏县" }, { "code": "411281", "name": "义马市" }, { "code": "411282", "name": "灵宝市" } ] }, { "code": "411300", "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": "411381", "name": "邓州市" } ] }, { "code": "411400", "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": "411481", "name": "永城市" } ] }, { "code": "411500", "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": "411600", "name": "周口市", "children": [ { "code": "411602", "name": "川汇区" }, { "code": "411621", "name": "扶沟县" }, { "code": "411622", "name": "西华县" }, { "code": "411623", "name": "商水县" }, { "code": "411624", "name": "沈丘县" }, { "code": "411625", "name": "郸城县" }, { "code": "411626", "name": "淮阳县" }, { "code": "411627", "name": "太康县" }, { "code": "411628", "name": "鹿邑县" }, { "code": "411681", "name": "项城市" } ] }, { "code": "411700", "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": "420000", "name": "湖北省", "children": [ { "code": "420100", "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": "420200", "name": "黄石市", "children": [ { "code": "420202", "name": "黄石港区" }, { "code": "420203", "name": "西塞山区" }, { "code": "420204", "name": "下陆区" }, { "code": "420205", "name": "铁山区" }, { "code": "420222", "name": "阳新县" }, { "code": "420281", "name": "大冶市" } ] }, { "code": "420300", "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": "420500", "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": "420600", "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": "420700", "name": "鄂州市", "children": [ { "code": "420702", "name": "梁子湖区" }, { "code": "420703", "name": "华容区" }, { "code": "420704", "name": "鄂城区" } ] }, { "code": "420800", "name": "荆门市", "children": [ { "code": "420802", "name": "东宝区" }, { "code": "420804", "name": "掇刀区" }, { "code": "420822", "name": "沙洋县" }, { "code": "420881", "name": "钟祥市" }, { "code": "420882", "name": "京山市" } ] }, { "code": "420900", "name": "孝感市", "children": [ { "code": "420902", "name": "孝南区" }, { "code": "420921", "name": "孝昌县" }, { "code": "420922", "name": "大悟县" }, { "code": "420923", "name": "云梦县" }, { "code": "420981", "name": "应城市" }, { "code": "420982", "name": "安陆市" }, { "code": "420984", "name": "汉川市" } ] }, { "code": "421000", "name": "荆州市", "children": [ { "code": "421002", "name": "沙市区" }, { "code": "421003", "name": "荆州区" }, { "code": "421022", "name": "公安县" }, { "code": "421023", "name": "监利县" }, { "code": "421024", "name": "江陵县" }, { "code": "421081", "name": "石首市" }, { "code": "421083", "name": "洪湖市" }, { "code": "421087", "name": "松滋市" } ] }, { "code": "421100", "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": "421181", "name": "麻城市" }, { "code": "421182", "name": "武穴市" } ] }, { "code": "421200", "name": "咸宁市", "children": [ { "code": "421202", "name": "咸安区" }, { "code": "421221", "name": "嘉鱼县" }, { "code": "421222", "name": "通城县" }, { "code": "421223", "name": "崇阳县" }, { "code": "421224", "name": "通山县" }, { "code": "421281", "name": "赤壁市" } ] }, { "code": "421300", "name": "随州市", "children": [ { "code": "421303", "name": "曾都区" }, { "code": "421321", "name": "随县" }, { "code": "421381", "name": "广水市" } ] }, { "code": "422800", "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": "430000", "name": "湖南省", "children": [ { "code": "430100", "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": "430200", "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": "430281", "name": "醴陵市" } ] }, { "code": "430300", "name": "湘潭市", "children": [ { "code": "430302", "name": "雨湖区" }, { "code": "430304", "name": "岳塘区" }, { "code": "430321", "name": "湘潭县" }, { "code": "430381", "name": "湘乡市" }, { "code": "430382", "name": "韶山市" } ] }, { "code": "430400", "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": "430481", "name": "耒阳市" }, { "code": "430482", "name": "常宁市" } ] }, { "code": "430500", "name": "邵阳市", "children": [ { "code": "430502", "name": "双清区" }, { "code": "430503", "name": "大祥区" }, { "code": "430511", "name": "北塔区" }, { "code": "430521", "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": "430600", "name": "岳阳市", "children": [ { "code": "430602", "name": "岳阳楼区" }, { "code": "430603", "name": "云溪区" }, { "code": "430611", "name": "君山区" }, { "code": "430621", "name": "岳阳县" }, { "code": "430623", "name": "华容县" }, { "code": "430624", "name": "湘阴县" }, { "code": "430626", "name": "平江县" }, { "code": "430681", "name": "汨罗市" }, { "code": "430682", "name": "临湘市" } ] }, { "code": "430700", "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": "430781", "name": "津市市" } ] }, { "code": "430800", "name": "张家界市", "children": [ { "code": "430802", "name": "永定区" }, { "code": "430811", "name": "武陵源区" }, { "code": "430821", "name": "慈利县" }, { "code": "430822", "name": "桑植县" } ] }, { "code": "430900", "name": "益阳市", "children": [ { "code": "430902", "name": "资阳区" }, { "code": "430903", "name": "赫山区" }, { "code": "430921", "name": "南县" }, { "code": "430922", "name": "桃江县" }, { "code": "430923", "name": "安化县" }, { "code": "430981", "name": "沅江市" } ] }, { "code": "431000", "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": "431100", "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": "431200", "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": "431281", "name": "洪江市" } ] }, { "code": "431300", "name": "娄底市", "children": [ { "code": "431302", "name": "娄星区" }, { "code": "431321", "name": "双峰县" }, { "code": "431322", "name": "新化县" }, { "code": "431381", "name": "冷水江市" }, { "code": "431382", "name": "涟源市" } ] }, { "code": "433100", "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": "440000", "name": "广东省", "children": [ { "code": "440100", "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": "440200", "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": "440300", "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": "440400", "name": "珠海市", "children": [ { "code": "440402", "name": "香洲区" }, { "code": "440403", "name": "斗门区" }, { "code": "440404", "name": "金湾区" } ] }, { "code": "440500", "name": "汕头市", "children": [ { "code": "440507", "name": "龙湖区" }, { "code": "440511", "name": "金平区" }, { "code": "440512", "name": "濠江区" }, { "code": "440513", "name": "潮阳区" }, { "code": "440514", "name": "潮南区" }, { "code": "440515", "name": "澄海区" }, { "code": "440523", "name": "南澳县" } ] }, { "code": "440600", "name": "佛山市", "children": [ { "code": "440604", "name": "禅城区" }, { "code": "440605", "name": "南海区" }, { "code": "440606", "name": "顺德区" }, { "code": "440607", "name": "三水区" }, { "code": "440608", "name": "高明区" } ] }, { "code": "440700", "name": "江门市", "children": [ { "code": "440703", "name": "蓬江区" }, { "code": "440704", "name": "江海区" }, { "code": "440705", "name": "新会区" }, { "code": "440781", "name": "台山市" }, { "code": "440783", "name": "开平市" }, { "code": "440784", "name": "鹤山市" }, { "code": "440785", "name": "恩平市" } ] }, { "code": "440800", "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": "440900", "name": "茂名市", "children": [ { "code": "440902", "name": "茂南区" }, { "code": "440904", "name": "电白区" }, { "code": "440981", "name": "高州市" }, { "code": "440982", "name": "化州市" }, { "code": "440983", "name": "信宜市" } ] }, { "code": "441200", "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": "441300", "name": "惠州市", "children": [ { "code": "441302", "name": "惠城区" }, { "code": "441303", "name": "惠阳区" }, { "code": "441322", "name": "博罗县" }, { "code": "441323", "name": "惠东县" }, { "code": "441324", "name": "龙门县" } ] }, { "code": "441400", "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": "441500", "name": "汕尾市", "children": [ { "code": "441502", "name": "城区" }, { "code": "441521", "name": "海丰县" }, { "code": "441523", "name": "陆河县" }, { "code": "441581", "name": "陆丰市" } ] }, { "code": "441600", "name": "河源市", "children": [ { "code": "441602", "name": "源城区" }, { "code": "441621", "name": "紫金县" }, { "code": "441622", "name": "龙川县" }, { "code": "441623", "name": "连平县" }, { "code": "441624", "name": "和平县" }, { "code": "441625", "name": "东源县" } ] }, { "code": "441700", "name": "阳江市", "children": [ { "code": "441702", "name": "江城区" }, { "code": "441704", "name": "阳东区" }, { "code": "441721", "name": "阳西县" }, { "code": "441781", "name": "阳春市" } ] }, { "code": "441800", "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": "441900", "name": "东莞市", "children": [] }, { "code": "442000", "name": "中山市", "children": [] }, { "code": "445100", "name": "潮州市", "children": [ { "code": "445102", "name": "湘桥区" }, { "code": "445103", "name": "潮安区" }, { "code": "445122", "name": "饶平县" } ] }, { "code": "445200", "name": "揭阳市", "children": [ { "code": "445202", "name": "榕城区" }, { "code": "445203", "name": "揭东区" }, { "code": "445222", "name": "揭西县" }, { "code": "445224", "name": "惠来县" }, { "code": "445281", "name": "普宁市" } ] }, { "code": "445300", "name": "云浮市", "children": [ { "code": "445302", "name": "云城区" }, { "code": "445303", "name": "云安区" }, { "code": "445321", "name": "新兴县" }, { "code": "445322", "name": "郁南县" }, { "code": "445381", "name": "罗定市" } ] } ] }, { "code": "450000", "name": "广西壮族自治区", "children": [ { "code": "450100", "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": "450200", "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": "450300", "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": "450381", "name": "荔浦市" }, { "code": "450332", "name": "恭城瑶族自治县" } ] }, { "code": "450400", "name": "梧州市", "children": [ { "code": "450403", "name": "万秀区" }, { "code": "450405", "name": "长洲区" }, { "code": "450406", "name": "龙圩区" }, { "code": "450421", "name": "苍梧县" }, { "code": "450422", "name": "藤县" }, { "code": "450423", "name": "蒙山县" }, { "code": "450481", "name": "岑溪市" } ] }, { "code": "450500", "name": "北海市", "children": [ { "code": "450502", "name": "海城区" }, { "code": "450503", "name": "银海区" }, { "code": "450512", "name": "铁山港区" }, { "code": "450521", "name": "合浦县" } ] }, { "code": "450600", "name": "防城港市", "children": [ { "code": "450602", "name": "港口区" }, { "code": "450603", "name": "防城区" }, { "code": "450621", "name": "上思县" }, { "code": "450681", "name": "东兴市" } ] }, { "code": "450700", "name": "钦州市", "children": [ { "code": "450702", "name": "钦南区" }, { "code": "450703", "name": "钦北区" }, { "code": "450721", "name": "灵山县" }, { "code": "450722", "name": "浦北县" } ] }, { "code": "450800", "name": "贵港市", "children": [ { "code": "450802", "name": "港北区" }, { "code": "450803", "name": "港南区" }, { "code": "450804", "name": "覃塘区" }, { "code": "450821", "name": "平南县" }, { "code": "450881", "name": "桂平市" } ] }, { "code": "450900", "name": "玉林市", "children": [ { "code": "450902", "name": "玉州区" }, { "code": "450903", "name": "福绵区" }, { "code": "450921", "name": "容县" }, { "code": "450922", "name": "陆川县" }, { "code": "450923", "name": "博白县" }, { "code": "450924", "name": "兴业县" }, { "code": "450981", "name": "北流市" } ] }, { "code": "451000", "name": "百色市", "children": [ { "code": "451002", "name": "右江区" }, { "code": "451021", "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": "451100", "name": "贺州市", "children": [ { "code": "451102", "name": "八步区" }, { "code": "451103", "name": "平桂区" }, { "code": "451121", "name": "昭平县" }, { "code": "451122", "name": "钟山县" }, { "code": "451123", "name": "富川瑶族自治县" } ] }, { "code": "451200", "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": "451300", "name": "来宾市", "children": [ { "code": "451302", "name": "兴宾区" }, { "code": "451321", "name": "忻城县" }, { "code": "451322", "name": "象州县" }, { "code": "451323", "name": "武宣县" }, { "code": "451324", "name": "金秀瑶族自治县" }, { "code": "451381", "name": "合山市" } ] }, { "code": "451400", "name": "崇左市", "children": [ { "code": "451402", "name": "江州区" }, { "code": "451421", "name": "扶绥县" }, { "code": "451422", "name": "宁明县" }, { "code": "451423", "name": "龙州县" }, { "code": "451424", "name": "大新县" }, { "code": "451425", "name": "天等县" }, { "code": "451481", "name": "凭祥市" } ] } ] }, { "code": "460000", "name": "海南省", "children": [ { "code": "460100", "name": "海口市", "children": [ { "code": "460105", "name": "秀英区" }, { "code": "460106", "name": "龙华区" }, { "code": "460107", "name": "琼山区" }, { "code": "460108", "name": "美兰区" } ] }, { "code": "460200", "name": "三亚市", "children": [ { "code": "460202", "name": "海棠区" }, { "code": "460203", "name": "吉阳区" }, { "code": "460204", "name": "天涯区" }, { "code": "460205", "name": "崖州区" } ] }, { "code": "460300", "name": "三沙市", "children": [] }, { "code": "460400", "name": "儋州市", "children": [] } ] }, { "code": "500000", "name": "重庆市", "children": [ { "code": "500000", "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": "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": "510000", "name": "四川省", "children": [ { "code": "510100", "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": "510300", "name": "自贡市", "children": [ { "code": "510302", "name": "自流井区" }, { "code": "510303", "name": "贡井区" }, { "code": "510304", "name": "大安区" }, { "code": "510311", "name": "沿滩区" }, { "code": "510321", "name": "荣县" }, { "code": "510322", "name": "富顺县" } ] }, { "code": "510400", "name": "攀枝花市", "children": [ { "code": "510402", "name": "东区" }, { "code": "510403", "name": "西区" }, { "code": "510411", "name": "仁和区" }, { "code": "510421", "name": "米易县" }, { "code": "510422", "name": "盐边县" } ] }, { "code": "510500", "name": "泸州市", "children": [ { "code": "510502", "name": "江阳区" }, { "code": "510503", "name": "纳溪区" }, { "code": "510504", "name": "龙马潭区" }, { "code": "510521", "name": "泸县" }, { "code": "510522", "name": "合江县" }, { "code": "510524", "name": "叙永县" }, { "code": "510525", "name": "古蔺县" } ] }, { "code": "510600", "name": "德阳市", "children": [ { "code": "510603", "name": "旌阳区" }, { "code": "510604", "name": "罗江区" }, { "code": "510623", "name": "中江县" }, { "code": "510681", "name": "广汉市" }, { "code": "510682", "name": "什邡市" }, { "code": "510683", "name": "绵竹市" } ] }, { "code": "510700", "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": "510800", "name": "广元市", "children": [ { "code": "510802", "name": "利州区" }, { "code": "510811", "name": "昭化区" }, { "code": "510812", "name": "朝天区" }, { "code": "510821", "name": "旺苍县" }, { "code": "510822", "name": "青川县" }, { "code": "510823", "name": "剑阁县" }, { "code": "510824", "name": "苍溪县" } ] }, { "code": "510900", "name": "遂宁市", "children": [ { "code": "510903", "name": "船山区" }, { "code": "510904", "name": "安居区" }, { "code": "510921", "name": "蓬溪县" }, { "code": "510922", "name": "射洪县" }, { "code": "510923", "name": "大英县" } ] }, { "code": "511000", "name": "内江市", "children": [ { "code": "511002", "name": "市中区" }, { "code": "511011", "name": "东兴区" }, { "code": "511024", "name": "威远县" }, { "code": "511025", "name": "资中县" }, { "code": "511083", "name": "隆昌市" } ] }, { "code": "511100", "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": "511300", "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": "511400", "name": "眉山市", "children": [ { "code": "511402", "name": "东坡区" }, { "code": "511403", "name": "彭山区" }, { "code": "511421", "name": "仁寿县" }, { "code": "511423", "name": "洪雅县" }, { "code": "511424", "name": "丹棱县" }, { "code": "511425", "name": "青神县" } ] }, { "code": "511500", "name": "宜宾市", "children": [ { "code": "511502", "name": "翠屏区" }, { "code": "511503", "name": "南溪区" }, { "code": "511521", "name": "宜宾县" }, { "code": "511523", "name": "江安县" }, { "code": "511524", "name": "长宁县" }, { "code": "511525", "name": "高县" }, { "code": "511526", "name": "珙县" }, { "code": "511527", "name": "筠连县" }, { "code": "511528", "name": "兴文县" }, { "code": "511529", "name": "屏山县" } ] }, { "code": "511600", "name": "广安市", "children": [ { "code": "511602", "name": "广安区" }, { "code": "511603", "name": "前锋区" }, { "code": "511621", "name": "岳池县" }, { "code": "511622", "name": "武胜县" }, { "code": "511623", "name": "邻水县" }, { "code": "511681", "name": "华蓥市" } ] }, { "code": "511700", "name": "达州市", "children": [ { "code": "511702", "name": "通川区" }, { "code": "511703", "name": "达川区" }, { "code": "511722", "name": "宣汉县" }, { "code": "511723", "name": "开江县" }, { "code": "511724", "name": "大竹县" }, { "code": "511725", "name": "渠县" }, { "code": "511781", "name": "万源市" } ] }, { "code": "511800", "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": "511900", "name": "巴中市", "children": [ { "code": "511902", "name": "巴州区" }, { "code": "511903", "name": "恩阳区" }, { "code": "511921", "name": "通江县" }, { "code": "511922", "name": "南江县" }, { "code": "511923", "name": "平昌县" } ] }, { "code": "512000", "name": "资阳市", "children": [ { "code": "512002", "name": "雁江区" }, { "code": "512021", "name": "安岳县" }, { "code": "512022", "name": "乐至县" } ] }, { "code": "513200", "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": "513300", "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": "513400", "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": "520000", "name": "贵州省", "children": [ { "code": "520100", "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": "520200", "name": "六盘水市", "children": [ { "code": "520201", "name": "钟山区" }, { "code": "520203", "name": "六枝特区" }, { "code": "520221", "name": "水城县" }, { "code": "520281", "name": "盘州市" } ] }, { "code": "520300", "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": "520400", "name": "安顺市", "children": [ { "code": "520402", "name": "西秀区" }, { "code": "520403", "name": "平坝区" }, { "code": "520422", "name": "普定县" }, { "code": "520423", "name": "镇宁布依族苗族自治县" }, { "code": "520424", "name": "关岭布依族苗族自治县" }, { "code": "520425", "name": "紫云苗族布依族自治县" } ] }, { "code": "520500", "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": "520600", "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": "522300", "name": "黔西南布依族苗族自治州", "children": [ { "code": "522301", "name": "兴义市" }, { "code": "522322", "name": "兴仁县" }, { "code": "522323", "name": "普安县" }, { "code": "522324", "name": "晴隆县" }, { "code": "522325", "name": "贞丰县" }, { "code": "522326", "name": "望谟县" }, { "code": "522327", "name": "册亨县" }, { "code": "522328", "name": "安龙县" } ] }, { "code": "522600", "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": "522700", "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": "530000", "name": "云南省", "children": [ { "code": "530100", "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": "530300", "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": "530400", "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": "530500", "name": "保山市", "children": [ { "code": "530502", "name": "隆阳区" }, { "code": "530521", "name": "施甸县" }, { "code": "530523", "name": "龙陵县" }, { "code": "530524", "name": "昌宁县" }, { "code": "530581", "name": "腾冲市" } ] }, { "code": "530600", "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": "530700", "name": "丽江市", "children": [ { "code": "530702", "name": "古城区" }, { "code": "530721", "name": "玉龙纳西族自治县" }, { "code": "530722", "name": "永胜县" }, { "code": "530723", "name": "华坪县" }, { "code": "530724", "name": "宁蒗彝族自治县" } ] }, { "code": "530800", "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": "530900", "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": "532300", "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": "532500", "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": "532600", "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": "532800", "name": "西双版纳傣族自治州", "children": [ { "code": "532801", "name": "景洪市" }, { "code": "532822", "name": "勐海县" }, { "code": "532823", "name": "勐腊县" } ] }, { "code": "532900", "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": "533100", "name": "德宏傣族景颇族自治州", "children": [ { "code": "533102", "name": "瑞丽市" }, { "code": "533103", "name": "芒市" }, { "code": "533122", "name": "梁河县" }, { "code": "533123", "name": "盈江县" }, { "code": "533124", "name": "陇川县" } ] }, { "code": "533300", "name": "怒江傈僳族自治州", "children": [ { "code": "533301", "name": "泸水市" }, { "code": "533323", "name": "福贡县" }, { "code": "533324", "name": "贡山独龙族怒族自治县" }, { "code": "533325", "name": "兰坪白族普米族自治县" } ] }, { "code": "533400", "name": "迪庆藏族自治州", "children": [ { "code": "533401", "name": "香格里拉市" }, { "code": "533422", "name": "德钦县" }, { "code": "533423", "name": "维西傈僳族自治县" } ] } ] }, { "code": "540000", "name": "西藏自治区", "children": [ { "code": "540100", "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": "540200", "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": "540300", "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": "540400", "name": "林芝市", "children": [ { "code": "540402", "name": "巴宜区" }, { "code": "540421", "name": "工布江达县" }, { "code": "540422", "name": "米林县" }, { "code": "540423", "name": "墨脱县" }, { "code": "540424", "name": "波密县" }, { "code": "540425", "name": "察隅县" }, { "code": "540426", "name": "朗县" } ] }, { "code": "540500", "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": "540600", "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": "542500", "name": "阿里地区", "children": [ { "code": "542521", "name": "普兰县" }, { "code": "542522", "name": "札达县" }, { "code": "542523", "name": "噶尔县" }, { "code": "542524", "name": "日土县" }, { "code": "542525", "name": "革吉县" }, { "code": "542526", "name": "改则县" }, { "code": "542527", "name": "措勤县" } ] } ] }, { "code": "610000", "name": "陕西省", "children": [ { "code": "610100", "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": "610200", "name": "铜川市", "children": [ { "code": "610202", "name": "王益区" }, { "code": "610203", "name": "印台区" }, { "code": "610204", "name": "耀州区" }, { "code": "610222", "name": "宜君县" } ] }, { "code": "610300", "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": "610400", "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": "610500", "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": "610600", "name": "延安市", "children": [ { "code": "610602", "name": "宝塔区" }, { "code": "610603", "name": "安塞区" }, { "code": "610621", "name": "延长县" }, { "code": "610622", "name": "延川县" }, { "code": "610623", "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": "610700", "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": "610800", "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": "610900", "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": "611000", "name": "商洛市", "children": [ { "code": "611002", "name": "商州区" }, { "code": "611021", "name": "洛南县" }, { "code": "611022", "name": "丹凤县" }, { "code": "611023", "name": "商南县" }, { "code": "611024", "name": "山阳县" }, { "code": "611025", "name": "镇安县" }, { "code": "611026", "name": "柞水县" } ] } ] }, { "code": "620000", "name": "甘肃省", "children": [ { "code": "620100", "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": "620200", "name": "嘉峪关市", "children": [] }, { "code": "620300", "name": "金昌市", "children": [ { "code": "620302", "name": "金川区" }, { "code": "620321", "name": "永昌县" } ] }, { "code": "620400", "name": "白银市", "children": [ { "code": "620402", "name": "白银区" }, { "code": "620403", "name": "平川区" }, { "code": "620421", "name": "靖远县" }, { "code": "620422", "name": "会宁县" }, { "code": "620423", "name": "景泰县" } ] }, { "code": "620500", "name": "天水市", "children": [ { "code": "620502", "name": "秦州区" }, { "code": "620503", "name": "麦积区" }, { "code": "620521", "name": "清水县" }, { "code": "620522", "name": "秦安县" }, { "code": "620523", "name": "甘谷县" }, { "code": "620524", "name": "武山县" }, { "code": "620525", "name": "张家川回族自治县" } ] }, { "code": "620600", "name": "武威市", "children": [ { "code": "620602", "name": "凉州区" }, { "code": "620621", "name": "民勤县" }, { "code": "620622", "name": "古浪县" }, { "code": "620623", "name": "天祝藏族自治县" } ] }, { "code": "620700", "name": "张掖市", "children": [ { "code": "620702", "name": "甘州区" }, { "code": "620721", "name": "肃南裕固族自治县" }, { "code": "620722", "name": "民乐县" }, { "code": "620723", "name": "临泽县" }, { "code": "620724", "name": "高台县" }, { "code": "620725", "name": "山丹县" } ] }, { "code": "620800", "name": "平凉市", "children": [ { "code": "620802", "name": "崆峒区" }, { "code": "620821", "name": "泾川县" }, { "code": "620822", "name": "灵台县" }, { "code": "620823", "name": "崇信县" }, { "code": "620825", "name": "庄浪县" }, { "code": "620826", "name": "静宁县" }, { "code": "620881", "name": "华亭市" } ] }, { "code": "620900", "name": "酒泉市", "children": [ { "code": "620902", "name": "肃州区" }, { "code": "620921", "name": "金塔县" }, { "code": "620922", "name": "瓜州县" }, { "code": "620923", "name": "肃北蒙古族自治县" }, { "code": "620924", "name": "阿克塞哈萨克族自治县" }, { "code": "620981", "name": "玉门市" }, { "code": "620982", "name": "敦煌市" } ] }, { "code": "621000", "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": "621100", "name": "定西市", "children": [ { "code": "621102", "name": "安定区" }, { "code": "621121", "name": "通渭县" }, { "code": "621122", "name": "陇西县" }, { "code": "621123", "name": "渭源县" }, { "code": "621124", "name": "临洮县" }, { "code": "621125", "name": "漳县" }, { "code": "621126", "name": "岷县" } ] }, { "code": "621200", "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": "622900", "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": "623000", "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": "630000", "name": "青海省", "children": [ { "code": "630100", "name": "西宁市", "children": [ { "code": "630102", "name": "城东区" }, { "code": "630103", "name": "城中区" }, { "code": "630104", "name": "城西区" }, { "code": "630105", "name": "城北区" }, { "code": "630121", "name": "大通回族土族自治县" }, { "code": "630122", "name": "湟中县" }, { "code": "630123", "name": "湟源县" } ] }, { "code": "630200", "name": "海东市", "children": [ { "code": "630202", "name": "乐都区" }, { "code": "630203", "name": "平安区" }, { "code": "630222", "name": "民和回族土族自治县" }, { "code": "630223", "name": "互助土族自治县" }, { "code": "630224", "name": "化隆回族自治县" }, { "code": "630225", "name": "循化撒拉族自治县" } ] }, { "code": "632200", "name": "海北藏族自治州", "children": [ { "code": "632221", "name": "门源回族自治县" }, { "code": "632222", "name": "祁连县" }, { "code": "632223", "name": "海晏县" }, { "code": "632224", "name": "刚察县" } ] }, { "code": "632300", "name": "黄南藏族自治州", "children": [ { "code": "632321", "name": "同仁县" }, { "code": "632322", "name": "尖扎县" }, { "code": "632323", "name": "泽库县" }, { "code": "632324", "name": "河南蒙古族自治县" } ] }, { "code": "632500", "name": "海南藏族自治州", "children": [ { "code": "632521", "name": "共和县" }, { "code": "632522", "name": "同德县" }, { "code": "632523", "name": "贵德县" }, { "code": "632524", "name": "兴海县" }, { "code": "632525", "name": "贵南县" } ] }, { "code": "632600", "name": "果洛藏族自治州", "children": [ { "code": "632621", "name": "玛沁县" }, { "code": "632622", "name": "班玛县" }, { "code": "632623", "name": "甘德县" }, { "code": "632624", "name": "达日县" }, { "code": "632625", "name": "久治县" }, { "code": "632626", "name": "玛多县" } ] }, { "code": "632700", "name": "玉树藏族自治州", "children": [ { "code": "632701", "name": "玉树市" }, { "code": "632722", "name": "杂多县" }, { "code": "632723", "name": "称多县" }, { "code": "632724", "name": "治多县" }, { "code": "632725", "name": "囊谦县" }, { "code": "632726", "name": "曲麻莱县" } ] }, { "code": "632800", "name": "海西蒙古族藏族自治州", "children": [ { "code": "632801", "name": "格尔木市" }, { "code": "632802", "name": "德令哈市" }, { "code": "632803", "name": "茫崖市" }, { "code": "632821", "name": "乌兰县" }, { "code": "632822", "name": "都兰县" }, { "code": "632823", "name": "天峻县" } ] } ] }, { "code": "640000", "name": "宁夏回族自治区", "children": [ { "code": "640100", "name": "银川市", "children": [ { "code": "640104", "name": "兴庆区" }, { "code": "640105", "name": "西夏区" }, { "code": "640106", "name": "金凤区" }, { "code": "640121", "name": "永宁县" }, { "code": "640122", "name": "贺兰县" }, { "code": "640181", "name": "灵武市" } ] }, { "code": "640200", "name": "石嘴山市", "children": [ { "code": "640202", "name": "大武口区" }, { "code": "640205", "name": "惠农区" }, { "code": "640221", "name": "平罗县" } ] }, { "code": "640300", "name": "吴忠市", "children": [ { "code": "640302", "name": "利通区" }, { "code": "640303", "name": "红寺堡区" }, { "code": "640323", "name": "盐池县" }, { "code": "640324", "name": "同心县" }, { "code": "640381", "name": "青铜峡市" } ] }, { "code": "640400", "name": "固原市", "children": [ { "code": "640402", "name": "原州区" }, { "code": "640422", "name": "西吉县" }, { "code": "640423", "name": "隆德县" }, { "code": "640424", "name": "泾源县" }, { "code": "640425", "name": "彭阳县" } ] }, { "code": "640500", "name": "中卫市", "children": [ { "code": "640502", "name": "沙坡头区" }, { "code": "640521", "name": "中宁县" }, { "code": "640522", "name": "海原县" } ] } ] }, { "code": "650000", "name": "新疆维吾尔自治区", "children": [ { "code": "650100", "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": "650200", "name": "克拉玛依市", "children": [ { "code": "650202", "name": "独山子区" }, { "code": "650203", "name": "克拉玛依区" }, { "code": "650204", "name": "白碱滩区" }, { "code": "650205", "name": "乌尔禾区" } ] }, { "code": "650400", "name": "吐鲁番市", "children": [ { "code": "650402", "name": "高昌区" }, { "code": "650421", "name": "鄯善县" }, { "code": "650422", "name": "托克逊县" } ] }, { "code": "650500", "name": "哈密市", "children": [ { "code": "650502", "name": "伊州区" }, { "code": "650521", "name": "巴里坤哈萨克自治县" }, { "code": "650522", "name": "伊吾县" } ] }, { "code": "652300", "name": "昌吉回族自治州", "children": [ { "code": "652301", "name": "昌吉市" }, { "code": "652302", "name": "阜康市" }, { "code": "652323", "name": "呼图壁县" }, { "code": "652324", "name": "玛纳斯县" }, { "code": "652325", "name": "奇台县" }, { "code": "652327", "name": "吉木萨尔县" }, { "code": "652328", "name": "木垒哈萨克自治县" } ] }, { "code": "652700", "name": "博尔塔拉蒙古自治州", "children": [ { "code": "652701", "name": "博乐市" }, { "code": "652702", "name": "阿拉山口市" }, { "code": "652722", "name": "精河县" }, { "code": "652723", "name": "温泉县" } ] }, { "code": "652800", "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": "652900", "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": "653000", "name": "克孜勒苏柯尔克孜自治州", "children": [ { "code": "653001", "name": "阿图什市" }, { "code": "653022", "name": "阿克陶县" }, { "code": "653023", "name": "阿合奇县" }, { "code": "653024", "name": "乌恰县" } ] }, { "code": "653100", "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": "653200", "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": "654000", "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": "654200", "name": "塔城地区", "children": [ { "code": "654201", "name": "塔城市" }, { "code": "654202", "name": "乌苏市" }, { "code": "654221", "name": "额敏县" }, { "code": "654223", "name": "沙湾县" }, { "code": "654224", "name": "托里县" }, { "code": "654225", "name": "裕民县" }, { "code": "654226", "name": "和布克赛尔蒙古自治县" } ] }, { "code": "654300", "name": "阿勒泰地区", "children": [ { "code": "654301", "name": "阿勒泰市" }, { "code": "654321", "name": "布尔津县" }, { "code": "654322", "name": "富蕴县" }, { "code": "654323", "name": "福海县" }, { "code": "654324", "name": "哈巴河县" }, { "code": "654325", "name": "青河县" }, { "code": "654326", "name": "吉木乃县" } ] } ] }, { "code": "710000", "name": "台湾省", "children": [ { "code": "710000", "name": "台湾省", "children": [ { "code": "710000", "name": "台湾省" } ] } ] }, { "code": "810000", "name": "香港特别行政区", "children": [ { "code": "810000", "name": "香港特别行政区", "children": [ { "code": "810000", "name": "香港特别行政区" } ] } ] }, { "code": "820000", "name": "澳门特别行政区", "children": [ { "code": "820000", "name": "澳门特别行政区", "children": [ { "code": "820000", "name": "澳门特别行政区" } ] } ] } ] ================================================ FILE: src/const/columnTypeList.js ================================================ /** * 数值 支持查询条件(等于 大于 小于 大于等于 小于等于 区间) **/ const NUMBER_QUERY_TYPE = ['EQ', 'NE', 'GT', 'GE', 'LT', 'LE', 'BETWEEN'] const VARCHAR_QUERY_TYPE = ['LIKE', 'LIKE_LEFT', 'LIKE_RIGHT', 'EQ'] export const columnTypeList = [ {label:'varchar',value:'varchar', type: 'input', isSearch: true, isSenior: true, limit: VARCHAR_QUERY_TYPE}, {label:'bit',value:'bit', type: 'switch', isSearch: true, isSenior: false, isEnum: false}, {label:'char',value:'char',type: 'input', isSearch: false, isSenior: false, isEnum: false}, {label:'tinyblob',value:'tinyblob', type: 'textarea', isSearch: false, isSenior: false, isEnum: false}, {label:'tinytext',value:'tinytext', type: 'textarea', isSearch: true, isSenior: true, limit: VARCHAR_QUERY_TYPE}, {label:'text',value:'text', type: 'textarea', isSearch: true, isSenior: true, limit: VARCHAR_QUERY_TYPE}, {label:'mediumblob',value:'mediumblob', type: 'textarea', isSearch: false, isSenior: false, isEnum: false}, {label:'longblob',value:'longblob', type: 'textarea', isSearch: false, isSenior: false, isEnum: false}, {label:'longtext',value:'longtext', type: 'textarea', isSearch: true, isSenior: true, limit: VARCHAR_QUERY_TYPE}, {label:'tinyint',value:'tinyint', type: 'inputNumber', num: 'int', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'smallint',value:'smallint', type: 'inputNumber', num: 'int', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'mediumint',value:'mediumint', type: 'inputNumber', num: 'int', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'int',value:'int', type: 'inputNumber', num: 'int', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'integer',value:'integer', type: 'inputNumber', num: 'int', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'year',value:'year', type: 'datePicker', datetype: 'year', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'bigint',value:'bigint', type: 'inputNumber', num: 'int', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'float',value:'float', type: 'inputNumber', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'double',value:'double', type: 'inputNumber', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'decimal',value:'decimal', type: 'inputNumber', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'date',value:'date', type: 'datePicker', datetype: 'date', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'time',value:'time', type: 'timePicker', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'datetime',value:'datetime', type: 'datePicker', datetype: 'datetime', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'timestamp',value:'timestamp', type: 'datePicker', datetype: 'datetime', isSearch: true, isSenior: false, limit: NUMBER_QUERY_TYPE}, {label:'enum',value:'enum', type: '', isSearch: true, isSenior: true, isEnum: true, limit: ['EQ']}, ] ================================================ FILE: src/const/const.js ================================================ import { Base64 } from 'js-base64' export const scope = "server"; export const client_id = "knowledge"; export const client_secret = "knowledge"; export const grant_type = "password"; let baseKey = Base64.encode(client_id) export const enCodeKey = baseKey.length == 16 ? baseKey : ( baseKey.length > 16 ? // 大于16位截取前16 (baseKey.slice(0, 16)) : // 小于16末尾补0 (get16LenString(baseKey)) ) let baseDecode = Base64.encode('jvs') export const deCodeKey = baseDecode.length == 16 ? baseDecode : ( baseDecode.length > 16 ? // 大于16位截取前16 (baseDecode.slice(0, 16)) : // 小于16末尾补0 (get16LenString(baseDecode)) ) function get16LenString (str) { let len = 16 - str.length for(let i = 0; i < len; i++) { str += '0' } return str } ================================================ FILE: src/const/errorCode.js ================================================ export default { '000': '操作太频繁,请勿重复请求', 'default': '系统未知错误,请反馈给管理员' } ================================================ FILE: src/const/iconList.js ================================================ export default [ { label: '图标', list: [ 'icon-quanxianguanli', 'icon-yonghuguanli', 'icon-jiaoseguanli', 'icon-web-icon-', 'icon-xitongguanli', 'icon-rizhiguanli', 'icon-navicon-zdgl', 'icon-weibiaoti46', 'icon-miyue', 'icon-shouji', 'icon-denglvlingpai', 'icon-luyou', 'icon-msnui-supervise', 'icon-server', 'icon-wendang', 'icon-gtsquanjushiwufuwuGTS', 'icon-caidanguanli', 'icon-guanwang', 'icon-guanwangfangwen', 'icon-guiji', 'icon-fensiguanli', 'icon-gongzhonghao', 'icon-anniu_weixincaidanlianjie', 'icon-weixincaidan', 'icon-xiaoxiguanli', 'icon-zhexiantu', 'icon-canshu', 'icon-erji-zuhushouye', 'icon-pay6zhifu', 'icon-zhifuqudaoguanli', 'icon-dingdan', 'icon-tuikuan', 'icon-webicon14', 'icon-shouyintai', 'icon-wenjianguanli', 'icon-mysql', 'icon-shejiyukaifa-', 'icon-record', 'icon-biaodanbiaoqian' ] } ] ================================================ FILE: src/const/iconfont.js ================================================ export default [ 'icon-caizhengting', 'icon-caidanguanli4', 'icon-daiban1', 'icon-daibandengdaishenhe', 'icon-caidanguanli', 'icon-caidanguanli3', 'icon-daiban', 'icon-daiban2', 'icon-daiyanshou', 'icon-danwei3', 'icon-danwei4', 'icon-danwei2', 'icon-danwei1', 'icon-fankui1', 'icon-fankui2', 'icon-faqipingshen', 'icon-danwei5', 'icon-fankui', 'icon-danwei', 'icon-fangan3', 'icon-caidanguanli5', 'icon-fangan1', 'icon-feiyong2', 'icon-fangan2', 'icon-fangan', 'icon-feiyong1', 'icon-fuhe1', 'icon-fuhe3', 'icon-fuhe', 'icon-feiyongtongji1', 'icon-fangan4', 'icon-feiyong', 'icon-gongzuotai', 'icon-gongshi2', 'icon-gongshi', 'icon-feiyongtongji', 'icon-huibao1', 'icon-fuhe2', 'icon-jilu1', 'icon-jilu', 'icon-huibaoxian', 'icon-jilu3', 'icon-jiaose', 'icon-gongshi1', 'icon-huibao', 'icon-huiyiyonghuzuzhijigou-07', 'icon-jiaoseguanli', 'icon-jilu4', 'icon--jiaoseguanli', 'icon-jilu2', 'icon-jiaose1', 'icon-jingfeibaozhang', 'icon-jiaohuan', 'icon-lixiang1', 'icon-jingfeiguanli-01', 'icon-jingfeizhihang', 'icon-leibie', 'icon-lixiang2', 'icon-liucheng11', 'icon-liucheng3', 'icon-liucheng1', 'icon-jingfei', 'icon-lixiang', 'icon-liucheng2', 'icon-liuchengmoxing', 'icon-liucheng', 'icon-lixiangshenqing', 'icon-pingshen1', 'icon-pingshen', 'icon-liucheng4', 'icon-pingshenjilu1', 'icon-pingshenjilu', 'icon-pingshenjihua', 'icon-pingshenzhuanjiaguanli', 'icon-pingshentongguo', 'icon-qingsuanchuli', 'icon-qingjia3', 'icon-pingshenzhuanjiaku', 'icon-pingshenjieguoguanli2x', 'icon-qingjia2', 'icon-qingjia', 'icon-qingsuanguanli', 'icon-qingjia1', 'icon-quanxianguanli2', 'icon-quanxian', 'icon-quanxianguanli1', 'icon-quanxianguanli3', 'icon-quanxianguanli', 'icon-quanxianguanli4', 'icon-rizhiguanli1', 'icon-quanxianguanli5', 'icon-rizhiguanli2', 'icon-rizhiguanli3', 'icon-rizhiguanli4', 'icon-rizhiguanli', 'icon-shenqing2', 'icon-sangongjingfei', 'icon-rizhiguanli5', 'icon-shenqing11', 'icon-shensu', 'icon-shensu1', 'icon-shenqing', 'icon-shenchaguizeguanli', 'icon-shensu2', 'icon-shenqing1', 'icon-shenhe1', 'icon-shencha', 'icon-shenhe3', 'icon-shenhe4', 'icon-shenhe2', 'icon-shenhe8', 'icon-shenhe6', 'icon-shenhe7', 'icon-shenhe5', 'icon-shenhe12', 'icon-shenhe9', 'icon-shenhe', 'icon-shenhe11', 'icon-shenheliebiao1', 'icon-shenhe10', 'icon-shixin1', 'icon-shouli', 'icon-tianxie2', 'icon-shenheliebiao', 'icon-tianxie1', 'icon-tongji1', 'icon-tongji5', 'icon-tianxie3', 'icon-tongji4', 'icon-tongji2', 'icon-tongji6', 'icon-tongji', 'icon-shixin', 'icon-tongji9', 'icon-tianxie', 'icon-tongji7', 'icon-tongji8', 'icon-weijieqingshenheliebiao', 'icon-wenjian-fangan', 'icon-xitongguanli1', 'icon-tongji3', 'icon-xitongguanli2', 'icon-wanjie', 'icon-xitongguanli3', 'icon-xitongguanli4', 'icon-xitongguanli', 'icon-xitongguanli5', 'icon-xiangmu', 'icon-xiangmuguochengguanli', 'icon-xiangmu1', 'icon-xiangmu2', 'icon-xinzeng1', 'icon-xiangmu3', 'icon-xinzeng4', 'icon-xinzeng2', 'icon-xinzeng', 'icon-xinxichaxun2', 'icon-xitongshezhi', 'icon-xinxichaxun1', 'icon-xinzeng3', 'icon-xinxichaxun4', 'icon-xinxichaxun', 'icon-xinxichaxun3', 'icon-xinxichaxun5', 'icon-xinyong', 'icon-yanshou1', 'icon-xinyongguanli', 'icon-yanshou2', 'icon-xinyongka', 'icon-xinyongguanli1', 'icon-xinyongzheng', 'icon-yanshou3', 'icon-yanshoufanganshenhe', 'icon-yonghuguanli1', 'icon-yanshou', 'icon-yonghuguanli2', 'icon-yonghuguanli', 'icon-zhengshuguanli', 'icon-zhengshuguanli2', 'icon-zhengshuguanli3', 'icon-zhengshuguanli1', 'icon-zhinan', 'icon-zhongzhi2', 'icon-zhengshuguanli4', 'icon-zhongzhi1', 'icon-zhongzhi', 'icon-zhuanjiao1', 'icon-zhuanjia', 'icon-zhuanjiao', 'icon-zidianguanli1', 'icon-zhuanjiao2', 'icon-zidianguanli2', 'icon-zuzhijigou1', 'icon-zidianguanli4', 'icon-zidianguanli5', 'icon-zuzhijigou', 'icon-zidianguanli3', 'icon-zidianguanli', 'icon-zuzhijigou2', 'icon-zuixinwanjie', 'icon-zidianguanli6', 'icon-fuhe1-copy', 'icon-2zuzhi-xiangmuguanli', 'icon-xx__wanjie', 'icon-007tongji', 'icon-bianzhi1', 'icon-g-shenhe', 'icon-bianzhi', 'icon-caiwu2', 'icon-caiwu1', 'icon-caiwu', 'icon-caizhengzuhu', 'icon-caidanguanli2', 'icon-caidanguanli1', 'icon-caizhengyusuanjiandu1', ] ================================================ FILE: src/const/systemIcon.js ================================================ export default [ "icon-tishi", "icon-tishi1", "icon-xiaoxi", "icon-icon-operation", "icon-xiaoxi1", "icon-display", "icon-xiaoxi2", "icon-xiaoxi3", "icon-xiala", "icon-qidong", "icon-ShapeCopy", "icon-weibiaoti--", "icon-tishi2", "icon-cha", "icon-shezhi", "icon-daima", "icon-baocun_mian", "icon-daima1", "icon-dingshi", "icon-diannao", "icon-diannao-copy", "icon-baocun", "icon-chahao", "icon-qidong1", "icon-baocun1", "icon-fasong", "icon-qidong2", "icon-cha1", "icon-dingshi1", "icon-shezhi1", "icon-tishi11", "icon-shengxu", "icon-jiantou1", "icon-zu3-copy", "icon-shezhi2", "icon-shezhi21", "icon-baocun2", "icon-fanhui", "icon-shezhi3", "icon-shezhi_mian", "icon-fasong1", "icon-right", "icon-fenxiang", "icon-shezhi4", "icon-fanhui2", "icon-daima2", "icon-fenxiang1", "icon-fanhui1", "icon-xiala1", "icon-fasongyoujian", "icon-ai-code", "icon-ip", "icon-shoujiguishudi", "icon-leidatu", "icon-sandiantu", "icon-HTTP", "icon-random", "icon-zuixinICON--", "icon-jiami", "icon-SQLchaxun", "icon-wangluojiance", "icon-fasongduanxin", "icon-erweima", "icon-IP", "icon-tiaoxingtu", "icon-tubiaozhuzhuangtu", "icon-fasongyoujian1", "icon-suiji", "icon-zhuzhuangtutubiao", "icon-IP1", "icon-leidatu1", "icon-mianjitu", "icon-fasongyoujian2", "icon-shouji", "icon-mianjitu1", "icon-tiaoxingtu1", "icon-suiji1", "icon-http", "icon-ico", "icon-SQLchaxun1", "icon-shujutubiaobingtu-", "icon-suiji2", "icon-shujutubiaobingtu-1", "icon-tubiao1", "icon-lingyitaotubiao-2-60", "icon-fasongduanxin1", "icon-fasongyoujian3", "icon-tubiaozhu", "icon-http1", "icon-jiamizhihangshujujiami", "icon-leidatu2", "icon-Http", "icon-tubiao_HL", "icon-tubiaozhexiantu", "icon-qrcode", "icon-shujujiami", "icon-sandiantu1", "icon-tubiaobingtu", "icon-danhangwenben1", "icon-fuwenben1", "icon-shangchuanwenjian3", "icon-wenjian-01", "icon-xuanxiangka2", "icon-weihujishuqileixing", "icon-xuanze4", "icon-time-circle-fill", "icon-gudingshijian1", "icon-lianjie3", "icon-duoxuanxuanze", "icon-gangwei1", "icon-fuwenbenbianjiqi_wenben", "icon-shangchuantupian", "icon-huakuai1", "icon-diqu4", "icon-wenjian3", "icon-danhangwenben", "icon-shangchuan1", "icon-shijian1", "icon-wenjian4", "icon-tubiaoxuanze", "icon-shangchuanwenjian4", "icon-add-fill-hover", "icon-shangchuan2", "icon-shangchuan3", "icon-jishuqi", "icon-jilianxuanzeqi", "icon-riqi2", "icon-duohangwenben", "icon-shijian", "icon-ic_fengexian", "icon-gangwei2", "icon-duohangwenben1", "icon-switch-close", "icon-tupian", "icon-wangye4", "icon-jilianxuanze", "icon-wenzi", "icon-rili11", "icon-shijian2", "icon-jishuqi1", "icon-shiliangzhinengduixiang", "icon-shangchuan4", "icon-shangchuantupian1", "icon-wenjian5", "icon-form", "icon-guan", "icon-shangchuan5", "icon-jiaose2", "icon-gangwei3", "icon-xuanze11", "icon-yanse2", "icon-tupian1", "icon-jiaosexuanze1", "icon-tupian-copy", "icon-cf-c02", "icon-yanse", "icon-xuanze", "icon-wangye", "icon-biaoge", "icon-lianjie", "icon-huakuai", "icon-miaoshu", "icon-colour", "icon-iconfontoptionbutton", "icon-yanse1", "icon-wangye1", "icon-jiahao", "icon-lianjie1", "icon-diqu", "icon-diqu1", "icon-department", "icon-user", "icon-file", "icon-wenjian", "icon-tubiao", "icon-yonghu", "icon-riqi", "icon-fengexian", "icon-xialakuang", "icon-shangchuanwenjian", "icon-fuwenben", "icon-wenjian1", "icon-jiaose", "icon-xialakuang1", "icon-gangwei", "icon-xialakuangbiaodan", "icon-xuanze1", "icon-xiaobiaoti", "icon-huakuai-kai", "icon-tubiao_xuanze", "icon-diqu2", "icon-shangchuan", "icon-diqu3", "icon-duoxuanxuan", "icon-xialakuang2", "icon-wenjian2", "icon-guan-copy", "icon-lujing", "icon-miaoshu1", "icon-AntdVueCascader", "icon-wangye2", "icon-xuanze2", "icon-xuanxiangka", "icon-riqi1", "icon-tianjiajiahaowubiankuang", "icon-gudingshijian", "icon-iconfontoptionbutton1", "icon-shangchuanwenjian1", "icon-shangchuanwenjian2", "icon-xuanxiangka1", "icon-xuanzhong", "icon-miaoshukuangzengjia", "icon-danhang", "icon-duohangwenbenxiawu50021", "icon--tainjia", "icon-wangye3", "icon-lianjie2", "icon-xiaobiaoti1", "icon-huakuaiti", "icon-iconfontoptionbutton11", "icon-bumenxuanze", "icon-jiaosexuanze", "icon-jiaose1", "icon-xuanze3", "icon-28fuwenbenkuang" ] ================================================ FILE: src/const/website.js ================================================ export default { title: '文档', logo: '菜单', key: 'jvs', //配置主键,目前用于存储 indexTitle: '文档', whiteList: ['/login', '/404', '/401', '/lock'], // 配置无权限可以访问的页面 whiteTagList: ['/login', '/404', '/401', '/lock' ], // 配置不添加tags页面 ('/advanced-router/mutative-detail/*'——*为通配符) lockPage: '/lock', tokenTime: 6000, infoTitle: '文档', statusWhiteList: [428], // 配置首页不可关闭 isFirstPage: false, fistPage: { label: '首页', value: '/wel/index', params: {}, query: {}, group: [], close: false }, // 配置菜单的属性 menu: { props: { label: 'label', path: 'path', icon: 'icon', } } } ================================================ FILE: src/error.js ================================================ import Vue from 'vue' Vue.config.errorHandler = function (err, vm, info) { Vue.nextTick(() => { if (process.env.NODE_ENV === 'development') { console.group('>>>>>> 错误信息 >>>>>>') console.log(info) console.groupEnd() console.group('>>>>>> Vue 实例 >>>>>>') console.log(vm) console.groupEnd() console.group('>>>>>> Error >>>>>>') console.log(err) console.groupEnd() } }) } ================================================ FILE: src/filters/index.js ================================================ function pluralize (time, label) { if (time === 1) { return time + label } return time + label + 's' } /** * 日期格式化 */ export function dateFormat (date, type) { let format = 'yyyy-MM-dd hh:mm:ss' if(type) { format = type } if(typeof date == 'string') { return date } if (date != 'Invalid Date') { var o = { 'M+': date.getMonth() + 1, // month 'd+': date.getDate(), // day 'h+': date.getHours(), // hour 'm+': date.getMinutes(), // minute 's+': date.getSeconds(), // second 'q+': Math.floor((date.getMonth() + 3) / 3), // quarter 'S': date.getMilliseconds() // millisecond } if (/(y+)/.test(format)) { format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) } for (var k in o) { if (new RegExp('(' + k + ')').test(format)) { format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)) } } return format } return '' } export function timeAgo (time) { const between = Date.now() / 1000 - Number(time) if (between < 3600) { return pluralize(~~(between / 60), ' minute') } else if (between < 86400) { return pluralize(~~(between / 3600), ' hour') } else { return pluralize(~~(between / 86400), ' day') } } export function parseTime (time, cFormat) { if (arguments.length === 0) { return null } if ((time + '').length === 10) { time = +time * 1000 } const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' let date if (typeof time === 'object') { date = time } else { date = new Date(parseInt(time)) } const formatObj = { y: date.getFullYear(), m: date.getMonth() + 1, d: date.getDate(), h: date.getHours(), i: date.getMinutes(), s: date.getSeconds(), a: date.getDay() } const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { let value = formatObj[key] if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1] if (result.length > 0 && value < 10) { value = '0' + value } return value || 0 }) return time_str } export function formatTime (time, option) { time = +time * 1000 const d = new Date(time) const now = Date.now() const diff = (now - d) / 1000 if (diff < 30) { return '刚刚' } else if (diff < 3600) { // less 1 hour return Math.ceil(diff / 60) + '分钟前' } else if (diff < 3600 * 24) { return Math.ceil(diff / 3600) + '小时前' } else if (diff < 3600 * 24 * 2) { return '1天前' } if (option) { return parseTime(time, option) } else { return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分' } } /* 数字 格式化 */ export function nFormatter (num, digits) { const si = [ { value: 1E18, symbol: 'E' }, { value: 1E15, symbol: 'P' }, { value: 1E12, symbol: 'T' }, { value: 1E9, symbol: 'G' }, { value: 1E6, symbol: 'M' }, { value: 1E3, symbol: 'k' } ] for (let i = 0; i < si.length; i++) { if (num >= si[i].value) { return (num / si[i].value + 0.1).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol } } return num.toString() } export function html2Text (val) { const div = document.createElement('div') div.innerHTML = val return div.textContent || div.innerText } export function toThousandslsFilter (num) { return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ',')) } /* 字典 格式化 */ export function dicFormat (val, options, props) { let temp = '' temp = val for(let i in options) { if(options[i][(props && props.value) || 'value'] == val) { temp = options[i][(props && props.label) || 'label'] } } return temp } ================================================ FILE: src/main.js ================================================ import 'babel-polyfill' import 'classlist-polyfill' import Vue from 'vue' import axios from './router/axios' import VueAxios from 'vue-axios' import App from './App' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import './permission' // 权限 import './error' // 日志 import router from './router/router' import store from './store' import { loadStyle } from './util/util' import { declare } from '@/views/common/draw' import permissionMatch from './util/permision' import openUrl from './util/url' import loginForm from './util/login' import * as urls from '@/config/env' import { iconfontUrl, iconfontVersion } from '@/config/env' import * as filters from './filters' // 全局filter import './styles/common.scss' import './styles/resetAll.scss' // fixme 统一表单表格样式,自定义需要注释此代码 import './styles/reset2.0.scss' // 2.0版本ui迭代 import JsonViewer from 'vue-json-viewer' import VueClipboard from 'vue-clipboard2' import { ElementTiptapPlugin } from 'element-tiptap'; import 'element-tiptap/lib/index.css'; Vue.use(VueClipboard) /** * 全局注册容器、组件 * 不可删除,添加全局组件引用请修改index.js */ import './components/index' import basicContainer from "@/components/basic-container/main"; // 注册全局容器 Vue.component("basicContainer", basicContainer); Vue.prototype.$openLogin = loginForm.install Vue.use(VueAxios, axios) Vue.use(ElementUI, { size: 'medium', menuType: 'text' }) Vue.use(JsonViewer) Vue.use(router) Vue.use(permissionMatch) // 权限 Vue.use(openUrl) // 打开链接 用于 预览、下载、打开地址 Vue.use(ElementTiptapPlugin, { lang: 'zh', }); // 加载相关url地址 Object.keys(urls).forEach(key => { Vue.prototype[key] = urls[key] }) //加载过滤器 Object.keys(filters).forEach(key => { Vue.filter(key, filters[key]) }) // 动态加载阿里云字体库 iconfontVersion.forEach(ele => { loadStyle(iconfontUrl.replace('$key', ele)) }) declare() Vue.config.productionTip = false new Vue({ router, store, render: h => h(App), data: { eventBus: new Vue() } }).$mount('#app') ================================================ FILE: src/permission.js ================================================ /** * 全站权限配置 * */ import router from './router/router' import store from '@/store' import {validatenull} from '@/util/validate' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style import PageRouter from './router/page/' import ViewsRouter from './router/views/' NProgress.configure({showSpinner: false}) const RList = [...PageRouter, ...ViewsRouter] /** * 导航守卫,相关内容可以参考: * https://router.vuejs.org/zh/guide/advanced/navigation-guards.html */ router.beforeEach((to, from, next) => { // 缓冲设置 if (to.meta.keepAlive === true && store.state.tags.tagList.some(ele => { return ele.value === to.fullPath })) { to.meta.$keepAlive = true } else { NProgress.start() if (to.meta.keepAlive === true && validatenull(to.meta.$keepAlive)) { to.meta.$keepAlive = true } else { to.meta.$keepAlive = false } } // 未配置的路由跳转404 const value = to.query.src || to.fullPath if(!validatenull(value)) { let bool = false for(let i in RList) { if(RList[i].path == value || RList[i].path == value.split('?')[0]) { bool = true } } if(bool) { next() }else{ next('/404') } } }) router.afterEach(() => { NProgress.done() const title = store.getters.tag.label router.$jvsRouter.setTitle(title) }) ================================================ FILE: src/router/axios.js ================================================ import { serialize, noEmptyOfObject } from "@/util/util"; import { getStore } from "../util/store"; import NProgress from "nprogress"; // progress bar import errorCode from "@/const/errorCode"; import router from "@/router/router"; import { Message } from "element-ui"; import "nprogress/nprogress.css"; import store from "@/store"; // progress bar style import { decryption } from "@/util/util"; import {deCodeKey} from "@/const/const"; import eventBus from "@/util/eventBus"; axios.defaults.timeout = 30000; // 返回其他状态吗 axios.defaults.validateStatus = function(status) { return status >= 200 && status <= 500; // 默认的 }; // 跨域请求,允许保存cookie axios.defaults.withCredentials = true; // NProgress Configuration NProgress.configure({ showSpinner: false }); let countTime = 0 const freshTokenUrl = '/auth/oauth/token' let currentRoutePath = '' // 当前路由 let lastUrl = '' const whiteApi = ['/auth/token/logout'] // HTTPrequest拦截 axios.interceptors.request.use( config => { NProgress.start(); // start progress bar const isToken = (config.headers || {}).isToken === false; let token = store.getters.access_token; if (token && !isToken) { config.headers["Authorization"] = 'Bearer ' + token; } // headers中配置serialize为true开启序列化 if (config.methods === "post" && config.headers.serialize) { config.data = serialize(config.data); delete config.data.serialize; } // 去除空值参数 if (config.params) { config.params = noEmptyOfObject(config.params) } if (config.data) { config.data = noEmptyOfObject(config.data) } return config; }, error => { return Promise.reject(error); } ); // HTTPresponse拦截 axios.interceptors.response.use( res => { NProgress.done(); const status = Number(res.status) || 200; const message = res.data.msg || errorCode[status] || errorCode["default"]; if (status === 401) { store.dispatch("LogOut").then(() => { if(router.currentRoute && router.currentRoute.path != '/index') { router.push({ path: "/index" }); } }); return; } if (status !== 200 || res.data.code === 1) { if(res.config.url == freshTokenUrl) { if(res.config.params && !res.config.params.switch) { Message({ message: message, type: "error" }); } }else{ Message({ message: message, type: "error" }); } return Promise.reject(new Error(message)); } if(res.data && res.data.code === -2) { if(res.config && whiteApi.indexOf(res.config.url) > -1) { store.dispatch("LogOut").then(() => { sessionStorage.setItem('lastUrl', lastUrl) if(router.currentRoute && router.currentRoute.path != '/index') { router.push({ path: "/index" }); } eventBus.$emit('loginEvent', 'loginOut') }); }else{ countTime += 1 } let cancelArr = window.axiosCancel; for(let i in cancelArr) { delete window.axiosCancel[i] } if(countTime == 1) { sessionStorage.setItem('lastUrl', lastUrl) store.dispatch('RefreshToken', store.getters.tenantId).then(res => { // console.log(res) location.reload() }).catch(e => { store.dispatch("LogOut").then(() => { sessionStorage.setItem('lastUrl', lastUrl) if(router.currentRoute && router.currentRoute.path != '/index') { router.push({ path: "/index" }); } eventBus.$emit('loginEvent', 'loginOut') }); }) } return res }else{ if(res.config && res.config.url === '/mgr/jvs-auth/index/menu/frame' && res.data && res.data.code != 0) { store.dispatch("LogOut").then(() => { sessionStorage.setItem('lastUrl', lastUrl) if(router.currentRoute && router.currentRoute.path != '/index') { router.push({ path: "/index" }); } eventBus.$emit('loginEvent', 'loginOut') }); }else{ if(res.data && res.data.code == -1) { Message({ message: message, type: "error" }); return Promise.reject(new Error(message)); }else{ if(res.config && res.config.url && res.config.url.startsWith('/mgr') && typeof res.data.data == 'string') { let tp = { data: res.data.data } let temp = decryption({ data: tp, key: deCodeKey, param: ["data"] }); res.data.data = JSON.parse(temp.data) } return res; } } } }, error => { NProgress.done(); return Promise.reject(new Error(error)); // return Promise.reject(new Error("fail")).then(resolved, rejected); } ); export default axios; ================================================ FILE: src/router/jvs-router.js ================================================ import Axios from "axios"; let RouterPlugin = function() { this.$router = null; this.$store = null; }; RouterPlugin.install = function(router, store) { this.$router = router; this.$store = store; function objToform(obj) { let result = []; Object.keys(obj).forEach(ele => { result.push(`${ele}=${obj[ele]}`); }); return result.join("&"); } this.$router.$jvsRouter = { // 全局配置 $website: this.$store.getters.website, $defaultTitle: "业务系统", routerList: [], group: "", safe: this, setTitle: function(title) { //TODO 设置标题 }, closeTag: value => { const tag = value || this.$store.getters.tag; this.$store.commit("DEL_TAG", tag); }, // 处理路由 getPath: function(params) { let { src } = params; let result = src || "/"; if (src.includes("http") || src.includes("https")) { result = `/myiframe/urlPath?${objToform(params)}`; } return result; }, // 正则处理路由 vaildPath: function(list, path) { let result = false; list.forEach(ele => { if (new RegExp("^" + ele + ".*", "g").test(path)) { result = true; } }); return result; }, // 设置路由值 getValue: function(route) { let value = ""; if (route.query.src) { value = route.query.src; } return value; }, // 动态路由 formatRoutes: function(aMenu = [], first) { const aRouter = []; const propsConfig = this.$website.menu.props; const propsDefault = { label: propsConfig.label || "label", src: propsConfig.src || "src", icon: propsConfig.icon || "icon" }; if (aMenu.length === 0) return; for (let i = 0; i < aMenu.length; i++) { const oMenu = aMenu[i]; this.routerList = [] if (this.routerList.includes(oMenu[propsDefault.path])) return; const path = (() => { if (first) { return oMenu[propsDefault.path].replace("/index", ""); } else { return oMenu[propsDefault.path]; } })(); const name = oMenu[propsDefault.label]; const icon = oMenu[propsDefault.icon]; const oRouter = { path: path, component(resolve) { // 判断是否为首路由 // if (first) { // require(["../page/index"], resolve); // } }, name: name, icon: icon, redirect: (() => { if (!isChild && first) return `${path}/index`; else return ""; })(), }; aRouter.push(oRouter); } if (first) { if (!this.routerList.includes(aRouter[0][propsDefault.path])) { this.safe.$router.addRoutes(aRouter); this.routerList.push(aRouter[0][propsDefault.path]); } } else { return aRouter; } } }; }; export default RouterPlugin; ================================================ FILE: src/router/page/index.js ================================================ export default [ { path: '/404', component: () => import ( /* webpackChunkName: "page" */ '@/components/error-page/404'), name: '404', meta: { keepAlive: true, isTab: false, isAuth: false } }, { path: '/login/callback', component: () => import ( /* webpackChunkName: "page" */ '@/views/main/wx/login'), name: '微信扫码登录', meta: { keepAlive: true, isTab: false, isAuth: false } } ] ================================================ FILE: src/router/router.js ================================================ import Vue from 'vue' import VueRouter from 'vue-router' import jvsRouter from './jvs-router' import Store from '../store/' import PageRouter from './page/' import ViewsRouter from './views/' Vue.use(VueRouter) let Router = new VueRouter({ // mode: 'history', scrollBehavior (to, from, savedPosition) { if (savedPosition) { return savedPosition } else { if (from.meta.keepAlive) { from.meta.savedPosition = document.body.scrollTop } return { x: 0, y: to.meta.savedPosition || 0 } } }, routes: [].concat([]) }) jvsRouter.install(Router, Store) let routerTemp = [...ViewsRouter] // 发送本地路由到服务端 let temp = [] for(let i in routerTemp) { temp.push({ name: routerTemp[i].name, url: routerTemp[i].path }) } sessionStorage.setItem('routerList', JSON.stringify(temp)) Router.addRoutes([...routerTemp, ...PageRouter]) export default Router ================================================ FILE: src/router/views/index.js ================================================ export default [ { path: "/page", name: "首页", component: () => import(/* webpackChunkName: "page" */ "@/views/index/page"), meta: { keepAlive: true, isTab: false, isAuth: false } }, { path: '/', name: '首页', redirect: '/index' }, { path: "/index", name: "首页", component: () =>import(/* webpackChunkName: "page" */ "@/views/index/index"), meta: { keepAlive: true, isTab: false, isAuth: false } }, { path: "/view", name: "预览", component: () => import(/* webpackChunkName: "page" */ "@/views/view/index"), meta: { keepAlive: true, isTab: false, isAuth: false } }, { path: "/catalogview", name: "目录", component: () => import(/* webpackChunkName: "page" */ "@/views/catalogview/index.vue"), meta: { keepAlive: true, isTab: false, isAuth: false } }, { path: "/info", name: "详情", component: () => import(/* webpackChunkName: "page" */ "@/views/info/index.vue"), meta: { keepAlive: true, isTab: false, isAuth: false } }, { path: "/company", name: "企业信息", component: () => import(/* webpackChunkName: "page" */ "@/views/companyInfo/index.vue"), meta: { keepAlive: true, isTab: false, isAuth: false } }, ]; ================================================ FILE: src/store/getters.js ================================================ import * as globalTypes from "./types/global"; const getters = { tag: state => state.tags.tag, website: state => state.common.website, userInfo: state => state.user.userInfo, theme: state => state.common.theme, themeName: state => state.common.themeName, isShade: state => state.common.isShade, isCollapse: state => state.common.isCollapse, keyCollapse: (state, getters) => getters.screen > 1 ? getters.isCollapse : false, screen: state => state.common.screen, isLock: state => state.common.isLock, isFullScreen: state => state.common.isFullScreen, lockPasswd: state => state.common.lockPasswd, tagList: state => state.tags.tagList, tagWel: state => state.tags.tagWel, access_token: state => state.user.access_token, tenantId: state => state.common.tenantId, refresh_token: state => state.user.refresh_token, expires_in: state => state.user.expires_in, roles: state => state.user.roles, permissions: state => state.user.permissions, menu: state => state.user.menu, menuAll: state => state.user.menuAll, jti: state => state.user.jti, system: state => state.common.system, [globalTypes.GET_DIRECTION](state) { return state.direction; }, [globalTypes.GET_THEME](state) { return state.theme; } }; export default getters; ================================================ FILE: src/store/index.js ================================================ import Vue from 'vue' import Vuex from 'vuex' import common from './modules/common' import user from './modules/user' import tags from './modules/tags' import getters from './getters' import konwledge from './modules/konwledge' import * as globalTypes from './types/global' Vue.use(Vuex) const initState = { direction: 'forward', theme: 'dark', // light / dark // 主题风格参数 params: { themeColor: '', // 主题颜色 activeColor: '', // 激活状态颜色 // 字体 font: { size: '', // 大小 color: '', // 颜色 }, // logo设置 logo: { width: '240px', // 宽 height: '64px', // 高 fit: 'contain', // 图片显示填充方式 color: '#1890ff', // 字体颜色 fontSize: '16px', // 字体大小 fontWeight: 600, // 字体粗细 backgroundColor: '#fff', // 背景颜色 }, // 表单设置 form: { size: 'mini', // 表单内组件的尺寸 medium / small / mini }, btn: { size: 'mini', // 按钮的尺寸 medium / small / mini } } } const actions = {}; const mutations = { [globalTypes.UPDATE_DIRECTION](state, direction) { state.direction = direction; }, [globalTypes.UPDATE_THEME](state, theme) { state.theme = theme; }, } const store = new Vuex.Store({ modules: { common, tags, user, konwledge }, getters, actions, state: initState, mutations }) export default store ================================================ FILE: src/store/modules/common.js ================================================ import { getStore, removeStore, setStore } from "@/util/store"; import website from "@/const/website"; const common = { state: { isCollapse: false, isFullScreen: false, isShade: false, screen: -1, isLock: getStore({ name: "isLock" }) || false, showTag: true, showCollapse: true, showFullScren: true, website: website, tenantId: getStore({ name: "tenantId" }) || "", theme: getStore({name: 'theme'}) || {}, themeName: getStore({name: 'themeName'}) || "", system: getStore({name: 'system'}), template: getStore({name: 'template'}) || "", tenantInfo: getStore({name: 'tenantInfo'}) }, actions: {}, mutations: { SET_SHADE: (state, active) => { state.isShade = active; }, SET_COLLAPSE: state => { state.isCollapse = !state.isCollapse; }, SET_FULLSCREN: state => { state.isFullScreen = !state.isFullScreen; }, SET_SHOWCOLLAPSE: (state, active) => { state.showCollapse = active; setStore({ name: "showCollapse", content: state.showCollapse }); }, SET_SHOWTAG: (state, active) => { state.showTag = active; setStore({ name: "showTag", content: state.showTag }); }, SET_SHOWMENU: (state, active) => { state.showMenu = active; setStore({ name: "showMenu", content: state.showMenu }); }, SET_SHOWLOCK: (state, active) => { state.showLock = active; setStore({ name: "showLock", content: state.showLock }); }, SET_SHOWSEARCH: (state, active) => { state.showSearch = active; setStore({ name: "showSearch", content: state.showSearch }); }, SET_SHOWFULLSCREN: (state, active) => { state.showFullScren = active; setStore({ name: "showFullScren", content: state.showFullScren }); }, SET_SHOWDEBUG: (state, active) => { state.showDebug = active; setStore({ name: "showDebug", content: state.showDebug }); }, SET_SHOWTHEME: (state, active) => { state.showTheme = active; setStore({ name: "showTheme", content: state.showTheme }); }, SET_SHOWCOLOR: (state, active) => { state.showColor = active; setStore({ name: "showColor", content: state.showColor }); }, SET_LOCK: state => { state.isLock = true; setStore({ name: "isLock", content: state.isLock, type: "session" }); }, SET_SCREEN: (state, screen) => { state.screen = screen; }, SET_THEME: (state, theme) => { state.theme = theme; setStore({ name: "theme", content: state.theme, type: "session" }); }, SET_THEME_NAME: (state, themeName) => { state.themeName = themeName; setStore({ name: "themeName", content: state.themeName, type: "session" }); }, SET_LOCK_PASSWD: (state, lockPasswd) => { state.lockPasswd = lockPasswd; setStore({ name: "lockPasswd", content: state.lockPasswd, type: "session" }); }, SET_TENANTId: (state, tenantId) => { state.tenantId = tenantId; setStore({ name: "tenantId", content: state.tenantId, type: "session" }); setStore({ name: "tenantId", content: state.tenantId, type: "" }); }, CLEAR_LOCK: state => { state.isLock = false; state.lockPasswd = ""; removeStore({ name: "lockPasswd" }); removeStore({ name: "isLock" }); }, SET_SYSTEM: (state, system) => { state.system = system; setStore({ name: "system", content: state.system, type: "session" }); }, SET_TEMPLATE: (state, template) => { state.template = template; setStore({ name: "template", content: state.template, type: "session" }); }, SET_TENANTINFO: (state, info) => { state.tenantInfo = info; setStore({ name: "tenantInfo", content: state.tenantInfo, type: "session" }); document.title = info.shortName || "无忧 - 企业文档" }, } }; export default common; ================================================ FILE: src/store/modules/konwledge.js ================================================ import { getStore, removeStore, setStore } from '@/util/store' const konwledge = { state: { konwledgeInfo: getStore({ name: 'konwledgeInfo' }), }, actions: {}, mutations: { SET_KONWLEDGE: (state, konwledgeInfo) => { state.konwledgeInfo = konwledgeInfo setStore({ name: 'konwledgeInfo', content: state.konwledgeInfo, type: 'session' }) } } } export default konwledge ================================================ FILE: src/store/modules/tags.js ================================================ import { getStore, setStore } from '@/util/store' import { diff } from '@/util/util' import website from '@/const/website' const isFirstPage = website.isFirstPage const tagWel = website.fistPage const tagObj = { label: '', // 标题名称+ value: '', // 标题的路径 params: '', // 标题的路径参数 query: '', // 标题的参数 group: [] // 分组 } // 处理首个标签 function setFistTag (list) { if (list.length == 1) { list[0].close = false } else { list.forEach(ele => { if (ele.value === tagWel.value && isFirstPage === false) { ele.close = false } else { ele.close = true } }) } } const navs = { state: { tagList: getStore({ name: 'tagList' }) || [], tag: getStore({ name: 'tag' }) || tagObj, tagWel: tagWel }, actions: {}, mutations: { ADD_TAG: (state, action) => { state.tag = action setStore({ name: 'tag', content: state.tag, type: 'session' }) let bool = true for(let i in state.tagList) { if(state.tagList[i].value == action.value && state.tagList[i].hash == action.hash) { bool = false } } if(bool) { state.tagList.push(action) setFistTag(state.tagList) setStore({ name: 'tagList', content: state.tagList, type: 'session' }) } }, DEL_TAG: (state, action) => { state.tagList = state.tagList.filter(item => { return !(item.value == action.value && item.hash == action.hash) }) setFistTag(state.tagList) setStore({ name: 'tagList', content: state.tagList, type: 'session' }) }, DEL_ALL_TAG: (state) => { state.tagList = [state.tagWel] setStore({ name: 'tagList', content: state.tagList, type: 'session' }) }, DEL_TAG_OTHER: (state) => { state.tagList = state.tagList.filter(item => { if(item.hash) { if(item.hash === state.tag.hash) { return true } }else{ if (item.value === state.tag.value) { return true; } else if (!website.isFirstPage && item.value === website.fistPage.value) { return true; } } }) setFistTag(state.tagList) setStore({ name: 'tagList', content: state.tagList, type: 'session' }) } } } export default navs ================================================ FILE: src/store/modules/user.js ================================================ import { getStore, setStore } from "@/util/store"; import { isURL } from "@/util/validate"; import { loginByUsername, logout, refreshToken, codeLogin, wxOpenidLogin } from "@/api/login"; import { deepClone, encryption } from "@/util/util"; import webiste from "@/const/website"; import {enCodeKey} from "@/const/const" function addPath(ele, first) { const propsConfig = webiste.menu.props; const propsDefault = { label: propsConfig.label || "label", src: propsConfig.src || "src", icon: propsConfig.icon || "icon", path: propsConfig.path || "path" }; if (first) { ele[propsDefault.path] = ele[propsDefault.path] + "/index"; return; } } const user = { state: { userInfo: getStore({ name: "userInfo" }) || {}, permissions: getStore({ name: "permissions" }) || [], roles: getStore({ name: "roles" }) || [], menu: getStore({ name: "menu" }) || [], menuAll: [], expires_in: getStore({ name: "expires_in" }) || "", access_token: getStore({ name: "access_token" }) || "", refresh_token: getStore({ name: "refresh_token" }) || "", tenantId: getStore({ name: "tenantId" }) || "", jti: getStore({ name: 'jti' }) || '' }, actions: { // 根据用户名登录 LoginByUsername({ commit }, userInfo) { // console.log(userInfo); let user = encryption({ data: userInfo, key: enCodeKey, // "ZnJhbWVmcmFtZQ==", param: ["password"] }); return new Promise((resolve, reject) => { if (user.loginType === "namepass") { loginByUsername( user.username, user.password, user.code, user.randomStr ) .then(response => { const data = response.data; commit("SET_ACCESS_TOKEN", data.access_token); commit("SET_REFRESH_TOKEN", data.refresh_token); commit("SET_EXPIRES_IN", data.expires_in); commit("CLEAR_LOCK"); commit("SET_USER_INFO", data.userDto); commit("SET_ROLES", data.roles || []); commit("SET_PERMISSIONS", data.permissions || []); resolve(data); }) .catch(error => { console.log(error); reject(error); }); } else if (user.loginType === "phone") { let tp = { data: JSON.stringify({ phone: user.phone, code: user.code }) } let temp = encryption({ data: tp, key: enCodeKey, param: ["data"] }); codeLogin(('phone@'+temp.data)) .then(response => { const data = response.data; commit("SET_ACCESS_TOKEN", data.access_token); commit("SET_REFRESH_TOKEN", data.refresh_token); commit("SET_EXPIRES_IN", data.expires_in); commit("CLEAR_LOCK"); commit("SET_USER_INFO", data.userDto); commit("SET_ROLES", data.roles || []); commit("SET_PERMISSIONS", data.permissions || []); resolve(data); }) .catch(error => { console.log(error); reject(error); }); }else if(['invite', 'weixin'].indexOf(userInfo.loginType) > -1) { let userTempData = JSON.parse(JSON.stringify(userInfo)) let spiteIcon = 'invite@' if(userInfo.loginType == 'weixin') { spiteIcon = (userTempData.type + '@') } delete userTempData.loginType let tp = { data: JSON.stringify(userTempData) } let temp = encryption({ data: tp, key: enCodeKey, param: ["data"] }); codeLogin((spiteIcon+temp.data)).then(response => { const data = response.data; commit("SET_ACCESS_TOKEN", data.access_token); commit("SET_REFRESH_TOKEN", data.refresh_token); commit("SET_EXPIRES_IN", data.expires_in); commit("CLEAR_LOCK"); commit("SET_USER_INFO", data.userDto); commit("SET_ROLES", data.roles || []); commit("SET_PERMISSIONS", data.permissions || []); resolve(data); }) .catch(error => { console.log(error); reject(error); }); } }); }, GetUserInfo({ commit }) { return new Promise((resolve, reject) => { getUserInfo() .then(res => { const data = res.data.data || {}; commit("SET_USER_INFO", data.sysUser); commit("SET_ROLES", data.roles || []); commit("SET_PERMISSIONS", data.permissions || []); resolve(data); }) .catch(err => { reject(); }); }); }, // 刷新token RefreshToken({ commit, state }, tenantId) { return new Promise((resolve, reject) => { refreshToken(state.refresh_token, tenantId) .then(response => { const data = response.data; commit("SET_ACCESS_TOKEN", data.access_token); commit("SET_REFRESH_TOKEN", data.refresh_token); commit("SET_EXPIRES_IN", data.expires_in); commit("CLEAR_LOCK"); commit("SET_TENANTId", tenantId); resolve(data); }) .catch(error => { reject(error); }); }); }, // 登出 LogOut({ commit }) { commit("SET_MENU", []); commit("SET_PERMISSIONS", []); commit("SET_USER_INFO", {}); commit("SET_ACCESS_TOKEN", ""); commit("SET_REFRESH_TOKEN", ""); commit("SET_EXPIRES_IN", ""); commit("SET_ROLES", []); commit("DEL_ALL_TAG"); commit("CLEAR_LOCK"); commit("SET_SYSTEM", ""); commit("SET_ACCESS_TOKEN", ""); commit("SET_TENANTId", ""); localStorage.clear() sessionStorage.clear() var date=new Date(); date.setTime(date.getTime()-10000); var keys=document.cookie.match(/[^ =;]+(?=\=)/g); if (keys) { for (var i = keys.length; i--;) document.cookie=keys[i]+"=; expire="+date.toGMTString()+"; path=/"; } }, // 注销session FedLogOut({ commit }) { return new Promise(resolve => { commit("SET_MENU", []); commit("SET_PERMISSIONS", []); commit("SET_USER_INFO", {}); commit("SET_ACCESS_TOKEN", ""); commit("SET_REFRESH_TOKEN", ""); commit("SET_ROLES", []); commit("DEL_ALL_TAG"); commit("CLEAR_LOCK"); resolve(); }); } }, mutations: { SET_ACCESS_TOKEN: (state, access_token) => { state.access_token = access_token; setStore({ name: "access_token", content: state.access_token, type: "session" }); setStore({ name: "access_token", content: state.access_token, type: "" }); }, SET_EXPIRES_IN: (state, expires_in) => { state.expires_in = expires_in; setStore({ name: "expires_in", content: state.expires_in, type: "session" }); }, SET_REFRESH_TOKEN: (state, rfToken) => { state.refresh_token = rfToken; setStore({ name: "refresh_token", content: state.refresh_token, type: "session" }); }, SET_USER_INFO: (state, userInfo) => { state.userInfo = userInfo; setStore({ name: "userInfo", content: state.userInfo, type: "session" }); setStore({ name: "userInfo", content: state.userInfo, type: "" }); }, SET_MENU: (state, params = {}) => { let { menu, type } = params; if (type !== false) state.menu = menu; setStore({ name: "menu", content: menu, type: "session" }); }, SET_MENU_ALL: (state, menuAll) => { state.menuAll = menuAll; }, SET_ROLES: (state, roles) => { state.roles = roles; setStore({ name: "roles", content: state.roles, type: "session" }); }, SET_PERMISSIONS: (state, permissions) => { // const list = {}; // for (let i = 0; i < permissions.length; i++) { // list[permissions[i]] = true; // } // state.permissions = list; setStore({ name: "permissions", content: permissions, //state.permissions, type: "session" }); }, SET_SwitchTenant: (state, switchTenant) => { state.switchTenant = switchTenant; setStore({ name: "switchTenant", content: state.switchTenant, type: "session" }); } } }; export default user; ================================================ FILE: src/store/types/global.js ================================================ /* * @component global.js * @description 全局类型 * @author wangying */ // actions // getters export const GET_DIRECTION = 'APP/GET_DIRECTION'; export const GET_THEME = 'APP/GET_THEME'; // mutations export const UPDATE_DIRECTION = 'APP/UPDATE_DIRECTION'; export const UPDATE_THEME = 'APP/UPDATE_THEME'; ================================================ FILE: src/styles/animate/vue-transition.scss ================================================ // 过渡动画 横向渐变 .fade-transverse-leave-active, .fade-transverse-enter-active { transition: all .5s; } .fade-transverse-enter { opacity: 0; transform: translateX(-30px); } .fade-transverse-leave-to { opacity: 0; transform: translateX(30px); } // 过渡动画 缩放渐变 .fade-scale-leave-active, .fade-scale-enter-active { transition: all .5s; } .fade-scale-enter { opacity: 0; transform: scale(1.2); } .fade-scale-leave-to { opacity: 0; transform: scale(0.8); } @-webkit-keyframes animate-cloud { from { background-position: 600px 100%; } to { background-position: 0 100%; } } @-moz-keyframes animate-cloud { from { background-position: 600px 100%; } to { background-position: 0 100%; } } @-ms-keyframes animate-cloud { from { background-position: 600px 100%; } to { background-position: 0 100%; } } @-o-keyframes animate-cloud { from { background-position: 600px 100%; } to { background-position: 0 100%; } } ================================================ FILE: src/styles/common.scss ================================================ // 全局变量 @import './variables.scss'; // ele样式覆盖 @import './element-ui.scss'; // 顶部右侧显示 @import './top.scss'; // 导航标签 @import './tags.scss'; // 工具类函数 @import './mixin.scss'; // 侧面导航栏 @import './sidebar.scss'; // 动画 @import './animate/vue-transition.scss'; //适配 @import './media.scss'; //通用配置 @import './normalize.scss'; a{ text-decoration: none; color:#333; } *{ outline: none; } //tags 布局 .lineBox{ /deep/ .el-tabs__nav{ display: flex; height: 100%; } } // 遮罩透明 .v-modal{ // background: none!important; // z-index: 0!important; } ================================================ FILE: src/styles/element-ui.scss ================================================ .el-dropdown-menu__item { font-size: 12px !important; line-height: 28px !important; } .el-card.is-always-shadow { box-shadow: none; border: none !important; } .el-scrollbar__view { height: 100%; } .el-collapse-item__header { display: block !important; } .el-menu--horizontal { border-bottom: none !important; } .el-menu { border-right: none !important; } .el-menu--display, .el-menu--display + .el-submenu__icon-arrow { display: none; } .el-dropdown-menu__item--divided:before, .el-menu, .el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, .el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, .el-menu--horizontal > .el-submenu .el-submenu__title:hover { background-color: transparent; } .el-message__icon, .el-message__content { display: inline-block; } .el-date-editor .el-range-input, .el-date-editor .el-range-separator { height: auto; overflow: hidden; } .el-dialog__wrapper { z-index: 2048; } .el-col { margin-bottom: 8px; } .el-main { padding: 0 !important; } .el-dropdown-menu__item--divided:before, .el-menu, .el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, .el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, .el-menu--horizontal > .el-submenu .el-submenu__title:hover { background-color: transparent !important; } .el-table--medium td{ padding: 5px 0; } ================================================ FILE: src/styles/login.scss ================================================ .login-container { display: flex; align-items: center; position: relative; width: 100%; height: 100%; margin: 0 auto; // 0 bottom repeat-x #049ec4; // background: #f8f8f9; animation: animate-cloud 20s linear infinite; background-repeat: round; } .login-weaper { margin: 0 auto; width: 1000px; box-shadow: -4px 5px 10px rgba(0, 0, 0, 0.4); } .login-left, .login-border { position: relative; min-height: 500px; align-items: center; display: flex; } .login-left { border-top-left-radius: 5px; border-bottom-left-radius: 5px; justify-content: center; flex-direction: column; // background-color: #409EFF; color: #fff; float: left; width: 50%; position: relative; } .login-left .img { width: 140px; } .login-time { position: absolute; left: 25px; top: 25px; width: 100%; color: #fff; font-weight: 200; opacity: 0.9; font-size: 18px; overflow: hidden; } .login-left .title { margin-top: 60px; text-align: center; color: #fff; font-weight: 300; letter-spacing: 2px; font-size: 25px; } .login-border { border-left: none; border-top-right-radius: 5px; border-bottom-right-radius: 5px; color: #fff; background-color: #fff; width: 50%; float: left; box-sizing: border-box; } .login-main { margin: 0 auto; width: 65%; box-sizing: border-box; } .login-main > h3 { margin-bottom: 20px; } .login-main > p { color: #76838f; } .login-title { color: #333; margin-bottom: 40px; font-weight: 500; font-size: 22px; text-align: center; letter-spacing: 4px; } .login-select { input { color: #333; font-size: 18px; font-weight: 400; border: none; text-align: center; } } .login-menu { margin-top: 40px; width: 100%; text-align: center; a { color: #999; font-size: 12px; margin: 0px 8px; } } .login-submit { width: 100%; height: 45px; border: 1px solid #409eff; background: none; font-size: 18px; letter-spacing: 2px; font-weight: 300; color: #409eff; cursor: pointer; margin-top: 30px; font-family: "neo"; transition: 0.25s; } .login-form { margin: 10px 0; i { color: #333; } .el-form-item__content { width: 100%; } .el-form-item { margin-bottom: 12px; } .el-input { input { padding-bottom: 10px; text-indent: 5px; background: transparent; border: none; border-radius: 0; color: #333; border-bottom: 1px solid rgb(235, 237, 242); } .el-input__prefix { i { padding: 0 5px; font-size: 16px !important; } } } } .login-code { display: flex; align-items: center; justify-content: space-around; margin: 0 0 0 10px; } .login-code-img { margin-top: 2px; width: 100px; height: 38px; background-color: #fdfdfd; border: 1px solid #f0f0f0; color: #333; font-size: 14px; font-weight: bold; letter-spacing: 5px; line-height: 38px; text-indent: 5px; text-align: center; } ================================================ FILE: src/styles/media.scss ================================================ .jvs-left, .jvs-header, .jvs-top, .jvs-logo, .jvs-layout .login-logo, .jvs-main { transition: all .3s; } .jvs-contail { width: 100%; height: 100%; background: #f0f2f5; background-size: 100%; background-repeat: no-repeat; } .jvs-left { position: fixed; left: 0; top: 0; // width: 220px; height: 100%; z-index: 1025; } .jvs--collapse { .jvs-left, .jvs-logo { width: 60px!important; } .jvs-header, .jvs-tags__box .el-tabs{ padding-left: 60px!important; } .jvs-main { width: calc(100% - 60px)!important; left: 60px!important; } } .jvs-header { padding-left: 240px; width: 100%; background-color: #fff; box-sizing: border-box; } .jvs-main { position: absolute; left: 220px; padding: 0; padding-bottom: 20px; height: calc(100%); box-sizing: border-box; overflow: hidden; } .jvs-view { padding-bottom: 22px; width: 100%; box-sizing: border-box; height: 100%; } .jvs-footer { margin: 0 auto; padding: 0 22px; width: 1300px; display: flex; align-items: center; justify-content: space-between; .logo { margin-left: -50px; } .copyright { color: #666; line-height: 1.5; font-size: 12px; } } .jvs-shade { position: fixed; display: none; width: 100%; height: 100%; left: 0; right: 0; top: 0; bottom: 0; background-color: rgba(0, 0, 0, .3); z-index: 1024; &--show { display: block; } } @media screen and (max-width: 992px) { $width: 100%; //240px; // ele的自适应 .el-dialog, .el-message-box { width: 98% !important; } //登录页面 .login-left { display: none !important; } .login-logo { padding-top: 30px !important; margin-left: -30px; } .login-weaper{ margin: 0 auto; width: 96% !important; } .login-border { border-radius: 5px; padding: 40px; margin: 0 auto; float: none !important; width: 100% !important; } .login-main { width: 100% !important; } //主框架 .jvs-tags { display: none; } .jvs-left, .jvs-logo { left: -$width; } .jvs-main { left: 0; width: 100%; } .jvs-header { margin-bottom: 15px; padding-left: 15px; } .top-bar__item { display: none; } .jvs--collapse { .jvs-left, .jvs-logo { width: $width; left: 0; } .jvs-main { left: $width; width: 100%; } .jvs-header { padding: 0; transform: translate3d(230px, 0, 0); } .jvs-shade { display: block; } } } ================================================ FILE: src/styles/mixin.scss ================================================ @mixin clearfix { &:after { content: ""; display: table; clear: both; } } @mixin scrollBar { ::-webkit-scrollbar-track-piece { background-color: transparent; } ::-webkit-scrollbar { width: 7px; height: 7px; background-color: transparent; } ::-webkit-scrollbar-thumb { border-radius: 5px; background-color: hsla(220, 4%, 58%, .3); } } @mixin radius($width, $size, $color) { width: $width; height: $width; line-height: $width; border-radius: $width; text-align: center; border-width: $size; border-style: solid; border-color: $color; } @mixin relative { position: relative; width: 100%; height: 100%; } @mixin pct($pct) { width: #{$pct}; position: relative; margin: 0 auto; } @mixin triangle($width, $height, $color, $direction) { $width: $width/2; $color-border-style: $height solid $color; $transparent-border-style: $width solid transparent; height: 0; width: 0; @if $direction==up { border-bottom: $color-border-style; border-left: $transparent-border-style; border-right: $transparent-border-style; } @else if $direction==right { border-left: $color-border-style; border-top: $transparent-border-style; border-bottom: $transparent-border-style; } @else if $direction==down { border-top: $color-border-style; border-left: $transparent-border-style; border-right: $transparent-border-style; } @else if $direction==left { border-right: $color-border-style; border-top: $transparent-border-style; border-bottom: $transparent-border-style; } } ================================================ FILE: src/styles/normalize.scss ================================================ /*! normalize.css v2.1.2 | MIT License | git.io/normalize */ /* /*! 我就是自己看看,然后翻译下下,让大家看看 */ /* ========================================================================== HTML5 display definitions HTML5 新增元素定义 ========================================================================== */ /** * Correct `block` display not defined in IE 8/9. * * 修正IE 8/9 中未定义的块级元素。 */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } /** * Correct `inline-block` display not defined in IE 8/9. * * 修正在 IE 8/9 中未定义的 'inline-block' 元素。 */ audio, canvas, video { display: inline-block; } /** * Prevent modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. * * 阻止现在浏览器显示未定义 control 播放控件的 'audio' 声音元素。 * 删除 IOS 5 设备中显示的多余的高度。 */ audio:not([controls]) { display: none; height: 0; } /** * Address styling not present in IE 8/9. * * 处理 IE 8/9 中不存在的样式。 */ [hidden] { display: none; } /* ========================================================================== Base 基本设置 ========================================================================== */ /** * 1. Set default font family to sans-serif. * 2. Prevent iOS text size adjust after orientation change, without disabling * user zoom. * * 1. 设置默认字体类型为 sans-serif. * 2. 当用户放大或缩小页面时不改变字体大小。 */ html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } /** * Remove default margin. * * 删除默认边距。 */ body { margin: 0; } /* ========================================================================== Links 链接 ========================================================================== */ /** * Address `outline` inconsistency between Chrome and other browsers. * * 处理 Chrome 与其它浏览器中关于 'outline' 的不一致性。 */ a:focus { outline: thin dotted; } /** * Improve readability when focused and also mouse hovered in all browsers. * * 为所有浏览器改善当激活或悬停在元素上时元素内容的可读性。 */ a:active, a:hover { outline: 0; } /* ========================================================================== Typography 排版 ========================================================================== */ /** * Address variable `h1` font-size and margin within `section` and `article` * contexts in Firefox 4+, Safari 5, and Chrome. * * 处理多变的 'h1' 字体大小及其在 Firefox 4+, Safari 5, 及 Chrome时浏览器中的 * 'section' 与 'article' 元素中的边距。 */ h1 { font-size: 2em; margin: 0.67em 0; } /** * Address styling not present in IE 8/9, Safari 5, and Chrome. * * 处理在 IE 8/9, Safari 5, 及 Chrome 没有的样式。 */ abbr[title] { border-bottom: 1px dotted; } /** * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. * * 处理 Firefox 4+, Safari 5, 及 Chrome 中默认的 'bolder' 样式为 'bold'. */ b, strong { font-weight: bold; } /** * Address styling not present in Safari 5 and Chrome. * * 处理在 Safari 5 和 Chrome 没有的样式。 */ dfn { font-style: italic; } /** * Address differences between Firefox and other browsers. * * 处理 Firefox 与其它浏览器的差异。 */ hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } /** * Address styling not present in IE 8/9. * * 处理在 IE 8/9 中没有的样式。 */ mark { background: #ff0; color: #000; } /** * Correct font family set oddly in Safari 5 and Chrome. * * 修正确 Safari 5 和 Chrome 中古怪的默认字体。 */ code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } /** * Improve readability of pre-formatted text in all browsers. * * 为所有浏览器改善预格式化文本的可读性。 */ pre { white-space: pre-wrap; } /** * Set consistent quote types. * * 设置一致的引用格式。 */ q { quotes: "\201C" "\201D" "\2018" "\2019"; } /** * Address inconsistent and variable font size in all browsers. * * 处理所有浏览器中字体大小的不一致性[译者注:原文直译为:处理所有 * 浏览器中的不一致和多变的字体大小]。 */ small { font-size: 80%; } /** * Prevent `sub` and `sup` affecting `line-height` in all browsers. * * 阻止所有浏览器中 'sub' 和 'sup' 元素影响 'line-height'. * [译者注:就是不让上标与下标影响行高。] */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* ========================================================================== Embedded content 嵌入的内容 ========================================================================== */ /** * Remove border when inside `a` element in IE 8/9. * * 删除 IE 8/9 中当内容位于 'a' 中出现的边框。 */ img { border: 0; } /** * Correct overflow displayed oddly in IE 9. * * 修正 IE 9 中显示古怪的溢出内容。 */ svg:not(:root) { overflow: hidden; } /* ========================================================================== Figures Figure 图像/图表/代码等 ========================================================================== */ /** * Address margin not present in IE 8/9 and Safari 5. * * 处理在 IE 8/9 和 Safari 5 没有的边距。 */ figure { margin: 0; } /* ========================================================================== Forms ========================================================================== */ /** * Define consistent border, margin, and padding. * * 定义一致的边框、外边距及内边距。 */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /** * 1. Correct `color` not being inherited in IE 8/9. * 2. Remove padding so people aren't caught out if they zero out fieldsets. * 1. 修正在 IE 8/9 中没有继承的 'color'. * * [译者注:说是修正颜色嘛,可下面没有关于颜色的呀,这也行?求大神解释!] * 2. 去掉内边距,避免当用户清空表单组时认为出错了。 */ legend { border: 0; /* 1 */ padding: 0; /* 2 */ } /** * 1. Correct font family not being inherited in all browsers. * 2. Correct font size not being inherited in all browsers. * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. * * 1. 修正所有浏览器中未被继承的字体类型。 * 2. 修正所有浏览器中未被继承的字体大小。 * 3. 处理 Firefox 4+, Safari 5, 及 Chrome 中默认设置不同的外边距。 */ button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } /** * Address Firefox 4+ setting `line-height` on `input` using `!important` in * the UA stylesheet. * * 处理 Firefox 4+ 中的客户端样式表里使用 '!important' 设置的 'line-height'. */ button, input { line-height: normal; } /** * Address inconsistent `text-transform` inheritance for `button` and `select`. * All other form control elements do not inherit `text-transform` values. * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. * Correct `select` style inheritance in Firefox 4+ and Opera. * * 处理 'button' 和 'select' 的 'text-transform' 继承的不一致性。 * 所有其它表单控件元素不继承 'text-transform' 的值。 * 修正 Chrome, Safari 5+, 及 IE 8+ 中 'button' 的继承样式。 * 修正 Firefox 4+ 和 Opera 中 'select' 的继承样式。 */ button, select { text-transform: none; } /** * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` * and `video` controls. * 2. Correct inability to style clickable `input` types in iOS. * 3. Improve usability and consistency of cursor style between image-type * `input` and others. * * 1. 避免 Android 4.0.* 中 WebKit 的一个bug, 防止 'audio' 与 'video' 的播放控件失效。 * 2. 修正 iOS 中不可点击的 'input' 样式。 * 3. 改善图片类型的 'input' 等光标样式的可用性与一致性。 */ button, html input[type="button"], /* 1 */ input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } /** * Re-set default cursor for disabled elements. * * 重置不可用元素的默认光标样式。 */ button[disabled], html input[disabled] { cursor: default; } /** * 1. Address box sizing set to `content-box` in IE 8/9. * 2. Remove excess padding in IE 8/9. * * 1. 处理 IE 8/9 中设置为 'content-box' 的盒子模型。 * 2. 删除 IE 8/9 中多余的内边距。 */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /** * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome * (include `-moz` to future-proof). * * 1. 处理 Safari 5 和 Chrome 中默认设置为 'appearance' 的 'searchfield'. * 2. 处理 Safari 5 和 Chrome 中默认设置为 'box-sizing' 的 'border-box' * (包括不会过时的 '-moz'). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /** * Remove inner padding and search cancel button in Safari 5 and Chrome * on OS X. * * 删除 Safari 5 和 OS X 上的 Chrome 中的输入框上的内边距和搜索取消按钮。 */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /** * Remove inner padding and border in Firefox 4+. * * 删除 Firefox 4+ button 与 input 上的内边距。 */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /** * 1. Remove default vertical scrollbar in IE 8/9. * 2. Improve readability and alignment in all browsers. * * 1. 删除 IE8/9 中默认的垂直滚动条。 * 2. 改善所有浏览器中的可读性并使文本垂直对齐。 */ textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } /* ========================================================================== Tables 表格 ========================================================================== */ /** * Remove most spacing between table cells. * * 删除表格里单元格间的间距。 */ table { border-collapse: collapse; border-spacing: 0; } ================================================ FILE: src/styles/reset2.0.scss ================================================ // 弹框 .el-dialog__wrapper:not(.form-fullscreen-dialog){ .el-dialog{ .el-dialog__header{ height: 20px; font-size: 20px; font-family: SourceHanSansCN-Regular; color: #333333; padding: 20px; display: flex; align-items: center; position: relative; .el-dialog__title{ line-height: 20px; font-size: 20px; color: #333333; } .el-dialog__headerbtn{ .el-dialog__close{ color: #BFBFBF; } } } .el-dialog__header::before{ content: ""; display: block; width: 4px; height: 20px; background: #3471FF; margin-right: 20px; } .el-dialog__header::after{ content: ""; display: block; width: calc(100% - 40px); height: 1px; background: #DCDFE6; position: absolute; bottom: 0; } } } // 表格 .jvs-table{ background-color: #ffffff; // 标题 .jvs-table-titleTop{ padding: 0 20px!important; .el-card__body{ padding: 0!important; padding-top: 4px!important; padding-bottom: 20px!important; box-sizing: border-box; .pageheader-top{ padding: 18px 0; border-bottom: 1px solid #DCDFE6; margin: 0; .pageheader-line{ margin: 0; margin-right: 15px; border-radius: 0; } .title{ margin: 0; } } .table-top{ padding: 20px 0; box-sizing: border-box; border-bottom: 1px solid #DCDFE6; .table-top-left{ margin: 0; } } } } // 顶部查询 .jvs-table-top{ padding: 0 20px!important; box-sizing: border-box; .el-card__body{ padding-bottom: 0!important; .table-top{ border: 0; } .search-form{ box-sizing: border-box; margin: 0; padding: 20px 0; border-bottom: 1px solid #DCDFE6; } } } // 内容 .table-body-box{ .el-table{ margin-top: 0!important; .el-table__header-wrapper{ margin: 0!important; tr{ th{ box-sizing: border-box; height: 55px; background-color: #F3F3F3; color: #333333; font-size: 16px; font-weight: normal; border: 0; } } } .el-table__body-wrapper{ .el-table__body{ tr{ color: #555555; font-size: 14px; td{ box-sizing: border-box; height: 45px; .el-button--text{ font-size: 14px; color: #3471FF; } } } tr:hover > td{ background: #EFF2F7; } } .el-table__empty-block{ border: 0; .el-table__empty-text{ display: block; width: 457px; } .el-table__empty-text::before{ content: ""; display: block; width: 457px; height: 180px; background-image: url('../const/img/emptyImage.png'); background-size: 260px 123px; background-repeat: no-repeat; background-position: center; } } } } } } // 树形组件 .el-tree{ position: relative; .el-tree-node{ .el-tree-node__content{ height: 35px; border-radius: 4px; span:not(.el-tree-node__expand-icon){ font-size: 16px; color: #333333; } .el-tree-node__expand-icon:not(.is-leaf){ color: #868BA1; font-size: 16px; } } .el-tree-node__content:hover{ background: #EFF2F7!important; } } // .el-tree-node.is-current{ // .el-tree-node__content{ // span:not(.el-tree-node__expand-icon){ // color: #3471FF; // } // } // } .el-tree-node.is-current{ .el-tree-node:not(.is-expanded){ span:not(.el-tree-node__expand-icon){ color: #3471FF; } .el-tree-node__content{ //background-color: #EFF2F7!important; } } } .el-tree-node:focus{ >.el-tree-node__content{ background: none; } } .el-tree__empty-block{ position: unset; .el-tree__empty-text{ display: none; } } .el-tree__empty-block::before{ content: ""; display: block; width: 100%; height: 180px; background-image: url('../const/img/emptyImage.png'); background-position: center; background-repeat: no-repeat; position: absolute; left: 50%; top: calc(50% - 20px); -webkit-transform: translate(-50%,-50%); transform: translate(-50%,-50%); color: #909399; font-size: 14px; background-size: 260px 123px; background-repeat: no-repeat; background-position: center; } .el-tree__empty-block::after{ content: "抱歉,没有找到相关搜索内容!"; position: absolute; left: 50%; top: calc(50% + 70px); -webkit-transform: translate(-50%,-50%); transform: translate(-50%,-50%); color: #909399; font-size: 12px; } } // 气泡提示框 .el-popover{ padding: 12px 0; } ================================================ FILE: src/styles/resetAll.scss ================================================ /** * 统一修改 * 全屏弹框的表单、 * 表格 * 按钮 */ // 全屏表单 form-fullscreen-dialog .form-fullscreen-dialog{ .el-dialog.is-fullscreen{ position: relative; .el-dialog__header{ padding: 0; height: 45px; display: flex; align-items: center; .el-dialog__title{ font-size: 18px; font-weight: 600; margin-left: 30px; position: relative; padding-left: 20px; } .el-dialog__title::before{ position: absolute; content: ""; width: 4px; height: 18px; background: #3471ff; border-radius: 2px; cursor: pointer; left: 0; top: 4px; cursor: auto; } .el-dialog__headerbtn{ top: 12px; } } .el-dialog__body{ position: absolute; top: 50px; width: 50%; left: 25%; padding: 10px 0; .el-form{ .el-form-item{ .el-form-item__label-wrap{ .el-form-item__label{ font-size: 14px; } .el-form-item__content{ font-size: 14px; } } .el-button{ font-size: 12px; // background-color: #409eff; // color: #fff; // border-color: #409eff; } .el-button--primary{ background-color: #409eff; color: #fff; } } } // 兼容有提示+校验 的表单项 .jvs-form-autoflexable{ .el-form-item{ margin-bottom: 18px; } } } } } // 表格 .jvs-table{ .jvs-table-top{ .el-card__body{ padding: 0!important; .pageheader-top{ display: flex; height: 30px; align-items: center; margin-bottom: 10px; .pageheader-line{ margin-left: 20px; } .title{ font-size: 18px; font-weight: 600; margin-left: 16px; } } .search-form{ margin-left: 40px; margin-bottom: 0; .el-col{ margin-bottom: 10px; } } .table-top{ .table-top-left{ margin-left: 40px; .el-button{ //background: #409eff; //border-color: #409eff; background: #3471FF; border-color: #3471FF; color: #fff; font-size: 12px; } } } } } .table-body-box{ .el-table{ color: #606266; .el-table__header-wrapper{ margin-top: 26px; tr{ th{ font-size: 14px; color: #222; } } } .el-table__body{ tr{ td{ padding: 8px 0; } } } .el-table__fixed, .el-table__fixed-right{ margin-top: 26px; box-shadow: 0 10px 10px rgba(0,0,0,0.12); } } .el-table::before{ z-index: 9; } } .jvs-table-titleTop{ padding: 0 10px; .pageheader-top{ display: flex; margin-bottom: 10px; .pageheader-line{ margin-left: 30px; } .title{ margin-left: 16px; } } .table-top{ .table-top-left{ margin-left: 50px; } } } } // 表单 .jvs-form{ .el-form-item{ .jvs-form-item{ min-height: 28px; .is-disabled{ .el-input__prefix, .el-input__suffix, .el-input-number__decrease, .el-input-number__increase, .el-input-group__append{ display: none; } .el-input__inner, .el-textarea__inner{ border: 0; background: none; font-size: 14px; color: #303133; cursor: text; padding-left: 0; } } } .form-item-tips{ color: #999; } } } // 树形组件 .el-tree{ .el-tree-node{ .el-tree-node__content{ height: 40px; } } } // 弹框动画 .el-dialog__wrapper { transition-duration: .3s; } .dialog-fade-enter-active{ animation: none !important; } .dialog-fade-leave-active { transition-duration: .15s !important; animation: none !important; } .dialog-fade-enter-active .el-dialog, .dialog-fade-leave-active .el-dialog{ animation-fill-mode: forwards; } // zoom .dialog-fade-enter-active .el-dialog{ animation-duration: .3s; animation-name: anim-open; animation-timing-function: cubic-bezier(0.6,0,0.4,1); } .dialog-fade-leave-active .el-dialog{ animation-duration: .3s; animation-name: anim-close; } @keyframes anim-open { 0% { opacity: 0; transform: scale3d(0, 0, 1); } 100% { opacity: 1; transform: scale3d(1, 1, 1); } } @keyframes anim-close { 0% { opacity: 1; } 100% { opacity: 0; transform: scale3d(0.5, 0.5, 1); } } ================================================ FILE: src/styles/sidebar.scss ================================================ .jvs-sidebar { user-select: none; position: relative; margin-top: 64px; height: 100%; position: relative; // 菜单背景颜色 // background-color: #20222a; background-color: #fff; transition: width .2s; box-sizing: border-box; box-shadow: 0px 10px 6px rgba(0, 21, 41, .35) ; &--tip { width: 90%; height: 140px; display: flex; align-items: center; justify-content: center; border-radius: 5px; position: absolute; top: 5px; left: 5%; color: #ccc; z-index: 2; text-align: center; font-size: 14px; background-color: rgba(0, 0, 0, .4); } .el-menu-item, .el-submenu__title { font-size: 12px; height: 45px; line-height: 45px; } .el-menu-item { span, i { //color:rgba(255, 255, 255, 0.7); } &:hover { color: #000!important; span, i { color: #000!important; } // background: #F5F5F5; } &.is-active { // background-color: #f5f5f5; span, i { color: #000; } &:hover { // background-color: #f5f5f5; } &::before { content: " "; top: 0; left: 0; bottom: 0; width: 4px; // background: $mainBg; position: absolute } } } .el-submenu__title { span, i { // color:rgba(255, 255, 255, 0.7); // 一级菜单字体颜色 color: #333; } &:hover { i, span { // 一级菜单字体 hover 颜色 color: #000; } background-color: transparent; } } .el-submenu .el-menu-item { height: 50px; line-height: 50px; span, i { // color:rgba(255, 255, 255, 0.7); // 二级菜单字体颜色 color: #333; } &.is-active { background-color: rgba(145, 160, 177, 0.5); span, i { // 被选中菜单字体颜色 color: #1890ff } &:hover { background-color: rgba(0, 0, 0, .1); } } &:hover { background-color: transparent; span, i { // 菜单字体 hover 颜色 color: #1890ff; } } } } ================================================ FILE: src/styles/tags.scss ================================================ .jvs-tags { user-select: none; position: relative; padding: 0 10px; margin-bottom: 10px; box-sizing: border-box; overflow: hidden; border-top: 1px solid #f6f6f6; background-color: #fff; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .05); .el-tabs--card>.el-tabs__header { margin: 0; } .el-tabs--card>.el-tabs__header .el-tabs__nav, .el-tabs--card>.el-tabs__header .el-tabs__item, .el-tabs--card>.el-tabs__header { border: none; } .el-tabs--card>.el-tabs__header .el-tabs__item:first-child { border-left-width: 1px } .el-tabs--card>.el-tabs__header .el-tabs__item { margin: 0 3px; height: 40px; line-height:40px; font-size: 13px; font-weight: normal; color: #ccc; &.is-active { color: #409EFF; border-bottom: 3px solid #409EFF; } } .el-tabs__nav-prev, .el-tabs__nav-next { width: 20px; line-height: 34px; font-size: 18x; text-align: center; } &__box { position: relative; box-sizing: border-box; padding-right: 106px; width: 100%; &--close { .el-tabs__item { &:first-child { padding: 0 20px !important; .el-icon-close { display: none; } } } } } &__contentmenu{ position: fixed; width:120px; background-color: #fff; z-index:1024; border-radius: 5px; box-shadow: 1px 2px 10px #ccc; .item{ cursor: pointer; font-size: 14px; padding: 8px 20px 8px 15px; color: #606266; &:first-child{ border-top-left-radius: 5px; border-top-right-radius: 5px; } &:last-child{ border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } &:hover{ background-color: #409EFF; color:#fff; } } } &__menu { position: absolute !important; top: 3px; right: 0; padding: 1px 0 0 15px; box-sizing: border-box; } } ================================================ FILE: src/styles/themes/common/mixins.scss ================================================ // 主题映射方法 @mixin themify($themes: $themes) { @each $theme-name, $map in $themes { .theme-#{$theme-name} & { $theme-map:() !global; @each $key, $value in $map { $theme-map: map-merge($theme-map, ($key: $value)) !global; } @content; $theme-map: null !global; } } } @function themed($key) { @return map-get($theme-map, $key); } ================================================ FILE: src/styles/themes/common/variables.scss ================================================ // theme $left-width: 295px; $white-color: white; $black-color: black; $font-family: 'SourceHanSansCN'; $themes: ( light: ( back-color: #07257D, left-width: 295px, left-color: $white-color, logo-height: 97px, logo-text-color: $white-color, logo-text-size: 18px, logo-text-family: 'SourceHanSansCN-Bold', menu-text-color: $white-color, // 一级 meun-item-text-size: 18px, // 二级 menu-item-item-back: #4A8FF0, // #3859BC, ), dark: ( // color variables primary-color: #2977b5, // header header-bg-color: #e4393c, header-text-color: $black-color, ), ); ================================================ FILE: src/styles/themes/index.scss ================================================ @import './common/variables'; @import './common/mixins'; .theme-box { @include themify() { color: themed('primary-color'); } // 左侧栏宽 .jvs-left{ @include themify() { width: themed('left-width'); background: themed('back-color'); color: themed('left-color'); .jvs-sidebar{ background: themed('back-color'); padding-top: themed('logo-height'); } } } // logo主题 .jvs-logo{ @include themify() { width: themed('left-width'); height: themed('logo-height'); color: themed('logo-text-color'); background: themed('back-color'); font-family: themed('logo-text-family'); // logo文字 .jvs-logo_title{ font-size: themed('logo-text-size'); line-height: themed('logo-height'); } } } // 左侧菜单栏 .el-scrollbar{ @include themify() { .el-scrollbar__wrap{ margin: 0!important; scrollbar-width: none; /* firefox */ -ms-overflow-style: none; /* IE 10+ */ .el-scrollbar__view{ .el-menu{ // 存在二级菜单 .menu-wrapper{ .el-submenu{ .el-submenu__title{ i, span{ color: themed('menu-text-color'); font-size: themed('meun-item-text-size'); } } } } // 无二级菜单 .el-menu-item{ background: themed('menu-item-item-back'); i, span{ color: themed('menu-text-color'); } } .is-active{ background: themed('back-color'); } .is-active::before{ background: #A3BAFC; width: 6px; } } } } } .el-scrollbar__wrap::-webkit-scrollbar { display: none; /* Chrome Safari */ } } } ================================================ FILE: src/styles/tiptap.scss ================================================ .el-tiptap-popper__menu{ padding: 0 12px; } ================================================ FILE: src/styles/tiptapView.scss ================================================ .htmShow .el-tiptap-editor__menu-bar{ display: none; } .htmShow .el-tiptap-editor__menu-bubble{ display: none; } ================================================ FILE: src/styles/top.scss ================================================ .jvs-top { padding: 0 20px; position: relative; box-shadow: 0 1px 4px rgba(0,21,41,.08); color: rgba(0, 0, 0, .65); font-size: 28px; height: 64px; box-sizing: border-box; white-space: nowrap; .el-menu-item{ i,span{ font-size: 13px; } } } .jvs-breadcrumb { height: 100%; i{ font-size: 60px !important; } &--active { transform:rotate(90deg); } } .top-menu { box-sizing: border-box; .el-menu-item { padding: 0 10px; border:none !important; } } .top-search { line-height: 64px; position: absolute !important; left: 20px; top:0; width: 400px !important; .el-input__inner { font-size: 13px; border: none; background-color: transparent; } } .top-bar__img { margin: 0 8px 0 5px; padding: 2px; width: 30px; height: 30px; border-radius: 100%; box-sizing: border-box; border: 1px solid #eee; vertical-align: middle; } .top-bar__left, .top-bar__right { height: 64px; position: absolute; top: 0; i{ line-height: 64px; } } .top-bar__left { left: 20px; } .top-bar__right { right: 20px; display: flex; align-items: center; } .top-bar__item { position: relative; display: inline-block; height: 64px; margin:0 10px; font-size: 16px; &--show { display: inline-block !important; } .el-badge__content.is-fixed{ top:12px; right: 5px; } } .top-bar__title { height: 100%; padding:0 40px; box-sizing: border-box; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: inherit; font-weight: 400; } ================================================ FILE: src/styles/variables.scss ================================================ //main $mainBg: #f5f5f5; ================================================ FILE: src/util/date.js ================================================ /** * wyQAQ * 1396871452@qq.com */ export const calcDate = (date1, date2) => { var date3 = date2 - date1 var days = Math.floor(date3 / (24 * 3600 * 1000)) var leave1 = date3 % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数 var hours = Math.floor(leave1 / (3600 * 1000)) var leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数 var minutes = Math.floor(leave2 / (60 * 1000)) var leave3 = leave2 % (60 * 1000) // 计算分钟数后剩余的毫秒数 var seconds = Math.round(date3 / 1000) return { leave1, leave2, leave3, days: days, hours: hours, minutes: minutes, seconds: seconds } } /** * 日期格式化 */ export function dateFormat(date) { let format = 'yyyy-MM-dd hh:mm:ss'; if (date != 'Invalid Date') { var o = { "M+": date.getMonth() + 1, //month "d+": date.getDate(), //day "h+": date.getHours(), //hour "m+": date.getMinutes(), //minute "s+": date.getSeconds(), //second "q+": Math.floor((date.getMonth() + 3) / 3), //quarter "S": date.getMilliseconds() //millisecond } if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); return format; } return ''; } ================================================ FILE: src/util/eventBus.js ================================================ import Vue from 'vue'; import {declare} from '@/views/common/draw' export default new Vue(); window.onload = function() { declare() } ================================================ FILE: src/util/login.js ================================================ /** * wyQAQ * 1396871452@qq.com */ import Vue from 'vue' import loginForm from '@/components/basic-container/login/loginForm.vue' const loginFormBox = Vue.extend(loginForm) loginForm.install = function (data) { let instance = new loginFormBox({data}) instance.$store = this.$root.$store instance.$mount() document.body.appendChild(instance.$el) Vue.nextTick(() => { instance.init() }) } export default loginForm ================================================ FILE: src/util/permision.js ================================================ import store from '@/store' export default { install (Vue, options) { // 权限匹配 /** * * @param {String} str 权限标识 */ Vue.prototype.$permissionMatch = function (str) { // 超级管理员具备所有权限 if(store.getters.userInfo.adminFlag) { return true } let t = false; if(!store.getters.permissions) { return false } if (store.getters.permissions.indexOf(str) == -1) { if (!str || str == '') { t = true; }else { t = false } } else { t = true } return t } // 根据权限标识返回对应中文名 /** * * @param {String} flag 权限标识 * @param {String} text 默认文字,即匹配失败或无需匹配时的显示 */ Vue.prototype.$permissionLabel = function (flag, text) { let temp = text if(store.state.user && store.state.user.permissions) { let keys = Object.keys(store.state.user.permissions) if(keys.indexOf(flag) > -1 && store.state.user.permissions[flag]) { temp = store.state.user.permissions[flag] } } return temp } } } ================================================ FILE: src/util/store.js ================================================ /** * wyQAQ * 1396871452@qq.com */ import { validatenull } from '@/util/validate' import website from '@/const/website' const keyName = website.key + '-'; /** * 存储localStorage */ export const setStore = (params = {}) => { let { name, content, type, } = params; name = keyName + name let obj = { dataType: typeof (content), content: content, type: type, datetime: new Date().getTime() } localStorage.setItem(name, JSON.stringify(obj)); } /** * 获取localStorage */ export const getStore = (params = {}) => { let { name, debug, type } = params; name = keyName + name let obj = {},content; obj = localStorage.getItem(name); if (validatenull(obj)) { if(type){ return; }else{ obj = localStorage.getItem(name); } }else{ try { obj = JSON.parse(obj); } catch{ return obj; } if (debug) { return obj; } if (obj.dataType == 'string') { content = obj.content; } else if (obj.dataType == 'number') { content = Number(obj.content); } else if (obj.dataType == 'boolean') { content = eval(obj.content); } else if (obj.dataType == 'object') { content = obj.content; } return content; } } /** * 删除localStorage */ export const removeStore = (params = {}) => { let { name, type } = params; name = keyName + name sessionStorage.removeItem(name); localStorage.removeItem(name); } /** * 获取全部localStorage */ export const getAllStore = (params = {}) => { let list = []; let { type } = params; for (let i = 0; i <= localStorage.length; i++) { list.push({ name: localStorage.key(i), content: getStore({ name: localStorage.key(i), }) }) } return list; } /** * 清空全部localStorage */ export const clearStore = (params = {}) => { let { type } = params; sessionStorage.clear(); localStorage.clear() } ================================================ FILE: src/util/url.js ================================================ /** * wyQAQ * 1396871452@qq.com */ import Vue from 'vue' export default { install (Vue, options) { // 打开链接 用于 预览、下载、打开地址 Vue.prototype.$openUrl=function (url, type) { let typeTemp='_blank' if (type) { typeTemp=type } if (url) { let link=document.createElement('a') link.style.display='none' link.target=typeTemp link.href=url document.body.appendChild(link) link.click() document.body.removeChild(link) } } } } ================================================ FILE: src/util/util.js ================================================ import {validatenull} from './validate' import request from '@/router/axios' import * as CryptoJS from'crypto-js' // 表单序列化 export const serialize = data => { let list = [] Object.keys(data).forEach(ele => { list.push(`${ele}=${data[ele]}`) }) return list.join('&') } export const getObjType = obj => { var toString = Object.prototype.toString var map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regExp', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object' } if (obj instanceof Element) { return 'element' } return map[toString.call(obj)] } /** * 对象深拷贝 */ export const deepClone = data => { var type = getObjType(data) var obj if (type === 'array') { obj = [] } else if (type === 'object') { obj = {} } else { // 不再具有下一层次 return data } if (type === 'array') { for (var i = 0, len = data.length; i < len; i++) { obj.push(deepClone(data[i])) } } else if (type === 'object') { for (var key in data) { obj[key] = deepClone(data[key]) } } return obj } /** * 判断路由是否相等 */ export const diff = (obj1, obj2) => { delete obj1.close var o1 = obj1 instanceof Object var o2 = obj2 instanceof Object if (!o1 || !o2) { /* 判断不是对象 */ return obj1 === obj2 } if (Object.keys(obj1).length !== Object.keys(obj2).length) { return false // Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如:数组返回下表:let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2; } for (var attr in obj1) { var t1 = obj1[attr] instanceof Object var t2 = obj2[attr] instanceof Object if (t1 && t2) { return diff(obj1[attr], obj2[attr]) } else if (obj1[attr] !== obj2[attr]) { return false } } return true } /** * 设置灰度模式 */ export const toggleGrayMode = (status) => { if (status) { document.body.className = document.body.className + ' grayMode' } else { document.body.className = document.body.className.replace(' grayMode', '') } } /** * 设置主题 */ export const setTheme = (name) => { document.body.className = name } /** *加密处理 */ export const encryption = (params) => { let { data, type, param, key } = params const result = JSON.parse(JSON.stringify(data)) if (type === 'Base64') { param.forEach(ele => { result[ele] = btoa(result[ele]) }) } else { param.forEach(ele => { var data = result[ele] key = CryptoJS.enc.Utf8.parse(key) var iv = key // 加密 var encrypted = CryptoJS.AES.encrypt( data, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }) result[ele] = encrypted.ciphertext.toString() }) } return result } /** *解密处理 */ export const decryption = (params) => { let { data, type, param, key } = params const result = JSON.parse(JSON.stringify(data)) if (type === 'Base64') { param.forEach(ele => { result[ele] = btoa(result[ele]) }) } else { param.forEach(ele => { var data = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(result[ele])) key = CryptoJS.enc.Utf8.parse(key) var iv = key // 解密 let decrypted = CryptoJS.AES.decrypt( data, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }) result[ele] = decrypted.toString(CryptoJS.enc.Utf8) }) } return result } /** * 浏览器判断是否全屏 */ export const fullscreenToggel = () => { if (fullscreenEnable()) { exitFullScreen(); } else { reqFullScreen(); } }; /** * esc监听全屏 */ export const listenfullscreen = (callback) => { function listen() { callback() } document.addEventListener("fullscreenchange", function () { listen(); }); document.addEventListener("mozfullscreenchange", function () { listen(); }); document.addEventListener("webkitfullscreenchange", function () { listen(); }); document.addEventListener("msfullscreenchange", function () { listen(); }); }; /** * 浏览器判断是否全屏 */ export const fullscreenEnable = () => { return document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen } /** * 浏览器全屏 */ export const reqFullScreen = () => { if (document.documentElement.requestFullScreen) { document.documentElement.requestFullScreen(); } else if (document.documentElement.webkitRequestFullScreen) { document.documentElement.webkitRequestFullScreen(); } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } }; /** * 浏览器退出全屏 */ export const exitFullScreen = () => { if (document.documentElement.requestFullScreen) { document.exitFullScreen(); } else if (document.documentElement.webkitRequestFullScreen) { document.webkitCancelFullScreen(); } else if (document.documentElement.mozRequestFullScreen) { document.mozCancelFullScreen(); } }; /** * 递归寻找子类的父类 */ export const findParent = (menu, id) => { for (let i = 0; i < menu.length; i++) { if (menu[i].children.length != 0) { for (let j = 0; j < menu[i].children.length; j++) { if (menu[i].children[j].id == id) { return menu[i] } else { if (menu[i].children[j].children.length != 0) { return findParent(menu[i].children[j].children, id) } } } } } } /** * 动态插入css */ export const loadStyle = url => { const link = document.createElement('link') link.type = 'text/css' link.rel = 'stylesheet' link.href = url const head = document.getElementsByTagName('head')[0] head.appendChild(link) } /** * 判断路由是否相等 */ export const isObjectValueEqual = (a, b) => { let result = true Object.keys(a).forEach(ele => { const type = typeof (a[ele]) if (type === 'string' && a[ele] !== b[ele]) result = false else if (type === 'object' && JSON.stringify(a[ele]) !== JSON.stringify(b[ele])) result = false }) return result } /** * 根据字典的value显示label */ export const findByvalue = (dic, value) => { let result = '' if (validatenull(dic)) return value if (typeof (value) === 'string' || typeof (value) === 'number' || typeof (value) === 'boolean') { let index = 0 index = findArray(dic, value) if (index != -1) { result = dic[index].label } else { result = value } } else if (value instanceof Array) { result = [] let index = 0 value.forEach(ele => { index = findArray(dic, ele) if (index != -1) { result.push(dic[index].label) } else { result.push(value) } }) result = result.toString() } return result } /** * 根据字典的value查找对应的index */ export const findArray = (dic, value) => { for (let i = 0; i < dic.length; i++) { if (dic[i].value == value) { return i } } return -1 } /** * 生成随机len位数字 */ export const randomLenNum = (len, date) => { let random = '' random = Math.ceil(Math.random() * 100000000000000).toString().substr(0, len || 4) if (date) random = random + Date.now() return random } /** * 格式化时间字符串 */ export const formatDateTime = (val, type) => { let str = '' if(typeof val == 'object') { let Y = val.getFullYear() let M = val.getMonth() let D = val.getDay() let h = val.getHours() let m = val.getMinutes() let s = val.getSeconds() if(type == 'yyyy-MM-dd hh:mm:ss') { str = Y + '-' + ( M<10?('0'+M) : M ) + '-' + ( D<10?('0'+D) : D) + ' ' + (h<10?('0'+h) : h) + ':' + (m<10?('0'+m) : m) + ':' + (s<10?('0'+s) : s) } } } /** * 去除对象中的空值参数,null和undefined */ export const noEmptyOfObject = (obj) => { if(typeof obj == 'object') { if(obj instanceof Array) { return obj }else{ let temp = {} for(let i in obj) { if(obj[i] || obj[i] == false || obj[i] == 0) { temp[i] = obj[i] } } return temp } }else{ return obj } } export const consoleDraw = (str, style) => { console.log(str, ...style) } ================================================ FILE: src/util/validate.js ================================================ /** * wyQAQ * 1396871452@qq.com */ /** * 邮箱 * @param {*} s */ export function isEmail (s) { return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s) } /** * 手机号码 * @param {*} s */ export function isMobile (s) { return /^1[0-9]{10}$/.test(s) } /** * 电话号码 * @param {*} s */ export function isPhone (s) { return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s) } /** * URL地址 * @param {*} s */ export function isURL (s) { return /^http[s]?:\/\/.*/.test(s) } export function isvalidUsername (str) { const valid_map = ['admin', 'editor'] return valid_map.indexOf(str.trim()) >= 0 } /* 合法uri */ export function validateURL (textval) { const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ return urlregex.test(textval) } /* 小写字母 */ export function validateLowerCase (str) { const reg = /^[a-z]+$/ return reg.test(str) } /* 大写字母 */ export function validateUpperCase (str) { const reg = /^[A-Z]+$/ return reg.test(str) } /* 大小写字母 */ export function validatAlphabets (str) { const reg = /^[A-Za-z]+$/ return reg.test(str) } /* 验证pad还是pc */ export const vaildatePc = function () { const userAgentInfo = navigator.userAgent const Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod' ] let flag = true for (var v = 0; v < Agents.length; v++) { if (userAgentInfo.indexOf(Agents[v]) > 0) { flag = false break } } return flag } /** * validate email * @param email * @returns {boolean} */ export function validateEmail (email) { const re = /^(([^<>()\\[\]\\.,;:\s@"]+(\.[^<>()\\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ return re.test(email) } /** * 判断身份证号码 */ export function cardid (code) { let list = [] let result = true let msg = '' var city = { 11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江 ', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北 ', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏 ', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外 ' } if (!validatenull(code)) { if (code.length == 18) { if (!code || !/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(code)) { msg = '证件号码格式错误' } else if (!city[code.substr(0, 2)]) { msg = '地址编码错误' } else { // 18位身份证需要验证最后一位校验位 code = code.split('') // ∑(ai×Wi)(mod 11) // 加权因子 var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] // 校验位 var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2, 'x'] var sum = 0 var ai = 0 var wi = 0 for (var i = 0; i < 17; i++) { ai = code[i] wi = factor[i] sum += ai * wi } if (parity[sum % 11] != code[17]) { msg = '证件号码校验位错误' } else { result = false } } } else { msg = '证件号码长度不为18位' } } else { msg = '证件号码不能为空' } list.push(result) list.push(msg) return list } /** * 判断手机号码是否正确 */ export function isvalidatemobile (phone) { let list = [] let result = true let msg = '' var isPhone = /^0\d{2,3}-?\d{7,8}$/ // 增加134 减少|1349[0-9]{7},增加181,增加145,增加17[678] if (!validatenull(phone)) { if (phone.length == 11) { if (isPhone.test(phone)) { msg = '手机号码格式不正确' } else { result = false } } else { msg = '手机号码长度不为11位' } } else { msg = '手机号码不能为空' } list.push(result) list.push(msg) return list } /** * 判断姓名是否正确 */ export function validatename (name) { var regName = /^[\u4e00-\u9fa5]{2,4}$/ if (!regName.test(name)) return false return true } /** * 判断是否为整数 */ export function validatenum (num, type) { let regName = /[^\d.]/g if (type == 1) { if (!regName.test(num)) return false } else if (type == 2) { regName = /[^\d]/g if (!regName.test(num)) return false } return true } /** * 判断是否为小数 */ export function validatenumord (num, type) { let regName = /[^\d.]/g if (type == 1) { if (!regName.test(num)) return false } else if (type == 2) { regName = /[^\d.]/g if (!regName.test(num)) return false } return true } /** * 判断是否为空 */ export function validatenull (val) { if (typeof val === 'boolean') { return false } if (typeof val === 'number') { return false } if (val instanceof Array) { if (val.length == 0) return true } else if (val instanceof Object) { if (JSON.stringify(val) === '{}') return true } else { if (val == 'null' || val == null || val == 'undefined' || val == undefined || val == '') return true return false } return false } ================================================ FILE: src/views/catalogview/index.vue ================================================ ================================================ FILE: src/views/common/Comment.vue ================================================ ================================================ FILE: src/views/common/KnowSet.vue ================================================ ================================================ FILE: src/views/common/LuckySheet.vue ================================================ ================================================ FILE: src/views/common/MemberSet.vue ================================================ ================================================ FILE: src/views/common/MindElixir.vue ================================================ ================================================ FILE: src/views/common/Tiptap.vue ================================================ ================================================ FILE: src/views/common/Topology.vue ================================================ ================================================ FILE: src/views/common/api.js ================================================ import request from '@/router/axios' // 获取目录树 export function documentSearch(params) { return request({ url: `/mgr/document/dcLibrary/document/search`, method: "get", params: params }); } //获取文件已读次数 export function readNumber(id) { return request({ url: `/mgr/document/dcLibrary/document/read/total/${id}`, method: "get", }); } // 获取文档编辑记录 export function editLog(params) { return request({ url: `/mgr/document/dcLibrary/document/edit/log`, method: 'get', params: params }) } //获取点赞人员列表 export function getLike(params) { return request({ url:`/mgr/document/dcLibrary/like`, method:'get', params: params }) } //点赞操作 export function giveGood(params) { return request({ url:`/mgr/document/dcLibrary/like`, method:'post', params: params }) } //获取知识库留言分页 export function getComment(id,data) { return request({ url:`/mgr/document/dcLibrary/comment/page/${id}`, method:'get', params: data }) } //添加留言 export function leaveMsg(data) { // console.log(data); return request({ // url:`/mgr/document/dcLibrary/comment/save/${data.id}?message=${data.message}`, url:`/mgr/document/dcLibrary/comment/save`, method:'post', data: data }) } // 重命名知识库-目录-文档,或设置知识库 export function setLibrary(data) { return request({ url:`/mgr/document/dcLibrary`, method:'put', data: data }) } // 添加知识库、目录、文件 export function addLibrary(data) { return request({ url:`/mgr/document/dcLibrary`, method:'post', data: data }) } // 查询知识库成员 export function queryMember(id, params) { return request({ url:`/mgr/document/dcLibrary/query/member/${id}`, method:'get', params: params }) } // 知识库成员角色修改 export function setMemberRole(documentId, userId, role) { return request({ url:`/mgr/document/dcLibrary/modify/role/${documentId}/${userId}/${role}`, method:'put' }) } // 添加知识库成员 export function addMember(data) { return request({ url:`/mgr/document/dcLibrary/add/member`, method:'put', data: data }) } // 预览文档 export const preview = (id) => { return request({ url: `/mgr/document/dcLibrary/preview/document/${id}`, method: 'get' }) } // 保存文档 export const saveContent = (contentId, data) => { return request({ url: `/mgr/document/dcLibrary/save/content/${contentId}`, method: 'post', data: data }) } // 删除知识库成员 export function delMember(documentId, userId) { return request({ url:`/mgr/document/dcLibrary/delete/member/${documentId}/${userId}`, method:'delete', }) } // 删除用户留言 export function delMsg(id) { return request({ url:`/mgr/document/dcLibrary/comment/del/${id}`, method:'delete', }) } // 自定义上传富文本图片 export function uploadImage(data) { return request({ url:`/api/file/upload/jvshtmleditor`, method:'post', data: data }) } ================================================ FILE: src/views/common/draw.js ================================================ import { consoleDraw } from '@/util/util' export const declare = () => { consoleDraw('%c此框架为公共免费使用,为保证大家有一个流畅的使用环境,特此将所有网络请求QPS进行限制, 如果发现长期存在恶意或爆破行为,则将禁封IP,或直接将此平台进行下架,开源不易希望共同维护。', ['font-size: 12px;color: #7266d5;']) consoleDraw('%cw%cy%cQ%cA%cQ', [ 'color: #224380;font-size: 20px;margin-right: 5px;font-weight: 600;', 'color: #58A7F2;font-size: 20px;', 'font-size: 24px;background: #F4605F;color: #fff;padding: 5px;', 'border: 1px solid #8F4CFF;padding: 5px;border-radius: 50%;', 'font-size: 24px;background: #F4605F;color: #fff;padding: 5px;' ]) } ================================================ FILE: src/views/common/search.vue ================================================ ================================================ FILE: src/views/common/show.vue ================================================ ================================================ FILE: src/views/common/tiptap/extension.js ================================================ import {Heading, FontSize} from 'element-tiptap' import {convertToPX, headingToDOM, ParagraphNodeSpec, getAttrs} from './tiptapPlugin' export class myHeading extends Heading { constructor(props,myAttribute) { super(props) } get schema () { return { ...ParagraphNodeSpec, attrs: { ...ParagraphNodeSpec.attrs, level: { default: 1, }, }, defining: true, draggable: false, parseDOM: this.options.levels.map((level) => ({ tag: `h${level}`, getAttrs, })), toDOM(node) { const dom = headingToDOM(node); const level = node.attrs.level || 1; dom[0] = `h${level}`; return dom; }, } } } export class myFontSize extends FontSize { constructor(props,myAttribute) { super(props) } get schema () { return { attrs: { px: '', }, inline: true, group: 'inline', parseDOM: [ { style: 'font-size', getAttrs: (fontSize) => { const attrs = {}; if (!fontSize) return attrs; const px = convertToPX(fontSize); if (!px) return attrs; return { px, }; }, }, ], toDOM (node) { const { px } = node.attrs; let attrs = {}; if (px) { attrs.style = `font-size: ${px}px;line-height:100%;`; } return ['span', attrs, 0]; }, }; } } ================================================ FILE: src/views/common/tiptap/tiptapPlugin.js ================================================ import { v4 as uuidv4 } from 'uuid'; const SIZE_PATTERN = /([\d.]+)(px || pt)/i; export const Alignment = { left: 'left', center: 'center', right: 'right', justify: 'justify' } const ALIGN_PATTERN = new RegExp(`(${Alignment.left}|${Alignment.center}|${Alignment.right}|${Alignment.justify})`); const DEFAULT_LINE_HEIGHT = '100%'; const NUMBER_VALUE_PATTERN = /^\d+(.\d+)?$/; export function convertToPX (styleValue) { const matches = styleValue.match(SIZE_PATTERN); if (styleValue.indexOf('pt') > -1) { const value = matches[1] * 4 / 3; return value; } else { const value = matches[1]; return value; } } export function headingToDOM (node) { const { textAlign, indent, lineHeight } = node.attrs; let style = ''; const attrs = {}; if (textAlign && textAlign !== 'left') { style += `text-align: ${textAlign};`; } if (indent) { attrs['data-indent'] = indent; } if (lineHeight) { const cssLineHeight = transformLineHeightToCSS(lineHeight); style += `line-height: ${cssLineHeight};`; } // 添加id attrs['id'] = uuidv4() style && (attrs.style = style); return ['p', attrs, 0]; } export function getAttrs (dom) { const attrs = paragraphNodeSpecGetAttrs(dom); const level = dom.nodeName.match(/[H|h](\d)/)[1]; attrs.level = Number(level); return attrs; } export const ParagraphNodeSpec = { attrs: { textAlign: { default: null }, indent: { default: null }, lineHeight: { default: null }, }, content: 'inline*', group: 'block', parseDOM: [{ tag: 'p', paragraphNodeSpecGetAttrs, }], toDOM, }; function paragraphNodeSpecGetAttrs (dom) { let { textAlign, lineHeight, } = dom.style; let align = dom.getAttribute('data-text-align') || textAlign || ''; align = ALIGN_PATTERN.test(align) ? align : null; const indent = parseInt(dom.getAttribute('data-indent'), 10) || 0; lineHeight = transformCSStoLineHeight(lineHeight) || null; return { textAlign: align, indent, lineHeight, }; } function toDOM (node) { const { textAlign, indent, lineHeight, } = node.attrs; let style = ''; const attrs = {}; if (textAlign && textAlign !== 'left') { style += `text-align: ${textAlign};`; } if (indent) { attrs['data-indent'] = indent; } if (lineHeight) { const cssLineHeight = transformLineHeightToCSS(lineHeight); style += `line-height: ${cssLineHeight};`; } style && (attrs.style = style); return ['p', attrs, 0]; } function transformCSStoLineHeight (value) { if (!value) return ''; if (value === DEFAULT_LINE_HEIGHT) return ''; let strValue = value; if (NUMBER_VALUE_PATTERN.test(value)) { const numValue = parseFloat(value); strValue = String(Math.round(numValue * 100)) + '%'; if (strValue === DEFAULT_LINE_HEIGHT) return ''; } return parseFloat(strValue) / LINE_HEIGHT_100 + '%'; } ================================================ FILE: src/views/common/toolbar.vue ================================================ ================================================ FILE: src/views/common/topbar.vue ================================================ ================================================ FILE: src/views/companyInfo/index.vue ================================================ ================================================ FILE: src/views/index/api.js ================================================ import request from '@/router/axios' // 查询用户有权限的知识库 export function getDcLibraryList(query) { return request({ url: "/mgr/document/dcLibrary/knowledges", method: "get", params: query }); } // 查询用户自己创建的知识库 export function knowledgesOwner(query) { return request({ url: "/mgr/document/dcLibrary/knowledges/owner", method: "get", params: query }); } // 删除知识库 export function delDcLibrary(id) { return request({ url: `/mgr/document/dcLibrary/${id}`, method: "delete", }); } ================================================ FILE: src/views/index/baseInfo.vue ================================================ ================================================ FILE: src/views/index/index.vue ================================================ ================================================ FILE: src/views/index/page.vue ================================================ ================================================ FILE: src/views/info/icon/demo.css ================================================ /* Logo 字体 */ @font-face { font-family: "iconfont logo"; src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); } .logo { font-family: "iconfont logo"; font-size: 160px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* tabs */ .nav-tabs { position: relative; } .nav-tabs .nav-more { position: absolute; right: 0; bottom: 0; height: 42px; line-height: 42px; color: #666; } #tabs { border-bottom: 1px solid #eee; } #tabs li { cursor: pointer; width: 100px; height: 40px; line-height: 40px; text-align: center; font-size: 16px; border-bottom: 2px solid transparent; position: relative; z-index: 1; margin-bottom: -1px; color: #666; } #tabs .active { border-bottom-color: #f00; color: #222; } .tab-container .content { display: none; } /* 页面布局 */ .main { padding: 30px 100px; width: 960px; margin: 0 auto; } .main .logo { color: #333; text-align: left; margin-bottom: 30px; line-height: 1; height: 110px; margin-top: -50px; overflow: hidden; *zoom: 1; } .main .logo a { font-size: 160px; color: #333; } .helps { margin-top: 40px; } .helps pre { padding: 20px; margin: 10px 0; border: solid 1px #e7e1cd; background-color: #fffdef; overflow: auto; } .icon_lists { width: 100% !important; overflow: hidden; *zoom: 1; } .icon_lists li { width: 100px; margin-bottom: 10px; margin-right: 20px; text-align: center; list-style: none !important; cursor: default; } .icon_lists li .code-name { line-height: 1.2; } .icon_lists .icon { display: block; height: 100px; line-height: 100px; font-size: 42px; margin: 10px auto; color: #333; -webkit-transition: font-size 0.25s linear, width 0.25s linear; -moz-transition: font-size 0.25s linear, width 0.25s linear; transition: font-size 0.25s linear, width 0.25s linear; } .icon_lists .icon:hover { font-size: 100px; } .icon_lists .svg-icon { /* 通过设置 font-size 来改变图标大小 */ width: 1em; /* 图标和文字相邻时,垂直对齐 */ vertical-align: -0.15em; /* 通过设置 color 来改变 SVG 的颜色/fill */ fill: currentColor; /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 normalize.css 中也包含这行 */ overflow: hidden; } .icon_lists li .name, .icon_lists li .code-name { color: #666; } /* markdown 样式 */ .markdown { color: #666; font-size: 14px; line-height: 1.8; } .highlight { line-height: 1.5; } .markdown img { vertical-align: middle; max-width: 100%; } .markdown h1 { color: #404040; font-weight: 500; line-height: 40px; margin-bottom: 24px; } .markdown h2, .markdown h3, .markdown h4, .markdown h5, .markdown h6 { color: #404040; margin: 1.6em 0 0.6em 0; font-weight: 500; clear: both; } .markdown h1 { font-size: 28px; } .markdown h2 { font-size: 22px; } .markdown h3 { font-size: 16px; } .markdown h4 { font-size: 14px; } .markdown h5 { font-size: 12px; } .markdown h6 { font-size: 12px; } .markdown hr { height: 1px; border: 0; background: #e9e9e9; margin: 16px 0; clear: both; } .markdown p { margin: 1em 0; } .markdown>p, .markdown>blockquote, .markdown>.highlight, .markdown>ol, .markdown>ul { width: 80%; } .markdown ul>li { list-style: circle; } .markdown>ul li, .markdown blockquote ul>li { margin-left: 20px; padding-left: 4px; } .markdown>ul li p, .markdown>ol li p { margin: 0.6em 0; } .markdown ol>li { list-style: decimal; } .markdown>ol li, .markdown blockquote ol>li { margin-left: 20px; padding-left: 4px; } .markdown code { margin: 0 3px; padding: 0 5px; background: #eee; border-radius: 3px; } .markdown strong, .markdown b { font-weight: 600; } .markdown>table { border-collapse: collapse; border-spacing: 0px; empty-cells: show; border: 1px solid #e9e9e9; width: 95%; margin-bottom: 24px; } .markdown>table th { white-space: nowrap; color: #333; font-weight: 600; } .markdown>table th, .markdown>table td { border: 1px solid #e9e9e9; padding: 8px 16px; text-align: left; } .markdown>table th { background: #F7F7F7; } .markdown blockquote { font-size: 90%; color: #999; border-left: 4px solid #e9e9e9; padding-left: 0.8em; margin: 1em 0; } .markdown blockquote p { margin: 0; } .markdown .anchor { opacity: 0; transition: opacity 0.3s ease; margin-left: 8px; } .markdown .waiting { color: #ccc; } .markdown h1:hover .anchor, .markdown h2:hover .anchor, .markdown h3:hover .anchor, .markdown h4:hover .anchor, .markdown h5:hover .anchor, .markdown h6:hover .anchor { opacity: 1; display: inline-block; } .markdown>br, .markdown>p>br { clear: both; } .hljs { display: block; background: white; padding: 0.5em; color: #333333; overflow-x: auto; } .hljs-comment, .hljs-meta { color: #969896; } .hljs-string, .hljs-variable, .hljs-template-variable, .hljs-strong, .hljs-emphasis, .hljs-quote { color: #df5000; } .hljs-keyword, .hljs-selector-tag, .hljs-type { color: #a71d5d; } .hljs-literal, .hljs-symbol, .hljs-bullet, .hljs-attribute { color: #0086b3; } .hljs-section, .hljs-name { color: #63a35c; } .hljs-tag { color: #333333; } .hljs-title, .hljs-attr, .hljs-selector-id, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo { color: #795da3; } .hljs-addition { color: #55a532; background-color: #eaffea; } .hljs-deletion { color: #bd2c00; background-color: #ffecec; } .hljs-link { text-decoration: underline; } /* 代码高亮 */ /* PrismJS 1.15.0 https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ /** * prism.js default theme for JavaScript, CSS and HTML * Based on dabblet (http://dabblet.com) * @author Lea Verou */ code[class*="language-"], pre[class*="language-"] { color: black; background: none; text-shadow: 0 1px white; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #b3d4fc; } @media print { code[class*="language-"], pre[class*="language-"] { text-shadow: none; } } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background: #f5f2f0; } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: slategray; } .token.punctuation { color: #999; } .namespace { opacity: .7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #905; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #690; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #9a6e3a; background: hsla(0, 0%, 100%, .5); } .token.atrule, .token.attr-value, .token.keyword { color: #07a; } .token.function, .token.class-name { color: #DD4A68; } .token.regex, .token.important, .token.variable { color: #e90; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: src/views/info/icon/demo_index.html ================================================ iconfont Demo

  • 编辑记录
    &#xe698;
  • 展 开 (1)
    &#xe614;
  • 展 开
    &#xe62a;
  • 返回顶部
    &#xe6b9;
  • 删除
    &#xe6c7;
  • 点赞
    &#xe60c;
  • 时间 (1)
    &#xe605;
  • 眼睛
    &#xe8c7;
  • 人员
    &#xe61a;

Unicode 引用


Unicode 是字体在网页端最原始的应用方式,特点是:

  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • 默认情况下不支持多色,直接添加多色图标会自动去色。

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

Unicode 使用步骤如下:

第一步:拷贝项目下面生成的 @font-face

@font-face {
  font-family: 'iconfont';
  src: url('iconfont.woff2?t=1628043039155') format('woff2'),
       url('iconfont.woff?t=1628043039155') format('woff'),
       url('iconfont.ttf?t=1628043039155') format('truetype');
}

第二步:定义使用 iconfont 的样式

.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

第三步:挑选相应图标并获取字体编码,应用于页面

<span class="iconfont">&#x33;</span>

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

  • 编辑记录
    .icon-icon
  • 展 开 (1)
    .icon-001zhankai
  • 展 开
    .icon-zhankai
  • 返回顶部
    .icon-fanhuidingbu
  • 删除
    .icon-shanchu
  • 点赞
    .icon-dianzan
  • 时间 (1)
    .icon-shijian
  • 眼睛
    .icon-yanjing
  • 人员
    .icon-renyuan

font-class 引用


font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

与 Unicode 使用方式相比,具有如下特点:

  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。

使用步骤如下:

第一步:引入项目下面生成的 fontclass 代码:

<link rel="stylesheet" href="./iconfont.css">

第二步:挑选相应图标并获取类名,应用于页面:

<span class="iconfont icon-xxx"></span>

" iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

  • 编辑记录
    #icon-icon
  • 展 开 (1)
    #icon-001zhankai
  • 展 开
    #icon-zhankai
  • 返回顶部
    #icon-fanhuidingbu
  • 删除
    #icon-shanchu
  • 点赞
    #icon-dianzan
  • 时间 (1)
    #icon-shijian
  • 眼睛
    #icon-yanjing
  • 人员
    #icon-renyuan

Symbol 引用


这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

  • 支持多色图标了,不再受单色限制。
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • 浏览器渲染 SVG 的性能一般,还不如 png。

使用步骤如下:

第一步:引入项目下面生成的 symbol 代码:

<script src="./iconfont.js"></script>

第二步:加入通用 CSS 代码(引入一次就行):

<style>
.icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

第三步:挑选相应图标并获取类名,应用于页面:

<svg class="icon" aria-hidden="true">
  <use xlink:href="#icon-xxx"></use>
</svg>
================================================ FILE: src/views/info/icon/iconfont.css ================================================ @font-face { font-family: "iconfont"; /* Project id 2656771 */ src: url('iconfont.woff2?t=1628043039155') format('woff2'), url('iconfont.woff?t=1628043039155') format('woff'), url('iconfont.ttf?t=1628043039155') format('truetype'); } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .icon-icon:before { content: "\e698"; } .icon-001zhankai:before { content: "\e614"; } .icon-zhankai:before { content: "\e62a"; } .icon-fanhuidingbu:before { content: "\e6b9"; } .icon-shanchu:before { content: "\e6c7"; } .icon-dianzan:before { content: "\e60c"; } .icon-shijian:before { content: "\e605"; } .icon-yanjing:before { content: "\e8c7"; } .icon-renyuan:before { content: "\e61a"; } ================================================ FILE: src/views/info/icon/iconfont.js ================================================ !function(t){var e,c,n,o,i,a='',s=(s=document.getElementsByTagName("script"))[s.length-1].getAttribute("data-injectcss"),l=function(t,e){e.parentNode.insertBefore(t,e)};if(s&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}function d(){i||(i=!0,n())}function m(){try{o.documentElement.doScroll("left")}catch(t){return void setTimeout(m,50)}d()}e=function(){var t,e;(e=document.createElement("div")).innerHTML=a,a=null,(t=e.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(t=document.body).firstChild?l(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(e,0):(c=function(){document.removeEventListener("DOMContentLoaded",c,!1),e()},document.addEventListener("DOMContentLoaded",c,!1)):document.attachEvent&&(n=e,o=t.document,i=!1,m(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,d())})}(window); ================================================ FILE: src/views/info/icon/iconfont.json ================================================ { "id": "2656771", "name": "1", "font_family": "iconfont", "css_prefix_text": "icon-", "description": "", "glyphs": [ { "icon_id": "771623", "name": "编辑记录", "font_class": "icon", "unicode": "e698", "unicode_decimal": 59032 }, { "icon_id": "17893881", "name": "展 开 (1)", "font_class": "001zhankai", "unicode": "e614", "unicode_decimal": 58900 }, { "icon_id": "19144837", "name": "展 开", "font_class": "zhankai", "unicode": "e62a", "unicode_decimal": 58922 }, { "icon_id": "2356810", "name": "返回顶部", "font_class": "fanhuidingbu", "unicode": "e6b9", "unicode_decimal": 59065 }, { "icon_id": "8338681", "name": "删除", "font_class": "shanchu", "unicode": "e6c7", "unicode_decimal": 59079 }, { "icon_id": "579286", "name": "点赞", "font_class": "dianzan", "unicode": "e60c", "unicode_decimal": 58892 }, { "icon_id": "5093341", "name": "时间 (1)", "font_class": "shijian", "unicode": "e605", "unicode_decimal": 58885 }, { "icon_id": "11372780", "name": "眼睛", "font_class": "yanjing", "unicode": "e8c7", "unicode_decimal": 59591 }, { "icon_id": "13014641", "name": "人员", "font_class": "renyuan", "unicode": "e61a", "unicode_decimal": 58906 } ] } ================================================ FILE: src/views/info/index.vue ================================================ ================================================ FILE: src/views/main/wx/login.vue ================================================ ================================================ FILE: src/views/my/icon/index.js ================================================ import docType from './wendang.png' import set from './shezhi.png' import share from './fenxiang.png' import liebiao from './liebiaozhanshi.png' import file from './wenjianjia.png' import world from './world.png' import ppt from './PPT.png' import excel from './excel.png' import txt from './txt.png' import naotu from './naotu.png' import flow from './liuchengtu.png' import tupian from './tupian.png' import other from './other.png' export const imgIcon = { docType: docType, set: set, share: share, liebiao: liebiao, file: file, world: world, ppt: ppt, excel: excel, txt: txt, naotu: naotu, flow: flow, tupian: tupian, other: other, } ================================================ FILE: src/views/view/api.js ================================================ import request from '@/router/axios' // 获取目录树 export function getLibTree(id) { return request({ url: `/mgr/document/dcLibrary/tree`, method: "get", params: {id: id} }); } // 查询文档编辑记录 export function getLibEditLog(params) { return request({ url: `/mgr/document/dcLibrary/document/recently/updated`, method: "get", params: params }); } // 查询知识库成员 export function getLibMember(id,params) { return request({ url: `/mgr/document/dcLibrary/query/member/${id}`, method: "get", params: params }); } // 查询指定目录下(不含子目录)所有文件 export function getDocumentList(id) { return request({ url: `/mgr/document/dcLibrary/document/list/${id}`, method: "get" }); } ================================================ FILE: src/views/view/diclibApi.js ================================================ import request from '@/router/axios' // 分页查询 export const pageList = (params) => { return request({ url: `/mgr/document/dcLibrary/page`, method: 'get', params: params }) } // 获取文件树 export const dcLibTree = () => { return request({ url: `/mgr/document/dcLibrary/tree`, method: 'get' }) } // 添加知识库、目录、文件 export const addLib = (data) => { return request({ url: `/mgr/document/dcLibrary`, method: 'post', data: data }) } // 删除 export const delLib = (id) => { return request({ url: `/mgr/document/dcLibrary/${id}`, method: 'delete' }) } // 修改知识库设置 export const editLib = (data) => { return request({ url: `/mgr/document/dcLibrary`, method: 'put', data: data }) } // 预览文档 export const preview = (id) => { return request({ url: `/mgr/document/dcLibrary/preview/document/${id}`, method: 'get' }) } // 查询知识库成员 export const queryUser = (id, params) => { return request({ url: `/mgr/document/dcLibrary/query/member/${id}`, method: 'get', params: params }) } // 添加知识库成员 export const addmember = (data) => { return request({ url: `/mgr/document/dcLibrary/add/member`, method: 'put', data: data }) } // 知识库成员角色修改 export const modifyRole = (documentId, userId, role) => { return request({ url: `/mgr/document/dcLibrary/modify/role/${documentId}/${userId}/${role}`, method: 'put' }) } // 删除知识库成员 export const delmember = (documentId, userId) => { return request({ url: `/mgr/document/dcLibrary/delete/member/${documentId}/${userId}`, method: 'delete' }) } ================================================ FILE: src/views/view/index.vue ================================================ ================================================ FILE: vue.config.js ================================================ /** * 配置该文件可以参考: * https://cli.vuejs.org/zh/config/#%E7%9B%AE%E6%A0%87%E6%B5%8F%E8%A7%88%E5%99%A8 * */ const url = "http://localhost:10000" // 基础路径,发布前修改这里,当前配置打包出来的资源都是相对路径 let path = "jvs-knowledge-ui" // fixme 请修改为自己的前端项目名称 module.exports = { runtimeCompiler: true, //项目路径地址 publicPath: "/", // publicPath: process.env.NODE_ENV !== 'development' ? '/' : ('/' +path), //静态资源文件地址 assetsDir: path + '/static', //静太资源文件 indexPath: path + '/index.html', //打包文件路径 outputDir: 'docker/dist', lintOnSave: true, productionSourceMap: false, chainWebpack: config => { // 忽略的打包文件 config.externals({ 'axios': 'axios' }) const entry = config.entry('app') entry .add('babel-polyfill') .end() entry .add('classlist-polyfill') .end() }, // 配置转发代理 devServer: { port: 8081, proxy: { '/mgr': { target: url, ws: true, pathRewrite: { '^/mgr': '/mgr' } }, '/auth': { target: url, ws: true, pathRewrite: { '^/auth': '/auth' } }, '/api': { target: url, ws: true, pathRewrite: { '^/api': '/api' } }, "^/agreement": { target: url, ws: true, pathRewrite: { "^/agreement": "/agreement" } }, } }, css: { loaderOptions: { // 给 sass-loader 传递选项 sass: { // @/ 是 src/ 的别名 // 注意:在 sass-loader v8 中,这个选项名是 "prependData" v8以下使用 additionalData prependData: `@import "~@/styles/themes/index.scss"` }, // 默认情况下 `sass` 选项会同时对 `sass` 和 `scss` 语法同时生效 // 因为 `scss` 语法在内部也是由 sass-loader 处理的 // 但是在配置 `prependData` 选项的时候 // `scss` 语法会要求语句结尾必须有分号,`sass` 则要求必须没有分号 // 在这种情况下,我们可以使用 `scss` 选项,对 `scss` 语法进行单独配置 scss: { prependData: `@import "~@/styles/themes/index.scss";` }, } } }