commit 090abf48fa11662b6d52b28d29ead022f3c72163 Author: Online Server <1750433663@qq.com> Date: Thu Jul 23 09:40:36 2026 +0800 first commit diff --git a/.env.debug b/.env.debug new file mode 100644 index 0000000..946d744 --- /dev/null +++ b/.env.debug @@ -0,0 +1,7 @@ +APP_DEBUG = true + +[APP] +DEFAULT_TIMEZONE = Asia/Shanghai + +[LANG] +default_lang = zh-cn \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45cfa1b --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +/.idea +/.vscode +/.gitee +*.log +*.env +*.lock +*.ini +/runtime/* +/public/storage/* +/public/backup/* +/app/crud/file/* diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..05dcd6d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "app/qiye"] + url = https://gitee.com/gougufree/qiye + path = app/qiye + diff --git a/404.html b/404.html new file mode 100755 index 0000000..d75ed78 --- /dev/null +++ b/404.html @@ -0,0 +1,6 @@ + +404 Not Found + +

404 Not Found

+
nginx
+ \ No newline at end of file diff --git a/DISCLAIMER.md b/DISCLAIMER.md new file mode 100644 index 0000000..9ea131b --- /dev/null +++ b/DISCLAIMER.md @@ -0,0 +1,14 @@ +# 勾股OA 《免责声明》 + +> 任何用户在使用由勾股技术开发团队(以下简称「本团队」)研发的开源OA办公系统(以下简称「勾股OA」)前,请您仔细阅读并透彻理解本声明。您可以选择不使用勾股OA ,若您一旦使用勾股OA ,您的使用行为即被视为对本声明全部内容的认可和接受。 + +1. 勾股OA是一款基于ThinkPHP + Layui + MySql打造的实用的开源的企业办公系统,本软件及所附带的文件是作为不提供任何明确的或隐含的赔偿或担保的形式提供的。 +2. 您是出于自愿而使用勾股OA的,您必须了解使用勾股OA的风险,本团队不承诺提供任何形式的技术支持、使用担保,也不承担任何因使用本软件而产生问题的相关责任。 +3. 您承诺秉着合法、合理的原则使用勾股OA,不利用勾股OA进行任何违法、侵害他人合法利益等恶意的行为,亦不将勾股OA运用于任何违反我国法律法规的Web平台。 +4. 任何单位或个人因下载使用勾股OA而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失 (包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。 +5. 用户明确并同意本声明条款列举的全部内容,对使用勾股OA可能存在的风险和相关后果将完全由用户自行承担,本团队不承担任何法律责任。 +6. 任何单位或个人在阅读本免责声明后,应在《Apache License 2.0》所允许的范围内进行合法的发布、传播和使用勾股OA等行为,若违反本免责声明条款或违反法律法规所造成的法律责任(包括但不限于民事赔偿和刑事责任),由违约者自行承担。 +7. 本团队对勾股OA拥有知识产权(包括但不限于商标权、专利权、著作权、商业秘密等)。 +8. 任何单位或个人不得在未经本团队书面授权的情况下对勾股OA本身申请相关的知识产权。 +9. 如果本声明的任何部分被认为无效或不可执行,则该部分将被解释为反映本团队的初衷,其余部分仍具有完全效力。不可执行的部分声明,并不构成我们放弃执行该声明的权利。 +10. 本团队有权随时对本声明条款及附件内容进行单方面的变更,并以消息推送、网页公告等方式予以公布,公布后立即自动生效,无需另行单独通知;若您在本声明内容公告变更后继续使用的,表示您已充分阅读、理解并接受修改后的声明内容。 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b24442c --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + 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 2025 勾股开源工作室 + + 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. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..a631476 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,37 @@ + +ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 +版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn) +All rights reserved。 +ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 + +Apache Licence是著名的非盈利开源组织Apache采用的协议。 +该协议和BSD类似,鼓励代码共享和尊重原作者的著作权, +允许代码修改,再作为开源或商业软件发布。需要满足 +的条件: +1. 需要给代码的用户一份Apache Licence ; +2. 如果你修改了代码,需要在被修改的文件中说明; +3. 在延伸的代码中(修改和有源代码衍生的代码中)需要 +带有原来代码中的协议,商标,专利声明和其他原来作者规 +定需要包含的说明; +4. 如果再发布的产品中包含一个Notice文件,则在Notice文 +件中需要带有本协议内容。你可以在Notice中增加自己的 +许可,但不可以表现为对Apache Licence构成更改。 +具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0 + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +勾股OA遵循Apache2开源协议发布,并提供免费使用。 +版权所有Copyright © 2021-2025 by gouguCMS (https://www.gougucms.com) +All rights reserved。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e496924 --- /dev/null +++ b/README.md @@ -0,0 +1,201 @@ +## 📐 勾股OA5.0 + +![勾股OA](https://admin.gougucms.com/oss/slogo.jpg) + +### ✅ 相关链接 +- 系统地址:https://www.gougucms.com/home/pages/detail/s/gouguoa.html +- 文档地址:https://blog.gouguoa.com/home/book/detail/bid/3.html +- 项目会不定时进行更新,建议⭐star⭐和👁️watch👁️一份。 + +### ⭕ 同系列开源项目 +1. [开源项目系列:勾股OA —— OA协同办公系统](https://gitee.com/gougucms/office) +2. [开源项目系列:勾股DEV —— 项目研发管理系统](https://gitee.com/gougucms/dev) +3. [开源项目系列:勾股CMS —— CMS内容管理系统框架](https://gitee.com/gougucms/gougucms) +4. [开源项目系列:勾股BLOG —— 个人&工作室博客系统](https://gitee.com/gougucms/blog) +5. [开源项目系列:勾股Admin —— 基于Layui的Web UI解决方案](https://gitee.com/gouguopen/guoguadmin) + + +### 📋 系统介绍 + **我们的愿景是:助力企业数智化。** + +勾股OA是一款基于ThinkPHP8 + Layui + MySql打造的实用的开源的企业办公系统,开箱即用,使用勾股OA可以简单快速地建立企业级的办公自动化系统。 +办公自动化系统是员工及管理者使用频率最高的应用系统,可以极大提高公司的办公效率,我们立志为中小企业提供开源好用的办公自动化系统,帮助企业节省数字化、信息化办公的成本。 + +### ✳️ 演示地址 + +勾股OA演示地址:[https://www.gouguoa.com](https://www.gouguoa.com) + +沟通咨询请加微信号:hdm588 + +PS:为了给后面的人提供良好的演示体验,体验以查看为主,如果确实需要填写数据,大家最好填些看似正常的数据,请不要乱填数据,比如:`1111`,`aaa`这些数据就不要乱填入了。 + +体验账号及密码: +~~~ +BOSS角色:suhaizhen 123456 +总 经 理:yiyeshu 123456 +人事总监:fengcailing 123456 +财务总监:yucixin 1234566 +市场总监:qinjiaxian 1234566 +技术总监:yexiaochai 1234566 +销售组长:fujianfenshuo 123456 +销售组长:jianzixianji 123456 +销售组长:shuloulongsu 123456 +客服经理:hongchenxue 123456 +客服人员:guxinglei 123456 +~~~ + +### ✴️ 系统特点 +- 系统各功能模块,一目了然,操作简单;通用型的后台权限管理框架,员工的操作记录全覆盖跟踪,紧随潮流、极低门槛、开箱即用。 +- 系统集成了系统设置、人事管理、行政管理、消息管理、企业公告、知识网盘、审批流程设置、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理、任务管理等基础模块。 +- 系统方便二次开发,易于功能扩展,代码维护,满足专注业务深度开发的需求。 +- 开发人员可以快速基于此系统进行二次开发,免去写一次系统架构的痛苦,帮助开发者高效降低开发的成本,通过二次开发之后可以用来做CRM,ERP,项目管理等企业办公系统。 + +**功能矩阵** + +系统后台集成了主流的通用功能,如:登录验证、系统配置、操作日志管理、角色权限、职位职称、数据权限、功能菜单、模块管理、关键字管理、文件上传、数据备份/还原、基础数据、审批流程、员工管理、消息通知、企业公告、知识文章、办公审批、日常办公、财务管理、客户管理、合同管理、项目管理、任务管理等。更多的个性化功能可以基于当前系统便捷做二次开发。 + +![输入图片说明](https://admin.gougucms.com/oss/gouguoa2.0.png) + + +### 📚 安装教程 + +**一、服务器。** + +服务器最低配置: +~~~ + 2核CPU (建议4核+) + 4G内存 (建议8G+) + 3M带宽 (建议5M+) +~~~ +服务器运行环境要求: +~~~ + PHP >= 8.2 + Mysql >= 5.7.0 (需支持innodb引擎) + Apache 或 Nginx + PDO PHP Extension + MBstring PHP Extension + CURL PHP Extension + FileInfo PHP Extension + Composer (用于管理第三方扩展包) +~~~ + +**二、系统安装** + +**命令行安装(推荐)** + +推荐使用命令行安装,因为采用命令行安装的方式可以和勾股OA随时保持更新同步。使用命令行安装请提前准备好`Git`、`Composer`。 + +**勾股OA的安装步骤,以下加粗的内容需要特别留意:** + +第一步:克隆(下载)勾股OA到你本地 **(如果不用git的可以在代码仓库上角打包下载代码,然后解压上传到服务器)** +~~~ + git clone https://gitee.com/gougucms/office.git +~~~ + +第二步:进入目录 +~~~ + cd gouguoa(解压后文件所在的根目录) + ~~~ +第三步:下载PHP依赖包 +~~~ + composer install + ~~~ + +第四步:添加虚拟主机并绑定到项目的`public`目录 ,实际部署中,确保绑定域名访问到的是`public`目录。**(这一步很重要,很多人出错)** + +第五步:伪静态配置 **(这一步也很重要,很多人出错)**,使用的是ThinkPHP的伪静态规则,**具体看下面的伪静态配置内容**。 + +**Nginx** +修改nginx.conf 配置文件 加入下面的语句。 +~~~ + location / { + if (!-e $request_filename){ + rewrite ^(.*)$ /index.php?s=$1 last; break; + } + } +~~~ + +**Apache** +把下面的内容保存为.htaccess文件放到应用入 public 文件的同级目录下。 +~~~ + + Options +FollowSymlinks -Multiviews + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] + +~~~ + +第六步:访问 http://www.你的域名.com/install/index 进行安装**(访问主域名,系统会自动跳转到安装连接的)** + +⚠️⚠️ **注意:安装过程中,系统会自动创建数据表,请确保填写的数据库用户的权限可创建数据表,请先手动创建空的数据库(比如:gouguoa),然后填写刚刚创建的数据库名称、用户名、密码完成安装。** + +🔺🔺 **提醒:安装过程中,如果进度条卡住,一般都是数据库写入权限或者config无法写入,一般是安装环境配置问题,请注意检查。遇到问题请到QQ群反馈:24641076(群一满),46924914(群二名额紧张),295256660(群三额不多)** + +✅✅ **PS:如需要重新安装,请删除目录里面 config/install.lock 的文件,即可重新安装。** + + +### ❓ 常见问题 + +1. 如果是 Composer 安装失败,可能存在php配置文件禁止了`putenv`和`proc_open`函数。解决方法,查找`php.ini`文件位置,打开`php.ini`,搜索`disable_functions`项,看是否禁用了`putenv`和`proc_open`函数。如果在禁用列表里,移除`putenv`、`proc_open`然后退出,重启`php`即可。 + +2. 如果安装后打开页面提示 `404`错误,请检查服务器伪静态配置,如果是宝塔面板,网站伪静态请配置使用thinkphp规则。 + +3. 如果提示当前权限不足,无法写入配置文件`config/database.php`,请检查`config`目录是否可写,还有可能是当前安装程序无法访问父目录,请检查PHP的`open_basedir`配置,还有可能是服务器Nginx、Apache的执行者无权限的问题。 + +4、如果`composer install`失败,可能是国际网络问题,请尝试在命令行进行切换配置到国内源镜像,命令如下: + +腾讯云镜像: +```shell +composer config -g repos.packagist composer https://mirrors.tencent.com/composer/ +``` + +阿里云镜像: +```shell +composer config -g repos.packagist composer https://mirrors.aliyun.com/composer/ +``` + +5. 访问 http://www.你的域名.com/install/index 前,请注意查看伪静态请配置是否设置了伪静态规则。 + +6. 出现访问报错一般是服务器环境配置问题 + + 比如:伪静态配置,网站的访问入口是否绑定`public`目录,放配置文件的目录是否有可写权限,放缓存的目录是否有可写权限,数据库连接确认无误等。 + + 开启`debug`的方式请查看链接:https://blog.gouguoa.com/home/book/detail/bid/3/id/77.html + + 开启`debug`后,看具体的报错信息,然后沿着这些思路去一个个排查基本解决90%的问题。 + +7. 如果是`composer`的安装,`composer install`报错问题,这不是勾股系列系统的问题,可以百度得到具体解决方案的。 + +8. 安装过程中,如果 **进度条卡住(99%)**,一般都是数据库写入权限或者安装环境配置`config`目录无法写入问题,请注意检查权限。 + +9. 如果安装成功后,无法显示图形验证码的,请看是否已安装(开启)了PHP的`GD`库。 + +10. 如果安装成功后,无法上传文件的,请看是否已安装(开启)了PHP的`fileinfo`扩展。 + +11. 遇到解决不了的问题请到QQ群反馈:24641076(群一),46924914(群二),295256660(群三) 。 + +12. 更多问题请查看链接解决:https://blog.gougucms.com/home/book/detail/bid/3/id/100.html + +**最后,如果实在安装不成功,确实需要提供安装服务的,请搜索微信号:hdm588,或者QQ号:327725426,添加好友,注意备注[安装勾股系统]。开源不易,该服务需友情赞赏💰99元。** + +### 🖼️ 截图预览 + +|页面截图 | 部分截图| +| :--------: | :--------:| +| ![功能导图](https://admin.gougucms.com/oss/oa4.png "功能导图")|![功能导图](https://admin.gougucms.com/oss/oa1.png "功能导图")| +|![功能导图](https://admin.gougucms.com/oss/oa2.png "功能导图")|![功能导图](https://admin.gougucms.com/oss/oa3.png "功能导图")| + +### ⭐ 开源助力 + +- 开源协议:勾股OA遵循Apache License 2.0开源协议发布。 +- 版权声明:要求在软件和相关文档中保留包含原始版权声明等信息。 +- 免责声明:该软件是按现状提供的,没有任何明示或暗示的担保或保证,作者不承担任何赔偿责任。 +- 贡献参与:开源的系统少不了大家的参与,如果大家在体验的过程中发现有问题或者BUG,请到Issue里面反馈,谢谢! +- 鼓励支持:如果觉得勾股OA不错,不要吝啬您的赞许和鼓励,请给我们⭐ STAR ⭐吧! + +### 👍 支持我们 +- 商务合作、定制服务,请搜索微信号:hdm588,添加微信咨询了解🤝。 +- If the project is very helpful to you, you can buy the author a cup of coffee☕. +- 如果这个项目对您有帮助,可以请作者喝杯咖啡哟☕(👇👇👇点击下面的捐赠支持我们👇👇👇) diff --git a/app/adm/common.php b/app/adm/common.php new file mode 100644 index 0000000..328bb5b --- /dev/null +++ b/app/adm/common.php @@ -0,0 +1,18 @@ + ++----------------------------------------------------------------------------------------------- +*/ +/** +====================== + *模块数据获取公共文件 +====================== + */ +use think\facade\Db; \ No newline at end of file diff --git a/app/adm/controller/Api.php b/app/adm/controller/Api.php new file mode 100644 index 0000000..3fc024b --- /dev/null +++ b/app/adm/controller/Api.php @@ -0,0 +1,173 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\adm\controller; + +use app\api\BaseController; +use app\adm\model\Property; +use app\adm\model\Car; +use think\facade\Db; +use think\facade\View; + +class Api extends BaseController +{ + public function get_propertycate() + { + $cate = get_base_data('PropertyCate'); + return to_assign(0, '', $cate); + } + + public function get_propertycate_tree() + { + $cate = get_base_data('PropertyCate'); + $list = get_tree($cate, 0, 2); + $data['trees'] = $list; + return json($data); + } + //获取资产数据 + public function get_property() + { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['p.status', '=', 1]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $model = new Property(); + $list = $model->datalist($where, $param); + return table_assign(0, '', $list); + } + + //获取车辆信息 + public function get_car() + { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['title|name', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $model = new Car(); + $list = $model->datalist($where, $param); + return table_assign(0, '', $list); + } + + //获取车辆维修信息 + public function get_car_repair() + { + $param = get_params(); + $where = array(); + $where[] = ['cr.car_id','=',$param['car_id']]; + $where[] = ['cr.types','=',1]; + $where[] = ['cr.delete_time','=',0]; + $model = new Car(); + $list = $model->repairlist($where, $param); + return table_assign(0, '', $list); + } + //获取车辆保养信息 + public function get_car_protect() + { + $param = get_params(); + $where = array(); + $where[] = ['cr.car_id','=',$param['car_id']]; + $where[] = ['cr.types','=',2]; + $where[] = ['cr.delete_time','=',0]; + $model = new Car(); + $list = $model->repairlist($where, $param); + return table_assign(0, '', $list); + } + + //获取车辆费用信息 + public function get_car_fee() + { + $param = get_params(); + $where = array(); + $where[] = ['cf.car_id','=',$param['car_id']]; + $where[] = ['cf.delete_time','=',0]; + $model = new Car(); + $list = $model->feelist($where, $param); + return table_assign(0, '', $list); + } + + //获取车辆费用信息 + public function get_car_mileage() + { + $param = get_params(); + $where = array(); + $where[] = ['car_id','=',$param['car_id']]; + $where[] = ['delete_time','=',0]; + $model = new Car(); + $list = $model->mileagelist($where, $param); + return table_assign(0, '', $list); + } + + //获取会议室 + public function get_meeting_room() + { + $list = Db::name('MeetingRoom')->where('status',1)->paginate(['list_rows'=> 20]); + return table_assign(0, '', $list); + } + + //获取审核类型 + public function get_flow_item() + { + $param = get_params(); + $flows = Db::name('FlowItem')->where(['flow_cate'=>$param['cate'],'status'=>1])->select()->toArray(); + return to_assign(0, '', $flows); + } + + //修改公章状态 + public function set_seal_status() + { + $param = get_params(); + $res = Db::name('Seal')->where(['id'=>$param['id']])->update(['status'=>$param['status']]); + if($res!==false){ + return to_assign(); + } + else{ + return to_assign(1, '操作失败'); + } + } + + //测试demo + public function work_flow() + { + return view('/flow/work_flow'); + } + + public function table() + { + $param = get_params(); + $prefix = config('database.connections.mysql.prefix'); + //查询指定表信息 + $table_info = Db::query('SHOW TABLE STATUS LIKE ' . "'" .$prefix.$param['name'] . "'"); + if(empty($table_info)){ + return view(EEEOR_REPORTING,['code'=>406,'warning'=>'找不到该数据表']); + } + $table_columns = Db::query("SHOW FULL COLUMNS FROM " .$prefix.$param['name']); + $columns=[]; + foreach($table_columns as $key=>$val) { + if (strpos($val['Type'], 'int') !== false || strpos($val['Type'], 'decimal') !== false) { + $columns[]=$val; + } + } + //var_dump($table_info);exit; + //dd($table_columns);exit; + View::assign('id', 0); + View::assign('columns', $columns); + return view('/flow/table'); + } +} diff --git a/app/adm/controller/Basic.php b/app/adm/controller/Basic.php new file mode 100644 index 0000000..f6f2116 --- /dev/null +++ b/app/adm/controller/Basic.php @@ -0,0 +1,93 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\validate\BasicAdmCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Basic extends BaseController +{ + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + if (!empty($param['types'])) { + $where[] = ['types', '=', $param['types']]; + } + $list = Db::name('BasicAdm')->where($where)->order('create_time asc')->select(); + return to_assign(0, '', $list); + } else { + return view(); + } + } + //新建编辑 + public function add() + { + if (request()->isAjax()) { + $param = get_params(); + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(BasicAdmCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('BasicAdm')->strict(false)->field('title,types,id,update_time')->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(BasicAdmCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('BasicAdm')->strict(false)->field('title,types,id,create_time')->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } + } + + //设置 + public function set() + { + $param = get_params(); + $res = Db::name('BasicAdm')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } +} diff --git a/app/adm/controller/Car.php b/app/adm/controller/Car.php new file mode 100644 index 0000000..fb1ccb3 --- /dev/null +++ b/app/adm/controller/Car.php @@ -0,0 +1,501 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\Car as CarModel; +use app\adm\validate\CarValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Car extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CarModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['insure_time'])) { + $param['insure_time'] = strtotime($param['insure_time']); + } + if (isset($param['review_time'])) { + $param['review_time'] = strtotime($param['review_time']); + } + if (isset($param['buy_time'])) { + $param['buy_time'] = strtotime($param['buy_time']); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(CarValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(CarValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + if(!empty($detail['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + if($detail['driver']>0){ + $detail['driver_name'] = Db::name('Admin')->where('id','=',$detail['driver'])->value('name'); + } + View::assign('detail', $detail); + return view('edit'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + if(!empty($detail['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + if($detail['driver']>0){ + $detail['driver_name'] = Db::name('Admin')->where('id','=',$detail['driver'])->value('name'); + } + $latestMileage = Db::name('CarMileage')->where(['car_id'=>$detail['id'],'delete_time'=>0])->max('mileage'); + if(empty($latestMileage)){ + $latestMileage = $detail['mileage']; + } + $detail['latestMileage'] = $latestMileage; + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //维修记录列表 + public function repair_list() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $where[] = ['c.title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['cr.repair_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $where[] = ['cr.types','=',1]; + $where[] = ['cr.delete_time','=',0]; + $model = new Car(); + $list = $this->model->repairlist($where, $param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //维修记录添加&编辑 + public function repair_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['repair_time'])) { + $param['repair_time'] = strtotime($param['repair_time']); + } + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('CarRepair')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } else { + $param['create_time'] = time(); + $insertId = Db::name('CarRepair')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $cid = isset($param['cid']) ? $param['cid'] : 0; + if ($id > 0) { + $detail = Db::name('CarRepair')->where(['id' => $id])->find(); + $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name'); + $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view('repair_edit'); + } + if($cid>0){ + View::assign('car', $this->model->getById($cid)); + } + View::assign('cid', $cid); + View::assign('id', $id); + return view(); + } + } + + //维修记录查看 + public function repair_view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = Db::name('CarRepair')->where(['id' => $id])->find(); + $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name'); + $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view(); + } + + //维修记录删除 + public function repair_del() + { + $param = get_params(); + $res = Db::name('CarRepair')->where('id',$param['id'])->update(['delete_time'=>time()]); + if ($res) { + add_log('delete', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + + //保养记录列表 + public function protect_list() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $where[] = ['c.title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['cr.repair_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $where[] = ['cr.types','=',2]; + $where[] = ['cr.delete_time','=',0]; + $list = $this->model->repairlist($where, $param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //保养记录添加&编辑 + public function protect_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['repair_time'])) { + $param['repair_time'] = strtotime($param['repair_time']); + } + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('CarRepair')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } else { + $param['create_time'] = time(); + $param['types'] = 2; + $insertId = Db::name('CarRepair')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $cid = isset($param['cid']) ? $param['cid'] : 0; + if ($id > 0) { + $detail = Db::name('CarRepair')->where(['id' => $id])->find(); + $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name'); + $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view('protect_edit'); + } + if($cid>0){ + View::assign('car', $this->model->getById($cid)); + } + View::assign('cid', $cid); + View::assign('id', $id); + return view(); + } + } + + //保养记录查看 + public function protect_view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = Db::name('CarRepair')->where(['id' => $id])->find(); + $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name'); + $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view(); + } + + //保养记录删除 + public function protect_del() + { + $param = get_params(); + $res = Db::name('CarRepair')->where('id',$param['id'])->update(['delete_time'=>time()]); + if ($res) { + add_log('delete', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + //费用记录列表 + public function fee_list() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $where[] = ['cf.title|c.title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['cf.fee_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + if (!empty($param['types'])) { + $where[] = ['cf.types','=',$param['types']]; + } + $where[] = ['cf.delete_time','=',0]; + $list = $this->model->feelist($where, $param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //费用记录添加&编辑 + public function fee_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['fee_time'])) { + $param['fee_time'] = strtotime($param['fee_time']); + } + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('CarFee')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } else { + $param['create_time'] = time(); + $insertId = Db::name('CarFee')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $cid = isset($param['cid']) ? $param['cid'] : 0; + if ($id > 0) { + $detail = Db::name('CarFee')->where(['id' => $id])->find(); + $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name'); + $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view('fee_edit'); + } + if($cid>0){ + View::assign('car', $this->model->getById($cid)); + } + View::assign('cid', $cid); + View::assign('id', $id); + return view(); + } + } + + //费用记录查看 + public function fee_view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = Db::name('CarFee')->where(['id' => $id])->find(); + $detail['handled_name'] = Db::name('Admin')->where('id',$detail['handled'])->value('name'); + $detail['car'] = Db::name('Car')->where('id',$detail['car_id'])->value('title'); + $detail['types_str'] = Db::name('basicAdm')->where('id',$detail['types'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view(); + } + + //费用记录删除 + public function fee_del() + { + $param = get_params(); + $res = Db::name('CarFee')->where('id',$param['id'])->update(['delete_time'=>time()]); + if ($res) { + add_log('delete', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + //获取里程数记录 + public function mileage_list() + { + $param = get_params(); + $where = array(); + $where[] = ['car_id', '=', $param['car_id']]; + $where[] = ['delete_time', '=', 0]; + $this->model->mileagelist($where, $param); + table_assign(0, '', $list); + } + + //增加里程数记录 + public function mileage_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['mileage_time'])) { + $param['mileage_time'] = strtotime($param['mileage_time']); + } + $latestMileage = Db::name('CarMileage')->where([['id','<>',$param['id']],['car_id','=',$param['car_id']],['delete_time','=',0]])->order('mileage_time', 'desc')->value('mileage'); + $mileage = Db::name('Car')->where('id',$param['car_id'])->value('mileage'); + if(empty($latestMileage)){ + $latestMileage = $mileage; + } + if($param['mileage'] < $latestMileage){ + return to_assign(1,'新增的里程数,不能小于现有里程数'); + } + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('CarMileage')->strict(false)->field(true)->update($param); + return to_assign(); + } else { + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $insertId = Db::name('CarMileage')->strict(false)->field(true)->insertGetId($param); + return to_assign(); + } + } + } + + //里程数记录删除 + public function mileage_del() + { + $param = get_params(); + $res = Db::name('CarMileage')->where('id',$param['id'])->update(['delete_time'=>time()]); + if ($res) { + return to_assign(); + } + else{ + return to_assign(1, '操作失败'); + } + } +} diff --git a/app/adm/controller/Flow.php b/app/adm/controller/Flow.php new file mode 100644 index 0000000..d30401d --- /dev/null +++ b/app/adm/controller/Flow.php @@ -0,0 +1,353 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\validate\FlowCateCheck; +use app\adm\validate\FlowCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Flow extends BaseController +{ + + public function datalist() + { + if (request()->isAjax()) { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('Flow') + ->field('f.*,fc.title as cate,fm.title as module') + ->alias('f') + ->join('FlowCate fc', 'fc.id = f.cate_id', 'left') + ->join('FlowModule fm', 'fm.id = fc.module_id', 'left') + ->order('id desc')->paginate(['list_rows'=> $rows]) + ->each(function($item, $key){ + if(!empty($item['department_ids'])){ + $item['departments']=get_department_name($item['department_ids']); + } + else{ + $item['departments']='全部'; + } + if(!empty($item['copy_uids'])){ + $copy_unames=Db::name('Admin')->where([['status','=',1],['id','in',$item['copy_uids']]])->column('name'); + $item['copy_unames']=implode(',',$copy_unames); + } + else{ + $item['copy_unames']='-'; + } + return $item; + }); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //添加新增/编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['flow_list'] = ''; + $flow_list=[]; + //固定审批流 + if($param['check_type']==2){ + $roleData = isset($param['check_role']) ? $param['check_role'] : ''; + $positionIdData = isset($param['check_position_id']) ? $param['check_position_id'] : ''; + $checkUidsData = isset($param['check_uids_a']) ? $param['check_uids_a'] : ''; + $checkTypesData = isset($param['check_types']) ? $param['check_types'] : ''; + foreach ($roleData as $key => $value) { + if (!$value) { + continue; + } + if($value==3 && $positionIdData[$key]==''){ + return to_assign(1, '第'.($key+1).'行的指定岗位职称未选择'); + break; + } + if($value>3 && $checkUidsData[$key]==''){ + return to_assign(1, '第'.($key+1).'行的指定人未选择'); + break; + } + $item = []; + $item['check_role'] = $value; + $item['check_position_id'] = $positionIdData[$key]; + $item['check_uids'] = $checkUidsData[$key]; + $item['check_types'] = $checkTypesData[$key]; + $flow_list[]=$item; + } + $param['flow_list'] = serialize($flow_list); + } + //可回退审批流 + if($param['check_type']==3){ + $flowNameData = isset($param['flow_name']) ? $param['flow_name'] : ''; + $checkUidsData = isset($param['check_uids_b']) ? $param['check_uids_b'] : ''; + foreach ($flowNameData as $key => $value) { + if (!$value) { + continue; + } + if($checkUidsData[$key]==''){ + return to_assign(1, '第'.($key+1).'行的指定人未选择'); + break; + } + $item = []; + $item['check_role'] = 5; + $item['flow_name'] = $value; + $item['check_uids'] = $checkUidsData[$key]; + $flow_list[]=$item; + } + if(empty($flow_list)){ + return to_assign(1, '审批流程信息未完善'); + } + $param['flow_list'] = serialize($flow_list); + } + + if ($param['id'] > 0) { + try { + validate(FlowCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + Db::name('Flow')->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } else { + try { + validate(FlowCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $param['create_time'] = time(); + $mid = Db::name('Flow')->strict(false)->field(true)->insertGetId($param); + add_log('add', $mid, $param); + } + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $check_type = 1; + if($id>0){ + $detail = Db::name('Flow')->where('id',$id)->find(); + $flow_list = unserialize($detail['flow_list']); + if(!empty($flow_list)){ + foreach ($flow_list as $key => &$val) { + $val['check_unames'] =''; + $val['check_position_title'] =''; + if($val['check_role']==3){ + $val['check_position_title'] = Db::name('Position')->where('id', '=', $val['check_position_id'])->value('title'); + } + if($val['check_role']>3){ + $check_unames = Db::name('Admin')->where('id', 'in', $val['check_uids'])->column('name'); + $val['check_unames'] = implode(',', $check_unames); + } + } + } + $detail['flow_list'] = $flow_list; + $detail['copy_unames'] =''; + if($detail['copy_uids']!=''){ + $copy_unames = Db::name('Admin')->where('id', 'in', $detail['copy_uids'])->column('name'); + $detail['copy_unames'] = implode(',', $copy_unames); + } + $check_type = $detail['check_type']; + //var_dump($flow_list);exit; + View::assign('detail', $detail); + } + View::assign('check_type', $check_type); + View::assign('id', $id); + return view(); + } + } + + //禁用/启用 + public function check() + { + $param = get_params(); + $param['update_time']= time(); + $res = Db::name('Flow')->strict(false)->field('status,update_time')->update($param); + if($res!==false){ + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + //审批模块 + public function modulelist() + { + if (request()->isAjax()) { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('FlowModule') + ->order('sort desc,id desc') + ->paginate(['list_rows'=> $rows]); + return table_assign(0, '', $list); + } else { + return view(); + } + } + //添加模块 + public function module_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('FlowModule')->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + $param['create_time'] = time(); + $insertId = Db::name('FlowModule')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + }else { + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $detail = Db::name('FlowModule')->find($id); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + //设置 + public function module_check() + { + $param = get_params(); + $res = Db::name('FlowModule')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + //审批类型列表 + public function catelist() + { + if (request()->isAjax()) { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('FlowCate') + ->field('fc.*,fm.title as module') + ->alias('fc') + ->join('FlowModule fm', 'fm.id = fc.module_id', 'left') + ->order('fc.sort desc,fc.id desc') + ->paginate(['list_rows'=> $rows]) + ->each(function($item, $key){ + if(!empty($item['department_ids'])){ + $item['departments']=get_department_name($item['department_ids']); + } + else{ + $item['departments']='全部'; + } + return $item; + }); + return table_assign(0, '', $list); + } else { + return view(); + } + } + //添加审批类型 + public function cate_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(FlowCateCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('FlowCate')->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(FlowCateCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('FlowCate')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + }else { + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $detail = Db::name('FlowCate')->find($id); + if(!empty($detail['department_ids'])){ + $detail['departments']=get_department_name($detail['department_ids']); + } + else{ + $detail['departments']='全部'; + } + if($detail['template_id']>0){ + $detail['template_title'] = Db::name('Template')->where('id',$detail['template_id'])->value('title'); + } + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + //审批类型设置 + public function cate_check() + { + $param = get_params(); + $res = Db::name('FlowCate')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } +} diff --git a/app/adm/controller/Meeting.php b/app/adm/controller/Meeting.php new file mode 100644 index 0000000..7dcec71 --- /dev/null +++ b/app/adm/controller/Meeting.php @@ -0,0 +1,373 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\MeetingRecords as MeetingRecordsModel; +use app\adm\model\MeetingOrder; +use schedule\Schedule as ScheduleIndex; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Meeting extends BaseController +{ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new MeetingRecordsModel(); + } + + + /** + * 预定数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $whereOr=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $model = new MeetingOrder(); + $list = $model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑预定 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['start_date'] = strtotime($param['start_date']); + $param['end_date'] = strtotime($param['end_date']); + if ($param['end_date'] <= $param['start_date']) { + return to_assign(1, "结束时间需要大于开始时间"); + } + $where1[] = ['delete_time', '=', 0]; + $where1[] = ['room_id', '=', $param['room_id']]; + $where1[] = ['start_date', 'between', [$param['start_date'], $param['end_date'] - 1]]; + + $where2[] = ['delete_time', '=', 0]; + $where2[] = ['room_id', '=', $param['room_id']]; + $where2[] = ['start_date', '<=', $param['start_date']]; + $where2[] = ['start_date', '>=', $param['end_date']]; + + $where3[] = ['delete_time', '=', 0]; + $where3[] = ['room_id', '=', $param['room_id']]; + $where3[] = ['end_date', 'between', [$param['start_date'] + 1, $param['end_date']]]; + + $record = Db::name('MeetingOrder') + ->where(function ($query) use ($where1) { + $query->where($where1); + }) + ->whereOr(function ($query) use ($where2) { + $query->where($where2); + }) + ->whereOr(function ($query) use ($where3) { + $query->where($where3); + }) + ->count(); + if ($record > 0) { + return to_assign(1, "您所选的时间区间已有预定记录,请重新选时间"); + } + $requirementData = isset($param['requirement']) ? $param['requirement'] : ''; + $param['requirements'] = implode(',', $requirementData); + if (!empty($param['id']) && $param['id'] > 0) { + $model = new MeetingOrder(); + $model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $model = new MeetingOrder(); + $model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $requirements = get_base_type_data('BasicAdm',2); + if ($id>0) { + $model = new MeetingOrder(); + $detail = $model->getById($id); + $requirements_array = explode(',', $detail['requirements']); + foreach ($requirements as &$val) { + if (in_array($val['id'], $requirements_array)) { + $val['checked'] = 1; + } else { + $val['checked'] = 0; + } + } + View::assign('requirements', $requirements); + View::assign('detail', $detail); + } + View::assign('requirements', $requirements); + if(is_mobile()){ + return view('qiye@/approve/add_meeting'); + } + return view(); + } + } + + /** + * 查看预定 + */ + public function view($id) + { + $model = new MeetingOrder(); + $detail = $model->getById($id); + View::assign('create_user', get_admin($detail['admin_id'])); + if (!empty($detail)) { + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_meeting'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除预定 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $model = new MeetingOrder(); + $model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + + + //会议室 + public function room() + { + if (request()->isAjax()) { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('MeetingRoom') + ->field('mr.*,u.name as keep_name') + ->alias('mr') + ->join('Admin u', 'u.id = mr.keep_uid', 'left') + ->paginate(['list_rows'=> $rows]); + return table_assign(0, '', $list); + } else { + return view(); + } + } + //会议室添加 + public function room_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('MeetingRoom')->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + $param['create_time'] = time(); + $insertId = Db::name('MeetingRoom')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + //keep_name + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = Db::name('MeetingRoom')->find($id); + if($detail['keep_uid']>0){ + $detail['keep_name'] = Db::name('Admin')->where('id','=',$detail['keep_uid'])->value('name'); + } + View::assign('detail', $detail); + return view('room_edit'); + } + return view(); + } + } + + //会议室查看 + public function room_view() + { + $param = get_params(); + $detail = Db::name('MeetingRoom')->find($param['id']); + if($detail['keep_uid']>0){ + $detail['keep_name'] = Db::name('Admin')->where('id','=',$detail['keep_uid'])->value('name'); + } + View::assign('detail', $detail); + return view(); + } + + //会议室查看 + public function room_use() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + + $where[] = ['start_date','<=',strtotime($param['end'])]; + $where[] = ['end_date','>=',strtotime($param['start'])]; + $where[] = ['delete_time', '=', 0]; + $where[] = ['check_status', '=', 2]; + $where[] = ['room_id', '=', $param['id']]; + + $schedule = Db::name('MeetingOrder') + ->where($where) + ->field('id,title,start_date,end_date') + ->select()->toArray(); + $events = []; + $bg_array=['#ECECEC','#FFD3D3','#F6F6C7','#D7EBFF','#CCEBCC','#E9E9CB']; + $border_array=['#CCCCCC','#FF9999','#E8E89B','#99CCFF','#99CC99','#CCCC99']; + foreach ($schedule as $k => $v) { + $v['backgroundColor'] = $bg_array[3]; + $v['borderColor'] = $border_array[3]; + $v['title'] = $v['title']; + $v['start'] = date('Y-m-d H:i', $v['start_date']); + $v['end'] = date('Y-m-d H:i', $v['end_date']); + unset($v['start_date']); + unset($v['end_date']); + $events[] = $v; + } + $input_arrays = $events; + $range_start = parseDateTime($param['start']); + $range_end = parseDateTime($param['end']); + $timeZone = null; + if (isset($_GET['timeZone'])) { + $timeZone = new DateTimeZone($_GET['timeZone']); + } + + // Accumulate an output array of event data arrays. + $output_arrays = array(); + foreach ($input_arrays as $array) { + // Convert the input array into a useful Event object + $event = new ScheduleIndex($array, $timeZone); + // If the event is in-bounds, add it to the output + if ($event->isWithinDayRange($range_start, $range_end)) { + $output_arrays[] = $event->toArray(); + } + } + return json($output_arrays); + } else { + $param = get_params(); + $detail = Db::name('MeetingRoom')->find($param['id']); + View::assign('detail', $detail); + return view(); + } + } + + //会议室设置 + public function room_check() + { + $param = get_params(); + $res = Db::name('MeetingRoom')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + //会议纪要 + public function records() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + $whereOr = []; + $uid = $this->uid; + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['anchor_id'])) { + $where[] = ['anchor_id', '=', $param['anchor_id']]; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['meeting_date', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + $where[] = ['delete_time', '=', 0]; + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //添加会议纪要 + public function records_add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['meeting_date'] = isset($param['meeting_date']) ? strtotime(urldecode($param['meeting_date'])) : 0; + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + View::assign('detail', $this->model->getById($id)); + return view('records_edit'); + } + return view(); + } + } + + //查看会议纪要 + public function records_view($id) + { + View::assign('detail', $this->model->getById($id)); + return view(); + } + + //删除会议纪要 + public function records_del() + { + if (request()->isDelete()) { + $id = get_params("id"); + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/adm/controller/News.php b/app/adm/controller/News.php new file mode 100644 index 0000000..b0e40dc --- /dev/null +++ b/app/adm/controller/News.php @@ -0,0 +1,135 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\News as NewsModel; +use app\adm\validate\NewsValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class News extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new NewsModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(NewsValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(NewsValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id']=$this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name'); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/index/view_news'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/adm/controller/Note.php b/app/adm/controller/Note.php new file mode 100644 index 0000000..eae8d8c --- /dev/null +++ b/app/adm/controller/Note.php @@ -0,0 +1,140 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\Note as NoteModel; +use app\adm\validate\NoteValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Note extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new NoteModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['a.delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['a.id|a.title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['start_time'] = isset($param['start_time']) ? strtotime(urldecode($param['start_time'])) : 0; + $param['end_time'] = isset($param['end_time']) ? strtotime(urldecode($param['end_time'])) : 0; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(NoteValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(NoteValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id']=$this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + } + View::assign('id', $id); + if(is_mobile()){ + return view('qiye@/index/note_add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name'); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/index/note_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/adm/controller/Notecate.php b/app/adm/controller/Notecate.php new file mode 100644 index 0000000..7ad6710 --- /dev/null +++ b/app/adm/controller/Notecate.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\NoteCate as NoteCateModel; +use app\adm\validate\NotecateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Notecate extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new NoteCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(NotecateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(NotecateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/adm/controller/Official.php b/app/adm/controller/Official.php new file mode 100644 index 0000000..749e29a --- /dev/null +++ b/app/adm/controller/Official.php @@ -0,0 +1,206 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\OfficialDocs; +use app\adm\validate\CarValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Official extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new OfficialDocs(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $whereOr = []; + $map1 = []; + $map2 = []; + $map3 = []; + $map4 = []; + $uid = $this->uid; + $tab = isset($param['tab']) ? $param['tab'] : 0; + + //条件1 + $map1[] = ['admin_id','=',$uid]; + + //条件2 + $map2[] = ['check_status','=',2]; + $map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',send_uids)")]; + + //条件3 + $map3[] = ['check_status','=',2]; + $map3[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',copy_uids)")]; + + //条件4 + $map4[] = ['check_status','=',2]; + $map4[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_uids)")]; + + + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['secrets'])) { + $where[] = ['secrets', '=', $param['secrets']]; + } + if (!empty($param['urgency'])) { + $where[] = ['urgency', '=', $param['urgency']]; + } + if($tab == 0){ + $whereOr = [$map1,$map2]; + } + if($tab == 1){ + $where[] = ['admin_id','=',$uid]; + } + if($tab == 2){ + $where[] = ['check_status','=',2]; + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',send_uids)")]; + } + if($tab == 3){ + $where[] = ['check_status','=',2]; + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',copy_uids)")]; + } + if($tab == 4){ + $where[] = ['check_status','=',2]; + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_uids)")]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('secrets', $this->model::$Secrets); + View::assign('urgency', $this->model::$Urgency); + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['draft_time'])) { + $param['draft_time'] = strtotime($param['draft_time']); + } + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if(is_mobile()){ + return view('qiye@/index/405',['msg' => '由于公文包含了富文本编辑,手机端不方便操作,请到PC端新增或编辑']); + } + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + return view('edit'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + View::assign('auth_office', isAuth($this->uid,'office_admin','conf_1')); + if(is_mobile()){ + return view('qiye@/index/official_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //待审公文列表 + public function pending() + { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + $where=[]; + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['check_status', '=', 1]; + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //已审公文列表 + public function reviewed() + { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + $where=[]; + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } else { + return view(); + } + } +} diff --git a/app/adm/controller/Property.php b/app/adm/controller/Property.php new file mode 100644 index 0000000..01ab46e --- /dev/null +++ b/app/adm/controller/Property.php @@ -0,0 +1,282 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\Property as PropertyModel; +use app\adm\validate\PropertyCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Property extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new PropertyModel(); + } + + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%']; + } + if (isset($param['status']) && $param['status']!='') { + $where[] = ['p.status', '=', $param['status']]; + } + else{ + $where[] = ['p.status','>=',0]; + } + if (!empty($param['cate_id'])) { + $cate_id_array = get_cate_son('PropertyCate',$param['cate_id']); + $where[] = ['p.cate_id', 'in', $cate_id_array]; + } + if (!empty($param['brand_id'])) { + $where[] = ['p.brand_id', '=', $param['brand_id']]; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } else { + View::assign('status', $this->model::$property_status); + return view(); + } + } + //新建编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['buy_time'])) { + $param['buy_time'] = strtotime($param['buy_time']); + } + if (isset($param['quality_time'])) { + $param['quality_time'] = strtotime($param['quality_time']); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(PropertyCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $param['update_id'] = $this->uid; + $this->model->edit($param); + } else { + try { + validate(PropertyCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + View::assign('status', $this->model::$property_status); + View::assign('source', $this->model::$property_source); + if($id>0){ + $detail = $this->model->getById($id); + if(!empty($detail['user_ids'])){ + $users = Db::name('Admin')->where('id','in',$detail['user_ids'])->column('name'); + $detail['users_name'] = implode(',',$users); + } + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view('edit'); + } + return view(); + } + } + + //查看 + public function view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = $this->model->getById($id); + if($detail['cate_id']>0){ + $detail['cate'] = Db::name('PropertyCate')->where('id',$detail['cate_id'])->value('title'); + } + if($detail['unit_id']>0){ + $detail['unit'] = Db::name('PropertyUnit')->where('id',$detail['unit_id'])->value('title'); + } + if($detail['brand_id']>0){ + $detail['brand'] = Db::name('PropertyBrand')->where('id',$detail['brand_id'])->value('title'); + } + if(!empty($detail['user_ids'])){ + $users = Db::name('Admin')->where('id','in',$detail['user_ids'])->column('name'); + $detail['users_name'] = implode(',',$users); + } + if(!empty($detail['user_dids'])){ + $titles = Db::name('Department')->where('id','in',$detail['user_dids'])->column('title'); + $detail['dids_title'] = implode(',',$titles); + } + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + $repair = Db::name('PropertyRepair') + ->field('pr.*,u.name as director_name') + ->alias('pr') + ->join('Admin u', 'u.id = pr.director_id', 'left') + ->where(['pr.delete_time'=>0,'pr.property_id'=>$detail['id']]) + ->select()->toArray(); + $detail['repair'] = $repair; + View::assign('detail', $detail); + return view(); + } + + //设置 + public function check() + { + $param = get_params(); + $res = Db::name('Property')->strict(false)->field('id,status')->update($param); + if ($res) { + add_log('set', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + + //维修记录列表 + public function repair_list() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['pr.repair_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $where[] = ['pr.delete_time','=',0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('PropertyRepair') + ->field('pr.*,pc.title as cate,pb.title as brand,p.title,p.model,u.name as director_name') + ->alias('pr') + ->join('Property p', 'p.id = pr.property_id', 'left') + ->join('PropertyCate pc', 'pc.id = p.cate_id', 'left') + ->join('PropertyBrand pb', 'pb.id = p.brand_id', 'left') + ->join('Admin u', 'u.id = pr.director_id', 'left') + ->where($where) + ->order('id desc') + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['repair_time'] = date('Y-m-d',$item['repair_time']); + $item['create_time'] = date('Y-m-d H:i',$item['create_time']); + return $item; + }); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //维修记录添加&编辑 + public function repair_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['repair_time'])) { + $param['repair_time'] = strtotime($param['repair_time']); + } + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('PropertyRepair')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } else { + $param['create_time'] = time(); + $insertId = Db::name('PropertyRepair')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + if ($id > 0) { + $detail = Db::name('PropertyRepair')->where(['id' => $id])->find(); + $detail['director_name'] = Db::name('Admin')->where('id',$detail['director_id'])->value('name'); + $detail['property'] = Db::name('Property')->where('id',$detail['property_id'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view('repair_edit'); + } + if($pid>0){ + View::assign('property', $this->model->getById($pid)); + } + View::assign('pid', $pid); + View::assign('id', $id); + return view(); + } + } + + //维修记录查看 + public function repair_view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = Db::name('PropertyRepair')->where(['id' => $id])->find(); + $detail['director_name'] = Db::name('Admin')->where('id',$detail['director_id'])->value('name'); + $detail['property'] = Db::name('Property')->where('id',$detail['property_id'])->value('title'); + if($detail['file_ids'] !=''){ + $fileArray = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['fileArray'] = $fileArray; + } + View::assign('detail', $detail); + return view(); + } + + //维修记录删除 + public function repair_del() + { + $param = get_params(); + $res = Db::name('PropertyRepair')->where('id',$param['id'])->update(['delete_time'=>time()]); + if ($res) { + add_log('delete', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } +} diff --git a/app/adm/controller/Propertybrand.php b/app/adm/controller/Propertybrand.php new file mode 100644 index 0000000..d15496a --- /dev/null +++ b/app/adm/controller/Propertybrand.php @@ -0,0 +1,87 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Propertybrand extends BaseController +{ + //资产品牌 + public function datalist() + { + if (request()->isAjax()) { + $cate = Db::name('PropertyBrand')->order('create_time asc')->select(); + return to_assign(0, '', $cate); + } else { + return view(); + } + } + + //添加&编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('PropertyBrand')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } else { + $param['create_time'] = time(); + $insertId = Db::name('PropertyBrand')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $detail = Db::name('PropertyBrand')->where(['id' => $id])->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + //禁用启用 + public function check() + { + $param = get_params(); + $res = Db::name('PropertyBrand')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + +} diff --git a/app/adm/controller/Propertycate.php b/app/adm/controller/Propertycate.php new file mode 100644 index 0000000..72ae160 --- /dev/null +++ b/app/adm/controller/Propertycate.php @@ -0,0 +1,112 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\validate\CateCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Propertycate extends BaseController +{ + //类别 + public function datalist() + { + if (request()->isAjax()) { + $cate = Db::name('PropertyCate')->order('create_time asc')->select(); + $list = generateTree($cate); + return to_assign(0, '', $list); + } else { + return view(); + } + } + + //分类添加&编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(CateCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $note_array = get_cate_son('PropertyCate',$param['id']); + if (in_array($param['pid'], $note_array)) { + return to_assign(1, '父级分类不能是该分类本身或其子分类'); + } else { + $param['update_time'] = time(); + $res = Db::name('PropertyCate')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } + } else { + try { + validate(CateCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('PropertyCate')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + $cate = Db::name('PropertyCate')->order('id desc')->select()->toArray(); + $cates = set_recursion($cate); + if ($id > 0) { + $detail = Db::name('PropertyCate')->where(['id' => $id])->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + View::assign('pid', $pid); + View::assign('cates', $cates); + return view(); + } + } + + //删除分类 + public function del() + { + $id = get_params("id"); + $cate_count = Db::name('PropertyCate')->where(["pid" => $id])->count(); + if ($cate_count > 0) { + return to_assign(1, "该分类下还有子分类,无法删除"); + } + $content_count = Db::name('Property')->where(["cate_id" => $id])->count(); + if ($content_count > 0) { + return to_assign(1, "该分类下还有资产,无法删除"); + } + if (Db::name('PropertyCate')->delete($id) !== false) { + add_log('delete', $id); + return to_assign(0, "删除分类成功"); + } else { + return to_assign(1, "删除失败"); + } + } + + +} diff --git a/app/adm/controller/Propertyunit.php b/app/adm/controller/Propertyunit.php new file mode 100644 index 0000000..1a6e92e --- /dev/null +++ b/app/adm/controller/Propertyunit.php @@ -0,0 +1,87 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Propertyunit extends BaseController +{ + //资产单位 + public function datalist() + { + if (request()->isAjax()) { + $cate = Db::name('PropertyUnit')->order('create_time asc')->select(); + return to_assign(0, '', $cate); + } else { + return view(); + } + } + + //添加&编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('PropertyUnit')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } else { + $param['create_time'] = time(); + $insertId = Db::name('PropertyUnit')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $detail = Db::name('PropertyUnit')->where(['id' => $id])->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + //禁用启用 + public function check() + { + $param = get_params(); + $res = Db::name('PropertyUnit')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + +} diff --git a/app/adm/controller/Seal.php b/app/adm/controller/Seal.php new file mode 100644 index 0000000..f09230a --- /dev/null +++ b/app/adm/controller/Seal.php @@ -0,0 +1,206 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\model\Seal as SealModel; +use app\adm\validate\CarValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Seal extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new SealModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid=$this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + if($tab == 0){ + //全部 + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if($tab == 1){ + //创建的 + $where[] = ['admin_id', '=', $this->uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if (!empty($param['seal_cate_id'])) { + $where[] = ['seal_cate_id', '=', $param['seal_cate_id']]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where,$whereOr, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['use_time'])) { + $param['use_time'] = strtotime($param['use_time']); + } + if (!empty($param['start_time'])) { + $param['start_time'] = strtotime($param['start_time']); + } + else{ + $param['start_time'] = 0; + } + if (!empty($param['end_time'])) { + $param['end_time'] = strtotime($param['end_time']); + if($param['end_time']<$param['start_time']){ + return to_assign(1, "结束借用日期需要大于等于印章借用日期"); + } + } + else{ + $param['end_time'] = 0; + } + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $did = $this->did; + $map1 = []; + $map2 = []; + $map1[] = ['status', '=', 1]; + $map1[] = ['dids', '=', '']; + + $map2[] = ['status', '=', 1]; + $map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$did}',dids)")]; + + $sealcate = Db::name('SealCate')->whereOr([$map1,$map2])->order('id desc')->select()->toArray(); + View::assign('sealcate', $sealcate); + View::assign('user', get_admin($this->uid)); + if ($id>0) { + $detail = $this->model->getById($id); + if($detail['check_status']==0 || $detail['check_status']==4){ + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/add_seal'); + } + return view('edit'); + } + } + if(is_mobile()){ + return view('qiye@/approve/add_seal'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + View::assign('create_user', get_admin($detail['admin_id'])); + if(is_mobile()){ + return view('qiye@/approve/view_seal'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //用章记录 + public function record() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['check_status','=',2]; + if (!empty($param['seal_cate_id'])) { + $where[] = ['seal_cate_id', '=', $param['seal_cate_id']]; + } + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where,$whereOr, $param); + return table_assign(0, '', $list); + } else { + View::assign('status', ['未使用','已使用','已归还']); + return view(); + } + } +} diff --git a/app/adm/controller/Sealcate.php b/app/adm/controller/Sealcate.php new file mode 100644 index 0000000..163138b --- /dev/null +++ b/app/adm/controller/Sealcate.php @@ -0,0 +1,111 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\adm\controller; + +use app\base\BaseController; +use app\adm\validate\SealCateCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Sealcate extends BaseController +{ + //印章类别 + public function datalist() + { + if (request()->isAjax()) { + $cate = Db::name('SealCate') + ->field('a.*,u.name,d.title as department') + ->alias('a') + ->join('Admin u', 'u.id = a.keep_uid') + ->join('Department d', 'd.id = u.did') + ->order('create_time asc')->select()->toArray(); + foreach ($cate as $key => &$value) { + if(!empty($value['dids'])){ + $value['departments']=get_department_name($value['dids']); + } + else{ + $value['departments']='全部'; + } + } + return to_assign(0, '', $cate); + } else { + return view(); + } + } + //添加 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(SealCateCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('SealCate')->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(SealCateCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('SealCate')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + }else { + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $detail = Db::name('SealCate')->where(['id' => $id])->find(); + $detail['keep_name'] = Db::name('Admin')->where(['id' => $detail['keep_uid']])->value('name'); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + //设置 + public function check() + { + $param = get_params(); + $res = Db::name('SealCate')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } +} diff --git a/app/adm/event.php b/app/adm/event.php new file mode 100644 index 0000000..afe5918 --- /dev/null +++ b/app/adm/event.php @@ -0,0 +1,8 @@ + [ + //注册监听类 + 'SendMessage' => ['app\listener\SendMessage'], + ], + //'subscribe' => ['app\subscribe\Message'], +]; diff --git a/app/adm/middleware.php b/app/adm/middleware.php new file mode 100644 index 0000000..a500c6f --- /dev/null +++ b/app/adm/middleware.php @@ -0,0 +1,8 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\adm\model; +use think\model; +use think\facade\Db; +class Car extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->buy_time = date('Y-m-d', $item->buy_time); + $item->insure_time = date('Y-m-d', $item->insure_time); + $item->insure_time_note = count_days(date("Y-m-d"),$item->insure_time); + $item->review_time = date('Y-m-d', $item->review_time); + $item->review_time_note = count_days(date("Y-m-d"),$item->review_time); + if($item->driver>0){ + $item->driver_name = Db::name('Admin')->where('id','=',$item->driver)->value('name'); + } + else{ + $item->driver_name='-'; + } + $item->create_time = to_date($item->create_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $param['mileage_now'] = $param['mileage']; + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } + + //维修(保养)记录 + public function repairlist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = Db::name('CarRepair') + ->field('cr.*,c.title as car,c.name,u.name as handled_name') + ->alias('cr') + ->join('Car c', 'c.id = cr.car_id', 'left') + ->join('Admin u', 'u.id = cr.handled', 'left') + ->where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['repair_time'] = date('Y-m-d',$item['repair_time']); + $item['create_time'] = date('Y-m-d H:i',$item['create_time']); + return $item; + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + //费用记录 + public function feelist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = Db::name('CarFee') + ->field('cf.*,c.title as car,c.name,u.name as handled_name,ba.title as types_str') + ->alias('cf') + ->join('Car c', 'c.id = cf.car_id', 'left') + ->join('basicAdm ba', 'ba.id = cf.types', 'left') + ->join('Admin u', 'u.id = cf.handled', 'left') + ->where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['fee_time'] = date('Y-m-d',$item['fee_time']); + $item['create_time'] = date('Y-m-d H:i',$item['create_time']); + return $item; + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + //里程记录 + public function mileagelist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = Db::name('CarMileage') + ->order('mileage_time desc') + ->where($where) + ->order($order) + ->paginate($rows, false)->each(function($item, $key){ + $item['mileage_time'] = date('Y-m', $item['mileage_time']); + $item['create_time'] = date('Y-m-d H:i:s', $item['create_time']); + $item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name'); + return $item; + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } +} + diff --git a/app/adm/model/MeetingOrder.php b/app/adm/model/MeetingOrder.php new file mode 100644 index 0000000..34a297e --- /dev/null +++ b/app/adm/model/MeetingOrder.php @@ -0,0 +1,143 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\model; +use think\model; +use think\facade\Db; +class MeetingOrder extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['room'] = Db::name('MeetingRoom')->where(['id' => $item['room_id']])->value('title'); + $item['meeting_date'] = date('Y-m-d H:i', $item['start_date']).' 至 '.date('Y-m-d H:i', $item['end_date']); + $item['did_name'] = Db::name('Department')->where(['id' => $item['did']])->value('title'); + $item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name'); + $item['create_time'] = to_date($item['create_time']); + $item->check_status_str = check_status_name($item->check_status); + $item['check_user'] = '-'; + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_user'] = implode(',',$check_user); + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['start_time'] = to_date($info['start_date'],'Y-m-d H:i'); + $info['end_time'] = to_date($info['end_date'],'Y-m-d H:i'); + $info['room'] = Db::name('MeetingRoom')->where(['id' => $info['room_id']])->value('title'); + $info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $requirements = get_base_type_data('BasicAdm',2); + $requirements_array = explode(',', $info['requirements']); + foreach ($requirements as &$val) { + if (in_array($val['id'], $requirements_array)) { + $val['checked'] = 1; + } else { + $val['checked'] = 0; + } + } + $info['requirements_array'] = $requirements; + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} diff --git a/app/adm/model/MeetingRecords.php b/app/adm/model/MeetingRecords.php new file mode 100644 index 0000000..cc95017 --- /dev/null +++ b/app/adm/model/MeetingRecords.php @@ -0,0 +1,131 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\model; +use think\model; +use think\facade\Db; +class MeetingRecords extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['anchor'] = Db::name('Admin')->where(['id' => $item['anchor_id']])->value('name'); + $item['meeting_date'] = empty($item['meeting_date']) ? '-' : date('Y-m-d', $item['meeting_date']); + $item['did_name'] = Db::name('Department')->where(['id' => $item['did']])->value('title'); + $item['recorder_name'] = Db::name('Admin')->where(['id' => $item['recorder_id']])->value('name'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['recorder_name'] = Db::name('Admin')->where(['id' => $info['recorder_id']])->value('name'); + $info['anchor_name'] = Db::name('Admin')->where(['id' => $info['anchor_id']])->value('name'); + $info['room'] = Db::name('MeetingRoom')->where(['id' => $info['room_id']])->value('title'); + $info['did_name'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + $join_names = Db::name('Admin')->where([['id','in',$info['join_uids']]])->column('name'); + $info['join_names'] =implode(',' ,$join_names); + $sign_names = Db::name('Admin')->where([['id','in',$info['sign_uids']]])->column('name'); + $info['sign_names'] =implode(',' ,$sign_names); + $share_names = Db::name('Admin')->where([['id','in',$info['share_uids']]])->column('name'); + $info['share_names'] =implode(',' ,$share_names); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} diff --git a/app/adm/model/News.php b/app/adm/model/News.php new file mode 100644 index 0000000..2a9f73e --- /dev/null +++ b/app/adm/model/News.php @@ -0,0 +1,114 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\adm\model; +use think\model; +use think\facade\Db; +class News extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->create_time = to_date($item->create_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/adm/model/Note.php b/app/adm/model/Note.php new file mode 100644 index 0000000..009b0e2 --- /dev/null +++ b/app/adm/model/Note.php @@ -0,0 +1,129 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\adm\model; +use think\model; +use think\facade\Db; +class Note extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'a.sort desc,a.create_time desc' : $param['order']; + try { + $list = self::where($where) + ->field('a.*,c.title as cate') + ->alias('a') + ->join('NoteCate c', 'a.cate_id = c.id', 'LEFT') + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->create_time = to_date($item->create_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + $users= Db::name('Admin')->field('id as from_uid')->where(['status' => 1])->column('id'); + $msg=[ + 'from_uid'=>$param['admin_id'],//发送人 + 'to_uids'=>$users,//接收人 + 'template_id'=>'note',//消息模板ID + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s'), + 'title' => $param['title'], + 'action_id'=>$insertId + ] + ]; + event('SendMessage',$msg); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/adm/model/NoteCate.php b/app/adm/model/NoteCate.php new file mode 100644 index 0000000..be597d5 --- /dev/null +++ b/app/adm/model/NoteCate.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\adm\model; +use think\model; +use think\facade\Db; +class NoteCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/adm/model/OfficialDocs.php b/app/adm/model/OfficialDocs.php new file mode 100644 index 0000000..0cef9ac --- /dev/null +++ b/app/adm/model/OfficialDocs.php @@ -0,0 +1,145 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\adm\model; +use think\model; +use think\facade\Db; +class OfficialDocs extends Model +{ + //密级程度 + public static $Secrets = ['','公开','秘密','机密']; + + //紧急程度 + public static $Urgency = ['','普通','紧急','加急']; + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->secrets_str = self::$Secrets[$item->secrets]; + $item->urgency_str = self::$Urgency[$item->urgency]; + $item->check_status_str = check_status_name($item->check_status); + $item->draft_time = date('Y-m-d', $item->draft_time); + $item->draft_name = Db::name('Admin')->where('id','=',$item->draft_uid)->value('name'); + $item->draft_dname = Db::name('Department')->where('id','=',$item->did)->value('title'); + $item->create_time = to_date($item->create_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['draft_name'] = Db::name('Admin')->where('id','=',$info['draft_uid'])->value('name'); + $info['draft_dame'] = Db::name('Department')->where('id','=',$info['did'])->value('title'); + + $send_names = Db::name('Admin')->where([['id','in',$info['send_uids']]])->column('name'); + $info['send_names'] =implode(',' ,$send_names); + + $copy_names = Db::name('Admin')->where([['id','in',$info['copy_uids']]])->column('name'); + $info['copy_names'] =implode(',' ,$copy_names); + + $share_names = Db::name('Admin')->where([['id','in',$info['share_uids']]])->column('name'); + $info['share_names'] =implode(',' ,$share_names); + + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/adm/model/Property.php b/app/adm/model/Property.php new file mode 100644 index 0000000..6c4c3e2 --- /dev/null +++ b/app/adm/model/Property.php @@ -0,0 +1,135 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\model; +use think\model; +use think\facade\Db; +class Property extends Model +{ + //资产来源 + public static $property_source = ['','采购','赠与','自产','其他']; + + //资产状态 + public static $property_status = ['闲置','在用','维修','报废','丢失']; + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'p.id desc' : $param['order']; + try { + $list = self::where($where) + ->field('p.*,pc.title as cate,pb.title as brand,pu.title as unit,u.name as create_name') + ->alias('p') + ->join('PropertyCate pc', 'pc.id = p.cate_id', 'left') + ->join('PropertyBrand pb', 'pb.id = p.brand_id', 'left') + ->join('PropertyUnit pu', 'pu.id = p.unit_id', 'left') + ->join('Admin u', 'u.id = p.admin_id', 'left') + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->update_time_str = '-'; + $item->update_name = '-'; + if(!empty($item->update_time)){ + $item->update_time_str = $item->update_time; + $item->update_name = Db::name('Admin')->where('id',$item->update_id)->value('name'); + } + $item->status_str = self::$property_status[$item->status]; + $item->source_str = self::$property_source[$item->source]; + $item->create_time = to_date($item->create_time); + $item->update_time_str = to_date($item->update_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['status_str'] = self::$property_status[$info['status']]; + $info['source_str'] = self::$property_source[$info['source']]; + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} diff --git a/app/adm/model/Seal.php b/app/adm/model/Seal.php new file mode 100644 index 0000000..3bec181 --- /dev/null +++ b/app/adm/model/Seal.php @@ -0,0 +1,154 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\adm\model; +use think\model; +use think\facade\Db; +class Seal extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $whereOr, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->check_status_str = check_status_name($item->check_status); + $item->use_time = date('Y-m-d', $item->use_time); + $item->admin_name = Db::name('Admin')->where('id','=',$item->admin_id)->value('name'); + $item->use_dname = Db::name('Department')->where('id','=',$item->did)->value('title'); + $item->seal_cate = Db::name('SealCate')->where('id','=',$item->seal_cate_id)->value('title'); + $item->create_time = to_date($item->create_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=> $param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $info['use_dname'] = Db::name('Department')->where('id','=',$info['did'])->value('title'); + $info['seal_cate'] = Db::name('SealCate')->where('id','=',$info['seal_cate_id'])->value('title'); + if($info['start_time']>0){ + $info['start_time'] = date('Y-m-d',$info['start_time']); + $info['end_time'] = date('Y-m-d',$info['end_time']); + } + else{ + $info['start_time'] = ''; + $info['end_time'] = ''; + } + if($info['use_time']>0){ + $info['use_time'] = date('Y-m-d',$info['use_time']); + } + else{ + $info['use_time'] = ''; + } + $status_str = '未使用'; + if($info['status'] == 1){ + $status_str = '已使用'; + if($info['is_borrow']==1){ + $status_str = '已外借'; + } + } + if($info['status'] == 2){ + $status_str = '已归还'; + } + $info['status_str'] = $status_str; + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/adm/validate/BasicAdmCheck.php b/app/adm/validate/BasicAdmCheck.php new file mode 100644 index 0000000..5d45a3c --- /dev/null +++ b/app/adm/validate/BasicAdmCheck.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; + +use think\Validate; + +class BasicAdmCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/adm/validate/CarValidate.php b/app/adm/validate/CarValidate.php new file mode 100644 index 0000000..44bd8a8 --- /dev/null +++ b/app/adm/validate/CarValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; +use think\Validate; +use think\facade\Db; + +class CarValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Car')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/adm/validate/CateCheck.php b/app/adm/validate/CateCheck.php new file mode 100644 index 0000000..ca5b7f9 --- /dev/null +++ b/app/adm/validate/CateCheck.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; + +use think\Validate; + +class CateCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:property_cate', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/adm/validate/FlowCateCheck.php b/app/adm/validate/FlowCateCheck.php new file mode 100644 index 0000000..da50d30 --- /dev/null +++ b/app/adm/validate/FlowCateCheck.php @@ -0,0 +1,57 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; + +use think\Validate; +use think\facade\Db; + +class FlowCateCheck extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $table_array = ['invoice','ticket','approve']; + if(in_array($data['check_table'],$table_array)){ + return true; + } + else{ + $count = Db::name('FlowCate')->where([['check_table','=',$data['check_table']],['id','<>',$id]])->count(); + return $count == 0 ? true : false; + } + } + + protected $rule = [ + 'title' => 'require', + 'name' => 'require|alphaDash|unique:flow_cate', + 'check_table' => 'require|alphaDash|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '审批类型名称不能为空', + 'name.require' => '审批类型标识不能为空', + 'name.unique' => '同样的审批类型标识已经存在', + 'name.alphaDash' => '审批类型标识只能是小写字母', + 'check_table.require' => '数据表不能为空', + 'check_table.alphaDash' => '数据表只能是小写字母、数字下划线_', + 'check_table.checkOne' => '同样的数据表已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title','check_table'], + 'edit' => ['id', 'title','check_table'], + ]; +} diff --git a/app/adm/validate/FlowCheck.php b/app/adm/validate/FlowCheck.php new file mode 100644 index 0000000..98505da --- /dev/null +++ b/app/adm/validate/FlowCheck.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; + +use think\Validate; + +class FlowCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '流程名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title',], + 'edit' => ['id','title'], + ]; +} diff --git a/app/adm/validate/MeetingCateCheck.php b/app/adm/validate/MeetingCateCheck.php new file mode 100644 index 0000000..469a46b --- /dev/null +++ b/app/adm/validate/MeetingCateCheck.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; + +use think\Validate; + +class MeetingCateCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:meeting_cate', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/adm/validate/NewsValidate.php b/app/adm/validate/NewsValidate.php new file mode 100644 index 0000000..66f86b7 --- /dev/null +++ b/app/adm/validate/NewsValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; +use think\Validate; +use think\facade\Db; + +class NewsValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('News')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/adm/validate/NoteValidate.php b/app/adm/validate/NoteValidate.php new file mode 100644 index 0000000..b88c9c0 --- /dev/null +++ b/app/adm/validate/NoteValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; +use think\Validate; +use think\facade\Db; + +class NoteValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Note')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/adm/validate/NotecateValidate.php b/app/adm/validate/NotecateValidate.php new file mode 100644 index 0000000..7c76701 --- /dev/null +++ b/app/adm/validate/NotecateValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; +use think\Validate; +use think\facade\Db; + +class NotecateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('NoteCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/adm/validate/PropertyCheck.php b/app/adm/validate/PropertyCheck.php new file mode 100644 index 0000000..45252d2 --- /dev/null +++ b/app/adm/validate/PropertyCheck.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; + +use think\Validate; + +class PropertyCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:property', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/adm/validate/SealCateCheck.php b/app/adm/validate/SealCateCheck.php new file mode 100644 index 0000000..a1c9a57 --- /dev/null +++ b/app/adm/validate/SealCateCheck.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\adm\validate; + +use think\Validate; + +class SealCateCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:seal_cate', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/adm/view/basic/datalist.html b/app/adm/view/basic/datalist.html new file mode 100644 index 0000000..bcb6370 --- /dev/null +++ b/app/adm/view/basic/datalist.html @@ -0,0 +1,138 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+
    +
  • 车辆费用类型
  • +
  • 其他
  • +
+
+
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/add.html b/app/adm/view/car/add.html new file mode 100644 index 0000000..51e7df3 --- /dev/null +++ b/app/adm/view/car/add.html @@ -0,0 +1,120 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

添加车辆信息

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
车辆名称*车牌号码* + 车辆缩略图 + + +
+ + +
+
购买日期*购买价格*
车身颜色*座位数*
发动机号*车架号*
车险到期日期*车审到期日期*
车辆油耗*开始里程数*驾驶员
+
相关附件
+
+ +
+
+
+ +
+
备注信息 + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/datalist.html b/app/adm/view/car/datalist.html new file mode 100644 index 0000000..f0ec044 --- /dev/null +++ b/app/adm/view/car/datalist.html @@ -0,0 +1,110 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/edit.html b/app/adm/view/car/edit.html new file mode 100644 index 0000000..cbb73c6 --- /dev/null +++ b/app/adm/view/car/edit.html @@ -0,0 +1,126 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑车辆信息

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
车辆名称*车牌号码* + 车辆缩略图 + + +
+ + +
+
购买日期*购买价格(元)*
车身颜色*座位数*
发动机号*车架号*
车险到期日期*车审到期日期*
车辆油耗*开始里程数{$detail.mileage}驾驶员
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
备注信息 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/fee_add.html b/app/adm/view/car/fee_add.html new file mode 100644 index 0000000..fd22645 --- /dev/null +++ b/app/adm/view/car/fee_add.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增车辆收费记录

+ + {eq name="$cid" value="0"} + + + + + + + {else/} + + + + + + + {/eq} + + + + + + + + + + + + + + + + + + + + +
车辆名称* + + + 费用类型* + +
车辆名称{$car.title}费用类型* + +
费用主题* + +
收费日期*费用金额*经手人* + + +
+
相关附件
+
+ +
+
+
+ +
+
收费内容* + +
+
+ {gt name="$cid" value="0"} + + {/gt} + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/fee_edit.html b/app/adm/view/car/fee_edit.html new file mode 100644 index 0000000..5657166 --- /dev/null +++ b/app/adm/view/car/fee_edit.html @@ -0,0 +1,95 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑车辆费用记录

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
车辆名称{$detail.car}费用类型* + +
费用主题* + +
费用日期*费用金额*经手人* + + +
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.fileArray"} + {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
费用内容* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/fee_list.html b/app/adm/view/car/fee_list.html new file mode 100644 index 0000000..5bd22e7 --- /dev/null +++ b/app/adm/view/car/fee_list.html @@ -0,0 +1,94 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/fee_view.html b/app/adm/view/car/fee_view.html new file mode 100644 index 0000000..dc742e4 --- /dev/null +++ b/app/adm/view/car/fee_view.html @@ -0,0 +1,56 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

车辆收费记录

+ + + + + + + + + + + + + + + + + + + + {notempty name="$detail.fileArray"} + + + + + {/notempty} + + + + +
车辆名称{$detail.car}收费地点{$detail.types_str}
费用主题{$detail.title}
收费日期{$detail.fee_time|date='Y-m-d'}收费费用{$detail.amount}跟进人{$detail.handled_name}
相关附件 +
+ {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
费用内容{$detail.content|default=''}
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/protect_add.html b/app/adm/view/car/protect_add.html new file mode 100644 index 0000000..b2d0b1e --- /dev/null +++ b/app/adm/view/car/protect_add.html @@ -0,0 +1,95 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增车辆保养记录

+ + {eq name="$cid" value="0"} + + + + + + + {else/} + + + + + + + {/eq} + + + + + + + + + + + + + + + + +
车辆名称* + + + 保养地点* + +
车辆名称{$car.title}保养地点* + +
保养日期*保养费用*经手人* + + +
+
相关附件
+
+ +
+
+
+ +
+
保养内容* + +
+
+ {gt name="$cid" value="0"} + + {/gt} + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/protect_edit.html b/app/adm/view/car/protect_edit.html new file mode 100644 index 0000000..3143361 --- /dev/null +++ b/app/adm/view/car/protect_edit.html @@ -0,0 +1,84 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑车辆保养记录

+ + + + + + + + + + + + + + + + + + + + + + + +
车辆名称{$detail.car}保养地点* + +
保养日期*保养费用*经手人* + + +
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.fileArray"} + {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
保养内容* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/protect_list.html b/app/adm/view/car/protect_list.html new file mode 100644 index 0000000..8eaabae --- /dev/null +++ b/app/adm/view/car/protect_list.html @@ -0,0 +1,84 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+ +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/protect_view.html b/app/adm/view/car/protect_view.html new file mode 100644 index 0000000..ddd3c51 --- /dev/null +++ b/app/adm/view/car/protect_view.html @@ -0,0 +1,52 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

车辆保养记录

+ + + + + + + + + + + + + + + + {notempty name="$detail.fileArray"} + + + + + {/notempty} + + + + +
车辆名称{$detail.car}保养地点{$detail.address}
保养日期{$detail.repair_time|date='Y-m-d'}保养费用{$detail.amount}跟进人{$detail.handled_name}
相关附件 +
+ {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
保养原因&内容{$detail.content|default=''}
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/repair_add.html b/app/adm/view/car/repair_add.html new file mode 100644 index 0000000..fd4109a --- /dev/null +++ b/app/adm/view/car/repair_add.html @@ -0,0 +1,95 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增车辆维修记录

+ + {eq name="$cid" value="0"} + + + + + + + {else/} + + + + + + + {/eq} + + + + + + + + + + + + + + + + +
车辆名称* + + + 维修地点* + +
车辆名称{$car.title}维修地点* + +
维修日期*维修费用*经手人* + + +
+
相关附件
+
+ +
+
+
+ +
+
维修内容* + +
+
+ {gt name="$cid" value="0"} + + {/gt} + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/repair_edit.html b/app/adm/view/car/repair_edit.html new file mode 100644 index 0000000..6f9c9ab --- /dev/null +++ b/app/adm/view/car/repair_edit.html @@ -0,0 +1,84 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑车辆维修记录

+ + + + + + + + + + + + + + + + + + + + + + + +
车辆名称{$detail.car}维修地点* + +
维修日期*维修费用*经手人* + + +
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.fileArray"} + {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
维修内容* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/repair_list.html b/app/adm/view/car/repair_list.html new file mode 100644 index 0000000..fe2fdc7 --- /dev/null +++ b/app/adm/view/car/repair_list.html @@ -0,0 +1,84 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+ +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/repair_view.html b/app/adm/view/car/repair_view.html new file mode 100644 index 0000000..fbc0729 --- /dev/null +++ b/app/adm/view/car/repair_view.html @@ -0,0 +1,52 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

车辆维修记录

+ + + + + + + + + + + + + + + + {notempty name="$detail.fileArray"} + + + + + {/notempty} + + + + +
车辆名称{$detail.car}维修地点{$detail.address}
维修日期{$detail.repair_time|date='Y-m-d'}维修费用{$detail.amount}跟进人{$detail.handled_name}
相关附件 +
+ {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
维修内容{$detail.content|default=''}
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/car/view.html b/app/adm/view/car/view.html new file mode 100644 index 0000000..39fc8f5 --- /dev/null +++ b/app/adm/view/car/view.html @@ -0,0 +1,390 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+

车辆信息详情

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + + + {/notempty} +
车辆名称{$detail.title}车牌号码{$detail.name}车辆缩略图 +
+ +
+
购买日期{$detail.buy_time|date='Y-m-d'}购买价格{$detail.price}
车身颜色{$detail.color}座位数{$detail.seats}
发动机号{$detail.engine}车架号{$detail.vin}
车险到期日期{$detail.insure_time|date='Y-m-d'}车审到期日期{$detail.review_time|date='Y-m-d'}
车辆油耗{$detail.oil}当前里程数{$detail.latestMileage}(开始里程数:{$detail.mileage})驾驶员{$detail.driver_name|default=''}
备注信息{$detail.remark|default=''}
相关附件
+
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
+ +
+ +
+
+
+
+ + 里程记录 +
+
+
+
+
+
+
+ + 费用记录 +
+
+
+
+
+
+
+ + 维修记录 +
+
+
+
+
+
+
+ + 保养记录 +
+
+
+
+
+
+
+{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/add.html b/app/adm/view/flow/add.html new file mode 100644 index 0000000..66fca95 --- /dev/null +++ b/app/adm/view/flow/add.html @@ -0,0 +1,373 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+

审批流程

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
流程名称*审批类型* + {eq name="$id" value="0"} + + {else/} + + {/eq} +
应用部门 +
+ +
+ (如果不选,默认是全公司) +
流程说明 + +
审批流类型* + + + +
审批流程* +
+

温馨提示

+

无需配置审批人,审批时操作人员根据实际情况选择审批人即可,自由度最高。

+
+
审批流程* +
+ {eq name="$check_type" value="2"} + {volist name="detail.flow_list" id="vo"} +
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+ {gt name="$key" value="0"} + 删除 + {/gt} +
+ {/volist} + {else/} +
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ {/eq} +
+ + 添加审批层级 +
+

温馨提示

+

1、当选择 “当前部门负责人” 审批时,有多个当前部门负责人时支持会签、或签模式。

+

2、当选择 “上一级部门负责人” 审批时,有多个上一级部门负责人时支持会签、或签模式

+

3、当选择 “指定岗位职称” 审批时,该岗位职称同时有多个人时支持会签、或签模式

+

4、当选择 “指定成员” 时,有多个人时支持会签、或签模式。

+

5、如果指定用户没有分配查看审批模块的功能权限,系统会通知其审批,但是他无法查看此审批数据信息。

+
+
审批流程* +
+ {eq name="$check_type" value="3"} + {volist name="detail.flow_list" id="vo"} +
+
+ +
+ +
+
+
+ +
+ + +
+
+ {gt name="$key" value="0"} + 删除 + {/gt} +
+ {/volist} + {else/} +
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ {/eq} +
+ + 添加审批层级 +
+

温馨提示

+

1、指定人员单选。后期审批的时候,审批人只能该指定人员。

+

2、该审批流程可回退,当拒绝审核时,会自动回退到上一位审批人节点。

+
+
默认抄送人 + + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/cate_add.html b/app/adm/view/flow/cate_add.html new file mode 100644 index 0000000..66e6052 --- /dev/null +++ b/app/adm/view/flow/cate_add.html @@ -0,0 +1,265 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

审批类型

+ {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型名称*关联审批模块* + +
类型标识* +
+ +
+ (重要:请输入类型标识注意只能是小写字母,唯一)
数据表名* +
+ +
+ (重要:输入要关联的数据库表名称,注意不需要表前缀,输错无效)
新建审批链接* +
+ +
+ (重要:输入新建审批链接,可在【系统管理】的【功能节点】查找,输错无效)
查看审批链接* +
+ +
+ (重要:输入查看审批链接,可在【系统管理】的【功能节点】查找,输错无效)
应用部门 +
+ +
+ (如果不选,默认是全公司) +
消息模板 + + + 展示图标* +
+ +
+ [查看图标] +
在工作台快捷显示 + + + 审批通过后支持通知抄送人 + + +
审批过程中支持撤回 + + + 审批时支持上传附件 + + +
审批通过后支持反确认 + + + 审批通过后支持导出PDF打印 + + +
+ {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型名称*关联审批模块* + +
类型标识* +
+ +
+ (重要:请输入类型标识注意只能是小写字母,唯一)
数据表名* +
+ +
+ (重要:输入要关联的数据库表名称,注意不需要表前缀,输错无效)
新建审批链接* +
+ +
+ (重要:输入新建审批链接,可在【系统管理】的【功能节点】查找,输错无效)
查看审批链接* +
+ +
+ (重要:输入查看审批链接,可在【系统管理】的【功能节点】查找,输错无效)
应用部门 +
+ +
+ (如果不选,默认是全公司) +
消息通知模板 + + + 展示图标* +
+ +
+ [查看图标] +
在工作台快捷显示 + + + 审批通过后支持通知抄送人 + + +
审批过程中支持撤回 + + + 审批时支持上传附件 + + +
审批通过后支持反确认 + + + 审批通过后支持导出PDF打印 + + +
+ 温馨提示:审批类型的配置,如果有不明白的可以点击这里查看
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/catelist.html b/app/adm/view/flow/catelist.html new file mode 100644 index 0000000..7c8230f --- /dev/null +++ b/app/adm/view/flow/catelist.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/datalist.html b/app/adm/view/flow/datalist.html new file mode 100644 index 0000000..db700b5 --- /dev/null +++ b/app/adm/view/flow/datalist.html @@ -0,0 +1,113 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/module_add.html b/app/adm/view/flow/module_add.html new file mode 100644 index 0000000..3a5e3fa --- /dev/null +++ b/app/adm/view/flow/module_add.html @@ -0,0 +1,54 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

审批模块

+ {eq name="$id" value="0"} + + + + + + + +
模块名称*排序
+ {else/} + + + + + + + +
模块名称*排序
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/modulelist.html b/app/adm/view/flow/modulelist.html new file mode 100644 index 0000000..b6e05aa --- /dev/null +++ b/app/adm/view/flow/modulelist.html @@ -0,0 +1,92 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/table.html b/app/adm/view/flow/table.html new file mode 100644 index 0000000..5561203 --- /dev/null +++ b/app/adm/view/flow/table.html @@ -0,0 +1,513 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+

审批条件 + 添加审批层级

+ {eq name="$id" value="0"} + + + + + + + + + +
+ 第1级 + + 添加条件分支 + + 条件分支(优先级1) + + 添加条件组 +
+ 条件组1+ 添加条件字段 +
+
+ +
+ +
+
+ +
+ +
+ + +
+
+
+ 且 +
+
+ +
+ +
+
+ +
+ +
+ + +
+
+
+
+ 条件分支(优先级2) + + 添加条件组 +
+ 条件组1+ 添加条件字段 +
+
+ +
+ +
+
+ +
+ +
+ + +
+
+
+ 且 +
+
+ +
+ +
+
+ +
+ +
+ + +
+
+
+
+ 默认情况分支(优先级3) +
+
+ +
+ +
+ + +
+ + 如存在未满足其他分支条件的情况,则进入此分支 + +
+
+ 第2级 + + 添加条件分支 + + +
+ {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
流程名称* + + 流程标识* +
审批模块* + + 审批类型* + +
应用部门 +
+ +
+ (如果不选,默认是全公司) +
流程说明 + +
审批流类型* + + + + +
审批流程* +
+

温馨提示

+

无需配置审批人,审批时,根据实际情况选择审批人即可,自由度最高。

+
+
审批流程* +
+ {eq name="$detail.check_type" value="2"} + {volist name="detail.flow_list" id="vo"} +
+
+ +
+ +
+
+
+ +
+ + +
+
+ {gt name="$key" value="0"} + 删除 + {/gt} +
+ {/volist} + {else/} +
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ {/eq} +
+ + 添加审批层级 +
+

温馨提示

+

1、当选择 “当前部门负责人” 审批时。系统仅会通知当前部门的负责人。

+

2、当选择 “上一级部门负责人” 审批时。系统仅会通知当前部门的上一级部门的负责人。

+

3、当选择 “指定人员(多人或签)” 时,表示指定用户中任意一人审批即可,可单选或多选。

+

4、当选择 “指定人员(多人会签)” 时,表示指定人员中所有人都需要审批,可单选或多选。

+

5、如果指定用户没有分配查看审批模块的功能权限,系统会通知其审批,但是他无法查看此审批数据信息。

+
+
审批流程* +
+ {eq name="$detail.check_type" value="3"} + {volist name="detail.flow_list" id="vo"} +
+
+ +
+ +
+
+
+ +
+ + +
+
+ {gt name="$key" value="0"} + 删除 + {/gt} +
+ {/volist} + {else/} +
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ {/eq} +
+ + 添加审批层级 +
+

温馨提示

+

1、指定人员单选。后期审批的时候,审批人只能该指定人员。

+

2、该审批流程可回退,当拒绝审核时,会自动回退到上一位审批人节点。

+
+
抄送人 + + +
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/flow/work_flow.html b/app/adm/view/flow/work_flow.html new file mode 100644 index 0000000..ef4e7ab --- /dev/null +++ b/app/adm/view/flow/work_flow.html @@ -0,0 +1,141 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+
+ + 100% + + +
+ + +
+
+ +
+ +
+
+
+
+ 发起人 +
+
+ 请设置发起人 + +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+ 审核人 + +
+
+ 请设置审核人 + +
+
+ +
+
+ +
+
+
+
+ +
+
+
+ 结束流程 +
+
+
+
+{/block} + +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/add.html b/app/adm/view/meeting/add.html new file mode 100644 index 0000000..6f4b5e8 --- /dev/null +++ b/app/adm/view/meeting/add.html @@ -0,0 +1,103 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

会议室预定

+ + + + + + + + + + + + + + + + + + + + + + + +
会议主题*会议地点* + + +
开始时间*结束时间*会议人数*
会议需求* + {empty name="detail"} + {volist name="$requirements" id="v"} + + {/volist} + {else/} + {volist name="$requirements" id="v"} + + {/volist} + {/empty} +
其他要求 + +
+
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/datalist.html b/app/adm/view/meeting/datalist.html new file mode 100644 index 0000000..8205ca5 --- /dev/null +++ b/app/adm/view/meeting/datalist.html @@ -0,0 +1,100 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/records.html b/app/adm/view/meeting/records.html new file mode 100644 index 0000000..d274615 --- /dev/null +++ b/app/adm/view/meeting/records.html @@ -0,0 +1,128 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/adm/view/meeting/records_add.html b/app/adm/view/meeting/records_add.html new file mode 100644 index 0000000..05f80a6 --- /dev/null +++ b/app/adm/view/meeting/records_add.html @@ -0,0 +1,106 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增会议纪要

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
会议时间*主持人* + + + 记录人* + + +
会 议 室* + + + 主办部门* + + +
参会人员* + + +
会议主题*
会议内容* + +
下一步
工作计划*
+ +
参会人员签字* + + +
共享给谁* + + +
备注信息 + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/records_edit.html b/app/adm/view/meeting/records_edit.html new file mode 100644 index 0000000..b79ae2e --- /dev/null +++ b/app/adm/view/meeting/records_edit.html @@ -0,0 +1,107 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增会议纪要

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
会议时间*主持人* + + + 记录人* + + +
会 议 室* + + + 主办部门* + + +
参会人员* + + +
会议主题*
会议内容* + +
下一步
工作计划*
+ +
参会人员签字* + + +
共享给谁* + + +
备注信息 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/records_view.html b/app/adm/view/meeting/records_view.html new file mode 100644 index 0000000..10814d2 --- /dev/null +++ b/app/adm/view/meeting/records_view.html @@ -0,0 +1,67 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

会议纪要

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
会议时间{$detail.meeting_date|date='Y-m-d H:i'}主持人{$detail.anchor_name}记录人{$detail.recorder_name}
会 议 室{$detail.room}主办部门{$detail.did_name|default=""}
参会人员{$detail.join_names}
会议主题{$detail.title}
会议内容{$detail.content}
下一步
工作计划
{$detail.plans}
参会人员签字{$detail.sign_names}
共享给谁{$detail.share_names}
备注信息{$detail.remarks|default=''}
+
+ 导出打印 +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/room.html b/app/adm/view/meeting/room.html new file mode 100644 index 0000000..14d0659 --- /dev/null +++ b/app/adm/view/meeting/room.html @@ -0,0 +1,114 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +
+
+ + +
+
+
+
+ +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/room_add.html b/app/adm/view/meeting/room_add.html new file mode 100644 index 0000000..5655234 --- /dev/null +++ b/app/adm/view/meeting/room_add.html @@ -0,0 +1,71 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增会议室

+ + + + + + + + + + + + + + + + + + + + + + + +
会议室名称* + +
地址(楼层)* + +
管 理 员* + + + 可容纳人数*
内置设备* + +
相关描述 + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/room_edit.html b/app/adm/view/meeting/room_edit.html new file mode 100644 index 0000000..f084ff9 --- /dev/null +++ b/app/adm/view/meeting/room_edit.html @@ -0,0 +1,72 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑会议室

+ + + + + + + + + + + + + + + + + + + + + + + +
会议室名称* + +
地址(楼层)* + +
管 理 员* + + + 可容纳人数*
内置设备* + +
相关描述 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/room_use.html b/app/adm/view/meeting/room_use.html new file mode 100644 index 0000000..8614b83 --- /dev/null +++ b/app/adm/view/meeting/room_use.html @@ -0,0 +1,157 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} + +
+
+
+ +{/block} +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/room_view.html b/app/adm/view/meeting/room_view.html new file mode 100644 index 0000000..16c3132 --- /dev/null +++ b/app/adm/view/meeting/room_view.html @@ -0,0 +1,44 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

会议室信息

+ + + + + + + + + + + + + + + + + + + + + + + +
会议室名称{$detail.title}
地址(楼层){$detail.address}
管 理 员{$detail.keep_name}可容纳人数{$detail.num}
内置设备{$detail.device}
相关描述{$detail.remark|default=''}
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/meeting/view.html b/app/adm/view/meeting/view.html new file mode 100644 index 0000000..8a81427 --- /dev/null +++ b/app/adm/view/meeting/view.html @@ -0,0 +1,52 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

会议室预定

+ + + + + + + + + + + + + + + + + + + + + + + +
会议主题{$detail.title|default=''}会议地点{$detail.room|default=''}
开始时间{$detail.start_time|default=''}结束时间{$detail.end_time|default=''}会议人数{$detail.num|default=''}
会议需求 + {volist name="$detail.requirements_array" id="v"} + {eq name="$v.checked" value="1" }{$v.title}{/eq} + {/volist} +
其他要求{$detail.remark|default=''}
+
+
+{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/news/add.html b/app/adm/view/news/add.html new file mode 100644 index 0000000..59f58f2 --- /dev/null +++ b/app/adm/view/news/add.html @@ -0,0 +1,94 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+ {eq name="$id" value="0"} +

新增公司新闻

+ {else/} +

编辑公司新闻

+ {/eq} + + + + + + + + + + + + + + + + + + + +
新闻标题* + +
关联链接排序
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
新闻内容* + +
+ +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/news/datalist.html b/app/adm/view/news/datalist.html new file mode 100644 index 0000000..3fc25af --- /dev/null +++ b/app/adm/view/news/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/news/view.html b/app/adm/view/news/view.html new file mode 100644 index 0000000..c6f9098 --- /dev/null +++ b/app/adm/view/news/view.html @@ -0,0 +1,63 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
+

{$detail.title}

+
+ {$detail.admin_name}发表于:{$detail.create_time | date='Y-m-d H:i:s'} +
+
+ {$detail.content|raw} +
+ {notempty name="$detail.src"} +
+ 关联链接:{$detail.src} +
+ {/notempty} + {notempty name="$detail.file_ids"} +
+

相关附件

+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+ {/notempty} + +{/block} + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/adm/view/note/add.html b/app/adm/view/note/add.html new file mode 100644 index 0000000..d0a4990 --- /dev/null +++ b/app/adm/view/note/add.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + + {eq name="$id" value="0"} +

新增公告

+ {else/} +

编辑公告

+ {/eq} + + + + + + + + + + + + + + + + + + + + + + + + + +
公告标题* + + 公告分类* + +
排序状态* + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
关联链接
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
公告内容* + +
+ +
+ + + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/note/datalist.html b/app/adm/view/note/datalist.html new file mode 100644 index 0000000..ca2d203 --- /dev/null +++ b/app/adm/view/note/datalist.html @@ -0,0 +1,103 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/note/view.html b/app/adm/view/note/view.html new file mode 100644 index 0000000..07fe43b --- /dev/null +++ b/app/adm/view/note/view.html @@ -0,0 +1,67 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
+

{$detail.title}

+
+ {$detail.admin_name}发表于:{$detail.create_time | date='Y-m-d H:i:s'} {$detail.sourse==1?'PC端':'手机端'}公告分类:{$detail.cate} +
+
+ {eq name="$detail.sourse" value="1"} + {$detail.content|raw} + {else/} +
{$detail.content}
+ {/eq} +
+ {notempty name="$detail.src"} +
+ 关联链接:{$detail.src} +
+ {/notempty} + {notempty name="$detail.file_ids"} +
+

相关附件

+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+ {/notempty} + +{/block} + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/adm/view/notecate/add.html b/app/adm/view/notecate/add.html new file mode 100644 index 0000000..4645e37 --- /dev/null +++ b/app/adm/view/notecate/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +

公告类别

+ + + + + + + +
公告类别名称* + + 排序 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/notecate/datalist.html b/app/adm/view/notecate/datalist.html new file mode 100644 index 0000000..e4f8afe --- /dev/null +++ b/app/adm/view/notecate/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/notecate/view.html b/app/adm/view/notecate/view.html new file mode 100644 index 0000000..f80d77d --- /dev/null +++ b/app/adm/view/notecate/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

公告类别详情

+ + + + + + + +
公告类别名称{$detail.title|default=''}">排序{$detail.sort|default=0}
+
+{/block} + \ No newline at end of file diff --git a/app/adm/view/official/add.html b/app/adm/view/official/add.html new file mode 100644 index 0000000..8d1931d --- /dev/null +++ b/app/adm/view/official/add.html @@ -0,0 +1,130 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

添加公文

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
公文名称*公文文号*
拟稿人* + + + 拟稿部门* + + + 拟稿日期*
主送人员* + + + 抄送人员 + + +
共享可查阅人 + + + 密级程度* + + + + 紧急程度* + + + +
+
相关附件
+
+ +
+
+
+ +
+
公文内容* + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/official/datalist.html b/app/adm/view/official/datalist.html new file mode 100644 index 0000000..c5a931f --- /dev/null +++ b/app/adm/view/official/datalist.html @@ -0,0 +1,147 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+
    +
  • 全部公文
  • +
  • 我发的公文
  • +
  • 我收到的公文
  • +
  • 抄送给我的公文
  • +
  • 共享查阅的公文
  • +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/official/edit.html b/app/adm/view/official/edit.html new file mode 100644 index 0000000..48f1106 --- /dev/null +++ b/app/adm/view/official/edit.html @@ -0,0 +1,128 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑公文

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
公文名称*公文文号*
拟稿人* + + + 拟稿部门* + + + 拟稿日期*
主送人员* + + + 抄送人员 + + +
共享可查阅人 + + + 密级程度* + + + + 紧急程度* + + + +
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.file_array"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
公文内容* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/official/pending.html b/app/adm/view/official/pending.html new file mode 100644 index 0000000..d1f0165 --- /dev/null +++ b/app/adm/view/official/pending.html @@ -0,0 +1,64 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/official/reviewed.html b/app/adm/view/official/reviewed.html new file mode 100644 index 0000000..4b51213 --- /dev/null +++ b/app/adm/view/official/reviewed.html @@ -0,0 +1,64 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/official/view.html b/app/adm/view/official/view.html new file mode 100644 index 0000000..8fe8b40 --- /dev/null +++ b/app/adm/view/official/view.html @@ -0,0 +1,110 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

公文详情

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + +
公文名称{$detail.title}公文文号{$detail.code}
拟稿人{$detail.draft_name}拟稿部门{$detail.draft_dame}拟稿日期{$detail.draft_time|date="Y-m-d"}
主送人员{$detail.send_names}抄送人员{$detail.copy_names|default='-'}
共享可查阅人{$detail.share_names|default='-'} + {eq name="$auth_office" value="1"} + 更改 + {/eq} + 密级程度 + {eq name="$detail.secrets" value="1"}公开{/eq} + {eq name="$detail.secrets" value="2"}秘密{/eq} + {eq name="$detail.secrets" value="3"}机密{/eq} + 紧急程度 + {eq name="$detail.urgency" value="1"}普通{/eq} + {eq name="$detail.urgency" value="2"}紧急{/eq} + {eq name="$detail.urgency" value="3"}加急{/eq} +
相关附件 +
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
公文内容{$detail.content|raw}
+ +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/add.html b/app/adm/view/property/add.html new file mode 100644 index 0000000..3f57e69 --- /dev/null +++ b/app/adm/view/property/add.html @@ -0,0 +1,184 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增资产

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
资产名称* + + + 资产缩略图 + + +
+ + +
+
资产编码* + + 资产型号*
资产分类* + + 资产品牌* + +
质保到期日*资产单位* + +
使用人员 + + + 使用部门
购买价格*购买日期*年折旧率(%)*
资产状态* + {volist name="$status" id="vo"} + + {/volist} +
资产来源* + {volist name="$source" id="vo"} + {gt name="$key" value="0"} + + {/gt} + {/volist} +
放置地址
+
相关附件
+
+ +
+
+
+ +
+
资产描述 + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/datalist.html b/app/adm/view/property/datalist.html new file mode 100644 index 0000000..e8fa0c8 --- /dev/null +++ b/app/adm/view/property/datalist.html @@ -0,0 +1,164 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+
+

资产分类

+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +{/block} + +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/edit.html b/app/adm/view/property/edit.html new file mode 100644 index 0000000..d3de905 --- /dev/null +++ b/app/adm/view/property/edit.html @@ -0,0 +1,190 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑资产

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
资产名称* + + + 缩略图 + + +
+ + +
+
资产编码* + + 资产型号*
资产分类* + + 资产品牌* + +
质保到期日*单位* + +
使用人员 + + + 使用部门
购买价格*购买日期*年折旧率(%)*
资产状态* + {volist name="$status" id="vo"} + + {/volist} +
资产来源* + {volist name="$source" id="vo"} + {gt name="$key" value="0"} + + {/gt} + {/volist} +
放置地址
+
资产附件
+
+ +
+
+
+ + {notempty name="$detail.fileArray"} + {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
资产描述 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/repair_add.html b/app/adm/view/property/repair_add.html new file mode 100644 index 0000000..e43c022 --- /dev/null +++ b/app/adm/view/property/repair_add.html @@ -0,0 +1,87 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增资产维修记录

+ + {eq name="$pid" value="0"} + + + + + {else/} + + + + + {/eq} + + + + + + + + + + + + + + + + +
资产名称* + + +
资产名称{$property.title}
维修日期*维修费用*跟进人* + + +
+
相关附件
+
+ +
+
+
+ +
+
维修原因* + +
+
+ {gt name="$pid" value="0"} + + {/gt} + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/repair_edit.html b/app/adm/view/property/repair_edit.html new file mode 100644 index 0000000..ec139b5 --- /dev/null +++ b/app/adm/view/property/repair_edit.html @@ -0,0 +1,80 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑资产维修记录

+ + + + + + + + + + + + + + + + + + + + + +
资产名称{$detail.property}
维修日期*维修费用*跟进人* + + +
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.fileArray"} + {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
维修原因* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/repair_list.html b/app/adm/view/property/repair_list.html new file mode 100644 index 0000000..352b672 --- /dev/null +++ b/app/adm/view/property/repair_list.html @@ -0,0 +1,91 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+ +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/repair_view.html b/app/adm/view/property/repair_view.html new file mode 100644 index 0000000..535b94e --- /dev/null +++ b/app/adm/view/property/repair_view.html @@ -0,0 +1,50 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

资产维修记录

+ + + + + + + + + + + + + + {notempty name="$detail.fileArray"} + + + + + {/notempty} + + + + +
资产名称{$detail.property}
维修日期{$detail.repair_time|date='Y-m-d'}维修费用{$detail.cost}跟进人{$detail.director_name}
相关附件 +
+ {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
维修原因{$detail.content|default=''}
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/property/view.html b/app/adm/view/property/view.html new file mode 100644 index 0000000..bbc84a7 --- /dev/null +++ b/app/adm/view/property/view.html @@ -0,0 +1,141 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+

资产详情

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + + + {/notempty} + + + + + + + + + + + + +
资产名称{$detail.title}资产编码{$detail.code}缩略图 +
+ +
+
资产分类{$detail.cate|default=""}资产品牌{$detail.brand|default=""}资产型号{$detail.model|default=""}
购买价格{$detail.price} 元购买日期{$detail.buy_time|date='Y-m-d'}年折旧率{$detail.rate}%
质保日期{$detail.quality_time|date='Y-m-d'}使用人员{$detail.users_name|default="-"}使用部门{$detail.dids_title|default="-"}
放置地址{$detail.address}单位{$detail.unit|default=""}
资产来源{$detail.source_str}当前状态{$detail.status_str}
资产附件
+ {volist name="$detail.fileArray" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
资产描述
{:nl2br($detail.content)}
维修记录
+ + + + + + + + + + {empty name="$detail.repair"} + + + + {else/} + {volist name="$detail.repair" id="vo"} + + + + + + + + + {/volist} + {/empty} +
维修日期维修费用(元)跟进人原因说明记录时间操作
暂无维修记录
{$vo.repair_time|date="Y-m-d"}{$vo.cost}{$vo.director_name}{$vo.content|default="-"}{$vo.create_time|date="Y-m-d H:i"}
+
+ +
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/propertybrand/add.html b/app/adm/view/propertybrand/add.html new file mode 100644 index 0000000..24b7c99 --- /dev/null +++ b/app/adm/view/propertybrand/add.html @@ -0,0 +1,71 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

资产品牌

+ {eq name="$id" value="0"} + + + + + + + + + + + +
品牌名称* + + 排序 + +
描述
+ {else/} + + + + + + + + + + + +
品牌名称* + + 排序 + +
描述
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/propertybrand/datalist.html b/app/adm/view/propertybrand/datalist.html new file mode 100644 index 0000000..b881b52 --- /dev/null +++ b/app/adm/view/propertybrand/datalist.html @@ -0,0 +1,95 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/propertycate/add.html b/app/adm/view/propertycate/add.html new file mode 100644 index 0000000..82731ba --- /dev/null +++ b/app/adm/view/propertycate/add.html @@ -0,0 +1,91 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

资产分类

+ {eq name="$id" value="0"} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {else/} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/propertycate/datalist.html b/app/adm/view/propertycate/datalist.html new file mode 100644 index 0000000..8dd848e --- /dev/null +++ b/app/adm/view/propertycate/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+ +
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/propertyunit/add.html b/app/adm/view/propertyunit/add.html new file mode 100644 index 0000000..6b72f86 --- /dev/null +++ b/app/adm/view/propertyunit/add.html @@ -0,0 +1,71 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

资产单位

+ {eq name="$id" value="0"} + + + + + + + + + + + +
单位名称* + + 排序 + +
描述
+ {else/} + + + + + + + + + + + +
单位名称* + + 排序 + +
描述
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/propertyunit/datalist.html b/app/adm/view/propertyunit/datalist.html new file mode 100644 index 0000000..9f24455 --- /dev/null +++ b/app/adm/view/propertyunit/datalist.html @@ -0,0 +1,95 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/seal/add.html b/app/adm/view/seal/add.html new file mode 100644 index 0000000..73ec4e5 --- /dev/null +++ b/app/adm/view/seal/add.html @@ -0,0 +1,122 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

添加用章申请

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
申请主题*用印部门{$user.department}({$user.name})
盖章次数* + + 预期用印日期*印章类型* + +
印章是否外借* + + + 印章借用日期结束借用日期
盖章内容* + +
+
相关附件
+
+ +
+
+
+ +
+
+ +
+ +
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/seal/datalist.html b/app/adm/view/seal/datalist.html new file mode 100644 index 0000000..eb07e8c --- /dev/null +++ b/app/adm/view/seal/datalist.html @@ -0,0 +1,149 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+
    +
  • 全部
  • +
  • 我申请的
  • +
  • 待我审批
  • +
  • 我已审批
  • +
  • 抄送我的
  • +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/seal/edit.html b/app/adm/view/seal/edit.html new file mode 100644 index 0000000..ea0ce4e --- /dev/null +++ b/app/adm/view/seal/edit.html @@ -0,0 +1,126 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑用章申请

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
申请主题*用印部门{$user.department}({$user.name})
盖章次数* + + 预期用印日期*印章类型* + +
印章是否外借* + + + 印章借用日期结束借用日期
盖章内容* + +
+
相关附件
+
+ +
+
+
+ + {notempty name="$detail.file_array"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
+
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/seal/record.html b/app/adm/view/seal/record.html new file mode 100644 index 0000000..5c12525 --- /dev/null +++ b/app/adm/view/seal/record.html @@ -0,0 +1,155 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+ + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/seal/view.html b/app/adm/view/seal/view.html new file mode 100644 index 0000000..ca39c83 --- /dev/null +++ b/app/adm/view/seal/view.html @@ -0,0 +1,75 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

用章审批

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="detail.check_status" value="2"} + + + + + {/eq} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
审批主题{$detail.title}印章类型{$detail.seal_cate}
盖章次数{$detail.num}用印部门{$detail.use_dname|default='-'}({$create_user.name})预期用印日期{$detail.use_time|date='Y-m-d'}
印章是否外借 + {eq name="$detail.is_borrow" value="0"}否{/eq} + {eq name="$detail.is_borrow" value="1"}是{/eq} + 印章借用日期{$detail.start_time|default='-'}结束借用日期{$detail.end_time|default='-'}
盖章内容{:nl2br($detail.content)}
用章状态『{$detail.status_str}』
+
相关附件
+
+
+ + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
+
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/sealcate/add.html b/app/adm/view/sealcate/add.html new file mode 100644 index 0000000..3960d1e --- /dev/null +++ b/app/adm/view/sealcate/add.html @@ -0,0 +1,97 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

印章管理

+ {eq name="$id" value="0"} + + + + + + + + + + + + + + + +
印章名称* + + 保管人* + + +
应用部门 +
+ +
+ (如果不选,默认是全公司) +
用途简述
+ {else/} + + + + + + + + + + + + + + + +
印章名称* + + 保管人* + + +
应用部门 +
+ +
+ (如果不选,默认是全公司) +
用途简述
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/adm/view/sealcate/datalist.html b/app/adm/view/sealcate/datalist.html new file mode 100644 index 0000000..d6b8d5c --- /dev/null +++ b/app/adm/view/sealcate/datalist.html @@ -0,0 +1,97 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/api/BaseController.php b/app/api/BaseController.php new file mode 100644 index 0000000..c7f4d06 --- /dev/null +++ b/app/api/BaseController.php @@ -0,0 +1,159 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\api; + +use think\exception\HttpResponseException; +use think\facade\Request; +use think\facade\Session; +use think\facade\View; +use think\facade\Db; +use think\Response; + +/** + * 控制器基础类 + */ +abstract class BaseController +{ + /** + * 是否批量验证 + * @var bool + */ + protected $batchValidate = false; + + /** + * 控制器中间件 + * @var array + */ + protected $middleware = []; + + /** + * 分页数量 + * @var string + */ + protected $pageSize = 20; + + /** + * jwt配置 + * @var string + */ + protected $jwt_conf = [ + 'secrect' => 'gouguoa', + 'iss' => 'www.gougucms.com', //签发者 可选 + 'aud' => 'gouguoa', //接收该JWT的一方,可选 + 'exptime' => 7200, //过期时间,这里设置2个小时 + ]; + protected $module; + protected $controller; + protected $action; + protected $uid; + protected $did; + protected $pid; + /** + * 构造方法 + * @access public + * @param App $app 应用对象 + */ + public function __construct() + { + $this->module = strtolower(app('http')->getName()); + $this->controller = strtolower(Request::controller()); + $this->action = strtolower(Request::action()); + $this->uid = 0; + $this->did = 0; + $this->pid = 0; + $this->jwt_conf = get_system_config('token'); + // 控制器初始化 + $this->initialize(); + } + + // 初始化 + protected function initialize() + { + // 检测权限 + $this->checkLogin(); + //每页显示数据量 + $this->pageSize = Request::param('limit', \think\facade\Config::get('app.page_size')); + } + + /** + *验证用户登录 + */ + protected function checkLogin() + { + $session_admin = get_config('app.session_admin'); + if (!Session::has($session_admin)) { + $this->apiError('请先登录'); + } + else{ + $this->uid = Session::get($session_admin); + $login_admin = get_admin($this->uid); + $this->did = $login_admin['did']; + $this->pid = $login_admin['pid']; + View::assign('login_admin', $login_admin); + } + } + /** + * Api处理成功结果返回方法 + * @param $message + * @param null $redirect + * @param null $extra + * @return mixed + * @throws ReturnException + */ + protected function apiSuccess($msg = 'success', $data = []) + { + return $this->apiReturn($data, 0, $msg); + } + + /** + * Api处理结果失败返回方法 + * @param $error_code + * @param $message + * @param null $redirect + * @param null $extra + * @return mixed + * @throws ReturnException + */ + protected function apiError($msg = 'fail', $data = [], $code = 1) + { + return $this->apiReturn($data, $code, $msg); + } + + /** + * 返回封装后的API数据到客户端 + * @param mixed $data 要返回的数据 + * @param integer $code 返回的code + * @param mixed $msg 提示信息 + * @param string $type 返回数据格式 + * @param array $header 发送的Header信息 + * @return Response + */ + protected function apiReturn($data, int $code = 0, $msg = '', string $type = '', array $header = []): Response + { + $result = [ + 'code' => $code, + 'msg' => $msg, + 'time' => time(), + 'data' => $data, + ]; + + $type = $type ?: 'json'; + $response = Response::create($result, $type)->header($header); + + throw new HttpResponseException($response); + } + +} diff --git a/app/api/common.php b/app/api/common.php new file mode 100644 index 0000000..ec9da89 --- /dev/null +++ b/app/api/common.php @@ -0,0 +1,130 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +/** + * 根据IP获取地址 + */ +function get_address($ip) +{ + $res = file_get_contents("http://ip.360.cn/IPQuery/ipquery?ip=" . $ip); + $res = json_decode($res, 1); + if ($res && $res['errno'] == 0) { + return explode("\t", $res['data'])[0]; + } else { + return ''; + } +} + +/** + * 导出数据为excel表格 + * @param $data 一个二维数组,结构如同从数据库查出来的数组 + * @param $title excel的第一行标题,一个数组,如果为空则没有标题 + * @param $filename 下载的文件名 + * @param exportexcel($arr,array('id','账户','密码','昵称'),'文件名!'); + */ +function export_excel($data = array(), $title = array(), $filename = 'report') +{ + header("Content-type:application/octet-stream"); + header("Accept-Ranges:bytes"); + header("Content-type:application/vnd.ms-excel"); + header("Content-Disposition:attachment;filename=" . $filename . ".xls"); + header("Pragma: no-cache"); + header("Expires: 0"); + //导出xls 开始 + if (!empty($title)) { + foreach ($title as $k => $v) { + $title[$k] = iconv("UTF-8", "GB2312", $v); + } + $title = implode("\t", $title); + echo "$title\n"; + } + if (!empty($data)) { + foreach ($data as $key => $val) { + foreach ($val as $ck => $cv) { + $data[$key][$ck] = iconv("UTF-8", "GB2312", $cv); + } + $data[$key] = implode("\t", $data[$key]); + } + echo implode("\n", $data); + } +} + +//读取文章分类列表 +function get_article_cate() +{ + $cate = \think\facade\Db::name('ArticleCate')->order('create_time asc')->select()->toArray(); + return $cate; +} +//假期类型 +function get_leaves_types($id=0) +{ + $types_array = ['未设置','事假','年假','调休假','病假','婚假','丧假','产假','陪产假','其他']; + if($id==0){ + return $types_array; + } + else{ + $news_array=[]; + foreach($types_array as $key => $value){ + if($key>0){ + $news_array[]=array( + 'id'=>$key, + 'title'=>$value, + ); + } + } + return $news_array; + } +} + +//根据假期类型读取名称 +function leaves_types_name($types=0) +{ + $types_array = get_leaves_types(); + return $types_array[$types]; +} + +//销售合同性质 +function get_contract_types($check_status=0) +{ + $contract_types_array = [ + ["id"=>1,"title"=>"普通合同"], + ["id"=>2,"title"=>"产品合同"], + ["id"=>3,"title"=>"服务合同"] + ]; + return $contract_types_array; +} + +//根据销售合同性质读取销售合同性质名称 +function contract_types_name($types=1) +{ + $contract_types_array = get_contract_types(); + return $contract_types_array[$types-1]; +} + +//采购合同性质 +function get_purchase_types($check_status=0) +{ + $purchase_types_array = [ + ["id"=>1,"title"=>"普通采购"], + ["id"=>2,"title"=>"物品采购"], + ["id"=>3,"title"=>"服务采购"] + ]; + return $purchase_types_array; +} + +//根据采购合同性质读取采购合同性质名称 +function purchase_types_name($types=1) +{ + $purchase_types_array = get_purchase_types(); + return $purchase_types_array[$types-1]; +} \ No newline at end of file diff --git a/app/api/controller/Check.php b/app/api/controller/Check.php new file mode 100644 index 0000000..c4bd123 --- /dev/null +++ b/app/api/controller/Check.php @@ -0,0 +1,654 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\api\controller; + +use app\api\BaseController; +use think\facade\Db; + +class Check extends BaseController +{ + //获取审核流程 + public function get_flows($check_name='') + { + $cate_id = Db::name('FlowCate')->where(['name' => $check_name,'status'=>1])->value('id'); + $flow = Db::name('Flow')->where(['cate_id' => $cate_id,'status'=>1,'delete_time'=>0])->select()->toArray(); + return to_assign(0, '', $flow); + } + //获取审核步骤人员 + public function get_flow_users($id=0) + { + $flow = Db::name('Flow')->where(['id' => $id])->find(); + $flow_data = unserialize($flow['flow_list']); + if(!empty($flow_data)){ + foreach ($flow_data as $key => &$val) { + $val['check_position'] = ''; + if($val['check_role'] == 1){ + $val['check_uids'] = get_department_leader($this->uid); + } + if($val['check_role'] == 2){ + $val['check_uids'] = get_department_leader($this->uid,1); + } + if($val['check_role'] == 3){ + $val['check_position'] = Db::name('Position')->where('id',$val['check_position_id'])->value('title'); + $check_uids = Db::name('Admin')->where(['position_id'=>$val['check_position_id'],'status'=>1])->column('id'); + $val['check_uids'] = implode(',',$check_uids); + } + $val['check_uids_info'] = Db::name('Admin')->field('id,name,thumb')->where('id','in',$val['check_uids'])->select()->toArray(); + } + } + else{ + $flow_data = []; + } + + $data['copy_uids'] = $flow['copy_uids']; + $data['copy_unames'] =''; + if(!empty($flow['copy_uids'])){ + $copy_unames = Db::name('Admin')->where('id', 'in', $flow['copy_uids'])->column('name'); + $data['copy_unames'] = implode(',', $copy_unames); + } + $data['flow_data'] = $flow_data; + return to_assign(0, '', $data); + } + + //提交审批申请 + public function submit_check() + { + $param = get_params(); + $flow_cate = Db::name('FlowCate')->where(['name' => $param['check_name']])->find(); + $flow_list = Db::name('Flow')->where('id',$param['flow_id'])->value('flow_list'); + $flow = unserialize($flow_list); + $subject = $flow_cate['title']; + $check_table = $flow_cate['check_table']; + //var_dump($flow);exit; + //删除原来的审核流程和审核记录 + Db::name('FlowStep')->where(['action_id'=>$param['action_id'],'flow_id'=>$param['flow_id'],'delete_time'=>0])->update(['delete_time'=>time()]); + Db::name('FlowRecord')->where(['action_id'=>$param['action_id'],'check_table'=>$check_table,'delete_time'=>0])->update(['delete_time'=>time()]); + $recordData=array( + 'action_id' => $param['action_id'], + 'check_table' => $check_table, + 'step_id' => 0, + 'check_uid' => $this->uid, + 'flow_id' => $param['flow_id'], + 'check_time' => time(), + 'check_status' => 0, + 'content' => '提交申请', + 'create_time' => time() + ); + if (!isset($param['check_uids'])) { + //非自由审批模式 + $step=[]; + $sort=0; + foreach ($flow as $key => &$value){ + if($value['check_role'] == 1){ + $value['check_uids'] = get_department_leader($this->uid); + $value['flow_name'] = '当前部门负责人'; + $value['check_position_id']=0; + } + if($value['check_role'] == 2){ + $value['check_uids'] = get_department_leader($this->uid,1); + $value['flow_name'] = '上级部门负责人'; + $value['check_position_id']=0; + } + if($value['check_role'] == 3){ + $check_position = Db::name('Position')->where('id',$value['check_position_id'])->value('title'); + $check_uids = Db::name('Admin')->where(['position_id'=>$value['check_position_id'],'status'=>1])->column('id'); + $value['check_uids'] = implode(',',$check_uids); + $value['flow_name'] = $check_position; + } + if($value['check_role'] == 4){ + $value['flow_name'] = '指定人员'; + $value['check_position_id']=0; + } + if($value['check_role'] == 5){ + $value['flow_name'] = '指定人员'; + $value['check_position_id']=0; + $value['check_types']=1; + } + if(!empty($value['check_uids'])){ + $step[]=[ + 'action_id' => $param['action_id'], + 'flow_id' => $param['flow_id'], + 'flow_name' => $value['flow_name'], + 'check_position_id' => $value['check_position_id'], + 'check_role' => $value['check_role'], + 'check_types' => $value['check_types'], + 'check_uids' => $value['check_uids'], + 'create_time' => time(), + 'sort'=>$sort + ]; + $sort++; + } + } + if(empty($step)){ + return to_assign(1,'审批流程设置有问题,无法提交审批申请,请联系HR或者管理员重新设置审批流程'); + } + $res = Db::name('FlowStep')->strict(false)->field(true)->insertAll($step); + if($res!=false){ + Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($recordData); + Db::name($check_table)->strict(false)->field(true)->update([ + 'id'=>$param['action_id'], + 'check_flow_id'=>$param['flow_id'], + 'check_status'=>1, + 'check_step_sort'=>0, + 'check_uids'=>$step[0]['check_uids'], + 'check_copy_uids'=>isset($param['check_copy_uids'])?$param['check_copy_uids']:'' + ]); + //发送消息通知 + if($flow_cate['template_id']>0){ + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$step[0]['check_uids'],//接收人 + 'template_id'=>$flow_cate['template_id'],//消息模板ID + 'template_field'=>'0',//消息模板字段 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s'), + 'action_id'=>$param['action_id'], + 'title' => $subject + ] + ]; + event('SendMessage',$msg); + } + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + else{ + //自由审批模式 + $flow_step = array( + 'action_id' => $param['action_id'], + 'flow_id' => $param['flow_id'], + 'flow_name' => '自由审批', + 'check_uids' => $param['check_uids'], + 'create_time' => time() + ); + $res = Db::name('FlowStep')->strict(false)->field(true)->insertGetId($flow_step); + if($res!=false){ + Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($recordData); + Db::name($check_table)->strict(false)->field(true)->update([ + 'id'=>$param['action_id'], + 'check_flow_id'=>$param['flow_id'], + 'check_status'=>1, + 'check_step_sort'=>0, + 'check_uids'=>$param['check_uids'], + 'check_copy_uids'=>isset($param['check_copy_uids'])?$param['check_copy_uids']:'' + ]); + //发送消息通知 + if($flow_cate['template_id']>0){ + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$param['check_uids'],//接收人 + 'template_id'=>$flow_cate['template_id'],//消息模板ID + 'template_field'=>'0',//消息模板字段 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s'), + 'action_id'=>$param['action_id'], + 'title' => $subject + ] + ]; + event('SendMessage',$msg); + } + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + } + + //获取审核流程节点 + public function get_flow_nodes($check_name='',$action_id=0,$flow_id=0) + { + $flow_cate = Db::name('FlowCate')->where(['name' => $check_name])->find(); + $did = $this->did; + $map = []; + $map[] = ['cate_id','=',$flow_cate['id']]; + $map[] = ['status','=',1]; + $map[] = ['delete_time','=',0]; + $map1=[ + ['department_ids','=',''] + ]; + $map2=[ + ['', 'exp', Db::raw("FIND_IN_SET('{$did}',department_ids)")] + ]; + $whereOr =[$map1,$map2]; + if($action_id==0){ + $flow = Db::name('Flow') + ->where($map) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->select()->toArray(); + foreach ($flow as $k => &$v) { + $v['is_copy'] = $flow_cate['is_copy']; + } + return to_assign(0, '', $flow); + } + $check_table = $flow_cate['check_table']; + $detail = Db::name($check_table)->where('id',$action_id)->field('id,admin_id,check_status,check_flow_id,check_step_sort,check_uids,check_copy_uids')->find(); + //创建人 + $is_creater=0; + if($detail['admin_id'] == $this->uid){ + $is_creater=1; + } + $detail['is_creater'] = $is_creater; + $detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name'); + //当前审批人 + $is_checker=0; + if(in_array($this->uid,explode(',',$detail['check_uids']))){ + $is_checker=1; + } + $detail['is_checker'] = $is_checker; + $detail['is_copy'] = $flow_cate['is_copy']; + $detail['is_file'] = $flow_cate['is_file']; + $detail['is_export'] = $flow_cate['is_export']; + $detail['is_back'] = $flow_cate['is_back']; + $detail['is_reversed'] = $flow_cate['is_reversed']; + //审批记录 + $check_record = Db::name('FlowRecord') + ->field('f.*,a.name') + ->alias('f') + ->join('Admin a', 'a.id = f.check_uid', 'left') + ->where(['f.action_id' => $action_id,'f.check_table'=>$check_table])->select()->toArray(); + foreach ($check_record as $kk => &$vv) { + $vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']); + $vv['status_str'] = '提交'; + if($vv['check_status'] == 1){ + $vv['status_str'] = '审核通过'; + } + else if($vv['check_status'] == 2){ + $vv['status_str'] = '审核拒绝'; + } + if($vv['check_status'] == 3){ + $vv['status_str'] = '撤销'; + } + if($vv['check_status'] == 4){ + $vv['status_str'] = '反确认'; + } + if(!empty($vv['check_files'])){ + $file_array = Db::name('File')->where('id','in',$vv['check_files'])->select()->toArray(); + $vv['file_array'] = $file_array; + } + else{ + $vv['file_array'] = []; + } + } + $detail['check_record'] = $check_record; + if($detail['check_status']==0 || $detail['check_status']==4){ + //$flow = Db::name('Flow')->where(['cate_id' => $flow_cate['id'],'status'=>1,'delete_time'=>0])->select()->toArray(); + $flow = Db::name('Flow') + ->where($map) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->select()->toArray(); + $detail['flow'] = $flow; + } + else{ + //当前审批人 + $detail['check_unames']='-'; + if(!empty($detail['check_uids'])){ + $check_unames = Db::name('Admin')->where('id','in',$detail['check_uids'])->column('name'); + $detail['check_unames'] = implode(',',$check_unames); + } + //抄送人 + $detail['copy_unames']='-'; + if(!empty($detail['check_copy_uids'])){ + $copy_uids = Db::name('Admin')->where('id','in',$detail['check_copy_uids'])->column('name'); + $detail['copy_unames'] = implode(',',$copy_uids); + } + + //审批节点步骤 + $nodes = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$flow_id,'delete_time'=>0])->order('sort asc')->select()->toArray(); + foreach ($nodes as $key => &$val) { + $check_uids_info = Db::name('Admin')->field('id,name,thumb')->where('id','in',$val['check_uids'])->select()->toArray(); + foreach ($check_uids_info as $k => &$v) { + $v['check_time'] = 0; + $v['content'] = ''; + $v['check_status'] = 0; + $check_array = Db::name('FlowRecord')->where(['check_uid' => $v['id'],'step_id' => $val['id']])->order('check_time desc')->select()->toArray(); + if(!empty($check_array)){ + $checked = $check_array[0]; + $v['check_time'] = date('Y-m-d H:i', $checked['check_time']); + $v['content'] = $checked['content']; + $v['check_status'] = $checked['check_status']; + } + } + $val['check_uids_info'] = $check_uids_info; + + if(!empty($val['check_position_id'])){ + $val['check_position'] = Db::name('Position')->where('id',$val['check_position_id'])->value('title'); + } + else{ + $val['check_position'] = ''; + } + + $check_list = []; + foreach ($check_record as $kkk => $vvv) { + if($vvv['step_id'] == $val['id']) + $check_list[] = $vvv; + } + $val['check_list'] = $check_list; + } + $detail['nodes'] = $nodes; + + //当前审核节点 + $step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$flow_id,'sort'=>$detail['check_step_sort'],'delete_time'=>0])->find(); + $detail['step'] = $step; + } + return to_assign(0, '', $detail); + } + + //流程审核 + public function flow_check() + { + $param = get_params(); + $param['check_files'] = isset($param['check_files']) ? $param['check_files'] : ''; + $flow_cate = Db::name('FlowCate')->where(['name' => $param['check_name']])->find(); + $subject = $flow_cate['title']; + $action_id = $param['action_id']; + $check_table = $flow_cate['check_table']; + $param['send_msg'] = 1; + //审核内容详情 + $detail = Db::name($check_table)->where(['id' => $action_id])->find(); + if (empty($detail)){ + return to_assign(1,'审批数据错误'); + } + //当前审核节点详情 + $step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>$detail['check_step_sort'],'delete_time'=>0])->find(); + //审核通过时 + if($param['check'] == 1){ + $check_uids = explode(",",strval($detail['check_uids'])); + if (!in_array($this->uid, $check_uids)){ + return to_assign(1,'您没权限审核该审批'); + } + //审批通过 + if($step['check_role'] == 0){ + //自由人审批 + if($param['check_node'] == 2){ + $next_step = $detail['check_step_sort']+1; + $flow_step = array( + 'action_id' => $action_id, + 'sort' => $next_step, + 'flow_id' => $detail['check_flow_id'], + 'check_uids' => $param['check_uids'], + 'create_time' => time() + ); + $fid = Db::name('FlowStep')->strict(false)->field(true)->insertGetId($flow_step); + //下一步审核步骤 + $param['check_step_sort'] = $next_step; + $param['check_status'] = 1; + } + else{ + //不存在下一步审核,审核结束 + $param['check_status'] = 2; + $param['check_uids'] =''; + } + } + else{ + //查询当前步骤审批记录数 + $check_count = Db::name('FlowRecord')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'step_id'=>$step['id']])->count(); + //当前当前步骤审批应有记录数 + $flow_count = explode(',', $step['check_uids']); + $param['check_status'] = 1; + $uids_array = explode(',',$detail['check_uids']); + $new_uids= array_diff($uids_array, [$this->uid]); + $param['check_uids'] = implode(',',$new_uids); + if((($check_count+1) >= count($flow_count) && $step['check_types']==1) || $step['check_types']==2){ + //会签 + $next_step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>($detail['check_step_sort']+1),'delete_time'=>0])->find(); + if($next_step){ + //存在下一步审核 + if($next_step['check_role'] == 1){ + $param['check_uids'] = get_department_leader($detail['admin_id']); + } + else if($next_step['check_role'] == 2){ + $param['check_uids'] = get_department_leader($detail['admin_id'],1); + } + else if($next_step['check_role'] == 3){ + $uids = Db::name('Admin')->where(['position_id'=>$next_step['check_position_id'],'status'=>1])->column('id'); + $param['check_uids'] = implode(',' ,$uids); + } + else{ + $param['check_uids'] = $next_step['check_uids']; + } + $param['check_step_sort'] = $detail['check_step_sort']+1; + $param['check_status'] = 1; + } + else{ + //不存在下一步审核,审核结束 + $param['check_status'] = 2; + $param['check_uids'] =''; + } + } + else{ + $param['send_msg'] = 0; + } + } + if($param['check_status'] == 1 && empty($param['check_uids'])){ + return to_assign(1,'找不到下一步的审批人,该审批流程设置有问题,请联系HR或者管理员'); + } + //添加历史审核人 + if(empty($detail['check_history_uids'])){ + $param['check_history_uids'] = $this->uid; + } + else{ + $param['check_history_uids'] = $detail['check_history_uids'].','.$this->uid; + } + $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_history_uids,check_uids')->where(['id' => $action_id])->update($param); + + if($res!==false){ + $checkData=array( + 'action_id' => $action_id, + 'check_table' => $check_table, + 'step_id' => $step['id'], + 'check_uid' => $this->uid, + 'flow_id' => $detail['check_flow_id'], + 'check_time' => time(), + 'check_files' => $param['check_files'], + 'check_status' => $param['check'], + 'content' => $param['content'], + 'create_time' => time() + ); + $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); + add_log('check', $action_id, $param,$subject); + //发送消息通知 + if($param['check_status'] == 1){ + if($flow_cate['template_id']>0 && $param['send_msg']==1){ + $msg=[ + 'from_uid'=>$detail['admin_id'],//发送人 + 'to_uids'=>$param['check_uids'],//接收人 + 'template_id'=>$flow_cate['template_id'],//消息模板ID + 'template_field'=>'0',//消息模板字段,审批中 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s',$detail['create_time']), + 'action_id'=>$action_id, + 'title' => $subject + ] + ]; + event('SendMessage',$msg); + } + } + if($param['check_status'] == 2){ + if($flow_cate['template_id']>0){ + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$detail['admin_id'],//接收人 + 'template_id'=>$flow_cate['template_id'],//消息模板ID + 'template_field'=>'1',//消息模板字段,审核通过 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s',$detail['create_time']), + 'action_id'=>$action_id, + 'title' => $subject + ] + ]; + event('SendMessage',$msg); + + if(!empty($detail['check_copy_uids'])){ + $msgs=[ + 'from_uid'=>$detail['admin_id'],//发送人 + 'to_uids'=>$detail['check_copy_uids'],//接收人 + 'template_id'=>$flow_cate['template_id'],//消息模板ID + 'template_field'=>'3',//消息模板字段,审核通过抄送人接收 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s',$detail['create_time']), + 'action_id'=>$action_id, + 'title' => $subject + ] + ]; + event('SendMessage',$msgs); + } + } + } + return to_assign(0,'操作成功',['check_status'=>$param['check_status']]); + } + else{ + return to_assign(1,'操作失败'); + } + } + //审批拒绝 + else if($param['check'] == 2){ + $check_uids = explode(",",strval($detail['check_uids'])); + if (!in_array($this->uid, $check_uids)){ + return to_assign(1,'您没权限审核该审批'); + } + //拒绝审核,数据操作 + $param['check_status'] = 3; + //添加历史审核人 + if(empty($detail['check_history_uids'])){ + $param['check_history_uids'] = $this->uid; + } + else{ + $param['check_history_uids'] = $detail['check_history_uids'].','.$this->uid; + } + $param['check_uids'] =''; + if($step['check_role'] == 5){ + //获取上一步的审核信息 + $prev_step = Db::name('FlowStep')->where(['action_id'=>$action_id,'flow_id'=>$detail['check_flow_id'],'sort'=>($detail['check_step_sort']-1),'delete_time'=>0])->find(); + if($prev_step){ + //存在上一步审核 + $param['check_step_sort'] = $prev_step['sort']; + $param['check_uids'] = $prev_step['check_uids']; + $param['check_status'] = 1; + } + else{ + //不存在上一步审核,审核初始化步骤 + $param['check_step_sort'] = 0; + $param['check_uids'] = ''; + $param['check_status'] = 0; + } + } + + $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_history_uids,check_uids')->where(['id' => $action_id])->update($param); + if($res!==false){ + $checkData=array( + 'action_id' => $action_id, + 'check_table' => $check_table, + 'step_id' => $step['id'], + 'check_uid' => $this->uid, + 'flow_id' => $detail['check_flow_id'], + 'check_time' => time(), + 'check_status' => $param['check'], + 'check_files' => $param['check_files'], + 'content' => $param['content'], + 'create_time' => time() + ); + $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); + add_log('refue', $action_id, $param,$subject); + //发送消息通知 + if($flow_cate['template_id']>0){ + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$detail['admin_id'],//接收人 + 'template_id'=>$flow_cate['template_id'],//消息模板ID + 'template_field'=>'2',//消息模板字段,审核拒绝 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s',$detail['create_time']), + 'action_id'=>$detail['id'], + 'title' => $subject + ] + ]; + event('SendMessage',$msg); + } + return to_assign(0,'操作成功',['check_status'=>$param['check_status']]); + } + else{ + return to_assign(1,'操作失败'); + } + } + else if($param['check'] == 3){ + //审批撤回 + if($detail['admin_id'] != $this->uid){ + return to_assign(1,'你没权限操作'); + } + //撤销审核,数据操作 + $param['check_status'] = 4; + $param['check_uids'] =''; + $param['check_step_sort'] =0; + + $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_uids')->where(['id' => $action_id])->update($param); + if($res!==false){ + $checkData=array( + 'action_id' => $action_id, + 'check_table' => $check_table, + 'step_id' => $step['id'], + 'check_uid' => $this->uid, + 'flow_id' => $detail['check_flow_id'], + 'check_time' => time(), + 'check_status' => $param['check'], + 'content' => $param['content'], + 'create_time' => time() + ); + $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); + add_log('back', $action_id, $param,$subject); + return to_assign(0,'操作成功',['check_status'=>$param['check_status']]); + }else{ + return to_assign(1,'操作失败'); + } + } + else if($param['check'] == 4){ + //审批反确认 + //反确认审核,数据回到待提交审批 + $param['check_status'] = 0; + $param['check_uids'] =''; + $param['check_step_sort'] =0; + + $res = Db::name($check_table)->strict(false)->field('check_step_sort,check_status,check_uids')->where(['id' => $action_id])->update($param); + if($res!==false){ + $checkData=array( + 'action_id' => $action_id, + 'check_table' => $check_table, + 'step_id' => $step['id'], + 'check_uid' => $this->uid, + 'flow_id' => $detail['check_flow_id'], + 'check_time' => time(), + 'check_status' => 4, + 'content' => $param['content'], + 'create_time' => time() + ); + $aid = Db::name('FlowRecord')->strict(false)->field(true)->insertGetId($checkData); + add_log('back', $action_id, $param,$subject); + return to_assign(0,'操作成功',['check_status'=>0]); + }else{ + return to_assign(1,'操作失败'); + } + } + } +} diff --git a/app/api/controller/Comment.php b/app/api/controller/Comment.php new file mode 100644 index 0000000..854f4ef --- /dev/null +++ b/app/api/controller/Comment.php @@ -0,0 +1,107 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\api\controller; + +use app\api\BaseController; +use think\facade\Db; +use app\api\model\Comment as CommentModel; +class Comment extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CommentModel(); + } + + //获取评论列表 + public function datalist() + { + $param = get_params(); + $param['admin_id'] = $this->uid; + $where=[]; + if (!empty($param['module'])) { + $where[] = ['module', '=', $param['module']]; + } + if (!empty($param['topic_id'])) { + $where['topic_id'] = $param['topic_id']; + } + $where[] = ['delete_time', '=', 0]; + $list = $this->model->datalist($param,$where); + $total = Db::name('Comment')->where($where)->count(); + $totalRow['total'] = $total; + return table_assign(0, '', $list,$totalRow); + } + + //添加修改评论内容 + public function add() + { + $param = get_params(); + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + unset($param['pid']); + unset($param['padmin_id']); + $res = CommentModel::where(['admin_id' => $this->uid,'id'=>$param['id']])->strict(false)->field(true)->update($param); + if ($res!==false) { + add_log('edit', $param['id'], $param,'评论'); + return to_assign(); + } + } else { + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $insertId = CommentModel::strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param,'评论'); + return to_assign(); + } + } + } + + //设为已读评论内容 + public function view() + { + if (request()->isPost()) { + $id = get_params("id"); + $res = Db::name('CommentRead')->strict(false)->field(true)->insertGetId(['comment_id'=>$id,'admin_id'=>$this->uid,'create_time'=>time()]); + if ($res!==false) { + add_log('view', $id,[],'评论'); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + }else{ + return to_assign(1, "错误的请求"); + } + } + + //删除评论内容 + public function del() + { + if (request()->isDelete()) { + $id = get_params("id"); + $res = CommentModel::where('id',$id)->strict(false)->field(true)->update(['delete_time'=>time()]); + if ($res) { + add_log('delete', $id,[],'评论'); + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + }else{ + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/api/controller/Demo.php b/app/api/controller/Demo.php new file mode 100644 index 0000000..62ee044 --- /dev/null +++ b/app/api/controller/Demo.php @@ -0,0 +1,138 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\api\controller; + +use app\api\BaseController; +use app\api\middleware\Auth; +use Firebase\JWT\JWT; +use Firebase\JWT\Key; +use think\facade\Db; +use think\facade\Request; + +class Demo extends BaseController +{ + /** + * 控制器中间件 [登录、注册 不需要鉴权] + * @var array + */ + protected $middleware = [ + Auth::class => ['except' => ['index','login'] ] + ]; + + /** + * @param $user_id + * @return string + */ + public function getToken($user_id){ + $time = time(); //当前时间 + $conf = $this->jwt_conf; + $token = [ + 'iss' => $conf['iss'], //签发者 可选 + 'aud' => $conf['aud'], //接收该JWT的一方,可选 + 'iat' => $time, //签发时间 + 'nbf' => $time-1 , //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用 + 'exp' => $time+$conf['exptime'], //过期时间,这里设置2个小时 + 'data' => [ + //自定义信息,不要定义敏感信息 + 'userid' =>$user_id, + ] + ]; + return JWT::encode($token, $conf['secrect'], 'HS256'); //输出Token 默认'HS256' + } + + /** + * @param $token + */ + public static function checkToken($token){ + try { + JWT::$leeway = 60;//当前时间减去60,把时间留点余地 + $decoded = JWT::decode($token, self::$config['secrect'], ['HS256']); //HS256方式,这里要和签发的时候对应 + return (array)$decoded; + } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 + return json(['code'=>403,'msg'=>'签名错误']); + }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 + return json(['code'=>401,'msg'=>'token失效']); + }catch(\Firebase\JWT\ExpiredException $e) { // token过期 + return json(['code'=>401,'msg'=>'token已过期']); + }catch(Exception $e) { //其他错误 + return json(['code'=>404,'msg'=>'非法请求']); + }catch(\UnexpectedValueException $e) { //其他错误 + return json(['code'=>404,'msg'=>'非法请求']); + } catch(\DomainException $e) { //其他错误 + return json(['code'=>404,'msg'=>'非法请求']); + } + + } + + /** + * @api {post} /demo/login 会员登录 + * @apiDescription 系统登录接口,返回 token 用于操作需验证身份的接口 + + * @apiParam (请求参数:) {string} username 登录用户名 + * @apiParam (请求参数:) {string} password 登录密码 + + * @apiParam (响应字段:) {string} token Token + + * @apiSuccessExample {json} 成功示例 + * {"code":0,"msg":"登录成功","time":1627374739,"data":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkuZ291Z3VjbXMuY29tIiwiYXVkIjoiZ291Z3VjbXMiLCJpYXQiOjE2MjczNzQ3MzksImV4cCI6MTYyNzM3ODMzOSwidWlkIjoxfQ.gjYMtCIwKKY7AalFTlwB2ZVWULxiQpsGvrz5I5t2qTs"}} + * @apiErrorExample {json} 失败示例 + * {"code":1,"msg":"帐号或密码错误","time":1627374820,"data":[]} + */ + + public function login() + { + $param = get_params(); + if (empty($param['username']) || empty($param['password'])) { + $this->apiError('参数错误'); + } + // 校验用户名密码 + $user = Db::name('Admin')->where(['username' => $param['username']])->find(); + if (empty($user)) { + $this->apiError('帐号或密码错误'); + } + $param['pwd'] = set_password($param['password'], $user['salt']); + if ($param['pwd'] !== $user['pwd']) { + $this->apiError('帐号或密码错误'); + } + if ($user['status'] == -1) { + $this->apiError('该用户禁止登录,请于平台联系'); + } + $data = [ + 'last_login_time' => time(), + 'last_login_ip' => request()->ip(), + 'login_num' => $user['login_num'] + 1, + ]; + $res = Db::name('Admin')->where(['id' => $user['id']])->update($data); + if ($res) { + $token = self::getToken($user['id']); + $this->apiSuccess('登录成功', ['token' => $token]); + } + } + /** + * @api {post} /index/demo 测试页面 + * @apiDescription 返回文章列表信息 + + * @apiParam (请求参数:) {string} token Token + + * @apiSuccessExample {json} 响应数据样例 + * {"code":1,"msg":"","time":1563517637,"data":{"id":13,"email":"test110@qq.com","password":"e10adc3949ba59abbe56e057f20f883e","sex":1,"last_login_time":1563517503,"last_login_ip":"127.0.0.1","qq":"123455","mobile":"","mobile_validated":0,"email_validated":0,"type_id":1,"status":1,"create_ip":"127.0.0.1","update_time":1563507130,"create_time":1563503991,"type_name":"注册会员"}} + */ + public function test(Request $request) + { + $uid = JWT_UID; + $userInfo = Db::name('Admin')->where(['id' => $uid])->find(); + $this->apiSuccess('请求成功', ['user' => $userInfo]); + } +} diff --git a/app/api/controller/Export.php b/app/api/controller/Export.php new file mode 100644 index 0000000..5b06a49 --- /dev/null +++ b/app/api/controller/Export.php @@ -0,0 +1,317 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\api\controller; + +use app\api\BaseController; +use think\facade\Db; +use think\facade\View; +use Mpdf\Mpdf; +use PhpOffice\PhpWord\TemplateProcessor; +use app\adm\model\MeetingRecords; +use app\adm\model\MeetingOrder; +use app\home\model\Leaves; +use app\home\model\Trips; +use app\home\model\Outs; +use app\adm\model\Seal; +use app\user\model\PersonalQuit; +use app\user\model\DepartmentChange; +use app\user\model\Talent; +use app\adm\model\OfficialDocs; +use app\finance\model\Loan; +use app\finance\model\Expense; +use app\finance\model\Invoice; +use app\finance\model\Ticket; +use app\contract\model\Contract; +use app\contract\model\Purchase; + +class Export extends BaseController +{ + public function pdf($types='',$id=0) + { + $name='PDF文件'; + $is_header=true; + $check_record=true; + $is_page=false; + $logo = CMS_ROOT.'public/static/home/images/logo.png'; + //请假审批 + if($types=='leaves'){ + $model = new Leaves(); + $detail= $model->getById($id); + $detail['types_name'] = leaves_types_name($detail['types']); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的请假审批单'; + } + //出差审批 + if($types=='trips'){ + $model = new Trips(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的出差审批单'; + } + //外出审批 + if($types=='outs'){ + $model = new Outs(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的外出审批单'; + } + //加班审批 + if($types=='overtimes'){ + $model = new Outs(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的加班审批单'; + } + //用印审批 + if($types=='seal'){ + $model = new Seal(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的用章审批单'; + } + //离职审批 + if($types=='personal_quit'){ + $model = new PersonalQuit(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的离职审批单'; + } + //人事调动审批单 + if($types=='department_change'){ + $model = new DepartmentChange(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的人事调动审批单'; + } + //入职审批单 + if($types=='talent'){ + $model = new Talent(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的入职审批单'; + } + //公文审批 + if($types=='official_docs'){ + $model = new OfficialDocs(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的公文审批单'; + } + //借支审批 + if($types=='loan'){ + $model = new Loan(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的借支审批单'; + } + //报销审批 + if($types=='expense'){ + $model = new Expense(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的报销审批单'; + } + //开票回款 + if($types=='invoice'){ + $model = new Invoice(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的发票开票审批单'; + } + //无票回款 + if($types=='invoicea'){ + $model = new Invoice(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的无发票回款审批单'; + } + //收票付款 + if($types=='ticket'){ + $model = new Ticket(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的收票审批单'; + } + //无发票付款单 + if($types=='ticketa'){ + $model = new Ticket(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的无发票付款审批单'; + } + //销售合同 + if($types=='contract'){ + $model = new Contract(); + $detail= $model->getById($id); + $detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title'); + $detail['department'] = $detail['sign_department']; + $detail['content_array'] = unserialize($detail['content']); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的销售合同审批单'; + } + //采购合同 + if($types=='purchase'){ + $model = new Purchase(); + $detail= $model->getById($id); + $detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title'); + $detail['department'] = $detail['sign_department']; + $detail['content_array'] = unserialize($detail['content']); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的采购合同审批单'; + } + //会议记录 + if($types=='meeting'){ + $model = new MeetingRecords(); + $detail= $model->getById($id); + $name = date('Ymd',$detail['meeting_date']).$detail['did_name'].'_会议纪要'; + $check_record=false; + } + //会议室预定 + if($types=='meeting_order'){ + $model = new MeetingOrder(); + $detail= $model->getById($id); + $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的会议室预定'; + } + //员工档案 + if($types=='files'){ + $detail = get_admin($id); + $detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name'); + $detail['position'] = Db::name('Position')->where('id',$detail['position_id'])->value('title'); + $detail['department'] = Db::name('Department')->where('id',$detail['did'])->value('title'); + $department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id'); + $department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title'); + $detail['department_names'] = implode(',',$department_names); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + $edu = Db::name('AdminProfiles')->where(['types'=>1,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $work = Db::name('AdminProfiles')->where(['types'=>2,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $certificate = Db::name('AdminProfiles')->where(['types'=>3,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $skills = Db::name('AdminProfiles')->where(['types'=>4,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $language = Db::name('AdminProfiles')->where(['types'=>5,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + View::assign('edu', $edu); + View::assign('work', $work); + View::assign('skills', $skills); + View::assign('certificate', $certificate); + View::assign('language', $language); + View::assign('detail', $detail); + $name = $detail['name'].'_档案信息'; + $check_record=false; + $is_page=true; + } + + if($check_record){ + if(!empty($detail['check_copy_uids'])){ + $check_copy_names = Db::name('Admin')->where([['id','in',$detail['check_copy_uids']],['status','=',1]])->column('name'); + $detail['check_copy_names'] = implode(',',$check_copy_names); + } + $detail['check_status_str'] = check_status_name($detail['check_status']); + //审批记录 + $check_table = $types; + if($types=='invoicea'){ + $check_table = 'invoice'; + } + if($types=='ticketa'){ + $check_table = 'ticket'; + } + $check_record_array = Db::name('FlowRecord') + ->field('f.*,a.name') + ->alias('f') + ->join('Admin a', 'a.id = f.check_uid', 'left') + ->where([['f.action_id','=',$id],['f.check_table','=',$check_table],['f.delete_time','=',0],['f.step_id','>',0]])->select()->toArray(); + foreach ($check_record_array as $kk => &$vv) { + $vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']); + $vv['status_str'] = '提交'; + if($vv['check_status'] == 1){ + $vv['status_str'] = '审核通过'; + } + else if($vv['check_status'] == 2){ + $vv['status_str'] = '审核拒绝'; + } + if($vv['check_status'] == 3){ + $vv['status_str'] = '撤销'; + } + if($vv['check_status'] == 4){ + $vv['status_str'] = '反确认'; + } + } + $detail['check_record_array'] = $check_record_array; + } + + $detail['pdf_admin'] = Db::name('Admin')->where([['id','=',$this->uid]])->value('name'); + $detail['pdf_time'] = date('Y-m-d H:i:s'); + //var_dump($detail);exit; + View::assign('detail', $detail); + View::assign('logo', $logo); + $html = View::fetch($types); + $time = time(); + //tempDir指定临时文件目录,需要有可写入的权限,否则会报错 + $mpdf = new Mpdf([ + 'mode'=>'zh',//或者utf-8 + 'format' => 'A4', + 'margin_top'=>23, + 'margin_bottom'=>19, + //重新定义字体路径 + 'fontDir' => [ + CMS_ROOT . "public/static/font/" + ], + //重新定义默认字体 + 'fontdata' => [ + "sun-exta" => [ + 'R' => 'MiSans-Regular.ttf', // regular font + 'B' => 'MiSans-Bold.ttf', // optional: bold font + 'I' => 'MiSans-Regular.ttf', // optional: italic font + 'BI' => 'MiSans-Bold.ttf', // optional: bold-italic font + 'useKashida' => 75, + 'sip-ext' => 'MiSans-Regular.ttf', /* SIP=Plane2 Unicode (extension B) */ + ] + ], + 'tempDir' => CMS_ROOT . "public/storage/pdf/" + ]); + $mpdf->SetDisplayMode('fullpage'); + //自动分析录入内容字体 + $mpdf->autoScriptToLang = true; + $mpdf->autoLangToFont = true; + //文件名称 + $filename = $name."_".$time.".pdf"; + //文章pdf文件存储路径 + $path = CMS_ROOT . "public" . "/storage/pdf/".$filename; + $pageNumber = count($mpdf->pages); + $header= ' + + +
勾股OA办公系统

'; + $page= '

第 {PAGENO}/{nbpg} 页

'; + if($is_header){ + $mpdf->SetHTMLHeader($header); + } + if($is_page){ + $mpdf->SetHTMLFooter($page); + } + //以html为标准分析写入内容 + $mpdf->WriteHTML($html); + //直接下载文件 + $mpdf->Output('tmp.pdf',true); + $mpdf->Output($filename,"d"); + exit; + /* + //生成磁盘文件 + $mpdf->Output($path); + if($type==0){ + //下载文件 + if (is_file($path)){ + //return to_assign(0,"文件生成成功"); + $file = fopen($path, "rb"); + Header( "Content-type: application/octet-stream "); + Header( "Accept-Ranges: bytes "); + Header( "Content-Disposition: attachment; filename= $filename"); + while (!feof($file)) { + echo fread($file, 8192); + ob_flush(); + flush(); + } + fclose($file); + } else { + return to_assign(1,"文件生成失败"); + } + } + */ + } +} diff --git a/app/api/controller/Import.php b/app/api/controller/Import.php new file mode 100644 index 0000000..6c0986b --- /dev/null +++ b/app/api/controller/Import.php @@ -0,0 +1,379 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\api\controller; + +use app\api\BaseController; +use think\facade\Db; +use app\user\model\Admin; +use app\customer\model\Customer; +use avatars\MDAvatars; +use Overtrue\Pinyin\Pinyin; +use PhpOffice\PhpSpreadsheet\IOFactory; +use PhpOffice\PhpSpreadsheet\Shared\Date as Shared; +use PhpOffice\PhpSpreadsheet\Cell\Coordinate; + + +class Import extends BaseController +{ + //生成头像 + public function to_avatars($char) + { + $defaultData = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'S', 'Y', 'Z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾', + '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'); + if (isset($char)) { + $Char = $char; + } else { + $Char = $defaultData[mt_rand(0, count($defaultData) - 1)]; + } + $OutputSize = min(512, empty($_GET['size']) ? 36 : intval($_GET['size'])); + + $Avatar = new MDAvatars($Char, 256, 1); + $avatar_name = '/avatars/avatar_256_' . set_salt(10) . time() . '.png'; + $path = get_config('filesystem.disks.public.url') . $avatar_name; + $res = $Avatar->Save('.' . $path, 256); + $Avatar->Free(); + return $path; + } + + //登录名校验 + public function check_name($name,$arr) + { + if(in_array($name,$arr)){ + $name = $this->check_name($name.'1',$arr); + } + return $name; + } + + //导入员工 + public function import_admin(){ + // 获取表单上传文件 + $file[]= request()->file('file'); + if($this->uid>1){ + return to_assign(1,'该操作只能是超级管理员有权限操作'); + } + try { + // 验证文件大小,名称等是否正确 + validate(['file' => 'filesize:51200|fileExt:xls,xlsx'])->check($file); + // 日期前綴 + $dataPath = date('Ym'); + $md5 = $file[0]->hash('md5'); + $savename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file[0], function () use ($md5) { + return $md5; + }); + $fileExtendName = substr(strrchr($savename, '.'), 1); + // 有Xls和Xlsx格式两种 + if ($fileExtendName == 'xlsx') { + $objReader = IOFactory::createReader('Xlsx'); + } else { + $objReader = IOFactory::createReader('Xls'); + } + $objReader->setReadDataOnly(TRUE); + $path = get_config('filesystem.disks.public.url'); + // 读取文件,tp6默认上传的文件,在runtime的相应目录下,可根据实际情况自己更改 + $objPHPExcel = $objReader->load('.'.$path . '/' .$savename); + $sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet + $highestRow = $sheet->getHighestRow(); // 取得总行数 + $highestColumn = $sheet->getHighestColumn(); // 取得总列数 + Coordinate::columnIndexFromString($highestColumn); + $lines = $highestRow - 1; + if ($lines <= 0) { + return to_assign(1, '数据不能为空'); + exit(); + } + $sex_array=['未知','男','女']; + $type_array=['未知','正式','试用','实习']; + $mobile_array = Db::name('Admin')->where([['status','>=',0],['delete_time','=',0]])->column('mobile'); + $email_array = Db::name('Admin')->where([['status','>=',0],['delete_time','=',0]])->column('email'); + $username_array = Db::name('Admin')->where([['status','>=',0],['delete_time','=',0]])->column('username'); + $department_array = Db::name('Department')->where(['status' => 1])->column('title', 'id'); + $position_array = Db::name('Position')->where(['status' => 1])->column('title', 'id'); + //循环读取excel表格,整合成数组。如果是不指定key的二维,就用$data[i][j]表示。 + for ($j = 3; $j <= $highestRow; $j++) { + $salt = set_salt(20); + $reg_pwd = '123456'; + $name = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue(); + if(empty($name)){ + continue; + } + $char = mb_substr($name, 0, 1, 'utf-8'); + $sex = array_search_plus($sex_array,$objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue()); + $department = array_search_plus($department_array,$objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue()); + $position = array_search_plus($position_array,$objPHPExcel->getActiveSheet()->getCell("f" . $j)->getValue()); + $type = array_search_plus($type_array,$objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue()); + $username = Pinyin::name($name,'none')->join(''); + //$username = implode('-', $pinyinname); + $mobile = $objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue(); + $email = $objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue(); + $file_check['mobile'] = $mobile; + $file_check['email'] = $email; + $validate_mobile = \think\facade\Validate::rule([ + 'mobile' => 'require|mobile', + ]); + $validate_email = \think\facade\Validate::rule([ + 'email' => 'email', + ]); + if (!$validate_mobile->check($file_check)) { + return to_assign(1, '第'.($j - 2).'行的手机号码的格式错误'); + } + else{ + if(in_array($mobile,$mobile_array)){ + return to_assign(1, '第'.($j - 2).'行的手机号码已存在或者重复'); + } + else{ + array_push($mobile_array,$mobile); + } + } + if(!empty($email)){ + if (!$validate_email->check($file_check)) { + return to_assign(1, '第'.($j - 2).'行的电子邮箱的格式错误'); + } + else{ + if(in_array($email,$email_array)){ + return to_assign(1, '第'.($j - 2).'行的电子邮箱已存在或者重复'); + } + else{ + array_push($email_array,$email); + } + } + } + else{ + $email=''; + } + if(empty($department)){ + return to_assign(1, '第'.($j - 2).'行的所在部门错误'); + } + if(empty($position)){ + return to_assign(1, '第'.($j - 2).'行的所属职位错误'); + } + + $newusername = $this->check_name($username,$username_array); + array_push($username_array,$newusername); + $data[$j - 3] = [ + 'name' => $name, + 'nickname' => $name, + 'mobile' => $mobile, + 'email' => $email, + 'sex' => $sex, + 'did' => $department, + 'position_id' => $position, + 'type' => $type, + 'entry_time' => Shared::excelToTimestamp($objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue(),'Asia/Shanghai'), + 'username' => $newusername, + 'salt' => $salt, + 'pwd' => set_password($reg_pwd, $salt), + 'reg_pwd' => $reg_pwd, + 'thumb' => $this->to_avatars($char) + ]; + } + //dd($data);exit; + $count=0; + foreach ($data as $a => $aa) { + $aid = Admin::strict(false)->field(true)->insertGetId($aa); + if($aid>0){ + //Db::name('DepartmentAdmin')->insert(['admin_id'=>$aid,'department_id'=>$aa['did'],'create_time' => time()]); + $count++; + } + } + return to_assign(0, '共成功导入了'.$count.'条员工数据'); + } catch (\think\exception\ValidateException $e) { + return to_assign(1, $e->getMessage()); + } + } + + //导入客户 + public function import_customer(){ + // 获取表单上传文件 + $file[]= request()->file('file'); + + $param = get_params(); + $type = 'sea'; + if(isset($param['type'])){ + $type = $param['type']; + } + try { + // 验证文件大小,名称等是否正确 + validate(['file' => 'filesize:51200|fileExt:xls,xlsx'])->check($file); + // 日期前綴 + $dataPath = date('Ym'); + $md5 = $file[0]->hash('md5'); + $savename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file[0], function () use ($md5) { + return $md5; + }); + $fileExtendName = substr(strrchr($savename, '.'), 1); + // 有Xls和Xlsx格式两种 + if ($fileExtendName == 'xlsx') { + $objReader = IOFactory::createReader('Xlsx'); + } else { + $objReader = IOFactory::createReader('Xls'); + } + $objReader->setReadDataOnly(TRUE); + $path = get_config('filesystem.disks.public.url'); + // 读取文件,tp6默认上传的文件,在runtime的相应目录下,可根据实际情况自己更改 + $objPHPExcel = $objReader->load('.'.$path . '/' .$savename); + //$objPHPExcel = $objReader->load('./storage/202209/d11544d20b3ca1c1a5f8ce799c3b2433.xlsx'); + $sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet + $highestRow = $sheet->getHighestRow(); // 取得总行数 + $highestColumn = $sheet->getHighestColumn(); // 取得总列数 + Coordinate::columnIndexFromString($highestColumn); + $lines = $highestRow - 1; + if ($lines <= 0) { + return to_assign(1, '数据不能为空'); + exit(); + } + $name_array = []; + $source_array = Db::name('CustomerSource')->where(['status' => 1])->column('title', 'id'); + $grade_array = Db::name('CustomerGrade')->where(['status' => 1])->column('title', 'id'); + $industry_array = Db::name('Industry')->where(['status' => 1])->column('title', 'id'); + + //循环读取excel表格,整合成数组。如果是不指定key的二维,就用$data[i][j]表示。 + for ($j = 3; $j <= $highestRow; $j++) { + $file_check = []; + $name = $objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue(); + if(empty($name)){ + continue; + } + $count_name = Db::name('Customer')->where(['name'=>$name,'delete_time'=>0])->count(); + if($count_name>0){ + return to_assign(1, '第'.($j - 2).'行的客户名称已经存在'); + } + if(in_array($name,$name_array)){ + return to_assign(1, '上传的文件存在相同的客户名称,请删除再操作'); + } + array_push($name_array,$name); + $source_id = array_search_plus($source_array,$objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue()); + $grade_id = array_search_plus($grade_array,$objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue()); + $industry_id = array_search_plus($industry_array,$objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue()); + + $c_name = $objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue(); + $c_mobile = $objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue(); + $file_check['c_mobile'] = $c_mobile; + $tax_num = $objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue(); + $bank = $objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue(); + $bank_sn = $objPHPExcel->getActiveSheet()->getCell("I" . $j)->getValue(); + $file_check['bank_sn'] = $bank_sn; + $bank_no = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue(); + $cperson_mobile = $objPHPExcel->getActiveSheet()->getCell("K" . $j)->getValue(); + $address = $objPHPExcel->getActiveSheet()->getCell("L" . $j)->getValue(); + $content = $objPHPExcel->getActiveSheet()->getCell("M" . $j)->getValue(); + $market = $objPHPExcel->getActiveSheet()->getCell("N" . $j)->getValue(); + if(empty($c_name)){ + return to_assign(1, '第'.($j - 2).'行的客户联系人姓名没完善'); + } + if(empty($c_mobile)){ + return to_assign(1, '第'.($j - 2).'行的客户联系人手机号码没完善'); + } + $validate_mobile = \think\facade\Validate::rule([ + 'c_mobile' => 'mobile', + ]); + if (!$validate_mobile->check($file_check)) { + return to_assign(1, '第'.($j - 2).'行的客户联系人手机号码格式错误'); + } + if(empty($source_id)){ + return to_assign(1, '第'.($j - 2).'行的客户来源错误'); + } + if(empty($grade_id)){ + return to_assign(1, '第'.($j - 2).'行的客户等级错误'); + } + if(empty($industry_id)){ + return to_assign(1, '第'.($j - 2).'行的所属行业错误'); + } + if(empty($tax_num)){ + $tax_num=''; + } + if(empty($bank)){ + $bank=''; + } + $validate_bank = \think\facade\Validate::rule([ + 'bank_sn' => 'number', + ]); + if(!empty($bank_sn)){ + if (!$validate_bank->check($file_check)) { + return to_assign(1, '第'.($j - 2).'行的银行卡账号格式错误'); + } + } + else{ + $bank_sn=''; + } + if(empty($bank_no)){ + $bank_no=''; + } + if(empty($cperson_mobile)){ + $cperson_mobile=''; + } + if(empty($address)){ + $address=''; + } + if(empty($content)){ + $content=''; + } + if(empty($market)){ + $market=''; + } + $belong_uid = 0; + $belong_did = 0; + if($type != 'sea'){ + $belong_uid = $this->uid; + $belong_did = $this->did; + } + $data[$j - 3] = [ + 'name' => $name, + 'source_id' => $source_id, + 'grade_id' => $grade_id, + 'industry_id' => $industry_id, + 'tax_num' => $tax_num, + 'bank' => $bank, + 'bank_sn' => $bank_sn, + 'bank_no' => $bank_no, + 'cperson_mobile' => $cperson_mobile, + 'address' => $address, + 'content' => $content, + 'market' => $market, + 'admin_id' => $this->uid, + 'belong_uid' => $belong_uid, + 'belong_did' => $belong_did, + 'c_mobile' => $c_mobile, + 'c_name' => $c_name, + 'create_time' => time(), + 'update_time' => time() + ]; + } + //dd($data);exit; + // 批量添加数据 + $count=0; + foreach ($data as $a => $aa) { + $cid = Customer::strict(false)->field(true)->insertGetId($aa); + if($cid>0){ + $contact = [ + 'name' => $aa['c_name'], + 'mobile' => $aa['c_mobile'], + 'sex' => 1, + 'cid' => $cid, + 'is_default' => 1, + 'create_time' => time(), + 'admin_id' => $this->uid + ]; + Db::name('CustomerContact')->strict(false)->field(true)->insert($contact); + $count++; + } + } + return to_assign(0, '共成功导入了'.$count.'条客户数据'); + } catch (\think\exception\ValidateException $e) { + return to_assign(1, $e->getMessage()); + } + } +} diff --git a/app/api/controller/Index.php b/app/api/controller/Index.php new file mode 100644 index 0000000..47e5054 --- /dev/null +++ b/app/api/controller/Index.php @@ -0,0 +1,637 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\api\controller; + +use app\api\BaseController; +use app\api\model\EditLog; +use smsservice\Smsservice; +use think\Image; // 引入Image类 +use think\facade\Db; + +class Index extends BaseController +{ + //上传文件 + public function upload() + { + if (request()->isPost()) { + $param = get_params(); + $sourse = 'file'; + if(isset($param['sourse'])){ + $sourse = $param['sourse']; + } + if($sourse == 'file' || $sourse == 'tinymce'){ + if(request()->file('file')){ + $file = request()->file('file'); + } + else{ + return to_assign(1, '没有选择上传文件'); + } + } + else{ + if (request()->file('editormd-image-file')) { + $file = request()->file('editormd-image-file'); + } else { + return to_assign(1, '没有选择上传文件'); + } + } + // 获取上传文件的hash散列值 + $sha1 = $file->hash('sha1'); + $md5 = $file->hash('md5'); + $rule = [ + 'image' => 'jpg,png,jpeg,gif', + 'doc' => 'txt,doc,docx,ppt,pptx,xls,xlsx,pdf', + 'file' => 'zip,gz,7z,rar,tar', + 'video' => 'mpg,mp4,mpeg,avi,wmv,mov,flv,m4v', + 'audio' => 'mp3,wav,wma,flac,midi', + ]; + $fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file'] . ',' . $rule['video'] . ',' . $rule['audio']; + //1M=1024*1024=1048576字节 + $file_size = get_system_config('system','upload_max_filesize'); + if(!isset($file_size)){ + $file_size=50; + } + $fileSize = $file_size * 1024 * 1024; + if (isset($param['type']) && $param['type']) { + $fileExt = $rule[$param['type']]; + } + if (isset($param['size']) && $param['size']) { + $fileSize = $param['size']; + } + $validate = \think\facade\Validate::rule([ + 'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt, + ]); + $file_check['image'] = $file; + if (!$validate->check($file_check)) { + return to_assign(1, $validate->getError()); + } + // 日期前綴 + $dataPath = date('Ym'); + $use = 'thumb'; + $filename = \think\facade\Filesystem::disk('public')->putFile($dataPath, $file, function () use ($md5) { + return set_salt(5).'_'.$md5; + }); + if ($filename) { + //写入到附件表 + $imagePath = get_config('filesystem.disks.public.url'). '/' . $filename; + $thumbPath = ''; + if(in_array($file->extension(),['jpg','png','jpeg','gif'])){ + // 生成等比缩略图 + $image = Image::open(request()->file('file')); + $thumbPath = dirname($imagePath) . '/thumb_' . basename($imagePath); + // 生成等比缩略图保存到指定位置,这里设置最大宽度为360px, 高度自适应 + $image->thumb(360,360,Image::THUMB_CENTER)->save('./'.$thumbPath); + } + $data = []; + $data['filepath'] = $imagePath; + $data['thumbpath'] = $thumbPath; + $data['name'] = $file->getOriginalName(); + $data['mimetype'] = $file->getOriginalMime(); + $data['fileext'] = $file->extension(); + $data['filesize'] = $file->getSize(); + $data['filename'] = $filename; + $data['sha1'] = $sha1; + $data['md5'] = $md5; + $data['module'] = \think\facade\App::initialize()->http->getName(); + $data['action'] = app('request')->action(); + $data['uploadip'] = app('request')->ip(); + $data['create_time'] = time(); + $data['user_id'] = $this->uid; + if ($data['module'] = 'admin') { + //通过后台上传的文件直接审核通过 + $data['status'] = 1; + $data['admin_id'] = $data['user_id']; + $data['audit_time'] = time(); + } + $data['use'] = request()->has('use') ? request()->param('use') : $use; //附件用处 + $res['id'] = Db::name('file')->insertGetId($data); + $res['filepath'] = $data['filepath']; + $res['name'] = $data['name']; + $res['uid'] = $this->uid; + $res['filename'] = $data['filename']; + $res['filesize'] = $data['filesize']; + $res['fileext'] = $data['fileext']; + add_log('upload', $data['user_id'], $data,'文件'); + if($sourse == 'editormd'){ + //editormd编辑器上传返回 + return json(['success'=>1,'message'=>'上传成功','url'=>$data['filepath']]); + } + else if($sourse == 'tinymce'){ + //tinymce编辑器上传返回 + return json(['success'=>1,'message'=>'上传成功','location'=>$data['filepath']]); + } + else{ + //普通上传返回 + return to_assign(0, '上传成功', $res); + } + } + else { + return to_assign(1, '上传失败,请重试'); + } + } + else{ + return to_assign(1, '非法请求'); + } + } + + //执行分块上传的控制器方法 + public function chunkUpload() { + if ($this->request->isPost()) { + //执行分块上传流程 + $data = $this->request->post(); + //判断是否是分块上传 + if ($data['type'] === 'chunk') { + $file = request()->file('file'); + + $rule = [ + 'image' => 'jpg,png,jpeg,gif', + 'doc' => 'txt,doc,docx,ppt,pptx,xls,xlsx,pdf', + 'file' => 'zip,gz,7z,rar,tar', + 'video' => 'mpg,mp4,mpeg,avi,wmv,mov,flv,m4v', + 'audio' => 'mp3,wav,wma,flac,midi', + ]; + $fileExt = $rule['image'] . ',' . $rule['doc'] . ',' . $rule['file'] . ',' . $rule['video'] . ',' . $rule['audio']; + //1M=1024*1024=1048576字节 + $file_size = get_system_config('system','upload_max_filesize'); + if(!isset($file_size)){ + $file_size=50; + } + $fileSize = $file_size * 1024 * 1024; + $validate = \think\facade\Validate::rule([ + 'image' => 'require|fileSize:' . $fileSize . '|fileExt:' . $fileExt, + ]); + $file_check['image'] = $file; + if (!$validate->check($file_check)) { + return to_assign(1, $validate->getError()); + } + + //获取对应的上传配置 + $fs = \think\facade\Filesystem::disk('public'); + $ext = $file->extension(); + $chunkPath = $data['file_id'].'/'.$file->md5().($ext ? '.'.$ext : ''); + //存储分片文件到指定路径 + $savename = $fs->putFileAs( 'chunk', $file,$chunkPath); + if (!$savename) { + return json([ + 'code' => 1, + 'msg' => '上传失败', + 'data' => [], + ]); + } + if (!$data['is_end']) { + $filepath = ''; + } else { + //合并块文件 + $fileUrl = ''; + $chunkSaveDir = \think\facade\Filesystem::getDiskConfig('public'); + $smallChunkDir = $chunkSaveDir['root'].'/chunk/'.$data['file_id']; + //获取已存储的属于源文件的所有分块文件 进行合并 + if ($handle = opendir($smallChunkDir)) { + $chunkList = []; + $modifyTime = []; + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != "..") { + $temp['path'] = $smallChunkDir.'/'.$file; + $temp['modify'] = filemtime($smallChunkDir.'/'.$file); + $chunkList[] = $temp; + $modifyTime[] = $temp['modify']; + } + } + //对分块文件进行排序 + array_multisort($modifyTime,SORT_ASC,$chunkList); + $saveDir = \think\facade\Filesystem::getDiskConfig('public'); + $saveName = md5($data['file_id'].$data['file_name']).'.'.$data['file_extension']; + $newPath = $saveDir['root'].'/'.date('Ym').'/'.$saveName; + if (!file_exists($saveDir['root'].'/'.date('Ym'))) { + mkdir($saveDir['root'].'/'.date('Ym'),0777,true); + } + $newFileHandle = fopen($newPath,'a+b'); + foreach ($chunkList as $item) { + fwrite($newFileHandle,file_get_contents($item['path'])); + unlink($item['path']); + } + rmdir($smallChunkDir); + //将合并后的文件存储到指定路径 + $fileUrl = $saveDir['url'].'/'.date('Ym').'/'.$saveName; + fclose($newFileHandle); + closedir($handle); + } else { + return json([ + 'code' => 1, + 'msg' => '目录:'.$chunkSaveDir['root'].'/chunk/'.$data['file_id'].'不存在', + 'data' => [], + ]); + } + $filepath = $fileUrl; + } + $res=[]; + //合并流程结束 + if ($filepath!='') { + $fileinfo = []; + $fileinfo['filepath'] = $filepath; + $fileinfo['name'] = $data['file_name']; + $fileinfo['fileext'] = $data['file_extension']; + $fileinfo['filesize'] = $data['file_size']; + $fileinfo['filename'] = date('Ym').'/'.$saveName; + $fileinfo['sha1'] = $data['file_id']; + $fileinfo['md5'] = $data['file_id']; + $fileinfo['module'] = \think\facade\App::initialize()->http->getName(); + $fileinfo['action'] = app('request')->action(); + $fileinfo['uploadip'] = app('request')->ip(); + $fileinfo['create_time'] = time(); + $fileinfo['user_id'] = get_login_admin('id') ? get_login_admin('id') : 0; + if ($fileinfo['module'] = 'admin') { + //通过后台上传的文件直接审核通过 + $fileinfo['status'] = 1; + $fileinfo['admin_id'] = $fileinfo['user_id']; + $fileinfo['audit_time'] = time(); + } + $fileinfo['use'] = 'big'; + $res['id'] = Db::name('file')->insertGetId($fileinfo); + $res['filepath'] = $fileinfo['filepath']; + $res['name'] = $fileinfo['name']; + $res['filename'] = $fileinfo['filename']; + $res['filesize'] = $fileinfo['filesize']; + $res['fileext'] = $fileinfo['fileext']; + add_log('upload', $fileinfo['user_id'], $fileinfo); + } + return to_assign(0, '上传成功', $res); + } + } + else{ + return to_assign(1, '非法请求', $res); + } + } + + //取消上传,删除临时文件 + public function clearChunk() { + if ($this->request->isPost()) { + $param = get_params(); + $saveDir = \think\facade\Filesystem::getDiskConfig('public'); + $smallChunkDir = $saveDir['root'].'/chunk/'.$param['file_id']; + if(!is_dir($smallChunkDir)){ + return to_assign(0, '上传的临时文件已删除'); + } + //获取已存储的属于源文件的所有分块文件 + if ($handle = opendir($smallChunkDir)) { + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != "..") { + $temp['path'] = $smallChunkDir.'/'.$file; + unlink($temp['path']); + } + } + rmdir($smallChunkDir); + closedir($handle); + return to_assign(0, '已取消上传'); + } + } + } + + //附件重命名 + public function file_edit() + { + $param = get_params(); + if (Db::name('File')->where('id',$param['id'])->update(['name'=>$param['title']]) !== false) { + add_log('edit', $param['id'], $param,'文件名称'); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } + + //获取编辑记录 + public function load_log() + { + $param = get_params(); + $log = new EditLog(); + $list = $log->datalist($param); + $total = Db::name('EditLog')->where(['name'=>$param['name'],'action_id'=>$param['action_id']])->count(); + $totalRow['total'] = $total; + return to_assign(0, '', $list,$totalRow); + } + + + //清空缓存 + public function cache_clear() + { + \think\facade\Cache::clear(); + return to_assign(0, '系统缓存已清空'); + } + + // 测试邮件发送 + public function email_test() + { + $sender = get_params('email'); + //检查是否邮箱格式 + if (!is_email($sender)) { + return to_assign(1, '测试邮箱码格式有误'); + } + $email_config = \think\facade\Db::name('config')->where('name', 'email')->find(); + $config = unserialize($email_config['content']); + $content = $config['template']; + //所有项目必须填写 + if (empty($config['smtp']) || empty($config['smtp_port']) || empty($config['smtp_user']) || empty($config['smtp_pwd'])) { + return to_assign(1, '请完善邮件配置信息'); + } + + $send = send_email($sender, '测试邮件', $content); + if ($send) { + return to_assign(0, '邮件发送成功'); + } else { + return to_assign(1, '邮件发送失败'); + } + } + + //测试发送阿里云短信 + public function sms_test() + { + $phoneNumbers = '136xxxxxxxx'; + // $code = rand(1000, 9999); // 示例验证码 + $sms = new Smsservice(); + $result = $sms->sendSms($phoneNumbers, 'SMS_xxxxxx', ['name' => '勾股OA','title'=>'《测试阿里云短信发送成功》']); + if ($result['code'] === 'OK') { + return to_assign(0, '发送成功'); + } else { + return to_assign(1, '发送失败:'.$result['message']); + } + } + + //获取未读消息 + public function get_msg() + { + $msg_map[] = ['to_uid', '=', $this->uid]; + $msg_map[] = ['read_time', '=', 0]; + $msg_map[] = ['delete_time', '=', 0]; + $msg_count = Db::name('Msg')->where($msg_map)->count(); + return to_assign(0, 'ok', $msg_count); + } + + //获取部门 + public function get_department() + { + $department = get_department(); + return to_assign(0, '', $department); + } + + //获取部门树形节点列表,用于tree前端组件 + public function get_department_tree() + { + $department = get_department(); + $list = get_tree($department); + $data['trees'] = $list; + return json($data); + } + + //获取下属部门树形节点列表,用于tree前端组件 + public function get_department_tree_sub() + { + if($this->uid==1){ + $department = get_department(); + } + else{ + $dids = get_leader_departments($this->uid); + $department = Db::name('Department')->order('sort desc,id asc')->where([['status','=',1],['id','in',$dids]])->select()->toArray(); + } + $list = get_tree($department,$department[0]['pid']); + $data['trees'] = $list; + return json($data); + } + + //获取部门树形节点列表,用于X-select前端组件 + public function get_department_select() + { + $keyword = get_params('keyword'); + $selected = []; + if(!empty($keyword)){ + $selected = explode(",",$keyword); + } + $department = get_department(); + $list = get_select_tree($department, 0,0,$selected); + return to_assign(0, '',$list); + } + + //获取所有员工,did>0时时获取部门员工,用于picker签单组件 + public function get_employee($did = 0) + { + $where=[]; + $whereOr=[]; + if (!empty($did)) { + $admin_array = Db::name('DepartmentAdmin')->where('department_id',$did)->column('admin_id'); + $map1=[ + ['a.id','in',$admin_array], + ]; + $map2=[ + ['a.did', '=', $did], + ]; + $whereOr =[$map1,$map2]; + } + $where[] = ['a.id', '>', 1]; + $where[] = ['a.status', '=', 1]; + $where[] = ['a.delete_time', '=', 0]; + $employee = Db::name('admin') + ->field('a.id,a.did,a.position_id,a.mobile,a.name,a.nickname,a.sex,a.status,a.thumb,a.username,d.title as department') + ->alias('a') + ->join('Position p', 'p.id = a.position_id','left') + ->join('Department d', 'a.did = d.id','left') + ->where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->group('a.id') + ->order('a.id desc') + ->select(); + return to_assign(0, '', $employee); + } + + //获取所有下属员工,did>0时时获取部门员工,用于picker签单组件 + public function get_employee_sub($did = 0) + { + $where=[]; + $whereOr=[]; + if (!empty($did)) { + $admin_array = Db::name('DepartmentAdmin')->where('department_id',$did)->column('admin_id'); + $map1=[ + ['a.id','in',$admin_array], + ]; + $map2=[ + ['a.did', '=', $did], + ]; + $whereOr =[$map1,$map2]; + } + else{ + if($this->uid>1){ + $dids = get_leader_departments($this->uid); + $where[] = ['a.did', 'in', $dids]; + } + } + $where[] = ['a.id', '>', 1]; + $where[] = ['a.status', '=', 1]; + $where[] = ['a.delete_time', '=', 0]; + $employee = Db::name('admin') + ->field('a.id,a.did,a.position_id,a.mobile,a.name,a.nickname,a.sex,a.status,a.thumb,a.username,d.title as department') + ->alias('a') + ->join('Position p', 'p.id = a.position_id','left') + ->join('Department d', 'a.did = d.id','left') + ->where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->group('a.id') + ->order('a.id desc') + ->select(); + return to_assign(0, '', $employee); + } + + //获取所有员工 + public function get_personnel() + { + $param = get_params(); + $where[] = ['a.status', '=', 1]; + $where[] = ['a.id', '>', 1]; + $where[] = ['a.delete_time', '=', 0]; + if (!empty($param['keywords'])) { + $where[] = ['a.name', 'like', '%' . $param['keywords'] . '%']; + } + if(!empty($param['ids'])){ + //排除某些员工 + $where[] = ['a.id', 'notin', $param['ids']]; + } + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('admin') + ->field('a.id,a.did,a.position_id,a.mobile,a.name,a.nickname,a.sex,a.status,a.thumb,a.username,d.title as department') + ->alias('a') + ->join('Department d', 'a.did = d.id') + ->where($where) + ->order('a.id desc') + ->paginate(['list_rows'=> $rows]); + return table_assign(0, '', $list); + } + + //获取所有员工,用于X-select前端组件,did>0时时获取部门员工 + public function get_employee_select($did=0) + { + $keyword = get_params('keyword'); + $selected = []; + if(!empty($keyword)){ + $selected = explode(",",$keyword); + } + if($did == 0){ + $employee = Db::name('admin')->field('id as value,name')->where(['status' => 1,'delete_time'=>0])->select()->toArray(); + } + else{ + $employee = get_department_employee($did); + } + $list=[]; + foreach($employee as $k => $v){ + $select = ''; + if(in_array($v['id'],$selected)){ + $select = 'selected'; + } + $list[]=[ + 'value'=>$v['id'], + 'name'=>$v['name'], + 'selected'=>$select + ]; + } + return to_assign(0, '', $list); + } + + + //获取某部门的负责人 + public function get_department_leader($uid=0,$pid=0) + { + $leaders = get_department_leader($uid,$pid); + return to_assign(0, '', $leaders); + } + + //获取职位 + public function get_position() + { + $position = Db::name('Position')->field('id,title')->where([['status', '=', 1], ['id', '>', 1]])->select(); + return to_assign(0, '', $position); + } + + //获取消息模板 + public function get_template() + { + $param = get_params(); + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['status', '=', 1]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('Template')->field('id,title')->where($where)->paginate(['list_rows'=> $rows]);; + return table_assign(0, '', $list); + } + + //读取报销类型 + function get_expense_cate() + { + $cate = get_base_data('ExpenseCate'); + return to_assign(0, '', $cate); + } + + //读取费用类型 + function get_cost_cate() + { + $cate = get_base_data('CostCate'); + return to_assign(0, '', $cate); + } + + //读取印章类型 + function get_seal_cate() + { + $cate = get_base_data('SealCate'); + return to_assign(0, '', $cate); + } + + //读取车辆类型 + function get_car_cate() + { + $cate = get_base_data('CarCate'); + return to_assign(0, '', $cate); + } + + //读取企业主体 + function get_subject() + { + $subject = get_base_data('Subject'); + return to_assign(0, '', $subject); + } + + //读取行业类型 + function get_industry() + { + $industry = get_base_data('Industry'); + return to_assign(0, '', $industry); + } + + //读取服务类型 + function get_services() + { + $services = get_base_data('Services'); + return to_assign(0, '', $services); + } + + //获取工作类型列表 + public function get_work_cate() + { + $cate = get_base_data('WorkCate'); + return to_assign(0, '', $cate); + } +} diff --git a/app/api/controller/Office.php b/app/api/controller/Office.php new file mode 100644 index 0000000..bedc412 --- /dev/null +++ b/app/api/controller/Office.php @@ -0,0 +1,94 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\api\controller; + +use app\api\BaseController; +use think\facade\Db; +use Firebase\JWT\JWT; + + +class Office extends BaseController +{ + public function view($id=0,$mode='edit') + { + $file = Db::name('File')->where('id',$id)->find(); + if(empty($file)){ + return view('../../base/view/common/filetemplate'); + } + $path = $file['filepath']; + $title = $file['name']; + $extension = pathinfo($path, PATHINFO_EXTENSION); + $filename = pathinfo($path, PATHINFO_FILENAME); + $office_config = get_system_config('other'); + $office_config['token'] = 'secret_8JFhzy'; + //$directory = substr($path, 0, 16); + //$key = set_salt(10).str_replace("/", "T", $directory).$filename.'.'.$extension; + $key = "key".$file['audit_time']."T".$id; + $domain = $_SERVER['HTTP_HOST']; + $url = "http://".$domain.$path; + $callbackUrl = "http://".$domain."/office.php"; + $admin = Db::name('Admin')->where('id',$this->uid)->find(); + $config = [ + "document" => [ + "url" => $url, + "key" => $key, + "permissions" => [ + "chat"=> true, + "comment"=> true, + "copy"=> true, + "deleteCommentAuthorOnly"=> false, + "download"=> true, + "edit"=> true, + "editCommentAuthorOnly"=> false, + "fillForms"=> true, + "modifyContentControl"=> true, + "modifyFilter"=> true, + "print"=>true, + "protect"=> true, + "review"=> true + ] + ], + "editorConfig"=>[ + "mode" => $mode,//view,edit + "forcesave"=>true, + "lang"=>"zh-CN", + "createUrl" => '', + "customization"=>[ + "autosave"=>true,//是否自动保存 + "comments"=>false, + "help"=>false + ], + "user" => [ + "id" => $admin['id'], + "name" => $admin['name'] + ], + "callbackUrl"=>$callbackUrl + ] + ]; + $token = JWT::encode($config, $office_config['token'], 'HS256'); //输出Token 默认'HS256' + return View('',['token'=>$token,'key'=>$key,'office'=>$office_config,'mode'=>$mode,'domain'=>$domain,'url'=>$url,'title'=>$title,'callbackUrl'=>$callbackUrl,'admin'=>$admin]); + } + + public function officeapps($id=0,$mode='edit') + { + $file = Db::name('File')->where('id',$id)->find(); + if(empty($file)){ + return view('../../base/view/common/filetemplate'); + } + $path = $file['filepath']; + $domain = $_SERVER['HTTP_HOST']; + $url = "//".$domain.$path; + return View('',['url'=>$url]); + } +} diff --git a/app/api/event.php b/app/api/event.php new file mode 100644 index 0000000..afe5918 --- /dev/null +++ b/app/api/event.php @@ -0,0 +1,8 @@ + [ + //注册监听类 + 'SendMessage' => ['app\listener\SendMessage'], + ], + //'subscribe' => ['app\subscribe\Message'], +]; diff --git a/app/api/middleware.php b/app/api/middleware.php new file mode 100644 index 0000000..dce057f --- /dev/null +++ b/app/api/middleware.php @@ -0,0 +1,8 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\api\middleware; + +use Firebase\JWT\JWT; +use Firebase\JWT\Key; +use think\facade\Request; +use think\Response; + +class Auth +{ + public function handle($request, \Closure $next) + { + $token = Request::header('Token'); + if ($token) { + if (count(explode('.', $token)) != 3) { + return json(['code'=>404,'msg'=>'非法请求']); + } + $config = get_system_config('token'); + //var_dump($config);exit; + try { + JWT::$leeway = 60;//当前时间减去60,把时间留点余地 + $decoded = JWT::decode($token, new Key($config['secrect'], 'HS256')); //HS256方式,这里要和签发的时候对应 + //return (array)$decoded; + $decoded_array = json_decode(json_encode($decoded),TRUE); + $jwt_data = $decoded_array['data']; + //$request->uid = $jwt_data['userid']; + define('JWT_UID', $jwt_data['userid']); + $response = $next($request); + return $response; + //return $next($request); + } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 + return json(['code'=>403,'msg'=>'签名错误']); + }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 + return json(['code'=>401,'msg'=>'token失效']); + }catch(\Firebase\JWT\ExpiredException $e) { // token过期 + return json(['code'=>401,'msg'=>'token已过期']); + }catch(Exception $e) { //其他错误 + return json(['code'=>404,'msg'=>'非法请求']); + }catch(\UnexpectedValueException $e) { //其他错误 + return json(['code'=>404,'msg'=>'非法请求']); + } catch(\DomainException $e) { //其他错误 + return json(['code'=>404,'msg'=>'非法请求']); + } + } else { + return json(['code'=>404,'msg'=>'token不能为空']); + } + return $next($request); + } +} diff --git a/app/api/model/Comment.php b/app/api/model/Comment.php new file mode 100644 index 0000000..3846969 --- /dev/null +++ b/app/api/model/Comment.php @@ -0,0 +1,69 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\api\model; +use think\facade\Db; +use think\Model; + +class Comment extends Model +{ + //列表 + function datalist($param=[],$where=[]) { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) use($param){ + $item['create_times'] = time_trans($item['create_time']); + if($item['update_time']>0){ + $item['update_times'] = ',最后编辑时间:'.time_trans($item['update_time']); + } + else{ + $item['update_times'] = ''; + } + $item['thumb'] = Db::name('Admin')->where(['id' => $item['admin_id']])->value('thumb'); + $item['name'] = Db::name('Admin')->where(['id' => $item['admin_id']])->value('name'); + $to_names = Db::name('Admin')->where([['id', 'in', $item['to_uids']]])->column('name'); + if (empty($to_names)) { + $item['to_names'] = '-'; + } else { + $item['to_names'] = implode(',', $to_names); + } + $item['read'] = 0; + if($item['admin_id'] == $param['admin_id']){ + $item['read'] = 2; + } + else{ + $count = Db::name('CommentRead')->where(['comment_id' => $item['id'],'admin_id' => $param['admin_id']])->count(); + if($count>0){ + $item['read'] = 1; + } + } + if($item['pid']>0){ + $pcomment = Db::name('Comment')->where('id','=',$item['pid'])->find(); + $padmin_id =$pcomment['admin_id']; + $item['padmin'] =Db::name('Admin')->where('id','=',$padmin_id)->value('name'); + $item['ptimes'] =time_trans($pcomment['create_time']); + $item['pcontent'] = $pcomment['content']; + } + return $item; + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } +} diff --git a/app/api/model/EditLog.php b/app/api/model/EditLog.php new file mode 100644 index 0000000..04f3fae --- /dev/null +++ b/app/api/model/EditLog.php @@ -0,0 +1,279 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\api\model; +use think\model; +use think\facade\Db; +class EditLog extends Model +{ + public static $COMPILE = [ + //'title'=>'字段名称','action'=>'操作行为','table'=>'关联数据表','table_field'=>'关联数据表字段','table_more'=>'0单选数据,1多选数据','enumerate'=>[枚举数据],'time'=>'时间格式','suffix'=>'后缀' + 'Customer'=>[ + 'name'=>['title'=>'客户名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'source_id'=>['title'=>'客户来源','action'=>'','table'=>'CustomerSource','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'grade_id'=>['title'=>'客户等级','action'=>'','table'=>'CustomerGrade','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'industry_id'=>['title'=>'所属行业','action'=>'','table'=>'Industry','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'address'=>['title'=>'客户地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'customer_status'=>['title'=>'客户状态','action'=>'','table'=>'BasicCustomer','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'intent_status'=>['title'=>'意向状态','action'=>'','table'=>'BasicCustomer','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'belong_uid'=>['title'=>'所属人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'belong_did'=>['title'=>'所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'share_ids'=>['title'=>'共享人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''], + 'content'=>['title'=>'客户描述','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'market'=>['title'=>'主要经营业务','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'remark'=>['title'=>'备注信息','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'tax_bank'=>['title'=>'开户银行','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'tax_banksn'=>['title'=>'银行帐号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'tax_num'=>['title'=>'纳税人识别号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'tax_mobile'=>['title'=>'开票电话','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'tax_address'=>['title'=>'开票地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'is_lock'=>['title'=>'锁定状态','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未锁','已锁'],'time'=>'','suffix'=>''] + ], + 'Contract'=>[ + 'pid'=>['title'=>'母协议','action'=>'','table'=>'Contract','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'name'=>['title'=>'合同名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'code'=>['title'=>'合同编号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'cate_id'=>['title'=>'合同类别','action'=>'','table'=>'ContractCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'subject_id'=>['title'=>'签约主体','action'=>'','table'=>'Enterprise','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'customer_id'=>['title'=>'签约客户','action'=>'','table'=>'Customer','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'contact_name'=>['title'=>'客户代表','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'contact_mobile'=>['title'=>'客户电话','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'contact_address'=>['title'=>'客户地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'prepared_uid'=>['title'=>'合同制定人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'sign_uid'=>['title'=>'合同签订人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'keeper_uid'=>['title'=>'合同保管人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'share_ids'=>['title'=>'共享人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''], + 'did'=>['title'=>'合同所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + // 'content'=>['title'=>'合同内容','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'remark'=>['title'=>'备注信息','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'types'=>['title'=>'合同性质','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','普通合同','商品合同','服务合同'],'time'=>'','suffix'=>''], + 'start_time'=>['title'=>'合同生效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'end_time'=>['title'=>'合同失效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'sign_time'=>['title'=>'合同签订时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'cost'=>['title'=>'合同金额','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'tax'=>['title'=>'税点','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'is_tax'=>['title'=>'是否含税','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未含税','含税'],'time'=>'','suffix'=>''] + ], + 'Purchase'=>[ + 'pid'=>['title'=>'母协议','action'=>'','table'=>'Contract','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'name'=>['title'=>'合同名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'code'=>['title'=>'合同编号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'cate_id'=>['title'=>'合同类别','action'=>'','table'=>'ContractCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'subject_id'=>['title'=>'签约主体','action'=>'','table'=>'Enterprise','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'supplier_id'=>['title'=>'签约供应商','action'=>'','table'=>'Supplier','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'contact_name'=>['title'=>'供应商代表','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'contact_mobile'=>['title'=>'供应商电话','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'contact_address'=>['title'=>'供应商地址','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'prepared_uid'=>['title'=>'合同制定人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'sign_uid'=>['title'=>'合同签订人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'keeper_uid'=>['title'=>'合同保管人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'share_ids'=>['title'=>'共享人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''], + 'did'=>['title'=>'合同所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + //'content'=>['title'=>'合同内容','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'remark'=>['title'=>'备注信息','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'types'=>['title'=>'合同性质','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','普通采购','物品合同','服务采购'],'time'=>'','suffix'=>''], + 'start_time'=>['title'=>'合同生效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'end_time'=>['title'=>'合同失效时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'sign_time'=>['title'=>'合同签订时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'cost'=>['title'=>'合同金额','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'tax'=>['title'=>'税点','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'is_tax'=>['title'=>'是否含税','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未含税','含税'],'time'=>'','suffix'=>''] + ], + 'Project'=>[ + 'name'=>['title'=>'项目名称','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'code'=>['title'=>'项目编号','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'cate_id'=>['title'=>'项目类别','action'=>'','table'=>'ProjectCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'customer_id'=>['title'=>'关联客户','action'=>'','table'=>'Customer','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'contract_id'=>['title'=>'关联合同','action'=>'','table'=>'Contract','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'director_uid'=>['title'=>'项目经理','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'did'=>['title'=>'项目所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'content'=>['title'=>'项目描述','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'start_time'=>['title'=>'项目开始时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'end_time'=>['title'=>'项目结束时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'amount'=>['title'=>'项目金额','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'status'=>['title'=>'项目状态','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','未开始','进行中','已完成','已关闭'],'time'=>'','suffix'=>''] + ], + 'Task'=>[ + 'title'=>['title'=>'任务主题','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'pid'=>['title'=>'父级任务','action'=>'','table'=>'ProjectTask','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'before_task'=>['title'=>'前置任务','action'=>'','table'=>'ProjectTask','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'project_id'=>['title'=>'关联项目','action'=>'','table'=>'Project','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'work_id'=>['title'=>'工作类型','action'=>'','table'=>'WorkCate','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'step_id'=>['title'=>'项目阶段','action'=>'','table'=>'ProjectStep','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'director_uid'=>['title'=>'负责人','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'did'=>['title'=>'任务所属部门','action'=>'','table'=>'Department','table_field'=>'title','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'assist_admin_ids'=>['title'=>'协助人员','action'=>'','table'=>'Admin','table_field'=>'name','table_more'=>'1','enumerate'=>[],'time'=>'','suffix'=>''], + 'start_time'=>['title'=>'项目开始时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'end_time'=>['title'=>'预计结束时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'over_time'=>['title'=>'实际结束时间','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'Y-m-d','suffix'=>''], + 'plan_hours'=>['title'=>'预估工时','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>''], + 'done_ratio'=>['title'=>'完成进度','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>[],'time'=>'','suffix'=>'%'], + 'priority'=>['title'=>'优先级','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','低','中','高','紧急'],'time'=>'','suffix'=>''], + 'status'=>['title'=>'任务状态','action'=>'','table'=>'','table_field'=>'','table_more'=>'0','enumerate'=>['未设置','待办的','进行中','已完成','已拒绝','已关闭'],'time'=>'','suffix'=>''] + ] + ]; + + + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[]) + { + $page = empty($param['page']) ?1 : intval($param['page']);; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $name=$param['name']; + $action_id=$param['action_id']; + try { + $list = self::field('a.*, u.name as admin_name,u.thumb') + ->where(['a.name'=>$name,'a.action_id'=>$action_id]) + ->alias('a') + ->join('Admin u','u.id = a.admin_id') + ->order('a.create_time desc') + ->page($page, $rows) + ->select()->toArray(); + + $field = self::$COMPILE[$name]; + foreach ($list as $k => &$v) { + $v['action'] = '修改'; + $v['times'] = time_trans($v['create_time']); + $v['create_time'] = to_date($v['create_time']); + if($v['field'] == 'new'){ + continue; + } + $item = $field[$v['field']]; + if(isset($item)){ + $v['field_name'] = $item['title']; + if(!empty($item['action'])){ + $v['action'] = $item['action']; + } + if(!empty($item['table']) && !empty($item['table_field'])){ + if(empty($item['table_more'])){ + $v['old_content'] = Db::name($item['table'])->where('id',$v['old_content'])->value($item['table_field']); + $v['new_content'] = Db::name($item['table'])->where('id',$v['new_content'])->value($item['table_field']); + }else{ + $old_content = Db::name($item['table'])->where('id','in',$v['old_content'])->column($item['table_field']); + $new_content = Db::name($item['table'])->where('id','in',$v['new_content'])->column($item['table_field']); + if(!empty($old_content)){ + $v['old_content'] = implode(',',$old_content); + } + if(!empty($new_content)){ + $v['new_content'] = implode(',',$new_content); + } + } + } + if(!empty($item['enumerate'])){ + $v['old_content'] = $item['enumerate'][$v['old_content']]; + $v['new_content'] = $item['enumerate'][$v['new_content']]; + } + if(!empty($item['time'])){ + $v['old_content'] = to_date($v['old_content'],$item['time']); + $v['new_content'] = to_date($v['new_content'],$item['time']); + } + if ($v['old_content'] == '' || $v['old_content'] == 0 || $v['old_content'] == null) { + $v['old_content'] = '未设置'; + } + else{ + $v['old_content'] = $v['old_content'].$item['suffix']; + } + if ($v['new_content'] == '' || $v['new_content'] == 0 || $v['new_content'] == null) { + $v['new_content'] = '未设置'; + } + else{ + $v['new_content'] = $v['new_content'].$item['suffix']; + } + } + } + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 插入创建日志 + */ + public function add($name,$action_id) + { + try { + $session_admin = get_config('app.session_admin'); + $uid = \think\facade\Session::get($session_admin); + $log_data = [ + 'name' => $name, + 'admin_id' => $uid, + 'field' => 'new', + 'action_id' => $action_id, + 'create_time' => time() + ]; + self::strict(false)->field(true)->insert($log_data); + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + /** + * 插入编辑日志 + */ + public function edit($name,$action_id,$new,$old) + { + $log_data = []; + $array = self::$COMPILE[$name]; + $key_array = array_keys($array);; + if(!empty($key_array)){ + try { + $session_admin = get_config('app.session_admin'); + $uid = \think\facade\Session::get($session_admin); + foreach ($new as $key => $value) { + if (in_array($key, $key_array)) { + if(isset($old[$key]) && ($old[$key]!=$value)){ + $log_data[] = array( + 'name' => $name, + 'admin_id' => $uid, + 'field' => $key, + 'action_id' => $new['id'], + 'old_content' => $old[$key], + 'new_content' => $value, + 'create_time' => time(), + ); + } + } + } + self::strict(false)->field(true)->insertAll($log_data); + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + } + + /** + * 插入删除日志 + */ + public function del($name,$action_id) + { + try { + $session_admin = get_config('app.session_admin'); + $uid = \think\facade\Session::get($session_admin); + $log_data = [ + 'name' => $name, + 'admin_id' => $uid, + 'field' => 'delete', + 'action_id' => $action_id, + 'create_time' => time() + ]; + self::strict(false)->field(true)->insert($log_data); + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } +} + diff --git a/app/api/view/export/contract.html b/app/api/view/export/contract.html new file mode 100644 index 0000000..e6c0cb8 --- /dev/null +++ b/app/api/view/export/contract.html @@ -0,0 +1,159 @@ + + + + + + 导出PDF + + + +

销售合同审批单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.types" value="2"} + + + + + + + {/eq} + {eq name="$detail.types" value="3"} + + + + + + + {/eq} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
合同名称{$detail.name}合同编号{$detail.code}
签约主体
(乙方)
{$detail.subject_title}合同始止日期{$detail.start_time} 至 {$detail.end_time}
客户名称
(甲方)
{$detail.customer}签约客户代表{$detail.contact_name}
客户联系地址{$detail.contact_address|default='-'}客户联系电话{$detail.contact_mobile|default='-'}
合同金额{$detail.cost} 元合同性质{$detail.types_name}合同类别{$detail.cate_title}
合同签订人{$detail.sign_name}合同所属部门{$detail.sign_department}合同签订日期{$detail.sign_time}
合同制定人{$detail.prepared_name|default='-'}合同保管人{$detail.keeper_name|default='-'}合同共享人员{$detail.share_names|default='-'}
产品信息
+ + + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + + {/volist} + {/empty} +
产品名称单位规格销售单价(元)数量小计(元)备注信息
暂无产品信息
{$vo.product_title|default=''}{$vo.product_unit|default=''}{$vo.product_specs|default=''}{$vo.product_price|default='0.00'}{$vo.product_num|default='1'}{$vo.product_subtotal|default='0.00'}{$vo.product_remark|default=''}
+
服务信息
+ + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + {/volist} + {/empty} +
服务名称服务周期服务单价(元)服务次数小计(元)备注信息
暂无服务信息
{$vo.service_title|default=''}{$vo.service_date|default=''}{$vo.service_price|default='0.00'}{$vo.service_num|default='1'}{$vo.service_subtotal|default='0.00'}{$vo.service_remark|default=''}
+
备注信息{$detail.remark|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/department_change.html b/app/api/view/export/department_change.html new file mode 100644 index 0000000..c2ef090 --- /dev/null +++ b/app/api/view/export/department_change.html @@ -0,0 +1,47 @@ + + + + + + 导出PDF + + + +

人事调动审批单

+ + + + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
调动员工{$detail.name|default='-'}调出部门{$detail.from_department|default='-'}
调动日期{$detail.move_time}调入部门{$detail.to_department|default='-'}
调动原因{:nl2br($detail.remark)}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/expense.html b/app/api/view/export/expense.html new file mode 100644 index 0000000..b676a8f --- /dev/null +++ b/app/api/view/export/expense.html @@ -0,0 +1,82 @@ + + + + + + 导出PDF + + + +

报销审批单

+ + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.project_id"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
凭证编号{$detail.code}入账月份{$detail.income_month_str}原始单据日期{$detail.expense_time}
报销主体{$detail.subject_name|default='-'}
报销员工{$detail.admin_name}报销部门{$detail.department}报销总费用{$detail.cost} 元
关联项目{$detail.ptname|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ + + + + + + + + + {volist name="$detail.list" id="vo"} + + + + + + {/volist} + + + + + + + + +
报销选项
报销金额(元)报销项目备注信息
{$vo.amount}{$vo.cate_title}{$vo.remarks}
报销金额合计(小写){$detail.cost}
报销金额合计(大写){:cny($detail.cost)}
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/files.html b/app/api/view/export/files.html new file mode 100644 index 0000000..6cdab43 --- /dev/null +++ b/app/api/view/export/files.html @@ -0,0 +1,313 @@ + + + + + + 导出PDF + + + +

{$detail.name}档案信息

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$edu"} + + + + + + + {/notempty} + {notempty name="$work"} + + + + + + + {/notempty} + {notempty name="$certificate"} + + + + + + + {/notempty} + {notempty name="$certificate"} + + + + + + + {/notempty} + {notempty name="$language"} + + + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
基本信息
员工姓名{$detail.name}员工性别 + {eq name="$detail.sex" value="1"}男{/eq} + {eq name="$detail.sex" value="2"}女{/eq} + + +
手机号码{$detail.mobile}电子邮箱{$detail.email}
出生日期{$detail.birthday}身份证号码{$detail.idcard}
政治面貌 + {eq name="$detail.political" value="0"}无{/eq} + {eq name="$detail.political" value="1"}中共党员{/eq} + {eq name="$detail.political" value="2"}团员{/eq} + 婚姻状况 + {eq name="$detail.marital_status" value="1"}未婚{/eq} + {eq name="$detail.marital_status" value="2"}已婚{/eq} +
民族{$detail.nation}籍贯{$detail.native_place}
最高学位{$detail.education}毕业院校{$detail.graduate_school}
专业{$detail.speciality}毕业日期{$detail.graduate_day}参加工作时间{$detail.work_date}
户口性质 + {eq name="$detail.resident_type" value="1"}农村户口{/eq} + {eq name="$detail.resident_type" value="2"}城镇户口{/eq} + 户口所在地{$detail.resident_place}
家庭住址{$detail.home_address}
紧急联系人{$detail.contact},{$detail.contact_mobile}现住地址{$detail.current_address}
员工简介 + {$detail.desc|default=''} +
入职信息
所在部门{$detail.department}上级主管{$detail.pname|default='无'}岗位{$detail.position}
入职日期{$detail.entry_time|date='Y-m-d'}职级 + {volist name=":get_base_type_data('basic_user',2)" id="v"} + {eq name="$detail.position_rank" value="$v.id"}{$v.title}{/eq} + {/volist} + 职级 + {volist name=":get_base_type_data('basic_user',2)" id="v"} + {eq name="$detail.position_rank" value="$v.id"}{$v.title}{/eq} + {/volist} +
员工类型 + {eq name="$detail.type" value="3"}实习{/eq} + {eq name="$detail.type" value="2"}试用{/eq} + {eq name="$detail.type" value="1"}正式{/eq} + , + {eq name="$detail.is_staff" value="1"}企业员工{/eq} + {eq name="$detail.is_staff" value="2"}劳动派遣{/eq} + {eq name="$detail.is_staff" value="3"}兼职人员{/eq} + 员工工号{$detail.job_number}社保号{$detail.social_account}
工资卡开户行{$detail.bank_info}工资卡帐号{$detail.bank_account}公积金号{$detail.provident_account}
教育经历
+ + + + + + + + + + {volist name="$edu" id="v"} + + + + + + + + + {/volist} +
开始时间结束时间就读院校学习专业所获学历备注说明
{$v.start_time}{$v.end_time}{$v.title}{$v.speciality}{$v.education}{$v.remark}
+
工作经历
+ + + + + + + + + {volist name="$work" id="v"} + + + + + + + + {/volist} +
开始时间结束时间公司名称职位备注说明
{$v.start_time}{$v.end_time|default='至今'}{$v.title}{$v.position}{$v.remark}
+
相关证书
+ + + + + + + + {volist name="$certificate" id="v"} + + + + + + + {/volist} +
证书名称获得时间颁发机构备注说明
{$v.title}{$v.start_time}{$v.authority}{$v.remark}
+
计算机技能
+ + + + + + + {volist name="$skills" id="v"} + + + + + + {/volist} +
技能名称熟悉程度备注说明
{$v.title} + {eq name="$v.know" value="1"}熟练{/eq} + {eq name="$v.know" value="2"}良好{/eq} + {eq name="$v.know" value="3"}一般{/eq} + {eq name="$v.know" value="4"}较差{/eq} + {$v.remark}
+
语言能力
+ + + + + + + {volist name="$language" id="v"} + + + + + + {/volist} +
语言名称熟悉程度备注说明
{$v.title} + {eq name="$v.know" value="1"}熟练{/eq} + {eq name="$v.know" value="2"}良好{/eq} + {eq name="$v.know" value="3"}一般{/eq} + {eq name="$v.know" value="4"}较差{/eq} + {$v.remark}
+
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ + + + + +
导出人员:{$detail.pdf_admin}导出时间:{$detail.pdf_time}
+ + \ No newline at end of file diff --git a/app/api/view/export/invoice.html b/app/api/view/export/invoice.html new file mode 100644 index 0000000..272585c --- /dev/null +++ b/app/api/view/export/invoice.html @@ -0,0 +1,88 @@ + + + + + + 导出PDF + + + +

发票开票审批单

+ + + + + + + + + + + + + + + + + + {eq name="$detail.types" value="1"} + + + + + + + + + + + + + + + {/eq} + {notempty name="$detail.contract_id"} + + + + + {/notempty} + {notempty name="$detail.project_id"} + + + + + {/notempty} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
开票金额{$detail.amount} 元开票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} + 开票主体{$detail.subject}
抬头类型 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 开票抬头{$detail.invoice_title}电话号码{$detail.invoice_phone}
纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
关联合同{$detail.contract_name|default='-'}
关联项目{$detail.project_name|default='-'}
备注信息{$detail.remark|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/invoicea.html b/app/api/view/export/invoicea.html new file mode 100644 index 0000000..0d46975 --- /dev/null +++ b/app/api/view/export/invoicea.html @@ -0,0 +1,66 @@ + + + + + + 导出PDF + + + +

无发票回款审批单

+ + + + + + + + + + + + + + + + {notempty name="$detail.contract_id"} + + + + + {/notempty} + {notempty name="$detail.project_id"} + + + + + {/notempty} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
预回款金额{$detail.amount} 元收款主体{$detail.subject}
付款主体 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 付款方名称{$detail.invoice_title}纳税人识别号{$detail.invoice_tax}
关联合同{$detail.contract_name|default='-'}
关联项目{$detail.project_name|default='-'}
备注信息{$detail.remark|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/leaves.html b/app/api/view/export/leaves.html new file mode 100644 index 0000000..99018b0 --- /dev/null +++ b/app/api/view/export/leaves.html @@ -0,0 +1,47 @@ + + + + + + 导出PDF + + + +

请假审批单

+ + + + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
开始时间{$detail.start_date}结束时间{$detail.end_date}
请假类型{$detail.types_name}请假天数共{$detail.duration|default=0}天
请假事由{$detail.reason|default=''}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/loan.html b/app/api/view/export/loan.html new file mode 100644 index 0000000..cbb21dc --- /dev/null +++ b/app/api/view/export/loan.html @@ -0,0 +1,58 @@ + + + + + + 导出PDF + + + +

借支审批单

+ + + + + + + + + + + + + + + + + + + + {notempty name="$detail.project_id"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
借支主题{$detail.title}借支企业主体{$detail.subject_name|default='-'}
借支类型 + {eq name="$detail.types" value="1"}日常备用金{/eq} + {eq name="$detail.types" value="2"}项目预支款{/eq} + 借支编号{$detail.code}
借支金额{$detail.cost} 元预计归还日期{$detail.plan_time|date='Y-m-d'}
关联项目{$detail.ptname|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/meeting.html b/app/api/view/export/meeting.html new file mode 100644 index 0000000..393e656 --- /dev/null +++ b/app/api/view/export/meeting.html @@ -0,0 +1,66 @@ + + + + + + 导出PDF + + + +

会议纪要

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
会议时间{$detail.meeting_date|date='Y-m-d H:i'}主办部门{$detail.did_name}
主持人{$detail.anchor_name}记录人{$detail.recorder_name}
会议室{$detail.room}
参会人员{$detail.join_names}
会议主题{$detail.title}
会议内容{:nl2br($detail.content)}
下一步
工作计划
{:nl2br($detail.plans)}
参会人员签字{$detail.sign_names}
备注信息{:nl2br($detail.remarks)}
+ + + + + +
导出人员:{$detail.pdf_admin}导出时间:{$detail.pdf_time}
+ + \ No newline at end of file diff --git a/app/api/view/export/meeting_order.html b/app/api/view/export/meeting_order.html new file mode 100644 index 0000000..9e8078a --- /dev/null +++ b/app/api/view/export/meeting_order.html @@ -0,0 +1,49 @@ + + + + + + 导出PDF + + + +

会议室预定

+ + + + + + + + + + + + + + + + + + + + + + + + + +
会议主题{$detail.title|default=''}会议地点{$detail.room|default=''}
开始时间{$detail.start_time|default=''}结束时间{$detail.end_time|default=''}
会议人数{$detail.num}
会议需求 + {volist name="$detail.requirements_array" id="v"} + {eq name="$v.checked" value="1" }{$v.title}{/eq} + {/volist} +
其他要求{$detail.remark|default=''}
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/official_docs.html b/app/api/view/export/official_docs.html new file mode 100644 index 0000000..3ab13ff --- /dev/null +++ b/app/api/view/export/official_docs.html @@ -0,0 +1,67 @@ + + + + + + 导出PDF + + + +

公文审批单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
公文名称{$detail.title|default='-'}公文文号{$detail.code|default='-'}
拟稿人{$detail.draft_name}拟稿部门{$detail.draft_dame|default='-'}拟稿日期{$detail.draft_time|date='Y-m-d'}
主送人员{$detail.send_names}抄送人员{$detail.copy_names|default='-'}
共享可查阅人{$detail.share_names|default='-'}密级程度 + {eq name="$detail.secrets" value="1"}公开{/eq} + {eq name="$detail.secrets" value="2"}秘密{/eq} + {eq name="$detail.secrets" value="3"}机密{/eq} + 紧急程度 + {eq name="$detail.urgency" value="1"}普通{/eq} + {eq name="$detail.urgency" value="2"}紧急{/eq} + {eq name="$detail.urgency" value="3"}加急{/eq} +
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/outs.html b/app/api/view/export/outs.html new file mode 100644 index 0000000..e2cc422 --- /dev/null +++ b/app/api/view/export/outs.html @@ -0,0 +1,45 @@ + + + + + + 导出PDF + + + +

外出审批单

+ + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
开始时间{$detail.start_date}结束时间{$detail.end_date}
外出天数共{$detail.duration|default=0}天
外出事由{$detail.reason|default=''}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/overtimes.html b/app/api/view/export/overtimes.html new file mode 100644 index 0000000..202da66 --- /dev/null +++ b/app/api/view/export/overtimes.html @@ -0,0 +1,45 @@ + + + + + + 导出PDF + + + +

加班审批单

+ + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
开始时间{$detail.start_date}结束时间{$detail.end_date}
加班时长共{$detail.duration|default=0}小时
加班事由{$detail.reason|default=''}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/pdf_check.html b/app/api/view/export/pdf_check.html new file mode 100644 index 0000000..9070300 --- /dev/null +++ b/app/api/view/export/pdf_check.html @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.check_record_array"} + {volist name="$detail.check_record_array" id="vo"} + + + + + + + {/volist} + {else/} + + + + {/notempty} +
审批信息
申请人{$detail.admin_name} ({$detail.department})申请时间{$detail.create_time|date='Y-m-d H:i:s'}
审核状态{$detail.check_status_str}抄送人{$detail.check_copy_names|default='-'}
审批记录
审批节点审批时间处理人审批意见
{$vo.status_str}{$vo.check_time_str}{$vo.name}{$vo.content}
暂无审批记录
+ + + + + +
导出人员:{$detail.pdf_admin}导出时间:{$detail.pdf_time}
\ No newline at end of file diff --git a/app/api/view/export/personal_quit.html b/app/api/view/export/personal_quit.html new file mode 100644 index 0000000..9f1cb95 --- /dev/null +++ b/app/api/view/export/personal_quit.html @@ -0,0 +1,53 @@ + + + + + + 导出PDF + + + +

离职审批单

+ + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
离职员工{$detail.name|default='-'}所在部门{$detail.department|default='-'}
离职日期{$detail.quit_time}上级领导{$detail.lead_admin_name|default='-'}
资料接受人{$detail.connect_name|default='-'}参与交接人员{$detail.connect_names|default='-'}
离职原因{:nl2br($detail.remark)}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/purchase.html b/app/api/view/export/purchase.html new file mode 100644 index 0000000..1a70e0d --- /dev/null +++ b/app/api/view/export/purchase.html @@ -0,0 +1,159 @@ + + + + + + 导出PDF + + + +

采购合同审批单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.types" value="2"} + + + + + + + {/eq} + {eq name="$detail.types" value="3"} + + + + + + + {/eq} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
合同名称{$detail.name}合同编号{$detail.code}
签约主体
(甲方)
{$detail.subject_title}合同始止日期{$detail.start_time} 至 {$detail.end_time}
供应商名称
(乙方)
{$detail.supplier}供应商代表{$detail.contact_name}
供应商地址{$detail.contact_address|default='-'}供应商电话{$detail.contact_mobile|default='-'}
合同金额{$detail.cost} 元合同性质{$detail.types_name}合同类别{$detail.cate_title}
合同签订人{$detail.sign_name}合同所属部门{$detail.sign_department}合同签订日期{$detail.sign_time}
合同制定人{$detail.prepared_name|default='-'}合同保管人{$detail.keeper_name|default='-'}合同共享人员{$detail.share_names|default='-'}
产品信息
+ + + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + + {/volist} + {/empty} +
物品名称单位规格采购单价(元)数量小计(元)备注信息
暂无物品信息
{$vo.purchased_title|default=''}{$vo.purchased_unit|default=''}{$vo.purchased_specs|default=''}{$vo.purchased_price|default='0.00'}{$vo.purchased_num|default='1'}{$vo.purchased_subtotal|default='0.00'}{$vo.purchased_remark|default=''}
+
服务信息
+ + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + {/volist} + {/empty} +
服务名称服务周期服务单价(元)服务次数小计(元)备注信息
暂无服务信息
{$vo.service_title|default=''}{$vo.service_date|default=''}{$vo.service_price|default='0.00'}{$vo.service_num|default='1'}{$vo.service_subtotal|default='0.00'}{$vo.service_remark|default=''}
+
备注信息{$detail.remark|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/seal.html b/app/api/view/export/seal.html new file mode 100644 index 0000000..a375b8f --- /dev/null +++ b/app/api/view/export/seal.html @@ -0,0 +1,66 @@ + + + + + + 导出PDF + + + +

用章使用审批单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="detail.check_status" value="2"} + + + + + {/eq} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
审批主题{$detail.title|default='-'}印章类型{$detail.seal_cate|default='-'}
盖章次数{$detail.num}用印部门{$detail.use_dname|default='-'}预期用印日期{$detail.use_time|date='Y-m-d'}
印章是否外借 + {eq name="$detail.is_borrow" value="0"}否{/eq} + {eq name="$detail.is_borrow" value="1"}是{/eq} + 印章借用日期{$detail.start_time|default='-'}结束借用日期{$detail.end_time|default='-'}
盖章内容{:nl2br($detail.content)}
用章状态{$detail.status_str}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/talent.html b/app/api/view/export/talent.html new file mode 100644 index 0000000..dcbb825 --- /dev/null +++ b/app/api/view/export/talent.html @@ -0,0 +1,136 @@ + + + + + + 导出PDF + + + +

入职审批单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
基本信息
员工姓名{$detail.name|default='-'}性别 + {eq name="$detail.sex" value="1"}男{/eq} + {eq name="$detail.sex" value="2"}女{/eq} + + +
手机号码{$detail.mobile|default=''}电子邮箱{$detail.email|default='-'}
出生日期{$detail.birthday|default='-'}身份证号码{$detail.idcard|default='-'}
民族{$detail.nation|default='-'}籍贯{$detail.native_place|default='-'}
政治面貌 + {eq name="$detail.political" value="0"}无{/eq} + {eq name="$detail.political" value="1"}中共党员{/eq} + {eq name="$detail.political" value="2"}共青团员{/eq} + 婚姻状况 + {eq name="$detail.marital_status" value="1"}未婚{/eq} + {eq name="$detail.marital_status" value="2"}已婚{/eq} +
户口性质 + {eq name="$detail.resident_type" value="1"}农村户口{/eq} + {eq name="$detail.resident_type" value="2"}城镇户口{/eq} + 户口所在地{$detail.resident_place|default='-'}
家庭住址{$detail.home_address|default='-'}紧急联系人{$detail.contact|default='-'}
现住地址{$detail.current_address|default='-'}紧急联系电话{$detail.contact_mobile|default='-'}
个人简介{$detail.desc|default='-'}
教育信息
毕业院校{$detail.graduate_school|default='-'}毕业日期{$detail.graduate_day|default='-'}
专业{$detail.speciality|default='-'}最高学位{$detail.education|default='-'}
入职信息
入职部门{$detail.department|default='-'}上级主管{$detail.pname|default='-'}入职时间{$detail.entry_time|default='-'}
岗位职称{$detail.position|default='-'}职务{$detail.position_name_str|default='-'}职级{$detail.position_rank_str|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/ticket.html b/app/api/view/export/ticket.html new file mode 100644 index 0000000..39e632e --- /dev/null +++ b/app/api/view/export/ticket.html @@ -0,0 +1,71 @@ + + + + + + 导出PDF + + + +

收票审批单

+ + + + + + + + + + + + + + + + + + + + {notempty name="$detail.purchase_id"} + + + + + {/notempty} + {notempty name="$detail.project_id"} + + + + + {/notempty} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
发票金额{$detail.amount} 元发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} +
发票抬头{$detail.subject}开票主体{$detail.supplier_name}
发票号码{$detail.code}发票日期{$detail.open_time}
关联合同{$detail.purchase_name|default='-'}
关联项目{$detail.project_name|default='-'}
备注信息{$detail.remark|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/ticketa.html b/app/api/view/export/ticketa.html new file mode 100644 index 0000000..e3ccd86 --- /dev/null +++ b/app/api/view/export/ticketa.html @@ -0,0 +1,59 @@ + + + + + + 导出PDF + + + +

无发票付款审批单

+ + + + + + + + + + + + {notempty name="$detail.purchase_id"} + + + + + {/notempty} + {notempty name="$detail.project_id"} + + + + + {/notempty} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_array"} + + + + + {/notempty} +
预付款金额{$detail.amount} 元付款方{$detail.subject}
收款方{$detail.supplier_name}
关联合同{$detail.purchase_name|default='-'}
关联项目{$detail.project_name|default='-'}
备注信息{$detail.remark|default='-'}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/export/trips.html b/app/api/view/export/trips.html new file mode 100644 index 0000000..6b5a6fb --- /dev/null +++ b/app/api/view/export/trips.html @@ -0,0 +1,45 @@ + + + + + + 导出PDF + + + +

出差审批单

+ + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
开始时间{$detail.start_date}结束时间{$detail.end_date}
出差天数共{$detail.duration|default=0}天
出差事由{$detail.reason|default=''}
相关附件 + {volist name="$detail.file_array" id="vo"} +
{$i}、{$vo.name}
+ {/volist} +
+ {include file="export/pdf_check" /} + + \ No newline at end of file diff --git a/app/api/view/office/officeapps.html b/app/api/view/office/officeapps.html new file mode 100644 index 0000000..3f8db87 --- /dev/null +++ b/app/api/view/office/officeapps.html @@ -0,0 +1,14 @@ + + + + + + + + + 文档信息 + + + + + \ No newline at end of file diff --git a/app/api/view/office/view.html b/app/api/view/office/view.html new file mode 100644 index 0000000..91ad1ab --- /dev/null +++ b/app/api/view/office/view.html @@ -0,0 +1,72 @@ + + + + + + + + + 文档信息 + + + +
+ + + \ No newline at end of file diff --git a/app/base/BaseController.php b/app/base/BaseController.php new file mode 100644 index 0000000..b6d04a0 --- /dev/null +++ b/app/base/BaseController.php @@ -0,0 +1,158 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\base; + +use think\facade\Cache; +use think\facade\Db; +use think\facade\Request; +use think\facade\Session; +use think\facade\View; +use systematic\Systematic; + +/** + * 控制器基础类 + */ +abstract class BaseController +{ + /** + * 是否批量验证 + * @var bool + */ + protected $batchValidate = false; + + /** + * 分页数量 + * @var string + */ + protected $pageSize = 20; + /** + * 控制器中间件 + * @var array + */ + protected $middleware = []; + protected $module; + protected $controller; + protected $action; + protected $uid; + protected $did; + protected $pid; + /** + * 构造方法 + * @access public + * @param App $app 应用对象 + */ + protected $model; + public function __construct() + { + $this->module = strtolower(app('http')->getName()); + $this->controller = strtolower(Request::controller()); + $this->action = strtolower(Request::action()); + $this->uid = 0; + $this->did = 0; + $this->pid = 0; + // 控制器初始化 + $this->initialize(); + } + // 初始化 + protected function initialize() + { + // 检测权限 + $this->checkLogin(); + //每页显示数据量 + $this->pageSize = Request::param('limit', \think\facade\Config::get('app.page_size')); + } + + /** + *验证用户登录 + */ + protected function checkLogin() + { + if ($this->controller !== 'login' && $this->controller !== 'captcha') { + $session_admin = get_config('app.session_admin'); + if (!Session::has($session_admin)) { + if (request()->isAjax()) { + return to_assign(404, '请先登录'); + } else { + redirect('/home/login/index.html')->send(); + exit; + } + } else { + $this->uid = Session::get($session_admin); + $login_admin = get_admin($this->uid); + $this->did = $login_admin['did']; + $this->pid = $login_admin['pid']; + $is_lock = $login_admin['is_lock']; + $last_login_time = Db::name('Admin')->where(['id' => $this->uid])->value('last_login_time'); + $timeDiff = time() - $last_login_time; + // 如果超过10小时(36000秒),则用户需要重新登录 + if ($timeDiff > 36000) { + Session::delete($session_admin); + redirect('/home/login/index.html')->send(); + exit; + } + Db::name('Admin')->where(['id' => $this->uid])->update(['last_login_time' => time()]); + if($is_lock==1){ + redirect('/home/login/lock.html')->send(); + exit; + } + View::assign('login_admin', $login_admin); + $not_check=['index','leaves','outs','overtimes','trips','message']; + // 验证用户访问权限 + if ($this->module == 'home' && in_array($this->controller, $not_check)) { + return true; + } + else{ + $regPwd = $login_admin['reg_pwd']; + if($regPwd!==''){ + redirect('/home/index/edit_password.html')->send(); + exit; + } + if (!$this->checkAuth()) { + if (request()->isAjax()) { + return to_assign(405, '你没有权限,请联系管理员或者人事部'); + } else { + redirect('/home/index/role')->send(); + exit; + } + } + } + } + } + } + + /** + * 验证用户访问权限 + * @DateTime 2020-12-21 + * @param string $controller 当前访问控制器 + * @param string $action 当前访问方法 + * @return [type] + */ + protected function checkAuth() + { + //Cache::delete('RulesSrc' . $uid); + $uid = $this->uid; + $GOUGU = new Systematic(); + $GOUGU->auth($uid); + $auth_list_all = Cache::get('RulesSrc0'); + $auth_list = Cache::get('RulesSrc' . $uid); + $pathUrl = $this->module . '/' . $this->controller . '/' . $this->action; + if (!in_array($pathUrl, $auth_list)) { + return false; + } else { + return true; + } + } +} diff --git a/app/base/view/common/base.html b/app/base/view/common/base.html new file mode 100644 index 0000000..25586a1 --- /dev/null +++ b/app/base/view/common/base.html @@ -0,0 +1,57 @@ + + + + + + + +{block name="meta"} + +{/block} +{block name="title"} + {:get_system_config('web','admin_title')} +{/block} +{block name="keywords"} + + +{/block} +{block name="css"} + +{/block} +{block name="style"}{/block} + +{block name="js"}{/block} + + + + {block name="body"}{/block} + + + + {block name="footer"}{/block} + + + + {block name="script"}{/block} + + + + + + + {block name="copyright"} + + {/block} + + + \ No newline at end of file diff --git a/app/base/view/common/errortemplate.html b/app/base/view/common/errortemplate.html new file mode 100644 index 0000000..d85ff30 --- /dev/null +++ b/app/base/view/common/errortemplate.html @@ -0,0 +1,40 @@ + + + + + + + + + 找不到模板文件 + + + + +
+
+
+
4
😔
6
+
+
哎呀!找不到模板文件
+
{$file | default=""}模板不存在,请检查对应的目录文件,注意区分大小写!
+
+ +
+ + + \ No newline at end of file diff --git a/app/base/view/common/filetemplate.html b/app/base/view/common/filetemplate.html new file mode 100644 index 0000000..5f8a343 --- /dev/null +++ b/app/base/view/common/filetemplate.html @@ -0,0 +1,38 @@ + + + + + + + + + 找不到文件 + + + + +
+
+
+
4
😔
4
+
+
哎呀!找不到文件!
+
+ +
+ + + \ No newline at end of file diff --git a/app/base/view/common/roletemplate.html b/app/base/view/common/roletemplate.html new file mode 100644 index 0000000..375d0bd --- /dev/null +++ b/app/base/view/common/roletemplate.html @@ -0,0 +1,38 @@ + + + + + + + + + 您没有权限 + + + + +
+
+
+
4
😔
5
+
+
哎呀!您没有权限,请联系『管理员』或者『人事部』
+
+ +
+ + + \ No newline at end of file diff --git a/app/common.php b/app/common.php new file mode 100644 index 0000000..518ce17 --- /dev/null +++ b/app/common.php @@ -0,0 +1,1680 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +// 应用公共文件,内置主要的数据处理方法 +use think\facade\Config; +use think\facade\Request; +use think\facade\Cache; +use think\facade\Db; + +/***************************************************系统相关*****************************************************/ +//设置缓存 +function set_cache($key='', $value='', $date = 86400) +{ + Cache::set($key, $value, $date); +} + +//读取缓存 +function get_cache($key) +{ + return Cache::get($key); +} + +//清空缓存 +function clear_cache($key) +{ + Cache::clear($key); +} + +//读取文件配置 +function get_config($key) +{ + return Config::get($key); +} + +//读取系统配置 +function get_system_config($name='', $key = '') +{ + $config = []; + if (get_cache('system_config' . $name)) { + $config = get_cache('system_config' . $name); + } else { + $conf = Db::name('config')->where('name', $name)->find(); + if (isset($conf['content'])) { + $config = unserialize($conf['content']); + } + set_cache('system_config' . $name, $config); + } + if ($key == '') { + return $config; + } else { + if (isset($config[$key])) { + return $config[$key]; + } + else{ + return ''; + } + } +} + +//设置系统配置 +function set_system_config($name='', $key='', $value='') +{ + $config = []; + $conf = Db::name('config')->where('name', $name)->find(); + if ($conf['content']) { + $config = unserialize($conf['content']); + } + $config[$key] = $value; + set_cache('system_config' . $name, $config); + $content = serialize($config); + Db::name('config')->where('name', $name)->update(['content'=>$content]); +} + + +//判断系统是否已安装 +function is_installed() +{ + static $isInstalled; + if (empty($isInstalled)) { + $isInstalled = file_exists(CMS_ROOT . 'config/install.lock'); + } + return $isInstalled; +} + +//判断系统是否存在模板 +function isTemplate($url='') +{ + static $isTemplate; + if (empty($isTemplate)) { + $isTemplate = file_exists(CMS_ROOT . 'app/'.$url); + } + return $isTemplate; +} + +//判断模块是否禁用 +function isModule($name) +{ + $map = []; + $map[] = ['name', '=', $name]; + $map[] = ['status', '=', 1]; + $count = Db::name('AdminModule')->where($map)->count(); + return $count; +} + +//获取某模块的某数据配置 +function valueAuth($name,$conf) +{ + $map = []; + $map[] = ['name', '=', $name]; + $val = Db::name('DataAuth')->where($map)->value($conf); + return $val; +} + +//是否是某模块的数据权限,>1即有权限,$uid,要鉴别的用户,$name模块名称,$conf权限类型(字段), +function isAuth($uid,$name,$conf) +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['name', '=', $name]; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',$conf)")]; + $count = Db::name('DataAuth')->where($map)->count(); + return $count; +} + +//判断是否是部门负责人, +function isLeader($uid = 0,$did='') +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['status','=',1]; + if(!empty($did)){ + $map[] = ['id','in',$did]; + } + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',leader_ids)")]; + $count = Db::name('Department')->where($map)->count(); + return $count; +} + +//获取url参数,$key为空时返回所有参数数组 +function get_params($key = "") +{ + return Request::instance()->param($key); +} + +/** + * 菜单节点权限判断 + * @rule String + * @uid Int + * @return bool + */ +function check_auth($rule, $uid) +{ + $auth_list = Cache::get('RulesSrc' . $uid); + if (!in_array($rule, $auth_list)) { + return false; + } else { + return true; + } +} + +/** + * 返回json数据,用于接口 + * @param integer $code + * @param string $msg + * @param array $data + * @param string $url + * @param integer $httpCode + * @param array $header + * @param array $options + * @return json + */ +function to_assign($code = 0, $msg = "操作成功", $data = [], $action = '', $url = '', $httpCode = 200, $header = [], $options = []) +{ + $res = ['code' => $code]; + $res['msg'] = $msg; + $res['action'] = $action; + $res['url'] = $url; + if (is_object($data)) { + $data = $data->toArray(); + } + $res['data'] = $data; + $response = \think\Response::create($res, "json", $httpCode, $header, $options); + throw new \think\exception\HttpResponseException($response); +} + +/** + * 适配layui table数据列表的返回数据方法,用于接口 + * @param integer $code + * @param string $msg + * @param array $data + * @param integer $httpCode + * @param array $header + * @param array $options + * @return json + */ +function table_assign($code = 0, $msg = '请求成功', $data = [],$totalRow = [], $httpCode = 200, $header = [], $options = []) +{ + $res['code'] = $code; + $res['msg'] = $msg; + $res['totalRow'] = $totalRow; + if (is_object($data)) { + $data = $data->toArray(); + } + if (!empty($data['total'])) { + $res['count'] = $data['total']; + } else { + $res['count'] = 0; + } + $res['data'] = $data['data']; + $response = \think\Response::create($res, "json", $httpCode, $header, $options); + throw new \think\exception\HttpResponseException($response); +} + +//写入操作日主 +function add_log($type, $param_id = 0, $param = [] ,$subject='') +{ + try { + // 可能会抛出异常的代码 + $title = '操作'; + $session_admin = get_config('app.session_admin'); + $uid = \think\facade\Session::get($session_admin); + $type_action = get_config('log.type_action'); + if($type_action[$type]){ + $title = $type_action[$type]; + } + $data = [ + 'uid' => $uid, + 'type' => $type, + 'action' => $title, + 'param_id' => $param_id, + 'param' => json_encode($param), + 'module' => strtolower(app('http')->getName()), + 'controller' => strtolower(app('request')->controller()), + 'function' => strtolower(app('request')->action()), + 'ip' => app('request')->ip(), + 'create_time' => time(), + 'subject' => 'OA系统' + ]; + if($subject!=''){ + $data['subject'] =$subject; + } + else{ + $rule = $data['module'] . '/' . $data['controller'] . '/' . $data['function']; + $rule_menu = Db::name('AdminRule')->where(array('src' => $rule))->find(); + if($rule_menu){ + $data['subject'] = $rule_menu['name']; + } + } + Db::name('AdminLog')->strict(false)->field(true)->insert($data); + } catch (\Exception $e) { + // 处理异常,记录日志或者其他逻辑 + // 但不要抛出异常,以免中断主程序流程 + } +} + +//消息链接信息转换 +function get_message_link($template_id,$action_id){ + $content=''; + $template = Db::name('Template')->where('id',$template_id)->find(); + $link = $template['msg_link']; + if(!empty($link)){ + $content = str_replace('{action_id}', $action_id, $link); + } + return '查看详情'; +} + +function get_message_mobile($template_id,$action_id){ + $content=''; + $template = Db::name('Template')->where('id',$template_id)->find(); + $link = $template['msg_link']; + if(!empty($link)){ + $content = str_replace('{action_id}', $action_id, $link); + } + return '查看详情'; +} + +/** + * 邮件发送 + * @param $to 接收人 + * @param string $subject 邮件标题 + * @param string $content 邮件内容(html模板渲染后的内容) + * @throws Exception + * @throws phpmailerException + */ +function send_email($to, $subject = '', $content = '') +{ + $mail = new PHPMailer\PHPMailer\PHPMailer(); + $email_config = Db::name('config')->where('name', 'email')->find(); + $config = unserialize($email_config['content']); + + $mail->CharSet = 'UTF-8'; //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码 + $mail->isSMTP(); + $mail->SMTPDebug = 0; + + //调试输出格式 + //$mail->Debugoutput = 'html'; + //smtp服务器 + $mail->Host = $config['smtp']; + //端口 - likely to be 25, 465 or 587 + $mail->Port = $config['smtp_port']; + if ($mail->Port == '465') { + $mail->SMTPSecure = 'ssl'; // 使用安全协议 + } + //Whether to use SMTP authentication + $mail->SMTPAuth = true; + //发送邮箱 + $mail->Username = $config['smtp_user']; + //密码 + $mail->Password = $config['smtp_pwd']; + //Set who the message is to be sent from + $mail->setFrom($config['email'], $config['from']); + //回复地址 + //$mail->addReplyTo('replyto@example.com', 'First Last'); + //接收邮件方 + if (is_array($to)) { + foreach ($to as $v) { + $mail->addAddress($v); + } + } else { + $mail->addAddress($to); + } + + $mail->isHTML(true); // send as HTML + //标题 + $mail->Subject = $subject; + //HTML内容转换 + $mail->msgHTML($content); + $status = $mail->send(); + if ($status) { + return true; + } else { + // echo "Mailer Error: ".$mail->ErrorInfo;// 输出错误信息 + // die; + return false; + } +} + +/***************************************************员工相关*****************************************************/ +//获取指定用户的信息 +function get_admin($uid) +{ + $admin = Db::name('Admin') + ->alias('a') + ->field('a.*,d.title as department,p.title as position') + ->leftJoin ('Department d ','d.id= a.did') + ->leftJoin ('Position p ','p.id= a.position_id') + ->where(['a.id' => $uid]) + ->find(); + return $admin; +} + +//获取指定部门所有的员工信息(包含主部门、次要部门,如果son=1,则包含当前子部门) +function get_department_employee($did=0,$son=0) +{ + $admin_array = []; + $department_array = []; + $department_array[] = $did; + if($son==1){ + $department_array = get_department_son($did); + $admin_array = Db::name('DepartmentAdmin')->whereIn('department_id',$department_array)->column('admin_id'); + } + else{ + $admin_array = Db::name('DepartmentAdmin')->where('department_id',$did)->column('admin_id'); + } + + $map1=[ + ['id','in',$admin_array], + ]; + $map2=[ + ['did','in',$department_array], + ]; + $where=[['id','>',1],['status','=',1]]; + $whereOr =[$map1,$map2]; + $admin = Db::name('Admin') + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->where($where)->select()->toArray(); + return $admin; +} + +/***************************************************部门相关*****************************************************/ +//读取部门列表 +function get_department() +{ + $department = Db::name('Department')->order('sort desc,id asc')->where(['status' => 1])->select()->toArray(); + return $department; +} + +//读取部门名称 +function get_department_name($dids) +{ + $departments = Db::name('Department')->where([['id','in',$dids],['status','=',1]])->column('title'); + if(!empty($departments)){ + return implode(',',$departments); + }else{ + return ''; + } +} + +//获取某部门的子部门id,$is_self是否包含自己 +//输出部门数组,如:['1,2,3'] +function get_department_son($did = 0, $is_self = 1) +{ + $department = get_department(); + $department_list = get_data_node($department, $did); + $department_array = array_column($department_list, 'id'); + if ($is_self == 1) { + //包括自己部门在内 + $department_array[] = $did; + } + return $department_array; +} + +//读取某员工所在主部门的负责人(pid=1,上一级部门负责人) +//输出负责人数组,如:1,2,3 +function get_department_leader($uid=0,$pid=0) +{ + $did = get_admin($uid)['did']; + if($pid==1){ + $did = Db::name('Department')->where('id',$did)->value('pid'); + } + $leader_ids = Db::name('Department')->where('id',$did)->value('leader_ids'); + return $leader_ids; +} + +//获取某员工所在部门的顶级部门(如果默认顶级部门当做是分公司的,即是获取某员工所属分公司) +function get_department_top($did=0,$uid=0) +{ + if($uid>0){ + $did = get_admin($uid)['did']; + } + $top_id = $did; + if($did>0){ + $pid = Db::name('Department')->where('id',$did)->value('pid'); + if($pid>0){ + $top_id = get_department_top($pid,0); + } + } + return $top_id; +} + + +//获取某负责人所负责的部门的数据集(ids) +function get_leader_departments($uid = 0) +{ + $dids = Db::name('Admin')->where('id',$uid)->value('son_dids'); + if(empty($dids)){ + return []; + } + else{ + return explode(',',$dids); + } +} + +//获取某员工所能看的部门数据(dids) +function get_role_departments($uid = 0) +{ + if($uid==1){ + $dids = Db::name('Department')->where([['status','=',1]])->column('id'); + return $dids; + } + $dids = Db::name('Admin')->where('id',$uid)->value('auth_dids'); + if(empty($dids)){ + return []; + } + else{ + return explode(',',$dids); + } +} + +/***************************************************审批相关*****************************************************/ + +//获取全部审批状态 +function get_check_status() +{ + $check_status_array = ['待提交审批','审批中','审批通过','审批不通过','已撤回']; + return $check_status_array; +} + +//根据审批状态读取审批状态名称 +function check_status_name($check_status=0) +{ + $check_status_array = get_check_status(); + return $check_status_array[$check_status]; +} + +//根据流程类型读取某部门某模块的审核流程 +function get_cate_department_flows($cate=1,$department=0) +{ + $map1 = []; + $map2 = []; + $map1[] = ['status', '=', 1]; + $map1[] = ['flow_cate', '=', $cate]; + $map1[] = ['department_ids', '=', '']; + + $map2[] = ['status', '=', 1]; + $map2[] = ['flow_cate', '=', $cate]; + $map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$department}',department_ids)")]; + + $list = Db::name('Flow')->field('id,name,check_type')->whereOr([$map1,$map2])->order('id desc')->select()->toArray(); + return $list; +} + +//根据流程所属模块读取某部门某模块的审核流程 +function get_type_department_flows($type=6,$department=0) +{ + $map1 = []; + $map2 = []; + $map1[] = ['status', '=', 1]; + $map1[] = ['type', '=', $type]; + $map1[] = ['department_ids', '=', '']; + + $map2[] = ['status', '=', 1]; + $map2[] = ['type', '=', $type]; + $map2[] = ['', 'exp', Db::raw("FIND_IN_SET('{$department}',department_ids)")]; + + $list = Db::name('Flow')->field('id,name,check_type')->whereOr([$map1,$map2])->order('id desc')->select()->toArray(); + return $list; +} + +/** + * 初始化审批流程数据 + * @param $flow_id 审批流程id + * @param $check_admin_ids 传入当前审批人ids,用于设置当前审批步骤的审批人 + * @param $uid 传入当前登录用户id,用于查找其所在部门的负责人或者上一部门负责人 + * @return + */ +function set_flow($flow_id,$check_admin_ids,$uid) +{ + $flow_detail = Db::name('Flow')->where('id',$flow_id)->find(); + $check_type = $flow_detail['check_type']; + $flow = unserialize($flow_detail['flow_list']); + if ($check_type == 1) { + if($flow[0]['flow_type'] == 1){ + //部门负责人 + $leader = get_department_leader($uid); + if($leader == 0){ + return to_assign(1,'审批流程设置有问题:当前部门负责人还未设置,请联系HR或者管理员'); + } + else{ + $check_admin_ids = $leader; + } + } + else if($flow[0]['flow_type'] == 2){ + //上级部门负责人 + $leader = get_department_leader($uid,1); + if($leader == 0){ + return to_assign(1,'审批流程设置有问题:上级部门负责人还未设置,请联系HR或者管理员'); + } + else{ + $check_admin_ids = $leader; + } + } + else{ + $check_admin_ids = $flow[0]['flow_uids']; + } + } + else if ($check_type == 3) { + $check_admin_ids = $flow[0]['flow_uids']; + } + $flow_data = array( + 'check_type' => $check_type, + 'flow' => $flow, + 'check_admin_ids' => $check_admin_ids + ); + return $flow_data; +} + +/** + * 获取审批流程数据 + * @param $uid 当前登录用户 + * @param $flows 当前步骤内容 + * @return + */ +function get_flow($uid,$flows) +{ + $check_user = ''; + $check_user_ids = []; + if($flows['flow_type']==1){ + $check_user = '部门负责人-'; + $check_user_ids[]=get_department_leader($uid); + } + else if($flows['flow_type']==2){ + $check_user = '上级部门负责人-'; + $check_user_ids[]=get_department_leader($uid,1); + } + else{ + $check_user_ids = explode(',',$flows['flow_uids']); + } + $check_user_array = Db::name('Admin')->where('id','in',$check_user_ids)->column('name'); + $res = array( + 'check_user' => $check_user.implode(',',$check_user_array), + 'check_user_ids' => $check_user_ids + ); + return $res; +} + +/** + * 获取审批记录数据 + * @param $check_table 关联内容表 + * @param $action_id 关联内容记录id + * @return + */ +function get_check_record($check_table,$action_id) +{ + $check_record = Db::name('FlowRecord') + ->field('f.*,a.name') + ->alias('f')->join('Admin a', 'a.id = f.check_uid', 'left') + ->where([['f.check_table','=',$check_table],['f.action_id','=',$action_id],['f.delete_time','=',0]]) + ->select()->toArray(); + foreach ($check_record as $kk => &$vv) { + $vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']); + $vv['status_str'] = '提交申请'; + if($vv['check_status'] == 1){ + $vv['status_str'] = '审核通过'; + } + else if($vv['check_status'] == 2){ + $vv['status_str'] = '审核拒绝'; + } + if($vv['check_status'] == 3){ + $vv['status_str'] = '撤销申请'; + } + if($vv['check_status'] == 4){ + $vv['status_str'] = '反确认'; + } + } + return $check_record; +} + +/***************************************************常规数据获取*****************************************************/ +//读取基础数据 +function get_base_data($table) +{ + $data = Db::name($table)->where(['status' => 1])->select()->toArray(); + return $data; +} + +//读取模块基础数据 +function get_base_type_data($table,$type) +{ + $data = Db::name($table)->where(['status' => 1,'types' => $type])->select()->toArray(); + return $data; +} + +//读取所属地区 +function get_region_name($id){ + $region = Db::name('Area')->where(['id'=>$id])->find(); + if(empty($region)){ + return ''; + } + else{ + return $region['name']; + } +} + +//读取分类子分类ids,返回id数组 +function get_cate_son($table='',$id=0,$is_self = 1) +{ + $cate = Db::name($table)->order('id desc')->select()->toArray(); + $cate_list = get_data_node($cate, $id); + $ids_array = array_column($cate_list, 'id'); + if ($is_self == 1) { + //包括自己在内 + $ids_array[] = $id; + } + return $ids_array; +} + +/** + * 根据附件表的id返回url地址 + * @param [type] $id [description] + */ +function get_file($id) +{ + if ($id) { + $geturl = Db::name("file")->where(['id' => $id])->find(); + if ($geturl['status'] == 1) { + //审核通过 + //获取签名的URL + $url = $geturl['filepath']; + return $url; + } elseif ($geturl['status'] == 0) { + //待审核 + return '/static/home/images/none_pic.jpg'; + } else { + //不通过 + return '/static/home/images/none_pic.jpg'; + } + } + return false; +} + +/***************************************************工具函数相关*****************************************************/ + +//生成一个不会重复的字符串 +function make_token() +{ + $str = md5(uniqid(md5(microtime(true)), true)); + $str = sha1($str); //加密 + return $str; +} + +//随机字符串,默认长度10 +function set_salt($num = 10) +{ + $str = 'qwertyuiopasdfghjklzxcvbnm1234567890'; + $salt = substr(str_shuffle($str), 10, $num); + return $salt; +} +//密码加密 +function set_password($pwd, $salt) +{ + return md5(md5($pwd . $salt) . $salt); +} + +/** + * 生成时间编号 + * $prefix前缀 + */ +function get_codeno($prefix=1){ + $no = $prefix . date('YmdHis') . rand(1,9); + return $no; +} + +/** + * 去除空格 + * @param string $str 字符串 + * @return string 字符串 + */ +function trim_space($str=''){ + $str = mb_ereg_replace('^( | )+', '', $str); + $str = mb_ereg_replace('( | )+$', '', $str); + return mb_ereg_replace('  ', "\n  ", $str); +} + +/** + * 隐藏电话号码中间4位和邮箱 + */ +function hidetel($phone) +{ + //隐藏邮箱 + if (strpos($phone, '@')) { + $email_array = explode("@", $phone); + $prevfix = (strlen($email_array[0]) < 4) ? "" : substr($phone, 0, 3); //邮箱前缀 + $count = 0; + $str = preg_replace('/([\d\w+_-]{0,100})@/', '***@', $phone, -1, $count); + $rs = $prevfix . $str; + return $rs; + } else { + //隐藏联系方式中间4位 + $Istelephone = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9]{6,7}[\-]?[0-9]?)/i', $phone); //固定电话 + if ($Istelephone) { + return preg_replace('/(0[0-9]{2,3}[\-]?[2-9])[0-9]{3,4}([0-9]{3}[\-]?[0-9]?)/i', '$1****$2', $phone); + } else { + return preg_replace('/(1[0-9]{1}[0-9])[0-9]{4}([0-9]{4})/i', '$1****$2', $phone); + } + } +} + +/** + * 间隔时间段格式化 + * @param int $time 时间戳 + * @param string $format 格式 【d:显示到天 i显示到分钟 s显示到秒】 + * @return string + */ +function time_trans($time, $format = 'd') +{ + $now = time(); + if (!is_numeric($time)) { + $time = strtotime($time); + } + $diff = $now - $time; + if ($diff < 60) { + return '1分钟前'; + } else if ($diff < 3600) { + return floor($diff / 60) . '分钟前'; + } else if ($diff < 86400) { + return floor($diff / 3600) . '小时前'; + } + $yes_start_time = strtotime(date('Y-m-d 00:00:00', strtotime('-1 days'))); //昨天开始时间 + $yes_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-1 days'))); //昨天结束时间 + $two_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-2 days'))); //2天前结束时间 + $three_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-3 days'))); //3天前结束时间 + $four_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-4 days'))); //4天前结束时间 + $five_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-5 days'))); //5天前结束时间 + $six_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-6 days'))); //6天前结束时间 + $seven_end_time = strtotime(date('Y-m-d 23:59:59', strtotime('-7 days'))); //7天前结束时间 + + if ($time > $yes_start_time && $time < $yes_end_time) { + return '昨天'; + } + + if ($time > $yes_start_time && $time < $two_end_time) { + return '1天前'; + } + + if ($time > $yes_start_time && $time < $three_end_time) { + return '2天前'; + } + + if ($time > $yes_start_time && $time < $four_end_time) { + return '3天前'; + } + + if ($time > $yes_start_time && $time < $five_end_time) { + return '4天前'; + } + + if ($time > $yes_start_time && $time < $six_end_time) { + return '5天前'; + } + + if ($time > $yes_start_time && $time < $seven_end_time) { + return '6天前'; + } + + switch ($format) { + case 'd': + $show_time = date('Y-m-d', $time); + break; + case 'i': + $show_time = date('Y-m-d H:i', $time); + break; + case 's': + $show_time = date('Y-m-d H:i:s', $time); + break; + } + return $show_time; +} + +/** + * 时间戳格式化 + * @param int $time + * @param string $format 默认'Y-m-d H:i:s' + * @return string 完整的时间显示 + */ +function to_date($time = 0, $format = 'Y-m-d H:i:s') +{ + if(empty($time)){ + return ''; + } + else{ + if (is_numeric($time)) { + return date($format, intval($time)); + } + else{ + return $time; + } + } +} + +/** + * 计算按相差天数 + */ +function count_days($a=0, $b = 0) +{ + if ($b == 0) { + $b = date("Y-m-d"); + } + $date_1 = $a; + $date_2 = $b; + if(is_numeric($date_1)){ + $d1 = $date_1; + }else{ + $d1 = strtotime($date_1); + } + if(is_numeric($date_2)){ + $d2 = $date_2; + }else{ + $d2 = strtotime($date_2); + } + $days = round(($d2 - $d1) / 3600 / 24); + if ($days > 0) { + return $days; + } else { + return 0; + } +} + +/** + * @Method: 文件大小格式化 + * @param[type] $file_size [文件大小] + */ +function to_size($file_size){ + $file_size = $file_size-1; + if ($file_size >= 1099511627776){ + $show_filesize = number_format(($file_size / 1099511627776),2) . " TB"; + } + elseif ($file_size >= 1073741824) { + $show_filesize = number_format(($file_size / 1073741824),2) . " GB"; + } + elseif ($file_size >= 1048576) { + $show_filesize = number_format(($file_size / 1048576),2) . " MB"; + } + elseif ($file_size >= 1024) { + $show_filesize = number_format(($file_size / 1024),2) . " KB"; + } + elseif ($file_size > 0) { + $show_filesize = $file_size . " b"; + } + elseif ($file_size == 0 || $file_size == -1) { + $show_filesize = "0 b"; + } + return $show_filesize; +} + +//PC端格式化附件展示 +function file_card($file,$view=''){ + if(empty($file['file_id'])){ + $file['file_id'] = $file['id']; + } + $image=['jpg','jpeg','png','gif']; + $office=['doc','docx','xls','xlsx','ppt','pptx']; + $type_icon = 'icon-xiangmuguanli'; + $type = 0;//0下载+重命名+删除,1下载+查看+重命名+删除,2下载+查看+编辑+重命名+删除 + $ext = 'zip'; + $view_btn = ''; + + if($file['fileext'] == 'pdf'){ + $type_icon = 'icon-kejian'; + $ext = 'pdf'; + $type = 1; + } + if(in_array($file['fileext'], $image)){ + $type_icon = 'icon-sucaiguanli'; + $ext = 'image'; + $type = 1; + } + if(in_array($file['fileext'], $office)){ + $type_icon = 'icon-shenbao'; + $ext = 'office'; + $type = 1; + } + + if(empty($view)){ + $view_btn = ''; + } + else{ + $view_btn = ''; + } + + $file_del=''; + if(!empty($file['delete_time'])){ + $file_del = 'file-hasdelete'; + } + $item = '
+ +
+
'.$file['name'].'
+
'.to_size($file['filesize']).','.date('Y-m-d H:i',$file['create_time']).'
+
+
'.$view_btn.'
+
'; + return $item; +} + +//手机端格式化附件展示 +function file_item($file,$view=''){ + $image=['jpg','jpeg','png','gif']; + $fileshow='
'; + if($file['fileext'] == 'pdf'){ + + } + if(in_array($file['fileext'], $image)){ + $fileshow='
'.$file['name'].'
'; + } + $file_del=''; + if(empty($view)){ + $file_del = '
'; + } + $filesize = to_size($file['filesize']); + $filedate = date('Y-m-d H:i',$file['create_time']); + $item = '
+ '.$fileshow.' +
+
'.$file['name'].'
+
'.$filesize.','.$filedate.'
+
+ '.$file_del.' +
'; + return $item; +} + +/** + * fullcalendar日历控件方法1 + */ +function parseDateTime($string, $timeZone=null) { + $date = new DateTime( + $string, + $timeZone ? $timeZone : new DateTimeZone('UTC') + ); + if ($timeZone) { + $date->setTimezone($timeZone); + } + return $date; +} + +/** + * fullcalendar日历控件方法2 + */ +function stripTime($datetime) { + return new DateTime($datetime->format('Y-m-d')); +} +/** + * 截取文章摘要 + * @return bool + */ +function get_desc_content($content, $count) +{ + $content = preg_replace("@@is", "", $content); + $content = preg_replace("@@is", "", $content); + $content = preg_replace("@@is", "", $content); + $content = preg_replace("@<(.*?)>@is", "", $content); + $content = str_replace(PHP_EOL, '', $content); + $space = array(" ", " ", " ", " ", " "); + $go_away = array("", "", "", "", ""); + $content = str_replace($space, $go_away, $content); + $res = mb_substr($content, 0, $count, 'UTF-8'); + if (mb_strlen($content, 'UTF-8') > $count) { + $res = $res . "..."; + } + return $res; +} + +/** + * 二维数组排序 + * @param $array 要进行排序的select结果集 + * @param $field 排序的字段 + * @param $order 排序方式1降序2升序 + */ +function sort_array($array = [], $field='', $order = 1) +{ + $count = count($select); + if ($order == 1) { + for ($i = 0; $i < $count; $i++) { + $k = $i; + for ($j = $i; $j < $count; $j++) { + if ($select[$k][$field] < $select[$j][$field]) { + $k = $j; + } + } + $temp = $select[$i]; + $select[$i] = $select[$k]; + $select[$k] = $temp; + } + return $select; + } else { + for ($i = 0; $i < $count; $i++) { + $k = $i; + for ($j = $i; $j < $count; $j++) { + if ($select[$k][$field] > $select[$j][$field]) { + $k = $j; + } + } + $temp = $select[$i]; + $select[$i] = $select[$k]; + $select[$k] = $temp; + } + return $select; + } +} + +//查找数组索引,支持一维数组,二维数组查找 +function array_search_plus($array, $searchFor) { + foreach($array as $key => $value) { + if(is_array($value)){ + foreach($value as $key1 => $value1) { + if($value1 == $searchFor) { + return array("index" => $key, "key" => $key1); + } + } + } + else{ + if($value == $searchFor) { + return $key; + } + } + } + return false; +} + +//根据数据库查询出来二维数组获取某个字段拼接字符串 +function split_array_field($array = [], $field = '',$separator=',') +{ + $str=''; + if (is_array($array)) { + if($field){ + $ary = array(); + foreach ($array as $value) { + $ary[] = $value[$field]; + } + } + else{ + $ary = $array; + } + $str = implode($separator, $ary); + } + return $str; +} + +//数组转换字符串 +function array_to_string($array=[],$separator=',') +{ + if (!is_array($array)) { + $data_arr[] = $array; + } else { + $data_arr = $array; + } + $data_arr = array_filter($data_arr); //数组去空 + $data_arr = array_unique($data_arr); //数组去重 + $data_arr = array_merge($data_arr); + $string = $data_arr ? ',' . implode($separator, $data_arr) . ',' : ''; + return $string ?: ''; +} + +//字符串转换数组 +function string_to_array($string='',$separator=',') +{ + if (is_array($string)) { + $data_arr = array_unique(array_filter($string)); + } else { + $data_arr = $string ? array_unique(array_filter(explode($separator, $string))) : []; + } + $data_arr = $data_arr ? array_merge($data_arr) : []; + return $data_arr ?: []; +} + +/** + * 格式化字节大小 + * @param number $size 字节数 + * @param string $delimiter 数字和单位分隔符 + * @return string 格式化后的带单位的大小 + */ +function format_bytes($size=0, $delimiter = '') +{ + $units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB'); + $size = (float) $size; + for ($i = 0; $size >= 1024 && $i < 5; $i++) { + $size /= 1024; + } + return round($size, 2) . $delimiter . $units[$i]; +} + +/** + * 截取字符串 + * @param $start 开始截取位置 + * @param $length 截取长度 + * @return + */ +function msubstr($str='', $start = 0, $length=1, $charset = "utf-8", $suffix = true) +{ + if (function_exists("mb_substr")) { + $slice = mb_substr($str, $start, $length, $charset); + } elseif (function_exists('iconv_substr')) { + $slice = iconv_substr($str, $start, $length, $charset); + if (false === $slice) { + $slice = ''; + } + } else { + $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; + $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"; + $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"; + $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"; + preg_match_all($re[$charset], $str, $match); + $slice = join("", array_slice($match[0], $start, $length)); + } + if (utf8_strlen($str) < $length) $suffix = false; + return $suffix ? $slice . '...' : $slice; +} + +//计算字符串长度 +function utf8_strlen($string = null) +{ + preg_match_all("/./us", $string, $match); + return count($match[0]); +} + +/** + * 截取文字长度 + * @return string + */ +function sub_str($str,$len=20){ + $strlen=strlen($str)/3;#在编码utf8下计算字符串的长度,并把它交给变量$strlen + if($strlen<$len){ + return $str; + }else{ + return mb_substr($str,0,$len,"utf-8")."..."; + } +} + +/* +* 下划线转驼峰 +* 思路: +* step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符 +* step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符. +*/ +function camelize($uncamelized_words,$separator='_') +{ + $uncamelized_words = $separator. str_replace($separator, " ", strtolower($uncamelized_words)); + return ltrim(str_replace(" ", "", ucwords($uncamelized_words)), $separator ); +} + +/** +* 驼峰命名转下划线命名 +* 思路: +* 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写 +*/ +function uncamelize($camelCaps,$separator='_') +{ + return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps)); +} + +/** + *数据处理成树形格式1 + * @return array + */ +function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'list', $root = 0) +{ + // 创建Tree + $tree = array(); + if (is_array($list)) { + // 创建基于主键的数组引用 + $refer = array(); + foreach ($list as $key => $data) { + $refer[$data[$pk]] = &$list[$key]; + } + foreach ($list as $key => $data) { + // 判断是否存在parent + $parentId = $data[$pid]; + if ($root == $parentId) { + $tree[$data[$pk]] = &$list[$key]; + } else { + if (isset($refer[$parentId])) { + $parent = &$refer[$parentId]; + $parent[$child][$data[$pk]] = &$list[$key]; + } + } + } + } + return $tree; +} + +/** + *数据处理成树形格式2 + * @return array + */ +function create_tree_list($pid, $arr, $group, &$tree = []) +{ + foreach ($arr as $key => $vo) { + if ($key == 0) { + $vo['spread'] = true; + } + if (!empty($group) and in_array($vo['id'], $group)) { + $vo['checked'] = true; + } else { + $vo['checked'] = false; + } + if ($vo['pid'] == $pid) { + $child = create_tree_list($vo['id'], $arr, $group); + if ($child) { + $vo['children'] = $child; + $vo['len'] = count($child); + } + else{ + $vo['len'] = 0; + } + $tree[] = $vo; + } + } + return $tree; +} + + +//递归排序,用于分类选择 +function set_recursion($result, $pid = 0, $level=-1) +{ + /*记录排序后的类别数组*/ + static $list = array(); + static $space = ['','├─','§§├─','§§§§├─','§§§§§§├─','§§§§§§§§├─','§§§§§§§§§§├─']; + $level++; + foreach ($result as $k => $v) { + if ($v['pid'] == $pid) { + if ($pid != 0) { + $v['title'] = $space[$level] . $v['title']; + $v['level'] = $level+1; + } + /*将该类别的数据放入list中*/ + $list[] = $v; + set_recursion($result, $v['id'],$level); + } + } + return $list; +} + + +//递归返回树形菜单数据 +function get_tree($data, $pid = 0, $level = 1, $open = 1, $first = 0) { + $tree = array(); + foreach ($data as $item) { + $item['checkArr']=array('type'=>0, 'isChecked'=>0); + $item['spread']=false; + if($level<=$open){ + $item['spread']=true; + } + $item['level']=$level; + if ($item['pid'] == $pid) { + $children = get_tree($data, $item['id'],$level+1,$open); + if ($children) { + $item['children'] = $children; + } + $tree[] = $item; + } + } + if($first==1&&!empty($tree)){ + $tree[0]['spread']=true; + } + return $tree; +} + +//递归返回树形菜单数据 +function get_select_tree($data, $pid ,$deep=0, $selected=[]) +{ + $tree = []; + foreach($data as $k => $v) + { + $vv=[]; + $vv['name']=$v['title']; + $vv['value']=$v['id']; + $vv['selected']=''; + if(in_array($v['id'],$selected)){ + $vv['selected'] = 'selected'; + } + if($v['pid'] == $pid){ + //父亲找到儿子 + $deep++; + $vv['children'] = get_select_tree($data, $v['id'],$deep,$selected); + $tree[] = $vv; + } + } + return array_values($tree); +} + +/** + * 根据id递归返回子数据 + * @param $data 数据 + * @param $pid 父节点id + */ +function get_data_node($data=[],$pid=0){ + $dep = []; + foreach($data as $k => $v){ + if($v['pid'] == $pid){ + $node=get_data_node($data, $v['id']); + array_push($dep,$v); + if(!empty($node)){ + $dep=array_merge($dep,$node); + } + } + } + return array_values($dep); +} + + +function generateTree($flatArray, $parentId = 0) { + $tree = []; + foreach ($flatArray as $item) { + if ($item['pid'] === $parentId) { + $node = $item; + $node['children'] = generateTree($flatArray, $item['id']); + $tree[] = $node; + } + } + return $tree; +} + +//访问按小时归档统计 +function hour_document($arrData) +{ + $documents = array(); + $hour = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]; + foreach ($hour as $val) { + $documents[$val] = 0; + } + foreach ($arrData as $index => $value) { + $archivesTime = intval(date("H", $value['create_time'])); + $documents[$archivesTime] += 1; + } + return $documents; +} + +//访问按日期归档统计 +function date_document($arrData) +{ + $documents = array(); + foreach ($arrData as $index => $value) { + $archivesTime = date("Y-m-d", $value['create_time']); + if (empty($documents[$archivesTime])) { + $documents[$archivesTime] = 1; + } else { + $documents[$archivesTime] += 1; + } + } + return $documents; +} + +/** + * 人民币转大写 + * @param + */ +function cny($amount){ + $capitalNumbers = [ + '零', + '壹', + '贰', + '叁', + '肆', + '伍', + '陆', + '柒', + '捌', + '玖', + ]; + + $integerUnits = ['', '拾', '佰', '仟',]; + $placeUnits = ['', '万', '亿', '兆',]; + $decimalUnits = ['角', '分', '厘', '毫',]; + $result = []; + $arr = explode('.', (string)$amount); + $integer = trim($arr[0] ?? '', '-'); + $decimal = $arr[1] ?? ''; + if (!((int)$decimal)) { + $decimal = ''; + } + // 转换整数部分,从个位开始 + $integerNumbers = $integer ? array_reverse(str_split($integer)) : []; + $last = null; + foreach (array_chunk($integerNumbers, 4) as $chunkKey => $chunk) { + if (!((int)implode('', $chunk))) { + // 全是 0 则直接跳过 + continue; + } + array_unshift($result, $placeUnits[$chunkKey]); + foreach ($chunk as $key => $number) { + // 去除重复 零,以及第一位的 零,类似:1002、110 + if (!$number && (!$last || $key === 0)) { + $last = $number; + continue; + } + $last = $number; + // 类似 1022,中间的 0 是不需要 佰 的 + if ($number) { + array_unshift($result, $integerUnits[$key]); + } + array_unshift($result, $capitalNumbers[$number]); + } + } + if (!$result) { + $result[] = $capitalNumbers[0]; + } + $result[] = '圆'; + if (!$decimal) { + $result[] = '整'; + } + // 转换小数位 + $decimalNumbers = $decimal ? str_split($decimal) : []; + foreach ($decimalNumbers as $key => $number) { + $result[] = $capitalNumbers[$number]; + $result[] = $decimalUnits[$key]; + } + if (strpos((string)$amount, '-') === 0) { + array_unshift($result, '负'); + } + return implode('', $result); +} + + +/** + * 金额展示规则,超过1万时以万为单位,低于1万时以千为单位,低于1千时以元为单位 + * @param string $money 金额 + * @return string + */ +function format_money($money) +{ + $data = '0元'; + if (($money / 10000) > 1) { + $data = is_int($money / 10000) ? ($money / 10000) . '万' : round(($money / 10000), 2) . '万'; + } elseif (($money / 1000) > 1) { + $data = is_int($money / 1000) ? ($money / 1000) . '千' : round(($money / 1000), 2) . '千'; + } else { + $data = $money . '元'; + } + return $data; +} + +/***************************************************校验相关*****************************************************/ +/** + * 判断是否是手机浏览器 + * @return bool + */ +function is_mobile() +{ + if (isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], "wap")) { + return true; + } elseif (isset($_SERVER['HTTP_ACCEPT']) && strpos(strtoupper($_SERVER['HTTP_ACCEPT']), "VND.WAP.WML")) { + return true; + } elseif (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) { + return true; + } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])) { + return true; + }elseif (strpos($_SERVER['HTTP_USER_AGENT'] , 'wxwork') !== false ) { + return true; + }else { + return false; + } +} + +/** + * 判断是否是微信浏览器 + * @return bool + */ +function is_wechat(){ + if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) { + return true; + } else { + return false; + } +} + +/** + * 判断是否是企业微信浏览器 + * @return bool + */ +function is_wxwork() +{ + if (strpos($_SERVER['HTTP_USER_AGENT'] , 'wxwork') !== false ) { + return true; + } else { + return false; + } +} + +/** + * 验证输入的邮件地址是否合法 + * @param $user_email 邮箱 + * @return bool + */ +function is_email($user_email) +{ + $chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i"; + if (strpos($user_email, '@') !== false && strpos($user_email, '.') !== false) { + if (preg_match($chars, $user_email)) { + return true; + } else { + return false; + } + } else { + return false; + } +} + + +/** + * 获取客户浏览器类型 + */ +function get_browser_name() +{ + $Browser = $_SERVER['HTTP_USER_AGENT']; + if (preg_match('/MSIE/i', $Browser)) { + $Browser = 'MSIE'; + } elseif (preg_match('/Firefox/i', $Browser)) { + $Browser = 'Firefox'; + } elseif (preg_match('/Chrome/i', $Browser)) { + $Browser = 'Chrome'; + } elseif (preg_match('/Safari/i', $Browser)) { + $Browser = 'Safari'; + } elseif (preg_match('/Opera/i', $Browser)) { + $Browser = 'Opera'; + } else { + $Browser = 'Other'; + } + return $Browser; +} + +/** + * 获取客户端系统 + */ +function get_os_name() +{ + $agent = $_SERVER['HTTP_USER_AGENT']; + if (preg_match('/win/i', $agent)) { + if (preg_match('/nt 6.1/i', $agent)) { + $OS = 'Windows 7'; + } else if (preg_match('/nt 6.2/i', $agent)) { + $OS = 'Windows 8'; + } else if (preg_match('/nt 10.0/i', $agent)) { + $OS = 'Windows 10'; + } else { + $OS = 'Windows'; + } + } elseif (preg_match('/mac/i', $agent)) { + $OS = 'MAC'; + } elseif (preg_match('/linux/i', $agent)) { + $OS = 'Linux'; + } elseif (preg_match('/unix/i', $agent)) { + $OS = 'Unix'; + } elseif (preg_match('/bsd/i', $agent)) { + $OS = 'BSD'; + } else { + $OS = 'Other'; + } + return $OS; +} + +/** + * curl 模拟GET请求 + * @author lee + ***/ +function curl_get($url) +{ + //初始化 + $ch = curl_init(); + //设置抓取的url + curl_setopt($ch, CURLOPT_URL, $url); + //设置获取的信息以文件流的形式返回,而不是直接输出。 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书 + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // https请求 不验证hosts + curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);//添加这个获取请求头信息 + //执行命令 + $output = curl_exec($ch); + $meta = curl_getinfo($ch,CURLINFO_HEADER_OUT); + $accept = substr($meta,0,strpos($meta, 'Accept:')); + $host = substr($accept,strpos($accept, 'Host:')+5); + curl_close($ch); //释放curl句柄 + return $output; +} + +/** + * 模拟post进行url请求 + * @param string $url + * @param string $param + */ +function curl_post($url = '', $post = array()) +{ + //$post['host'] = $_SERVER['HTTP_HOST']; + $curl = curl_init(); // 启动一个CURL会话 + curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在 + curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 + curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer + curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求 + curl_setopt($curl, CURLOPT_POSTFIELDS, $post); // Post提交的数据包 + curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 + curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容 + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 + $res = curl_exec($curl); // 执行操作 + if (curl_errno($curl)) { + echo 'Errno' . curl_error($curl);//捕抓异常 + } + curl_close($curl); // 关闭CURL会话 + return $res; // 返回数据,json格式 +} \ No newline at end of file diff --git a/app/contract/common.php b/app/contract/common.php new file mode 100644 index 0000000..46902b8 --- /dev/null +++ b/app/contract/common.php @@ -0,0 +1,50 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +use think\facade\Db; + +//销售合同性质 +function get_contract_types($check_status=0) +{ + $contract_types_array = [ + ["id"=>1,"title"=>"普通合同"], + ["id"=>2,"title"=>"产品合同"], + ["id"=>3,"title"=>"服务合同"] + ]; + return $contract_types_array; +} + +//根据销售合同性质读取销售合同性质名称 +function contract_types_name($types=1) +{ + $contract_types_array = get_contract_types(); + return $contract_types_array[$types-1]; +} + +//采购合同性质 +function get_purchase_types($check_status=0) +{ + $purchase_types_array = [ + ["id"=>1,"title"=>"普通采购"], + ["id"=>2,"title"=>"物品采购"], + ["id"=>3,"title"=>"服务采购"] + ]; + return $purchase_types_array; +} + +//根据采购合同性质读取采购合同性质名称 +function purchase_types_name($types=1) +{ + $purchase_types_array = get_purchase_types(); + return $purchase_types_array[$types-1]; +} \ No newline at end of file diff --git a/app/contract/controller/Api.php b/app/contract/controller/Api.php new file mode 100644 index 0000000..1c5d57e --- /dev/null +++ b/app/contract/controller/Api.php @@ -0,0 +1,376 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\contract\controller; + +use app\api\BaseController; +use app\contract\model\Contract; +use app\contract\model\Purchase; +use app\contract\model\SupplierContact; +use think\facade\Db; +use think\facade\View; + +class Api extends BaseController +{ + //获取销售合同协议 + public function get_contract() + { + $param = get_params(); + $uid = $this->uid; + $where = array(); + $whereOr = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['delete_time', '=', 0]; + $where[] = ['check_status', '=', 2]; + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $model = new Contract(); + $list = $model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + + //销售合同归档操作 + public function contract_archive() + { + if (request()->isPost()) { + $param = get_params(); + $tips='操作成功,合同已转入到归档合同列表'; + if($param['archive_status'] == 1){ + $param['archive_uid'] = $this->uid; + $param['archive_time'] = time(); + } + else{ + $param['archive_uid'] = 0; + $param['archive_time'] = 0; + $tips='操作成功,合同已从归档合同列表转出'; + } + if (Db::name('Contract')->strict(false)->update($param) !== false) { + return to_assign(0, $tips); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //销售合同中止等操作 + public function contract_stop() + { + if (request()->isPost()) { + $param = get_params(); + $tips='操作成功,合同已转入到中止合同列表'; + if($param['stop_status'] == 1){ + $param['stop_uid'] = $this->uid; + $param['stop_time'] = time(); + } + else{ + $param['stop_uid'] = 0; + $param['stop_time'] = 0; + $tips='操作成功,合同已从中止合同列表转出'; + } + if (Db::name('Contract')->strict(false)->update($param) !== false) { + return to_assign(0, $tips); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + //销售合同作废等操作 + public function contract_tovoid() + { + if (request()->isPost()) { + $param = get_params(); + $tips='操作成功,合同已转入到作废合同列表'; + if($param['void_status'] == 1){ + $param['void_uid'] = $this->uid; + $param['void_time'] = time(); + } + else{ + $param['void_uid'] = 0; + $param['void_time'] = 0; + $tips='操作成功,合同已从作废合同列表转出'; + } + if (Db::name('Contract')->strict(false)->update($param) !== false) { + return to_assign(0, $tips); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //获取产品分类数据 + public function get_productcate_tree() + { + $cate = get_base_data('ProductCate'); + $list = get_tree($cate, 0, 2); + $data['trees'] = $list; + return json($data); + } + + //获取销售产品列表 + public function get_product() + { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('Product')->field('id,title,sale_price,purchase_price,base_price,unit,specs')->order('id asc')->where($where)->paginate(['list_rows'=> $rows]); + table_assign(0, '', $list); + } + + //更新合同电子文件 + public function contract_seal_ids() + { + if (request()->isPost()) { + $param = get_params(); + if (Db::name('Contract')->strict(false)->update($param) !== false) { + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + + + /* + -------------------------------------------------分割线--------------------------------------------------------- + */ + //获取采购合同协议 + public function get_purchase() + { + $param = get_params(); + $uid = $this->uid; + $where = array(); + $whereOr = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['delete_time', '=', 0]; + $where[] = ['check_status', '=', 2]; + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $model = new Purchase(); + $list = $model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + + //采购合同归档操作 + public function purchase_archive() + { + if (request()->isPost()) { + $param = get_params(); + $tips='操作成功,合同已转入到归档合同列表'; + if($param['archive_status'] == 1){ + $param['archive_uid'] = $this->uid; + $param['archive_time'] = time(); + } + else{ + $param['archive_uid'] = 0; + $param['archive_time'] = 0; + $tips='操作成功,合同已从归档合同列表转出'; + } + if (Db::name('Purchase')->strict(false)->update($param) !== false) { + return to_assign(0, $tips); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //采购合同中止等操作 + public function purchase_stop() + { + if (request()->isPost()) { + $param = get_params(); + $tips='操作成功,合同已转入到中止合同列表'; + if($param['stop_status'] == 1){ + $param['stop_uid'] = $this->uid; + $param['stop_time'] = time(); + } + else{ + $param['stop_uid'] = 0; + $param['stop_time'] = 0; + $tips='操作成功,合同已从中止合同列表转出'; + } + if (Db::name('Purchase')->strict(false)->update($param) !== false) { + return to_assign(0, $tips); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + //采购合同作废等操作 + public function purchase_tovoid() + { + if (request()->isPost()) { + $param = get_params(); + $tips='操作成功,合同已转入到作废合同列表'; + if($param['void_status'] == 1){ + $param['void_uid'] = $this->uid; + $param['void_time'] = time(); + } + else{ + $param['void_uid'] = 0; + $param['void_time'] = 0; + $tips='操作成功,合同已从作废合同列表转出'; + } + if (Db::name('Purchase')->strict(false)->update($param) !== false) { + return to_assign(0, $tips); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //获取采购品分类数据 + public function get_purchasedcate_tree() + { + $cate = get_base_data('PurchasedCate'); + $list = get_tree($cate, 0, 2); + $data['trees'] = $list; + return json($data); + } + + //获取供应商列表 + public function get_supplier() + { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('Supplier')->field('id,title,address')->order('id asc')->where($where)->paginate(['list_rows'=> $rows])->each(function($item, $key){ + $contact = Db::name('SupplierContact')->where(['sid'=>$item['id'],'is_default'=>1])->find(); + if(!empty($contact)){ + $item['contact_name'] = $contact['name']; + $item['contact_mobile'] = $contact['mobile']; + } + else{ + $item['contact_name'] = ''; + $item['contact_mobile'] = ''; + } + return $item; + }); + table_assign(0, '', $list); + } + + //获取采购物品列表 + public function get_purchased() + { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('Purchased')->field('id,title,purchase_price,sale_price,unit,specs')->order('id asc')->where($where)->paginate(['list_rows'=> $rows]); + table_assign(0, '', $list); + } + + //获取供应商联系人数据 + public function get_supplier_contact() + { + $param = get_params(); + $where = array(); + $where[] = ['delete_time', '=', 0]; + $where[] = ['sid', '=', $param['supplier_id']]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $content = SupplierContact::where($where) + ->order('create_time desc') + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) { + $item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name'); + $item->create_time = date('Y-m-d H:i:s', (int) $item->create_time); + }); + return table_assign(0, '', $content); + } + + //设置供应商联系人 + public function set_supplier_contact() + { + if (request()->isAjax()) { + $param = get_params(); + $detail= SupplierContact::where(['id' => $param['id']])->find(); + SupplierContact::where(['sid' => $detail['sid']])->strict(false)->field(true)->update(['is_default'=>0]); + $res = SupplierContact::where(['id' => $param['id']])->update(['is_default'=>1]); + if ($res) { + add_log('edit', $param['id'], $param,'供应商联系人'); + return to_assign(); + } else { + return to_assign(1, '操作失败'); + } + } else { + return to_assign(1, '参数错误'); + } + } + + //更新合同电子文件 + public function purchase_seal_ids() + { + if (request()->isPost()) { + $param = get_params(); + if (Db::name('Purchase')->strict(false)->update($param) !== false) { + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/contract/controller/Cate.php b/app/contract/controller/Cate.php new file mode 100644 index 0000000..2470826 --- /dev/null +++ b/app/contract/controller/Cate.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\model\ContractCate as ContractCateModel; +use app\contract\validate\CateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Cate extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ContractCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(CateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(CateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/contract/controller/Contract.php b/app/contract/controller/Contract.php new file mode 100644 index 0000000..32ad53e --- /dev/null +++ b/app/contract/controller/Contract.php @@ -0,0 +1,523 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\model\Contract as ContractModel; +use app\contract\validate\ContractValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Contract extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ContractModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['archive_time','=',0]; + $where[]=['stop_time','=',0]; + $where[]=['void_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (isset($param['check_status']) && $param['check_status']!='') { + $where[] = ['check_status', '=',$param['check_status']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + if($tab == 0){ + if (!empty($param['uid'])) { + $where[] = ['sign_uid', '=', $param['uid']]; + } + else{ + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + } + if($tab == 1){ + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 2){ + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('is_leader', isLeader($this->uid)); + View::assign('is_auth', isAuth($this->uid,'contract_admin','conf_1')); + View::assign('delay_num', valueAuth('contract_admin','conf_10')); + return view(); + } + } + + public function archivelist() + { + $param = get_params(); + if (request()->isAjax()) { + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['archive_time','>',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('delay_num', valueAuth('contract_admin','conf_10')); + return view(); + } + } + + public function stoplist() + { + $param = get_params(); + if (request()->isAjax()) { + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['stop_time','>',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + public function voidlist() + { + $param = get_params(); + if (request()->isAjax()) { + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['void_time','>',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['sign_time'])) { + $param['sign_time'] = strtotime($param['sign_time']); + } + if (isset($param['start_time'])) { + $param['start_time'] = strtotime($param['start_time']); + } + if (isset($param['end_time'])) { + $param['end_time'] = strtotime($param['end_time']); + if ($param['end_time'] <= $param['start_time']) { + return to_assign(1, "结束时间需要大于开始时间"); + } + } + if($param['scene'] == 'add' || $param['scene'] == 'edit'){ + $param['content'] = serialize([]); + if($param['types']==2){ + $product_title_data = isset($param['product_title']) ? $param['product_title'] : ''; + $product_id_data = isset($param['product_id']) ? $param['product_id'] : 0; + $product_unit_data = isset($param['product_unit']) ? $param['product_unit'] : ''; + $product_specs_data = isset($param['product_specs']) ? $param['product_specs'] : ''; + $product_price_data = isset($param['product_price']) ? $param['product_price'] : '0.00'; + $product_num_data = isset($param['product_num']) ? $param['product_num'] : 1; + $product_subtotal_data = isset($param['product_subtotal']) ? $param['product_subtotal'] : '0.00'; + $product_remark_data = isset($param['product_remark']) ? $param['product_remark'] : ''; + $product = []; + if(!empty($product_title_data)){ + foreach ($product_title_data as $key => $value) { + if (!$value) { + continue; + } + $data = []; + $data['product_title'] = $product_title_data[$key]; + $data['product_id'] = $product_id_data[$key]; + $data['product_unit'] = $product_unit_data[$key]; + $data['product_specs'] = $product_specs_data[$key]; + $data['product_price'] = $product_price_data[$key]; + $data['product_num'] = $product_num_data[$key]; + $data['product_subtotal'] = $product_subtotal_data[$key]; + $data['product_remark'] = $product_remark_data[$key]; + $product[]=$data; + } + } + $param['content'] = serialize($product); + } + if($param['types']==3){ + $service_title_data = isset($param['service_title']) ? $param['service_title'] : ''; + $service_id_data = isset($param['service_id']) ? $param['service_id'] : 0; + $service_time_a_data = isset($param['service_time_a']) ? $param['service_time_a'] : ''; + $service_time_b_data = isset($param['service_time_b']) ? $param['service_time_b'] : ''; + $service_date_data = isset($param['service_date']) ? $param['service_date'] : ''; + $service_price_data = isset($param['service_price']) ? $param['service_price'] : '0.00'; + $service_num_data = isset($param['service_num']) ? $param['service_num'] : 1; + $service_subtotal_data = isset($param['service_subtotal']) ? $param['service_subtotal'] : '0.00'; + $service_remark_data = isset($param['service_remark']) ? $param['service_remark'] : ''; + $service = []; + if(!empty($service_title_data)){ + foreach ($service_title_data as $key => $value) { + if (!$value) { + continue; + } + $data = []; + $data['service_title'] = $service_title_data[$key]; + $data['service_id'] = $service_id_data[$key]; + if(!empty($service_time_a_data)){ + $data['service_date'] = $service_time_a_data[$key].'到'.$service_time_b_data[$key]; + } + else{ + $data['service_date'] = $service_date_data[$key]; + } + $data['service_price'] = $service_price_data[$key]; + $data['service_num'] = $service_num_data[$key]; + $data['service_subtotal'] = $service_subtotal_data[$key]; + $data['service_remark'] = $service_remark_data[$key]; + $service[]=$data; + } + } + $param['content'] = serialize($service); + } + } + + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ContractValidate::class)->scene($param['scene'])->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if(isset($param['chance_id']) && $param['chance_id']>0){ + $has_chance = Db::name('Contract')->where([['chance_id','=',$param['chance_id']],['delete_time','=',0],['id','<>',$param['id']]])->count(); + if($has_chance>0){ + return to_assign(1, '所选的机会线索已关联有销售合同,不支持关联多合同'); + } + } + $this->model->edit($param); + } else { + try { + validate(ContractValidate::class)->scene($param['scene'])->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if($param['chance_id']>0){ + $has_chance = Db::name('Contract')->where(['chance_id'=>$param['chance_id'],'delete_time'=>0])->count(); + if($has_chance>0){ + return to_assign(1, '所选的机会线索已关联有销售合同,不支持关联多合同'); + } + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $types = isset($param['types']) ? $param['types'] : 0; + $is_customer = Db::name('DataAuth')->where('name','contract_admin')->value('conf_3'); + $is_codeno = Db::name('DataAuth')->where('name','contract_admin')->value('conf_2'); + $is_product = Db::name('DataAuth')->where('name','contract_admin')->value('conf_4'); + $is_service = Db::name('DataAuth')->where('name','contract_admin')->value('conf_5'); + View::assign('is_customer', $is_customer); + View::assign('is_codeno', $is_codeno); + View::assign('is_product', $is_product); + View::assign('is_service', $is_service); + if ($id>0) { + $detail = $this->model->getById($id); + if($detail['check_status'] == 1 || $detail['check_status'] == 2 || $detail['check_status'] == 3){ + return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']); + } + if($detail['types'] > 1){ + $content_array = unserialize($detail['content']); + if($detail['types']==3){ + foreach ($content_array as $key => &$value) { + if(!empty($value['service_date'])){ + $service_date = explode('到', $value['service_date']); + $value['service_time_a'] = $service_date[0]; + $value['service_time_b'] = $service_date[1]; + } + } + } + $detail['content_array'] = $content_array; + } + View::assign('types', $detail['types']); + View::assign('codeno', $detail['code']); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/contract/contract_add'); + } + return view('edit'); + } + $codeno=''; + if($is_codeno==1){ + $codeno = get_codeno(1); + } + View::assign('codeno', $codeno); + View::assign('id', $id); + View::assign('types', $types); + if($types == 0){ + return view('add_types'); + } + if(is_mobile()){ + return view('qiye@/contract/contract_add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + if($detail['types'] > 1){ + $content_array = unserialize($detail['content']); + if($detail['types']==3){ + foreach ($content_array as $key => &$value) { + if(!empty($value['service_date'])){ + $service_date = explode('到', $value['service_date']); + $value['service_time_a'] = $service_date[0]; + $value['service_time_b'] = $service_date[1]; + } + } + } + $detail['content_array'] = $content_array; + } + $detail['status_name'] = check_status_name($detail['check_status']); + $detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title'); + //归档信息 + if($detail['archive_uid'] > 0){ + $detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name'); + } + //中止信息 + if($detail['stop_uid'] > 0){ + $detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name'); + } + //作废信息 + if($detail['void_uid'] > 0){ + $detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name'); + } + + //开票和回款信息 + if($detail['check_status'] == 2){ + $detail['invoice'] = Db::name('Invoice')->field('i.*,a.name as admin') + ->alias('i') + ->join('Admin a', 'a.id = i.admin_id', 'LEFT') + ->where([['i.contract_id','=',$id],['i.open_status','<',2],['i.invoice_type','>',0],['i.delete_time','=',0]]) + ->order('i.create_time desc') + ->select(); + + $has_invoice = Db::name('invoice')->where([['contract_id','=',$id],['open_status','<',2],['invoice_type','>',0],['delete_time','=',0]])->sum('amount'); + $detail['has_invoice'] = sprintf("%.2f",$has_invoice); + $detail['no_invoice'] = sprintf("%.2f",($detail['cost']*100 - $has_invoice*100)/100); + + + $invoice_ids = Db::name('Invoice')->where([['contract_id','=',$id],['open_status','<',2],['delete_time','=',0]])->column('id'); + $detail['income'] = Db::name('InvoiceIncome')->field('i.*,a.name as admin') + ->alias('i') + ->join('Admin a', 'a.id = i.admin_id', 'LEFT') + ->where([['i.invoice_id','in',$invoice_ids],['i.status','=',1]]) + ->order('i.enter_time desc') + ->select(); + + $has_income = Db::name('InvoiceIncome')->where([['invoice_id','in',$invoice_ids],['status','=',1]])->sum('amount'); + $detail['has_income'] = sprintf("%.2f",$has_income); + $detail['no_income'] = sprintf("%.2f",($detail['cost']*100 - $has_income*100)/100); + } + + if($detail['seal_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['seal_ids'])->select()->toArray(); + $detail['seal_array'] = $file_array; + } + else{ + $detail['seal_array'] = []; + } + + $auth = isAuth($this->uid,'contract_admin','conf_1'); + View::assign('detail', $detail); + View::assign('auth', $auth); + if(is_mobile()){ + return view('qiye@/contract/contract_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/contract/controller/Product.php b/app/contract/controller/Product.php new file mode 100644 index 0000000..34cde4d --- /dev/null +++ b/app/contract/controller/Product.php @@ -0,0 +1,144 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\model\Product as ProductModel; +use app\contract\validate\ProductValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Product extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ProductModel(); + } + + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%']; + } + if (isset($param['status']) && $param['status']!='') { + $where[] = ['p.status', '=', $param['status']]; + } + if (!empty($param['cate_id'])) { + $cate_id_array = get_cate_son('ProductCate',$param['cate_id']); + $where[] = ['p.cate_id', 'in', $cate_id_array]; + } + $where[] = ['p.delete_time', '=', 0]; + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + //新建编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['sale_price'] = empty($param['sale_price'])?0:$param['sale_price']; + $param['base_price'] = empty($param['base_price'])?0:$param['base_price']; + $param['purchase_price'] = empty($param['purchase_price'])?0:$param['purchase_price']; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ProductValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(ProductValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + if($id>0){ + $detail = $this->model->getById($id); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + return view('edit'); + } + return view(); + } + } + + //查看 + public function view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = $this->model->getById($id); + if($detail['cate_id']>0){ + $detail['cate'] = Db::name('ProductCate')->where('id',$detail['cate_id'])->value('title'); + } + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + return view(); + } + + //设置 + public function set() + { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + add_log('set', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/contract/controller/Productcate.php b/app/contract/controller/Productcate.php new file mode 100644 index 0000000..3f52a27 --- /dev/null +++ b/app/contract/controller/Productcate.php @@ -0,0 +1,112 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\validate\ProductCateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Productcate extends BaseController +{ + //类别 + public function datalist() + { + if (request()->isAjax()) { + $cate = Db::name('ProductCate')->order('create_time asc')->select(); + $list = generateTree($cate); + return to_assign(0, '', $list); + } else { + return view(); + } + } + + //分类添加&编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ProductCateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $note_array = get_cate_son('ProductCate',$param['id']); + if (in_array($param['pid'], $note_array)) { + return to_assign(1, '父级分类不能是该分类本身或其子分类'); + } else { + $param['update_time'] = time(); + $res = Db::name('ProductCate')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } + } else { + try { + validate(ProductCateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('ProductCate')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + $cate = Db::name('ProductCate')->order('id desc')->select()->toArray(); + $cates = set_recursion($cate); + if ($id > 0) { + $detail = Db::name('ProductCate')->where(['id' => $id])->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + View::assign('pid', $pid); + View::assign('cates', $cates); + return view(); + } + } + + //删除分类 + public function del() + { + $id = get_params("id"); + $cate_count = Db::name('ProductCate')->where(["pid" => $id])->count(); + if ($cate_count > 0) { + return to_assign(1, "该分类下还有子分类,无法删除"); + } + $product_count = Db::name('Product')->where(["cate_id" => $id,'delete_time'=>0])->count(); + if ($product_count > 0) { + return to_assign(1, "该分类下还有产品,无法删除"); + } + if (Db::name('ProductCate')->delete($id) !== false) { + add_log('delete', $id); + return to_assign(0, "删除分类成功"); + } else { + return to_assign(1, "删除失败"); + } + } + + +} diff --git a/app/contract/controller/Purchase.php b/app/contract/controller/Purchase.php new file mode 100644 index 0000000..ea43938 --- /dev/null +++ b/app/contract/controller/Purchase.php @@ -0,0 +1,504 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\model\Purchase as PurchaseModel; +use app\contract\validate\PurchaseValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Purchase extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new PurchaseModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['archive_time','=',0]; + $where[]=['stop_time','=',0]; + $where[]=['void_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (isset($param['check_status']) && $param['check_status']!='') { + $where[] = ['check_status', '=',$param['check_status']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + if($tab == 0){ + if (!empty($param['uid'])) { + $where[] = ['sign_uid', '=', $param['uid']]; + } + else{ + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + } + if($tab == 1){ + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 2){ + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('is_leader', isLeader($this->uid)); + View::assign('is_auth', isAuth($this->uid,'contract_admin','conf_1')); + View::assign('delay_num', valueAuth('contract_admin','conf_10')); + return view(); + } + } + + public function archivelist() + { + $param = get_params(); + if (request()->isAjax()) { + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['archive_time','>',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('delay_num', valueAuth('contract_admin','conf_10')); + return view(); + } + } + + public function stoplist() + { + $param = get_params(); + if (request()->isAjax()) { + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['stop_time','>',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + public function voidlist() + { + $param = get_params(); + if (request()->isAjax()) { + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['void_time','>',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|code', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['types'])) { + $where[] = ['types', '=',$param['types']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=',$param['cate_id']]; + } + if (!empty($param['sign_time'])) { + $sign_time =explode('~', $param['sign_time']); + $where[] = ['sign_time', 'between',[strtotime(urldecode($sign_time[0])),strtotime(urldecode($sign_time[1].' 23:59:59'))]]; + } + if (!empty($param['end_time'])) { + $end_time =explode('~', $param['end_time']); + $where[] = ['end_time', 'between',[strtotime(urldecode($end_time[0])),strtotime(urldecode($end_time[1].' 23:59:59'))]]; + } + //是否是合同管理员 + $auth = isAuth($uid,'contract_admin','conf_1'); + if($auth == 0){ + $whereOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['sign_time'])) { + $param['sign_time'] = strtotime($param['sign_time']); + } + if (isset($param['start_time'])) { + $param['start_time'] = strtotime($param['start_time']); + } + if (isset($param['end_time'])) { + $param['end_time'] = strtotime($param['end_time']); + if ($param['end_time'] <= $param['start_time']) { + return to_assign(1, "结束时间需要大于开始时间"); + } + } + if($param['scene'] == 'add' || $param['scene'] == 'edit'){ + $param['content'] = serialize([]); + if($param['types']==2){ + $purchased_title_data = isset($param['purchased_title']) ? $param['purchased_title'] : ''; + $purchased_id_data = isset($param['purchased_id']) ? $param['purchased_id'] : 0; + $purchased_unit_data = isset($param['purchased_unit']) ? $param['purchased_unit'] : ''; + $purchased_specs_data = isset($param['purchased_specs']) ? $param['purchased_specs'] : ''; + $purchased_price_data = isset($param['purchased_price']) ? $param['purchased_price'] : '0.00'; + $purchased_num_data = isset($param['purchased_num']) ? $param['purchased_num'] : 1; + $purchased_subtotal_data = isset($param['purchased_subtotal']) ? $param['purchased_subtotal'] : '0.00'; + $purchased_remark_data = isset($param['purchased_remark']) ? $param['purchased_remark'] : ''; + $purchased = []; + if(!empty($purchased_title_data)){ + foreach ($purchased_title_data as $key => $value) { + if (!$value) { + continue; + } + $data = []; + $data['purchased_title'] = $purchased_title_data[$key]; + $data['purchased_id'] = $purchased_id_data[$key]; + $data['purchased_unit'] = $purchased_unit_data[$key]; + $data['purchased_specs'] = $purchased_specs_data[$key]; + $data['purchased_price'] = $purchased_price_data[$key]; + $data['purchased_num'] = $purchased_num_data[$key]; + $data['purchased_subtotal'] = $purchased_subtotal_data[$key]; + $data['purchased_remark'] = $purchased_remark_data[$key]; + $purchased[]=$data; + } + } + $param['content'] = serialize($purchased); + } + if($param['types']==3){ + $service_title_data = isset($param['service_title']) ? $param['service_title'] : ''; + $service_time_a_data = isset($param['service_time_a']) ? $param['service_time_a'] : ''; + $service_time_b_data = isset($param['service_time_b']) ? $param['service_time_b'] : ''; + $service_date_data = isset($param['service_date']) ? $param['service_date'] : ''; + $service_price_data = isset($param['service_price']) ? $param['service_price'] : '0.00'; + $service_num_data = isset($param['service_num']) ? $param['service_num'] : 1; + $service_subtotal_data = isset($param['service_subtotal']) ? $param['service_subtotal'] : '0.00'; + $service_remark_data = isset($param['service_remark']) ? $param['service_remark'] : ''; + $service = []; + if(!empty($service_title_data)){ + foreach ($service_title_data as $key => $value) { + if (!$value) { + continue; + } + $data = []; + $data['service_title'] = $service_title_data[$key]; + if(!empty($service_time_a_data)){ + $data['service_date'] = $service_time_a_data[$key].'到'.$service_time_b_data[$key]; + } + else{ + $data['service_date'] = $service_date_data[$key]; + } + $data['service_price'] = $service_price_data[$key]; + $data['service_num'] = $service_num_data[$key]; + $data['service_subtotal'] = $service_subtotal_data[$key]; + $data['service_remark'] = $service_remark_data[$key]; + $service[]=$data; + } + } + $param['content'] = serialize($service); + } + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(PurchaseValidate::class)->scene($param['scene'])->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(PurchaseValidate::class)->scene($param['scene'])->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $types = isset($param['types']) ? $param['types'] : 0; + $is_supplier = Db::name('DataAuth')->where('name','contract_admin')->value('conf_6'); + $is_codeno = Db::name('DataAuth')->where('name','contract_admin')->value('conf_2'); + $is_purchased = Db::name('DataAuth')->where('name','contract_admin')->value('conf_7'); + View::assign('is_supplier', $is_supplier); + View::assign('is_codeno', $is_codeno); + View::assign('is_purchased', $is_purchased); + if ($id>0) { + $detail = $this->model->getById($id); + if($detail['check_status'] == 1 || $detail['check_status'] == 2 || $detail['check_status'] == 3){ + return view(EEEOR_REPORTING,['code'=>403,'warning'=>'当前状态不支持编辑']); + } + if($detail['types'] > 1){ + $content_array = unserialize($detail['content']); + if($detail['types']==3){ + foreach ($content_array as $key => &$value) { + if(!empty($value['service_date'])){ + $service_date = explode('到', $value['service_date']); + $value['service_time_a'] = $service_date[0]; + $value['service_time_b'] = $service_date[1]; + } + } + } + $detail['content_array'] = $content_array; + } + View::assign('types', $detail['types']); + View::assign('codeno', $detail['code']); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/contract/purchase_add'); + } + return view('edit'); + } + $codeno=''; + if($is_codeno==1){ + $codeno = get_codeno(2); + } + View::assign('codeno', $codeno); + View::assign('id', $id); + View::assign('types', $types); + if($types == 0){ + return view('add_types'); + } + if(is_mobile()){ + return view('qiye@/contract/purchase_add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + if($detail['types'] > 1){ + $content_array = unserialize($detail['content']); + if($detail['types']==3){ + foreach ($content_array as $key => &$value) { + if(!empty($value['service_date'])){ + $service_date = explode('到', $value['service_date']); + $value['service_time_a'] = $service_date[0]; + $value['service_time_b'] = $service_date[1]; + } + } + } + $detail['content_array'] = $content_array; + } + $detail['status_name'] = check_status_name($detail['check_status']); + $detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title'); + //归档信息 + if($detail['archive_uid'] > 0){ + $detail['archive_name'] = Db::name('Admin')->where(['id' => $detail['archive_uid']])->value('name'); + } + //中止信息 + if($detail['stop_uid'] > 0){ + $detail['stop_name'] = Db::name('Admin')->where(['id' => $detail['stop_uid']])->value('name'); + } + //作废信息 + if($detail['void_uid'] > 0){ + $detail['void_name'] = Db::name('Admin')->where(['id' => $detail['void_uid']])->value('name'); + } + + //收票和付款信息 + if($detail['check_status'] == 2){ + $detail['ticket'] = Db::name('Ticket')->field('t.*,a.name as admin') + ->alias('t') + ->join('Admin a', 'a.id = t.admin_id', 'LEFT') + ->where([['t.purchase_id','=',$id],['t.open_status','<',2],['t.invoice_type','>',0],['t.delete_time','=',0]]) + ->order('t.create_time desc') + ->select(); + + $has_ticket = Db::name('Ticket')->where([['purchase_id','=',$id],['open_status','<',2],['invoice_type','>',0],['delete_time','=',0]])->sum('amount'); + $detail['has_ticket'] = sprintf("%.2f",$has_ticket); + $detail['no_ticket'] = sprintf("%.2f",($detail['cost']*100 - $has_ticket*100)/100); + + + $ticket_ids = Db::name('Ticket')->where([['purchase_id','=',$id],['open_status','<',2],['delete_time','=',0]])->column('id'); + $detail['payment'] = Db::name('TicketPayment')->field('t.*,a.name as admin') + ->alias('t') + ->join('Admin a', 'a.id = t.admin_id', 'LEFT') + ->where([['t.ticket_id','in',$ticket_ids],['t.status','=',1]]) + ->order('t.pay_time desc') + ->select(); + + $has_payment = Db::name('TicketPayment')->where([['ticket_id','in',$ticket_ids],['status','=',1]])->sum('amount'); + $detail['has_payment'] = sprintf("%.2f",$has_payment); + $detail['no_payment'] = sprintf("%.2f",($detail['cost']*100 - $has_payment*100)/100); + } + if($detail['seal_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['seal_ids'])->select()->toArray(); + $detail['seal_array'] = $file_array; + } + else{ + $detail['seal_array'] = []; + } + $auth = isAuth($this->uid,'contract_admin','conf_1'); + View::assign('detail', $detail); + View::assign('auth', $auth); + if(is_mobile()){ + return view('qiye@/contract/purchase_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/contract/controller/Purchased.php b/app/contract/controller/Purchased.php new file mode 100644 index 0000000..786a30c --- /dev/null +++ b/app/contract/controller/Purchased.php @@ -0,0 +1,142 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\model\Purchased as PurchasedModel; +use app\contract\validate\PurchasedValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Purchased extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new PurchasedModel(); + } + + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $where[] = ['p.title', 'like', '%' . $param['keywords'] . '%']; + } + if (isset($param['status']) && $param['status']!='') { + $where[] = ['p.status', '=', $param['status']]; + } + if (!empty($param['cate_id'])) { + $cate_id_array = get_cate_son('PurchasedCate',$param['cate_id']); + $where[] = ['p.cate_id', 'in', $cate_id_array]; + } + $where[] = ['p.delete_time', '=', 0]; + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + //新建编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['purchase_price'] = empty($param['purchase_price'])?0:$param['purchase_price']; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(PurchasedValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(PurchasedValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + if($id>0){ + $detail = $this->model->getById($id); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + return view('edit'); + } + return view(); + } + } + + //查看 + public function view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = $this->model->getById($id); + if($detail['cate_id']>0){ + $detail['cate'] = Db::name('PurchasedCate')->where('id',$detail['cate_id'])->value('title'); + } + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + return view(); + } + + //设置 + public function set() + { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + add_log('set', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/contract/controller/Purchasedcate.php b/app/contract/controller/Purchasedcate.php new file mode 100644 index 0000000..680c2a5 --- /dev/null +++ b/app/contract/controller/Purchasedcate.php @@ -0,0 +1,112 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\validate\PurchasedCateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Purchasedcate extends BaseController +{ + //类别 + public function datalist() + { + if (request()->isAjax()) { + $cate = Db::name('PurchasedCate')->order('create_time asc')->select(); + $list = generateTree($cate); + return to_assign(0, '', $list); + } else { + return view(); + } + } + + //分类添加&编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(PurchasedCateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $note_array = get_cate_son('PurchasedCate',$param['id']); + if (in_array($param['pid'], $note_array)) { + return to_assign(1, '父级分类不能是该分类本身或其子分类'); + } else { + $param['update_time'] = time(); + $res = Db::name('PurchasedCate')->strict(false)->field(true)->update($param); + if($res){ + add_log('edit', $param['id'], $param); + return to_assign(); + } + } + } else { + try { + validate(PurchasedCateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('PurchasedCate')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + $cate = Db::name('PurchasedCate')->order('id desc')->select()->toArray(); + $cates = set_recursion($cate); + if ($id > 0) { + $detail = Db::name('PurchasedCate')->where(['id' => $id])->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + View::assign('pid', $pid); + View::assign('cates', $cates); + return view(); + } + } + + //删除分类 + public function del() + { + $id = get_params("id"); + $cate_count = Db::name('PurchasedCate')->where(["pid" => $id])->count(); + if ($cate_count > 0) { + return to_assign(1, "该分类下还有子分类,无法删除"); + } + $product_count = Db::name('Product')->where(["cate_id" => $id,'delete_time'=>0])->count(); + if ($product_count > 0) { + return to_assign(1, "该分类下还有产品,无法删除"); + } + if (Db::name('PurchasedCate')->delete($id) !== false) { + add_log('delete', $id); + return to_assign(0, "删除分类成功"); + } else { + return to_assign(1, "删除失败"); + } + } + + +} diff --git a/app/contract/controller/Services.php b/app/contract/controller/Services.php new file mode 100644 index 0000000..fd1365f --- /dev/null +++ b/app/contract/controller/Services.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\model\Services as ServicesModel; +use app\contract\validate\ServicesValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Services extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ServicesModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ServicesValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(ServicesValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/contract/controller/Supplier.php b/app/contract/controller/Supplier.php new file mode 100644 index 0000000..64828ec --- /dev/null +++ b/app/contract/controller/Supplier.php @@ -0,0 +1,242 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\contract\controller; + +use app\base\BaseController; +use app\contract\model\Supplier as SupplierModel; +use app\contract\model\SupplierContact; +use app\contract\validate\SupplierValidate; +use app\contract\validate\SupplierContactValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Supplier extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new SupplierModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where = []; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + //新建编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(SupplierValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('Supplier')->strict(false)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(SupplierValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('Supplier')->strict(false)->insertGetId($param); + if ($insertId) { + if(!empty($param['c_name'])){ + $contact = [ + 'name' => $param['c_name'], + 'mobile' => $param['c_mobile'], + 'sex' => $param['c_sex'], + 'sid' => $insertId, + 'is_default' => 1, + 'create_time' => time(), + 'admin_id' => $this->uid + ]; + Db::name('SupplierContact')->strict(false)->field(true)->insert($contact); + } + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + if($id>0){ + $detail = Db::name('Supplier')->where('id',$id)->find(); + $detail['file_array'] = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + View::assign('detail', $detail); + return view('edit'); + } + return view(); + } + } + + //查看 + public function view() + { + $param = get_params(); + $detail = Db::name('Supplier')->where('id',$param['id'])->find(); + $detail['file_array'] = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + View::assign('detail', $detail); + return view(); + } + + //设置 + public function set() + { + $param = get_params(); + $res = Db::name('Supplier')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + //删除 + public function del() + { + if (request()->isDelete()) { + $params = get_params(); + $count = Db::name('Purchase')->where(['supplier_id' => $params['id'],'delete_time'=>0])->count(); + if($count>0){ + return to_assign(1, "该供应商有采购合同存在,不准删除"); + } + $data['id'] = $params['id']; + $data['delete_time'] = time(); + if (Db::name('Supplier')->update($data) !== false) { + //删除客户联系人 + Db::name('SupplierContact')->where(['sid' => $params['id']])->update(['delete_time'=>time()]); + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + + //添加供应商联系人 + public function contact_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(SupplierContactValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = SupplierContact::strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(SupplierContactValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $count= SupplierContact::where(['sid' => $param['sid'],'delete_time' => 0])->count(); + if($count == 0){ + $param['is_default'] = 1; + } + $param['admin_id'] = $this->uid; + $param['create_time'] = time(); + $insertId = SupplierContact::strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $supplier_id = isset($param['sid']) ? $param['sid'] : 0; + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + View::assign('detail', (new SupplierContact())->detail($id)); + return view('contact_edit'); + } + $supplier_name = Db::name('Supplier')->where('id',$supplier_id)->value('title'); + View::assign('supplier_id', $supplier_id); + View::assign('supplier_name', $supplier_name); + return view(); + } + } + + //删除供应商联系人 + public function contact_del() + { + if (request()->isDelete()) { + $param = get_params(); + $contact = SupplierContact::where(['id' => $param['id']])->find(); + if($contact['is_default'] == 1){ + return to_assign(1, '供应商的首要联系人不能删除'); + } + if($contact['admin_id'] != $this->uid){ + return to_assign(1, '你不是该联系人的创建人,无权限删除'); + } + $param['delete_time'] = time(); + $res = SupplierContact::strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + return to_assign(); + } else { + return to_assign(1, '操作失败'); + } + } else { + return to_assign(1, '参数错误'); + } + } +} diff --git a/app/contract/controller/Suppliercontact.php b/app/contract/controller/Suppliercontact.php new file mode 100644 index 0000000..a1da2c6 --- /dev/null +++ b/app/contract/controller/Suppliercontact.php @@ -0,0 +1,128 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\supplier\controller; + +use app\base\BaseController; +use app\supplier\model\SupplierContact; +use app\supplier\validate\SupplierContactCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Contact extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['a.id|a.name|a.mobile|s.title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['a.delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $content = SupplierContact::where($where) + ->field('a.*,s.title as supplier') + ->alias('a') + ->join('Supplier s', 'a.sid = s.id') + ->order('a.create_time desc') + ->paginate($rows, false, ['query' => $param]) + ->each(function ($item, $key) { + $item->create_time = date('Y-m-d H:i:s', (int) $item->create_time); + }); + return table_assign(0, '', $content); + } else { + return view(); + } + } + //添加 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(SupplierContactCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('SupplierContact')->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(SupplierContactCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $count= Db::name('SupplierContact')->where(['sid' => $param['sid'],'delete_time' => 0])->count(); + if($count == 0){ + $param['is_default'] = 1; + } + $param['admin_id'] = $this->uid; + $param['create_time'] = time(); + $insertId = Db::name('SupplierContact')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $supplier_id = isset($param['sid']) ? $param['sid'] : 0; + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + View::assign('detail', (new SupplierContact())->detail($id)); + return view('edit'); + } + $supplier_name = Db::name('Supplier')->where('id',$supplier_id)->value('title'); + View::assign('supplier_id', $supplier_id); + View::assign('supplier_name', $supplier_name); + return view(); + } + } + + //设置 + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $contact = Db::name('SupplierContact')->where(['id' => $param['id']])->find(); + if($contact['is_default'] == 1){ + return to_assign(1, '供应商的首要联系人不能删除'); + } + if($contact['admin_id'] != $this->uid){ + return to_assign(1, '你不是该联系人的创建人,无权限删除'); + } + $param['delete_time'] = time(); + $res = SupplierContact::strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + return to_assign(); + } else { + return to_assign(1, '操作失败'); + } + } else { + return to_assign(1, '参数错误'); + } + } + + +} diff --git a/app/contract/event.php b/app/contract/event.php new file mode 100644 index 0000000..4eff890 --- /dev/null +++ b/app/contract/event.php @@ -0,0 +1,5 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\model; +use think\model; +use think\facade\Db; +use app\api\model\EditLog; +class Contract extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[], $where=[], $whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = 'id desc'; + if(!empty($param['order_field']) && !empty($param['order_type'])){ + $order = $param['order_field'].' '.$param['order_type']; + } + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $types_title=contract_types_name($item->types); + $item->types_name = $types_title['title']; + $item->status_name = check_status_name($item->check_status); + $item->cate_title = Db::name('ContractCate')->where(['id' => $item->cate_id])->value('title'); + $item->sign_name = Db::name('Admin')->where(['id' => $item->sign_uid])->value('name'); + $item->sign_time = date('Y-m-d', $item->sign_time); + $item->interval_time = date('Y-m-d', $item->start_time) . ' 至 ' . date('Y-m-d', $item->end_time); + $item->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time)); + if($item->keeper_uid>0){ + $item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name'); + } + else{ + $item->keeper_name='-'; + } + if($item->archive_uid>0){ + $item->archive_name = Db::name('Admin')->where(['id' => $item->archive_uid])->value('name'); + $item->archive_time = date('Y-m-d', $item->archive_time); + } + else{ + $item->archive_name='-'; + $item->archive_time='-'; + } + if($item->stop_uid>0){ + $item->stop_name = Db::name('Admin')->where(['id' => $item->stop_uid])->value('name'); + $item->stop_time = date('Y-m-d', $item->stop_time); + } + else{ + $item->stop_name='-'; + $item->stop_time='-'; + } + if($item->void_uid>0){ + $item->void_name = Db::name('Admin')->where(['id' => $item->void_uid])->value('name'); + $item->void_time = date('Y-m-d', $item->void_time); + } + else{ + $item->void_name='-'; + $item->void_time='-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + $log=new EditLog(); + $log->add('Contract',$insertId); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + $old = self::find($param['id']); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + $log=new EditLog(); + $log->edit('Contract',$param['id'],$param,$old); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $types_title=contract_types_name($info['types']); + $info['types_name'] = $types_title['title']; + $info['create_time'] = to_date($info['create_time']); + $info['sign_time'] = date('Y-m-d', $info['sign_time']); + $info['start_time'] = date('Y-m-d', $info['start_time']); + $info['end_time'] = date('Y-m-d', $info['end_time']); + $info['sign_department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + $info['sign_name'] = Db::name('Admin')->where(['id' => $info['sign_uid']])->value('name'); + $info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name'); + if($info['chance_id']>0){ + $info['chance'] = Db::name('CustomerChance')->where(['id' => $info['chance_id']])->value('title'); + } + else{ + $info['chance']=''; + } + if($info['prepared_uid']>0){ + $info['prepared_name'] = Db::name('Admin')->where(['id' => $info['prepared_uid']])->value('name'); + } + else{ + $info['prepared_name']=''; + } + if($info['keeper_uid']>0){ + $info['keeper_name'] = Db::name('Admin')->where(['id' => $info['keeper_uid']])->value('name'); + } + else{ + $info['keeper_name']=''; + } + if($info['share_ids'] !=''){ + $share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name'); + $info['share_names'] = implode(',',$share_names); + } + else{ + $info['share_names'] = ''; + } + if($info['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray(); + $info['file_array'] = $file_array; + } + else{ + $info['file_array'] = []; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/contract/model/ContractCate.php b/app/contract/model/ContractCate.php new file mode 100644 index 0000000..1423968 --- /dev/null +++ b/app/contract/model/ContractCate.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\contract\model; +use think\model; +use think\facade\Db; +class ContractCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/contract/model/Product.php b/app/contract/model/Product.php new file mode 100644 index 0000000..e670592 --- /dev/null +++ b/app/contract/model/Product.php @@ -0,0 +1,115 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\contract\model; +use think\model; +use think\facade\Db; +class Product extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'p.id desc' : $param['order']; + try { + $list = self::where($where) + ->field('p.*,pc.title as cate') + ->alias('p') + ->join('ProductCate pc', 'pc.id = p.cate_id', 'left') + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} diff --git a/app/contract/model/Purchase.php b/app/contract/model/Purchase.php new file mode 100644 index 0000000..cc77159 --- /dev/null +++ b/app/contract/model/Purchase.php @@ -0,0 +1,199 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\contract\model; +use think\model; +use think\facade\Db; +use app\api\model\EditLog; +class Purchase extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[], $where=[], $whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = 'id desc'; + if(!empty($param['order_field']) && !empty($param['order_type'])){ + $order = $param['order_field'].' '.$param['order_type']; + } + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->status_name = check_status_name($item->check_status); + $types_title=purchase_types_name($item->types); + $item->types_name = $types_title['title']; + $item->cate_title = Db::name('ContractCate')->where(['id' => $item->cate_id])->value('title'); + $item->sign_name = Db::name('Admin')->where(['id' => $item->sign_uid])->value('name'); + $item->sign_time = date('Y-m-d', $item->sign_time); + $item->interval_time = date('Y-m-d', $item->start_time) . ' 至 ' . date('Y-m-d', $item->end_time); + $item->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time)); + if($item->keeper_uid>0){ + $item->keeper_name = Db::name('Admin')->where(['id' => $item->keeper_uid])->value('name'); + } + else{ + $item->keeper_name='-'; + } + if($item->archive_uid>0){ + $item->archive_name = Db::name('Admin')->where(['id' => $item->archive_uid])->value('name'); + $item->archive_time = date('Y-m-d', $item->archive_time); + } + else{ + $item->archive_name='-'; + $item->archive_time='-'; + } + if($item->stop_uid>0){ + $item->stop_name = Db::name('Admin')->where(['id' => $item->stop_uid])->value('name'); + $item->stop_time = date('Y-m-d', $item->stop_time); + } + else{ + $item->stop_name='-'; + $item->stop_time='-'; + } + if($item->void_uid>0){ + $item->void_name = Db::name('Admin')->where(['id' => $item->void_uid])->value('name'); + $item->void_time = date('Y-m-d', $item->void_time); + } + else{ + $item->void_name='-'; + $item->void_time='-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + $log=new EditLog(); + $log->add('Purchase',$insertId); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + $old = self::find($param['id']); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + $log=new EditLog(); + $log->edit('Purchase',$param['id'],$param,$old); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $types_title=purchase_types_name($info['types']); + $info['types_name'] = $types_title['title']; + $info['create_time'] = to_date($info['create_time']); + $info['sign_time'] = date('Y-m-d', $info['sign_time']); + $info['start_time'] = date('Y-m-d', $info['start_time']); + $info['end_time'] = date('Y-m-d', $info['end_time']); + $info['sign_department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + $info['sign_name'] = Db::name('Admin')->where(['id' => $info['sign_uid']])->value('name'); + $info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name'); + if($info['prepared_uid']>0){ + $info['prepared_name'] = Db::name('Admin')->where(['id' => $info['prepared_uid']])->value('name'); + } + else{ + $info['prepared_name']=''; + } + if($info['keeper_uid']>0){ + $info['keeper_name'] = Db::name('Admin')->where(['id' => $info['keeper_uid']])->value('name'); + } + else{ + $info['keeper_name']=''; + } + if($info['share_ids'] !=''){ + $share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name'); + $info['share_names'] = implode(',',$share_names); + } + else{ + $info['share_names'] = ''; + } + if($info['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray(); + $info['file_array'] = $file_array; + } + else{ + $info['file_array'] = []; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/contract/model/Purchased.php b/app/contract/model/Purchased.php new file mode 100644 index 0000000..7cd8a06 --- /dev/null +++ b/app/contract/model/Purchased.php @@ -0,0 +1,115 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\contract\model; +use think\model; +use think\facade\Db; +class Purchased extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'p.id desc' : $param['order']; + try { + $list = self::where($where) + ->field('p.*,pc.title as cate') + ->alias('p') + ->join('PurchasedCate pc', 'pc.id = p.cate_id', 'left') + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} diff --git a/app/contract/model/Services.php b/app/contract/model/Services.php new file mode 100644 index 0000000..1d28567 --- /dev/null +++ b/app/contract/model/Services.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\contract\model; +use think\model; +use think\facade\Db; +class Services extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/contract/model/Supplier.php b/app/contract/model/Supplier.php new file mode 100644 index 0000000..6f1154d --- /dev/null +++ b/app/contract/model/Supplier.php @@ -0,0 +1,116 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\contract\model; +use think\model; +use think\facade\Db; +class Supplier extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[], $where=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $contact = Db::name('SupplierContact')->where(['is_default'=>1,'sid' => $item->id])->find(); + if(!empty($contact)){ + $item->user = $contact['name']; + $item->mobile = $contact['mobile']; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} diff --git a/app/contract/model/SupplierContact.php b/app/contract/model/SupplierContact.php new file mode 100644 index 0000000..37ad3c0 --- /dev/null +++ b/app/contract/model/SupplierContact.php @@ -0,0 +1,31 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\model; + +use think\facade\Db; +use think\Model; + +class SupplierContact extends Model +{ + // 获取详情 + public function detail($id) + { + $detail = Db::name('SupplierContact')->where(['id' => $id])->find(); + if (!empty($detail)) { + $detail['create_time'] = date('Y-m-d H:i:s', $detail['create_time']); + $detail['supplier'] = Db::name('Supplier')->where(['id' => $detail['sid']])->value('title'); + } + return $detail; + } +} diff --git a/app/contract/validate/CateValidate.php b/app/contract/validate/CateValidate.php new file mode 100644 index 0000000..8275028 --- /dev/null +++ b/app/contract/validate/CateValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; +use think\Validate; +use think\facade\Db; + +class CateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('ContractCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/contract/validate/ContractValidate.php b/app/contract/validate/ContractValidate.php new file mode 100644 index 0000000..6cac9c9 --- /dev/null +++ b/app/contract/validate/ContractValidate.php @@ -0,0 +1,54 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; +use think\Validate; +use think\facade\Db; + +class ContractValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Contract')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected function checkNumer($value,$rule,$data=[]) + { + return is_numeric($value); + } + + protected $rule = [ + 'code' => 'require|checkOne', + 'name' => 'require', + 'cost' => 'require|checkNumer', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '合同名称不能为空', + 'code.require' => '合同编码不能为空', + 'code.checkOne' => '同样的合同编码已经存在', + 'cost.require' => '合同金额不能为空', + 'cost.checkNumer' => '合同金额只能是数字', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['name','code','cost'], + 'edit' => ['name','code','cost','id'], + 'change' => ['id'], + ]; +} \ No newline at end of file diff --git a/app/contract/validate/ProductCateValidate.php b/app/contract/validate/ProductCateValidate.php new file mode 100644 index 0000000..e1389c7 --- /dev/null +++ b/app/contract/validate/ProductCateValidate.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; + +use think\Validate; + +class ProductCateValidate extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:product_cate', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/contract/validate/ProductValidate.php b/app/contract/validate/ProductValidate.php new file mode 100644 index 0000000..93e37be --- /dev/null +++ b/app/contract/validate/ProductValidate.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; + +use think\Validate; + +class ProductValidate extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/contract/validate/PurchaseValidate.php b/app/contract/validate/PurchaseValidate.php new file mode 100644 index 0000000..d9c0a13 --- /dev/null +++ b/app/contract/validate/PurchaseValidate.php @@ -0,0 +1,54 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; +use think\Validate; +use think\facade\Db; + +class PurchaseValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Purchase')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected function checkNumer($value,$rule,$data=[]) + { + return is_numeric($value); + } + + protected $rule = [ + 'code' => 'require|checkOne', + 'name' => 'require', + 'cost' => 'require|checkNumer', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '合同名称不能为空', + 'code.require' => '合同编码不能为空', + 'code.checkOne' => '同样的合同编码已经存在', + 'cost.require' => '合同金额不能为空', + 'cost.checkNumer' => '合同金额只能是数字', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['name','code','cost'], + 'edit' => ['name','code','cost','id'], + 'change' => ['id'], + ]; +} \ No newline at end of file diff --git a/app/contract/validate/PurchasedCateValidate.php b/app/contract/validate/PurchasedCateValidate.php new file mode 100644 index 0000000..c4e5061 --- /dev/null +++ b/app/contract/validate/PurchasedCateValidate.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; + +use think\Validate; + +class PurchasedCateValidate extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:purchased_cate', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/contract/validate/PurchasedValidate.php b/app/contract/validate/PurchasedValidate.php new file mode 100644 index 0000000..6332694 --- /dev/null +++ b/app/contract/validate/PurchasedValidate.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; + +use think\Validate; + +class PurchasedValidate extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:purchased', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/contract/validate/ServicesValidate.php b/app/contract/validate/ServicesValidate.php new file mode 100644 index 0000000..a185b11 --- /dev/null +++ b/app/contract/validate/ServicesValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; +use think\Validate; +use think\facade\Db; + +class ServicesValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Services')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/contract/validate/SupplierContactValidate.php b/app/contract/validate/SupplierContactValidate.php new file mode 100644 index 0000000..20850c9 --- /dev/null +++ b/app/contract/validate/SupplierContactValidate.php @@ -0,0 +1,36 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; + +use think\Validate; + +class SupplierContactValidate extends Validate +{ + protected $rule = [ + 'name' => 'require', + 'mobile' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '联系人姓名不能为空', + 'mobile' => '手机号码不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['name','mobile'], + 'edit' => ['id', 'name','mobile'], + ]; +} diff --git a/app/contract/validate/SupplierValidate.php b/app/contract/validate/SupplierValidate.php new file mode 100644 index 0000000..207b406 --- /dev/null +++ b/app/contract/validate/SupplierValidate.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\contract\validate; + +use think\Validate; + +class SupplierValidate extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/contract/view/cate/add.html b/app/contract/view/cate/add.html new file mode 100644 index 0000000..23e973f --- /dev/null +++ b/app/contract/view/cate/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

合同分类

+ + + + + + + +
合同分类名称* + + 排序 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/cate/datalist.html b/app/contract/view/cate/datalist.html new file mode 100644 index 0000000..ccf0a37 --- /dev/null +++ b/app/contract/view/cate/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/cate/view.html b/app/contract/view/cate/view.html new file mode 100644 index 0000000..989b5c0 --- /dev/null +++ b/app/contract/view/cate/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

合同分类详情

+ + + + + + + +
合同分类名称{$detail.title|default=''}">排序{$detail.sort|default=0}
+
+{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/add.html b/app/contract/view/contract/add.html new file mode 100644 index 0000000..eca4e2a --- /dev/null +++ b/app/contract/view/contract/add.html @@ -0,0 +1,261 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增合同

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$types" value="2"}{include file="/contract/add_product"}{/eq} + {eq name="$types" value="3"}{include file="/contract/add_service"}{/eq} + + + + + + + + + + + + + +
合同名称*合同性质 + + {eq name="$types" value="1" }普通合同{/eq} + {eq name="$types" value="2" }产品合同{/eq} + {eq name="$types" value="3" }服务合同{/eq} +
签约主体(乙方)* + + 合同始止日期* +
+ +
+ ~ +
+ +
+
客户名称(甲方)* + {eq name="$is_customer" value="1"} + + {else/} + + {/eq} + + 签约客户代表*
客户联系地址客户联系电话
关联机会线索 + + +
合同金额* + {eq name="$types" value="1"} + + {/eq} + {eq name="$types" value="2"} + + {/eq} + {eq name="$types" value="3"} + + {/eq} + 合同类别* + + 合同编号*
签订信息
合同签订人* + + + 合同所属部门* + + + 合同签订日期*
合同制定人 + + + 合同保管人 + + + 合同共享人员 + + +
相关附件
+ + +
+ +
+
备注信息
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/add_product.html b/app/contract/view/contract/add_product.html new file mode 100644 index 0000000..48fe9b7 --- /dev/null +++ b/app/contract/view/contract/add_product.html @@ -0,0 +1,116 @@ + + 产品信息 + 添加产品 + + + + + + + + + + + + + + + + {eq name="is_product" value="1"} + + {else/} + + {/eq} + + + + + + + + +
产品名称单位规格销售单价数量小计备注信息操作
删除
+ + + diff --git a/app/contract/view/contract/add_service.html b/app/contract/view/contract/add_service.html new file mode 100644 index 0000000..a332959 --- /dev/null +++ b/app/contract/view/contract/add_service.html @@ -0,0 +1,109 @@ + + 服务信息 + 添加服务 + + + + + + + + + + + + + + + {eq name="is_service" value="1"} + + {else/} + + {/eq} + + + + + + + +
服务名称服务周期服务单价服务次数小计备注信息操作
删除
+ + + diff --git a/app/contract/view/contract/add_types.html b/app/contract/view/contract/add_types.html new file mode 100644 index 0000000..439f1a5 --- /dev/null +++ b/app/contract/view/contract/add_types.html @@ -0,0 +1,34 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增合同

+ + + + + + + +
选择合同性质
+ +
+
+{/block} +{block name="copyright"}{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/archivelist.html b/app/contract/view/contract/archivelist.html new file mode 100644 index 0000000..e5e9cf4 --- /dev/null +++ b/app/contract/view/contract/archivelist.html @@ -0,0 +1,178 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/datalist.html b/app/contract/view/contract/datalist.html new file mode 100644 index 0000000..df7f8e3 --- /dev/null +++ b/app/contract/view/contract/datalist.html @@ -0,0 +1,258 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+
    +
  • 全部
  • +
  • 待我审批
  • +
  • 我已审批
  • +
+
+
+
+ {gt name="$is_auth" value="0"} +
+ + +
+ {else/} + {gt name="$is_leader" value="0"} +
+ + +
+ {/gt} + {/gt} +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/edit.html b/app/contract/view/contract/edit.html new file mode 100644 index 0000000..566686b --- /dev/null +++ b/app/contract/view/contract/edit.html @@ -0,0 +1,262 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑合同

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.types" value="2"}{include file="/contract/edit_product"}{/eq} + {eq name="$detail.types" value="3"}{include file="/contract/edit_service"}{/eq} + + + + + + + + + + + + + +
合同名称*合同性质{$detail.types_name}
签约主体(乙方)* + + 合同始止日期* +
+ +
+ ~ +
+ +
+
客户名称(甲方)* + {eq name="$is_customer" value="1"} + + {else/} + + {/eq} + + 签约客户代表*
客户联系地址客户联系电话
关联机会线索 + + +
合同金额* + {eq name="$detail.types" value="1"} + + {/eq} + {eq name="$detail.types" value="2"} + + {/eq} + {eq name="$detail.types" value="3"} + + {/eq} + 合同类别* + + 合同编号*
签订信息
合同签订人* + + + 合同所属部门* + + + 合同签订日期*
合同制定人 + + + 合同保管人 + + + 合同共享人员 + + +
相关附件
+ + +
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
备注信息
+
+ + + + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/edit_product.html b/app/contract/view/contract/edit_product.html new file mode 100644 index 0000000..dcd6b1f --- /dev/null +++ b/app/contract/view/contract/edit_product.html @@ -0,0 +1,135 @@ + + 产品信息 + 添加产品 + + + + + + + + + + + + + + + {empty name="$detail.content_array"} + + {eq name="is_product" value="1"} + + {else/} + + {/eq} + + + + + + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + {eq name="is_product" value="1"} + + {else/} + + {/eq} + + + + + + + + + {/volist} + {/empty} +
产品名称单位规格销售单价数量小计备注信息操作
删除
删除
+ + + \ No newline at end of file diff --git a/app/contract/view/contract/edit_service.html b/app/contract/view/contract/edit_service.html new file mode 100644 index 0000000..e29a3cb --- /dev/null +++ b/app/contract/view/contract/edit_service.html @@ -0,0 +1,127 @@ + + 服务信息 + 添加服务 + + + + + + + + + + + + + + {empty name="$detail.content_array"} + + {eq name="is_service" value="1"} + + {else/} + + {/eq} + + + + + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + {eq name="is_service" value="1"} + + {else/} + + {/eq} + + + + + + + + {/volist} + {/empty} +
服务名称服务周期服务单价服务次数小计备注信息操作
删除
删除
+ + + diff --git a/app/contract/view/contract/stoplist.html b/app/contract/view/contract/stoplist.html new file mode 100644 index 0000000..16a3a39 --- /dev/null +++ b/app/contract/view/contract/stoplist.html @@ -0,0 +1,177 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/view.html b/app/contract/view/contract/view.html new file mode 100644 index 0000000..4b4766b --- /dev/null +++ b/app/contract/view/contract/view.html @@ -0,0 +1,448 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+

合同详情

+ + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.chance"} + + + + + {/notempty} + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.types" value="2"}{include file="/contract/view_product"}{/eq} + {eq name="$detail.types" value="3"}{include file="/contract/view_service"}{/eq} + {notempty name="$detail.file_ids"} + + + + + + + {/notempty} + {notempty name="$detail.remark"} + + + + + + + {/notempty} + + {notempty name="$detail.invoice"} + + + + + + + {/notempty} + + {notempty name="$detail.income"} + + + + + + {/notempty} + + + + + + + + + + + {gt name="$detail.archive_time" value="0"} + + + + + + + + {else/} + + + + {/gt} + + {gt name="$detail.stop_time" value="0"} + + + + + + + + + + + + {/gt} + + {gt name="$detail.void_time" value="0"} + + + + + + + + + + + + {/gt} + + + + + +
合同名称{$detail.name}合同编号{$detail.code}
签约主体(乙方){$detail.subject_title}合同始止日期{$detail.start_time} 至 {$detail.end_time}
客户名称(甲方){$detail.customer}签约客户代表{$detail.contact_name}
客户联系地址{$detail.contact_address|default='-'}客户联系电话{$detail.contact_mobile|default='-'}
关联机会线索{$detail.chance} 详情
合同金额{$detail.cost}合同性质{$detail.types_name}合同类别{$detail.cate_title}
签订信息
合同签订人{$detail.sign_name}合同所属部门{$detail.sign_department}合同签订日期{$detail.sign_time}
合同制定人{$detail.prepared_name|default='-'}合同保管人{$detail.keeper_name|default='-'} 更改合同共享人员{$detail.share_names|default='-'} 更改
相关附件
+
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
备注信息
{$detail.remark}
申请开票记录『 已申请开票金额:{$detail.has_invoice} 元,未申请开票金额:{$detail.no_invoice} 元 』
+ + + + + + + + + + + + + {volist name="$detail.invoice" id="vo"} + + + + {eq name="$vo.open_status" value="1"} + + + + {else/} + + + + {/eq} + + + + + + {/volist} +
序号发票金额(元)发票状态发票号码发票日期回款状态申请人申请时间操作
{$vo.id}{$vo.amount}已开具{$vo.code}{$vo.open_time|date='Y-m-d'}未开具-- + {eq name="$vo.enter_status" value="0"}未回款{/eq} + {eq name="$vo.enter_status" value="1"}部分回款{/eq} + {eq name="$vo.enter_status" value="2"}全部回款{/eq} + {$vo.admin}{$vo.create_time | date='Y-m-d H:i:s'}详情
+
回款记录『 已回款金额:{$detail.has_income} 元,未回款金额:{$detail.no_income} 元 』 +
+ + + + + + + + + + {volist name="$detail.income" id="vo"} + + + + + + + + + {/volist} +
序号到帐金额(元)到账日期到账操作人操作时间操作
{$vo.id}{$vo.amount}{$vo.enter_time | date='Y-m-d'}{$vo.admin}{$vo.create_time | date='Y-m-d H:i:s'}详情
+
合同情况
录入人{$detail.admin_name} 录入时间{$detail.create_time}
归档状态 + 已归档 + {if ($auth == 1) } + 反确认归档 + {/if} + 归档人{$detail.archive_name} 归档时间{$detail.archive_time|date='Y-m-d H:i:s'}归档状态 + 未归档 + {if ($auth == 1) AND ($detail.check_status == 2) } + 确认归档 + {/if} +
中止人{$detail.stop_name}中止时间{$detail.stop_time|date='Y-m-d H:i:s'}反中止合同
中止备注{$detail.stop_remark|default='-'}
作废人{$detail.void_name}作废时间{$detail.void_time|date='Y-m-d H:i:s'}反作废合同
作废备注{$detail.void_remark|default='-'}
+
盖章合同文件
+
+
+
+ + {volist name="$detail.seal_array" id="vo"} +
{:file_card($vo)}
+ {/volist} +
+
+ +
+
    +
  • 审批信息
  • +
  • 操作记录
  • +
+
+
+ {if ($detail.stop_time == 0) AND ($detail.void_time == 0) } +
+ {/if} +
+
+ {include file="/contract/view_log" /} +
+
+
+
+{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/contract/view_log.html b/app/contract/view/contract/view_log.html new file mode 100644 index 0000000..33ed7b6 --- /dev/null +++ b/app/contract/view/contract/view_log.html @@ -0,0 +1,9 @@ +
+
+
+ \ No newline at end of file diff --git a/app/contract/view/contract/view_product.html b/app/contract/view/contract/view_product.html new file mode 100644 index 0000000..ead3df9 --- /dev/null +++ b/app/contract/view/contract/view_product.html @@ -0,0 +1,36 @@ + + 产品信息 + + + + + + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + + {/volist} + {/empty} +
产品名称单位规格销售单价数量小计备注信息
暂无产品信息
{$vo.product_title|default=''}{$vo.product_unit|default=''}{$vo.product_specs|default=''}{$vo.product_price|default='0.00'}{$vo.product_num|default='1'}{$vo.product_subtotal|default='0.00'}{$vo.product_remark|default=''}
+ + + diff --git a/app/contract/view/contract/view_service.html b/app/contract/view/contract/view_service.html new file mode 100644 index 0000000..22e4171 --- /dev/null +++ b/app/contract/view/contract/view_service.html @@ -0,0 +1,34 @@ + + 服务信息 + + + + + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + {/volist} + {/empty} +
服务名称服务周期服务单价服务次数小计备注信息
暂无服务信息
{$vo.service_title|default=''}{$vo.service_date|default=''}{$vo.service_price|default='0.00'}{$vo.service_num|default='1'}{$vo.service_subtotal|default='0.00'}{$vo.service_remark|default=''}
+ + + diff --git a/app/contract/view/contract/voidlist.html b/app/contract/view/contract/voidlist.html new file mode 100644 index 0000000..42f42e0 --- /dev/null +++ b/app/contract/view/contract/voidlist.html @@ -0,0 +1,177 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/product/add.html b/app/contract/view/product/add.html new file mode 100644 index 0000000..9347c5a --- /dev/null +++ b/app/contract/view/product/add.html @@ -0,0 +1,136 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增产品

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
产品名称*产品分类* + + 缩略图 +
+ +
+ + +
+
+
产品编码*产品单位*产品规格
销售价(元)*成本价(元)采购价(元)
是否实物* + + +
+
产品附件
+
+ +
+
+
+ +
+
产品描述* + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/product/datalist.html b/app/contract/view/product/datalist.html new file mode 100644 index 0000000..0e9d6e5 --- /dev/null +++ b/app/contract/view/product/datalist.html @@ -0,0 +1,180 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+
+

产品分类

+
+
+
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/product/edit.html b/app/contract/view/product/edit.html new file mode 100644 index 0000000..ae3a1a7 --- /dev/null +++ b/app/contract/view/product/edit.html @@ -0,0 +1,142 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑产品

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
产品名称*产品分类* + + 缩略图 +
+ +
+ + +
+
+
产品编码*产品单位*产品规格
销售价(元)*成本价(元)采购价(元)
是否实物* + + +
+
产品附件
+
+ +
+
+
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
产品描述* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/product/view.html b/app/contract/view/product/view.html new file mode 100644 index 0000000..fdfbfb3 --- /dev/null +++ b/app/contract/view/product/view.html @@ -0,0 +1,77 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

产品详情

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + + + +
产品名称{$detail.title}产品分类{$detail.cate}缩略图 +
+ +
+
产品编码{$detail.code}产品单位{$detail.unit}产品规格{$detail.specs}
销售价(元){$detail.sale_price}成本价(元){$detail.base_price}采购价(元){$detail.purchase_price}
是否实物 + {eq name="$detail.is_object" value="1"}是{/eq} + {eq name="$detail.is_object" value="2"}否{/eq} +
相关附件 +
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
产品描述
+ {$detail.content|raw} +
+ +
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/productcate/add.html b/app/contract/view/productcate/add.html new file mode 100644 index 0000000..65e0221 --- /dev/null +++ b/app/contract/view/productcate/add.html @@ -0,0 +1,91 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

产品分类

+ {eq name="$id" value="0"} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {else/} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/productcate/datalist.html b/app/contract/view/productcate/datalist.html new file mode 100644 index 0000000..a6d7e50 --- /dev/null +++ b/app/contract/view/productcate/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+ +
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/add.html b/app/contract/view/purchase/add.html new file mode 100644 index 0000000..42e285e --- /dev/null +++ b/app/contract/view/purchase/add.html @@ -0,0 +1,227 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增采购合同

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$types" value="2"}{include file="/purchase/add_purchased"}{/eq} + {eq name="$types" value="3"}{include file="/purchase/add_service"}{/eq} + + + + + + + + + + + + + +
合同名称*合同性质 + + {eq name="$types" value="1" }普通采购{/eq} + {eq name="$types" value="2" }物品采购{/eq} + {eq name="$types" value="3" }服务采购{/eq} +
签约主体(甲方)* + + 合同始止日期* +
+ +
+ ~ +
+ +
+
供应商名称(乙方)* + {eq name="$is_supplier" value="1"} + + {else/} + + {/eq} + + 签约供应商代表*
供应商联系地址供应商联系电话
合同金额* + {eq name="$types" value="1"} + + {/eq} + {eq name="$types" value="2"} + + {/eq} + {eq name="$types" value="3"} + + {/eq} + 合同类别* + + 合同编号*
签订信息
合同签订人* + + + 合同所属部门* + + + 合同签订日期*
合同制定人 + + + 合同保管人 + + + 合同共享人员 + + +
相关附件
+ + +
+ +
+
备注信息
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/add_purchased.html b/app/contract/view/purchase/add_purchased.html new file mode 100644 index 0000000..dde875b --- /dev/null +++ b/app/contract/view/purchase/add_purchased.html @@ -0,0 +1,116 @@ + + 物品信息 + 添加物品 + + + + + + + + + + + + + + + + {eq name="is_purchased" value="1"} + + {else/} + + {/eq} + + + + + + + + +
物品名称单位规格采购单价数量小计备注信息操作
删除
+ + + diff --git a/app/contract/view/purchase/add_service.html b/app/contract/view/purchase/add_service.html new file mode 100644 index 0000000..9a55d19 --- /dev/null +++ b/app/contract/view/purchase/add_service.html @@ -0,0 +1,82 @@ + + 服务信息 + 添加服务 + + + + + + + + + + + + + + + + + + + + + + +
服务名称服务周期服务单价服务次数小计备注信息操作
删除
+ + + diff --git a/app/contract/view/purchase/add_types.html b/app/contract/view/purchase/add_types.html new file mode 100644 index 0000000..4539a28 --- /dev/null +++ b/app/contract/view/purchase/add_types.html @@ -0,0 +1,34 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增合同

+ + + + + + + +
选择合同性质
+ +
+
+{/block} +{block name="copyright"}{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/archivelist.html b/app/contract/view/purchase/archivelist.html new file mode 100644 index 0000000..c4aec0f --- /dev/null +++ b/app/contract/view/purchase/archivelist.html @@ -0,0 +1,178 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/datalist.html b/app/contract/view/purchase/datalist.html new file mode 100644 index 0000000..0a83261 --- /dev/null +++ b/app/contract/view/purchase/datalist.html @@ -0,0 +1,256 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+
    +
  • 全部
  • +
  • 待我审批
  • +
  • 我已审批
  • +
+
+
+
+ {gt name="$is_auth" value="0"} +
+ + +
+ {else/} + {gt name="$is_leader" value="0"} +
+ + +
+ {/gt} + {/gt} +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/edit.html b/app/contract/view/purchase/edit.html new file mode 100644 index 0000000..c6a4437 --- /dev/null +++ b/app/contract/view/purchase/edit.html @@ -0,0 +1,228 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑采购合同

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.types" value="2"}{include file="/purchase/edit_purchased"}{/eq} + {eq name="$detail.types" value="3"}{include file="/purchase/edit_service"}{/eq} + + + + + + + + + + + + + +
合同名称*合同性质{$detail.types_name}
签约主体(甲方)* + + 合同始止日期* +
+ +
+ ~ +
+ +
+
供应商名称(乙方)* + {eq name="$is_supplier" value="1"} + + {else/} + + {/eq} + + 签约供应商代表*
供应商联系地址供应商联系电话
合同金额* + {eq name="$detail.types" value="1"} + + {/eq} + {eq name="$detail.types" value="2"} + + {/eq} + {eq name="$detail.types" value="3"} + + {/eq} + 合同类别* + + 合同编号*
签订信息
合同签订人* + + + 合同所属部门* + + + 合同签订日期*
合同制定人 + + + 合同保管人 + + + 合同共享人员 + + +
相关附件
+ + +
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
备注信息
+
+ + + + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/edit_purchased.html b/app/contract/view/purchase/edit_purchased.html new file mode 100644 index 0000000..828bce8 --- /dev/null +++ b/app/contract/view/purchase/edit_purchased.html @@ -0,0 +1,135 @@ + + 物品信息 + 添加物品 + + + + + + + + + + + + + + + {empty name="$detail.content_array"} + + {eq name="is_purchased" value="1"} + + {else/} + + {/eq} + + + + + + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + {eq name="is_purchased" value="1"} + + {else/} + + {/eq} + + + + + + + + + {/volist} + {/empty} +
物品名称单位规格采购单价数量小计备注信息操作
删除
删除
+ + + diff --git a/app/contract/view/purchase/edit_service.html b/app/contract/view/purchase/edit_service.html new file mode 100644 index 0000000..7c06a3a --- /dev/null +++ b/app/contract/view/purchase/edit_service.html @@ -0,0 +1,96 @@ + + 服务信息 + 添加服务 + + + + + + + + + + + + + + {empty name="$detail.content_array"} + + + + + + + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + + {/volist} + {/empty} +
服务名称服务周期服务单价服务次数小计备注信息操作
删除
删除
+ + + diff --git a/app/contract/view/purchase/stoplist.html b/app/contract/view/purchase/stoplist.html new file mode 100644 index 0000000..6a91f28 --- /dev/null +++ b/app/contract/view/purchase/stoplist.html @@ -0,0 +1,177 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/view.html b/app/contract/view/purchase/view.html new file mode 100644 index 0000000..19dce9e --- /dev/null +++ b/app/contract/view/purchase/view.html @@ -0,0 +1,441 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+

采购合同详情

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.types" value="2"}{include file="/purchase/view_purchased"}{/eq} + {eq name="$detail.types" value="3"}{include file="/purchase/view_service"}{/eq} + {notempty name="$detail.file_ids"} + + + + + + + {/notempty} + {notempty name="$detail.remark"} + + + + + + + {/notempty} + + {notempty name="$detail.ticket"} + + + + + + + {/notempty} + + {notempty name="$detail.payment"} + + + + + + {/notempty} + + + + + + + + + + + {gt name="$detail.archive_time" value="0"} + + + + + + + + {else/} + + + + {/gt} + + {gt name="$detail.stop_time" value="0"} + + + + + + + + + + + + {/gt} + + {gt name="$detail.void_time" value="0"} + + + + + + + + + + + + {/gt} + + + + + +
合同名称{$detail.name}合同编号{$detail.code}
签约主体(甲方){$detail.subject_title}合同始止日期{$detail.start_time} 至 {$detail.end_time}
供应商名称(乙方){$detail.supplier}签约供应商代表{$detail.contact_name}
供应商联系地址{$detail.contact_address|default='-'}供应商联系电话{$detail.contact_mobile|default='-'}
合同金额{$detail.cost}合同性质{$detail.types_name}合同类别{$detail.cate_title}
签订信息
合同签订人{$detail.sign_name}合同所属部门{$detail.sign_department}合同签订日期{$detail.sign_time}
合同制定人{$detail.prepared_name|default='-'}合同保管人{$detail.keeper_name|default='-'} 更改合同共享人员{$detail.share_names|default='-'} 更改
相关附件
+
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
备注信息
{$detail.remark}
申请收票记录『 已申请收票金额:{$detail.has_ticket} 元,未申请收票金额:{$detail.no_ticket} 元 』
+ + + + + + + + + + + + + {volist name="$detail.ticket" id="vo"} + + + + {eq name="$vo.open_status" value="1"} + + + + {else/} + + + + {/eq} + + + + + + {/volist} +
序号发票金额(元)发票状态发票号码发票日期付款状态申请人申请时间操作
{$vo.id}{$vo.amount}已开具{$vo.code}{$vo.open_time|date='Y-m-d'}未开具-- + {eq name="$vo.pay_status" value="0"}未付款{/eq} + {eq name="$vo.pay_status" value="1"}部分付款{/eq} + {eq name="$vo.pay_status" value="2"}全部付款{/eq} + {$vo.admin}{$vo.create_time | date='Y-m-d H:i:s'}详情
+
付款记录『 已付款金额:{$detail.has_payment} 元,未付款金额:{$detail.no_payment} 元 』 +
+ + + + + + + + + + {volist name="$detail.payment" id="vo"} + + + + + + + + + {/volist} +
序号付款金额(元)付款日期付款操作人操作时间操作
{$vo.id}{$vo.amount}{$vo.pay_time | date='Y-m-d'}{$vo.admin}{$vo.create_time | date='Y-m-d H:i:s'}详情
+
合同情况
录入人{$detail.admin_name} 录入时间{$detail.create_time}
归档状态 + 已归档 + {if ($auth == 1) } + 反确认归档 + {/if} + 归档人{$detail.archive_name} 归档时间{$detail.archive_time|date='Y-m-d H:i:s'}归档状态 + 未归档 + {if ($auth == 1) AND ($detail.check_status == 2) } + 确认归档 + {/if} +
中止人{$detail.stop_name}中止时间{$detail.stop_time|date='Y-m-d H:i:s'}反中止合同
中止备注{$detail.stop_remark|default='-'}
作废人{$detail.void_name}作废时间{$detail.void_time|date='Y-m-d H:i:s'}反作废合同
作废备注{$detail.void_remark|default='-'}
+
盖章合同文件
+
+
+
+ + {volist name="$detail.seal_array" id="vo"} +
{:file_card($vo)}
+ {/volist} +
+
+
+
    +
  • 审批信息
  • +
  • 操作记录
  • +
+
+
+ {if ($detail.stop_time == 0) AND ($detail.void_time == 0) } +
+ {/if} +
+
+ {include file="/purchase/view_log" /} +
+
+
+
+{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchase/view_log.html b/app/contract/view/purchase/view_log.html new file mode 100644 index 0000000..baeb54c --- /dev/null +++ b/app/contract/view/purchase/view_log.html @@ -0,0 +1,9 @@ +
+
+
+ \ No newline at end of file diff --git a/app/contract/view/purchase/view_purchased.html b/app/contract/view/purchase/view_purchased.html new file mode 100644 index 0000000..f4ea06f --- /dev/null +++ b/app/contract/view/purchase/view_purchased.html @@ -0,0 +1,36 @@ + + 物品信息 + + + + + + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + + {/volist} + {/empty} +
物品名称单位规格采购单价数量小计备注信息
暂无物品信息
{$vo.purchased_title|default=''}{$vo.purchased_unit|default=''}{$vo.purchased_specs|default=''}{$vo.purchased_price|default='0.00'}{$vo.purchased_num|default='1'}{$vo.purchased_subtotal|default='0.00'}{$vo.purchased_remark|default=''}
+ + + diff --git a/app/contract/view/purchase/view_service.html b/app/contract/view/purchase/view_service.html new file mode 100644 index 0000000..22e4171 --- /dev/null +++ b/app/contract/view/purchase/view_service.html @@ -0,0 +1,34 @@ + + 服务信息 + + + + + + + + + + + + + {empty name="$detail.content_array"} + + + + {else/} + {volist name="$detail.content_array" id="vo"} + + + + + + + + + {/volist} + {/empty} +
服务名称服务周期服务单价服务次数小计备注信息
暂无服务信息
{$vo.service_title|default=''}{$vo.service_date|default=''}{$vo.service_price|default='0.00'}{$vo.service_num|default='1'}{$vo.service_subtotal|default='0.00'}{$vo.service_remark|default=''}
+ + + diff --git a/app/contract/view/purchase/voidlist.html b/app/contract/view/purchase/voidlist.html new file mode 100644 index 0000000..33f4af1 --- /dev/null +++ b/app/contract/view/purchase/voidlist.html @@ -0,0 +1,177 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchased/add.html b/app/contract/view/purchased/add.html new file mode 100644 index 0000000..60fcd0b --- /dev/null +++ b/app/contract/view/purchased/add.html @@ -0,0 +1,130 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增采购品

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
采购品名称*采购品分类* + + 缩略图 +
+ +
+ + +
+
+
采购品编码*单位*规格
采购价(元)*是否实物* + + +
+
采购品附件
+
+ +
+
+
+ +
+
采购品描述* + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchased/datalist.html b/app/contract/view/purchased/datalist.html new file mode 100644 index 0000000..05dbf79 --- /dev/null +++ b/app/contract/view/purchased/datalist.html @@ -0,0 +1,178 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+
+

采购品分类

+
+
+
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchased/edit.html b/app/contract/view/purchased/edit.html new file mode 100644 index 0000000..d8050a5 --- /dev/null +++ b/app/contract/view/purchased/edit.html @@ -0,0 +1,136 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑采购品

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
采购品名称*采购品分类* + + 缩略图 +
+ +
+ + +
+
+
采购品编码*单位*规格
采购价(元)是否实物* + + +
+
采购品附件
+
+ +
+
+
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
采购品描述* + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchased/view.html b/app/contract/view/purchased/view.html new file mode 100644 index 0000000..22deda7 --- /dev/null +++ b/app/contract/view/purchased/view.html @@ -0,0 +1,71 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

采购品详情

+ + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + + + +
采购品名称{$detail.title}采购品分类{$detail.cate}缩略图 +
+ +
+
采购品编码{$detail.code}单位{$detail.unit}规格{$detail.specs}
采购价(元){$detail.purchase_price}是否实物 + {eq name="$detail.is_object" value="1"}是{/eq} + {eq name="$detail.is_object" value="2"}否{/eq} +
相关附件 +
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
采购品描述
+ {$detail.content|raw} +
+ +
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchasedcate/add.html b/app/contract/view/purchasedcate/add.html new file mode 100644 index 0000000..279ce2d --- /dev/null +++ b/app/contract/view/purchasedcate/add.html @@ -0,0 +1,91 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

采购品分类

+ {eq name="$id" value="0"} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {else/} + + + + + + + + + + + + + +
父级分类* + + 分类名称* + + 排序 + +
描述
+ {/eq} +
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/purchasedcate/datalist.html b/app/contract/view/purchasedcate/datalist.html new file mode 100644 index 0000000..4c30a11 --- /dev/null +++ b/app/contract/view/purchasedcate/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+ +
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/services/add.html b/app/contract/view/services/add.html new file mode 100644 index 0000000..1becf97 --- /dev/null +++ b/app/contract/view/services/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

服务内容

+ + + + + + + + + + + +
服务内容*
费用(元)*排序
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/services/datalist.html b/app/contract/view/services/datalist.html new file mode 100644 index 0000000..f5d8fd0 --- /dev/null +++ b/app/contract/view/services/datalist.html @@ -0,0 +1,98 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/supplier/add.html b/app/contract/view/supplier/add.html new file mode 100644 index 0000000..066bdf5 --- /dev/null +++ b/app/contract/view/supplier/add.html @@ -0,0 +1,92 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增供应商

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
供应商名称*供应商电话
供应商地址供应商邮箱
供应商简介
+
相关附件
+
+ +
+
+
+ +
+
首要联系人信息
联 系 人联系电话性别 + + +
+
+ + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/supplier/contact_add.html b/app/contract/view/supplier/contact_add.html new file mode 100644 index 0000000..ae307bf --- /dev/null +++ b/app/contract/view/supplier/contact_add.html @@ -0,0 +1,74 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增联系人

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
供应商名称{$supplier_name}
联系人姓名*联系电话*性别* + + +
微 信 号QQ号码电子邮箱
称谓部门职务
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/supplier/contact_edit.html b/app/contract/view/supplier/contact_edit.html new file mode 100644 index 0000000..82bedeb --- /dev/null +++ b/app/contract/view/supplier/contact_edit.html @@ -0,0 +1,74 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑联系人

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
供应商名称{$detail.supplier}
联系人姓名*联系电话*性别* + + +
微 信 号QQ号码电子邮箱
称谓部门职务
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/supplier/datalist.html b/app/contract/view/supplier/datalist.html new file mode 100644 index 0000000..12299af --- /dev/null +++ b/app/contract/view/supplier/datalist.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +
+
+ + +
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/supplier/edit.html b/app/contract/view/supplier/edit.html new file mode 100644 index 0000000..0d75c1d --- /dev/null +++ b/app/contract/view/supplier/edit.html @@ -0,0 +1,76 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑供应商

+ + + + + + + + + + + + + + + + + + + + + +
供应商名称*供应商电话
供应商地址供应商邮箱
供应商简介
+
相关附件
+
+ +
+
+
+ + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} +
+
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/supplier/view.html b/app/contract/view/supplier/view.html new file mode 100644 index 0000000..dcf85a7 --- /dev/null +++ b/app/contract/view/supplier/view.html @@ -0,0 +1,141 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

供应商详情

+ + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + + + +
供应商名称{$detail.title}供应商电话{$detail.phone}
供应商地址{$detail.address}供应商邮箱{$detail.email}
供应商简介{$detail.content}
+
相关附件
+
+
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
联系人信息+ 新增联系人
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/suppliercontact/add.html b/app/contract/view/suppliercontact/add.html new file mode 100644 index 0000000..ce94424 --- /dev/null +++ b/app/contract/view/suppliercontact/add.html @@ -0,0 +1,90 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增联系人

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
供应商名称{$supplier_name}
姓名* + + 联系电话* + + 性别* + + +
微 信 号 + + QQ号码 + + 电子邮箱 + +
称谓 + + 部门 + + 职务 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/contract/view/suppliercontact/edit.html b/app/contract/view/suppliercontact/edit.html new file mode 100644 index 0000000..e839731 --- /dev/null +++ b/app/contract/view/suppliercontact/edit.html @@ -0,0 +1,90 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑联系人

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
供应商名称{$detail.supplier}
姓名* + + 联系电话* + + 性别* + + +
微 信 号 + + QQ号码 + + 电子邮箱 + +
称谓 + + 部门 + + 职务 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/command/Crud.php b/app/crud/command/Crud.php new file mode 100644 index 0000000..b6b29f5 --- /dev/null +++ b/app/crud/command/Crud.php @@ -0,0 +1,119 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\crud\command; + +use think\console\Command; +use think\console\Input; +use think\console\input\Option; +use think\console\Output; + +class Crud extends Command +{ + protected function configure() + { + $this->setName('auto crud') + ->addOption('name', 'a', Option::VALUE_OPTIONAL, 'the name', null) + ->addOption('module', 'm', Option::VALUE_OPTIONAL, 'the module name', null) + ->addOption('table', 't', Option::VALUE_OPTIONAL, 'the table name', null) + ->addOption('controller', 'c', Option::VALUE_OPTIONAL, 'the controller name', null) + ->addOption('types', 'y', Option::VALUE_OPTIONAL, 'the types name', null) + ->setDescription('auto make crud file'); + } + + protected function execute(Input $input, Output $output) + { + $name = $input->getOption('name'); + if (!$name) { + $output->error("请输入 -na 名称"); + exit; + } + + $module = $input->getOption('module'); + if (!$module) { + $output->error("请输入 -m 模块名"); + exit; + } + + $table = $input->getOption('table'); + if (!$table) { + $output->error("请输入 -t 表名"); + exit; + } + + $controller = $input->getOption('controller'); + if (!$controller) { + $output->error("请输入 -c 控制器名"); + exit; + } + + $types = $input->getOption('types'); + if (!$types) { + $types = 1; + } + + $this->make($name,$module,$table,$controller,$types); + + $output->info($name . "crud make success"); + } + + public function make($name,$module,$model,$controller,$types) + { + !defined('DS') && define('DS', DIRECTORY_SEPARATOR); + // 使用DS常量和rtrim确保路径格式正确 + $crud_dir = rtrim(CMS_ROOT, DS) . DS . 'crud' . DS; + + // 统一使用DS常量拼接路径 + $dirs = ['view', 'controller', 'model', 'validate']; + foreach($dirs as $dir) { + $targetDir = $crud_dir . $dir; + if (!is_dir($targetDir)) { + mkdir($targetDir, 0755, true); + } + } + + $Bmodel = ucfirst(camelize($model)); + $Bcontroller = ucfirst(camelize($controller)); + + // 修正路径定义,统一使用DS分隔符 + $crud = [ + ['name'=>'add','path'=>'view' . DS . $controller,'filename'=>'add.html'], + ['name'=>'list','path'=>'view' . DS . $controller,'filename'=>'datalist.html'], + ['name'=>'view','path'=>'view' . DS . $controller,'filename'=>'view.html'], + ['name'=>'controller','path'=>'controller','filename'=>$Bcontroller.'.php'], + ['name'=>'model','path'=>'model','filename'=>$Bmodel.'.php'], + ['name'=>'validate','path'=>'validate','filename'=>$Bcontroller.'Validate.php'], + ]; + + foreach($crud as $k => $v){ + $tpl = dirname(__DIR__) . DS . 'tpl' . DS . $types . DS . $v['name'] . '.tpl'; + + $tplContent = file_get_contents($tpl); + $tplContent = str_replace('', $module, $tplContent); + $tplContent = str_replace('', $controller, $tplContent); + $tplContent = str_replace('', $Bcontroller, $tplContent); + $tplContent = str_replace('', $model, $tplContent); + $tplContent = str_replace('', $Bmodel, $tplContent); + $tplContent = str_replace('', $name, $tplContent); + + $targetPath = $crud_dir . $v['path']; + if (!is_dir($targetPath)) { + mkdir($targetPath, 0755, true); + } + + // 修正文件保存路径 + $filePath = $targetPath . DS . $v['filename']; + file_put_contents($filePath, $tplContent); + } + } +} \ No newline at end of file diff --git a/app/crud/controller/Crud.php b/app/crud/controller/Crud.php new file mode 100644 index 0000000..818dbe2 --- /dev/null +++ b/app/crud/controller/Crud.php @@ -0,0 +1,51 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\crud\controller; + +use app\api\BaseController; +use think\facade\Console; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Crud extends BaseController +{ + public function index() + { + return view(); + } + + //一键crud + public function crud() + { + $uid = $this->uid; + if($uid!=1){ + return to_assign(1,'只有系统超级管理员才有权限使用一键crud功能!'); + } + $param = get_params(); + $a = '-a'.$param['name']; + $m = '-m'.$param['module']; + $t = '-t'.$param['table']; + $c = '-c'.$param['controller']; + $y = '-y'.$param['types']; + try { + $output = Console::call('crud', [$a,$m,$t,$c,$y]); + //return $output->fetch(); + } catch(\Exception $e) { + return to_assign(1, $e->getMessage()); + } + } +} diff --git a/app/crud/tpl/1/add.tpl b/app/crud/tpl/1/add.tpl new file mode 100644 index 0000000..ae3d37a --- /dev/null +++ b/app/crud/tpl/1/add.tpl @@ -0,0 +1,69 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

+ + + + + + + + + + + + + +
名称*父级分类* + {empty name="$detail"} + + {else/} + + {/empty} + 排序
描述
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/tpl/1/controller.tpl b/app/crud/tpl/1/controller.tpl new file mode 100644 index 0000000..7cd2f4d --- /dev/null +++ b/app/crud/tpl/1/controller.tpl @@ -0,0 +1,175 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\\controller; + +use app\base\BaseController; +use app\\model\ as Model; +use app\\validate\Validate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new Model(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 子分类 + * $id + * $is_self=1包含自己 + */ + public function sonlist($id = 0, $is_self = 1) + { + $cates = $this->model->where('delete_time',0)->order('sort asc')->select()->toArray(); + $cates_list = get_data_node($cates, $id); + $cates_array = array_column($cates_list, 'id'); + if ($is_self == 1) { + //包括自己在内 + $cates_array[] = $id; + } + return $cates_array; + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(Validate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $cate_array = $this->sonlist($param['id']); + if (in_array($param['pid'], $cate_array)) { + return to_assign(1, '上级分类不能是该分类本身或其子分类'); + } + $this->model->edit($param); + } else { + try { + validate(Validate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + View::assign('pid', $pid); + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $count_cate = $this->model->where(["pid"=>$id,"delete_time"=>0])->count(); + if ($count_cate > 0) { + return to_assign(1, "该分类下还有子分类,无法删除"); + } + $count_list = 0; + if ($count_list > 0) { + return to_assign(1, "该分类下还有内容,无法删除"); + } + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + if($param['status'] == 0){ + $count_cate = $this->model->where(["pid"=>$param['id'],"delete_time"=>0])->count(); + if ($count_cate > 0) { + return to_assign(1, "该分类下还有子分类,无法禁用"); + } + $count_list = 0; + if ($count_list > 0) { + return to_assign(1, "该分类下还有内容,无法禁用"); + } + $this->model->strict(false)->field('id,status')->update($param); + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + $res = $this->model->strict(false)->field('id,status')->update($param); + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/crud/tpl/1/list.tpl b/app/crud/tpl/1/list.tpl new file mode 100644 index 0000000..4e02bce --- /dev/null +++ b/app/crud/tpl/1/list.tpl @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ +
+
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/tpl/1/model.tpl b/app/crud/tpl/1/model.tpl new file mode 100644 index 0000000..17518ba --- /dev/null +++ b/app/crud/tpl/1/model.tpl @@ -0,0 +1,115 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\\model; +use think\model; +use think\facade\Db; +class extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/crud/tpl/1/validate.tpl b/app/crud/tpl/1/validate.tpl new file mode 100644 index 0000000..d3893f9 --- /dev/null +++ b/app/crud/tpl/1/validate.tpl @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\\validate; +use think\Validate; +use think\facade\Db; + +class Validate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/crud/tpl/1/view.tpl b/app/crud/tpl/1/view.tpl new file mode 100644 index 0000000..2cd83b5 --- /dev/null +++ b/app/crud/tpl/1/view.tpl @@ -0,0 +1,26 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

详情

+ + + + + + + + + + + + + +
名称{$detail.title|default=''}">父级分类 + {volist name=":set_recursion(get_())" id="v"} + {eq name="$detail.pid" value="$v.id" }{$v.title}{/eq} + {/volist} + 排序{$detail.sort|default=0}
描述{$detail.desc|default=''}
+
+{/block} + \ No newline at end of file diff --git a/app/crud/tpl/2/add.tpl b/app/crud/tpl/2/add.tpl new file mode 100644 index 0000000..c5534b9 --- /dev/null +++ b/app/crud/tpl/2/add.tpl @@ -0,0 +1,45 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

+ + + + + + + +
名称*排序
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/tpl/2/controller.tpl b/app/crud/tpl/2/controller.tpl new file mode 100644 index 0000000..f07cf75 --- /dev/null +++ b/app/crud/tpl/2/controller.tpl @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\\controller; + +use app\base\BaseController; +use app\\model\ as Model; +use app\\validate\Validate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new Model(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(Validate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(Validate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/crud/tpl/2/list.tpl b/app/crud/tpl/2/list.tpl new file mode 100644 index 0000000..9243b58 --- /dev/null +++ b/app/crud/tpl/2/list.tpl @@ -0,0 +1,125 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/tpl/2/model.tpl b/app/crud/tpl/2/model.tpl new file mode 100644 index 0000000..be7945d --- /dev/null +++ b/app/crud/tpl/2/model.tpl @@ -0,0 +1,114 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\\model; +use think\model; +use think\facade\Db; +class extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + })->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/crud/tpl/2/validate.tpl b/app/crud/tpl/2/validate.tpl new file mode 100644 index 0000000..d3893f9 --- /dev/null +++ b/app/crud/tpl/2/validate.tpl @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\\validate; +use think\Validate; +use think\facade\Db; + +class Validate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/crud/tpl/2/view.tpl b/app/crud/tpl/2/view.tpl new file mode 100644 index 0000000..b522971 --- /dev/null +++ b/app/crud/tpl/2/view.tpl @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

详情

+ + + + + + + +
名称{$detail.title|default=''}">排序{$detail.sort|default=0}
+
+{/block} + \ No newline at end of file diff --git a/app/crud/tpl/3/add.tpl b/app/crud/tpl/3/add.tpl new file mode 100644 index 0000000..5ce9bf3 --- /dev/null +++ b/app/crud/tpl/3/add.tpl @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

+ + + + + + + + + + + +
名称*排序
描述
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/tpl/3/controller.tpl b/app/crud/tpl/3/controller.tpl new file mode 100644 index 0000000..f2e5fb6 --- /dev/null +++ b/app/crud/tpl/3/controller.tpl @@ -0,0 +1,122 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\\controller; + +use app\base\BaseController; +use app\\model\ as Model; +use app\\validate\Validate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new Model(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $whereOr=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(Validate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(Validate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/crud/tpl/3/list.tpl b/app/crud/tpl/3/list.tpl new file mode 100644 index 0000000..c8e3d08 --- /dev/null +++ b/app/crud/tpl/3/list.tpl @@ -0,0 +1,87 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/tpl/3/model.tpl b/app/crud/tpl/3/model.tpl new file mode 100644 index 0000000..bd2f17f --- /dev/null +++ b/app/crud/tpl/3/model.tpl @@ -0,0 +1,121 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\\model; +use think\model; +use think\facade\Db; +class extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + //$item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name'); + //$item['create_time'] = to_date($item['create_time']); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + //$info['file_array'] = Db::name('File')->where([['id','in',$info['file_ids']]])->select()->toArray(); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/crud/tpl/3/validate.tpl b/app/crud/tpl/3/validate.tpl new file mode 100644 index 0000000..d3893f9 --- /dev/null +++ b/app/crud/tpl/3/validate.tpl @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\\validate; +use think\Validate; +use think\facade\Db; + +class Validate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/crud/tpl/3/view.tpl b/app/crud/tpl/3/view.tpl new file mode 100644 index 0000000..ff73f8a --- /dev/null +++ b/app/crud/tpl/3/view.tpl @@ -0,0 +1,32 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

详情

+ + + + + + + + + + + +
名称{$detail.title|default=''}排序{$detail.sort|default=0}
描述{$detail.desc|default=''}
+
+{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/crud/view/crud/index.html b/app/crud/view/crud/index.html new file mode 100644 index 0000000..01d6b42 --- /dev/null +++ b/app/crud/view/crud/index.html @@ -0,0 +1,66 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

一键CRUD信息

+ + + + + + + + + + + + + + + + + + + +
使用说明勾股OA系统自带的一键CRUD功能没教程,这个功能是我们内部为了提高日常开发效率开发的简单工具,本来不打算放出来的,但是想想也没啥秘密,就干脆不屏蔽了的。 +
有开发能力的人就用起来,没开发能力的当着该功能不存在就行,不影响系统的使用的。如果需要教学的,请加微信号【hdm588】付费咨询或教学。
中文名称模板类型 + + + +
模块名称控制器名称数据表名称
+
+ + +
+
+{/block} + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/app/customer/common.php b/app/customer/common.php new file mode 100644 index 0000000..143ed4a --- /dev/null +++ b/app/customer/common.php @@ -0,0 +1,71 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +/** +====================== + *模块数据获取公共文件 +====================== + */ +use think\facade\Db; + +//客户查看编辑数据权限判断 +function customer_auth($uid,$customer_id) +{ + $customer = Db::name('Customer')->where(['id' => $customer_id])->find(); + if($customer['belong_uid']==0){ + return $customer; + } + //是否是客户管理员 + $auth = isAuth($uid,'customer_admin','conf_1'); + $role= 0; + if($auth==1){ + //可见部门数据 + $dids = get_role_departments($uid); + if(in_array($customer['belong_did'],$dids)){ + $role= 1; + } + } + else if($auth==0){ + $auth_array=[]; + if(!empty($customer['share_ids'])){ + $share_ids = explode(",",$customer['share_ids']); + $auth_array = array_merge($auth_array,$share_ids); + } + array_push($auth_array,$customer['belong_uid']); + //部门负责人 + $dids = get_leader_departments($uid); + if(in_array($uid,$auth_array) || in_array($customer['belong_did'],$dids)){ + $role= 1; + } + } + if($role == 0){ + throw new \think\exception\HttpException(405, '无权限访问'); + } + else{ + return $customer; + } +} + +//读取联系人 +function customer_contact($cid) +{ + $contact = Db::name('CustomerContact')->where(['delete_time' => 0,'cid'=>$cid])->select()->toArray(); + return $contact; +} + +//读取销售机会 +function customer_chance($cid) +{ + $chance = Db::name('CustomerChance')->where(['delete_time' => 0,'cid'=>$cid])->select()->toArray(); + return $chance; +} \ No newline at end of file diff --git a/app/customer/controller/Api.php b/app/customer/controller/Api.php new file mode 100644 index 0000000..bfab030 --- /dev/null +++ b/app/customer/controller/Api.php @@ -0,0 +1,251 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\customer\controller; + +use app\api\BaseController; +use app\customer\model\Customer; +use app\customer\model\CustomerTrace; +use app\customer\model\CustomerContact; +use app\customer\model\CustomerChance; +use think\facade\Db; +use think\facade\View; + +class Api extends BaseController +{ + //获取客户列表 + public function get_customer() + { + $param = get_params(); + $uid = $this->uid; + $where = array(); + $whereOr = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|name', 'like', '%' . $param['keywords'] . '%']; + } + $where[]=['delete_time','=',0]; + $where[]=['discard_time','=',0]; + + if (!empty($param['uid'])) { + $where[] = ['belong_uid', '=', $param['uid']]; + } + else{ + //是否是客户管理员 + $auth = isAuth($uid,'customer_admin','conf_1'); + if($auth == 0){ + $whereOr[] = ['belong_uid','=',$uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['belong_did','in',$dids]; + } + } + } + + $model = new Customer(); + $list = $model->datalist($param,$where,$whereOr); + table_assign(0, '', $list); + } + //分配客户 + public function distribute() + { + if (request()->isAjax()) { + $params = get_params(); + //是否是客户管理员 + $auth = isAuth($this->uid,'customer_admin','conf_1'); + if($auth==0){ + return to_assign(1, "只有客户管理员才有权限操作"); + } + $data['id'] = $params['id']; + $data['belong_uid'] = $params['uid']; + $data['belong_did'] = $params['did']; + $data['distribute_time'] = time(); + if (Db::name('Customer')->update($data) !== false) { + add_log('allot', $data['id'],[],'客户'); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //锁住、解锁客户 + public function customer_lock() + { + if (request()->isAjax()) { + $params = get_params(); + //是否是客户管理员 + $auth = isAuth($this->uid,'customer_admin','conf_1'); + if($auth==0){ + return to_assign(1, "只有客户管理员才有权限操作"); + } + $data['id'] = $params['id']; + $data['is_lock'] = $params['is_lock']; + if (Db::name('Customer')->update($data) !== false) { + if($data['is_lock']==1){ + add_log('lock', $data['id'],[],'客户'); + } + else{ + add_log('unlock', $data['id'],[],'客户'); + } + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + + //彻底删除客户 + public function delete() + { + if (request()->isDelete()) { + $params = get_params(); + //是否是客户管理员 + $auth = isAuth($this->uid,'customer_admin','conf_1'); + if($auth==0){ + return to_assign(1, "只有客户管理员才有权限操作"); + } + $data['id'] = $params['id']; + $data['delete_time'] = -1; + if (Db::name('Customer')->update($data) !== false) { + //删除客户联系人 + Db::name('CustomerContact')->where(['cid' => $params['id']])->update(['delete_time'=>time()]); + //删除客户机会 + Db::name('CustomerChance')->where(['cid' => $params['id']])->update(['delete_time'=>time()]); + add_log('delete', $params['id']); + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //跟进记录列表 + public function get_trace() + { + $param = get_params(); + $where = array(); + $where[] = ['a.delete_time', '=', 0]; + $where[] = ['a.cid', '=', $param['cid']]; + $model = new CustomerTrace(); + $list = $model->datalist($param,$where); + return table_assign(0, '', $list); + } + + //销售机会列表 + public function get_chance() + { + $param = get_params(); + $where = array(); + $where[] = ['a.delete_time', '=', 0]; + $where[] = ['a.cid', '=', $param['cid']]; + if (!empty($param['keywords'])) { + $where[] = ['a.title|a.content', 'like', '%' . $param['keywords'] . '%']; + } + $model = new CustomerChance(); + $list = $model->datalist($param,$where); + return table_assign(0, '', $list); + } + + //获取联系人数据 + public function get_contact() + { + $param = get_params(); + $where = array(); + $where[] = ['delete_time', '=', 0]; + $where[] = ['cid', '=', $param['cid']]; + $model = new CustomerContact(); + $list = $model->datalist($param,$where); + return table_assign(0, '', $list); + } + + //设置联系人 + public function set_contact() + { + if (request()->isAjax()) { + $param = get_params(); + $detail= Db::name('CustomerContact')->where(['id' => $param['id']])->find(); + CustomerContact::where(['cid' => $detail['cid']])->update(['is_default'=>0]); + $res = CustomerContact::where(['id' => $param['id']])->update(['is_default'=>1]); + if ($res) { + add_log('edit', $param['id'], $param,'客户联系人'); + return to_assign(); + } else { + return to_assign(1, '操作失败'); + } + } else { + return to_assign(1, '参数错误'); + } + } + + + //添加附件 + public function add_file() + { + $param = get_params(); + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $fid = Db::name('CustomerFile')->strict(false)->field(true)->insertGetId($param); + if ($fid) { + return to_assign(0, '上传成功', $fid); + } + } + + //删除附件 + public function delete_file() + { + if (request()->isDelete()) { + $id = get_params("id"); + $data['id'] = $id; + $data['delete_time'] = time(); + if (Db::name('CustomerFile')->update($data) !== false) { + $detail = Db::name('CustomerFile')->where('id', $id)->find(); + $file_name = Db::name('File')->where('id', $detail['file_id'])->value('name'); + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //获取客户等级 + public function get_customer_grade() + { + $list = get_base_data('customer_grade'); + return to_assign(0, '', $list); + } + //获取客户状态 + public function get_customer_status() + { + $list = get_base_type_data('basic_customer',1); + return to_assign(0, '', $list); + } + //获取客户意向 + public function get_intent_status() + { + $list = get_base_type_data('basic_customer',2); + return to_assign(0, '', $list); + } + +} diff --git a/app/customer/controller/Basic.php b/app/customer/controller/Basic.php new file mode 100644 index 0000000..a4304c4 --- /dev/null +++ b/app/customer/controller/Basic.php @@ -0,0 +1,93 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\validate\BasicCustomerCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Basic extends BaseController +{ + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + if (!empty($param['types'])) { + $where[] = ['types', '=', $param['types']]; + } + $list = Db::name('BasicCustomer')->where($where)->order('create_time asc')->select(); + return to_assign(0, '', $list); + } else { + return view(); + } + } + //新建编辑 + public function add() + { + if (request()->isAjax()) { + $param = get_params(); + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(BasicCustomerCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('BasicCustomer')->strict(false)->field('title,types,id,update_time')->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(BasicCustomerCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('BasicCustomer')->strict(false)->field('title,types,id,create_time')->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } + } + + //设置 + public function set() + { + $param = get_params(); + $res = Db::name('BasicCustomer')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } +} diff --git a/app/customer/controller/Chance.php b/app/customer/controller/Chance.php new file mode 100644 index 0000000..20ac06f --- /dev/null +++ b/app/customer/controller/Chance.php @@ -0,0 +1,161 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\CustomerChance as CustomerChanceModel; +use think\facade\Db; +use think\facade\View; + +class Chance extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CustomerChanceModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + $uid=$this->uid; + if (request()->isAjax()) { + $where=[]; + $whereOr=[]; + $where[]=['a.delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['a.title|a.content|c.name', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['stage'])) { + $where[] = ['a.stage','=',$param['stage']]; + } + if (!empty($param['uid'])) { + $where[] = ['a.belong_uid','=',$param['uid']]; + } + + $map=[]; + $mapOr=[]; + $map[]=['delete_time','=',0]; + $map[]=['discard_time','=',0]; + + $mapOr[] = ['belong_uid','=',$uid]; + $mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $dids_a = get_leader_departments($uid); + //是否是客户管理员 + $auth = isAuth($uid,'customer_admin','conf_1'); + if($auth == 0){ + if(!empty($dids_a)){ + $mapOr[] = ['belong_did','in',$dids_a]; + } + $cids = Db::name('Customer') + ->where($map) + ->where(function ($query) use($mapOr) { + if (!empty($mapOr)){ + $query->whereOr($mapOr); + } + })->column('id'); + $where[] = ['a.cid', 'in',$cids]; + } + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } + else{ + View::assign('is_auth', isAuth($uid,'customer_admin','conf_1')); + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()){ + if(isset($param['discovery_time'])){ + $param['discovery_time'] = strtotime($param['discovery_time']); + } + if(isset($param['expected_time'])){ + $param['expected_time'] = strtotime($param['expected_time']); + } + $param['update_time'] = time(); + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + return view('edit'); + } + $customer_id = isset($param['cid']) ? $param['cid'] : 0; + $customer_name = Db::name('Customer')->where('id',$customer_id)->value('name'); + View::assign('customer_id', $customer_id); + View::assign('customer_name', $customer_name); + if(is_mobile()){ + return view('qiye@/customer/chance_add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['contact'] = Db::name('CustomerContact')->where('id',$detail['contact_id'])->value('name'); + $detail['stage_name'] =Db::name('BasicCustomer')->where('id',$detail['stage'])->value('title'); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/customer/chance_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/customer/controller/Contact.php b/app/customer/controller/Contact.php new file mode 100644 index 0000000..f1aa2bf --- /dev/null +++ b/app/customer/controller/Contact.php @@ -0,0 +1,164 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\CustomerContact as CustomerContactModel; +use app\customer\validate\ContactValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Contact extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CustomerContactModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $uid=$this->uid; + $where=[]; + $whereOr=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|name|mobile|email', 'like', '%' . $param['keywords'] . '%']; + } + $map=[]; + $mapOr=[]; + $map[]=['delete_time','=',0]; + $map[]=['discard_time','=',0]; + + $mapOr[] = ['belong_uid','=',$uid]; + $mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $dids_a = get_leader_departments($uid); + //是否是客户管理员 + $auth = isAuth($uid,'customer_admin','conf_1'); + if($auth == 0){ + if(!empty($dids_a)){ + $mapOr[] = ['belong_did','in',$dids_a]; + } + + $cids = Db::name('Customer') + ->where($map) + ->where(function ($query) use($mapOr) { + if (!empty($mapOr)){ + $query->whereOr($mapOr); + } + })->column('id'); + $whereOr[] = ['cid', 'in',$cids]; + } + $whereOr[] = ['admin_id','=',$uid]; + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['birthday'])) { + $param['birthday'] = strtotime($param['birthday']); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ContactValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(ContactValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $cid = isset($param['cid']) ? $param['cid'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + return view('edit'); + } + if($cid>0){ + View::assign('customer_name', Db::name('Customer')->where('id',$cid)->value('name')); + } + View::assign('customer_id', $cid); + View::assign('customer_id', $cid); + if(is_mobile()){ + return view('qiye@/customer/contact_add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/customer/contact_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/customer/controller/Customer.php b/app/customer/controller/Customer.php new file mode 100644 index 0000000..dc93f49 --- /dev/null +++ b/app/customer/controller/Customer.php @@ -0,0 +1,236 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\Customer as CustomerModel; +use app\customer\validate\CustomerValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Customer extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CustomerModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $whereOr = []; + $uid = $this->uid; + $tab = isset($param['tab']) ? $param['tab'] : 0; + if (!empty($param['keywords'])) { + $where[] = ['id|name', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['customer_status'])) { + $where[] = ['customer_status', '=', $param['customer_status']]; + } + if (!empty($param['industry_id'])) { + $where[] = ['industry_id', '=', $param['industry_id']]; + } + if (!empty($param['source_id'])) { + $where[] = ['source_id', '=', $param['source_id']]; + } + if (!empty($param['grade_id'])) { + $where[] = ['grade_id', '=', $param['grade_id']]; + } + if (!empty($param['intent_status'])) { + $where[] = ['intent_status', '=', $param['intent_status']]; + } + if (!empty($param['follow_time'])) { + $follow_time =explode('~', $param['follow_time']); + $where[] = ['follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]]; + } + if (!empty($param['next_time'])) { + $next_time =explode('~', $param['next_time']); + $where[] = ['next_time', 'between',[strtotime(urldecode($next_time[0])),strtotime(urldecode($next_time[1].' 23:59:59'))]]; + } + $where[]=['delete_time','=',0]; + $where[]=['discard_time','=',0]; + + if($tab == 0){ + if (!empty($param['uid'])) { + $where[] = ['belong_uid', '=', $param['uid']]; + } + else{ + //是否是客户管理员 + $auth = isAuth($uid,'customer_admin','conf_1'); + if($auth == 0){ + $whereOr[] = ['belong_uid','=',$uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['belong_did','in',$dids]; + } + } + else{ + $where[] = ['belong_did','<>',0]; + } + } + } + //我的客户 + if($tab == 1){ + $where[] = ['belong_uid','=',$uid]; + } + //下属客户 + if($tab == 2){ + $where[] = ['belong_uid','<>',$uid]; + $dids_a = get_leader_departments($uid); + if(!empty($dids_a)){ + $where[] = ['belong_did','in',$dids_a]; + } + } + //分享客户 + if($tab == 3){ + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('is_leader', isLeader($this->uid)); + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + try { + validate(CustomerValidate::class)->scene($param['scene'])->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if (!empty($param['id']) && $param['id'] > 0) { + $param['edit_id'] = $this->uid; + $this->model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $sea = isset($param['sea']) ? $param['sea'] : 0; + View::assign('sea', $sea); + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + return view('edit'); + } + if($this->uid>1){ + View::assign('userinfo', get_admin($this->uid)); + } + if(is_mobile()){ + return view('qiye@/customer/add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name'); + if($detail['customer_status']>0){ + $detail['customer_status_name'] = Db::name('BasicCustomer')->where(['id' => $detail['customer_status']])->value('title'); + } + else{ + $detail['customer_status_name']='-'; + } + if($detail['intent_status']>0){ + $detail['intent_status_name'] = Db::name('BasicCustomer')->where(['id' => $detail['intent_status']])->value('title'); + } + else{ + $detail['intent_status_name']='-'; + } + + $detail['industry'] = Db::name('Industry')->where(['id' => $detail['industry_id']])->value('title'); + $detail['source'] = Db::name('CustomerSource')->where(['id' => $detail['source_id']])->value('title'); + $detail['grade'] = Db::name('CustomerGrade')->where(['id' => $detail['grade_id']])->value('title'); + + //附件 + $file_array = Db::name('CustomerFile') + ->field('cf.id,f.filepath,f.name,f.filesize,f.fileext,f.create_time,f.admin_id') + ->alias('cf') + ->join('File f', 'f.id = cf.file_id', 'LEFT') + ->order('cf.create_time asc') + ->where(array('cf.customer_id' => $id, 'cf.delete_time' => 0)) + ->select()->toArray(); + $detail['file_array'] = $file_array; + + $role=0; + if($detail['belong_uid'] == $this->uid && $detail['is_lock'] == 0){ + $role=1; + } + View::assign('detail', $detail); + View::assign('role', $role); + if(is_mobile()){ + return view('qiye@/customer/view'); + } + return view(); + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + if (request()->isDelete()) { + $id = get_params("id"); + $idArray = explode(',', strval($id)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'discard_time' => time() + ]; + } + foreach ($list as $key => $v) { + if (Db::name('Customer')->update($v) !== false) { + add_log('delete', $param['id']); + } + } + return to_assign(0, '操作成功'); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/customer/controller/Grade.php b/app/customer/controller/Grade.php new file mode 100644 index 0000000..236fbf5 --- /dev/null +++ b/app/customer/controller/Grade.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\CustomerGrade as CustomerGradeModel; +use app\customer\validate\GradeValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Grade extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CustomerGradeModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(GradeValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(GradeValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/customer/controller/Index.php b/app/customer/controller/Index.php new file mode 100644 index 0000000..6fd2764 --- /dev/null +++ b/app/customer/controller/Index.php @@ -0,0 +1,224 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\Customer as CustomerModel; +use think\facade\Db; +use think\facade\View; + +class Index extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CustomerModel(); + } + //抢客宝 + public function rush() + { + if (request()->isAjax()) { + $param = get_params(); + $param['order'] = 'rand()'; + $where = array(); + $where[] = ['delete_time', '=', 0]; + $where[] = ['discard_time', '=', 0]; + $where[] = ['belong_uid', '=', 0]; + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } else { + $time = strtotime(date('Y-m-d')." 00:00:00"); + $max_num = Db::name('DataAuth')->where('name','customer_admin')->value('conf_2'); + $count = Db::name('Customer')->where([['belong_time','>',$time],['belong_uid','=',$this->uid]])->count(); + View::assign('max_num', $max_num); + View::assign('count', $count); + return view(); + } + } + + //公海客户 + public function sea() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|name', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['industry_id'])) { + $where[] = ['industry_id', '=', $param['industry_id']]; + } + if (!empty($param['source_id'])) { + $where[] = ['source_id', '=', $param['source_id']]; + } + if (!empty($param['grade_id'])) { + $where[] = ['grade_id', '=', $param['grade_id']]; + } + if (!empty($param['follow_time'])) { + $follow_time =explode('~', $param['follow_time']); + $where[] = ['follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]]; + } + $where[] = ['delete_time', '=', 0]; + $where[] = ['discard_time', '=', 0]; + $where[] = ['belong_uid', '=', 0]; + + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //废池客户 + public function trash() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|name', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['industry_id'])) { + $where[] = ['industry_id', '=', $param['industry_id']]; + } + if (!empty($param['source_id'])) { + $where[] = ['source_id', '=', $param['source_id']]; + } + if (!empty($param['grade_id'])) { + $where[] = ['grade_id', '=', $param['grade_id']]; + } + $where[] = ['delete_time', '>', 0]; + $where[] = ['discard_time', '=', 0]; + $where[] = ['belong_uid', '=', 0]; + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //移入公海 + public function to_sea() + { + if (request()->isAjax()) { + $id = get_params("id"); + $idArray = explode(',', strval($id)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'belong_uid' => 0, + 'belong_did' => 0, + 'belong_time' => 0 + ]; + } + foreach ($list as $key => $v) { + if (Db::name('Customer')->update($v) !== false) { + add_log('tosea', $v['id']); + } + } + return to_assign(0, '操作成功'); + } else { + return to_assign(1, "错误的请求"); + } + } + + //获取客户 + public function to_get() + { + if (request()->isAjax()) { + $id = get_params("id"); + $time = strtotime(date('Y-m-d')." 00:00:00"); + $max_num_day = Db::name('DataAuth')->where('name','customer_admin')->value('conf_2'); + $count_day = Db::name('Customer')->where([['belong_time','between',[$time,time()]],['belong_uid','=',$this->uid]])->count(); + if($count_day>=$max_num_day){ + return to_assign(1, "今日领取客户数已到达上限,请明天再来领取"); + } + + $max_num = Db::name('DataAuth')->where('name','customer_admin')->value('conf_3'); + $count = Db::name('Customer')->where([['belong_uid','=',$this->uid]])->count(); + if($count>=$max_num){ + return to_assign(1, "领取客户数已到达上限,请把部分客户移到公海里再来领取"); + } + $data['id'] = $id; + $data['belong_uid'] = $this->uid; + $data['belong_did'] = $this->did; + $data['belong_time'] = time(); + if (Db::name('Customer')->update($data) !== false) { + add_log('tosea', $id); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //客户移入废弃池 + public function to_trash() + { + if (request()->isAjax()) { + $params = get_params(); + $id = get_params("id"); + $idArray = explode(',', strval($id)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'delete_time' => time() + ]; + } + foreach ($list as $key => $v) { + if (Db::name('Customer')->update($v) !== false) { + add_log('totrash', $params['id']); + } + } + return to_assign(0, '操作成功'); + } else { + return to_assign(1, "错误的请求"); + } + } + + //还原客户 + public function to_revert() + { + if (request()->isAjax()) { + $params = get_params(); + $id = get_params("id"); + $idArray = explode(',', strval($id)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'delete_time' => 0 + ]; + } + foreach ($list as $key => $v) { + if (Db::name('Customer')->update($v) !== false) { + add_log('recovery', $params['id']); + } + } + return to_assign(0, '操作成功'); + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/customer/controller/Industry.php b/app/customer/controller/Industry.php new file mode 100644 index 0000000..6c2319f --- /dev/null +++ b/app/customer/controller/Industry.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\Industry as IndustryModel; +use app\customer\validate\IndustryValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Industry extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new IndustryModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(IndustryValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(IndustryValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/customer/controller/Source.php b/app/customer/controller/Source.php new file mode 100644 index 0000000..f9481fb --- /dev/null +++ b/app/customer/controller/Source.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\CustomerSource as CustomerSourceModel; +use app\customer\validate\SourceValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Source extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CustomerSourceModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(SourceValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(SourceValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/customer/controller/Trace.php b/app/customer/controller/Trace.php new file mode 100644 index 0000000..9521a76 --- /dev/null +++ b/app/customer/controller/Trace.php @@ -0,0 +1,168 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\customer\controller; + +use app\base\BaseController; +use app\customer\model\CustomerTrace as CustomerTraceModel; +use think\facade\Db; +use think\facade\View; + +class Trace extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CustomerTraceModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + $uid=$this->uid; + if (request()->isAjax()) { + $where=[]; + $where[]=['a.delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['a.content|c.name|cc.title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['follow_time'])) { + $follow_time =explode('~', $param['follow_time']); + $where[] = ['a.follow_time', 'between',[strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1].' 23:59:59'))]]; + } + if (!empty($param['uid'])) { + $where[] = ['a.admin_id','=',$param['uid']]; + } + $map=[]; + $mapOr=[]; + $map[]=['delete_time','=',0]; + $map[]=['discard_time','=',0]; + + $mapOr[] = ['belong_uid','=',$uid]; + $mapOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $dids_a = get_leader_departments($uid); + //是否是客户管理员 + $auth = isAuth($uid,'customer_admin','conf_1'); + if($auth == 0){ + if(!empty($dids_a)){ + $mapOr[] = ['belong_did','in',$dids_a]; + } + + $cids = Db::name('Customer') + ->where($map) + ->where(function ($query) use($mapOr) { + if (!empty($mapOr)){ + $query->whereOr($mapOr); + } + })->column('id'); + + $where[] = ['a.cid', 'in',$cids]; + } + $list = $this->model->datalist($param,$where); + return table_assign(0, '', $list); + } + else{ + View::assign('is_auth', isAuth($uid,'customer_admin','conf_1')); + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if(isset($param['follow_time'])){ + $param['follow_time'] = strtotime($param['follow_time']); + } + if(isset($param['next_time'])){ + $param['next_time'] = strtotime($param['next_time']); + } + $param['update_time'] = time(); + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + View::assign('detail', $this->model->getById($id)); + return view('edit'); + } + $customer_id = isset($param['cid']) ? $param['cid'] : 0; + $customer_name = Db::name('Customer')->where('id',$customer_id)->value('name'); + View::assign('customer_id', $customer_id); + View::assign('customer_name', $customer_name); + if(is_mobile()){ + return view('qiye@/customer/trace_add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['contact'] = Db::name('CustomerContact')->where('id',$detail['contact_id'])->value('name'); + $detail['types_name'] = Db::name('BasicCustomer')->where('id',$detail['types'])->value('title'); + $detail['stage_name'] = Db::name('BasicCustomer')->where('id',$detail['stage'])->value('title'); + if($detail['chance_id']>0){ + $detail['chance'] = Db::name('CustomerChance')->where(['id' => $detail['chance_id']])->value('title'); + } + else{ + $detail['chance']='-'; + } + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/customer/trace_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/customer/event.php b/app/customer/event.php new file mode 100644 index 0000000..4eff890 --- /dev/null +++ b/app/customer/event.php @@ -0,0 +1,5 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\customer\model; +use think\model; +use think\facade\Db; +use app\api\model\EditLog; +class Customer extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = 'id desc'; + if(!empty($param['order_field']) && !empty($param['order_type'])){ + $order = $param['order_field'].' '.$param['order_type']; + } + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->orderRaw($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->create_time = to_date($item->create_time); + $item->update_time = to_date($item->update_time); + if($item->belong_uid>0){ + $item->belong_name = Db::name('Admin')->where('id',$item->belong_uid)->value('name'); + $item->belong_department = Db::name('Department')->where(['id' => $item->belong_did])->value('title'); + } + else{ + $item->belong_name='-'; + $item->belong_department='-'; + } + if($item->industry_id>0){ + $item->industry = Db::name('Industry')->where(['id' => $item->industry_id])->value('title'); + } + else{ + $item->industry='-'; + } + if($item->grade_id>0){ + $item->grade = Db::name('CustomerGrade')->where(['id' => $item->grade_id])->value('title'); + } + else{ + $item->grade='-'; + } + if($item->source_id>0){ + $item->source = Db::name('CustomerSource')->where(['id' => $item->source_id])->value('title'); + } + else{ + $item->source='-'; + } + if($item->customer_status>0){ + $item->customer_status_name = Db::name('BasicCustomer')->where(['id' => $item->customer_status])->value('title'); + } + else{ + $item->customer_status_name='-'; + } + if($item->intent_status>0){ + $item->intent_status_name = Db::name('BasicCustomer')->where(['id' => $item->intent_status])->value('title'); + } + else{ + $item->intent_status_name='-'; + } + if($item->follow_time==0){ + $item->follow_time='-'; + } + else{ + $item->follow_time = date('Y-m-d',$item->follow_time); + } + if($item->next_time==0){ + $item->next_time='-'; + } + else{ + $item->next_time = date('Y-m-d',$item->next_time); + } + $contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid' => $item->id])->find(); + if(!empty($contact)){ + $item->contact_name = $contact['name']; + $item->contact_mobile = $contact['mobile']; + $item->contact_email = $contact['email']; + } + else{ + $item->contact_name = ''; + $item->contact_mobile = ''; + $item->contact_email = ''; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $param['update_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + $contact = [ + 'name' => $param['c_name'], + 'mobile' => $param['c_mobile'], + 'sex' => $param['c_sex'], + 'qq' => $param['c_qq'], + 'wechat' => $param['c_wechat'], + 'email' => $param['c_email'], + 'cid' => $insertId, + 'is_default' => 1, + 'create_time' => time(), + 'admin_id' => $param['admin_id'] + ]; + Db::name('CustomerContact')->strict(false)->field(true)->insert($contact); + add_log('add', $insertId, $param); + $log=new EditLog(); + $log->add('Customer',$insertId); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + $old = self::find($param['id']); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + $log=new EditLog(); + $log->edit('Customer',$param['id'],$param,$old); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['belong_department'] = Db::name('Department')->where(['id' => $info['belong_did']])->value('title'); + $info['belong_name'] = Db::name('Admin')->where(['id' => $info['belong_uid']])->value('name'); + if(!empty($info['share_ids'])){ + $share_names = Db::name('Admin')->where([['id','in',$info['share_ids']]])->column('name'); + $info['share_names'] = implode(',',$share_names); + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + self::where('id', $id)->update(['discard_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/customer/model/CustomerChance.php b/app/customer/model/CustomerChance.php new file mode 100644 index 0000000..ffd8b51 --- /dev/null +++ b/app/customer/model/CustomerChance.php @@ -0,0 +1,130 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\customer\model; +use think\model; +use think\facade\Db; +class CustomerChance extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'a.id desc' : $param['order']; + try { + $list = self::where($where) + ->field('a.*') + ->alias('a') + ->join('Customer c','a.cid = c.id') + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name'); + $item->belong_name = Db::name('Admin')->where('id',$item->belong_uid)->value('name'); + $item->stage_name = Db::name('BasicCustomer')->where(['id' => $item->stage])->value('title'); + $item->expected_time = date('Y-m-d', $item->expected_time); + $item->discovery_time = date('Y-m-d', $item->discovery_time); + $item->is_contract = Db::name('Contract')->where(['chance_id'=>$item->id,'delete_time'=>0])->count(); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name'); + $info['belong_name'] = Db::name('Admin')->where(['id' => $info['belong_uid']])->value('name'); + $assist_names = Db::name('Admin')->where([['id','in',$info['assist_ids']]])->column('name'); + $info['assist_names'] = implode(',',$assist_names); + $contract = Db::name('Contract')->where(['chance_id'=>$info['id'],'delete_time'=>0])->find(); + if(!empty($contract)){ + $info['contract'] = $contract['name']; + $info['contract_id'] = $contract['id']; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/customer/model/CustomerContact.php b/app/customer/model/CustomerContact.php new file mode 100644 index 0000000..01b2f2c --- /dev/null +++ b/app/customer/model/CustomerContact.php @@ -0,0 +1,134 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\customer\model; +use think\model; +use think\facade\Db; +class CustomerContact extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param,$where,$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name'); + $item->create_time = to_date($item->create_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + if(!empty($info['birthday'])){ + $info['birthday'] = date('Y-m-d',$info['birthday']); + } + else{ + $info['birthday'] = ''; + } + $info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name'); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + $detail=self::find($id); + if($detail['is_default'] == 1){ + $count = Db::name('Customer')->where(['id' => $detail['cid'],'delete_time'=>0])->count(); + if($count>0){ + return to_assign(1, '首要联系人,不能删除'); + } + } + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/customer/model/CustomerGrade.php b/app/customer/model/CustomerGrade.php new file mode 100644 index 0000000..55ec808 --- /dev/null +++ b/app/customer/model/CustomerGrade.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\customer\model; +use think\model; +use think\facade\Db; +class CustomerGrade extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/customer/model/CustomerSource.php b/app/customer/model/CustomerSource.php new file mode 100644 index 0000000..454a0c1 --- /dev/null +++ b/app/customer/model/CustomerSource.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\customer\model; +use think\model; +use think\facade\Db; +class CustomerSource extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/customer/model/CustomerTrace.php b/app/customer/model/CustomerTrace.php new file mode 100644 index 0000000..b4e8e98 --- /dev/null +++ b/app/customer/model/CustomerTrace.php @@ -0,0 +1,149 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\customer\model; +use think\model; +use think\facade\Db; +class CustomerTrace extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param,$where) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'a.id desc' : $param['order']; + try { + $list = self::where($where) + ->field('a.*') + ->alias('a') + ->join('Customer c','a.cid = c.id') + ->join('CustomerChance cc','a.chance_id = cc.id','left') + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->follow_time = date('Y-m-d H:i',$item->follow_time); + $item->next_time = date('Y-m-d H:i',$item->next_time); + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->type_name = Db::name('BasicCustomer')->where(['id' => $item->types])->value('title'); + $item->stage_name = Db::name('BasicCustomer')->where(['id' => $item->stage])->value('title'); + $item->customer = Db::name('Customer')->where(['id' => $item->cid])->value('name'); + if($item->chance_id>0){ + $item->chance = Db::name('CustomerChance')->where(['id' => $item->chance_id])->value('title'); + } + else{ + $item->chance='-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + $follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('follow_time'); + $next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('next_time'); + Db::name('Customer')->strict(false)->field(true)->update(['id'=>$param['cid'],'follow_time'=>$follow_time,'next_time'=>$next_time]); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + $follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('follow_time'); + $next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$param['cid']])->value('next_time'); + Db::name('Customer')->strict(false)->field(true)->update(['id'=>$param['cid'],'follow_time'=>$follow_time,'next_time'=>$next_time]); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['customer'] = Db::name('Customer')->where(['id' => $info['cid']])->value('name'); + $file_array=[]; + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select()->toArray(); + } + $info['file_array'] = $file_array; + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + $cid = self::where('id', $id)->value('cid'); + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + $follow_time = self::order('follow_time', 'desc')->where(['delete_time'=>0,'cid'=>$cid])->value('follow_time'); + $next_time = self::order('next_time', 'desc')->where(['delete_time'=>0,'cid'=>$cid])->value('next_time'); + if(!empty($follow_time)){ + Db::name('Customer')->strict(false)->field(true)->update(['id'=>$cid,'follow_time'=>$follow_time,'next_time'=>$next_time]); + } + else{ + Db::name('Customer')->strict(false)->field(true)->update(['id'=>$cid,'follow_time'=>0,'next_time'=>0]); + } + return to_assign(); + } +} + diff --git a/app/customer/model/Industry.php b/app/customer/model/Industry.php new file mode 100644 index 0000000..f9df375 --- /dev/null +++ b/app/customer/model/Industry.php @@ -0,0 +1,79 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\model; +use think\model; +use think\facade\Db; +class Industry extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } +} + diff --git a/app/customer/validate/BasicCustomerCheck.php b/app/customer/validate/BasicCustomerCheck.php new file mode 100644 index 0000000..e34f5f8 --- /dev/null +++ b/app/customer/validate/BasicCustomerCheck.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\validate; + +use think\Validate; + +class BasicCustomerCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/customer/validate/ChanceValidate.php b/app/customer/validate/ChanceValidate.php new file mode 100644 index 0000000..a97ae87 --- /dev/null +++ b/app/customer/validate/ChanceValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\validate; +use think\Validate; +use think\facade\Db; + +class ChanceValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('CustomerChance')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/customer/validate/ContactValidate.php b/app/customer/validate/ContactValidate.php new file mode 100644 index 0000000..c197674 --- /dev/null +++ b/app/customer/validate/ContactValidate.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\validate; +use think\Validate; +use think\facade\Db; + +class ContactValidate extends Validate +{ + protected $rule = [ + 'name' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/customer/validate/CustomerValidate.php b/app/customer/validate/CustomerValidate.php new file mode 100644 index 0000000..e039300 --- /dev/null +++ b/app/customer/validate/CustomerValidate.php @@ -0,0 +1,44 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\validate; +use think\Validate; +use think\facade\Db; + +class CustomerValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Customer')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'name' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '名称不能为空', + 'name.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['name'], + 'edit' => ['name','id'], + 'oaedit' => ['id'], + ]; +} \ No newline at end of file diff --git a/app/customer/validate/GradeValidate.php b/app/customer/validate/GradeValidate.php new file mode 100644 index 0000000..1b735b9 --- /dev/null +++ b/app/customer/validate/GradeValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\validate; +use think\Validate; +use think\facade\Db; + +class GradeValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('CustomerGrade')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/customer/validate/IndustryValidate.php b/app/customer/validate/IndustryValidate.php new file mode 100644 index 0000000..efe34f3 --- /dev/null +++ b/app/customer/validate/IndustryValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\validate; +use think\Validate; +use think\facade\Db; + +class IndustryValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Industry')->where([['title','=',$data['title']],['id','<>',$id]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/customer/validate/SourceValidate.php b/app/customer/validate/SourceValidate.php new file mode 100644 index 0000000..308314b --- /dev/null +++ b/app/customer/validate/SourceValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\customer\validate; +use think\Validate; +use think\facade\Db; + +class SourceValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('CustomerSource')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/customer/view/basic/datalist.html b/app/customer/view/basic/datalist.html new file mode 100644 index 0000000..a27622a --- /dev/null +++ b/app/customer/view/basic/datalist.html @@ -0,0 +1,140 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+
    +
  • 客户状态
  • +
  • 客户意向
  • +
  • 跟进方式
  • +
  • 销售阶段
  • +
+
+
+
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/chance/add.html b/app/customer/view/chance/add.html new file mode 100644 index 0000000..c6dcee7 --- /dev/null +++ b/app/customer/view/chance/add.html @@ -0,0 +1,89 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增销售机会

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称{$customer_name}客户联系人* + +
机会标题*发现时间*
销售阶段* + + 预计金额*预计签单时间*
需求描述*
归属人员* + + + 协助人员 + + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/chance/datalist.html b/app/customer/view/chance/datalist.html new file mode 100644 index 0000000..a36910a --- /dev/null +++ b/app/customer/view/chance/datalist.html @@ -0,0 +1,127 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+ {gt name="$is_auth" value="0"} +
+ + +
+ {/gt} +
+ +
+
+ +
+
+ + +
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/chance/edit.html b/app/customer/view/chance/edit.html new file mode 100644 index 0000000..d6875eb --- /dev/null +++ b/app/customer/view/chance/edit.html @@ -0,0 +1,90 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑销售机会

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称{$detail.customer}客户联系人* + +
机会标题*发现时间* + +
销售阶段* + 预计金额* 预计签单时间*
需求描述*
归属人员* + + + 协助人员 + + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/chance/view.html b/app/customer/view/chance/view.html new file mode 100644 index 0000000..318b064 --- /dev/null +++ b/app/customer/view/chance/view.html @@ -0,0 +1,57 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

销售机会

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.contract"} + + + + + {/notempty} +
客户名称{$detail.customer}客户联系人{$detail.contact}
机会标题{$detail.title}发现时间{$detail.discovery_time|date="Y-m-d"}
销售阶段{$detail.stage_name}预计金额{$detail.expected_amount}预计签单时间{$detail.expected_time|date="Y-m-d"}
需求描述{$detail.content}
归属人员{$detail.belong_name}协助人员{$detail.assist_names}
签单合同{$detail.contract} 详情
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/contact/add.html b/app/customer/view/contact/add.html new file mode 100644 index 0000000..4f2466a --- /dev/null +++ b/app/customer/view/contact/add.html @@ -0,0 +1,96 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增联系人

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称{$customer_name|default=''}
姓名* + + 联系电话* + + 性别* + + +
微 信 号 + + QQ号码 + + 电子邮箱 + +
称谓 + + 部门 + + 职务 + +
生日家庭住址
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/contact/datalist.html b/app/customer/view/contact/datalist.html new file mode 100644 index 0000000..7e69a18 --- /dev/null +++ b/app/customer/view/contact/datalist.html @@ -0,0 +1,103 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ +
+
+ + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/contact/edit.html b/app/customer/view/contact/edit.html new file mode 100644 index 0000000..799b1ac --- /dev/null +++ b/app/customer/view/contact/edit.html @@ -0,0 +1,97 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑联系人

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称{$detail.customer}
姓名* + + 联系电话* + + 性别* + + +
微 信 号 + + QQ号码 + + 电子邮箱 + +
称谓 + + 部门 + + 职务 + +
生日家庭住址
+
+ + + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/contact/view.html b/app/customer/view/contact/view.html new file mode 100644 index 0000000..eb01db8 --- /dev/null +++ b/app/customer/view/contact/view.html @@ -0,0 +1,59 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

联系人信息

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称{$detail.customer}
姓名{$detail.name} 联系电话{$detail.mobile}性别 + {eq name="$detail.sex" value="1"}男{/eq} + {eq name="$detail.sex" value="2"}女{/eq} +
微 信 号{$detail.wechat}QQ号码{$detail.qq}电子邮箱{$detail.email}
称谓{$detail.nickname}部门{$detail.department}职务{$detail.position}
生日{$detail.birthday}家庭住址{$detail.address}
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/customer/add.html b/app/customer/view/customer/add.html new file mode 100644 index 0000000..d36de0a --- /dev/null +++ b/app/customer/view/customer/add.html @@ -0,0 +1,151 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增客户信息

+ + + + + + + + + + + + + + + + {eq name="$sea" value="0"} + + + + + + + + + {/eq} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称*客户来源* + +
联系地址*所属行业* + + 客户等级* + +
归属员工 + + + + 归属部门共享员工 + + +
客户介绍*
经营业务
首要联系人
联 系 人*联系电话*性别* + + +
电子邮箱微 信 号QQ号码
备注信息
+
+ + + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/customer/datalist.html b/app/customer/view/customer/datalist.html new file mode 100644 index 0000000..bf61f88 --- /dev/null +++ b/app/customer/view/customer/datalist.html @@ -0,0 +1,290 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +
+
+
+
    +
  • 全部客户
  • +
  • 我的客户
  • +
  • 下属客户
  • +
  • 共享客户
  • +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ {gt name="$is_leader" value="0"} +
+ + +
+ {/gt} +
+ +
+
+ + + + + +
+
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/customer/edit.html b/app/customer/view/customer/edit.html new file mode 100644 index 0000000..bcfb7c3 --- /dev/null +++ b/app/customer/view/customer/edit.html @@ -0,0 +1,145 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑客户信息

+ + + + + + + + + + + + + + + + + + + + + + {eq name="$sea" value="0"} + + + + + + + + + {/eq} + + + + + + + + + + + + +
客户名称*客户来源* + +
联系地址*所属行业* + +
客户等级* + + 客户状态* + + 客户意向* + +
归属员工 + + + + 归属部门共享员工 + + +
客户介绍*
经营业务
备注信息
+
+ + + + +
+
+{/block} + +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/customer/view.html b/app/customer/view/customer/view.html new file mode 100644 index 0000000..24101cf --- /dev/null +++ b/app/customer/view/customer/view.html @@ -0,0 +1,202 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+

+ 客户详情 + {eq name="$detail.is_lock" value="1"} +
+ {else/} +
+ {/eq} +

+ + + + + + + + + + + + + + {gt name="$detail.belong_uid" value="0"} + + + + + + + + + {/gt} + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.market"} + + + + + + + {/notempty} + {notempty name="$detail.remark"} + + + + + + + {/notempty} +
客户名称{$detail.name}录入人{$detail.admin_name}
联系地址{$detail.address}录入时间{$detail.create_time|date='Y-m-d H:i:s'}
归属员工{$detail.belong_name}归属部门{$detail.belong_department}共享员工{$detail.share_names|default="-"}
客户等级{$detail.grade}所属行业{$detail.industry}最后更新时间{$detail.update_time|date='Y-m-d H:i:s'}
客户来源{$detail.source}客户状态{$detail.customer_status_name}客户意向{$detail.intent_status_name}
+
相关附件
+
+
+
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} +
+
客户介绍
{$detail.content|default=""}
经营业务
{$detail.market}
备注信息
{$detail.remark}
+
+
    +
  • 跟进记录
  • +
  • 线索机会
  • +
  • 联 系 人
  • +
  • 操作记录
  • +
+
+
+ {include file="/customer/view_trace" /} +
+
+ {include file="/customer/view_chance" /} +
+
+ {include file="/customer/view_contact" /} +
+
+ {include file="/customer/view_log" /} +
+
+
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/customer/view_chance.html b/app/customer/view/customer/view_chance.html new file mode 100644 index 0000000..0f41ef1 --- /dev/null +++ b/app/customer/view/customer/view_chance.html @@ -0,0 +1,82 @@ +
+ +
+
+
+
+ \ No newline at end of file diff --git a/app/customer/view/customer/view_contact.html b/app/customer/view/customer/view_contact.html new file mode 100644 index 0000000..cb3644b --- /dev/null +++ b/app/customer/view/customer/view_contact.html @@ -0,0 +1,102 @@ +
+ +
+
+
+
+ \ No newline at end of file diff --git a/app/customer/view/customer/view_log.html b/app/customer/view/customer/view_log.html new file mode 100644 index 0000000..6573445 --- /dev/null +++ b/app/customer/view/customer/view_log.html @@ -0,0 +1,9 @@ +
+
+
+ \ No newline at end of file diff --git a/app/customer/view/customer/view_trace.html b/app/customer/view/customer/view_trace.html new file mode 100644 index 0000000..29c38ef --- /dev/null +++ b/app/customer/view/customer/view_trace.html @@ -0,0 +1,72 @@ +
+ + 新建跟进记录 +
+
+
+
+ \ No newline at end of file diff --git a/app/customer/view/grade/add.html b/app/customer/view/grade/add.html new file mode 100644 index 0000000..ff53f45 --- /dev/null +++ b/app/customer/view/grade/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

客户等级

+ + + + + + + +
客户等级名称* + + 排序 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/grade/datalist.html b/app/customer/view/grade/datalist.html new file mode 100644 index 0000000..0264dba --- /dev/null +++ b/app/customer/view/grade/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/grade/index.html b/app/customer/view/grade/index.html new file mode 100644 index 0000000..9c654ba --- /dev/null +++ b/app/customer/view/grade/index.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/grade/view.html b/app/customer/view/grade/view.html new file mode 100644 index 0000000..eb8c7ff --- /dev/null +++ b/app/customer/view/grade/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

客户等级详情

+ + + + + + + +
客户等级名称{$detail.title|default=''}">排序{$detail.sort|default=0}
+
+{/block} + \ No newline at end of file diff --git a/app/customer/view/index/rush.html b/app/customer/view/index/rush.html new file mode 100644 index 0000000..5bac17c --- /dev/null +++ b/app/customer/view/index/rush.html @@ -0,0 +1,127 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+
每点击一次随机获取20个公海客户的信息,每天最多可抢{$max_num|default="0"}个客户,你今天已抢了{$count}个客户
+
+
+
+{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/customer/view/index/sea.html b/app/customer/view/index/sea.html new file mode 100644 index 0000000..12584eb --- /dev/null +++ b/app/customer/view/index/sea.html @@ -0,0 +1,263 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+ + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/customer/view/index/trash.html b/app/customer/view/index/trash.html new file mode 100644 index 0000000..faaf008 --- /dev/null +++ b/app/customer/view/index/trash.html @@ -0,0 +1,218 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/customer/view/industry/add.html b/app/customer/view/industry/add.html new file mode 100644 index 0000000..1d67afc --- /dev/null +++ b/app/customer/view/industry/add.html @@ -0,0 +1,45 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

行业类型

+ + + + + + + +
行业类型名称*排序
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/industry/datalist.html b/app/customer/view/industry/datalist.html new file mode 100644 index 0000000..5c597f0 --- /dev/null +++ b/app/customer/view/industry/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/industry/view.html b/app/customer/view/industry/view.html new file mode 100644 index 0000000..073f580 --- /dev/null +++ b/app/customer/view/industry/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

行业类型详情

+ + + + + + + +
行业类型名称{$detail.title|default=''}">排序{$detail.sort|default=0}
+
+{/block} + \ No newline at end of file diff --git a/app/customer/view/source/add.html b/app/customer/view/source/add.html new file mode 100644 index 0000000..7d69f50 --- /dev/null +++ b/app/customer/view/source/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

客户来源

+ + + + + + + +
客户来源名称* + + 排序 + +
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/source/datalist.html b/app/customer/view/source/datalist.html new file mode 100644 index 0000000..2038c0c --- /dev/null +++ b/app/customer/view/source/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+
+ + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/source/index.html b/app/customer/view/source/index.html new file mode 100644 index 0000000..c622b70 --- /dev/null +++ b/app/customer/view/source/index.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/source/view.html b/app/customer/view/source/view.html new file mode 100644 index 0000000..6c88d57 --- /dev/null +++ b/app/customer/view/source/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

客户来源详情

+ + + + + + + +
客户来源名称{$detail.title|default=''}">排序{$detail.sort|default=0}
+
+{/block} + \ No newline at end of file diff --git a/app/customer/view/trace/add.html b/app/customer/view/trace/add.html new file mode 100644 index 0000000..c74e1c8 --- /dev/null +++ b/app/customer/view/trace/add.html @@ -0,0 +1,107 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增跟进记录

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称{$customer_name}
联 系 人* + + 跟进方式* + + 跟进时间*
沟通内容*
当前阶段* + + 销售机会 + + 下次沟通时间*
+
相关附件
+
+
+
+ +
+
+
+ + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/trace/datalist.html b/app/customer/view/trace/datalist.html new file mode 100644 index 0000000..952ba97 --- /dev/null +++ b/app/customer/view/trace/datalist.html @@ -0,0 +1,104 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
+
+ {gt name="$is_auth" value="0"} +
+ + +
+ {/gt} +
+ +
+
+ +
+
+ + +
+
+
+
+ + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/trace/edit.html b/app/customer/view/trace/edit.html new file mode 100644 index 0000000..df71eb4 --- /dev/null +++ b/app/customer/view/trace/edit.html @@ -0,0 +1,113 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

编辑跟进记录

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
客户名称{$detail.customer}
联 系 人* + + 跟进方式* + + 跟进时间*
沟通内容*
当前阶段* + + 销售机会 + + 下次沟通时间*
+
相关附件
+
+
+
+ + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
{:file_card($vo)}
+ {/volist} + {/notempty} +
+
+
+ + + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/customer/view/trace/view.html b/app/customer/view/trace/view.html new file mode 100644 index 0000000..46b745a --- /dev/null +++ b/app/customer/view/trace/view.html @@ -0,0 +1,57 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

跟进记录详细

+ + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
客户名称{$detail.customer}
联 系 人{$detail.contact}跟进方式{$detail.types_name}跟进时间{$detail.follow_time|date='Y-m-d H:i'}
沟通内容{$detail.content}
当前阶段{$detail.stage_name}销售机会{$detail.chance}下次沟通时间{$detail.next_time|date='Y-m-d H:i'}
相关附件 +
+ {volist name="$detail.file_array" id="vo"} +
{:file_card($vo,'view')}
+ {/volist} +
+
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/common.php b/app/disk/common.php new file mode 100644 index 0000000..c859f0a --- /dev/null +++ b/app/disk/common.php @@ -0,0 +1,30 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +use think\facade\Db; + +function get_pfolder($id) +{ + $folder = Db::name('Disk')->where('id',$id)->find(); + if($folder && $folder['pid'] > 0){ + $pfolders = get_pfolder($folder['pid']); + $pfolders[] = $folder; + return $pfolders; + } + else{ + if(empty($folder)){ + return []; + } + return [$folder]; + } +} \ No newline at end of file diff --git a/app/disk/controller/Api.php b/app/disk/controller/Api.php new file mode 100644 index 0000000..cfb59b8 --- /dev/null +++ b/app/disk/controller/Api.php @@ -0,0 +1,161 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\disk\controller; + +use app\api\BaseController; +use think\facade\Db; +use think\facade\View; + +class Api extends BaseController +{ + //获取共享空间 + public function get_group() + { + $where=[]; + $whereOr=[]; + $where[] = ['delete_time','=',0]; + $uid=$this->uid; + if($uid>1){ + $map1=[ + ['admin_id','=',$uid], + ]; + $map2=[ + ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',director_uids)")], + ]; + $map3=[ + ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',group_uids)")], + ]; + $whereOr =[$map1,$map2,$map3]; + } + $list = Db::name('DiskGroup') + ->where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->select()->toArray(); + return to_assign(0, '',$list); + } + + /** + * 空间成员列表 + */ + public function memberlist() + { + $param = get_params(); + if (request()->isAjax()) { + $group_uids = Db::name('DiskGroup')->where('id',$param['id'])->value('group_uids'); + $list['data']=[]; + if(!empty($group_uids)){ + $list['data'] = Db::name('Admin') + ->field('a.*,p.title as position, d.title as department') + ->alias('a') + ->join('Position p','p.id = a.position_id') + ->join('Department d','d.id = a.did') + ->where([['a.id','in',$group_uids],['a.status','=',1]]) + ->select()->toArray(); + } + table_assign(0,'', $list); + } + else{ + $detail = Db::name('DiskGroup')->where('id',$param['id'])->find(); + View::assign('detail', $detail); + return view(); + } + } + + /** + * 设置空间成员 + */ + public function memberset() + { + $param = get_params(); + if (request()->isAjax()) { + $uid=$this->uid; + $detail = Db::name('DiskGroup')->where('id',$param['id'])->find(); + $array = array_map('trim', explode(',', $detail['director_uids'])); + if($uid==1 || $detail['admin_id'] == $uid || in_array($uid, $array)){ + $res = Db::name('DiskGroup')->where('id',$param['id'])->update(['group_uids'=>$param['group_uids']]); + if($res!==false){ + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + else{ + return to_assign(1,'操作失败'); + } + }else{ + return to_assign(1,'只要超级管理员、创建人、空间管理人员才有权限操作'); + } + } + else{ + // 禁止访问 + throw new \think\exception\HttpException(403, '禁止访问'); + } + } + + /** + * 空间管理员列表 + */ + public function adminlist() + { + $param = get_params(); + if (request()->isAjax()) { + $director_uids = Db::name('DiskGroup')->where('id',$param['id'])->value('director_uids'); + $list['data']=[]; + if(!empty($director_uids)){ + $list['data'] = Db::name('Admin') + ->field('a.*,p.title as position, d.title as department') + ->alias('a') + ->join('Position p','p.id = a.position_id') + ->join('Department d','d.id = a.did') + ->where([['a.id','in',$director_uids],['a.status','=',1]]) + ->select()->toArray(); + } + table_assign(0,'', $list); + } + else{ + $detail = Db::name('DiskGroup')->where('id',$param['id'])->find(); + View::assign('detail', $detail); + return view(); + } + } + + /** + * 设置空间管理员 + */ + public function adminset() + { + $param = get_params(); + if (request()->isAjax()) { + $uid=$this->uid; + $detail = Db::name('DiskGroup')->where('id',$param['id'])->find(); + if($uid==1 || $detail['admin_id'] == $uid){ + $res = Db::name('DiskGroup')->where('id',$param['id'])->update(['director_uids'=>$param['director_uids']]); + if($res!==false){ + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + else{ + return to_assign(1,'操作失败'); + } + }else{ + return to_assign(1,'只要超级管理员和创建人才有权限操作'); + } + } + else{ + // 禁止访问 + throw new \think\exception\HttpException(403, '禁止访问'); + } + } +} diff --git a/app/disk/controller/Index.php b/app/disk/controller/Index.php new file mode 100644 index 0000000..d23ccc2 --- /dev/null +++ b/app/disk/controller/Index.php @@ -0,0 +1,606 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\disk\controller; + +use app\base\BaseController; +use app\disk\model\Disk as DiskModel; +use app\disk\validate\DiskValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Index extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new DiskModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $pid = isset($param['pid']) ? $param['pid'] : 0; + $where=[]; + $where[]=['admin_id','=',$this->uid]; + $where[]=['delete_time','=',0]; + $where[]=['group_id','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['name', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['is_star'])) { + $where[]=['types','<',2]; + $where[]=['is_star','=',1]; + } + if (!empty($param['ext'])) { + $where[] = ['file_ext', 'in',$param['ext']]; + } + if (!empty($param['is_star']) || !empty($param['ext'])) { + + } + else{ + $where[]=['pid','=',$pid]; + } + $list = $this->model->datalist($param,$where); + $folder = get_pfolder($pid); + return table_assign(0, '', $list,$folder); + } + else{ + return view(); + } + } + + /** + * 分享列表 + */ + public function sharelist() + { + $param = get_params(); + if (request()->isAjax()) { + $pid = isset($param['pid']) ? $param['pid'] : 0; + $group_id = isset($param['group_id']) ? $param['group_id'] : 0; + $where=[]; + $where[]=['delete_time','=',0]; + $where[]=['group_id','=',$group_id]; + if (!empty($param['keywords'])) { + $where[] = ['name', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['is_star'])) { + if($pid>0){ + $where[]=['pid','=',$pid]; + } + else{ + $where[]=['is_star','=',1]; + } + } + if (!empty($param['ext'])) { + $where[] = ['file_ext', 'in',$param['ext']]; + } + if (!empty($param['is_star']) || !empty($param['ext'])) { + + } + else{ + $where[]=['pid','=',$pid]; + } + $list = $this->model->datalist($param,$where); + $folder = get_pfolder($param['pid']); + return table_assign(0, '', $list,$folder); + } + else{ + return view(); + } + } + /** + * 回收站列表 + */ + public function clearlist() + { + $param = get_params(); + if (request()->isAjax()) { + $pid = isset($param['pid']) ? $param['pid'] : 0; + $where=[]; + $where[]=['admin_id','=',$this->uid]; + $where[]=['clear_time','=',0]; + if($pid>0){ + $where[]=['pid','=',$pid]; + } + else{ + $where[]=['delete_time','>',0]; + } + if (!empty($param['ext'])) { + $where[] = ['file_ext', 'in',$param['ext']]; + } + if (!empty($param['keywords'])) { + $where[] = ['name', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($param,$where); + $folder = get_pfolder($param['pid']); + return table_assign(0, '', $list,$folder); + } + else{ + return view(); + } + } + + //添加&编辑 + public function add_group() + { + if (request()->isAjax()) { + $param = get_params(); + if($param['title'] == '全部' || $param['title']=='未共享空间'){ + return to_assign(1, '该共享空间名称已经存在'); + } + if (!empty($param['id']) && $param['id'] > 0) { + $uid=$this->uid; + $detail = Db::name('DiskGroup')->where('id',$param['id'])->find(); + if($uid==1 || $detail['admin_id'] == $uid){ + $count = Db::name('DiskGroup')->where([['id','<>',$param['id']],['delete_time','=',0],['title','=',$param['title']]])->count(); + if ($count > 0) { + return to_assign(1, '该共享空间名称已经被其他员工占用'); + } + $param['update_time'] = time(); + $res = Db::name('DiskGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param); + if($res!=false){ + add_log('edit', $param['id'], $param); + return to_assign(0,'编辑成功',$param['id']); + }else{ + return to_assign(1,'操作失败'); + } + }else{ + return to_assign(1,'只要超级管理员和创建人才有权限操作'); + } + } else { + $param['admin_id'] = $this->uid; + $param['create_time'] = time(); + $count = Db::name('DiskGroup')->where([['delete_time','=',0],['title','=',$param['title']]])->count(); + if ($count > 0) { + return to_assign(1, '该共享空间名称已经被其他员工占用'); + } + $gid = Db::name('DiskGroup')->strict(false)->field(true)->insertGetId($param); + if($gid!=false){ + add_log('add', $gid, $param); + return to_assign(0,'添加成功',$gid); + }else{ + return to_assign(1,'操作失败'); + } + } + } + } + + //删除 + public function del_group() + { + if (request()->isDelete()) { + $id = get_params("id"); + $uid=$this->uid; + $detail = Db::name('DiskGroup')->where('id',$id)->find(); + if($uid==1 || $detail['admin_id'] == $uid){ + $count = Db::name('Disk')->where(["group_id" => $id,'delete_time'=>0])->count(); + if ($count > 0) { + return to_assign(1, "该共享空间还存在文件,请去除文件或者转移文件后再删除"); + } + if (Db::name('DiskGroup')->delete($id) !== false) { + add_log('delete', $id, []); + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + }else{ + return to_assign(1,'只要超级管理员和创建人才有权限操作'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 新增上传文件 + */ + public function add_upload() + { + $param = get_params(); + if (request()->isAjax()) { + try { + validate(DiskValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $this->model->add($param); + } + } + + /** + * 新增文件夹 + */ + public function add_folder() + { + $param = get_params(); + if (request()->isAjax()) { + try { + validate(DiskValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['types'] = 2; + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $this->model->add($param); + } + } + + public function add_article() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('Article')->strict(false)->field(true)->update($param); + if ($res !== false) { + add_log('edit', $param['id'], $param); + $disk['id'] = $param['disk_id']; + $disk['name'] = $param['name']; + $disk['update_time'] = $param['update_time']; + $this->model->edit($disk); + } else { + return to_assign(1, "操作失败"); + } + + } else { + $param['admin_id'] = $this->uid; + $param['create_time'] = time(); + $aid = Db::name('Article')->strict(false)->field(true)->insertGetId($param); + if ($aid !== false) { + add_log('add', $aid, $param); + $param['action_id'] = $aid; + $param['types'] = 1; + $param['ext'] = 'article'; + $param['did'] = $this->did; + $this->model->add($param); + } else { + return to_assign(1, "操作失败"); + } + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + $group_id = isset($param['group_id']) ? $param['group_id'] : 0; + if ($id>0) { + $file = $this->model->getById($id); + $detail = Db::name('Article')->find($file['action_id']); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + $detail['disk_id'] = $id; + View::assign('detail', $detail); + return view('edit_article'); + } + View::assign('pid', $pid); + View::assign('group_id', $group_id); + return view(); + } + } + //查看在线文档 + public function view_article() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $file = $this->model->getById($id); + $detail = Db::name('Article')->find($file['action_id']); + $detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name'); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + } + return view(); + } + + /** + * 新增文件夹 + */ + public function rename() + { + $param = get_params(); + if (request()->isAjax()) { + $uid=$this->uid; + $detail = Db::name('Disk')->where('id',$param['id'])->find(); + if($uid==1 || $detail['admin_id'] == $uid){ + try { + validate(DiskValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + }else{ + return to_assign(1,'只要超级管理员和创建人才有权限操作'); + } + } + } + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + if (request()->isDelete()) { + $ids = $param["ids"]; + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + $file = Db::name('Disk')->find($val); + if($file['admin_id'] != $this->uid && $this->uid>1){ + return to_assign(1, "删除失败,【".$file['name']."】不是你上传的文件"); + break; + } + $count = Db::name('Disk')->where(['pid'=>$val,'delete_time'=>0])->count(); + if($count>0){ + return to_assign(1, "删除失败,请先清空【".$file['name']."】里面的文件"); + break; + } + $list[] = [ + 'id' => $val, + 'delete_time' => time() + ]; + } + if(!empty($list)){ + $model = new DiskModel(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + /** + * 恢复 + */ + public function back() + { + $param = get_params(); + if (request()->isAjax()) { + $ids = $param["ids"]; + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'delete_time' => 0 + ]; + } + if(!empty($list)){ + $model = new DiskModel(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 清除 + */ + public function clear() + { + $param = get_params(); + if (request()->isAjax()) { + $ids = $param["ids"]; + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'clear_time' => time() + ]; + } + if(!empty($list)){ + $model = new DiskModel(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //查找父文件的所有父ids + public function get_pidsa($id) + { + $pid = Db::name('Disk')->where('id',$id)->value('pid'); + if($pid==0){ + return []; + } + else{ + $pids=$this->get_pids($pid); + $pids[] = $pid; + return $pids; + } + return []; + } + //while方法 + public function get_pids($categoryId) + { + $parentIds = []; + while ($categoryId > 0) { + $category = Db::name('Disk')->where('id',$categoryId)->find(); + if ($category && $category['pid'] > 0) { + $parentIds[] = $category['id']; + $categoryId = $category['pid']; + } else { + break; + } + } + return $parentIds; + } + + /** + * 移动 + */ + public function move() + { + $param = get_params(); + if (request()->isAjax()) { + $ids = $param["ids"]; + $pid = $param["pid"]; + $pids = $this->get_pids($pid); + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + if(in_array($val,$pids) || $val==$pid){ + $file = Db::name('Disk')->find($val); + return to_assign(1, "移动失败,【".$file['name']."】不能移动到文件夹本身或其子目录"); + break; + } + $list[] = [ + 'id' => $val, + 'pid' => $pid, + 'update_time' => time() + ]; + } + if(!empty($list)){ + $model = new DiskModel(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "转移失败"); + } + }else{ + $pid = isset($param['pid']) ? $param['pid']: 0 ; + $group_id = isset($param['group_id']) ? $param['group_id']: 0 ; + $path = get_pfolder($pid); + $folder = Db::name('Disk')->where(['pid'=>$pid,'group_id'=>$group_id,'types'=>2,'delete_time'=>0])->order('id desc')->select()->toArray(); + $pfolder = '全部文件'; + if($pid>0){ + $pfolder = Db::name('Disk')->where(['id'=>$pid])->value('name'); + } + View::assign('pid', $pid); + View::assign('pfolder', $pfolder); + View::assign('path', $path); + View::assign('folder', $folder); + View::assign('group_id', $group_id); + return view(); + } + } + + /** + * 标星 + */ + public function star() + { + $param = get_params(); + if (request()->isAjax()) { + $ids = $param["ids"]; + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'is_star' => 1, + 'update_time' => time() + ]; + } + if(!empty($list)){ + $model = new DiskModel(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "操作失败"); + } + } + } + + /** + * 取消标星 + */ + public function unstar() + { + $param = get_params(); + if (request()->isAjax()) { + $ids = $param["ids"]; + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'is_star' => 0, + 'update_time' => time() + ]; + } + if(!empty($list)){ + $model = new DiskModel(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "操作失败"); + } + } + } +} diff --git a/app/disk/event.php b/app/disk/event.php new file mode 100644 index 0000000..4eff890 --- /dev/null +++ b/app/disk/event.php @@ -0,0 +1,5 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\disk\model; +use think\model; +use think\facade\Db; +class Disk extends Model +{ + protected $autoWriteTimestamp=false; + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param,$where,$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->orderRaw("case when types = 2 then 1 else 2 end, id desc") + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->department = Db::name('Department')->where('id',$item->did)->value('title'); + if($item->types == 0){ + $item->filepath = Db::name('File')->where('id',$item->action_id)->value('filepath'); + $item->thumbpath = Db::name('File')->where('id',$item->action_id)->value('thumbpath'); + if(empty($item->thumbpath)){ + $item->thumbpath = $item->filepath; + } + } + else{ + $item->filepath=''; + $item->thumbpath=''; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + $info = self::find($param['id']); + if($info['types'] == 0){ + Db::name('File')->where('id',$info['action_id'])->update(['name'=>$param['name']]); + } + if($info['types'] == 1){ + Db::name('Article')->where('id',$info['action_id'])->update(['name'=>$param['name'],'update_time'=>time()]); + } + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/disk/validate/DiskValidate.php b/app/disk/validate/DiskValidate.php new file mode 100644 index 0000000..99e9e31 --- /dev/null +++ b/app/disk/validate/DiskValidate.php @@ -0,0 +1,41 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\disk\validate; +use think\Validate; +use think\facade\Db; + +class DiskValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $count = Db::name('Disk')->where([['name','=',$data['name']],['group_id','=',$data['group_id']],['pid','=',$data['pid']],['id','<>',$data['id']]])->count(); + return $count == 0 ? true : false; + } + protected $rule = [ + 'name' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '名称不能为空', + 'name.checkOne' => '同一目录下不能有相同名称的文件', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['name'], + 'edit' => ['name', 'id'], + ]; +} \ No newline at end of file diff --git a/app/disk/view/api/adminlist.html b/app/disk/view/api/adminlist.html new file mode 100644 index 0000000..8fb7d4d --- /dev/null +++ b/app/disk/view/api/adminlist.html @@ -0,0 +1,120 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/api/memberlist.html b/app/disk/view/api/memberlist.html new file mode 100644 index 0000000..e48506f --- /dev/null +++ b/app/disk/view/api/memberlist.html @@ -0,0 +1,120 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+
+
+ +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/add_article.html b/app/disk/view/index/add_article.html new file mode 100644 index 0000000..4442b92 --- /dev/null +++ b/app/disk/view/index/add_article.html @@ -0,0 +1,76 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
+

新增文档

+ + + + + + + + + + + + + +
文档标题*
+
关联附件
+
+ +
+
+
+ +
+
文档内容*
+
+ + + + +
+
+{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/alllist.html b/app/disk/view/index/alllist.html new file mode 100644 index 0000000..10a111d --- /dev/null +++ b/app/disk/view/index/alllist.html @@ -0,0 +1,320 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
+
+

全部文件

+
+
    +
  • 全部
  • +
  • 图片
  • +
  • 视频
  • +
  • 音频
  • +
  • Office文件
  • +
  • 在线文档
  • +
  • 压缩文件
  • +
+
+
+
+
+ {gt name="$auth" value="0"} +
+ + +
+ {else/} + {gt name="$is_leader" value="0"} +
+ + +
+ {/gt} + {/gt} +
+ +
+
+ + + + + +
+
+ + +
+
+
    +
    +
    + + +
    +
    +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/clearlist.html b/app/disk/view/index/clearlist.html new file mode 100644 index 0000000..d3bd2ae --- /dev/null +++ b/app/disk/view/index/clearlist.html @@ -0,0 +1,319 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
    +
    +

    回收站文件

    +
    +
      +
    • 全部
    • +
    • 图片
    • +
    • 视频
    • +
    • 音频
    • +
    • Office文件
    • +
    • 在线文档
    • +
    • 压缩文件
    • +
    +
    +
    +
    +
    +
    + +
    +
    + + + + + +
    +
    + + +
    +
    +
      +
      +
      + + +
      +
      +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/datalist.html b/app/disk/view/index/datalist.html new file mode 100644 index 0000000..aa2066d --- /dev/null +++ b/app/disk/view/index/datalist.html @@ -0,0 +1,536 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
      +
      +

      我的空间

      +
      +
        +
      • 全部
      • +
      • 图片
      • +
      • 视频
      • +
      • 音频
      • +
      • Office文件
      • +
      • 在线文档
      • +
      • 压缩文件
      • +
      +

      +
        +
      • 标星文件
      • +
      +
      +
      +
      +
      +
      +
      + 上传文件 + 新建文档 + 新建目录 +
      +
      +
      + +
      +
      + + + + + + + +
      +
      +
      + +
      +
      + + 删除 + 移动 +
      +
      +
      + +
      +
      +
        +
        +
        + + +
        +
        +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/edit_article.html b/app/disk/view/index/edit_article.html new file mode 100644 index 0000000..d98e989 --- /dev/null +++ b/app/disk/view/index/edit_article.html @@ -0,0 +1,81 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
        +

        新增文档

        + + + + + + + + + + + + + +
        文档标题*
        +
        关联附件
        +
        + +
        +
        +
        + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
        {:file_card($vo)}
        + {/volist} + {/notempty} +
        +
        文档内容*
        +
        + + + + +
        +
        +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/move.html b/app/disk/view/index/move.html new file mode 100644 index 0000000..6d37618 --- /dev/null +++ b/app/disk/view/index/move.html @@ -0,0 +1,61 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
        +
        +
        + 根目录 + {volist name="$path" id="vo"} + {$vo.name} + {/volist} +
        +
        +
        + {empty name="$folder"} +

        移动到 【{$pfolder}】 文件夹

        + {/empty} +
          + {volist name="$folder" id="vo"} +
        • {$vo.name}
        • + {/volist} +
        +
        + + +
        +{/block} + +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/sharelist.html b/app/disk/view/index/sharelist.html new file mode 100644 index 0000000..40029f8 --- /dev/null +++ b/app/disk/view/index/sharelist.html @@ -0,0 +1,558 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
        +
        +

        共享空间

        +
        +
          +
        • 公司共享
        • +
        +
        + +
        +
        +
        +
        +
        + 上传文件 + 新建文档 + 新建目录 +
        +
        +
        + +
        +
        + + + + + + + +
        +
        +
        + +
        +
        +
          +
        • 全部
        • +
        • 图片
        • +
        • 视频
        • +
        • 音频
        • +
        • Office文件
        • +
        • 在线文档
        • +
        • 压缩包
        • +
        +
        +
        +
        + +
        + +
        +
          +
          +
          + + +
          +
          +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/disk/view/index/view_article.html b/app/disk/view/index/view_article.html new file mode 100644 index 0000000..9ade36c --- /dev/null +++ b/app/disk/view/index/view_article.html @@ -0,0 +1,59 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
          +

          {$detail.name}

          +
          + 发表于:{$detail.create_time | date='Y-m-d H:i:s'} + 发布人:{$detail.admin_name} +
          +
          + {$detail.content|raw} +
          + {notempty name="$detail.file_ids"} +

          相关附件

          +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          + {/notempty} +
          +{/block} + + + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/exception/Http.php b/app/exception/Http.php new file mode 100644 index 0000000..25f4989 --- /dev/null +++ b/app/exception/Http.php @@ -0,0 +1,29 @@ +getError(), 422); + to_assign(1, $e->getError(), [], '', 422); + } + + // 请求异常 + if ($e instanceof HttpException && $request->isAjax()) { + //return response($e->getMessage(), $e->getStatusCode()); + to_assign(1, $e->getMessage(), [], '', $e->getStatusCode()); + } + + // 其他错误交给系统处理 + return parent::render($request, $e); + } +} \ No newline at end of file diff --git a/app/finance/common.php b/app/finance/common.php new file mode 100644 index 0000000..cb90979 --- /dev/null +++ b/app/finance/common.php @@ -0,0 +1,79 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +use think\facade\Db; + +//是否是报销打款管理员,count>1即有权限 +function isAuthExpense($uid) +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['name', '=', 'finance_admin']; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_1)")]; + $count = Db::name('DataAuth')->where($map)->count(); + return $count; +} + +//是否是发票管理员,count>1即有权限 +function isAuthInvoice($uid) +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['name', '=', 'finance_admin']; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_2)")]; + $count = Db::name('DataAuth')->where($map)->count(); + return $count; +} + +//是否是到账管理员,count>1即有权限 +function isAuthIncome($uid) +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['name', '=', 'finance_admin']; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_3)")]; + $count = Db::name('DataAuth')->where($map)->count(); + return $count; +} + +//是否是付款管理员,count>1即有权限 +function isAuthPayment($uid) +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['name', '=', 'finance_admin']; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_4)")]; + $count = Db::name('DataAuth')->where($map)->count(); + return $count; +} + +//是否是借支打款管理员,count>1即有权限 +function isAuthLoan($uid) +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['name', '=', 'finance_admin']; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_5)")]; + $count = Db::name('DataAuth')->where($map)->count(); + return $count; +} \ No newline at end of file diff --git a/app/finance/controller/Api.php b/app/finance/controller/Api.php new file mode 100644 index 0000000..8ffc49f --- /dev/null +++ b/app/finance/controller/Api.php @@ -0,0 +1,350 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\finance\controller; + +use app\api\BaseController; +use app\finance\model\Loan; +use app\finance\model\Expense; +use app\finance\model\Invoice; +use app\finance\model\InvoiceIncome; +use app\finance\model\Ticket; +use app\finance\model\TicketPayment; +use think\facade\Db; +use think\facade\View; + +class Api extends BaseController +{ + //获取获取借支 + public function get_loan() + { + $param = get_params(); + $where = array(); + $where[] = ['delete_time', '=', 0]; + $where[] = ['admin_id', '=', $this->uid]; + $where[] = ['balance_status', '<', 2]; + $where[] = ['pay_status', '=', 1]; + $where[] = ['check_status', '=', 2]; + $where[] = ['back_status', '=', 0]; + /* + if(!empty($param['project_id'])){ + $where[] = ['project_id', '=', $param['project_id']]; + } + else{ + $where[] = ['project_id', '=', 0]; + } + */ + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('Loan')->where($where) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) { + $item['create_time'] = to_date($item['create_time'],'Y-m-d'); + $item['pay_time'] = to_date($item['pay_time'],'Y-m-d'); + $item['un_balance_cost'] = ($item['cost']*100 - $item['balance_cost']*100)/100; + if($item['balance_status']==0){ + $item['balance_name']='待冲抵'; + } + if($item['balance_status']==1){ + $item['balance_name']='部分冲抵'; + } + return $item; + }); + return table_assign(0, '', $list); + } + //删除报销项 + public function del_expense_interfix() + { + $id = get_params("id"); + $admin_id = Db::name('ExpenseInterfix')->where('id', $id)->value('admin_id'); + if ($admin_id == $this->uid) { + if (Db::name('ExpenseInterfix')->where('id', $id)->delete() !== false) { + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } else { + return to_assign(1, "您不是申请人,没权限删除该报销数据"); + } + } + + //报销设置为已打款 + public function topay() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthExpense($this->uid); + if($auth == 0){ + return to_assign(1, "你没有打款权限,请联系管理员或者HR"); + } + //打款,数据操作 + $param['pay_status'] = 1; + $param['pay_admin_id'] = $this->uid; + $param['pay_time'] = time(); + $res = Expense::where('id', $param['id'])->strict(false)->field(true)->update($param); + if ($res !== false) { + add_log('topay', $param['id'],$param,'报销'); + //发送消息通知 + $detail = Expense::where(['id' => $param['id']])->find(); + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$detail['admin_id'],//接收人 + 'template_id'=>'expense_pay',//消息模板标识 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s'), + 'action_id'=>$detail['id'], + 'title' => '报销' + ] + ]; + event('SendMessage',$msg); + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //借支设置为已打款 + public function topay2() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthExpense($this->uid); + if($auth == 0){ + return to_assign(1, "你没有打款权限,请联系管理员或者HR"); + } + //打款,数据操作 + $param['pay_status'] = 1; + $param['pay_admin_id'] = $this->uid; + $param['pay_time'] = time(); + $res = Loan::where('id', $param['id'])->strict(false)->field(true)->update($param); + if ($res !== false) { + add_log('topay', $param['id'],$param,'借支'); + //发送消息通知 + $detail = Loan::where(['id' => $param['id']])->find(); + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$detail['admin_id'],//接收人 + 'template_id'=>'loan_pay',//消息模板标识 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s'), + 'action_id'=>$detail['id'], + 'title' => '借支' + ] + ]; + event('SendMessage',$msg); + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //借支设置为已归还 + public function topay3() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthExpense($this->uid); + if($auth == 0){ + return to_assign(1, "你没有操作权限,请联系管理员或者HR"); + } + //打款,数据操作 + $param['back_status'] = 1; + $param['back_admin_id'] = $this->uid; + $param['back_time'] = time(); + $res = Loan::where('id', $param['id'])->strict(false)->field(true)->update($param); + if ($res !== false) { + add_log('toback', $param['id'],$param,'借支'); + //发送消息通知 + $detail = Loan::where(['id' => $param['id']])->find(); + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$detail['admin_id'],//接收人 + 'template_id'=>'loan_back',//消息模板标识 + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s'), + 'action_id'=>$detail['id'], + 'title' => '借支' + ] + ]; + event('SendMessage',$msg); + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //开具发票 + public function open() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthInvoice($this->uid); + if($auth == 0){ + return to_assign(1, "你没有开票权限,请联系管理员或者HR"); + } + $status = Invoice::where(['id' => $param['id']])->value('check_status'); + if ($status == 2) { + $param['open_status'] = 1; + $param['open_admin_id'] = $this->uid; + } + if(isset($param['open_time'])){ + $param['open_time'] = strtotime(urldecode($param['open_time'])); + } + $res = Invoice::where('id', $param['id'])->strict(false)->field('code,open_status,open_time,open_admin_id,delivery')->update($param); + if ($res !== false) { + add_log('open', $param['id'],$param,'发票'); + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //作废发票 + public function tovoid() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthInvoice($this->uid); + if($auth == 0){ + return to_assign(1, "你没有作废发票权限,请联系管理员或者HR"); + } + $count = InvoiceIncome::where(['invoice_id'=>$param['id'],'status'=>1])->count(); + if($count>0){ + return to_assign(1, "发票已经新增有回款记录,请先反回款后再作废发票"); + } + else{ + $param['update_time'] = time(); + $param['open_status'] = 2; + } + $res = Invoice::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param); + if ($res !== false) { + return to_assign(); + add_log('tovoid', $param['id'],$param,'发票'); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //反作废发票 + public function novoid() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthInvoice($this->uid); + if($auth == 0){ + return to_assign(1, "你没有反作废发票权限,请联系管理员或者HR"); + } + $param['open_status'] = 1; + $param['update_time'] = time(); + $res = Invoice::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param); + if ($res !== false) { + return to_assign(); + add_log('novoid', $param['id'],$param,'发票'); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //上传电子发票 + public function upload_invoice() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthInvoice($this->uid); + if($auth == 0){ + return to_assign(1, "你没有开票权限,请联系管理员或者HR"); + } + $param['update_time'] = time(); + $res = Invoice::where('id', $param['id'])->strict(false)->field('update_time,other_file_ids')->update($param); + if ($res !== false) { + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } + } + + + //作废收票 + public function tovoid_ticket() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthInvoice($this->uid); + if($auth == 0){ + return to_assign(1, "你没有作废发票权限,请联系管理员或者HR"); + } + $count = TicketPayment::where(['ticket_id'=>$param['id'],'status'=>1])->count(); + if($count>0){ + return to_assign(1, "发票已经新增有付款记录,请先反付款后再作废发票"); + } + else{ + $param['update_time'] = time(); + $param['open_status'] = 2; + } + $res = Ticket::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param); + if ($res !== false) { + return to_assign(); + add_log('tovoid', $param['id'],$param,'发票'); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //反作废收票 + public function novoid_ticket() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthInvoice($this->uid); + if($auth == 0){ + return to_assign(1, "你没有反作废发票权限,请联系管理员或者HR"); + } + $param['open_status'] = 1; + $param['update_time'] = time(); + $res = Ticket::where('id', $param['id'])->strict(false)->field('update_time,open_status')->update($param); + if ($res !== false) { + return to_assign(); + add_log('novoid', $param['id'],$param,'发票'); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //上传 + public function upload_ticket() + { + $param = get_params(); + if (request()->isAjax()) { + $auth = isAuthInvoice($this->uid); + if($auth == 0){ + return to_assign(1, "你没有发票权限,请联系管理员或者HR"); + } + $param['update_time'] = time(); + $res = Ticket::where('id', $param['id'])->strict(false)->field('update_time,other_file_ids')->update($param); + if ($res !== false) { + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } + } + +} diff --git a/app/finance/controller/Costcate.php b/app/finance/controller/Costcate.php new file mode 100644 index 0000000..07d16a7 --- /dev/null +++ b/app/finance/controller/Costcate.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\CostCate as CostCateModel; +use app\finance\validate\CostcateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Costcate extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CostCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(CostcateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(CostcateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/finance/controller/Expense.php b/app/finance/controller/Expense.php new file mode 100644 index 0000000..b2acc94 --- /dev/null +++ b/app/finance/controller/Expense.php @@ -0,0 +1,284 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\Expense as ExpenseModel; +use app\finance\validate\ExpenseValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Expense extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ExpenseModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid = $this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + if($tab == 0){ + //全部 + $auth = isAuthExpense($uid); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 1){ + //我创建的 + $where[] = ['admin_id', '=', $this->uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if($tab == 5){ + //已打款的 + $where[] = ['pay_status', '=', 1]; + $auth = isAuthExpense($uid); + if($auth == 0){ + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + $whereOr[] = ['admin_id', '=', $this->uid]; + } + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['income_month', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['pay_status']) && $param['pay_status'] != "") { + $where[] = ['pay_status', '=', $param['pay_status']]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['income_month'] = isset($param['income_month']) ? strtotime(urldecode($param['income_month'])) : 0; + $param['expense_time'] = isset($param['expense_time']) ? strtotime(urldecode($param['expense_time'])) : 0; + $amountData = isset($param['amount']) ? $param['amount'] : '0'; + $cost = 0; + if ($amountData == 0) { + return to_assign(1,'报销金额不完善'); + } + else{ + foreach ($amountData as $key => $value) { + if ($value == 0) { + return to_assign(1,'第' . ($key + 1) . '条报销选项的金额不能为零'); + } + else{ + $cost+=$value; + } + } + } + if($cost==0){ + return to_assign(1,'报销金额不能为零'); + } + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $param['cost'] = $cost; + $param['pay_amount'] = $cost; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ExpenseValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if(!empty($param['loan_id'])){ + $loan = Db::name('Loan')->where('id',$param['loan_id'])->find(); + $balance_cost = Db::name('Expense')->where([['delete_time','=',0],['loan_id','=',$param['loan_id']],['id','<>',$param['id']]])->sum('balance_cost'); + $un_balance_cost = ($loan['cost']*100 - $balance_cost*100)/100; + if($un_balance_cost<0){ + return to_assign(1,'所选借支已经冲抵完毕,不支持冲抵'); + } + $balance_cost = $un_balance_cost*100 - $cost*100; + if($balance_cost>=0){ + $param['balance_cost'] = $cost; + $param['pay_amount'] = 0; + } + else{ + $param['balance_cost'] = $un_balance_cost; + $param['pay_amount'] = ($cost *100 - $un_balance_cost*100)/100; + } + } + $this->model->edit($param); + } else { + try { + validate(ExpenseValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if(!empty($param['loan_id'])){ + $loan = Db::name('Loan')->where('id',$param['loan_id'])->find(); + $un_balance_cost = ($loan['cost']*100 - $loan['balance_cost']*100)/100; + if($un_balance_cost<0){ + return to_assign(1,'所选借支已经冲抵完毕,不支持冲抵'); + } + $balance_cost = $un_balance_cost*100 - $cost*100; + if($balance_cost>=0){ + $param['balance_cost'] = $cost; + $param['pay_amount'] = 0; + } + else{ + $param['balance_cost'] = $un_balance_cost; + $param['pay_amount'] = ($cost *100 - $un_balance_cost*100)/100; + } + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $is_codeno = Db::name('DataAuth')->where('name','finance_admin')->value('conf_10'); + View::assign('is_codeno', $is_codeno); + View::assign('expense_cate', Db::name('ExpenseCate')->where(['status' => 1])->select()->toArray()); + View::assign('user', get_admin($this->uid)); + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/add_expense'); + } + return view('edit'); + } + $codeno=''; + if($is_codeno==1){ + $codeno = get_codeno(3); + } + View::assign('codeno', $codeno); + if(is_mobile()){ + return view('qiye@/finance/add_expense'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + View::assign('create_user', get_admin($detail['admin_id'])); + if(is_mobile()){ + return view('qiye@/finance/view_expense'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //报销记录 + public function record() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $where[]=['delete_time','=',0]; + $where[]=['check_status','=',2]; + if(isAuthExpense($this->uid)==0){ + $where[] = ['admin_id', '=', $this->uid]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['expense_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['pay_status']) && $param['pay_status'] != "") { + $where[] = ['pay_status', '=', $param['pay_status']]; + } + $list = $this->model->datalist($param,$where); + + $cost = $this->model::where($where)->sum('cost'); + $totalRow['cost'] = sprintf("%.2f",$cost); + return table_assign(0, '', $list); + } else { + View::assign('authExpense',isAuthExpense($this->uid)); + return view(); + } + } + +} diff --git a/app/finance/controller/Expensecate.php b/app/finance/controller/Expensecate.php new file mode 100644 index 0000000..25693cb --- /dev/null +++ b/app/finance/controller/Expensecate.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\ExpenseCate as ExpenseCateModel; +use app\finance\validate\ExpensecateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Expensecate extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ExpenseCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ExpensecateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(ExpensecateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/finance/controller/Income.php b/app/finance/controller/Income.php new file mode 100644 index 0000000..572cf02 --- /dev/null +++ b/app/finance/controller/Income.php @@ -0,0 +1,288 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\Invoice as InvoiceModel; +use app\finance\model\InvoiceIncome; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Income extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new InvoiceModel(); + } + + public function datalist() + { + $uid = $this->uid; + $auth = isAuthIncome($uid); + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $whereOr = array(); + $where[] = ['delete_time', '=', 0]; + $where[] = ['check_status', '=', 2]; + $where[] = ['open_status', '=', 1]; + $where[] = ['invoice_type','>',0]; + if($auth == 0){ + $whereOr[] = ['admin_id','=',$this->uid]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['enter_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['enter_status']) && $param['enter_status']!='') { + $where[] = ['enter_status', '=', $param['enter_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + View::assign('auth', $auth); + return view(); + } + } + + //查看 + public function add() + { + $param = get_params(); + $auth = isAuthIncome($this->uid); + if (request()->isAjax()) { + if($auth == 0){ + return to_assign(1, "你没有到账管理权限,请联系管理员或者HR"); + } + $invoice_id = $param['invoice_id']; + $admin_id = $this->uid; + //计算已到账的金额 + $hasIncome = InvoiceIncome::where(['invoice_id'=>$invoice_id,'status'=>1])->sum('amount'); + //查询发票金额 + $invoiceAmount = $this->model->where(['id'=>$invoice_id])->value('amount'); + if($param['enter_type']==1){ //单个到账记录 + //相关内容多个数组 + $enterPriceData=isset($param['amount'])? $param['amount'] : ''; + $enterTimeData=isset($param['enter_time'])? $param['enter_time'] : ''; + $remarksData=isset($param['remarks'])? $param['remarks'] : ''; + + //把合同协议关联的单个内容的发票入账明细重新添加 + if($enterPriceData){ + $enter_price = 0; + $insert = []; + $time = time(); + foreach ($enterPriceData as $key => $value) { + if (!$value ) continue; + $insert[] = [ + 'invoice_id' => $invoice_id, + 'amount' => $value, + 'enter_time' => $enterTimeData[$key]? strtotime($enterTimeData[$key]) : 0, + 'remarks' => $remarksData[$key], + 'admin_id' => $admin_id, + 'create_time' => $time + ]; + $enter_price += $value*100; + } + if(($enter_price + $hasIncome*100)> $invoiceAmount*100){ + return to_assign(1,'到账金额大于发票金额,不允许保存'); + } + else{ + $res = InvoiceIncome::strict(false)->field(true)->insertAll($insert); + if($res!==false){ + if(($enter_price + $hasIncome*100) == $invoiceAmount*100){ + //发票全部到账 + $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>2,'enter_amount'=>$invoiceAmount,'enter_time'=>time()]); + } + else if(($enter_price + $hasIncome*100) < $invoiceAmount*100){ + $incomeTotal=($enter_price + $hasIncome*100)/100; + //发票部分到账 + $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>1,'enter_amount'=>$incomeTotal,'enter_time'=>time()]); + } + add_log('add',$invoice_id,$param); + return to_assign(); + } + else{ + return to_assign(1,'保存失败'); + } + } + } + else{ + return to_assign(1,'提交的到账数据异常,请核对再提交'); + } + } + else if($param['enter_type']==2){ //全部到账记录 + $enter_price = ($invoiceAmount*100-$hasIncome*100)/100; + $data = [ + 'invoice_id' => $invoice_id, + 'amount' => $enter_price, + 'enter_time' => isset($param['enter_time'])? strtotime($param['enter_time']) : 0, + 'remarks' => '一次性全部到账', + 'admin_id' => $admin_id, + 'create_time' => time() + ]; + $res = InvoiceIncome::strict(false)->field(true)->insertGetId($data); + if($res!==false){ + //设置发票全部到账 + $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>2,'enter_amount'=>$invoiceAmount,'enter_time'=>time()]); + add_log('add',$invoice_id,$param); + return to_assign(); + } + } + else if ($param['enter_type']==3) {//全部反账记录 + //作废初始化发票到账数据 + $res = InvoiceIncome::where(['invoice_id'=>$invoice_id])->update(['status'=>'6','update_time'=>time()]); + if($res!==false){ + //设置发票全部没到账 + $this->model->where(['id'=>$invoice_id])->update(['enter_status'=>0,'enter_amount'=>0,'enter_time'=>0]); + add_log('tovoid',$invoice_id,$param); + return to_assign(); + } + } + } + else{ + if($auth == 0){ + return view(EEEOR_REPORTING,['code'=>405,'warning'=>'无权限访问']); + } + $id = isset($param['id']) ? $param['id']: 0 ; + $detail = $this->model->getById($id); + if(empty($detail)){ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到记录']); + } + $detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title'); + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + $other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select(); + $detail['other_file_array'] = $other_file_array; + if($detail['open_status']>0){ + $detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name'); + } + $not_income = ($detail['amount']*100 - $detail['enter_amount']*100)/100; + $detail['not_income'] = sprintf("%.2f",$not_income); + //已到账的记录 + $detail['income'] = InvoiceIncome::field('i.*,a.name as admin') + ->alias('i') + ->join('Admin a', 'a.id = i.admin_id', 'LEFT') + ->where(['i.invoice_id'=>$id,'i.status'=>1]) + ->order('i.enter_time desc') + ->select(); + View::assign('uid', $this->uid); + View::assign('id', $id); + View::assign('detail', $detail); + if($detail['invoice_type'] == 0){ + return view('add_a'); + } + return view(); + } + } + //查看 + public function view() + { + $id = empty(get_params('id')) ? 0 : get_params('id'); + $detail = $this->model->getById($id); + if(empty($detail)){ + throw new \think\exception\HttpException(406, '找不到记录'); + } + $detail['not_income'] = ($detail['amount']*100 - $detail['enter_amount']*100)/100; + //已到账的记录 + $detail['income'] = InvoiceIncome::field('i.*,a.name as admin') + ->alias('i') + ->join('Admin a', 'a.id = i.admin_id', 'LEFT') + ->where(['i.invoice_id'=>$id,'i.status'=>1]) + ->order('i.enter_time desc') + ->select(); + + $detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title'); + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + $other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select(); + $detail['other_file_array'] = $other_file_array; + if($detail['open_status']>0){ + $detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name'); + } + View::assign('uid', $this->uid); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/view_income'); + } + return view(); + } + + //删除到账记录 + public function del() + { + $param = get_params(); + if (request()->isAjax()) { + $income =InvoiceIncome::where(['id'=>$param['id']])->find(); + $invoice = $this->model->where(['id'=>$income['invoice_id']])->find(); + if($income){ + $res = InvoiceIncome::where(['id'=>$param['id']])->update(['status'=>'6','update_time'=>time()]); + if($res!==false){ + if($income['amount']*100 == $invoice['amount']*100){ + //发票全部反到账 + $this->model->where(['id'=>$income['invoice_id']])->update(['enter_status'=>0,'enter_amount'=>0,'enter_time'=>0]); + } + else if($income['amount']*100 < $invoice['amount']*100){ + $incomeTotal=InvoiceIncome::where(['invoice_id'=>$income['invoice_id'],'status'=>1])->sum('amount'); + //发票部分到账 + $this->model->where(['id'=>$income['invoice_id']])->update(['enter_status'=>1,'enter_amount'=>$incomeTotal,'enter_time'=>time()]); + } + add_log('enter',$income['invoice_id'],$invoice); + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + } + } + + + //回款记录 + public function record() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $where[]=['status','=',1]; + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['enter_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + $model = new InvoiceIncome(); + $list = $model->datalist($param,$where); + + $amount = $model::where($where)->sum('amount'); + $totalRow['amount'] = sprintf("%.2f",$amount); + return table_assign(0, '', $list); + } else { + return view(); + } + } +} diff --git a/app/finance/controller/Invoice.php b/app/finance/controller/Invoice.php new file mode 100644 index 0000000..92f8d86 --- /dev/null +++ b/app/finance/controller/Invoice.php @@ -0,0 +1,380 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\Invoice as InvoiceModel; +use app\finance\validate\InvoiceValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Invoice extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new InvoiceModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid=$this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + $where[]=['invoice_type','>',0]; + if($tab == 0){ + $auth = isAuthInvoice($uid); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 1){ + //我创建的 + $where[] = ['admin_id', '=', $this->uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if($tab == 5){ + //已开具的 + $where[] = ['open_status', '=', 1]; + } + if($tab == 6){ + //已作废的 + $where[] = ['open_status', '=', 2]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['open_status']) && $param['open_status'] != "") { + $where[] = ['open_status', '=', $param['open_status']]; + } + if (isset($param['enter_status']) && $param['enter_status'] != "") { + $where[] = ['enter_status', '=', $param['enter_status']]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if ($param['types'] == 1) { + if (!$param['invoice_bank']) { + return to_assign(1, '开户银行不能为空'); + } + if (!$param['invoice_account']) { + return to_assign(1, '银行账号不能为空'); + } + } + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(InvoiceValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(InvoiceValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/add_invoice'); + } + return view('edit'); + } + if(is_mobile()){ + return view('qiye@/finance/add_invoice'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select(); + $detail['other_file_array'] = $other_file_array; + if($detail['open_status']>0){ + $detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name'); + } + View::assign('detail', $detail); + View::assign('create_user', get_admin($detail['admin_id'])); + if(is_mobile()){ + return view('qiye@/finance/view_invoice'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //开票记录 + public function record() + { + $uid = $this->uid; + $auth = isAuthInvoice($uid); + if (request()->isAjax()) { + $param = get_params(); + $tab = isset($param['tab']) ? $param['tab'] : 0; + $where = []; + $whereOr = []; + $where[]=['delete_time','=',0]; + $where[]=['check_status','=',2]; + $where[]=['invoice_type','>',0]; + if($auth == 0){ + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + if($tab == 0){ + //正常的 + $where[] = ['open_status', '<', 2]; + } + if($tab == 1){ + //已作废的 + $where[] = ['open_status', '=', 2]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['open_status']) && $param['open_status'] != "") { + $where[] = ['open_status', '=', $param['open_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + + $amount = $this->model::where($where)->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + })->sum('amount'); + $totalRow['amount'] = sprintf("%.2f",$amount); + return table_assign(0, '', $list); + } else { + + View::assign('authInvoice', $auth); + return view(); + } + } + + + /** + * 无发票回款列表 + */ + public function datalist_a() + { + $param = get_params(); + if (request()->isAjax()) { + $uid=$this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + $where[]=['invoice_type','=',0]; + + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $auth = isAuthInvoice($uid); + if($auth == 0){ + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['enter_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['enter_status']) && $param['enter_status'] != "") { + $where[] = ['enter_status', '=', $param['enter_status']]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('auth', isAuthIncome($this->uid)); + return view(); + } + } + + /** + * 无发票添加/编辑 + */ + public function add_a() + { + $param = get_params(); + if (request()->isAjax()) { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(InvoiceValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(InvoiceValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/add_invoice_a'); + } + return view('edit_a'); + } + if(is_mobile()){ + return view('qiye@/finance/add_invoice_a'); + } + return view(); + } + } + + /** + * 无发票查看 + */ + public function view_a($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title'); + $other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select(); + $detail['other_file_array'] = $other_file_array; + if($detail['open_status']>0){ + $detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name'); + } + View::assign('detail', $detail); + View::assign('create_user', get_admin($detail['admin_id'])); + if(is_mobile()){ + return view('qiye@/finance/view_invoice_a'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del_a($id) + { + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/finance/controller/Loan.php b/app/finance/controller/Loan.php new file mode 100644 index 0000000..d878463 --- /dev/null +++ b/app/finance/controller/Loan.php @@ -0,0 +1,231 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\Loan as LoanModel; +use app\finance\validate\LoanValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Loan extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new LoanModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid = $this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + if($tab == 0){ + //全部 + $auth = isAuthLoan($uid); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 1){ + //我创建的 + $where[] = ['admin_id', '=', $this->uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if($tab == 5){ + //已打款的 + $where[] = ['pay_status', '=', 1]; + $auth = isAuthLoan($uid); + if($auth == 0){ + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + $whereOr[] = ['admin_id', '=', $this->uid]; + } + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['create_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['pay_status']) && $param['pay_status'] != "") { + $where[] = ['pay_status', '=', $param['pay_status']]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['loan_time'] = isset($param['loan_time']) ? strtotime(urldecode($param['loan_time'])) : 0; + $param['plan_time'] = isset($param['plan_time']) ? strtotime(urldecode($param['plan_time'])) : 0; + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(LoanValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(LoanValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $is_codeno = Db::name('DataAuth')->where('name','finance_admin')->value('conf_9'); + View::assign('is_codeno', $is_codeno); + View::assign('user', get_admin($this->uid)); + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/add_loan'); + } + return view('edit'); + } + $codeno=''; + if($is_codeno==1){ + $codeno = get_codeno(4); + } + View::assign('codeno', $codeno); + if(is_mobile()){ + return view('qiye@/finance/add_loan'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['expense'] = Db::name('Expense')->where(['delete_time'=>0,'loan_id'=>$id])->select()->toArray(); + View::assign('detail', $detail); + View::assign('create_user', get_admin($detail['admin_id'])); + if(is_mobile()){ + return view('qiye@/finance/view_loan'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //借支记录 + public function record() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $where[]=['delete_time','=',0]; + $where[]=['check_status','=',2]; + if(isAuthLoan($this->uid)==0){ + $where[] = ['admin_id', '=', $this->uid]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['loan_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['pay_status']) && $param['pay_status'] != "") { + $where[] = ['pay_status', '=', $param['pay_status']]; + } + $list = $this->model->datalist($param,$where); + + $cost = $this->model::where($where)->sum('cost'); + $totalRow['cost'] = sprintf("%.2f",$cost); + return table_assign(0, '', $list); + } else { + View::assign('isAuthLoan',isAuthLoan($this->uid)); + return view(); + } + } + +} diff --git a/app/finance/controller/Payment.php b/app/finance/controller/Payment.php new file mode 100644 index 0000000..f5e30ab --- /dev/null +++ b/app/finance/controller/Payment.php @@ -0,0 +1,281 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\Ticket as TicketModel; +use app\finance\model\TicketPayment; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Payment extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new TicketModel(); + } + + public function datalist() + { + $auth = isAuthPayment($this->uid); + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $whereOr = array(); + $where[] = ['delete_time', '=', 0]; + $where[] = ['check_status', '=', 2]; + $where[] = ['open_status', '=', 1]; + $where[] = ['invoice_type','>',0]; + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['pay_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['pay_status']) && $param['pay_status']!='') { + $where[] = ['pay_status', '=', $param['pay_status']]; + } + if($auth == 0){ + $where[] = ['admin_id','=',$this->uid]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + View::assign('auth', $auth); + return view(); + } + } + + //查看 + public function add() + { + $param = get_params(); + $auth = isAuthPayment($this->uid); + if (request()->isAjax()) { + if($auth == 0){ + return to_assign(1, "你没有付款管理权限,请联系管理员或者HR"); + } + $ticket_id = $param['ticket_id']; + $admin_id = $this->uid; + //计算已付款的金额 + $hasPay = TicketPayment::where(['ticket_id'=>$ticket_id,'status'=>1])->sum('amount'); + //查询发票金额 + $ticketAmount = $this->model->where(['id'=>$ticket_id])->value('amount'); + if($param['pay_type']==1){ //单个付款记录 + //相关内容多个数组 + $payPriceData=isset($param['amount'])? $param['amount'] : ''; + $payTimeData=isset($param['pay_time'])? $param['pay_time'] : ''; + $remarksData=isset($param['remarks'])? $param['remarks'] : ''; + + //把合同协议关联的单个内容的发票入账明细重新添加 + if($payPriceData){ + $pay_price = 0; + $insert = []; + $time = time(); + foreach ($payPriceData as $key => $value) { + if (!$value ) continue; + $insert[] = [ + 'ticket_id' => $ticket_id, + 'amount' => $value, + 'pay_time' => $payTimeData[$key]? strtotime($payTimeData[$key]) : 0, + 'remarks' => $remarksData[$key], + 'admin_id' => $admin_id, + 'create_time' => $time + ]; + $pay_price += $value*100; + } + if(($pay_price + $hasPay*100)> $ticketAmount*100){ + return to_assign(1,'付款金额大于发票金额,不允许保存'); + } + else{ + $res = TicketPayment::strict(false)->field(true)->insertAll($insert); + if($res!==false){ + if(($pay_price + $hasPay*100) == $ticketAmount*100){ + //发票全部付款 + $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>2,'pay_amount'=>$ticketAmount,'pay_time'=>time()]); + } + else if(($pay_price + $hasPay*100) < $ticketAmount*100){ + $payTotal=($pay_price + $hasPay*100)/100; + //发票部分付款 + $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>1,'pay_amount'=>$payTotal,'pay_time'=>time()]); + } + add_log('add',$ticket_id,$param); + return to_assign(); + } + else{ + return to_assign(1,'保存失败'); + } + } + } + else{ + return to_assign(1,'提交的付款数据异常,请核对再提交'); + } + } + else if($param['pay_type']==2){ //全部付款记录 + $pay_price = ($ticketAmount*100-$hasPay*100)/100; + $data = [ + 'ticket_id' => $ticket_id, + 'amount' => $pay_price, + 'pay_time' => isset($param['pay_time'])? strtotime($param['pay_time']) : 0, + 'remarks' => '一次性全部付款', + 'admin_id' => $admin_id, + 'create_time' => time() + ]; + $res = TicketPayment::strict(false)->field(true)->insertGetId($data); + if($res!==false){ + //设置发票全部付款 + $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>2,'pay_amount'=>$ticketAmount,'pay_time'=>time()]); + add_log('add',$ticket_id,$param); + return to_assign(); + } + } + else if ($param['pay_type']==3) {//全部反账记录 + //作废初始化发票付款数据 + $res = TicketPayment::where(['ticket_id'=>$ticket_id])->update(['status'=>'6','update_time'=>time()]); + if($res!==false){ + //设置发票全部没付款 + $this->model->where(['id'=>$ticket_id])->update(['pay_status'=>0,'pay_amount'=>0,'pay_time'=>0]); + add_log('tovoid',$ticket_id,$param); + return to_assign(); + } + } + } + else{ + if($auth == 0){ + return view(EEEOR_REPORTING,['code'=>405,'warning'=>'无权限访问']); + } + $id = isset($param['id']) ? $param['id']: 0 ; + $detail = $this->model->getById($id); + if(empty($detail)){ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到记录']); + } + $detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title'); + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + $other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select(); + $detail['other_file_array'] = $other_file_array; + if($detail['open_status']>0){ + $detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name'); + } + $not_pay = ($detail['amount']*100 - $detail['pay_amount']*100)/100; + $detail['not_pay'] = sprintf("%.2f",$not_pay); + //已付款的记录 + $detail['payment'] = TicketPayment::field('i.*,a.name as admin') + ->alias('i') + ->join('Admin a', 'a.id = i.admin_id', 'LEFT') + ->where(['i.ticket_id'=>$id,'i.status'=>1]) + ->order('i.pay_time desc') + ->select(); + View::assign('uid', $this->uid); + View::assign('id', $id); + View::assign('detail', $detail); + if($detail['invoice_type'] == 0){ + return view('add_a'); + } + return view(); + } + } + //查看 + public function view() + { + $id = empty(get_params('id')) ? 0 : get_params('id'); + $detail = $this->model->getById($id); + if(empty($detail)){ + throw new \think\exception\HttpException(406, '找不到记录'); + } + $detail['not_pay'] = ($detail['amount']*100 - $detail['pay_amount']*100)/100; + //已付款的记录 + $detail['payment'] = TicketPayment::field('i.*,a.name as admin') + ->alias('i') + ->join('Admin a', 'a.id = i.admin_id', 'LEFT') + ->where(['i.ticket_id'=>$id,'i.status'=>1]) + ->order('i.pay_time desc') + ->select(); + + $detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title'); + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + $other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select(); + $detail['other_file_array'] = $other_file_array; + if($detail['open_status']>0){ + $detail['open_admin_name'] = Db::name('Admin')->where('id','=',$detail['open_admin_id'])->value('name'); + } + View::assign('uid', $this->uid); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/view_payment'); + } + return view(); + } + + //删除付款记录 + public function del() + { + $param = get_params(); + if (request()->isAjax()) { + $payment =TicketPayment::where(['id'=>$param['id']])->find(); + $ticket = $this->model->where(['id'=>$payment['ticket_id']])->find(); + if($payment){ + $res = TicketPayment::where(['id'=>$param['id']])->update(['status'=>'6','update_time'=>time()]); + if($res!==false){ + if($payment['amount']*100 == $ticket['amount']*100){ + //发票全部反付款 + $this->model->where(['id'=>$payment['ticket_id']])->update(['pay_status'=>0,'pay_amount'=>0,'pay_time'=>0]); + } + else if($payment['amount']*100 < $ticket['amount']*100){ + $payTotal=TicketPayment::where(['ticket_id'=>$payment['ticket_id'],'status'=>1])->sum('amount'); + //发票部分付款 + $this->model->where(['id'=>$payment['ticket_id']])->update(['pay_status'=>1,'pay_amount'=>$payTotal,'pay_time'=>time()]); + } + add_log('pay',$payment['ticket_id'],$ticket); + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + } + } + + + //回款记录 + public function record() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $where[]=['status','=',1]; + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['pay_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + $model = new TicketPayment(); + $list = $model->datalist($param,$where); + + $amount = $model::where($where)->sum('amount'); + $totalRow['amount'] = sprintf("%.2f",$amount); + return table_assign(0, '', $list); + } else { + return view(); + } + } +} diff --git a/app/finance/controller/Ticket.php b/app/finance/controller/Ticket.php new file mode 100644 index 0000000..c7b78ee --- /dev/null +++ b/app/finance/controller/Ticket.php @@ -0,0 +1,346 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\finance\controller; + +use app\base\BaseController; +use app\finance\model\Ticket as TicketModel; +use app\finance\validate\TicketValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Ticket extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new TicketModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid=$this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + $where[]=['invoice_type','>',0]; + if($tab == 0){ + $auth = isAuthInvoice($uid); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 1){ + //我创建的 + $where[] = ['admin_id', '=', $this->uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['open_status']) && $param['open_status'] != "") { + $where[] = ['open_status', '=', $param['open_status']]; + } + if (isset($param['pay_status']) && $param['pay_status'] != "") { + $where[] = ['pay_status', '=', $param['pay_status']]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + if (!empty($param['open_time'])) { + $param['open_time'] = strtotime(urldecode($param['open_time'])); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(TicketValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(TicketValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/add_ticket'); + } + return view('edit'); + } + if(is_mobile()){ + return view('qiye@/finance/add_ticket'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + View::assign('create_user', get_admin($detail['admin_id'])); + if(is_mobile()){ + return view('qiye@/finance/view_ticket'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //收票记录 + public function record() + { + $uid = $this->uid; + $auth = isAuthInvoice($uid); + if (request()->isAjax()) { + $param = get_params(); + $tab = isset($param['tab']) ? $param['tab'] : 0; + $where = []; + $where[]=['delete_time','=',0]; + $where[]=['check_status','=',2]; + $where[]=['invoice_type','>',0]; + if($auth == 0){ + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + if($tab == 0){ + //正常的 + $where[] = ['open_status', '<', 2]; + } + if($tab == 1){ + //已作废的 + $where[] = ['open_status', '=', 2]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['open_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['open_status']) && $param['open_status'] != "") { + $where[] = ['open_status', '=', $param['open_status']]; + } + $list = $this->model->datalist($param,$where); + + $amount = $this->model::where($where)->sum('amount'); + $totalRow['amount'] = sprintf("%.2f",$amount); + return table_assign(0, '', $list); + } else { + View::assign('authInvoice',$auth); + return view(); + } + } + + /** + * 无发票付款列表 + */ + public function datalist_a() + { + $param = get_params(); + if (request()->isAjax()) { + $uid=$this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + $where[]=['invoice_type','=',0]; + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['pay_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + if (isset($param['pay_status']) && $param['pay_status'] != "") { + $where[] = ['pay_status', '=', $param['pay_status']]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('auth', isAuthPayment($this->uid)); + return view(); + } + } + + /** + * 无发票付款添加/编辑 + */ + public function add_a() + { + $param = get_params(); + if (request()->isAjax()) { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + if (!empty($param['open_time'])) { + $param['open_time'] = strtotime(urldecode($param['open_time'])); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(TicketValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(TicketValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/finance/add_ticket_a'); + } + return view('edit_a'); + } + if(is_mobile()){ + return view('qiye@/finance/add_ticket_a'); + } + return view(); + } + } + + /** + * 无发票付款查看 + */ + public function view_a($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['subject'] = Db::name('Enterprise')->where(['id' =>$detail['invoice_subject']])->value('title'); + $other_file_array = Db::name('File')->where('id','in',$detail['other_file_ids'])->select(); + $detail['other_file_array'] = $other_file_array; + View::assign('detail', $detail); + View::assign('create_user', get_admin($detail['admin_id'])); + if(is_mobile()){ + return view('qiye@/finance/view_ticket_a'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 无发票付款删除 + */ + public function del_a() + { + $param = get_params(); + if (request()->isDelete()) { + $this->model->delById($param['id']); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/finance/event.php b/app/finance/event.php new file mode 100644 index 0000000..afe5918 --- /dev/null +++ b/app/finance/event.php @@ -0,0 +1,8 @@ + [ + //注册监听类 + 'SendMessage' => ['app\listener\SendMessage'], + ], + //'subscribe' => ['app\subscribe\Message'], +]; diff --git a/app/finance/middleware.php b/app/finance/middleware.php new file mode 100644 index 0000000..c482cdc --- /dev/null +++ b/app/finance/middleware.php @@ -0,0 +1,9 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\finance\model; +use think\model; +use think\facade\Db; +class CostCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/finance/model/Expense.php b/app/finance/model/Expense.php new file mode 100644 index 0000000..d8b3fcf --- /dev/null +++ b/app/finance/model/Expense.php @@ -0,0 +1,249 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\finance\model; +use think\model; +use think\facade\Db; +class Expense extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->check_status_str = check_status_name($item->check_status); + $item->income_month_str = empty($item->income_month) ? '-' : date('Y-m', $item->income_month); + $item->expense_time = empty($item->expense_time) ? '-' : date('Y-m-d', $item->expense_time); + $item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name'); + $item->department = Db::name('Department')->where(['id' => $item->did])->value('title'); + $item->create_time = to_date($item->create_time); + $item['check_user'] = '-'; + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_user'] = implode(',',$check_user); + } + if($item->pay_admin_id>0){ + $item->pay_name = Db::name('Admin')->where(['id' => $item->pay_admin_id])->value('name'); + $item->pay_time = date('Y-m-d H:i', $item->pay_time); + } + else{ + $item->pay_name='-'; + $item->pay_time='-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + //更新冲帐 + public function update_loan($id) + { + $balance_cost = Db::name('Expense')->where(['delete_time'=>0,'loan_id'=>$id])->sum('balance_cost'); + $loan = Db::name('Loan')->where('id',$id)->find(); + if($balance_cost*100 == $loan['cost']*100){ + Db::name('Loan')->where('id',$id)->update(['balance_cost'=>$balance_cost,'balance_status'=>2,'back_status'=>2]); + } + if($balance_cost*100 < $loan['cost']*100 && $balance_cost*100>0){ + Db::name('Loan')->where('id',$id)->update(['balance_cost'=>$balance_cost,'balance_status'=>1,'back_status'=>0]); + } + if($balance_cost == 0){ + Db::name('Loan')->where('id',$id)->update(['balance_cost'=>$balance_cost,'balance_status'=>0,'back_status'=>0]); + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + //相报销选项多个数组; + $amountData = isset($param['amount']) ? $param['amount'] : ''; + $remarksData = isset($param['remarks']) ? $param['remarks'] : ''; + $cateData = isset($param['cate_id']) ? $param['cate_id'] : ''; + $idData = isset($param['expense_id']) ? $param['expense_id'] : 0; + if ($amountData) { + foreach ($amountData as $key => $value) { + if (!$value) { + continue; + } + $data = []; + $data['id'] = $idData[$key]; + $data['exid'] = $insertId; + $data['admin_id'] = $param['admin_id']; + $data['amount'] = $amountData[$key]; + $data['cate_id'] = $cateData[$key]; + $data['remarks'] = $remarksData[$key]; + if ($data['id'] > 0) { + $data['update_time'] = time(); + $resa = Db::name('ExpenseInterfix')->strict(false)->field(true)->update($data); + } else { + $data['create_time'] = time(); + $eid = Db::name('ExpenseInterfix')->strict(false)->field(true)->insertGetId($data); + } + } + } + if(!empty($param['loan_id'])){ + $this->update_loan($param['loan_id']); + } + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + $old_loan_id = self::where('id', $param['id'])->value('loan_id'); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + //相报销选项多个数组; + $amountData = isset($param['amount']) ? $param['amount'] : ''; + $remarksData = isset($param['remarks']) ? $param['remarks'] : ''; + $cateData = isset($param['cate_id']) ? $param['cate_id'] : ''; + $idData = isset($param['expense_id']) ? $param['expense_id'] : 0; + if ($amountData) { + foreach ($amountData as $key => $value) { + if (!$value) { + continue; + } + $data = []; + $data['id'] = $idData[$key]; + $data['exid'] = $param['id']; + $data['admin_id'] = $param['admin_id']; + $data['amount'] = $amountData[$key]; + $data['cate_id'] = $cateData[$key]; + $data['remarks'] = $remarksData[$key]; + if ($data['id'] > 0) { + $data['update_time'] = time(); + $resa = Db::name('ExpenseInterfix')->strict(false)->field(true)->update($data); + } else { + $data['create_time'] = time(); + $eid = Db::name('ExpenseInterfix')->strict(false)->field(true)->insertGetId($data); + } + } + } + if(!empty($param['loan_id'])){ + $this->update_loan($param['loan_id']); + } + if(!empty($old_loan_id)){ + $this->update_loan($old_loan_id); + } + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['income_month_str'] = to_date($info['income_month'],'Y-m'); + $info['expense_time'] = empty($info['expense_time']) ? '-' : date('Y-m-d', $info['expense_time']); + $info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name'); + $info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + if ($info['pay_time'] > 0) { + $info['pay_time'] = date('Y-m-d H:i:s', $info['pay_time']); + $info['pay_admin'] = Db::name('Admin')->where(['id' => $info['pay_admin_id']])->value('name'); + } + else{ + $info['pay_time'] = '-'; + } + if ($info['project_id'] > 0) { + $info['ptname'] = Db::name('Project')->where(['id' => $info['project_id']])->value('name'); + } + else{ + $info['ptname'] = ''; + } + if ($info['subject_id'] > 0) { + $info['subject_name'] = Db::name('Enterprise')->where(['id' => $info['subject_id']])->value('title'); + } + $info['list'] = Db::name('ExpenseInterfix') + ->field('a.*,c.title as cate_title') + ->alias('a') + ->join('ExpenseCate c', 'a.cate_id = c.id','LEFT') + ->where(['a.exid' => $info['id']]) + ->select(); + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + $loan_id = self::where('id', $id)->value('loan_id'); + if($loan_id>0){ + update_loan($loan_id); + } + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/finance/model/ExpenseCate.php b/app/finance/model/ExpenseCate.php new file mode 100644 index 0000000..48653bd --- /dev/null +++ b/app/finance/model/ExpenseCate.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\finance\model; +use think\model; +use think\facade\Db; +class ExpenseCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/finance/model/Invoice.php b/app/finance/model/Invoice.php new file mode 100644 index 0000000..5d90f2f --- /dev/null +++ b/app/finance/model/Invoice.php @@ -0,0 +1,154 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\finance\model; +use think\model; +use think\facade\Db; +class Invoice extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->check_status_str = check_status_name($item->check_status); + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->department = Db::name('Department')->where(['id' => $item->did])->value('title'); + $item->create_time = to_date($item->create_time); + $item['check_user'] = '-'; + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_user'] = implode(',',$check_user); + } + if($item->open_admin_id>0){ + $item->open_name = Db::name('Admin')->where(['id' => $item->open_admin_id])->value('name'); + $item->open_time = date('Y-m-d', $item->open_time); + } + else{ + $item->open_name='-'; + $item->open_time=''; + $item->code=''; + } + if($item->enter_time>0){ + $item->enter_time = date('Y-m-d', $item->enter_time); + } + else{ + $item->enter_time='-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name'); + $info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + $info['subject'] = Db::name('Enterprise')->where(['id' =>$info['invoice_subject']])->value('title'); + if($info['contract_id']>0){ + $info['contract_name'] = Db::name('Contract')->where('id',$info['contract_id'])->value('name'); + } + if($info['project_id']>0){ + $info['project_name'] = Db::name('Project')->where('id',$info['project_id'])->value('name'); + } + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/finance/model/InvoiceIncome.php b/app/finance/model/InvoiceIncome.php new file mode 100644 index 0000000..f9e9541 --- /dev/null +++ b/app/finance/model/InvoiceIncome.php @@ -0,0 +1,38 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\model; +use think\Model; +use think\facade\Db; +class InvoiceIncome extends Model +{ + public function datalist($param,$where) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name'); + $item['enter_time'] = date('Y-m-d',$item['enter_time']); + $item['code'] = Db::name('Invoice')->where('id',$item['invoice_id'])->value('code'); + $item['create_time'] = to_date($item['create_time']); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } +} \ No newline at end of file diff --git a/app/finance/model/Loan.php b/app/finance/model/Loan.php new file mode 100644 index 0000000..36a9668 --- /dev/null +++ b/app/finance/model/Loan.php @@ -0,0 +1,168 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\finance\model; +use think\model; +use think\facade\Db; +class Loan extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->check_status_str = check_status_name($item->check_status); + $item->loan_time = to_date($item->loan_time,'Y-m-d'); + $item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name'); + $item->department = Db::name('Department')->where(['id' => $item->did])->value('title'); + $item->create_time = to_date($item->create_time); + $item->plan_time = to_date($item->plan_time,'Y-m-d'); + $item->delay = count_days(date("Y-m-d"),$item->plan_time); + $item['check_user'] = '-'; + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_user'] = implode(',',$check_user); + } + if($item->pay_admin_id>0){ + $item->pay_name = Db::name('Admin')->where(['id' => $item->pay_admin_id])->value('name'); + $item->pay_time = date('Y-m-d H:i', $item->pay_time); + } + else{ + $item->pay_name='-'; + $item->pay_time='-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['loan_time'] = empty($info['loan_time']) ? '-' : date('Y-m-d', $info['loan_time']); + $info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name'); + $info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + if ($info['pay_time'] > 0) { + $info['pay_time'] = date('Y-m-d H:i:s', $info['pay_time']); + $info['pay_admin'] = Db::name('Admin')->where(['id' => $info['pay_admin_id']])->value('name'); + } + else{ + $info['pay_time'] = '-'; + $info['pay_admin'] = '-'; + } + if ($info['back_time'] > 0) { + $info['back_time'] = date('Y-m-d H:i:s', $info['back_time']); + $info['back_admin'] = Db::name('Admin')->where(['id' => $info['back_admin_id']])->value('name'); + } + else{ + $info['back_time'] = '-'; + $info['back_admin'] = '-'; + } + if ($info['project_id'] > 0) { + $info['ptname'] = Db::name('Project')->where(['id' => $info['project_id']])->value('name'); + } + else{ + $info['ptname'] = ''; + } + if ($info['subject_id'] > 0) { + $info['subject_name'] = Db::name('Enterprise')->where(['id' => $info['subject_id']])->value('title'); + } + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/finance/model/Ticket.php b/app/finance/model/Ticket.php new file mode 100644 index 0000000..6ce2d9d --- /dev/null +++ b/app/finance/model/Ticket.php @@ -0,0 +1,154 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\finance\model; +use think\model; +use think\facade\Db; +class Ticket extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->check_status_str = check_status_name($item->check_status); + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->department = Db::name('Department')->where(['id' => $item->did])->value('title'); + $item->supplier_name = Db::name('Supplier')->where(['id' => $item->supplier_id])->value('title'); + $item->create_time = to_date($item->create_time); + $item['check_user'] = '-'; + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_user'] = implode(',',$check_user); + } + $item->open_time = date('Y-m-d', $item->open_time); + if($item->pay_time>0){ + $item->pay_time = date('Y-m-d', $item->pay_time); + } + else{ + $item->pay_time='-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name'); + $info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + $info['subject'] = Db::name('Enterprise')->where(['id' =>$info['invoice_subject']])->value('title'); + $info['supplier_name'] = Db::name('Supplier')->where(['id' => $info['supplier_id']])->value('title'); + if($info['purchase_id']>0){ + $info['purchase_name'] = Db::name('Purchase')->where('id',$info['purchase_id'])->value('name'); + } + if($info['project_id']>0){ + $info['project_name'] = Db::name('Project')->where('id',$info['project_id'])->value('name'); + } + if($info['open_time']>0){ + $info['open_time'] = date('Y-m-d',$info['open_time']); + } + else{ + $info['open_time']=''; + } + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/finance/model/TicketPayment.php b/app/finance/model/TicketPayment.php new file mode 100644 index 0000000..8945fad --- /dev/null +++ b/app/finance/model/TicketPayment.php @@ -0,0 +1,38 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\model; +use think\Model; +use think\facade\Db; +class TicketPayment extends Model +{ + public function datalist($param,$where) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name'); + $item['pay_time'] = date('Y-m-d',$item['pay_time']); + $item['code'] = Db::name('Ticket')->where('id',$item['ticket_id'])->value('code'); + $item['create_time'] = to_date($item['create_time']); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } +} \ No newline at end of file diff --git a/app/finance/validate/CostcateValidate.php b/app/finance/validate/CostcateValidate.php new file mode 100644 index 0000000..75cc4af --- /dev/null +++ b/app/finance/validate/CostcateValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\validate; +use think\Validate; +use think\facade\Db; + +class CostcateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('CostCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/finance/validate/ExpenseValidate.php b/app/finance/validate/ExpenseValidate.php new file mode 100644 index 0000000..b5ff858 --- /dev/null +++ b/app/finance/validate/ExpenseValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\validate; +use think\Validate; +use think\facade\Db; + +class ExpenseValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Expense')->where([['code','=',$data['code']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'code' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'code.require' => '报销凭证编号不能为空', + 'code.checkOne' => '同样的报销凭证编号已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['code'], + 'edit' => ['code', 'id'], + ]; +} \ No newline at end of file diff --git a/app/finance/validate/ExpensecateValidate.php b/app/finance/validate/ExpensecateValidate.php new file mode 100644 index 0000000..d659a46 --- /dev/null +++ b/app/finance/validate/ExpensecateValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\validate; +use think\Validate; +use think\facade\Db; + +class ExpensecateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('ExpenseCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/finance/validate/InvoiceValidate.php b/app/finance/validate/InvoiceValidate.php new file mode 100644 index 0000000..7be19c7 --- /dev/null +++ b/app/finance/validate/InvoiceValidate.php @@ -0,0 +1,39 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\validate; +use think\Validate; +use think\facade\Db; + +class InvoiceValidate extends Validate +{ + protected $rule = [ + 'amount' => 'require|float', + 'invoice_type' => 'require', + 'invoice_subject' => 'require', + 'id' => 'require' + ]; + + protected $message = [ + 'amount.require' => '开票金额不能为空', + 'amount.number' => '开票金额只能为数字', + 'id.require' => '缺少更新条件', + 'invoice_type.require' => '请选择开票类型', + 'invoice_subject.require' => '请选择开票主体', + ]; + + protected $scene = [ + 'add' => ['amount','invoice_subject'], + 'edit' => ['id', 'amount','invoice_subject'] + ]; +} \ No newline at end of file diff --git a/app/finance/validate/LoanValidate.php b/app/finance/validate/LoanValidate.php new file mode 100644 index 0000000..747af85 --- /dev/null +++ b/app/finance/validate/LoanValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\validate; +use think\Validate; +use think\facade\Db; + +class LoanValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Loan')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/finance/validate/TicketValidate.php b/app/finance/validate/TicketValidate.php new file mode 100644 index 0000000..9b463d0 --- /dev/null +++ b/app/finance/validate/TicketValidate.php @@ -0,0 +1,36 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\finance\validate; +use think\Validate; +use think\facade\Db; + +class TicketValidate extends Validate +{ + protected $rule = [ + 'amount' => 'require', + 'invoice_subject' => 'require', + 'id' => 'require' + ]; + + protected $message = [ + 'amount.require' => '发票金额不能为空', + 'id.require' => '缺少更新条件', + 'invoice_subject.require' => '请选择发票主体', + ]; + + protected $scene = [ + 'add' => ['amount','invoice_subject'], + 'edit' => ['id', 'amount','invoice_subject'] + ]; +} \ No newline at end of file diff --git a/app/finance/view/costcate/add.html b/app/finance/view/costcate/add.html new file mode 100644 index 0000000..96ef995 --- /dev/null +++ b/app/finance/view/costcate/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          费用类型

          + + + + + + + +
          费用类型名称* + + 排序 + +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/costcate/datalist.html b/app/finance/view/costcate/datalist.html new file mode 100644 index 0000000..2b1394b --- /dev/null +++ b/app/finance/view/costcate/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
          +
          +
          + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/costcate/view.html b/app/finance/view/costcate/view.html new file mode 100644 index 0000000..2bc9ed0 --- /dev/null +++ b/app/finance/view/costcate/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          费用类型详情

          + + + + + + + +
          费用类型名称{$detail.title|default=''}">排序{$detail.sort|default=0}
          +
          +{/block} + \ No newline at end of file diff --git a/app/finance/view/expense/add.html b/app/finance/view/expense/add.html new file mode 100644 index 0000000..5210867 --- /dev/null +++ b/app/finance/view/expense/add.html @@ -0,0 +1,168 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          添加报销申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          报销员工{$user.name}报销部门{$user.department}报销主体 + +
          凭证编号*单据日期* + 入账月份*
          关联项目 + + +
          冲抵借支 + + +
          报销选项* + + + + + + + + + + + + + +
          报销金额报销项目备注信息操作
          + + 删除
          +
          + +
          +
          +
          附件
          +
          +
          +
          + +
          +
          +
          +
          + + +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/expense/datalist.html b/app/finance/view/expense/datalist.html new file mode 100644 index 0000000..429fa62 --- /dev/null +++ b/app/finance/view/expense/datalist.html @@ -0,0 +1,214 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +
          +
          +
          +
            +
          • 全部
          • +
          • 我申请的
          • +
          • 待我审批
          • +
          • 我已审批
          • +
          • 抄送我的
          • +
          • 已打款
          • +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + + + +
          +
          +
          +
          + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/expense/edit.html b/app/finance/view/expense/edit.html new file mode 100644 index 0000000..c3cbbf5 --- /dev/null +++ b/app/finance/view/expense/edit.html @@ -0,0 +1,198 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          编辑报销申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          报销员工{$detail.admin_name}报销部门{$detail.department|default=''}报销主体 + +
          凭证编号*原始单据日期*入账月份*
          关联项目 + + +
          冲抵借支 + + +
          报销选项* + + + + + + + + {volist name="$detail.list" id="val"} + + + + + + + {/volist} +
          报销金额报销类别备注信息操作
          + + 删除
          +
          + +
          +
          +
          附件
          +
          +
          +
          + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          +
          +
          + + + +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/expense/record.html b/app/finance/view/expense/record.html new file mode 100644 index 0000000..da11762 --- /dev/null +++ b/app/finance/view/expense/record.html @@ -0,0 +1,186 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + + +
          +
          + +
          +
          + +
          +
          + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/expense/view.html b/app/finance/view/expense/view.html new file mode 100644 index 0000000..85c1184 --- /dev/null +++ b/app/finance/view/expense/view.html @@ -0,0 +1,115 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          报销详情

          + + + + + + + + + + + + + + {if condition="$detail.project_id > 0"} + + + + + {/if} + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {if ( $detail.check_status eq 2)} + {if ( $detail.pay_status eq 1)} + + + + + + + + + {else/} + + + + + + + + + {/if} + {/if} +
          凭证编号{$detail.code}入账月份{$detail.income_month_str}原始单据日期{$detail.expense_time}
          报销主体{$detail.subject_name|default='-'}
          关联项目{$detail.ptname}
          报销员工{$detail.admin_name}报销部门{$detail.department}报销总费用(元){$detail.cost}
          冲抵借支 + {$detail.balance_cost} + {if condition="$detail.loan_id > 0"} + [冲抵借支详情] + {/if} + 需打款费用(元){$detail.pay_amount}
          报销选项 + + + + + + + {volist name="$detail.list" id="vo"} + + + + + + {/volist} +
          报销金额(元)报销类别备注信息
          {$vo.amount}{$vo.cate_title}{$vo.remarks}
          +
          相关附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          打款状态已打款打款人{$detail.pay_admin}打款时间{$detail.pay_time}
          打款状态未打款打款人-打款时间-
          + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/expensecate/add.html b/app/finance/view/expensecate/add.html new file mode 100644 index 0000000..975da2f --- /dev/null +++ b/app/finance/view/expensecate/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          报销类型

          + + + + + + + +
          报销类型名称* + + 排序 + +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/expensecate/datalist.html b/app/finance/view/expensecate/datalist.html new file mode 100644 index 0000000..f4d8d60 --- /dev/null +++ b/app/finance/view/expensecate/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
          +
          +
          + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/expensecate/view.html b/app/finance/view/expensecate/view.html new file mode 100644 index 0000000..ed6edd2 --- /dev/null +++ b/app/finance/view/expensecate/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          报销类型详情

          + + + + + + + +
          报销类型名称{$detail.title|default=''}">排序{$detail.sort|default=0}
          +
          +{/block} + \ No newline at end of file diff --git a/app/finance/view/income/add.html b/app/finance/view/income/add.html new file mode 100644 index 0000000..ad6b7f0 --- /dev/null +++ b/app/finance/view/income/add.html @@ -0,0 +1,299 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +

          发票信息

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {if condition="$detail.open_admin_id > 0"} + + + + + + + + + {/if} + {notempty name="$detail.other_file_ids"} + + + + + {/notempty} +
          发票金额(元){$detail.amount}发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} + 发票主体{$detail.subject}
          抬头类型 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 发票抬头{$detail.invoice_title}电话号码{$detail.invoice_phone}
          纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
          银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          发票号码{$detail.code}开票人{$detail.open_admin_name}开票时间{$detail.open_time}
          发票附件 +
          + {volist name="$detail.other_file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + +

          回款信息

          +
          + + + + + + + + + + + + + +
          回款状态 + {if condition="($detail.enter_status == 0)"} + 未回款 + {elseif condition="($detail.enter_status == 1)"} + 部分回款 + {elseif condition="($detail.enter_status == 2)"} + 全部回款 + {/if} + 未回款金额(元){$detail.not_income}已回款金额(元){$detail.enter_amount}
          回款记录 + + + + + + + + {empty name="$detail.income"} + + + + {else/} + {volist name="$detail.income" id="vo"} + + + + + + + {/volist} + {/empty} +
          回款日期到帐金额(元)备注操作
          暂无回款记录
          {$vo.enter_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}删除
          + {if condition="($detail.enter_status lt 2)"} +
          + {/if} +
          +
          + + + {if condition="($detail.enter_status lt 2)"} + + + {/if} + {if condition="($detail.enter_status eq 0)"} + 全部回款 + {/if} + {if condition="($detail.enter_status eq 1)"} + 剩余部分全部回款 + {/if} + {if condition="($detail.enter_status gt 0)"} + 全部反回款 + {/if} +
          +
          + +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/income/add_a.html b/app/finance/view/income/add_a.html new file mode 100644 index 0000000..3d187a0 --- /dev/null +++ b/app/finance/view/income/add_a.html @@ -0,0 +1,271 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +

          无发票回款信息

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
          预回款金额(元){$detail.amount}收款主体{$detail.subject}
          付款主体 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 付款方名称{$detail.invoice_title}电话号码{$detail.invoice_phone}
          纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
          银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + +

          回款信息

          +
          + + + + + + + + + + + + + +
          回款状态 + {if condition="($detail.enter_status == 0)"} + 未回款 + {elseif condition="($detail.enter_status == 1)"} + 部分回款 + {elseif condition="($detail.enter_status == 2)"} + 全部回款 + {/if} + 未回款金额(元){$detail.not_income}已回款金额(元){$detail.enter_amount}
          回款记录 + + + + + + + + {empty name="$detail.income"} + + + + {else/} + {volist name="$detail.income" id="vo"} + + + + + + + {/volist} + {/empty} +
          回款日期到帐金额(元)备注操作
          暂无回款记录
          {$vo.enter_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}删除
          + {if condition="($detail.enter_status lt 2)"} +
          + {/if} +
          +
          + + + {if condition="($detail.enter_status lt 2)"} + + + {/if} + {if condition="($detail.enter_status eq 0)"} + 全部回款 + {/if} + {if condition="($detail.enter_status eq 1)"} + 剩余部分全部回款 + {/if} + {if condition="($detail.enter_status gt 0)"} + 全部反回款 + {/if} +
          +
          + +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/income/datalist.html b/app/finance/view/income/datalist.html new file mode 100644 index 0000000..43b8765 --- /dev/null +++ b/app/finance/view/income/datalist.html @@ -0,0 +1,199 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          + +
          +
          + +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/income/record.html b/app/finance/view/income/record.html new file mode 100644 index 0000000..d9bbdd3 --- /dev/null +++ b/app/finance/view/income/record.html @@ -0,0 +1,117 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/income/view.html b/app/finance/view/income/view.html new file mode 100644 index 0000000..db19de9 --- /dev/null +++ b/app/finance/view/income/view.html @@ -0,0 +1,216 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          + {eq name="$detail.invoice_type" value="0"} +

          无发票回款信息

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {notempty name="$detail.other_file_ids"} + + + + + {/notempty} +
          预回款金额(元){$detail.amount}收款主体{$detail.subject}
          付款主体 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 付款方名称{$detail.invoice_title}电话号码{$detail.invoice_phone}
          纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
          银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          发票附件 +
          + {volist name="$detail.other_file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + {else/} +

          发票信息

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {if condition="$detail.open_admin_id > 0"} + + + + + + + + + {/if} + {notempty name="$detail.other_file_ids"} + + + + + {/notempty} +
          发票金额(元){$detail.amount}发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} + 发票主体{$detail.subject}
          抬头类型 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 发票抬头{$detail.invoice_title}电话号码{$detail.invoice_phone}
          纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
          银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          发票号码{$detail.code}开票人{$detail.open_admin_name}开票时间{$detail.open_time|date='Y-m-d'}
          发票附件 +
          + {volist name="$detail.other_file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + {/eq} +

          回款信息

          +
          + + + + + + + + + + + + + +
          回款状态 + {if condition="($detail.enter_status == 0)"} + 未回款 + {elseif condition="($detail.enter_status == 1)"} + 部分回款 + {elseif condition="($detail.enter_status == 2)"} + 全部回款 + {/if} + 未回款金额(元){$detail.not_income}已回款金额(元){$detail.enter_amount}
          回款记录 + + + + + + + + + {empty name="$detail.income"} + + + + {else/} + {volist name="$detail.income" id="vo"} + + + + + + + + {/volist} + {/empty} +
          回款日期回款金额(元)备注登记人登记时间
          暂无回款记录
          {$vo.enter_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}{$vo.admin}{$vo.create_time | date='Y-m-d H:i:s'}
          +
          +
          + +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/invoice/add.html b/app/finance/view/invoice/add.html new file mode 100644 index 0000000..a1b7081 --- /dev/null +++ b/app/finance/view/invoice/add.html @@ -0,0 +1,166 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          新增开票申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          开票金额*开票类型* + + 开票主体* + +
          抬头类型* + + + 开票抬头选择纳税人识别号*
          开户行*银行账号*银行营业网点
          电话号码地址
          关联合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + +
          +
          备注信息
          +
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/invoice/add_a.html b/app/finance/view/invoice/add_a.html new file mode 100644 index 0000000..176ef83 --- /dev/null +++ b/app/finance/view/invoice/add_a.html @@ -0,0 +1,143 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          新增无发票回款申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          预回款金额*收款主体* + +
          付款主体* + + + 付款方名称选择纳税人识别号*
          关联合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + +
          +
          备注信息
          +
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/invoice/datalist.html b/app/finance/view/invoice/datalist.html new file mode 100644 index 0000000..ea69690 --- /dev/null +++ b/app/finance/view/invoice/datalist.html @@ -0,0 +1,237 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +
          +
          +
          +
            +
          • 全部
          • +
          • 我申请的
          • +
          • 待我审批
          • +
          • 我已审批
          • +
          • 抄送我的
          • +
          • 已开具
          • +
          • 已作废
          • +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + + + +
          +
          +
          +
          + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/invoice/datalist_a.html b/app/finance/view/invoice/datalist_a.html new file mode 100644 index 0000000..e347f7c --- /dev/null +++ b/app/finance/view/invoice/datalist_a.html @@ -0,0 +1,270 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          + +
          +
          + +
          +
          + +
          +
          + +
          +
          + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/invoice/edit.html b/app/finance/view/invoice/edit.html new file mode 100644 index 0000000..ffeff6e --- /dev/null +++ b/app/finance/view/invoice/edit.html @@ -0,0 +1,174 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          编辑开票申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          开票金额* + + 开票类型* + + 开票主体* + +
          抬头类型* + + + 开票抬头选择纳税人识别号*
          开户行*银行账号*银行营业网点
          电话号码地址
          关联合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          备注信息
          +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/invoice/edit_a.html b/app/finance/view/invoice/edit_a.html new file mode 100644 index 0000000..64daebf --- /dev/null +++ b/app/finance/view/invoice/edit_a.html @@ -0,0 +1,151 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          编辑无发票回款申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          预回款金额* + + 收款主体* + +
          付款主体* + + + 付款方名称选择纳税人识别号*
          关联合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          备注信息
          +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/invoice/record.html b/app/finance/view/invoice/record.html new file mode 100644 index 0000000..fea6251 --- /dev/null +++ b/app/finance/view/invoice/record.html @@ -0,0 +1,319 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +
          +
          +
            +
          • 正常
          • +
          • 已作废
          • +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/invoice/view.html b/app/finance/view/invoice/view.html new file mode 100644 index 0000000..4238f17 --- /dev/null +++ b/app/finance/view/invoice/view.html @@ -0,0 +1,157 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          发票详情

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {if condition="$detail.contract_id > 0"} + + + + + {/if} + {if condition="$detail.project_id > 0"} + + + + + {/if} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {if ( $detail.open_status gt 0)} + + + + + + + + + + + + + + + + + {/if} +
          开票金额{$detail.amount} 元开票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} + 开票主体{$detail.subject}
          抬头类型 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 开票抬头{$detail.invoice_title}电话号码{$detail.invoice_phone}
          纳税人识别号{$detail.invoice_tax}开户行{$detail.invoice_bank}银行账号{$detail.invoice_account}
          银行营业网点{$detail.invoice_banking}地址{$detail.invoice_address}
          关联的合同{$detail.contract_name|default=''}
          关联的项目{$detail.project_name|default=''}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          发票号码{$detail.code}{eq name="$detail.open_status" value="2"}『已作废』{/eq}开票人{$detail.open_admin_name}开票日期{$detail.open_time|date='Y-m-d'}
          物流单号{$detail.delivery}
          +
          发票附件
          +
          + +
          +
          +
          + + {notempty name="$detail.other_file_ids"} + {volist name="$detail.other_file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/invoice/view_a.html b/app/finance/view/invoice/view_a.html new file mode 100644 index 0000000..1a7de7b --- /dev/null +++ b/app/finance/view/invoice/view_a.html @@ -0,0 +1,137 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          无发票回款详情

          + + + + + + + + + + + + + + + + {if condition="$detail.contract_id > 0"} + + + + + {/if} + {if condition="$detail.project_id > 0"} + + + + + {/if} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {if ( $detail.open_status gt 0)} + + + + + + + + + + + + + + + + + {/if} +
          预回款金额{$detail.amount} 元收款主体{$detail.subject}
          付款主体 + {eq name="$detail.types" value="1"}企业{/eq} + {eq name="$detail.types" value="2"}个人{/eq} + 付款方名称{$detail.invoice_title}纳税人识别号{$detail.invoice_tax}
          关联的合同{$detail.contract_name|default=''}
          关联的项目{$detail.project_name|default=''}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          发票号码{$detail.code}{eq name="$detail.open_status" value="2"}『已作废』{/eq}开票人{$detail.open_admin_name}开票日期{$detail.open_time|date='Y-m-d'}
          物流单号{$detail.delivery}
          +
          发票附件
          +
          + +
          +
          +
          + + {notempty name="$detail.other_file_ids"} + {volist name="$detail.other_file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/loan/add.html b/app/finance/view/loan/add.html new file mode 100644 index 0000000..a026d33 --- /dev/null +++ b/app/finance/view/loan/add.html @@ -0,0 +1,123 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          添加借支申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          借支主题*借支企业主体 + +
          借支金额*借支员工{$user.name} ({$user.department})借支编号*
          借支类型* + + + 预计归还日期*
          借支理由*
          +
          附件
          +
          +
          +
          + +
          +
          +
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/loan/datalist.html b/app/finance/view/loan/datalist.html new file mode 100644 index 0000000..50b7958 --- /dev/null +++ b/app/finance/view/loan/datalist.html @@ -0,0 +1,255 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +
          +
          +
          +
            +
          • 全部
          • +
          • 我申请的
          • +
          • 待我审批
          • +
          • 我已审批
          • +
          • 抄送我的
          • +
          • 已打款
          • +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + + + +
          +
          +
          +
          + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/loan/edit.html b/app/finance/view/loan/edit.html new file mode 100644 index 0000000..40d18d5 --- /dev/null +++ b/app/finance/view/loan/edit.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          编辑借支申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          借支主题*借支企业主体 + +
          借支金额*借支员工{$detail.admin_name} ({$detail.department|default=''})借支编号*
          借支类型* + + + 预计归还日期*
          关联项目* + + +
          借支理由*
          +
          附件
          +
          +
          +
          + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/loan/record.html b/app/finance/view/loan/record.html new file mode 100644 index 0000000..8868163 --- /dev/null +++ b/app/finance/view/loan/record.html @@ -0,0 +1,221 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + + +
          +
          + +
          +
          + +
          +
          + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/loan/view.html b/app/finance/view/loan/view.html new file mode 100644 index 0000000..a3d6b2f --- /dev/null +++ b/app/finance/view/loan/view.html @@ -0,0 +1,146 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          借支详情

          + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.project_id"} + + + + + {/notempty} + + + + + {if ( $detail.check_status eq 2)} + {if ( $detail.pay_status eq 1)} + + + + + + + + + + + + + + + + + + {eq name="$detail.back_status" value="1"} + + + + + {/eq} + + {else/} + + + + + + + + + {/if} + {/if} + {notempty name="$detail.expense"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
          借支主题{$detail.title}借支企业主体{$detail.subject_name|default='-'}
          借支金额{$detail.cost} 元借支员工{$detail.admin_name} ({$detail.department})借支编号{$detail.code|default='-'}
          借支类型 + {eq name="$detail.types" value="1"}日常备用金{/eq} + {eq name="$detail.types" value="2"}项目预支款{/eq} + 预计归还日期{$detail.plan_time|date='Y-m-d'}
          关联项目{$detail.ptname|default=''}
          借支理由{$detail.content}
          打款状态已打款打款人{$detail.pay_admin}打款时间{$detail.pay_time}
          冲抵状态 + {eq name="$detail.balance_status" value="0"}未冲抵{/eq} + {eq name="$detail.balance_status" value="1"}部分冲抵{/eq} + {eq name="$detail.balance_status" value="2"}已冲抵{/eq} + 已冲抵金额{$detail.balance_cost}
          归还状态 + {eq name="$detail.back_status" value="0"}未还款{/eq} + {eq name="$detail.back_status" value="1"}已还款{/eq} + {eq name="$detail.back_status" value="2"}无需还款{/eq} + 归还经手人{$detail.back_admin}归还时间{$detail.back_time}
          打款状态未打款打款人-打款时间-
          冲抵记录 + + + + + + + + + + + {volist name="$detail.expense" id="vo"} + + + + + + + + + + {/volist} +
          报销总金额(元)冲抵金额(元)需打款金额(元)报销凭证编号原始单据日期入账月份操作
          {$vo.cost}{$vo.balance_cost}{$vo.pay_amount}{$vo.code}{$vo.expense_time|date='Y-m-d'}{$vo.income_month|date='Y-m'}详情
          +
          相关附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/payment/add.html b/app/finance/view/payment/add.html new file mode 100644 index 0000000..1171ef5 --- /dev/null +++ b/app/finance/view/payment/add.html @@ -0,0 +1,276 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +

          发票信息

          + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {if condition="$detail.open_admin_id > 0"} + + + + + + + {/if} + {notempty name="$detail.other_file_ids"} + + + + + {/notempty} +
          发票金额(元){$detail.amount}发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} +
          发票抬头{$detail.subject}开票主体(供应商){$detail.supplier_name}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          发票号码{$detail.code}开票时间{$detail.open_time}
          发票附件 +
          + {volist name="$detail.other_file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + +

          付款信息

          +
          + + + + + + + + + + + + + +
          付款状态 + {if condition="($detail.pay_status == 0)"} + 未付款 + {elseif condition="($detail.pay_status == 1)"} + 部分付款 + {elseif condition="($detail.pay_status == 2)"} + 全部付款 + {/if} + 未付款金额(元){$detail.not_pay}已付款金额(元){$detail.pay_amount}
          付款记录 + + + + + + + + {empty name="$detail.payment"} + + + + {else/} + {volist name="$detail.payment" id="vo"} + + + + + + + {/volist} + {/empty} +
          付款日期付款金额(元)备注操作
          暂无付款记录
          {$vo.pay_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}删除
          + {if condition="($detail.pay_status lt 2)"} +
          + {/if} +
          +
          + + + {if condition="($detail.pay_status lt 2)"} + + + {/if} + {if condition="($detail.pay_status eq 0)"} + 全部付款 + {/if} + {if condition="($detail.pay_status eq 1)"} + 剩余部分全部付款 + {/if} + {if condition="($detail.pay_status gt 0)"} + 全部反付款 + {/if} +
          +
          + +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/payment/add_a.html b/app/finance/view/payment/add_a.html new file mode 100644 index 0000000..ca3b52c --- /dev/null +++ b/app/finance/view/payment/add_a.html @@ -0,0 +1,250 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +

          无发票付款详情

          + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
          预付款金额(元){$detail.amount}付款方{$detail.subject}
          收款方(供应商){$detail.supplier_name}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + +

          付款信息

          +
          + + + + + + + + + + + + + +
          付款状态 + {if condition="($detail.pay_status == 0)"} + 未付款 + {elseif condition="($detail.pay_status == 1)"} + 部分付款 + {elseif condition="($detail.pay_status == 2)"} + 全部付款 + {/if} + 未付款金额(元){$detail.not_pay}已付款金额(元){$detail.pay_amount}
          付款记录 + + + + + + + + {empty name="$detail.payment"} + + + + {else/} + {volist name="$detail.payment" id="vo"} + + + + + + + {/volist} + {/empty} +
          付款日期付款金额(元)备注操作
          暂无付款记录
          {$vo.pay_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}删除
          + {if condition="($detail.pay_status lt 2)"} +
          + {/if} +
          +
          + + + {if condition="($detail.pay_status lt 2)"} + + + {/if} + {if condition="($detail.pay_status eq 0)"} + 全部付款 + {/if} + {if condition="($detail.pay_status eq 1)"} + 剩余部分全部付款 + {/if} + {if condition="($detail.pay_status gt 0)"} + 全部反付款 + {/if} +
          +
          + +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/payment/datalist.html b/app/finance/view/payment/datalist.html new file mode 100644 index 0000000..041a322 --- /dev/null +++ b/app/finance/view/payment/datalist.html @@ -0,0 +1,192 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          + +
          +
          + +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/payment/record.html b/app/finance/view/payment/record.html new file mode 100644 index 0000000..7549bc2 --- /dev/null +++ b/app/finance/view/payment/record.html @@ -0,0 +1,117 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/payment/view.html b/app/finance/view/payment/view.html new file mode 100644 index 0000000..7dc1949 --- /dev/null +++ b/app/finance/view/payment/view.html @@ -0,0 +1,159 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          + {eq name="$detail.invoice_type" value="0"} +

          无发票付款详情

          + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
          预付款金额(元){$detail.amount}付款方{$detail.subject}
          收款方(供应商){$detail.supplier_name}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + {else/} +

          发票信息

          + + + + + + + + + + + + + + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + + + + + {notempty name="$detail.other_file_ids"} + + + + + {/notempty} +
          发票金额(元){$detail.amount}发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} +
          发票抬头{$detail.subject}开票主体(供应商){$detail.supplier_name}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          发票号码{$detail.code}开票时间{$detail.open_time|date='Y-m-d'}
          发票附件 +
          + {volist name="$detail.other_file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          + {/eq} + +

          付款信息

          +
          + + + + + + + + + + + + + +
          付款状态 + {if condition="($detail.pay_status == 0)"} + 未付款 + {elseif condition="($detail.pay_status == 1)"} + 部分付款 + {elseif condition="($detail.pay_status == 2)"} + 全部付款 + {/if} + 未付款金额(元){$detail.not_pay}已付款金额(元){$detail.pay_amount}
          付款记录 + + + + + + + + + {empty name="$detail.payment"} + + + + {else/} + {volist name="$detail.payment" id="vo"} + + + + + + + + {/volist} + {/empty} +
          付款日期付款金额(元)备注登记人登记时间
          暂无付款记录
          {$vo.pay_time | date='Y-m-d'}{$vo.amount}{$vo.remarks}{$vo.admin}{$vo.create_time | date='Y-m-d H:i:s'}
          +
          +
          + +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/ticket/add.html b/app/finance/view/ticket/add.html new file mode 100644 index 0000000..84f418d --- /dev/null +++ b/app/finance/view/ticket/add.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          新增收票信息

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          发票金额*发票号码*
          发票类型* + + 发票日期*
          发票抬头* + + 开票主体(供应商)* + + +
          关联采购合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + +
          +
          备注信息
          +
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/ticket/add_a.html b/app/finance/view/ticket/add_a.html new file mode 100644 index 0000000..4e15357 --- /dev/null +++ b/app/finance/view/ticket/add_a.html @@ -0,0 +1,106 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          新增无发票付款申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          预付款金额*付款方* + +
          收款方(供应商)* + + +
          关联采购合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + +
          +
          备注信息
          +
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/ticket/datalist.html b/app/finance/view/ticket/datalist.html new file mode 100644 index 0000000..3c5fdc0 --- /dev/null +++ b/app/finance/view/ticket/datalist.html @@ -0,0 +1,210 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
          +
          +
          +
            +
          • 全部
          • +
          • 我申请的
          • +
          • 待我审批
          • +
          • 我已审批
          • +
          • 抄送我的
          • +
          +
          +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + + + +
          +
          +
          +
          + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/ticket/datalist_a.html b/app/finance/view/ticket/datalist_a.html new file mode 100644 index 0000000..5ffe91f --- /dev/null +++ b/app/finance/view/ticket/datalist_a.html @@ -0,0 +1,264 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          + +
          +
          + +
          +
          + +
          +
          + +
          +
          + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/ticket/edit.html b/app/finance/view/ticket/edit.html new file mode 100644 index 0000000..406e336 --- /dev/null +++ b/app/finance/view/ticket/edit.html @@ -0,0 +1,154 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          编辑开票申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          发票金额*发票号码*
          发票类型* + + 发票日期*
          发票抬头* + + 开票主体(供应商)* + + +
          关联采购合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          备注信息
          +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/ticket/edit_a.html b/app/finance/view/ticket/edit_a.html new file mode 100644 index 0000000..fb817d8 --- /dev/null +++ b/app/finance/view/ticket/edit_a.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          编辑无发票付款申请

          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          预付款金额*付款方* + +
          收款方(供应商)* + + +
          关联采购合同 + + +
          关联项目 + + +
          +
          附件
          +
          + +
          +
          +
          + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo)}
          + {/volist} + {/notempty} +
          +
          备注信息
          +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/ticket/record.html b/app/finance/view/ticket/record.html new file mode 100644 index 0000000..e241e4d --- /dev/null +++ b/app/finance/view/ticket/record.html @@ -0,0 +1,220 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          +
            +
          • 正常
          • +
          • 已作废
          • +
          +
          +
          +
          +
          + +
          +
          + + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/finance/view/ticket/view.html b/app/finance/view/ticket/view.html new file mode 100644 index 0000000..8563cad --- /dev/null +++ b/app/finance/view/ticket/view.html @@ -0,0 +1,80 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          收票详情

          + + + + + + + + + + + + + + {if ( $detail.open_status gt 0)} + + + + + + + {/if} + {if condition="$detail.purchase_id > 0"} + + + + + {/if} + {if condition="$detail.project_id > 0"} + + + + + {/if} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
          发票金额{$detail.amount} 元发票类型 + {eq name="$detail.invoice_type" value="1"}增值税专用发票{/eq} + {eq name="$detail.invoice_type" value="2"}普通发票{/eq} + {eq name="$detail.invoice_type" value="3"}专业发票{/eq} +
          发票抬头{$detail.subject}开票主体(供应商){$detail.supplier_name}
          发票号码{$detail.code}{eq name="$detail.open_status" value="2"}『已作废』{/eq}发票日期{$detail.open_time}
          关联采购合同{$detail.purchase_name|default=''}
          关联的项目{$detail.project_name|default=''}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/finance/view/ticket/view_a.html b/app/finance/view/ticket/view_a.html new file mode 100644 index 0000000..b214a55 --- /dev/null +++ b/app/finance/view/ticket/view_a.html @@ -0,0 +1,98 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          无发票付款详情

          + + + + + + + + + + + + {if condition="$detail.purchase_id > 0"} + + + + + {/if} + {if condition="$detail.project_id > 0"} + + + + + {/if} + {notempty name="$detail.remark"} + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
          预付款金额{$detail.amount} 元付款方{$detail.subject}
          收款方(供应商){$detail.supplier_name}
          关联采购合同{$detail.purchase_name|default=''}
          关联的项目{$detail.project_name|default=''}
          备注信息{$detail.remark}
          关联附件 +
          + {volist name="$detail.file_array" id="vo"} +
          {:file_card($vo,'view')}
          + {/volist} +
          +
          +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/common.php b/app/home/common.php new file mode 100644 index 0000000..58004c9 --- /dev/null +++ b/app/home/common.php @@ -0,0 +1,94 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +use think\facade\Db; + +//获取服务器信息 +function get_system_info($key) +{ + $system = [ + 'os' => PHP_OS, + 'php' => PHP_VERSION, + 'upload_max_filesize' => get_cfg_var("upload_max_filesize") ? get_cfg_var("upload_max_filesize") : "不允许上传附件", + 'max_execution_time' => get_cfg_var("max_execution_time") . "秒 ", + ]; + if (empty($key)) { + return $system; + } else { + return $system[$key]; + } +} + +//假期类型 +function get_leaves_types($id=0) +{ + $types_array = ['未设置','事假','年假','调休假','病假','婚假','丧假','产假','陪产假','其他']; + if($id==0){ + return $types_array; + } + else{ + $news_array=[]; + foreach($types_array as $key => $value){ + if($key>0){ + $news_array[]=array( + 'id'=>$key, + 'title'=>$value, + ); + } + } + return $news_array; + } +} + +//根据假期类型读取名称 +function leaves_types_name($types=0) +{ + $types_array = get_leaves_types(); + return $types_array[$types]; +} + +//读取后台菜单列表 +function admin_menu() +{ + $menu = Db::name('AdminRule')->where(['menu' => 1,'status'=>1])->order('sort asc,id asc')->select()->toArray(); + return $menu; +} + +//读取权限节点列表 +function admin_rule() +{ + $rule = Db::name('AdminRule')->where(['status'=>1])->order('sort asc,id asc')->select()->toArray(); + return $rule; +} + +//读取权限分组列表 +function admin_group() +{ + $group = Db::name('AdminGroup')->order('id desc')->select()->toArray(); + return $group; +} + +//读取指定权限分组菜单详情 +function admin_group_info($id) +{ + $rule = Db::name('AdminGroup')->where(['id' => $id])->value('rules'); + $rules = explode(',', $rule); + return $rules; +} + +//读取模块列表 +function admin_module() +{ + $group = Db::name('AdminModule')->order('id asc')->select()->toArray(); + return $group; +} diff --git a/app/home/controller/Api.php b/app/home/controller/Api.php new file mode 100644 index 0000000..55b3491 --- /dev/null +++ b/app/home/controller/Api.php @@ -0,0 +1,193 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\home\controller; + +use app\api\BaseController; +use think\facade\Db; + +class api extends BaseController +{ + //首页公告 + public function get_note_list() + { + $list = Db::name('Note') + ->field('a.id,a.title,a.create_time,c.title as cate_title') + ->alias('a') + ->join('note_cate c', 'a.cate_id = c.id') + ->where(['a.status' => 1,'a.delete_time' => 0]) + ->order('a.end_time desc,a.sort desc,a.create_time desc') + ->limit(8) + ->select()->toArray(); + foreach ($list as $key => $val) { + $list[$key]['create_time'] = date('Y-m-d H:i', $val['create_time']); + } + $res['data'] = $list; + return table_assign(0, '', $res); + } + + //首页知识列表 + public function get_article_list() + { + $prefix = get_config('database.connections.mysql.prefix');//判断是否安装了文章模块 + $exist = Db::query('show tables like "'.$prefix.'article"'); + $res['data'] = []; + if($exist){ + $list = Db::name('Article') + ->field('a.id,a.title,a.create_time,a.read,c.title as cate_title') + ->alias('a') + ->join('article_cate c', 'a.cate_id = c.id') + ->where(['a.delete_time' => 0]) + ->order('a.id desc') + ->limit(8) + ->select()->toArray(); + foreach ($list as $key => $val) { + $list[$key]['create_time'] = date('Y-m-d H:i', $val['create_time']); + } + $res['data'] = $list; + } + return table_assign(0, '', $res); + } + + // 初始历史操作记录数据 + public function initAdminLog(){ + $second_time = time() - 86400; + $startDate = date('Y-m-d',$second_time); + $data = []; + for ($i = 0; $i < 365; $i++) { + $year = date('Y', strtotime($startDate . ' -' . $i . ' days')); + $date = date('Y-m-d', strtotime($startDate . ' -' . $i . ' days')); + $begin_second=strtotime($date. " 00:00:00"); + $end_second=strtotime($date. " 23:59:59"); + $count = Db::name('AdminLogCount')->where('date', $date)->count(); + if($count>0){ + continue; + } + $data[] = [ + 'year' => $year, + 'date' => $date, + 'num' => Db::name('AdminLog')->whereBetween('create_time', "$begin_second,$end_second")->count(), + 'create_time' => time() + ]; + // 分批插入,避免数据量过大 + if (count($data) >= 100) { + Db::name('AdminLogCount')->insertAll($data); + $data = []; + } + } + // 插入剩余数据 + if (!empty($data)) { + Db::name('AdminLogCount')->insertAll($data); + } + //return to_assign(); + } + //获取最近访问记录 + public function get_last_data() + { + $first_time = time(); + $second_time = $first_time - 86400; + + $begin_first = strtotime(date('Y-m-d', $first_time) . " 00:00:00"); + $end_first = strtotime(date('Y-m-d', $first_time) . " 23:59:59"); + + $begin_second = strtotime(date('Y-m-d', $second_time) . " 00:00:00"); + $end_second = strtotime(date('Y-m-d', $second_time) . " 23:59:59"); + + //当天 + $data_first = Db::name('AdminLog')->field('create_time')->whereBetween('create_time', "$begin_first,$end_first")->select(); + //昨天 + $data_second = Db::name('AdminLog')->field('create_time')->whereBetween('create_time', "$begin_second,$end_second")->select(); + return to_assign(0, '', ['data_first' => hour_document($data_first), 'data_second' => hour_document($data_second)]); + } + + //获取访问记录 + public function get_view_data() + { + $first_time = time(); + $second_time = $first_time - 86400; + $three_time = $first_time - 86400 * 365; + + $begin_first = strtotime(date('Y-m-d', $first_time) . " 00:00:00"); + $end_first = strtotime(date('Y-m-d', $first_time) . " 23:59:59"); + + $begin_time = date('Y-m-d', $three_time); + $end_time = date('Y-m-d', $second_time); + + $last_count = Db::name('AdminLogCount')->where('date', $end_time)->count(); + if($last_count==0){ + //如果不存在生成记录 + $this->initAdminLog(); + } + //当天 + $today_count = Db::name('AdminLog')->whereBetween('create_time', "$begin_first,$end_first")->count(); + //一年 + $data_three = Db::name('AdminLogCount')->field('date,num')->order('date asc')->whereBetween('date', "$begin_time,$end_time")->column('num', 'date'); + $today = date('Y-m-d'); + $data_three[$today] = $today_count; + return to_assign(0, '', ['data_three' => $data_three]); + } + + //获取员工活跃数据 + public function get_view_log() + { + $times = strtotime("-30 day"); + $where = []; + $where[] = ['uid','<>',1]; + $where[] = ['create_time', '>', $times]; + $list = Db::name('AdminLog')->field("id,uid")->where($where)->select(); + $logs = array(); + foreach ($list as $key => $value) { + $uid = $value['uid']; + if (empty($logs[$uid])) { + $logs[$uid]['count'] = 1; + $logs[$uid]['name'] = Db::name('Admin')->where('id',$uid)->value('name'); + } else { + $logs[$uid]['count'] += 1; + } + } + $counts = array_column($logs, 'count'); + array_multisort($counts, SORT_DESC, $logs); + //攫取前10 + $data_logs = array_slice($logs, 0, 10); + return to_assign(0, '', ['data_logs' => $data_logs]); + } + + public function areaJson($type) + { + if($type=='province'){ + $data = Db::name('Area')->where(['level'=>1,'status'=>1])->column('name', 'id'); + } + if($type=='city'){ + $data = Db::name('Area')->where(['level'=>2,'status'=>1])->column('name', 'id'); + } + if($type=='district'){ + $data = Db::name('Area')->where(['level'=>3,'status'=>1])->column('name', 'id'); + } + if($type=='all'){ + $area = Db::name('Area')->field('id,pid,name')->select()->toArray(); + $data = generateTree($area); + } + // 导出为 JSON 格式 + $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + return $json; + /* + 输出Json文件 + // 设置响应头 + header('Content-Type: application/json'); + header('Content-Disposition: attachment; filename="oa_area.json"'); + // 输出 JSON 数据 + echo $json; + */ + } + +} diff --git a/app/home/controller/Approve.php b/app/home/controller/Approve.php new file mode 100644 index 0000000..fe5cbec --- /dev/null +++ b/app/home/controller/Approve.php @@ -0,0 +1,261 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\api\BaseController; +use think\facade\Db; +use think\facade\View; + +class Approve extends BaseController +{ + public function index() + { + $department = $this->did; + $module = Db::name('FlowModule')->where(['status'=>1])->select()->toArray(); + $whereOr = []; + if($this->uid>1){ + $map1=[ + ['department_ids', '=', ''] + ]; + $map2=[ + ['', 'exp', Db::raw("FIND_IN_SET('{$department}',department_ids)")] + ]; + $whereOr =[$map1,$map2]; + } + + foreach ($module as &$row) { + // 处理每一行数据 + $row['list'] = Db::name('FlowCate') + ->where([['module_id','=',$row['id']],['status','=',1],['is_list','=',1]]) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->select()->toArray(); + } + View::assign('module', $module); + return view(); + } + + public function get_list($where,$param) + { + $tables = Db::name('FlowCate')->field('name,check_table')->where('status',1)->select()->toArray(); + $prefix = get_config('database.connections.mysql.prefix'); + $sqlParts = []; + $sqlCounts = []; + $fortable =[]; + foreach ($tables as $table) { + $dbname = $table['check_table']; + if(in_array($dbname,$fortable)){ + continue; + } + $check_name = $table['name']; + $tableName = $prefix.$dbname; + $sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,'{$check_name}' as invoice_type,'{$check_name}' as types FROM {$tableName} WHERE {$where}"; + if($dbname=='invoice' || $dbname=='ticket'){ + $sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,invoice_type,'{$check_name}' as types FROM {$tableName} WHERE {$where}"; + } + if($dbname=='approve'){ + $sqlPart = "SELECT id,admin_id,did,create_time,check_status,check_flow_id,check_step_sort,check_uids,check_last_uid,check_history_uids,check_copy_uids,check_time,'{$dbname}' as table_name,'{$check_name}' as check_name,'{$check_name}' as invoice_type,types FROM {$tableName} WHERE {$where}"; + } + $sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$where}"; + // 查询数据库中是否存在该数据表 + $is_table = Db::query("SHOW TABLES LIKE '{$tableName}'"); + // 判断查询结果 + if (!empty($is_table)) { + $sqlParts[] = $sqlPart; + $sqlCounts[] = $sqlCount; + $fortable[] = $table['check_table']; + } + } + + // 使用implode将各个部分用UNION ALL连接起来 + $unionSql = implode(" UNION ALL ", $sqlParts); + + $totalCount = 0; + foreach ($sqlCounts as $sql) { + $count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组 + $totalCount += $count; + } + // 添加排序和分页逻辑 + $page = isset($param['page']) ? $param['page'] : 1; + $pageSize = $param['limit']; + $offset = ($page - 1) * $pageSize; + + // 注意:不同的数据库分页语法可能有所不同,这里以MySQL为例 + $finalSql = $unionSql . " ORDER BY create_time DESC LIMIT {$offset}, {$pageSize}"; + + // 执行查询 + $result = Db::query($finalSql); + // 处理结果 + foreach ($result as &$row) { + // 处理每一行数据 + $row['create_time'] = date('Y-m-d H:i:s',$row['create_time']); + $row['admin_name'] = Db::name('Admin')->where('id',$row['admin_id'])->value('name'); + $row['department'] = Db::name('Department')->where('id',$row['did'])->value('title'); + $row['check_status_str'] = check_status_name($row['check_status']); + if($row['check_status']==1 && !empty($row['check_uids'])){ + $check_users = Db::name('Admin')->where('id','in',$row['check_uids'])->column('name'); + $row['check_users'] = implode(',',$check_users); + } + else{ + $row['check_users']='-'; + } + if(!empty($row['check_copy_uids'])){ + $check_copy_users = Db::name('Admin')->where('id','in',$row['check_copy_uids'])->column('name'); + $row['check_copy_users'] = implode(',',$check_copy_users); + } + else{ + $row['check_copy_users']='-'; + } + + $check_name=$row['check_name']; + if($row['table_name'] == 'invoice' || $row['table_name']=='ticket'){ + if($row['invoice_type']==0){ + $check_name=$row['table_name'].'a'; + } + else{ + $check_name=$row['table_name']; + } + } + if($row['table_name'] == 'approve'){ + $check_name='approve_'.$row['types']; + } + $flow_cate = Db::name('FlowCate')->where('name',$check_name)->find(); + $row['types_name'] = $flow_cate['title']; + $row['view_url'] = $flow_cate['view_url']; + $row['add_url'] = $flow_cate['add_url']; + } + $list=array( + 'data'=>$result, + 'total'=>$totalCount + ); + return $list; + } + + + //我申请的 + public function mylist() + { + if (request()->isAjax()) { + $param = get_params(); + $status = isset($param['status']) ? $param['status'] : 0; + $uid = $this->uid; + $where = "delete_time = 0"; + if($status == 1){ + $where.= " AND check_status < 2"; + } + if($status == 2){ + $where.= " AND check_status = 2"; + } + if($status == 3){ + $where.= " AND check_status > 2"; + } + $where.= ' AND admin_id = '.$uid; + //关联抄送人 + //$where.= " AND FIND_IN_SET('{$uid}',check_copy_uids)"; + //关联审核人 + //$where.= " AND (FIND_IN_SET('{$uid}',check_uids) or FIND_IN_SET('{$uid}',check_history_uids))"; + $list = $this->get_list($where,$param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + public function checklist() + { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + $status = isset($param['status']) ? $param['status'] : 0; + $where = "delete_time = 0"; + if($status == 0){ + $where.= " AND (FIND_IN_SET('{$uid}',check_uids) or FIND_IN_SET('{$uid}',check_history_uids))"; + } + if($status == 1){ + $where.= " AND FIND_IN_SET('{$uid}',check_uids)"; + } + if($status == 2){ + $where.= " AND FIND_IN_SET('{$uid}',check_history_uids)"; + } + $list = $this->get_list($where,$param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + public function copylist() + { + if (request()->isAjax()) { + $param = get_params(); + $status = isset($param['status']) ? $param['status'] : 0; + $uid = $this->uid; + $where = "delete_time = 0"; + if($status == 1){ + $where.= " AND check_status < 2"; + } + if($status == 2){ + $where.= " AND check_status = 2"; + } + if($status == 3){ + $where.= " AND check_status > 2"; + } + //关联抄送人 + $where.= " AND FIND_IN_SET('{$uid}', check_copy_uids) > 0"; + $list = $this->get_list($where,$param); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //全部审批 + public function all() + { + $auth_approve = isAuth($this->uid,'office_admin','conf_1'); + if (request()->isAjax()) { + if($auth_approve==0){ + return to_assign(1, '无权限访问'); + } + $param = get_params(); + $status = isset($param['status']) ? $param['status'] : 0; + $uid = $this->uid; + $where = "delete_time = 0"; + if($status == 1){ + $where.= " AND check_status < 2"; + } + if($status == 2){ + $where.= " AND check_status = 2"; + } + if($status == 3){ + $where.= " AND check_status > 2"; + } + if(!empty($param['uid'])){ + $where.= ' AND admin_id = '.$param['uid']; + } + $list = $this->get_list($where,$param); + return table_assign(0, '', $list); + } else { + if($auth_approve==0){ + throw new \think\exception\HttpException(405, '无权限访问'); + } + return view(); + } + } +} diff --git a/app/home/controller/Area.php b/app/home/controller/Area.php new file mode 100644 index 0000000..1943419 --- /dev/null +++ b/app/home/controller/Area.php @@ -0,0 +1,117 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use backup\Backup; +use think\facade\Db; +use think\facade\View; + +class Area extends BaseController +{ + //数据表列表 + public function datalist() + { + if (request()->isAjax()) { + $area = Db::name('Area')->select(); + $list = generateTree($area); + return to_assign(0, '', $list); + } + else{ + $db = new Backup(); + $is_area = $db->check_table('area'); + View::assign('is_area', $is_area); + return view(); + } + } + + //新增/编辑 + public function add() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + if (request()->isAjax()) { + $param['level'] = 1; + if($pid > 0){ + $level = Db::name('Area')->where('id', $pid)->value('level'); + $param['level'] = $level+1; + } + if ($param['id'] > 0) { + Db::name('Area')->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } else { + $param['create_time'] = time(); + $rid = Db::name('Area')->strict(false)->field(true)->insertGetId($param); + } + return to_assign(); + } else { + if ($id > 0) { + $detail = Db::name('Area')->where('id', $id)->find(); + $detail['pname'] = Db::name('Area')->where('id', $detail['pid'])->value('name'); + View::assign('detail', $detail); + } + $pname=''; + if($pid>0){ + $pname = Db::name('Area')->where('id', $pid)->value('name'); + } + View::assign('id', $id); + View::assign('pid', $pid); + View::assign('pname', $pname); + return view(); + } + } + + //设置 + public function set() + { + if (request()->isPost()) { + $db = new Backup(); + $is_area = $db->check_table('area'); + if($is_area==0){ + $oa_area = file_get_contents(CMS_ROOT . '/public/static/home/file/oa_area.sql'); + $res = $db->run_sql($oa_area); + if($res){ + add_log('import', 0, []); + return to_assign(); + } + else{ + return to_assign(1, '数据写入失败,请联系官方!'); + } + } + } + else if (request()->isDelete()) { + $params = get_params(); + $log_type = 'recovery'; + if($params['status']==0){ + $count = Db::name('Area')->where(["pid" => $params['id']])->count(); + if ($count > 0) { + return to_assign(1, "该记录下还有子记录,无法禁用"); + } + $log_type = 'disable'; + } + if (Db::name('Area')->where(["id" => $params['id']])->update(['status'=>$params['status']]) !== false) { + add_log($log_type, $params['id'], []); + return to_assign(); + } else { + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/home/controller/Cate.php b/app/home/controller/Cate.php new file mode 100644 index 0000000..686c9f1 --- /dev/null +++ b/app/home/controller/Cate.php @@ -0,0 +1,157 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\validate\EnterpriseCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Cate extends BaseController +{ + + //企业主体 + public function enterprise() + { + if (request()->isAjax()) { + $enterprise = Db::name('Enterprise')->order('create_time asc')->select(); + return to_assign(0, '', $enterprise); + } else { + return view(); + } + } + //企业主体新建编辑 + public function enterprise_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(EnterpriseCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('Enterprise')->strict(false)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(EnterpriseCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('Enterprise')->strict(false)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } + else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $detail = Db::name('Enterprise')->where(['id' => $id])->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + //企业主体设置 + public function enterprise_check() + { + $param = get_params(); + $res = Db::name('Enterprise')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + //书签链接 + public function links() + { + if (request()->isAjax()) { + $links = Db::name('Links')->where('delete_time',0)->order('sort desc')->select(); + return to_assign(0, '', $links); + } else { + return view(); + } + } + //书签链接新建编辑 + public function links_add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('Links')->strict(false)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + $param['create_time'] = time(); + $insertId = Db::name('Links')->strict(false)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } + else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $detail = Db::name('Links')->where(['id' => $id])->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + //书签链接删除 + public function links_del() + { + $param = get_params(); + $param['delete_time'] = time(); + $res = Db::name('Links')->strict(false)->field('id,delete_time')->update($param); + if ($res) { + add_log('delete', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + +} diff --git a/app/home/controller/Conf.php b/app/home/controller/Conf.php new file mode 100644 index 0000000..085f5e1 --- /dev/null +++ b/app/home/controller/Conf.php @@ -0,0 +1,126 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\validate\ConfCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Conf extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $where[] = ['status', '>=', 0]; + $list = Db::name('Config')->where($where)->select(); + return to_assign(0, '', $list); + } else { + return view(); + } + } + + //添加/编辑配置项 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + try { + validate(ConfCheck::class)->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if (!empty($param['id']) && $param['id'] > 0) { + $param['update_time'] = time(); + $res = Db::name('config')->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + $param['create_time'] = time(); + $insertId = Db::name('Config')->strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + if ($id > 0) { + $config = Db::name('Config')->where(['id' => $id])->find(); + View::assign('config', $config); + } + View::assign('id', $id); + return view(); + } + } + + //删除配置项 + public function delete() + { + $id = get_params("id"); + $data['status'] = '-1'; + $data['id'] = $id; + $data['update_time'] = time(); + if (Db::name('Config')->update($data) !== false) { + add_log('delete', $id, $data); + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } + + //编辑配置信息 + public function edit() + { + $param = get_params(); + if (request()->isAjax()) { + $data['content'] = serialize($param); + $data['update_time'] = time(); + $data['id'] = $param['id']; + $res = Db::name('Config')->strict(false)->field(true)->update($data); + $conf = Db::name('Config')->where('id', $param['id'])->find(); + clear_cache('system_config' . $conf['name']); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $conf = Db::name('Config')->where('id', $id)->find(); + $module = strtolower(app('http')->getName()); + $class = strtolower(app('request')->controller()); + $action = strtolower(app('request')->action()); + $template = $module . '/view/' . $class . '/' . $conf['name'] . '.html'; + $config = []; + if ($conf['content']) { + $config = unserialize($conf['content']); + } + View::assign('id', $id); + View::assign('config', $config); + if (isTemplate($template)) { + return view($conf['name']); + } else { + return view('../../base/view/common/errortemplate', ['file' => $template]); + } + } + } +} diff --git a/app/home/controller/Dataauth.php b/app/home/controller/Dataauth.php new file mode 100644 index 0000000..29551c5 --- /dev/null +++ b/app/home/controller/Dataauth.php @@ -0,0 +1,102 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class dataauth extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $list = Db::name('DataAuth')->select(); + return to_assign(0, '', $list); + } else { + return view(); + } + } + + //编辑配置信息 + public function edit() + { + $param = get_params(); + if (request()->isAjax()) { + $param['update_time'] = time(); + $res = Db::name('DataAuth')->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $detail = $this->auth_detail($id); + $module = strtolower(app('http')->getName()); + $class = strtolower(app('request')->controller()); + $action = strtolower(app('request')->action()); + $template = $module . '/view/' . $class . '/' . $detail['name'] . '.html'; + View::assign('detail', $detail); + if (isTemplate($template)) { + return view($detail['name']); + } else { + return view('../../base/view/common/errortemplate', ['file' => $template]); + } + } + } + + public function auth_detail($id) + { + $detail = Db::name('DataAuth')->where('id',$id)->find(); + // 日常办公 + if($detail['name'] =='office_admin'){ + $conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name'); + $detail['conf_1_str'] = implode(',', $conf_1_str); + $conf_3_str = Db::name('Admin')->where('id', 'in', $detail['conf_3'])->column('name'); + $detail['conf_3_str'] = implode(',', $conf_3_str); + } + if($detail['name'] =='finance_admin'){ + $conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name'); + $detail['conf_1_str'] = implode(',', $conf_1_str); + $conf_2_str = Db::name('Admin')->where('id', 'in', $detail['conf_2'])->column('name'); + $detail['conf_2_str'] = implode(',', $conf_2_str); + $conf_3_str = Db::name('Admin')->where('id', 'in', $detail['conf_3'])->column('name'); + $detail['conf_3_str'] = implode(',', $conf_3_str); + $conf_4_str = Db::name('Admin')->where('id', 'in', $detail['conf_4'])->column('name'); + $detail['conf_4_str'] = implode(',', $conf_4_str); + $conf_5_str = Db::name('Admin')->where('id', 'in', $detail['conf_5'])->column('name'); + $detail['conf_5_str'] = implode(',', $conf_5_str); + } + if($detail['name'] =='customer_admin'){ + $conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name'); + $detail['conf_1_str'] = implode(',', $conf_1_str); + } + if($detail['name'] =='contract_admin'){ + $conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name'); + $detail['conf_1_str'] = implode(',', $conf_1_str); + } + if($detail['name'] =='project_admin'){ + $conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name'); + $detail['conf_1_str'] = implode(',', $conf_1_str); + } + if($detail['name'] =='disk_admin'){ + $conf_1_str = Db::name('Admin')->where('id', 'in', $detail['conf_1'])->column('name'); + $detail['conf_1_str'] = implode(',', $conf_1_str); + } + return $detail; + } +} diff --git a/app/home/controller/Database.php b/app/home/controller/Database.php new file mode 100644 index 0000000..6a678d3 --- /dev/null +++ b/app/home/controller/Database.php @@ -0,0 +1,230 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use backup\Backup; +use think\facade\Session; +use think\facade\View; + +class Database extends BaseController +{ + //数据表列表 + public function database() + { + if (request()->isAjax()) { + // 数据信息 + $db = new Backup(); + $list = $db->dataList(); + // 计算总大小 + $total = 0; + foreach ($list as $k => $v) { + $total += $v['data_length']; + $list[$k]['data_size'] = $v['data_length']; + $list[$k]['data_length'] = format_bytes($v['data_length']); + if(strpos($v['name'],'admin_log')){ + unset($list[$k]); + } + } + // 提示信息 + $dataTips = '数据库中共有 ' . count($list) . ' 张表,共计 ' . format_bytes($total) . '大小。'; + $data['data'] = $list; + return table_assign(0, $dataTips, $data); + } + return view(); + } + + //备份数据 + public function backup() + { + $db = new Backup(); + if (request()->isPost()) { + $tables = get_params('tables'); + $fileinfo = $db->getFile(); + //检查是否有正在执行的任务 + $lock = "{$fileinfo['filepath']}backup.lock"; + if (is_file($lock)) { + return to_assign(2, '检测到有一个备份任务未完成'); + } else { + //创建锁文件 + file_put_contents($lock, time()); + } + // 检查备份目录是否可写 + if (!is_writeable($fileinfo['filepath'])) { + return to_assign(1, '备份目录不存在或不可写,请检查后重试'); + } + + //缓存锁文件 + Session::set('lock', $lock); + //缓存备份文件信息 + Session::set('backup_file', $fileinfo['file']); + //缓存要备份的表 + Session::set('backup_tables', $tables); + //创建备份文件 + if (false !== $db->Backup_Init()) { + return to_assign(0, '初始化成功,开始备份...', ['tab' => ['id' => 0, 'start' => 0, 'table' => $tables[0]]]); + } else { + return to_assign(1, '初始化失败,备份文件创建失败'); + } + } else if (request()->isGet()) { + $tables = Session::get('backup_tables'); + $file = Session::get('backup_file'); + $id = get_params('id'); + $start = get_params('start'); + $start = $db->setFile($file)->backup($tables[$id], $start); + if (false === $start) { + return to_assign(1, '备份出错'); + } else if (0 === $start) { + if (isset($tables[++$id])) { + return to_assign(0, '备份完成', ['tab' => ['id' => $id, 'start' => 0, 'table' => $tables[$id - 1]]]); + } else { //备份完成,清空缓存 + unlink(Session::get('lock')); + Session::delete('backup_tables'); + Session::delete('backup_file'); + add_log('bak'); + return to_assign(0, '备份完成', ['tab' => ['start' => 'ok', 'table' => $tables[$id - 1]]]); + } + } + } else { + return to_assign(1, '参数错误!'); + } + } + + //优化表 + public function optimize($tables = null) + { + $db = new Backup(); + //return to_assign(0, $db->optimize($tables)); + if ($db->optimize($tables)) { + add_log('optimize'); + return to_assign(0, '数据表优化完成'); + } else { + return to_assign(1, '数据表优化出错请重试'); + } + } + + //修复表 + public function repair($tables = null) + { + $db = new Backup(); + //return to_assign(0, $db->repair($tables)); + if ($db->repair($tables)) { + add_log('repair'); + return to_assign(0, '数据表修复完成'); + } else { + return to_assign(1, '数据表修复出错请重试'); + } + } + + //备份文件列表 + public function backuplist() + { + $db = new Backup(); + $list = $db->fileList(); + $fileinfo = $db->getFile(); + $lock = "{$fileinfo['filepath']}backup.lock"; + $lock_time = 0; + if (is_file($lock)) { + $lock_time = file_get_contents($lock); + } + $listNew = []; + $indx = 0; + foreach ($list as $k => $v) { + $listNew[$indx]['time'] = $k; + $listNew[$indx]['timespan'] = $v['time']; + $listNew[$indx]['data'] = $v; + $indx++; + } + $list = $listNew; + array_multisort(array_column($list, 'time'), SORT_DESC, $list); + return view('', ['list' => $list, 'lock_time' => $lock_time]); + } + + //数据还原 + public function import($time = 0, $part = null, $start = null) + { + $db = new Backup(); + $time = (int) $time; + if (is_numeric($time) && is_null($part) && is_null($start)) { + $list = $db->getFile('timeverif', $time); + if (is_array($list)) { + Session::set('backup_list', $list); + return to_assign(0, '初始化完成,开始还原...', array('part' => 1, 'start' => 0, 'time' => $time)); + } else { + return to_assign(1, '备份文件可能已经损坏,请检查'); + } + } else if (is_numeric($part) && is_numeric($start)) { + $list = Session::get('backup_list'); + $part = (int) $part; + $start = (int) $start; + $start = $db->setFile($list)->import($start, $time, $part); + if (false === $start) { + return to_assign(1, '还原数据出错,请重试'); + } elseif (0 === $start) { + if (isset($list[++$part])) { + $data = array('part' => $part, 'start' => 0, 'time' => $time); + return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面", $data); + } else { + Session::delete('backup_list'); + return to_assign(0, '还原数据成功'); + } + } else { + $data = array('part' => $part, 'start' => $start[0], 'time' => $time); + if ($start[1]) { + $rate = floor(100 * ($start[0] / $start[1])); + return to_assign(0, "正在还原...卷{$part} ({$rate}%),请勿关闭当前页面", $data); + } else { + $data['gz'] = 1; + return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面", $data); + } + return to_assign(0, "正在还原...卷{$part},请勿关闭当前页面"); + } + } else { + return to_assign(1, "参数错误"); + } + } + /** + * 删除备份文件 + */ + public function del($time = 0, $lock = 0) + { + $db = new Backup(); + if ($lock == 1) { + $fileinfo = $db->getFile(); + $lock = "{$fileinfo['filepath']}backup.lock"; + if (is_file($lock)) { + $time = file_get_contents($lock); + unlink($lock); + } + } + if ($db->delFile((int) $time)) { + add_log('delete'); + return to_assign(0, '删除成功'); + } else { + return to_assign(0, '删除失败,请检查权限'); + } + } + /** + * 下载备份文件 + */ + public function downfile($time = 0, $part = 0) + { + $db = new Backup(); + add_log('down'); + $db->downloadFile((int) $time, $part - 1); + } + +} diff --git a/app/home/controller/Files.php b/app/home/controller/Files.php new file mode 100644 index 0000000..42888ca --- /dev/null +++ b/app/home/controller/Files.php @@ -0,0 +1,194 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\File; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Files extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $fileext = ['','jpg,jpeg,png,gif','mpg,mp4,mpeg,avi,wmv,mov,flv,m4v','mp3,wav,wma,flac,midi','doc,docx,xls,xlsx,ppt,pptx,txt,pdf','zip,rar,7z,gz,tar']; + if (!empty($param['keywords'])) { + $where[] = ['f.name|g.title', 'like', '%' . $param['keywords'] . '%']; + } + if (isset($param['group_id']) && $param['group_id']!='') { + $where[] = ['f.group_id','=',$param['group_id']]; + } + if (!empty($param['tab'])) { + $where[] = ['f.fileext','in',$fileext[$param['tab']]]; + } + $where[] = ['f.delete_time','=',0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = DB::name('File') + ->field("f.*,a.name as admin_name,g.title as group_title") + ->alias('f') + ->join('Admin a', 'f.admin_id = a.id','left') + ->join('FileGroup g', 'f.group_id = g.id','left') + ->order('f.create_time desc') + ->where($where) + ->paginate(['list_rows'=> $rows]) + ->each(function($item, $key){ + if(empty($item['thumbpath'])){ + $item['thumbpath'] = $item['filepath']; + } + $item['create_time'] = date('Y-m-d H:i:s', $item['create_time']); + return $item; + }); + return table_assign(0, '', $list); + } else { + return view(); + } + } + //编辑 + public function edit() + { + if (request()->isAjax()) { + $param = get_params(); + if (Db::name('File')->where('id',$param['id'])->update(['name'=>$param['title']]) !== false) { + add_log('edit', $param['id'], []); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } + } + + //移动 + public function move() + { + if (request()->isAjax()) { + $group_id = get_params("group_id"); + $ids = get_params("ids"); + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'group_id' => $group_id, + 'update_time' => time() + ]; + } + if(!empty($list)){ + $model = new File(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "操作失败"); + } + } + } + //删除 + public function delete() + { + if (request()->isDelete()) { + $ids = get_params("ids"); + $idArray = explode(',', strval($ids)); + $list = []; + foreach ($idArray as $key => $val) { + $list[] = [ + 'id' => $val, + 'delete_time' => time() + ]; + } + if(!empty($list)){ + $model = new File(); + foreach ($list as $item) { + $model->update($item); + } + return to_assign(); + } + else{ + return to_assign(1, "操作失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //获取分组 + public function get_group() + { + $list = Db::name('FileGroup')->where([['delete_time','=',0]])->select()->toArray(); + return to_assign(0, '',$list); + } + //添加&编辑 + public function add_group() + { + if (request()->isAjax()) { + $param = get_params(); + if($param['title'] == '全部' || $param['title']=='未分组'){ + return to_assign(1, '该分组名称已经存在'); + } + if (!empty($param['id']) && $param['id'] > 0) { + $count = Db::name('FileGroup')->where([['id','<>',$param['id']],['delete_time','=',0],['title','=',$param['title']]])->count(); + if ($count > 0) { + return to_assign(1, '该分组名称已经存在'); + } + $res = Db::name('FileGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param); + if($res!=false){ + add_log('edit', $param['id'], $param); + return to_assign(0,'编辑成功',$param['id']); + }else{ + return to_assign(1,'操作失败'); + } + } else { + $count = Db::name('FileGroup')->where([['delete_time','=',0],['title','=',$param['title']]])->count(); + if ($count > 0) { + return to_assign(1, '该分组名称已经存在'); + } + $gid = Db::name('FileGroup')->strict(false)->field(true)->insertGetId($param); + if($gid!=false){ + add_log('add', $gid, $param); + return to_assign(0,'添加成功',$gid); + }else{ + return to_assign(1,'操作失败'); + } + } + } + } + + //删除 + public function del_group() + { + if (request()->isDelete()) { + $param = get_params(); + $id = get_params("ids"); + $count = Db::name('File')->where(["group_id" => $id])->count(); + if ($count > 0) { + return to_assign(1, "该分组还存在文件,请去除文件或者转移文件后再删除"); + } + if (Db::name('FileGroup')->delete($id) !== false) { + add_log('delete', $id, []); + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/home/controller/Index.php b/app/home/controller/Index.php new file mode 100644 index 0000000..f85d304 --- /dev/null +++ b/app/home/controller/Index.php @@ -0,0 +1,467 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\AdminLog; +use app\user\validate\AdminCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Index extends BaseController +{ + public function index() + { + $mobile = is_mobile(); + if($mobile){ + return redirect('/qiye/index/index'); + } + $admin = Db::name('Admin')->where('id',$this->uid)->find(); + if (get_cache('menu' . $this->uid)) { + $list = get_cache('menu' . $this->uid); + } else { + $adminGroup = Db::name('PositionGroup')->where(['pid' => $admin['position_id']])->column('group_id'); + $adminMenu = Db::name('AdminGroup')->where('id', 'in', $adminGroup)->column('rules'); + $adminMenus = []; + foreach ($adminMenu as $k => $v) { + $v = explode(',', $v); + $adminMenus = array_merge($adminMenus, $v); + } + $menu = Db::name('AdminRule')->where(['menu' => 1, 'status' => 1])->where('id', 'in', $adminMenus)->order('sort asc,id asc')->select()->toArray(); + $list = list_to_tree($menu); + \think\facade\Cache::tag('adminMenu')->set('menu' . $this->uid, $list); + } + View::assign('menu', $list); + View::assign('admin',$admin); + View::assign('system',get_system_config('system')); + View::assign('web',get_system_config('web')); + return View(); + } + + public function main() + { + $install = false; + if (file_exists(CMS_ROOT . 'app/install')) { + $install = true; + } + $uid = $this->uid; + $dids = get_role_departments($uid); + $total = []; + + $whereFinance= array(); + $whereFinanceOr = array(); + $whereFinance[] = ['delete_time', '=', 0]; + $whereFinance[] = ['check_status', '=', 2]; + $whereFinancerOr[] =['admin_id', '=', $uid]; + if(!empty($dids)){ + $whereFinancerOr[] =['did', 'in', $dids]; + } + + $total[] = array( + 'name' => '报销总数', + 'num' => Db::name('Expense')->where($whereFinance) + ->where(function ($query) use($whereFinancerOr) { + $query->whereOr($whereFinancerOr); + }) + ->count() + ); + $total[] = array( + 'name' => '开票总数', + 'num' => Db::name('Invoice')->where($whereFinance) + ->where(function ($query) use($whereFinancerOr) { + $query->whereOr($whereFinancerOr); + }) + ->count() + ); + $total[] = array( + 'name' => '收票总数', + 'num' => Db::name('Ticket')->where($whereFinance) + ->where(function ($query) use($whereFinancerOr) { + $query->whereOr($whereFinancerOr); + }) + ->count() + ); + + $whereHandle = []; + $whereHandle[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereHandle[] = ['delete_time', '=', 0]; + $handle=[]; + + $handle[] = array( + 'name' => '待审公文', + 'num' => Db::name('OfficialDocs')->where($whereHandle)->count(), + 'id' => 182, + 'url' => '/adm/official/datalist', + ); + $handle[] = array( + 'name' => '待审用章', + 'num' => Db::name('Seal')->where($whereHandle)->count(), + 'id' => 176, + 'url' => '/adm/seal/datalist', + ); + $handle[] = array( + 'name' => '待审销售合同', + 'num' => Db::name('Contract')->where($whereHandle)->count(), + 'id' => 319, + 'url' => '/contract/contract/datalist', + ); + $handle[] = array( + 'name' => '待审采购合同', + 'num' => Db::name('Purchase')->where($whereHandle)->count(), + 'id' => 323, + 'url' => '/contract/purchase/datalist', + ); + $handle[] = array( + 'name' => '待审报销', + 'num' => Db::name('Expense')->where($whereHandle)->count(), + 'id' => 218, + 'url' => '/finance/expense/datalist', + ); + $handle[] = array( + 'name' => '待审发票', + 'num' => Db::name('Invoice')->where($whereHandle)->where([['invoice_type','>',0]])->count(), + 'id' => 238, + 'url' => '/finance/invoice/datalist', + ); + $handle[] = array( + 'name' => '待审收票', + 'num' => Db::name('ticket')->where($whereHandle)->where([['invoice_type','>',0]])->count(), + 'id' => 242, + 'url' => '/finance/ticket/datalist', + ); + $handle[] = array( + 'name' => '待完成任务', + 'num' => Db::name('ProjectTask')->where([['director_uid', '=', $uid],['status', '<', 3],['delete_time', '=', 0]])->count(), + 'id' => 348, + 'url' => '/project/task/datalist', + ); + + $whereCustomer = array(); + $whereCustomerOr = array(); + $whereCustomer[] = ['delete_time', '=', 0]; + $whereCustomerOr[] =['belong_uid', '=', $uid]; + if(!empty($dids)){ + $whereCustomerOr[] =['belong_did', 'in', $dids]; + } + $whereCustomerOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + + $customerCount = Db::name('Customer')->where($whereCustomer) + ->where(function ($query) use($whereCustomerOr) { + $query->whereOr($whereCustomerOr); + }) + ->count(); + $total[] = array( + 'name' => '客户总数', + 'num' => $customerCount, + ); + + $whereContract = array(); + $whereContractOr = array(); + $whereContract[] = ['delete_time', '=', 0]; + $whereContractOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + $whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + if(!empty($dids)){ + $whereContractOr[] =['did', 'in', $dids]; + } + + $contractCount = Db::name('Contract')->where($whereContract) + ->where(function ($query) use($whereContractOr) { + $query->whereOr($whereContractOr); + }) + ->count(); + $total[] = array( + 'name' => '销售合同', + 'num' => $contractCount, + ); + + $purchaseCount = Db::name('Purchase')->where($whereContract) + ->where(function ($query) use($whereContractOr) { + $query->whereOr($whereContractOr); + }) + ->count(); + $total[] = array( + 'name' => '采购合同', + 'num' => $purchaseCount, + ); + + $project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id'); + $whereProject = []; + $whereProject[] = ['delete_time', '=', 0]; + $whereProject[] = ['id', 'in', $project_ids]; + $projectCount = Db::name('Project')->where($whereProject)->count(); + + $whereOr = array(); + $map1 = []; + $map2 = []; + $map3 = []; + $map4 = []; + $map1[] = ['admin_id', '=', $uid]; + $map2[] = ['director_uid', '=', $uid]; + $map3[] = ['', 'exp', Db::raw("FIND_IN_SET({$uid},assist_admin_ids)")]; + $map4[] = ['project_id', 'in', $project_ids]; + + $whereOr =[$map1,$map2,$map3]; + $taskCount = Db::name('ProjectTask') + ->where(function ($query) use ($whereOr) { + if (!empty($whereOr)) + $query->whereOr($whereOr); + }) + ->where([['delete_time', '=', 0]])->count(); + + $total[] = array( + 'name' => '项目总数', + 'num' => $projectCount, + ); + $total[] = array( + 'name' => '任务总数', + 'num' => $taskCount, + ); + + $todue=[]; + $delay_day = valueAuth('contract_admin','conf_10'); + if(empty($delay_day)){ + $delay_day = 30; + } + $delay_time = time()+$delay_day*60*60*24; + $mapContract = array(); + $mapContractOr = array(); + $mapContract[] = ['delete_time', '=', 0]; + $mapContract[] = ['check_status', '=', 2]; + $mapContract[] = ['end_time','<',$delay_time]; + $mapContractOr[] =['admin_id|prepared_uid|sign_uid|keeper_uid', '=', $uid]; + $mapContractOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_ids)")]; + if(!empty($dids)){ + $mapContractOr[] =['did', 'in', $dids]; + } + + $todue[] = array( + 'name' => '快到期的销售合同', + 'num' => Db::name('Contract')->where($mapContract) + ->where(function ($query) use($mapContractOr) { + $query->whereOr($mapContractOr); + })->count(), + 'id' => 319, + 'url' => '/contract/contract/datalist', + ); + $todue[] = array( + 'name' => '快到期的采购合同', + 'num' => Db::name('Purchase')->where($mapContract) + ->where(function ($query) use($mapContractOr) { + $query->whereOr($mapContractOr); + })->count(), + 'id' => 323, + 'url' => '/contract/purchase/datalist', + ); + $delay_day_b = valueAuth('project_admin','conf_10'); + if(empty($delay_day_b)){ + $delay_day_b = 3; + } + $delay_day_b_time = time()+$delay_day_b*60*60*24; + $todue[] = array( + 'name' => '快到期的项目', + 'num' => Db::name('Project')->where($whereProject)->where([['status','<',3],['end_time','<',$delay_day_b_time]])->count(), + 'id' => 343, + 'url' => '/project/index/datalist', + ); + $todue[] = array( + 'name' => '快到期的任务', + 'num' => Db::name('ProjectTask') + ->where(function ($query) use ($whereOr) { + if (!empty($whereOr)) + $query->whereOr($whereOr); + }) + ->where([['delete_time', '=', 0],['status','<',3],['end_time','<',$delay_day_b_time]])->count(), + 'id' => 348, + 'url' => '/project/task/datalist', + ); + + $position_id = Db::name('Admin')->where('id',$uid)->value('position_id'); + $adminGroup = Db::name('PositionGroup')->where(['pid' => $position_id])->column('group_id'); + $adminLayout = Db::name('AdminGroup')->where('id', 'in', $adminGroup)->column('layouts'); + $adminLayouts = []; + foreach ($adminLayout as $k => $v) { + $v = explode(',', $v); + $adminLayouts = array_merge($adminLayouts, $v); + } + $layouts = get_config('layout'); + $layout_selected = []; + foreach ($layouts as $key =>$vo) { + if (!empty($adminLayouts) and in_array($vo['id'], $adminLayouts)) { + $layout_selected[] = $vo; + } + } + View::assign('layout_selected',$layout_selected); + View::assign('total', $total); + View::assign('handle', $handle); + View::assign('todue', $todue); + View::assign('install', $install); + View::assign('TP_VERSION', \think\facade\App::version()); + return View(); + } + + //权限不足 + public function role() + { + return View('../../base/view/common/roletemplate'); + } + //通讯录 + public function contacts_book() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $whereOr = array(); + if (!empty($param['keywords'])) { + $where[] = ['a.id|a.username|a.name|a.nickname|a.mobile|a.desc', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['did'])) { + $admin_array = Db::name('DepartmentAdmin')->where('department_id',$param['did'])->column('admin_id'); + $map1=[ + ['a.id','in',$admin_array], + ]; + $map2=[ + ['a.did', '=', $param['did']], + ]; + $whereOr =[$map1,$map2]; + } + $where[] = ['a.status', '=', 1]; + $where[] = ['a.id', '>', 1]; + $admin = \app\user\model\Admin::alias('a') + ->with('departments') + ->field('a.*,p.title as position,d.title as department') + ->join('Department d', 'd.id = a.did','left') + ->join('Position p', 'p.id = a.position_id','left') + ->where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->paginate(intval($this->pageSize)) + ->order('a.id desc') + ->each(function ($item, $key) { + //遍历次要部门数据 + $departments = $item->departments->toArray(); + if(empty($departments)){ + $item->departments = '-'; + } + else{ + $item->departments = split_array_field($departments,'title'); + } + if($item->is_hide ==1){ + $item->mobile = hidetel($item->mobile); + $item->email = hidetel($item->email); + } + $item->entry_time = empty($item->entry_time) ? '-' : to_date($item->entry_time,'Y-m-d',); + }); + return table_assign(0, '', $admin); + } else { + return view(); + } + } + + + //修改个人信息 + public function edit_personal() + { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + Db::name('Admin')->where(['id' => $uid])->strict(false)->field(true)->update($param); + return to_assign(); + } + else{ + View::assign('admin',get_admin($this->uid)); + return view(); + } + } + + //修改密码 + public function edit_password() + { + if (request()->isAjax()) { + $param = get_params(); + try { + validate(AdminCheck::class)->scene('editPwd')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $uid = $this->uid; + + $admin = Db::name('Admin')->where(['id' => $uid])->find(); + $old_psw = set_password($param['old_pwd'], $admin['salt']); + if ($admin['pwd'] != $old_psw) { + return to_assign(1, '旧密码错误'); + } + + $salt = set_salt(20); + $new_pwd = set_password($param['pwd'], $salt); + $data = [ + 'reg_pwd' => '', + 'salt' => $salt, + 'pwd' => $new_pwd, + 'update_time' => time(), + ]; + Db::name('Admin')->where(['id' => $uid])->strict(false)->field(true)->update($data); + return to_assign(); + } + else{ + View::assign('admin',get_admin($this->uid)); + return view(); + } + } + + //系统操作日志 + public function log_list() + { + if (request()->isAjax()) { + $param = get_params(); + $log = new AdminLog(); + $content = $log->get_log_list($param); + return table_assign(0, '', $content); + }else{ + return view(); + } + } + + //设置theme + public function set_theme() + { + if (request()->isAjax()) { + $param = get_params(); + Db::name('Admin')->where('id',$this->uid)->update(['theme'=>$param['theme']]); + return to_assign(); + } + else{ + return to_assign(1,'操作错误'); + } + } + + //办公工具 + public function get_links() + { + if (request()->isAjax()) { + $links = Db::name('Links')->where('delete_time',0)->order('sort desc')->select(); + return to_assign(0, '', $links); + }else{ + return view(); + } + } +} diff --git a/app/home/controller/Leaves.php b/app/home/controller/Leaves.php new file mode 100644 index 0000000..1f6ae0e --- /dev/null +++ b/app/home/controller/Leaves.php @@ -0,0 +1,128 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\Leaves as LeavesModel; +use app\home\validate\LeavesValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Leaves extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new LeavesModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if(!empty($param['start_date'])){ + $param['start_date'] = strtotime($param['start_date']); + } + if(!empty($param['end_date'])){ + $param['end_date'] = strtotime($param['end_date']); + if($param['end_date']<$param['start_date']){ + return to_assign(1, '结束时间不能小于开始时间'); + } + } + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } + else { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + if(is_mobile()){ + return view('qiye@/approve/add_qingjia'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('create_user', get_admin($detail['admin_id'])); + $detail['types_name'] = leaves_types_name($detail['types']); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_qingjia'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = $param['id']; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/home/controller/Log.php b/app/home/controller/Log.php new file mode 100644 index 0000000..51112f9 --- /dev/null +++ b/app/home/controller/Log.php @@ -0,0 +1,70 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use think\facade\Db; +use think\facade\View; + +class Log extends BaseController +{ + //管理员操作日志 + public function index() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['u.name|a.param_id|a.uid', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['action'])) { + $where[] = ['a.action','=',$param['action']]; + } + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = DB::name('AdminLog') + ->field("a.*,u.name") + ->alias('a') + ->join('Admin u', 'a.uid = u.id') + ->order('a.create_time desc') + ->where($where) + ->paginate(['list_rows'=> $rows]) + ->each(function($item, $key){ + $item['content'] = $item['name']. $item['action'] . '了' . $item['subject']; + $item['create_time'] = date('Y-m-d H:i:s', $item['create_time']); + $param_array = json_decode($item['param'], true); + if(is_array($param_array)){ + $param_value = []; + foreach ($param_array as $key => $value) { + if (is_array($value)) { + $value = implode(',', $value); + } + $param_value[] = $key . ':' . $value; + } + $item['param'] = implode(' & ',$param_value); + } + else{ + $item['param'] = $param_array; + } + return $item; + }); + return table_assign(0, '', $list); + } else { + $type_action = get_config('log.type_action'); + View::assign('type_action', $type_action); + return view(); + } + } +} diff --git a/app/home/controller/Login.php b/app/home/controller/Login.php new file mode 100644 index 0000000..8f1aa72 --- /dev/null +++ b/app/home/controller/Login.php @@ -0,0 +1,123 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\home\validate\UserCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\Session; + +class Login +{ + //登录 + public function index() + { + $wxwork = is_wxwork(); + $mobile = is_mobile(); + if($wxwork){ + return redirect('/qiye/login/login'); + } + if($mobile){ + return redirect('/qiye/login/index'); + } + return View(); + } + //提交登录 + public function login_submit() + { + $param = get_params(); + try { + validate(UserCheck::class)->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + + $admin = Db::name('Admin')->where(['username' => $param['username'],'delete_time' => 0])->find(); + if (empty($admin)) { + $admin = Db::name('Admin')->where(['mobile' => $param['username'],'delete_time' => 0])->find(); + if (empty($admin)) { + return to_assign(1, '用户名或手机号码错误'); + } + } + $param['pwd'] = set_password($param['password'], $admin['salt']); + if ($admin['pwd'] !== $param['pwd']) { + return to_assign(1, '用户或密码错误'); + } + if ($admin['status'] != 1) { + return to_assign(1, '该用户禁止登录,请与管理者联系'); + } + $data = [ + 'is_lock' => 0, + 'last_login_time' => time(), + 'last_login_ip' => request()->ip(), + 'login_num' => $admin['login_num'] + 1, + ]; + Db::name('admin')->where(['id' => $admin['id']])->update($data); + $session_admin = get_config('app.session_admin'); + Session::set($session_admin, $admin['id']); + $token = make_token(); + set_cache($token, $admin, 7200); + $admin['token'] = $token; + $logdata = [ + 'uid' => $admin['id'], + 'type' => 'login', + 'action' => '登录', + 'subject' => '系统', + 'param_id'=>$admin['id'], + 'param'=>'[]', + 'ip' => request()->ip(), + 'create_time' => time() + ]; + Db::name('AdminLog')->strict(false)->field(true)->insert($logdata); + return to_assign(0, '登录成功', ['uid' => $admin['id']]); + } + + //退出登录 + public function login_out() + { + $session_admin = get_config('app.session_admin'); + Session::delete($session_admin); + return to_assign(0, "退出成功"); + } + + //锁屏 + public function lock() + { + $session_admin = get_config('app.session_admin'); + $admin_id= Session::get($session_admin); + $admin = Db::name('admin')->where(['id' => $admin_id])->find(); + if (request()->isAjax()) { + $param = get_params(); + if($param['lock_password'] == ''){ + return to_assign(1, '请输入登录密码解锁'); + } + if(empty($admin)){ + return to_assign(2, '登录超时,请重新登录'); + } + $pwd = set_password($param['lock_password'], $admin['salt']); + if ($admin['pwd'] !== $pwd) { + return to_assign(1, '密码错误'); + } + else{ + Db::name('admin')->where('id',$admin['id'])->update(['is_lock'=>0]); + return to_assign(0, '解锁成功', ['uid' => $admin['id']]); + } + } + Db::name('admin')->where('id',$admin['id'])->update(['is_lock'=>1]); + return View(); + } +} diff --git a/app/home/controller/Message.php b/app/home/controller/Message.php new file mode 100644 index 0000000..8355a0c --- /dev/null +++ b/app/home/controller/Message.php @@ -0,0 +1,552 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\Message as MessageList; +use app\home\model\Msg as MsgList; +use think\facade\Db; +use think\facade\View; + +class Message extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + protected $model2; + public function __construct() { + parent::__construct(); // 调用父类构造函数 + $this->model = new MessageList(); + $this->model2 = new MsgList(); + } + //收件箱 + public function inbox() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $where[] = ['to_uid', '=', $this->uid]; + $where[] = ['delete_time', '=', 0]; + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['read'])) { + if($param['read']==1){ + $where[] = ['read_time', '=', 0]; + }else{ + $where[] = ['read_time', '>', 0]; + } + } + if (!empty($param['types'])) { + if($param['types']==1){ + $where[] = ['from_uid', '=', 0]; + }else{ + $where[] = ['from_uid', '>', 0]; + } + } + //按发送时间检索 + if (!empty($param['range_time'])) { + $range_time =explode('~', $param['range_time']); + $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]]; + } + $list = $this->model2->datalist($where,$param); + return table_assign(0, '', $list); + } else { + $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $count = [ + 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(), + 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(), + 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(), + 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(), + 'rubbish' => $a+$b + ]; + View::assign('count', $count); + View::assign('action', $this->action); + return view(); + } + } + + //星标信息 + public function star() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $where[] = ['to_uid', '=', $this->uid]; + $where[] = ['delete_time', '=', 0]; + $where[] = ['is_star', '=', 1]; + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['read'])) { + if($param['read']==1){ + $where[] = ['read_time', '=', 0]; + }else{ + $where[] = ['read_time', '>', 0]; + } + } + if (!empty($param['types'])) { + if($param['types']==1){ + $where[] = ['from_uid', '=', 0]; + }else{ + $where[] = ['from_uid', '>', 0]; + } + } + //按发送时间检索 + if (!empty($param['range_time'])) { + $range_time =explode('~', $param['range_time']); + $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]]; + } + $list = $this->model2->datalist($where,$param); + return table_assign(0, '', $list); + } else { + $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $count = [ + 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(), + 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(), + 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(), + 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(), + 'rubbish' => $a+$b + ]; + View::assign('count', $count); + View::assign('action', $this->action); + return view(); + } + } + + //发件箱 + public function sendbox() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $map[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['from_uid', '=', $this->uid]; + $where[] = ['is_draft', '=', 1]; + $where[] = ['delete_time', '=', 0]; + //按发送时间检索 + if (!empty($param['range_time'])) { + $range_time =explode('~', $param['range_time']); + $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]]; + } + $list = $this->model->datalist($where,$param); + return table_assign(0, '', $list); + } else { + $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $count = [ + 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(), + 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(), + 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(), + 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(), + 'rubbish' => $a+$b + ]; + View::assign('count', $count); + View::assign('action', $this->action); + return view(); + } + } + + //草稿箱 + public function draft() + { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + if (!empty($param['keywords'])) { + $map[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['from_uid', '=', $this->uid]; + $where[] = ['is_draft', '=', 2]; + $where[] = ['delete_time', '=', 0]; + //按发送时间检索 + if (!empty($param['range_time'])) { + $range_time =explode('~', $param['range_time']); + $where[] = ['send_time', 'between',[strtotime(urldecode($range_time[0])),strtotime(urldecode($range_time[1]))]]; + } + $list = $this->model->datalist($where,$param); + return table_assign(0, '', $list); + } else { + $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $count = [ + 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(), + 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(), + 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(), + 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(), + 'rubbish' => $a+$b + ]; + View::assign('count', $count); + View::assign('action', $this->action); + return view(); + } + } + + //垃圾箱 + public function rubbish() + { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + $where = "delete_time > 0"; + $where.= " AND clear_time = 0"; + if (!empty($param['keywords'])) { + $where.= " AND title like '%" . $param['keywords'] . "%'"; + } + $sqlParts = []; + $sqlCounts = []; + $tables=['message','msg']; + $prefix = get_config('database.connections.mysql.prefix'); + foreach ($tables as $table) { + $tableName = $prefix.$table; + if($table=='message'){ + $wherea= $where.' AND from_uid = '.$uid; + // 假设每个表都有相同的列结构,这里只是简单示例 + $sqlPart = "SELECT id,title,from_uid,send_time,'{$table}' as table_name FROM {$tableName} WHERE {$wherea}"; + $sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$wherea}"; + } + else{ + $whereb= $where.' AND to_uid = '.$uid; + $sqlPart = "SELECT id,title,from_uid,create_time as send_time,'{$table}' as table_name FROM {$tableName} WHERE {$whereb}"; + $sqlCount = "SELECT COUNT(*) AS count FROM {$tableName} WHERE {$whereb}"; + } + + // 查询数据库中是否存在该数据表 + $is_table = Db::query("SHOW TABLES LIKE '{$tableName}'"); + // 判断查询结果 + if (!empty($is_table)) { + $sqlParts[] = $sqlPart; + $sqlCounts[] = $sqlCount; + } + } + // 使用implode将各个部分用UNION ALL连接起来 + $unionSql = implode(" UNION ALL ", $sqlParts); + + $totalCount = 0; + foreach ($sqlCounts as $sql) { + $count = Db::query($sql)[0]['count']; // 假设每个查询都返回了一个包含'count'键的数组 + $totalCount += $count; + } + // 添加排序和分页逻辑 + // 假设每页显示10条记录,当前页码为$page(需要预先定义或获取) + $pageSize = $param['limit']; + $page = 1; // 示例页码 + $offset = ($page - 1) * $pageSize; + + // 注意:不同的数据库分页语法可能有所不同,这里以MySQL为例 + $finalSql = $unionSql . " ORDER BY send_time DESC LIMIT {$offset}, {$pageSize}"; + + // 执行查询 + $result = Db::query($finalSql); + // 处理结果 + foreach ($result as &$row) { + // 处理每一行数据 + $row['types'] = 0; + $row['sourse'] = '发件箱'; + if($row['send_time'] == 0){ + $row['sourse'] = '草稿箱'; + $row['types'] = 1; + $row['send_time'] = '-'; + } + else{ + if($row['table_name'] == 'msg'){ + $row['sourse'] = '收件箱'; + $row['types'] = 2; + } + $row['send_time'] = date('Y-m-d H:i:s',$row['send_time']); + } + if(!empty($row['from_uid'])){ + $row['from_name'] = Db::name('Admin')->where('id','=',$row['from_uid'])->value('name'); + } + else{ + $row['from_name']='-'; + } + } + $list=array( + 'data'=>$result, + 'total'=>$totalCount + ); + return table_assign(0, '', $list); + } else { + $a = MessageList::where([['from_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $b = MsgList::where([['to_uid', '=', $this->uid],['delete_time', '>', 0],['clear_time', '=', 0]])->count(); + $count = [ + 'sendbox' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 1],['delete_time', '=', 0]])->count(), + 'inbox' => MsgList::where([['to_uid', '=', $this->uid],['delete_time', '=', 0]])->count(), + 'star' => MsgList::where([['to_uid', '=', $this->uid],['is_star','=',1],['delete_time', '=', 0]])->count(), + 'draft' => MessageList::where([['from_uid', '=', $this->uid],['is_draft', '=', 2],['delete_time', '=', 0]])->count(), + 'rubbish' => $a+$b + ]; + View::assign('count', $count); + View::assign('action', $this->action); + return view(); + } + } + + //新增&编辑信息 + public function add() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $msg_id = 0; + if ($id > 0) { + $detail = $this->model->detail($id); + if (empty($detail)) { + throw new \think\exception\HttpException(404, '找不到记录'); + } + if ($detail['from_uid'] != $this->uid) { + throw new \think\exception\HttpException(406, '无权限编辑'); + } + if($detail['msg_id']>0){ + $msg_id = $detail['msg_id']; + } + View::assign('detail', $detail); + } + View::assign('id', $id); + View::assign('msg_id', $msg_id); + return view(); + } + + //查看发件箱、草稿箱消息 + public function view($id) + { + $detail = $this->model->detail($id); + if (empty($detail)) { + throw new \think\exception\HttpException(404, '找不到记录'); + } + if ($detail['from_uid'] != $this->uid) { + throw new \think\exception\HttpException(406, '无权限查看'); + } + //已读回执 + if($detail['send_time']>0){ + $read_user_ids= msgList::where([['message_id','=',$id],['read_time','>',0]])->column('to_uid'); + $read_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $read_user_ids)->column('name'); + $detail['read_user_names'] = implode(',',$read_users); + } + View::assign('detail', $detail); + return view(); + } + + //删除发件、草稿 + public function del() + { + $param = get_params(); + $ids = empty($param['ids']) ? 0 : $param['ids']; + $idArray = explode(',', $ids); + foreach ($idArray as $key => $val) { + MessageList::where(['id' => $val])->update(['delete_time' => time()]); + add_log('delete', $val,[],'消息'); + } + return to_assign(0, '操作成功'); + } + + //保存消息 + public function save() + { + $param = get_params(); + $id = empty($param['id']) ? 0 : $param['id']; + //接受人类型判断 + if ($param['types'] == 1 && empty($param['uids'])) { + return to_assign(1, '收件人员不能为空'); + } + if ($param['types'] == 2 && empty($param['dids'])) { + return to_assign(1, '收件部门不能为空'); + } + if ($param['types'] == 3 && empty($param['pids'])) { + return to_assign(1, '收件岗位不能为空'); + } + if ($param['types'] == 4) { + $param['uids'] = ''; + $param['dids'] = ''; + $param['pids'] = ''; + $param['copy_uids'] = ''; + } + $res = false; + if ($id > 0) { + //编辑信息的情况 + $param['update_time'] = time(); + $res = MessageList::strict(false)->field(true)->update($param); + } else { + //新增信息的情况 + $param['create_time'] = time(); + $param['update_time'] = time(); + $param['from_uid'] = $this->uid; + $res = MessageList::strict(false)->field(true)->insertGetId($param); + } + if ($res !== false) { + if ($id > 0) { + $mid = $id; + } else { + $mid = $res; + } + add_log('save',$mid,$param,'消息'); + if($param['is_draft'] == 1){ + $res = $this->model->send($mid); + if ($res!==false) { + return to_assign(0, '发送成功'); + } else { + return to_assign(1, '发送失败'); + } + } + else{ + return to_assign(0, '保存成功', $mid); + } + } else { + return to_assign(1, '操作失败'); + } + } + + //发送消息 + public function send_message($id) + { + //查询要发的消息 + $msg = MessageList::where(['id' => $id])->find(); + if (!empty($msg)) { + $res = $this->model->send($id); + if ($res!==false) { + return to_assign(0, '发送成功'); + } else { + return to_assign(1, '发送失败'); + } + } else { + return to_assign(1, '发送失败,找不到要发送的内容'); + } + } + + + //查看收件箱消息 + public function read($id ) + { + $detail = $this->model2->detail($id); + if (empty($detail)) { + throw new \think\exception\HttpException(406, '找不到记录'); + } + if ($detail['to_uid'] != $this->uid) { + throw new \think\exception\HttpException(406, '找不到记录'); + } + MsgList::where(['id' => $id])->update(['read_time' => time()]); + if($detail['message_id']>0){ + View::assign('message', $this->model->detail($detail['message_id'])); + } + $detail['from_uname'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name'); + View::assign('detail', $detail); + return view(); + } + + + //回复信息 + public function reply() + { + $param = get_params(); + $msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0; + $detail = $this->model2->detail($msg_id); + if (empty($detail)) { + throw new \think\exception\HttpException(404, '找不到记录'); + } + if ($detail['to_uid'] != $this->uid) { + throw new \think\exception\HttpException(406, '无权限回复'); + } + $detail['from_name'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name'); + View::assign('detail', $detail); + return view(); + } + + //转发信息 + public function resend() + { + $param = get_params(); + $msg_id = isset($param['msg_id']) ? $param['msg_id'] : 0; + $detail = $this->model2->detail($msg_id); + if (empty($detail)) { + throw new \think\exception\HttpException(404, '找不到记录'); + } + if ($detail['to_uid'] != $this->uid) { + throw new \think\exception\HttpException(406, '无权限回复'); + } + $detail['from_name'] = Db::name('Admin')->where('id', $detail['from_uid'])->value('name'); + View::assign('detail', $detail); + return view(); + } + + //状态修改 + public function check() + { + $param = get_params(); + $type = empty($param['type']) ? 0 : $param['type']; + $ids = empty($param['ids']) ? 0 : $param['ids']; + $idArray = explode(',', $ids); + foreach ($idArray as $key => $val) { + if ($type==1) { //设置信息为已读 + MsgList::where(['id' => $val])->update(['read_time' => time()]); + add_log('view', $val,[],'消息'); + } + else if ($type==2) { //信息进入垃圾箱 + MsgList::where(['id' => $val])->update(['delete_time' => time()]); + add_log('delete', $val,[],'消息'); + } + else if ($type==3) { //信息从垃圾箱恢复 + MsgList::where(['id' => $val])->update(['delete_time' => 0]); + add_log('recovery', $val,[],'消息'); + } + else if ($type==4) { //信息彻底删除 + MsgList::where(['id' => $val])->update(['clear_time' => 0]); + add_log('clear', $val,[],'消息'); + } + else if ($type==5) { //星标信息 + MsgList::where(['id' => $val])->update(['is_star' => 1]); + add_log('star', $val,[],'消息'); + } + else if ($type==6) { //取消星标信息 + MsgList::where(['id' => $val])->update(['is_star' => 0]); + add_log('unstar', $val,[],'消息'); + } + } + return to_assign(0, '操作成功'); + } + + //还原消息 + public function recovery() + { + $param = get_params(); + $table = empty($param['table']) ? '' : $param['table']; + $ids = empty($param['ids']) ? 0 : $param['ids']; + $idArray = explode(',', $ids); + foreach ($idArray as $key => $val) { + Db::name($table)->update(['id' => $val,'delete_time' => 0]); + add_log('recovery', $val,[],'消息'); + } + return to_assign(0, '操作成功'); + } + //清除消息 + public function clear() + { + $param = get_params(); + $table = empty($param['table']) ? '' : $param['table']; + $ids = empty($param['ids']) ? 0 : $param['ids']; + $idArray = explode(',', $ids); + foreach ($idArray as $key => $val) { + Db::name($table)->update(['id' => $val,'clear_time' => time()]); + add_log('clear', $val,[],'消息'); + } + return to_assign(0, '操作成功'); + } + +} diff --git a/app/home/controller/Module.php b/app/home/controller/Module.php new file mode 100644 index 0000000..f047e64 --- /dev/null +++ b/app/home/controller/Module.php @@ -0,0 +1,276 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\validate\ModuleCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Module extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $module = Db::name('AdminModule')->select(); + return to_assign(0, '', $module); + } else { + $sys_module = Db::name('AdminModule')->select()->toArray(); + View::assign('sys_module', $sys_module); + return view(); + } + } + + //新增/编辑模块 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if($this->uid!=1){ + return to_assign(1,'只有系统超级管理员才有权限新增或编辑模块!'); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(ModuleCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + Db::name('AdminModule')->where(['id' => $param['id']])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } else { + try { + validate(ModuleCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $mid = Db::name('AdminModule')->strict(false)->field(true)->insertGetId($param); + add_log('add', $mid, $param); + } + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $module=[]; + if ($id > 0) { + $module = Db::name('AdminModule')->where(['id' => $id])->find(); + } + View::assign('id', $id); + View::assign('module', $module); + return view(); + } + } + + //安装模块 + public function install() + { + if($this->uid!=1){ + return to_assign(1,'只有系统超级管理员才有权限安装模块!'); + } + $param = get_params(); + $name = $param['name']; + $data = curl_post('https://www.gougucms.com/home/get_module/module',['name'=>$name]); + $json_data = json_decode($data, true); + if($json_data['code'] == 1){ + return to_assign(1,$json_data['msg']); + } + $detail = $json_data['data']; + $rule = unserialize($detail['rule']); + if(empty($rule)){ + return to_assign(1,'找不到该模块的信息'); + } + $prefix = get_config('database.connections.mysql.prefix'); + + $insert = []; + $insert['title'] = $detail['title']; + $insert['name'] = $detail['name']; + $insert['type'] = $detail['type']; + $insert['sourse'] = $detail['sourse']; + $insert['create_time'] = time(); + try { + validate(ModuleCheck::class)->scene('add')->check($insert); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + //sql语句 + $sql_file = CMS_ROOT . '/app/'.$name.'/config/install.sql'; + $sql_array = []; + if(file_exists($sql_file)){ + $sql = file_get_contents($sql_file); + $sql_array = preg_split("/;[\r\n]+/", str_replace("oa_", $prefix, $sql)); + } + //var_dump($sql_array);exit; + Db::startTrans(); + try { + // 导入sql数据并创建表 + if(!empty($sql_array)){ + foreach ($sql_array as $k => $v) { + if (!empty($v)) { + Db::execute($v); + } + } + } + //如果安装过该模块,删除原来的菜单信息 + Db::name('AdminRule')->where('module',$name)->delete(); + $sort = Db::name('AdminRule')->where('pid',0)->max('sort'); + $this->add_rule($rule,0,$sort+1); + $mid = Db::name('AdminModule')->strict(false)->field(true)->insertGetId($insert); + + Db::commit(); + } + catch (\Exception $e) { + //回滚事务 + Db::rollback(); + return to_assign(1,'捕获到异常'.$e->getMessage()); + } + + //更新超级管理员的权限节点 + $rules = Db::name('AdminRule')->column('id'); + $admin_rules = implode(',',$rules); + $res = Db::name('AdminGroup')->strict(false)->where('id',1)->update(['rules'=>$admin_rules,'update_time'=>time()]); + if($res!==false){ + // 删除后台节点缓存 + clear_cache('adminRules'); + add_log('install', $mid, $insert); + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + + //递归插入菜单数据 + protected function add_rule($data, $pid=0,$sort=0) + { + foreach($data as $k => $v) + { + $rule=[ + 'title' => $v['title'], + 'name' => $v['name'], + 'src' => $v['src'], + 'module' => $v['module'], + 'menu' => $v['menu'], + 'icon' => $v['icon'], + 'pid' => $pid, + 'sort' => $sort, + 'create_time' => time() + ]; + $new_id = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($rule); + if(!empty($v['son'] && $new_id)){ + $this->add_rule($v['son'],$new_id); + } + } + } + + //删除 + public function del() + { + if($this->uid!=1){ + return to_assign(1,'只有系统超级管理员才有权限删除模块!'); + } + $param = get_params(); + $module = Db::name('AdminModule')->where('id',$param['id'])->find(); + if($module['type'] == 1){ + return to_assign(1,'系统模块不能删除'); + } + $param['update_time']= time(); + $res = Db::name('AdminModule')->where('id',$param['id'])->delete(); + if($res!==false){ + add_log('delete', $module['id'], $param); + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + + //卸载 + public function uninstall() + { + if($this->uid!=1){ + return to_assign(1,'只有系统超级管理员才有权限卸载模块!'); + } + $param = get_params(); + $module = Db::name('AdminModule')->where('name',$param['name'])->find(); + if($module['type'] == 1){ + return to_assign(1,'系统模块不能卸载'); + } + $param['update_time']= time(); + $res = Db::name('AdminModule')->where('name',$param['name'])->update(['status'=>0]); + if($res!==false){ + Db::name('AdminRule')->strict(false)->where('module',$module['name'])->update(['status'=>0]); + // 删除后台节点缓存 + clear_cache('adminRules'); + add_log('uninstall', $module['id'], $param); + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + + //恢复 + public function recovery() + { + if($this->uid!=1){ + return to_assign(1,'只有系统超级管理员才有权限恢复模块!'); + } + $param = get_params(); + $module = Db::name('AdminModule')->where('name',$param['name'])->find(); + $param['update_time']= time(); + $res = Db::name('AdminModule')->where('name',$param['name'])->update(['status'=>1]); + if($res!==false){ + Db::name('AdminRule')->strict(false)->where('module',$module['name'])->update(['status'=>1]); + // 删除后台节点缓存 + clear_cache('adminRules'); + add_log('recovery', $module['id'], $param); + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + + + //数据权限列表 + public function data_auth() + { + if (request()->isAjax()) { + $auth = Db::name('DataAuth')->select(); + return to_assign(0, '', $auth); + } else { + return view(); + } + } + + //数据权限详情 + public function data_auth_detail() + { + $param = get_params(); + if (request()->isPost()) { + $param['update_time'] = time(); + $res = Db::name('DataAuth')->strict(false)->field(true)->update($param); + return to_assign(); + } else { + $detail = Db::name('DataAuth')->where('name',$param['name'])->find(); + View::assign('detail', $detail); + return view(); + } + } + +} diff --git a/app/home/controller/Outs.php b/app/home/controller/Outs.php new file mode 100644 index 0000000..4fea73d --- /dev/null +++ b/app/home/controller/Outs.php @@ -0,0 +1,126 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\Outs as OutsModel; +use app\home\validate\OutsValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Outs extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new OutsModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if(!empty($param['start_date'])){ + $param['start_date'] = strtotime($param['start_date']); + } + if(!empty($param['end_date'])){ + $param['end_date'] = strtotime($param['end_date']); + if($param['end_date']<$param['start_date']){ + return to_assign(1, '结束时间不能小于开始时间'); + } + } + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + if(is_mobile()){ + return view('qiye@/approve/add_waichu'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('create_user', get_admin($detail['admin_id'])); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_waichu'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/home/controller/Overtimes.php b/app/home/controller/Overtimes.php new file mode 100644 index 0000000..1949400 --- /dev/null +++ b/app/home/controller/Overtimes.php @@ -0,0 +1,126 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\Overtimes as OvertimesModel; +use app\home\validate\OvertimesValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Overtimes extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new OvertimesModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if(!empty($param['start_date'])){ + $param['start_date'] = strtotime($param['start_date']); + } + if(!empty($param['end_date'])){ + $param['end_date'] = strtotime($param['end_date']); + if($param['end_date']<$param['start_date']){ + return to_assign(1, '结束时间不能小于开始时间'); + } + } + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + if(is_mobile()){ + return view('qiye@/approve/add_jiaban'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('create_user', get_admin($detail['admin_id'])); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_jiaban'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/home/controller/Role.php b/app/home/controller/Role.php new file mode 100644 index 0000000..72fe888 --- /dev/null +++ b/app/home/controller/Role.php @@ -0,0 +1,192 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\AdminGroup; +use app\home\validate\GroupCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Role extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['id|title|desc', 'like', '%' . $param['keywords'] . '%']; + } + $list = Db::name('AdminGroup')->where($where)->order('create_time asc')->select(); + return to_assign(0, '', $list); + } else { + return view(); + } + } + + //添加&编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $ruleData = isset($param['rule']) ? $param['rule'] : ''; + $layoutData = isset($param['layout']) ? $param['layout'] : ''; + $menuData = isset($param['mobile_menu']) ? $param['mobile_menu'] : ''; + $barData = isset($param['mobile_bar']) ? $param['mobile_bar'] : ''; + if($ruleData==0){ + return to_assign(1, '权限节点至少选择一个'); + } + if($layoutData==0){ + return to_assign(1, '首页展示模块至少选择一个'); + } + $param['rules'] = implode(',', $ruleData); + $param['layouts'] = implode(',', $layoutData); + if(empty($menuData)){ + $param['mobile_menu'] = ''; + } + else{ + $param['mobile_menu'] = implode(',', $menuData); + } + if(empty($barData)){ + $param['mobile_bar'] = ''; + } + else{ + $param['mobile_bar'] = implode(',', $barData); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(GroupCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + //为了系统安全id为1的系统所有者管理组不允许修改 + if ($param['id'] == 1) { + return to_assign(1, '为了系统安全,该管理组不允许修改'); + } + Db::name('AdminGroup')->where(['id' => $param['id']])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } else { + try { + validate(GroupCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $gid = Db::name('AdminGroup')->strict(false)->field(true)->insertGetId($param); + add_log('add', $gid, $param); + } + //清除菜单\权限缓存 + clear_cache('adminMenu'); + clear_cache('MobileRules'); + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $rule = admin_rule(); + $layouts = get_config('layout'); + $mobile_bar = Db::name('MobileBar')->where([['status','=',1]])->field('id,url,title,icon')->select()->toArray(); + $mobile_menu = Db::name('MobileTypes')->where(['status'=>1])->select()->toArray(); + + + if ($id > 0) { + $rules = admin_group_info($id); + $role_rule = create_tree_list(0, $rule, $rules); + $role = Db::name('AdminGroup')->where(['id' => $id])->find(); + View::assign('role', $role); + + $layout_selected = explode(',', $role['layouts']); + foreach ($layouts as $key =>&$vo) { + if (!empty($layout_selected) and in_array($vo['id'], $layout_selected)) { + $vo['checked'] = true; + } else { + $vo['checked'] = false; + } + } + + $mobile_bar_selected = explode(',', $role['mobile_bar']); + foreach ($mobile_bar as $key =>&$vo) { + if (!empty($mobile_bar_selected) and in_array($vo['id'], $mobile_bar_selected)) { + $vo['checked'] = true; + } else { + $vo['checked'] = false; + } + } + + $mobile_menu_selected = explode(',', $role['mobile_menu']); + foreach ($mobile_menu as &$row) { + $list = Db::name('MobileMenu')->where([['types','=',$row['id']],['status','=',1]])->select()->toArray(); + foreach ($list as $key =>&$vo) { + if (!empty($mobile_menu_selected) and in_array($vo['id'], $mobile_menu_selected)) { + $vo['checked'] = true; + } else { + $vo['checked'] = false; + } + } + $row['list'] = $list; + } + + } else { + $role_rule = create_tree_list(0, $rule, []); + foreach ($layouts as $key =>&$vo) { + $vo['checked'] = false; + } + + foreach ($mobile_bar as $key =>&$vo) { + $vo['checked'] = false; + } + + foreach ($mobile_menu as &$row) { + $list = Db::name('MobileMenu')->where([['types','=',$row['id']],['status','=',1]])->select()->toArray(); + foreach ($list as $key =>&$vo) { + $vo['checked'] = false; + } + $row['list'] = $list; + } + } + View::assign('role_rule', $role_rule); + View::assign('layout', $layouts); + View::assign('mobile_bar', $mobile_bar); + View::assign('mobile_menu', $mobile_menu); + View::assign('id', $id); + return view(); + } + } + + //删除 + public function delete() + { + if (request()->isDelete()) { + $id = get_params("id"); + if ($id == 1) { + return to_assign(1, "该组是系统所有者,无法删除"); + } + $count = Db::name('PositionGroup')->where(["group_id" => $id])->count(); + if ($count > 0) { + return to_assign(1, "该权限组还在使用,请去除使用者关联再删除"); + } + if (Db::name('AdminGroup')->delete($id) !== false) { + add_log('delete', $id, []); + return to_assign(0, "删除权限组成功"); + } else { + return to_assign(1, "删除失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/home/controller/Rule.php b/app/home/controller/Rule.php new file mode 100644 index 0000000..6705dd3 --- /dev/null +++ b/app/home/controller/Rule.php @@ -0,0 +1,110 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\validate\RuleCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Rule extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $rule = Db::name('adminRule') + ->field('a.*,m.title as module_title') + ->alias('a') + ->leftJoin('adminModule m', 'a.module = m.name') + ->order('a.sort asc,a.id asc') + ->select(); + $list = generateTree($rule); + return to_assign(0, '', $list); + } else { + return view(); + } + } + + //添加 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['src'] = preg_replace('# #', '', $param['src']); + if ($param['id'] > 0) { + try { + validate(RuleCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + Db::name('AdminRule')->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } else { + try { + validate(RuleCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $rid = Db::name('AdminRule')->strict(false)->field(true)->insertGetId($param); + //自动为系统超级管理员角色组分配新增的节点 + $group = Db::name('AdminGroup')->find(1); + if (!empty($group)) { + $newGroup['id'] = 1; + $newGroup['rules'] = $group['rules'] . ',' . $rid; + Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup); + add_log('add', $rid, $param); + } + } + // 删除后台节点缓存 + clear_cache('adminRules'); + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + if ($id > 0) { + $detail = Db::name('AdminRule')->where('id', $id)->find(); + View::assign('detail', $detail); + } + View::assign('id', $id); + View::assign('pid', $pid); + return view(); + } + } + //删除 + public function delete() + { + if (request()->isDelete()) { + $id = get_params("id"); + $count = Db::name('AdminRule')->where(["pid" => $id])->count(); + if ($count > 0) { + return to_assign(1, "该节点下还有子节点,无法删除"); + } + if (Db::name('AdminRule')->delete($id) !== false) { + clear_cache('adminRules'); + add_log('delete', $id, []); + return to_assign(0, "删除节点成功"); + } else { + return to_assign(1, "删除失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/home/controller/Task.php b/app/home/controller/Task.php new file mode 100644 index 0000000..2d8cae3 --- /dev/null +++ b/app/home/controller/Task.php @@ -0,0 +1,80 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Task extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $module = Db::name('TimingTask')->where(['delete_time' => 0])->select(); + return to_assign(0, '', $module); + } else { + return view(); + } + } + + //新增/编辑模块 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if($this->uid!=1){ + return to_assign(1,'只有系统超级管理员才有权限新增或编辑定时任务!'); + } + if (!empty($param['id']) && $param['id'] > 0) { + Db::name('TimingTask')->where(['id' => $param['id']])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } else { + $tid = Db::name('TimingTask')->strict(false)->field(true)->insertGetId($param); + add_log('add', $tid, $param); + } + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $task=[]; + if ($id > 0) { + $task = Db::name('TimingTask')->where(['id' => $id])->find(); + } + View::assign('id', $id); + View::assign('task', $task); + return view(); + } + } + + //删除 + public function delete() + { + if($this->uid!=1){ + return to_assign(1,'只有超级管理员才有权限删除定时任务!'); + } + $param = get_params(); + $res = Db::name('TimingTask')->where('id',$param['id'])->update(['delete_time'=>time()]); + if($res!==false){ + add_log('delete', $param['id'], $param); + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + +} diff --git a/app/home/controller/Template.php b/app/home/controller/Template.php new file mode 100644 index 0000000..ea81356 --- /dev/null +++ b/app/home/controller/Template.php @@ -0,0 +1,145 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\Template as TemplateModel; +use app\home\validate\TemplateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Template extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new TemplateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(TemplateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(TemplateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $copyid = isset($param['copyid']) ? $param['copyid'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + if ($copyid>0) { + $detail = $this->model->getById($copyid); + View::assign('detail', $detail); + } + View::assign('copyid', $copyid); + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + //设置 + public function set() + { + $param = get_params(); + $res = $this->model::field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } +} diff --git a/app/home/controller/Trips.php b/app/home/controller/Trips.php new file mode 100644 index 0000000..462d710 --- /dev/null +++ b/app/home/controller/Trips.php @@ -0,0 +1,126 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\controller; + +use app\base\BaseController; +use app\home\model\Trips as TripsModel; +use app\home\validate\tripsValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Trips extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new TripsModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if(!empty($param['start_date'])){ + $param['start_date'] = strtotime($param['start_date']); + } + if(!empty($param['end_date'])){ + $param['end_date'] = strtotime($param['end_date']); + if($param['end_date']<$param['start_date']){ + return to_assign(1, '结束时间不能小于开始时间'); + } + } + if (!empty($param['id']) && $param['id'] > 0) { + $this->model->edit($param); + } else { + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + if(is_mobile()){ + return view('qiye@/approve/add_chuchai'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('create_user', get_admin($detail['admin_id'])); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_chuchai'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/home/event.php b/app/home/event.php new file mode 100644 index 0000000..afe5918 --- /dev/null +++ b/app/home/event.php @@ -0,0 +1,8 @@ + [ + //注册监听类 + 'SendMessage' => ['app\listener\SendMessage'], + ], + //'subscribe' => ['app\subscribe\Message'], +]; diff --git a/app/home/middleware.php b/app/home/middleware.php new file mode 100644 index 0000000..c482cdc --- /dev/null +++ b/app/home/middleware.php @@ -0,0 +1,9 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\home\middleware; +use systematic\Systematic; +use think\facade\Db; +use think\facade\Session; + +class Install +{ + protected $module = ''; + protected $controller = ''; + protected $action = ''; + public function handle($request, \Closure $next) + { + if (!is_installed()) { + return $request->isAjax() ? to_assign(1, '请先完成系统安装引导') : redirect((string) url('/install/index')); + } + $module = strtolower(app('http')->getName()); + $this->module = $module; + $param = $request->param(); + $logtype = isset($param['logtype'])?$param['logtype']:''; + $module_son = isset($param['module_son'])?$param['module_son']:''; + $module_old = []; + if($module_son!='' && ($logtype != 'add' || $logtype != 'delete')){ + $module_old = Db::name($module_son)->where('id',$param['id'])->find(); + } + //return $next($request); + //获取响应,获取响应之前的代码为前置中间件, + //do songthing + //----------以上部分为前置中间件-------------- + + $response=$next($request); + + //----------以下部分为后置中间件-------------- + //获取响应之后的为后置中间件的执行内容 + + $this->controller = strtolower($request->controller()); + $this->action = strtolower($request->action()); + //获取返回的HTTPCode + //$code = $response->getCode(); + $responseData = $response->getData(); + if(isset($responseData['code']) && $responseData['code'] == 0){ + if(isset($responseData['datas'])){ + $logData = $responseData['datas']; + } + else{ + $logData = $responseData['data']; + } + $log_conf = get_config('log'); + $type_action = $log_conf['type_action']; + if(isset($logData['logtype']) && isset($logData['id']) && isset($type_action[$logData['logtype']])){ + $logData['type_title'] = $type_action[$logData['logtype']]; + $moduleLogData = []; + if($module_son!='' && isset($log_conf[$this->module])){ + $log_conf_module = $log_conf[$this->module]; + $module_field_key = $log_conf_module[$module_son]; + $module_new = Db::name($module_son)->where('id',$logData['id'])->find(); + $param_id = $module_new['id']; + $param_son_id = 0; + if($module_son!=$this->module){ + $param_id = $module_new[$this->module.'_id']; + $param_son_id = $module_new['id']; + } + else{ + $module_son = ''; + } + if(isset($module_field_key)){ + $moduleLogData = [ + 'param_id'=>$param_id, + 'module_son'=>$module_son, + 'param_son_id'=>$param_son_id, + 'old'=>$module_old, + 'new'=>$module_new, + 'key'=>$module_field_key + ]; + } + } + $this->addLog($logData,$moduleLogData); + } + } + + //这里回调本身返回response对象 + return $response; + } + /* + public function end(\think\Response $response){ + + dump($response->getData()); + exit; + + //dump($response->header()); + } + */ + + protected function addLog($logData = [],$moduleLogData=[]) + { + $session_admin = get_config('app.session_admin'); + $uid = Session::get($session_admin); + $data = [ + 'uid' => $uid, + 'type' => $logData['logtype'], + 'action' => $logData['type_title'], + 'param_id' => $logData['id'], + 'param' => json_encode($logData), + 'module' => $this->module, + 'controller' => $this->controller, + 'function' => $this->action, + 'ip' => app('request')->ip(), + 'create_time' => time(), + 'subject' => '系统' + ]; + if(isset($logData['subject']) && $logData['subject'] != ''){ + $data['subject'] = $logData['subject']; + } + else{ + $rule = $data['module'] . '/' . $data['controller'] . '/' . $data['function']; + $rule_menu = Db::name('AdminRule')->where(array('src' => $rule))->find(); + if($rule_menu){ + $data['subject'] = $rule_menu['name']; + } + } + Db::name('AdminLog')->strict(false)->field(true)->insert($data); + if(!empty($moduleLogData)){ + $GOUGU = new Systematic(); + $GOUGU->moduleLog($uid,$logData['logtype'],$this->module,$moduleLogData); + } + } +} diff --git a/app/home/model/AdminGroup.php b/app/home/model/AdminGroup.php new file mode 100644 index 0000000..fb8815f --- /dev/null +++ b/app/home/model/AdminGroup.php @@ -0,0 +1,21 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\model; + +use think\Model; + +class AdminGroup extends Model +{ + +} diff --git a/app/home/model/AdminLog.php b/app/home/model/AdminLog.php new file mode 100644 index 0000000..24ff8c3 --- /dev/null +++ b/app/home/model/AdminLog.php @@ -0,0 +1,39 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\home\model; + +use think\Model; +use think\facade\Db; +use dateset\Dateset; + +class AdminLog extends Model +{ + public function get_log_list($param = []) + { + $rows = empty($param['limit']) ? get_config('app.pages') : $param['limit']; + $list = Db::name('AdminLog') + ->field("a.id,a.uid,a.type,a.subject,a.action,a.create_time,u.name") + ->alias('a') + ->join('Admin u', 'a.uid = u.id') + ->order('a.create_time desc') + ->paginate(['list_rows'=> $rows]) + ->each(function($item, $key){ + $item['content'] = $item['name']. $item['action'] . '了' . $item['subject']; + $item['times'] = (new Dateset())->time_trans($item['create_time']); + return $item; + }); + return $list; + } +} diff --git a/app/home/model/File.php b/app/home/model/File.php new file mode 100644 index 0000000..b88a023 --- /dev/null +++ b/app/home/model/File.php @@ -0,0 +1,22 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\model; + +use think\Model; + +// 关键字模型 +class File extends Model +{ + protected $autoWriteTimestamp=false; +} diff --git a/app/home/model/Leaves.php b/app/home/model/Leaves.php new file mode 100644 index 0000000..487a888 --- /dev/null +++ b/app/home/model/Leaves.php @@ -0,0 +1,121 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\home\model; +use think\model; +use think\facade\Db; +class Leaves extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + //$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param,'请假申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param,'请假申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['start_date'] = date('Y-m-d H:i',$info['start_date']); + $info['end_date'] = date('Y-m-d H:i',$info['end_date']); + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title'); + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/home/model/Message.php b/app/home/model/Message.php new file mode 100644 index 0000000..a8c0a36 --- /dev/null +++ b/app/home/model/Message.php @@ -0,0 +1,153 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\model; + +use think\Model; +use think\facade\Db; + +class Message extends Model +{ + /** + * 获取发件箱分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->send_time_str = empty($item->send_time) ? '草稿' : date('Y-m-d H:i:s', $item->send_time); + if(empty($item->uids)){ + $item->to_name = '-'; + } + else{ + $to_name = Db::name('Admin')->where([['id','in',$item->uids]])->column('name'); + $item->to_name = implode(',',$to_name); + } + if(empty($item->dids)){ + $item->to_department = '-'; + } + else{ + $to_department = Db::name('Department')->where([['id','in',$item->dids]])->column('title'); + $item->to_department = implode(',',$to_department); + } + if(empty($item->pids)){ + $item->to_position = '-'; + } + else{ + $to_position = Db::name('Position')->where([['id','in',$item->pids]])->column('title'); + $item->to_position = implode(',',$to_position); + } + if(empty($item->copy_uids)){ + $item->copy_names = '-'; + } + else{ + $copy_name = Db::name('Admin')->where([['id','in',$item->copy_uids]])->column('name'); + $item->copy_names = implode(',',$copy_name); + } + $item['create_time'] = to_date($item['create_time'],'Y-m-d H:i:s'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + //发件箱消息详情 + public function detail($id) + { + $detail = self::find($id); + if(!empty($detail)){ + if ($detail['types'] == 1) { //人员 + $users = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['uids'])->column('name'); + $detail['unames'] = implode(',',$users); + } elseif ($detail['types'] == 2) { //部门 + $departments = Db::name('Department')->where('id', 'in', $detail['dids'])->column('title'); + $detail['dnames'] = implode(',',$departments); + } elseif ($detail['types'] == 3) { //角色 + $positions = Db::name('Position')->where('id', 'in', $detail['pids'])->column('title'); + $detail['pnames'] = implode(',',$positions); + } + $copy_users = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['copy_uids'])->column('name'); + $detail['copy_names'] = implode(',',$copy_users); + //消息附件 + $file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['file_ids']]])->select()->toArray(); + $detail['file_array'] = $file_array; + //引用消息附件 + if($detail['msg_id']>0){ + $from_msg = Db::name('Msg')->field('content,file_ids,template,action_id')->where(['id' => $detail['msg_id']])->find(); + $detail['from_template'] = $from_msg['template']; + $detail['from_action_id'] = $from_msg['action_id']; + $detail['from_content'] = $from_msg['content']; + $detail['from_file_ids'] = $from_msg['file_ids']; + $detail['from_file_array'] = Db::name('File')->order('create_time desc')->where([['id','in',$detail['from_file_ids']]])->select()->toArray(); + } + } + return $detail; + } + + //发送消息 + public function send($id) + { + //查询要发的消息 + $msg = self::find($id); + $users = []; + //查询全部收件人 + if ($msg['types'] == 1) { //人员 + $users = Db::name('Admin')->where('status', 1)->where('id', 'in', $msg['uids'])->column('id'); + } elseif ($msg['types'] == 2) { //部门 + $users = Db::name('Admin')->where('status', 1)->where('did', 'in', $msg['dids'])->column('id'); + } elseif ($msg['types'] == 3) { //角色 + $users = Db::name('Admin')->where('status', 1)->where('position_id', 'in', $msg['pids'])->column('id'); + } elseif ($msg['types'] == 4) { //全部 + $users = Db::name('Admin')->where('status', 1)->column('id'); + } + if(!empty($msg['copy_uids'])){ + $copy_uids = explode(',',$msg['copy_uids']); + $users_tem = array_merge($users,$copy_uids); + $users = array_unique($users_tem); + } + //组合要发的消息 + $send_data = []; + foreach ($users as $key => $value) { + if ($value == $msg['from_uid']) { + continue; + } + $send_data[] = array( + 'message_id' => $msg['id'],//来源发件箱关联id + 'to_uid' => $value,//接收人 + 'msg_id' => $msg['msg_id'],//转发或回复消息关联id + 'title' => $msg['title'], + 'content' => $msg['content'], + 'file_ids' => $msg['file_ids'], + 'from_uid' => $msg['from_uid'],//发送人 + 'create_time' => time() + ); + } + $res = Db::name('Msg')->strict(false)->field(true)->insertAll($send_data); + if ($res!==false) { + //草稿消息变成已发消息 + self::where(['id' => $msg['id']])->update(['is_draft' => '1', 'send_time' => time(), 'update_time' => time()]); + add_log('send',$msg['id'],[],'消息'); + return true; + } else { + return false; + } + } +} diff --git a/app/home/model/Msg.php b/app/home/model/Msg.php new file mode 100644 index 0000000..6fd4435 --- /dev/null +++ b/app/home/model/Msg.php @@ -0,0 +1,81 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\model; + +use think\Model; +use think\facade\Db; + +class Msg extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->from_name = '系统'; + $item->thumb = '/static/home/images/icon.png'; + $item['create_time'] = to_date($item['create_time'],'Y-m-d H:i:s'); + if($item->from_uid>0){ + $from_name = Db::name('Admin')->where('id',$item->from_uid)->find(); + $item->from_name = $from_name['name']; + $item->thumb = $from_name['thumb']; + } + if(!empty($item->uids)){ + $to_name = Db::name('Admin')->where(['id','in',$item->uids])->column('name'); + $item->to_name = implode(',',$to_name); + } + else{ + $item->to_name = '-'; + } + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + //消息详情 + public function detail($id) + { + $detail = self::find($id); + if(!empty($detail)){ + //消息附件 + $file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['file_ids']]])->select()->toArray(); + $detail['file_array'] = $file_array; + //引用消息附件 + if($detail['msg_id']>0){ + $from_msg = Db::name('Msg')->find($detail['msg_id']); + if(!empty($from_msg)){ + $detail['from_template'] = $from_msg['template']; + $detail['from_action_id'] = $from_msg['action_id']; + $detail['from_content'] = $from_msg['content']; + $detail['from_file_ids'] = $from_msg['file_ids']; + $from_file_array = Db::name('File')->order('create_time desc')->where([['id','in',$detail['from_file_ids']]])->select()->toArray(); + $detail['from_file_array'] = $from_file_array; + } + } + $detail['create_time'] = to_date($detail['create_time'],'Y-m-d H:i:s'); + } + return $detail; + } +} diff --git a/app/home/model/Outs.php b/app/home/model/Outs.php new file mode 100644 index 0000000..17277ad --- /dev/null +++ b/app/home/model/Outs.php @@ -0,0 +1,121 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\home\model; +use think\model; +use think\facade\Db; +class Outs extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + //$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param,'外出申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param,'外出申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['start_date'] = date('Y-m-d H:i',$info['start_date']); + $info['end_date'] = date('Y-m-d H:i',$info['end_date']); + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title'); + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/home/model/Overtimes.php b/app/home/model/Overtimes.php new file mode 100644 index 0000000..2c6d208 --- /dev/null +++ b/app/home/model/Overtimes.php @@ -0,0 +1,121 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\home\model; +use think\model; +use think\facade\Db; +class Overtimes extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + //$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param,'加班申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param,'加班申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['start_date'] = date('Y-m-d H:i',$info['start_date']); + $info['end_date'] = date('Y-m-d H:i',$info['end_date']); + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title'); + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/home/model/Template.php b/app/home/model/Template.php new file mode 100644 index 0000000..b71ed79 --- /dev/null +++ b/app/home/model/Template.php @@ -0,0 +1,114 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\home\model; +use think\model; +use think\facade\Db; +class Template extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item['create_time'] = to_date($item['create_time'],'Y-m-d H:i:s'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/home/model/Trips.php b/app/home/model/Trips.php new file mode 100644 index 0000000..24a2a8b --- /dev/null +++ b/app/home/model/Trips.php @@ -0,0 +1,122 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\model; +use think\model; +use think\facade\Db; +class Trips extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + //$item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param,'出差申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param,'出差申请'); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['start_date'] = date('Y-m-d H:i',$info['start_date']); + $info['end_date'] = date('Y-m-d H:i',$info['end_date']); + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $info['department'] = Db::name('Department')->where('id','=',$info['did'])->value('title'); + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/home/validate/ConfCheck.php b/app/home/validate/ConfCheck.php new file mode 100644 index 0000000..f9c1442 --- /dev/null +++ b/app/home/validate/ConfCheck.php @@ -0,0 +1,31 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\validate; + +use think\Validate; + +class ConfCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:config', + 'name' => 'require|unique:config', + ]; + + protected $message = [ + 'title.require' => '配置名称不能为空', + 'title.unique' => '同样的配置名称已经存在', + 'name.require' => '配置标识不能为空', + 'name.unique' => '同样的配置标识已经存在', + ]; +} diff --git a/app/home/validate/EnterpriseCheck.php b/app/home/validate/EnterpriseCheck.php new file mode 100644 index 0000000..87a5e2f --- /dev/null +++ b/app/home/validate/EnterpriseCheck.php @@ -0,0 +1,35 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\validate; + +use think\Validate; + +class EnterpriseCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:enterprise', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/home/validate/GroupCheck.php b/app/home/validate/GroupCheck.php new file mode 100644 index 0000000..d15783b --- /dev/null +++ b/app/home/validate/GroupCheck.php @@ -0,0 +1,47 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\validate; + +use think\Validate; + +class GroupCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:admin_group', + 'id' => 'require', + 'status' => 'require|checkStatus:-1,1', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.unique' => '同样的记录已经存在', + 'id.require' => '缺少更新条件', + 'status.require' => '状态为必选', + 'status.checkStatus' => '系统所有者组不能被禁用', + ]; + + protected $scene = [ + 'add' => ['title', 'status'], + 'edit' => ['id', 'title', 'status'], + ]; + + // 自定义验证规则 + protected function checkStatus($value, $rule, $data) + { + if ($value == -1 and $data['id'] == 1) { + return $rule == false; + } + return $rule == true; + } +} diff --git a/app/home/validate/ModuleCheck.php b/app/home/validate/ModuleCheck.php new file mode 100644 index 0000000..fb4ff72 --- /dev/null +++ b/app/home/validate/ModuleCheck.php @@ -0,0 +1,40 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\validate; + +use think\Validate; + +class ModuleCheck extends Validate +{ + protected $rule = [ + 'title' => 'require|unique:admin_module', + 'name' => 'require|lower|min:2|unique:admin_module', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '模块名称不能为空', + 'title.unique' => '同样的模块名称已经存在', + 'name.require' => '模块标识不能为空', + 'name.lower' => '模块目录只能是小写字母', + 'name.min' => '模块目录至少需要2个小写字母', + 'name.unique' => '同样的模块目录已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title','name'], + 'edit' => ['id','title','name'], + ]; +} diff --git a/app/home/validate/RuleCheck.php b/app/home/validate/RuleCheck.php new file mode 100644 index 0000000..a30022b --- /dev/null +++ b/app/home/validate/RuleCheck.php @@ -0,0 +1,40 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\validate; + +use think\Validate; + +class RuleCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'name' => 'require', + 'menu' => 'require', + 'src' => 'unique:admin_rule', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '菜单节点名称不能为空', + 'src.unique' => '同样的菜单节点URL已经存在', + 'menu.require' => '是否是左侧菜单需要选择', + 'name.require' => '节点日志操作名称不能为空', + 'id.require' => '缺少更新条件' + ]; + + protected $scene = [ + 'add' => ['title','src','name','menu'], + 'edit' => ['id', 'title','src','name','menu'] + ]; +} diff --git a/app/home/validate/TemplateValidate.php b/app/home/validate/TemplateValidate.php new file mode 100644 index 0000000..612a812 --- /dev/null +++ b/app/home/validate/TemplateValidate.php @@ -0,0 +1,52 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\validate; +use think\Validate; +use think\facade\Db; + +class TemplateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Template')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + protected function checkOneName($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Template')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'name' => 'require|alphaDash|checkOneName', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'name.checkOne' => '同样的标识已经存在', + 'name.alphaDash' => '标识只能是小写字母', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title','name'], + 'edit' => ['title','name', 'id'], + ]; +} \ No newline at end of file diff --git a/app/home/validate/UserCheck.php b/app/home/validate/UserCheck.php new file mode 100644 index 0000000..5a4cc30 --- /dev/null +++ b/app/home/validate/UserCheck.php @@ -0,0 +1,32 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\home\validate; + +use think\Validate; + +class UserCheck extends Validate +{ + protected $rule = [ + 'username' => 'require', + 'password' => 'require', + 'captcha' => 'require|captcha', + ]; + + protected $message = [ + 'username.require' => '用户名不能为空', + 'password.require' => '密码不能为空', + 'captcha.require' => '验证码不能为空', + 'captcha.captcha' => '验证码不正确', + ]; +} diff --git a/app/home/view/approve/all.html b/app/home/view/approve/all.html new file mode 100644 index 0000000..abae5ab --- /dev/null +++ b/app/home/view/approve/all.html @@ -0,0 +1,75 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
            +
          • 全部
          • +
          • 待审批
          • +
          • 审批通过
          • +
          • 审批拒绝
          • +
          +
          +
          +
          + + + +
          +
          + + +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/approve/checklist.html b/app/home/view/approve/checklist.html new file mode 100644 index 0000000..166a40f --- /dev/null +++ b/app/home/view/approve/checklist.html @@ -0,0 +1,62 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
            +
          • 全部
          • +
          • 待我审批
          • +
          • 我已审批
          • +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/approve/copylist.html b/app/home/view/approve/copylist.html new file mode 100644 index 0000000..2f3b672 --- /dev/null +++ b/app/home/view/approve/copylist.html @@ -0,0 +1,63 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
            +
          • 全部
          • +
          • 待审批
          • +
          • 审批通过
          • +
          • 审批拒绝
          • +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/approve/index.html b/app/home/view/approve/index.html new file mode 100644 index 0000000..4e3672d --- /dev/null +++ b/app/home/view/approve/index.html @@ -0,0 +1,89 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +
          +

          审批新申请

          + {volist name="module" id="v" offset="0"} + {notempty name="$v.list"} +
          {$v.title}
          +
          +
          + {volist name="$v.list" id="vo"} +
          {$vo.title}
          + {/volist} +
          +
          + {/notempty} + {/volist} +
          + 如果是【日常办公数据管理员】,可查看全体员工的审批申请记录,去查『全部审批』 +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/approve/mylist.html b/app/home/view/approve/mylist.html new file mode 100644 index 0000000..66fc3d1 --- /dev/null +++ b/app/home/view/approve/mylist.html @@ -0,0 +1,71 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
            +
          • 全部
          • +
          • 待审批
          • +
          • 审批通过
          • +
          • 审批拒绝
          • +
          +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/area/add.html b/app/home/view/area/add.html new file mode 100644 index 0000000..4c239fa --- /dev/null +++ b/app/home/view/area/add.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          省市区

          + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + +
          父级省市区*{$pname|default='顶级城市'}省市区名称*省市区简称*
          经度* + + 纬度* + + 排序
          + {else/} + + + + + + + + + + + + + + + + + +
          父级菜单/节点*{$detail.pname|default='顶级城市'}省市区名称*省市区简称*
          经度* + + 纬度* + + 排序 +
          + {/if} +
          + + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/area/datalist.html b/app/home/view/area/datalist.html new file mode 100644 index 0000000..30884cd --- /dev/null +++ b/app/home/view/area/datalist.html @@ -0,0 +1,158 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          + {eq name="is_area" value="0"} +
          + 全国城市数据还未导入,请点击按钮导入 +
          + {else/} +
          +

          全国省市区

          + +
          +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          +
          +
          + {/eq} +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/car_cate.html b/app/home/view/cate/car_cate.html new file mode 100644 index 0000000..a17901b --- /dev/null +++ b/app/home/view/cate/car_cate.html @@ -0,0 +1,146 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/cost_cate.html b/app/home/view/cate/cost_cate.html new file mode 100644 index 0000000..1fdbd4f --- /dev/null +++ b/app/home/view/cate/cost_cate.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/enterprise.html b/app/home/view/cate/enterprise.html new file mode 100644 index 0000000..f39c461 --- /dev/null +++ b/app/home/view/cate/enterprise.html @@ -0,0 +1,96 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/enterprise_add.html b/app/home/view/cate/enterprise_add.html new file mode 100644 index 0000000..39d1e17 --- /dev/null +++ b/app/home/view/cate/enterprise_add.html @@ -0,0 +1,108 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
          +

          企业主体

          + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + + + + + +
          企业名称* + + 所在城市* + +
          详细地址* + + 纳税人识别号*
          开户银行 + + 银行帐号
          备注信息 + +
          + {else/} + + + + + + + + + + + + + + + + + + + + + + + +
          企业名称* + + 所在城市* + +
          详细地址* + + 纳税人识别号*
          开户银行 + + 银行帐号
          备注信息 + +
          + {/if} +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/expense_cate.html b/app/home/view/cate/expense_cate.html new file mode 100644 index 0000000..48a67d0 --- /dev/null +++ b/app/home/view/cate/expense_cate.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/flow_type.html b/app/home/view/cate/flow_type.html new file mode 100644 index 0000000..6b32c84 --- /dev/null +++ b/app/home/view/cate/flow_type.html @@ -0,0 +1,102 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/flow_type_add.html b/app/home/view/cate/flow_type_add.html new file mode 100644 index 0000000..977c395 --- /dev/null +++ b/app/home/view/cate/flow_type_add.html @@ -0,0 +1,123 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          审批类型

          + {eq name="$id" value="0"} + + + + + + + + + + + + + + + + + + + + +
          所属分类* + + 名称* + +
          标识* + + 图标* + + 如:icon-jichupeizhi[查看图标] +
          应用部门 +
          + +
          + (如果不选,默认是全公司) +
          + 注意:新增审批类型以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的审批类型模板文件,然后根据需求修改对应的表单即可。 +
          + {else/} + + + + + + + + + + + + + + + + + +
          所属分类* + + 名称* + +
          标识* + + 图标* + + [查看图标] +
          应用部门 +
          + +
          + (如果不选,默认是全公司) +
          + {/eq} +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/industry_cate.html b/app/home/view/cate/industry_cate.html new file mode 100644 index 0000000..55e02b9 --- /dev/null +++ b/app/home/view/cate/industry_cate.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/links.html b/app/home/view/cate/links.html new file mode 100644 index 0000000..228163d --- /dev/null +++ b/app/home/view/cate/links.html @@ -0,0 +1,78 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/links_add.html b/app/home/view/cate/links_add.html new file mode 100644 index 0000000..723f8dc --- /dev/null +++ b/app/home/view/cate/links_add.html @@ -0,0 +1,59 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
          +

          办公工具

          + + + + + + + + + + + + + +
          工具名称*链接地址*
          是否新窗口打开* + {empty name="$detail"} + + + {else/} + + + {/empty} + 排序
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/seal_cate.html b/app/home/view/cate/seal_cate.html new file mode 100644 index 0000000..b49f4e3 --- /dev/null +++ b/app/home/view/cate/seal_cate.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/services_cate.html b/app/home/view/cate/services_cate.html new file mode 100644 index 0000000..8d1bf01 --- /dev/null +++ b/app/home/view/cate/services_cate.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/cate/work_cate.html b/app/home/view/cate/work_cate.html new file mode 100644 index 0000000..f6432e7 --- /dev/null +++ b/app/home/view/cate/work_cate.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/conf/add.html b/app/home/view/conf/add.html new file mode 100644 index 0000000..9632572 --- /dev/null +++ b/app/home/view/conf/add.html @@ -0,0 +1,68 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          配置项

          + + + + + + + + + + + + + + +
          配置名称* + + + + 状态* + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
          + 配置标识* + + +
          + 注意:新增配置项以后,需要对应新增模板文件,模板文件名称需与标识名称一致,建议复制现有的配置模板文件,然后根据需求修改对应的表单即可。 +
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/conf/email.html b/app/home/view/conf/email.html new file mode 100644 index 0000000..439987b --- /dev/null +++ b/app/home/view/conf/email.html @@ -0,0 +1,118 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          邮箱配置

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          SMTP地址* + + + 如:QQ邮箱的SMTP服务器地址是smtp.qq.com,163邮箱的SMTP服务器地址是smtp.163.com +
          协议端口号* + 如:QQ邮箱的ssl协议方式端口号是465/587,163邮箱的ssl协议方式端口号是465/994 +
          邮箱账户*如:gougucms@qq.com +
          邮箱密码*不一定是登录密码,如QQ邮箱的是第三方授权登录码,要自己去开启,在邮箱的设置->账户->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 +
          发送人* + + 用于展示给发送方,如:勾股CMS系统管理员 +
          显示的邮箱* + + 可以不同于上面的账户,用于展示给发送方的邮箱,如:admin@gougucms.com +
          邮件模板 +
          +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/conf/index.html b/app/home/view/conf/index.html new file mode 100644 index 0000000..a1a9b94 --- /dev/null +++ b/app/home/view/conf/index.html @@ -0,0 +1,107 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/conf/other.html b/app/home/view/conf/other.html new file mode 100644 index 0000000..bc8e7e2 --- /dev/null +++ b/app/home/view/conf/other.html @@ -0,0 +1,46 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          其他配置

          + + + + + + + +
          开发者 + + + 开发版本号
          + +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/conf/system.html b/app/home/view/conf/system.html new file mode 100644 index 0000000..2616f38 --- /dev/null +++ b/app/home/view/conf/system.html @@ -0,0 +1,127 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          系统配置

          + + + + + + + + + + + + + + + + + + + + + + + +
          左侧菜单模式 + {empty name="$config.menu_mode"} + + + {else/} + + + {/empty} + 上传附件限制(MB)* + +
          开启新消息声音提醒 + {empty name="$config.msg_sound"} + + + {else/} + + + {/empty} + 开启系统页面水印 + {empty name="$config.watermark"} + + + {else/} + + + {/empty} +
          隐藏工作台广告* + {empty name="$config.qrcode"} + + + {else/} + + + {/empty} +
          代码版本号* + + 版权信息 + +
          + +
          + + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/conf/token.html b/app/home/view/conf/token.html new file mode 100644 index 0000000..c2f16ed --- /dev/null +++ b/app/home/view/conf/token.html @@ -0,0 +1,127 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          TOKEN配置

          + + + + + + + + + + + + + +
          Token签发组织 + + + Token签发作者 + +
          Token Secrect + + Token过期时间 + +
          +
          + + +
          + +
          + Api测试登录 + Token测试 +
          +
          +

          先点击登录,在点击测试,会有好的结果哦!

          + 测试结果: +
          +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/conf/web.html b/app/home/view/conf/web.html new file mode 100644 index 0000000..19673b0 --- /dev/null +++ b/app/home/view/conf/web.html @@ -0,0 +1,122 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          信息配置

          + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          系统名称* + + + 系统域名* + +
          ICP备案号 + + 系统大LOGO +
          + + +
          +
          系统小LOGO +
          + + +
          +
          公安备案号 + +
          系统关键词* + +
          系统描述* + + +
          + +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/dataauth/contract_admin.html b/app/home/view/dataauth/contract_admin.html new file mode 100644 index 0000000..e76bd01 --- /dev/null +++ b/app/home/view/dataauth/contract_admin.html @@ -0,0 +1,120 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          模块配置及数据权限配置

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +

          模块使用说明:

          +

          {$detail.desc}

          +
          权限名称 + + {$detail.title} + 权限标识{$detail.name}
          合同管理员 + + + 权限标识conf_1
          合同编号自动生成 + + + 权限标识conf_2
          是否开启关联客户
          [销售合同]
          + + + 权限标识conf_3
          是否开启关联产品
          [销售合同]
          + + + 权限标识conf_4
          是否开启关联服务
          [销售合同]
          + + + 权限标识conf_5
          是否开启关联供应商
          [采购合同]
          + + + 权限标识conf_6
          是否开启关联采购品
          [采购合同]
          + + + 权限标识conf_7
          合同到期前N天提醒权限标识conf_10
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/dataauth/customer_admin.html b/app/home/view/dataauth/customer_admin.html new file mode 100644 index 0000000..6e07db3 --- /dev/null +++ b/app/home/view/dataauth/customer_admin.html @@ -0,0 +1,82 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          模块配置及数据权限配置

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +

          模块使用说明:

          +

          {$detail.desc}

          +
          权限名称 + + {$detail.title} + 权限标识{$detail.name}
          客户管理员 + + + 权限标识conf_1
          每天可获取公客数 + 权限标识conf_2
          说明如:10,当日超过该数量,该员工就不能在抢客宝里面抢客或者从公海里领取客户,等到第二天自动恢复。
          员工客户数量限制 + 权限标识conf_3
          说明如:100,超过该数量,该员工就不能录入或者不能从公海领取客户,必须把自已的客户移到公海里,不超过该数量才能新增。
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/dataauth/disk_admin.html b/app/home/view/dataauth/disk_admin.html new file mode 100644 index 0000000..398c844 --- /dev/null +++ b/app/home/view/dataauth/disk_admin.html @@ -0,0 +1,60 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          模块配置及数据权限配置

          + + + + + + + + + + + + + + + + +
          +

          模块使用说明:

          +

          {$detail.desc}

          +
          权限名称 + + {$detail.title} + 权限标识{$detail.name}
          知识网盘数据管理员 + + + 权限标识conf_1
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/dataauth/finance_admin.html b/app/home/view/dataauth/finance_admin.html new file mode 100644 index 0000000..110ec7e --- /dev/null +++ b/app/home/view/dataauth/finance_admin.html @@ -0,0 +1,115 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          模块配置及数据权限配置

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +

          模块使用说明:

          +

          {$detail.desc}

          +
          权限名称 + + {$detail.title} + 权限标识{$detail.name}
          报销管理员 + + + 权限标识conf_1
          发票管理员 + + + 权限标识conf_2
          回款管理员 + + + 权限标识conf_3
          付款管理员 + + + 权限标识conf_4
          借支管理员 + + + 权限标识conf_5
          借支编号自动生成 + + + 权限标识conf_9
          报销编号自动生成 + + + 权限标识conf_10
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/dataauth/index.html b/app/home/view/dataauth/index.html new file mode 100644 index 0000000..4f1973e --- /dev/null +++ b/app/home/view/dataauth/index.html @@ -0,0 +1,72 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/dataauth/office_admin.html b/app/home/view/dataauth/office_admin.html new file mode 100644 index 0000000..ceee194 --- /dev/null +++ b/app/home/view/dataauth/office_admin.html @@ -0,0 +1,80 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          模块配置及数据权限配置

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +

          模块使用说明:

          +

          {$detail.desc}

          +
          权限名称 + + {$detail.title} + 权限标识{$detail.name}
          日常办公数据管理员 + + + 权限标识conf_1
          工作记录工时调整、删除权限设置 + + + + + 权限标识conf_2
          人事管理员 + + + 权限标识conf_3
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/dataauth/project_admin.html b/app/home/view/dataauth/project_admin.html new file mode 100644 index 0000000..2987731 --- /dev/null +++ b/app/home/view/dataauth/project_admin.html @@ -0,0 +1,66 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +

          模块配置及数据权限配置

          + + + + + + + + + + + + + + + + + + + + + + +
          +

          模块使用说明:

          +

          {$detail.desc}

          +
          权限名称 + + {$detail.title} + 权限标识{$detail.name}
          项目管理员 + + + 权限标识conf_1
          项目任务到期
          前N天提醒
          权限标识conf_10
          +
          + + +
          +
          +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/database/backuplist.html b/app/home/view/database/backuplist.html new file mode 100644 index 0000000..59641d0 --- /dev/null +++ b/app/home/view/database/backuplist.html @@ -0,0 +1,152 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +

          数据还原

          +
          + + + + + + + + + + {empty name="list"} + + + + {/empty} + {volist name="list" id="vo" key="k"} + + + + + + + + + {for start="0" end="$vo.data.part" step="1"} + + + + + {/for} + {/volist} +
          文件名称文件格式分隔符文件总大小分卷总数操作
          暂无备份数据
          备份时间:{$vo.time}{if $vo.timespan == $lock_time}该备份不是完整备份,请删除重新备份{/if}.sql{$vo.data.compress}{:format_bytes($vo.data.size)}{$vo.data.part} +
          + {if $vo.timespan == $lock_time} + 清除不完整的备份 + {else/} + 数据还原 + 删除备份 + {/if} +
          +
          + {:date("Ymd",$vo.timespan)}{$vo.data.compress}{:date("His",$vo.timespan)}{$vo.data.compress}{$i+1}.sql + + 下载备份(分卷{$i+1}) +
          +
          + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/database/database.html b/app/home/view/database/database.html new file mode 100644 index 0000000..db0389d --- /dev/null +++ b/app/home/view/database/database.html @@ -0,0 +1,201 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
          +
          +
          + +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/files/index.html b/app/home/view/files/index.html new file mode 100644 index 0000000..51c9b8c --- /dev/null +++ b/app/home/view/files/index.html @@ -0,0 +1,468 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
          +
          +
          +
          +
            +
          • 全部
          • +
          • 图片
          • +
          • 视频
          • +
          • 音频
          • +
          • 文档
          • +
          • 压缩包
          • +
          +
          +
          +
          + +
          +
            +
          • 全部
          • +
          • 未分组
          • +
          + +
          + +
          + +
          +
          +
          + 上传文件 + 批量删除 + 移动至 + +
          + + +
          +
          + +
          +
            +
            + + +
            +
            +
            +
            + +{/block} + +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/index/contacts_book.html b/app/home/view/index/contacts_book.html new file mode 100644 index 0000000..8084862 --- /dev/null +++ b/app/home/view/index/contacts_book.html @@ -0,0 +1,131 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +
            +

            企业通讯录

            +
            +
            +
            +
            +
            + +
            +
            + + +
            +
            +
            +
            +
            + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/index/edit_password.html b/app/home/view/index/edit_password.html new file mode 100644 index 0000000..a6af350 --- /dev/null +++ b/app/home/view/index/edit_password.html @@ -0,0 +1,74 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            + {notempty name="$admin.reg_pwd"} +
            初始化密码才能正常使用系统
            + {/notempty} +

            重置密码

            + + + + + + + + + + + + + +
            旧密码* + + 用户名{$admin.username}
            新密码* + + 确认新密码* + +
            +
            + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/index/edit_personal.html b/app/home/view/index/edit_personal.html new file mode 100644 index 0000000..9dbce6c --- /dev/null +++ b/app/home/view/index/edit_personal.html @@ -0,0 +1,108 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
            +

            修改个人信息

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            用户名{$admin.username}姓名{$admin.name}头像 +
            + +
            + + +
            +
            +
            手机号码{$admin.mobile}性别 + + +
            所在部门{$admin.department}岗位职称{$admin.position}
            员工类型 + {eq name="$admin.type" value="3"}实 习 生{/eq} + {eq name="$admin.type" value="2"}试用员工{/eq} + {eq name="$admin.type" value="1"}正式员工{/eq} + 入职日期 + {$admin.entry_time | date='Y-m-d'} +
            个人简介 + +
            +
            + + +
            +
            +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/index/index.html b/app/home/view/index/index.html new file mode 100644 index 0000000..d5f6ef5 --- /dev/null +++ b/app/home/view/index/index.html @@ -0,0 +1,267 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
            +
            +
            +
            + +
            + + + + + + + + + + + + +
            + + +
            + + + {empty name="$system.menu_mode"} + {include file="/index/menu_classical" /} + {else/} + {if ($system.menu_mode == 'expand') } + {include file="/index/menu_expand" /} + {else/} + {include file="/index/menu_classical" /} + {/if} + {/empty} + +
            +
            +
            +
            + +
            +
            +
              +
            • +
            +
            +
            + + +
            +
            + +
            +
            + +
            + + +
            +
            +
            + +{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/index/layout_action.html b/app/home/view/index/layout_action.html new file mode 100644 index 0000000..6007ec2 --- /dev/null +++ b/app/home/view/index/layout_action.html @@ -0,0 +1,37 @@ +
            +
            +
            +
            员工动态更多
            +
            +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_approve.html b/app/home/view/index/layout_approve.html new file mode 100644 index 0000000..a3e73e4 --- /dev/null +++ b/app/home/view/index/layout_approve.html @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/app/home/view/index/layout_chartview.html b/app/home/view/index/layout_chartview.html new file mode 100644 index 0000000..50c6e9b --- /dev/null +++ b/app/home/view/index/layout_chartview.html @@ -0,0 +1,122 @@ +
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_chartyear.html b/app/home/view/index/layout_chartyear.html new file mode 100644 index 0000000..0e98111 --- /dev/null +++ b/app/home/view/index/layout_chartyear.html @@ -0,0 +1,86 @@ +
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_check.html b/app/home/view/index/layout_check.html new file mode 100644 index 0000000..00e8068 --- /dev/null +++ b/app/home/view/index/layout_check.html @@ -0,0 +1,19 @@ +
              +
              +
              +
              待办事项
              +
              + +
              +
              +
              +
              \ No newline at end of file diff --git a/app/home/view/index/layout_count.html b/app/home/view/index/layout_count.html new file mode 100644 index 0000000..3bfe90b --- /dev/null +++ b/app/home/view/index/layout_count.html @@ -0,0 +1,16 @@ +
              +
              +
              + + + {volist name="$total" id="vo"} + + {/volist} + +
              +
              {$vo.name}
              +
              {$vo.num}
              +
              +
              +
              +
              \ No newline at end of file diff --git a/app/home/view/index/layout_event.html b/app/home/view/index/layout_event.html new file mode 100644 index 0000000..5a65ac1 --- /dev/null +++ b/app/home/view/index/layout_event.html @@ -0,0 +1,39 @@ +
              +
              +
              +
              待办事项
              +
              + +
              +
              +
              +
              + +
              +
              +
              +
              紧急事项
              +
              + +
              +
              +
              +
              \ No newline at end of file diff --git a/app/home/view/index/layout_fastentry.html b/app/home/view/index/layout_fastentry.html new file mode 100644 index 0000000..d9725b6 --- /dev/null +++ b/app/home/view/index/layout_fastentry.html @@ -0,0 +1,72 @@ + + \ No newline at end of file diff --git a/app/home/view/index/layout_links.html b/app/home/view/index/layout_links.html new file mode 100644 index 0000000..004591b --- /dev/null +++ b/app/home/view/index/layout_links.html @@ -0,0 +1,37 @@ +
              +
              +
              +
              办公工具
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_note.html b/app/home/view/index/layout_note.html new file mode 100644 index 0000000..eced9c0 --- /dev/null +++ b/app/home/view/index/layout_note.html @@ -0,0 +1,25 @@ +
              +
              +
              +
              公告列表
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_project.html b/app/home/view/index/layout_project.html new file mode 100644 index 0000000..b3b6133 --- /dev/null +++ b/app/home/view/index/layout_project.html @@ -0,0 +1,33 @@ +
              +
              +
              +
              项目列表
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_ranking.html b/app/home/view/index/layout_ranking.html new file mode 100644 index 0000000..71875c5 --- /dev/null +++ b/app/home/view/index/layout_ranking.html @@ -0,0 +1,62 @@ +
              +
              +
              +
              最活跃员工最近30天前十的活跃度
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_system.html b/app/home/view/index/layout_system.html new file mode 100644 index 0000000..f8c0663 --- /dev/null +++ b/app/home/view/index/layout_system.html @@ -0,0 +1,68 @@ +
              +
              +
              +
              系统信息
              +
              + + {if condition="($install == true)"} + + + + {/if} + + + + + + + + + + + + + {eq name=":get_system_config('system','qrcode')" value="2"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/eq} +
              提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。
              服务器系统{:get_system_info('os')}PHP版本{:get_system_info('php')}
              上传附件限制{:get_system_config('system','upload_max_filesize')}M / {:get_system_info('upload_max_filesize')}执行时间限制{:get_system_info('max_execution_time')}
              勾股OA{:CMS_VERSION}勾股OA文档
              ThinkPHP版本{$TP_VERSION}TP8文档
              Layui版本{:LAYUI_VERSION}Layui文档
              合作联系微信号:hdm588,业务合作、功能定制请备注
              QQ交流群搜Q群:24641076(满),46924914(满),295256660
              或点击 gougucms交流群
              同系列开源软件勾股CMS勾股BLOG勾股DEV勾股ADMIN
              腾讯云服务器,通过我们的代理购买低至 1 折,点击图片了解详情
              + +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/layout_task.html b/app/home/view/index/layout_task.html new file mode 100644 index 0000000..51b55d7 --- /dev/null +++ b/app/home/view/index/layout_task.html @@ -0,0 +1,42 @@ +
              +
              +
              +
              任务列表
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/home/view/index/log_list.html b/app/home/view/index/log_list.html new file mode 100644 index 0000000..e469fa9 --- /dev/null +++ b/app/home/view/index/log_list.html @@ -0,0 +1,88 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +
              +

              员工动态

              + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/index/main.html b/app/home/view/index/main.html new file mode 100644 index 0000000..754b2b8 --- /dev/null +++ b/app/home/view/index/main.html @@ -0,0 +1,226 @@ +{extend name="../../base/view/common/base" /} + +{block name="style"} + +{/block} + +{block name="body"} +
              +
              +
              + {volist name="$layout_selected" id="layout"} + + {if ( $layout.row == 1) AND ( $layout.name == 'count') } + {include file="/index/layout_count" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'event') } + {include file="/index/layout_event" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'note') } + {include file="/index/layout_note" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'project') } + {include file="/index/layout_project" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'task') } + {include file="/index/layout_task" /} + {/if} + + + {if ( $layout.row == 1) AND ( $layout.name == 'chartview') } + {include file="/index/layout_chartview" /} + {/if} + + {if ( $layout.row == 1) AND ( $layout.name == 'chartyear') } + {include file="/index/layout_chartyear" /} + {/if} + + {/volist} +
              +
              + {volist name="$layout_selected" id="layout"} + + {if ( $layout.row == 2) AND ( $layout.name == 'fastentry') } + {include file="/index/layout_fastentry" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'approve') } + {include file="/index/layout_approve" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'links') } + {include file="/index/layout_links" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'system') } + {include file="/index/layout_system" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'ranking') } + {include file="/index/layout_ranking" /} + {/if} + + {if ( $layout.row == 2) AND ( $layout.name == 'action') } + {include file="/index/layout_action" /} + {/if} + + {/volist} +
              +
              +
              +{/block} + + + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/home/view/index/menu_classical.html b/app/home/view/index/menu_classical.html new file mode 100644 index 0000000..4fb74e4 --- /dev/null +++ b/app/home/view/index/menu_classical.html @@ -0,0 +1,47 @@ +
              + + + +
              + \ No newline at end of file diff --git a/app/home/view/index/menu_expand.html b/app/home/view/index/menu_expand.html new file mode 100644 index 0000000..3079cfa --- /dev/null +++ b/app/home/view/index/menu_expand.html @@ -0,0 +1,70 @@ +
              + + +
              + \ No newline at end of file diff --git a/app/home/view/leaves/add.html b/app/home/view/leaves/add.html new file mode 100644 index 0000000..5492c11 --- /dev/null +++ b/app/home/view/leaves/add.html @@ -0,0 +1,93 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              请假

              + + + + + + + + + + + + + + + + + + + + + +
              开始时间*结束时间*
              请假天数*请假类型* + +
              请假事由*
              附件 +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/leaves/datalist.html b/app/home/view/leaves/datalist.html new file mode 100644 index 0000000..0cfd67f --- /dev/null +++ b/app/home/view/leaves/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/leaves/view.html b/app/home/view/leaves/view.html new file mode 100644 index 0000000..349ce06 --- /dev/null +++ b/app/home/view/leaves/view.html @@ -0,0 +1,54 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              请假详情

              + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
              开始时间{$detail.start_date} {$detail.start_span_name}结束时间{$detail.end_date} {$detail.end_span_name}
              请假类型{$detail.types_name}请假天数共{$detail.duration|default=0}天
              请假事由{$detail.reason|default=''}
              相关附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/log/index.html b/app/home/view/log/index.html new file mode 100644 index 0000000..5ac957a --- /dev/null +++ b/app/home/view/log/index.html @@ -0,0 +1,93 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/login/index.html b/app/home/view/login/index.html new file mode 100644 index 0000000..19c9a76 --- /dev/null +++ b/app/home/view/login/index.html @@ -0,0 +1,115 @@ + + + + + + + + {:get_system_config('web','admin_title')} + + + + +
              + + +
              + + + Copyright © 2022-2024 勾股OA - {:CMS_VERSION} ,Powered by GouguOPEN,{:get_system_config('web','icp')} {:get_system_config('web','beian')} + +
              +
              + + + + diff --git a/app/home/view/login/lock.html b/app/home/view/login/lock.html new file mode 100644 index 0000000..7684691 --- /dev/null +++ b/app/home/view/login/lock.html @@ -0,0 +1,99 @@ + + + + + + + + {:get_system_config('web','admin_title')} + + + + +
              +
              + + +
              + + + + diff --git a/app/home/view/login/mbui.html b/app/home/view/login/mbui.html new file mode 100644 index 0000000..e60be6c --- /dev/null +++ b/app/home/view/login/mbui.html @@ -0,0 +1,76 @@ + + + + + + + + {:get_system_config('web','admin_title')} + + + + +
              +
              + + +
              + + + + + diff --git a/app/home/view/message/add.html b/app/home/view/message/add.html new file mode 100644 index 0000000..cb8a889 --- /dev/null +++ b/app/home/view/message/add.html @@ -0,0 +1,207 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              + {if condition="$id eq 0"} +

              新建消息

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              接收人类型 + + + + +
              收件人* + + +
              收件部门* + + +
              收件岗位* + + +
              抄送人 + + +
              消息主题*
              消息内容*
              附件
              +
              + +
              +
              + {else/} +

              编辑消息

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              接收人类型 + + + + +
              收件人* + + +
              收件部门* + + +
              收件岗位* + + +
              抄送人 + + +
              消息主题*
              消息内容* + + {if condition="($detail.msg_id > 0)"} + + + + + + {notempty name="$detail.from_file_array"} + + + + + {/notempty} +
              引用消息内容{$detail.from_content}
              引用消息附件 +
              + {volist name="$detail.from_file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              + {/if} +
              附件
              +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              + {/if} +
              + + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/draft.html b/app/home/view/message/draft.html new file mode 100644 index 0000000..13bcf6d --- /dev/null +++ b/app/home/view/message/draft.html @@ -0,0 +1,162 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + {include file="message/msgmenu" /} +
              +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/inbox.html b/app/home/view/message/inbox.html new file mode 100644 index 0000000..9d7b190 --- /dev/null +++ b/app/home/view/message/inbox.html @@ -0,0 +1,226 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + {include file="message/msgmenu" /} +
              +
              +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/msgmenu.html b/app/home/view/message/msgmenu.html new file mode 100644 index 0000000..c182206 --- /dev/null +++ b/app/home/view/message/msgmenu.html @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/app/home/view/message/read.html b/app/home/view/message/read.html new file mode 100644 index 0000000..8839bae --- /dev/null +++ b/app/home/view/message/read.html @@ -0,0 +1,105 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              消息详情

              + + + + + + + + {eq name="$detail.message_id" value="0"} + + {else/} + + {/eq} + + + + {gt name="$detail.message_id" value="0"} + + + + + + + {notempty name="$message.copy_names"} + + + + + {/notempty} + {/gt} + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
              消息主题{$detail.title|default=''}
              消息类型系统消息个人消息发送时间{$detail.create_time|default=''}
              发件人{$detail.from_uname|default=''}收件人 + {eq name="$message.types" value="1"} + 『同事』{$message.unames|default=''} + {/eq} + {eq name="$message.types" value="2"} + 『部门』{$message.dnames|default=''} + {/eq} + {eq name="$message.types" value="3"} + 『岗位』{$message.pnames|default=''} + {/eq} +
              抄送人{$message.copy_names|default=''}
              消息内容 +
              {$detail.content|default=''}
              + {gt name="$detail.template" value="0"} + {:get_message_link($detail.template,$detail.action_id)} + {/gt} + {if condition="($detail.msg_id > 0)"} + + + + + + {notempty name="$detail.from_file_array"} + + + + + {/notempty} +
              引用消息内容 +
              {$detail.from_content}
              + {gt name="$detail.from_template" value="0"} + {:get_message_link($detail.from_template,$detail.from_action_id)} + {/gt} +
              引用消息附件 +
              + {volist name="$detail.from_file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              + {/if} +
              消息附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/reply.html b/app/home/view/message/reply.html new file mode 100644 index 0000000..658365e --- /dev/null +++ b/app/home/view/message/reply.html @@ -0,0 +1,138 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              回复消息

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              接收人类型 + + + + +
              收件人* + + +
              收件部门* + + +
              收件岗位* + + +
              抄送人 + + +
              消息主题*
              消息内容* + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
              回复消息内容
              {$detail.content|default=''}
              回复消息附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              附件
              +
              + +
              +
              +
              + + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/resend.html b/app/home/view/message/resend.html new file mode 100644 index 0000000..1aad42b --- /dev/null +++ b/app/home/view/message/resend.html @@ -0,0 +1,138 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              转发消息

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              接收人类型 + + + + +
              收件人* + + +
              收件部门* + + +
              收件岗位* + + +
              抄送人 + + +
              消息主题*
              消息内容* + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} +
              转发消息内容{$detail.content|default=''}
              转发消息附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              附件
              +
              + +
              +
              +
              + + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/rubbish.html b/app/home/view/message/rubbish.html new file mode 100644 index 0000000..b4ad7c8 --- /dev/null +++ b/app/home/view/message/rubbish.html @@ -0,0 +1,109 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + {include file="message/msgmenu" /} +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/sendbox.html b/app/home/view/message/sendbox.html new file mode 100644 index 0000000..a11ec50 --- /dev/null +++ b/app/home/view/message/sendbox.html @@ -0,0 +1,159 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + {include file="message/msgmenu" /} +
              +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/star.html b/app/home/view/message/star.html new file mode 100644 index 0000000..15545af --- /dev/null +++ b/app/home/view/message/star.html @@ -0,0 +1,183 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + {include file="message/msgmenu" /} +
              +
              +
              + +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              + + +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/message/view.html b/app/home/view/message/view.html new file mode 100644 index 0000000..b9e484b --- /dev/null +++ b/app/home/view/message/view.html @@ -0,0 +1,121 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              消息详情

              + + + + + + + + + {eq name="$detail.send_time" value="0"} + + + {else/} + + + {/eq} + + {notempty name="$detail.copy_names"} + + + + + {/notempty} + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + {notempty name="$detail.read_user_names"} + + + + + {/notempty} +
              消息主题{$detail.title|default=''}
              收件人 + {eq name="$detail.types" value="1"} + 『同事』{$detail.unames|default=''} + {/eq} + {eq name="$detail.types" value="2"} + 『部门』{$detail.dnames|default=''} + {/eq} + {eq name="$detail.types" value="3"} + 『岗位』{$detail.pnames|default=''} + {/eq} + 发送状态草稿,未发送发送时间{$detail.send_time|date='Y-m-d H:i:s'}
              抄送人{$detail.copy_names|default=''}
              消息内容 +
              {$detail.content|default=''}
              + {gt name="$detail.template" value="0"} + {:get_message_link($detail.template,$detail.action_id)} + {/gt} + {if condition="($detail.msg_id > 0)"} + + + + + + {notempty name="$detail.from_file_array"} + + + + + {/notempty} +
              引用消息内容 +
              {$detail.from_content}
              + {gt name="$detail.from_template" value="0"} + {:get_message_link($detail.from_template,$detail.from_action_id)} + {/gt} +
              引用消息附件 +
              + {volist name="$detail.from_file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              + {/if} +
              消息附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              已读回执{$detail.read_user_names}
              + {eq name="$detail.send_time" value="0"} +
              + + +
              + {/eq} +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/module/add.html b/app/home/view/module/add.html new file mode 100644 index 0000000..4514c68 --- /dev/null +++ b/app/home/view/module/add.html @@ -0,0 +1,60 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              自定义模块

              + + + + + + + + + + + + + + +
              注意:自定义模块目录不能和已有的模块目录相同,尽量使用个性化的目录,防止后期可能与官网新推出模块的目录相同,引起升级不必要的麻烦。
              模块名称* + + + + + 模块所在目录* + +
              模块描述 + +
              +
              + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/module/index.html b/app/home/view/module/index.html new file mode 100644 index 0000000..53f0246 --- /dev/null +++ b/app/home/view/module/index.html @@ -0,0 +1,153 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              {empty name="$oa_module"}温馨提示:可能是网络或其他原因未能请求到官网的模块数据,但不影响系统的正常使用。{/empty}
              +
              + + + + + + + + + + + {empty name="sys_module"} + + + + {/empty} + {volist name="sys_module" id="vo" key="k"} + + + + + + + {eq name="$vo.status" value="-1"} + + + {/eq} + {eq name="$vo.status" value="0"} + + + {/eq} + {eq name="$vo.status" value="1"} + + + {/eq} + + {/volist} +
              模块名称模块所在目录功能描述类型开发者状态操作
              暂无数据
              {$vo.title}app/{$vo.name}{$vo.desc} + {eq name="$vo.type" value="1"}系统模块{/eq} + {eq name="$vo.type" value="2"}普通模块{/eq} + {eq name="$vo.type" value="3"}自定义模块{/eq} + + {eq name="$vo.sourse" value="1"}勾股OA{/eq} + {eq name="$vo.sourse" value="2"}第三方{/eq} + + 未安装 + +
              + {eq name = "$vo.is_file" value="0"} + 下载 + {/eq} + {eq name = "$vo.is_file" value="1"} + 安装 + {/eq} + 演示 +
              +
              + 已卸载 + +
              + {eq name="$vo.sourse" value="2"}编辑{/eq} + 恢复 +
              +
              + 正常 + + {eq name="$vo.type" value="3"} +
              + 编辑 + 删除 +
              + {else/} + - + {/eq} +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/outs/add.html b/app/home/view/outs/add.html new file mode 100644 index 0000000..219460f --- /dev/null +++ b/app/home/view/outs/add.html @@ -0,0 +1,144 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              外出

              + + + + + + + + + + + + + + + + + +
              开始时间*结束时间*外出天数*
              外出事由* + +
              附件 +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/outs/datalist.html b/app/home/view/outs/datalist.html new file mode 100644 index 0000000..0cfd67f --- /dev/null +++ b/app/home/view/outs/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/outs/view.html b/app/home/view/outs/view.html new file mode 100644 index 0000000..df6e146 --- /dev/null +++ b/app/home/view/outs/view.html @@ -0,0 +1,50 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              外出详情

              + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
              开始时间{$detail.start_date}结束时间{$detail.end_date}外出天数共{$detail.duration|default=0}天
              外出事由{$detail.reason|default=''}
              相关附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/overtimes/add.html b/app/home/view/overtimes/add.html new file mode 100644 index 0000000..a96d1f5 --- /dev/null +++ b/app/home/view/overtimes/add.html @@ -0,0 +1,80 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              加班

              + + + + + + + + + + + + + + + + + +
              开始时间*结束时间*加班时长*
              加班事由* + +
              附件 +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/overtimes/datalist.html b/app/home/view/overtimes/datalist.html new file mode 100644 index 0000000..0cfd67f --- /dev/null +++ b/app/home/view/overtimes/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/overtimes/view.html b/app/home/view/overtimes/view.html new file mode 100644 index 0000000..6ceeee0 --- /dev/null +++ b/app/home/view/overtimes/view.html @@ -0,0 +1,50 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              加班详情

              + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
              开始时间{$detail.start_date}结束时间{$detail.end_date}加班时长共{$detail.duration|default=0}小时
              加班事由{$detail.reason|default=''}
              相关附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/role/add.html b/app/home/view/role/add.html new file mode 100644 index 0000000..9ce7b35 --- /dev/null +++ b/app/home/view/role/add.html @@ -0,0 +1,178 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +
              +

              权限组

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              权限组名称* + + + + 状态* + + {if condition="$id eq 0"} + + + {else/} + + + {/if} +
              权限配置说明*注意:如果右侧子级权限有节点被勾选了,左侧的顶级权限就必须勾选,否则无法查看右侧的子级菜单。
              + + + + + + {volist name="role_rule" id="vo"} + + + {gt name="vo.len" value="0"} + + {/gt} + + {/volist} +
              选择可操作的顶级权限 ↓选择可操作的子级权限 ↓
              + + +
              + {volist name="vo.children" key="k" id="voo"} +
              + +
              + {gt name="voo.len" value="0"} +
              + {volist name="voo.children" id="vooo"} +
              + +
              + {gt name="vooo.len" value="0"} +
              + {volist name="vooo.children" id="voooo"} +
              + +
              + {/volist} +
              + {/gt} + {/volist} +
              + {/gt} + {/volist} +
              +
              +
              PC工作台展示模块 + {volist name="layout" id="vo"} +
              + +
              + {/volist} +
              手机工作台展示模块 + {volist name="mobile_menu" id="v"} +
              +
              {$v.title}
              +
              + {volist name="v.list" id="vo"} +
              + +
              + {/volist} +
              +
              + {/volist} +
              手机底部Bar菜单 +

              建议勾选5个,页面效果展示效果最佳

              + {volist name="mobile_bar" id="vo"} +
              + +
              + {/volist} +
              备注内容 + +
              +
              + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/role/index.html b/app/home/view/role/index.html new file mode 100644 index 0000000..87b12bd --- /dev/null +++ b/app/home/view/role/index.html @@ -0,0 +1,77 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/rule/add.html b/app/home/view/rule/add.html new file mode 100644 index 0000000..a6481e8 --- /dev/null +++ b/app/home/view/rule/add.html @@ -0,0 +1,204 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              功能菜单/节点

              + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              父级菜单/节点* + + + 所属功能模块* + +
              菜单/节点名称* + + + 操作日志名称* + + +
              菜单/节点URL + + 菜单排序 + +
              左侧菜单显示* + + + 菜单图标 + + 如:icon-jichupeizhi[查看图标] +
              + 注意: +

              1、作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。

              +

              2、节点URL的具体规则:“模块/控制器/方法”,模块只能是小写字母,控制器只能是小写字母,方法可以是小写字母,中间可以有"_",示例如下:

              +

              『正确』user/rewardscate/datalist

              +

              『正确』user/rewardscate/data_list

              +

              『错误』user_a/rewardscate/datalist

              +

              『错误』user/rewards_cate/datalist

              +
              + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              父级菜单/节点* + + + 所属功能模块* + +
              菜单/节点名称* + + + 操作日志名称* + + +
              菜单/节点URL + + 菜单排序 + +
              左侧菜单显示* + + + 菜单图标 + + [查看图标] +
              + 注意: +

              1、作为菜单显示类型时最多展示三级菜单,所以父级菜单/节点选项最大只能选择到2级,非菜单显示类型无限制;一级菜单需要填写菜单图标。

              +

              2、节点URL的具体格式及规则:“模块/控制器/方法”,模块只能是小写字母,控制器只能是小写字母,方法可以是小写字母,中间可以有"_",示例如下:

              +

              『正确』user/rewardscate/datalist

              +

              『正确』user/rewardscate/data_list

              +

              『错误』user_a/rewardscate/datalist

              +

              『错误』user/rewards_cate/datalist

              +
              + {/if} +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/rule/index.html b/app/home/view/rule/index.html new file mode 100644 index 0000000..a7069a4 --- /dev/null +++ b/app/home/view/rule/index.html @@ -0,0 +1,96 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              + +
              +
              +
              +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/task/add.html b/app/home/view/task/add.html new file mode 100644 index 0000000..cfe88f2 --- /dev/null +++ b/app/home/view/task/add.html @@ -0,0 +1,58 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              定时任务

              + + + + + + + + + + + + + + +
              注意:定时任务目前只是记录,具体需要技术人员自行在系统服务器添加定时任务计划。
              任务名称* + + + + 任务访问链接* + +
              任务描述 + +
              +
              + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/task/index.html b/app/home/view/task/index.html new file mode 100644 index 0000000..68d2f43 --- /dev/null +++ b/app/home/view/task/index.html @@ -0,0 +1,110 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/template/add.html b/app/home/view/template/add.html new file mode 100644 index 0000000..eb9defd --- /dev/null +++ b/app/home/view/template/add.html @@ -0,0 +1,131 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              消息模板

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              模板名称*模板标识*
              消息类型* + {empty name="$detail"} + + {else/} + + {/empty} + 消息链接*
              审批中的
              消息模板标题*
              审批中的
              消息模板内容*
              审批通过的
              消息模板标题*
              审批通过的
              消息模板内容*
              审批拒绝的
              消息模板标题*
              审批拒绝的
              消息模板内容*
              通过抄送人的
              消息模板标题*
              通过抄送人的
              消息模板内容*
              +
              + {eq name="$copyid" value="0"} + + {else/} + + {/eq} + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/template/datalist.html b/app/home/view/template/datalist.html new file mode 100644 index 0000000..8b269fd --- /dev/null +++ b/app/home/view/template/datalist.html @@ -0,0 +1,120 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/template/view.html b/app/home/view/template/view.html new file mode 100644 index 0000000..451bd24 --- /dev/null +++ b/app/home/view/template/view.html @@ -0,0 +1,67 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              消息模板详情

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              模板名称{$detail.title|default=''}模板标识{$detail.name|default=''}
              消息类型 + {eq name="$detail.types" value="1"}普通消息{/eq} + {eq name="$detail.types" value="2"}审批消息{/eq} + 消息链接{$detail.msg_link|default=''}
              审批中的
              消息模板标题
              {$detail.msg_title_0|default=''}
              审批中的
              消息模板内容
              {$detail.msg_content_0|default=''}
              审批通过的
              消息模板标题
              {$detail.msg_title_1|default=''}
              审批通过的
              消息模板内容
              {$detail.msg_content_1|default=''}
              审批拒绝的
              消息模板标题
              {$detail.msg_title_2|default=''}
              审批拒绝的
              消息模板内容
              {$detail.msg_content_2|default=''}
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/trips/add.html b/app/home/view/trips/add.html new file mode 100644 index 0000000..7a32619 --- /dev/null +++ b/app/home/view/trips/add.html @@ -0,0 +1,79 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              出差

              + + + + + + + + + + + + + + + + + +
              开始时间*结束时间*出差天数*
              出差事由* + +
              附件 +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              +
              + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/trips/datalist.html b/app/home/view/trips/datalist.html new file mode 100644 index 0000000..0cfd67f --- /dev/null +++ b/app/home/view/trips/datalist.html @@ -0,0 +1,86 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/home/view/trips/view.html b/app/home/view/trips/view.html new file mode 100644 index 0000000..467c020 --- /dev/null +++ b/app/home/view/trips/view.html @@ -0,0 +1,50 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              出差详情

              + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
              开始时间{$detail.start_date}结束时间{$detail.end_date}出差天数共{$detail.duration|default=0}天
              出差事由{$detail.reason|default=''}
              相关附件
              +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/listener/SendMessage.php b/app/listener/SendMessage.php new file mode 100644 index 0000000..9618143 --- /dev/null +++ b/app/listener/SendMessage.php @@ -0,0 +1,133 @@ +where('id',$msg['template_id'])->find(); + } + else{ + $template = Db::name('Template')->where('name',$msg['template_id'])->find(); + } + if(empty($template)){ + return true; + } + if(empty($msg['template_field'])){ + $msg['template_field'] = 0; + } + $title_field = 'msg_title_'.$msg['template_field']; + $content_field = 'msg_content_'.$msg['template_field']; + $title = $template[$title_field]; + $content = $template[$content_field]; + $msg_link = $template['msg_link']; + $data = $msg['content']; + $data['from_user'] = Db::name('Admin')->where('id',$msg['from_uid'])->value('name'); + $data['date'] = date('Y-m-d'); + if(!isset($data['action_id'])){ + $data['action_id'] = 0; + } + foreach ($data as $key => $val) { + $title = str_replace('{' . $key . '}', $val, $title); + $content = str_replace('{' . $key . '}', $val, $content); + } + $wxmsg_link =''; + if(!empty($msg_link)){ + $wxmsg_link = str_replace('{action_id}', $data['action_id'], $msg_link); + } + if (!is_array($msg['to_uids'])) { + $users = explode(",", strval($msg['to_uids'])); + } else { + $users = $msg['to_uids']; + } + $users = array_unique(array_filter($users)); + //组合要发的消息 + $send_data = []; + foreach ($users as $key => $value) { + $send_data[] = array( + 'to_uid' => $value,//接收人 + 'action_id' => $data['action_id'], + 'title' => $title, + 'content' => $content, + 'template' => $template['id'], + 'create_time' => time() + ); + } + $res = Db::name('Msg')->strict(false)->field(true)->insertAll($send_data); + $this->qiyeMessage($users,$title,$content,$wxmsg_link); + } catch (\Exception $e) { + // 处理异常,记录日志或者其他逻辑 + // 但不要抛出异常,以免中断主程序流程 + } + } + + + //获取access_token + function get_access_token($corpid,$corpsecret) + { + $url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpid&corpsecret=$corpsecret"; + $ch=curl_init(); + curl_setopt($ch,CURLOPT_URL,$url); + curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); + curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); + curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); + + $output=curl_exec($ch); + + curl_close($ch); + $jsoninfo = json_decode($output,true); + return $jsoninfo["access_token"]; + } + + function qiyeMessage($users,$title,$content,$msg_link) + { + $workchat = get_config('workchat'); + if($workchat['workweixin']==false){ + return false; + } + $userid = Db::name('Admin')->where([['id','in',$users],['userid','<>','']])->column('userid'); + if (empty($userid)) { + return false; + } + $users = implode('|' ,$userid); + $corpid=$workchat['corpid']; + $corpsecret=$workchat['corpsecret']; + $agentid=$workchat['agentid']; + $host=$workchat['host']; + //$message_array =['title'=>$title,'tips'=>$content,'url'=>$msg_link]; + //获取access_token + $accesstoken=$this->get_access_token($corpid,$corpsecret); + $url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$accesstoken"; + $time_str = date('Y年m月d日 H:i:s',time()); + $data = array( + 'touser' => $users, + 'agentid' => $agentid, + 'msgtype' => 'textcard', + "textcard" => array( + "title" => $title, + "description" => "
              ".$time_str."
              ".$content."
              点击【详情】可查看详细内容。
              ", + "url" => $host.$msg_link, + "btntxt"=>"详情" + ) + ); + $res=curl_post($url,json_encode($data)); + $ret= json_decode($res,true); + $errcode = $ret['errcode']; + if ($errcode == 0) { + return true; + } else { + return false; + //echo '消息发送失败,错误码:' . $errcode; + } + } +} \ No newline at end of file diff --git a/app/middleware.php b/app/middleware.php new file mode 100644 index 0000000..fa0f62e --- /dev/null +++ b/app/middleware.php @@ -0,0 +1,10 @@ + ++----------------------------------------------------------------------------------------------- +*/ +/** +====================== + *模块数据获取公共文件 +====================== + */ +use think\facade\Db; \ No newline at end of file diff --git a/app/mobile/controller/Bar.php b/app/mobile/controller/Bar.php new file mode 100644 index 0000000..0976be5 --- /dev/null +++ b/app/mobile/controller/Bar.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\mobile\controller; + +use app\base\BaseController; +use app\mobile\model\MobileBar as MobileBarModel; +use app\mobile\validate\BarValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Bar extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new MobileBarModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(BarValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(BarValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/mobile/controller/Menu.php b/app/mobile/controller/Menu.php new file mode 100644 index 0000000..9976e99 --- /dev/null +++ b/app/mobile/controller/Menu.php @@ -0,0 +1,144 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\mobile\controller; + +use app\base\BaseController; +use app\mobile\model\MobileMenu as MobileMenuModel; +use app\mobile\validate\MenuValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Menu extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new MobileMenuModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + foreach ($list as $key => &$val) { + $val['types_title'] = Db::name('MobileTypes')->where(['id' => $val['types']])->value('title'); + } + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(MenuValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(MenuValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/mobile/controller/Types.php b/app/mobile/controller/Types.php new file mode 100644 index 0000000..4329357 --- /dev/null +++ b/app/mobile/controller/Types.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\mobile\controller; + +use app\base\BaseController; +use app\mobile\model\MobileTypes as MobileTypesModel; +use app\mobile\validate\TypesValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Types extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new MobileTypesModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(TypesValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(TypesValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/mobile/event.php b/app/mobile/event.php new file mode 100644 index 0000000..afe5918 --- /dev/null +++ b/app/mobile/event.php @@ -0,0 +1,8 @@ + [ + //注册监听类 + 'SendMessage' => ['app\listener\SendMessage'], + ], + //'subscribe' => ['app\subscribe\Message'], +]; diff --git a/app/mobile/middleware.php b/app/mobile/middleware.php new file mode 100644 index 0000000..a500c6f --- /dev/null +++ b/app/mobile/middleware.php @@ -0,0 +1,8 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\mobile\model; +use think\model; +use think\facade\Db; +class MobileBar extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + })->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + //自动为系统超级管理员角色组分配新增的节点 + $group = Db::name('AdminGroup')->find(1); + if (!empty($group)) { + $newGroup['id'] = 1; + $newGroup['mobile_bar'] = $group['mobile_bar'] . ',' . $insertId; + Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup); + } + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + clear_cache('MobileRules'); + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + clear_cache('MobileRules'); + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + clear_cache('MobileRules'); + return to_assign(); + } +} + diff --git a/app/mobile/model/MobileMenu.php b/app/mobile/model/MobileMenu.php new file mode 100644 index 0000000..61feb67 --- /dev/null +++ b/app/mobile/model/MobileMenu.php @@ -0,0 +1,128 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\mobile\model; +use think\model; +use think\facade\Db; +class MobileMenu extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + })->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->types_title = Db::name('MobileTypes')->where(['id' => $item->types])->value('title'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + //自动为系统超级管理员角色组分配新增的节点 + $group = Db::name('AdminGroup')->find(1); + if (!empty($group)) { + $newGroup['id'] = 1; + $newGroup['mobile_menu'] = $group['mobile_menu'] . ',' . $insertId; + Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup); + } + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + clear_cache('MobileRules'); + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + clear_cache('MobileRules'); + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + clear_cache('MobileRules'); + return to_assign(); + } +} + diff --git a/app/mobile/model/MobileTypes.php b/app/mobile/model/MobileTypes.php new file mode 100644 index 0000000..958087f --- /dev/null +++ b/app/mobile/model/MobileTypes.php @@ -0,0 +1,124 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\mobile\model; +use think\model; +use think\facade\Db; +class MobileTypes extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + })->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + //自动为系统超级管理员角色组分配新增的节点 + $group = Db::name('AdminGroup')->find(1); + if (!empty($group)) { + $newGroup['id'] = 1; + $newGroup['mobile_menu'] = $group['mobile_menu'] . ',' . $insertId; + Db::name('AdminGroup')->strict(false)->field(true)->update($newGroup); + } + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + clear_cache('MobileRules'); + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + clear_cache('MobileRules'); + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + clear_cache('MobileRules'); + return to_assign(); + } +} + diff --git a/app/mobile/validate/BarValidate.php b/app/mobile/validate/BarValidate.php new file mode 100644 index 0000000..a27edc3 --- /dev/null +++ b/app/mobile/validate/BarValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\mobile\validate; +use think\Validate; +use think\facade\Db; + +class BarValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('MobileBar')->where([['title','=',$data['title']],['id','<>',$id]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/mobile/validate/MenuValidate.php b/app/mobile/validate/MenuValidate.php new file mode 100644 index 0000000..b8a6dd0 --- /dev/null +++ b/app/mobile/validate/MenuValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\mobile\validate; +use think\Validate; +use think\facade\Db; + +class MenuValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('MobileMenu')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/mobile/validate/TypesValidate.php b/app/mobile/validate/TypesValidate.php new file mode 100644 index 0000000..44bb31f --- /dev/null +++ b/app/mobile/validate/TypesValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\mobile\validate; +use think\Validate; +use think\facade\Db; + +class TypesValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('MobileTypes')->where([['title','=',$data['title']],['id','<>',$id]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/mobile/view/bar/add.html b/app/mobile/view/bar/add.html new file mode 100644 index 0000000..7a0d431 --- /dev/null +++ b/app/mobile/view/bar/add.html @@ -0,0 +1,53 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              Bar菜单

              + + + + + + + + + + + + + +
              菜单名称*排序
              菜单URL*菜单图标* + + [查看图标] +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/mobile/view/bar/datalist.html b/app/mobile/view/bar/datalist.html new file mode 100644 index 0000000..8165c1c --- /dev/null +++ b/app/mobile/view/bar/datalist.html @@ -0,0 +1,110 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/mobile/view/menu/add.html b/app/mobile/view/menu/add.html new file mode 100644 index 0000000..b517a99 --- /dev/null +++ b/app/mobile/view/menu/add.html @@ -0,0 +1,97 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              工作台菜单

              + + + + + + + + + + + + + + + + + +
              菜单名称*所属类型* + {empty name="$detail"} + + {else/} + + {/empty} + 排序
              菜单URL*背景色* + {empty name="$detail"} + + {else/} + + {/empty} + 菜单图标* + + [查看图标] +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/mobile/view/menu/datalist.html b/app/mobile/view/menu/datalist.html new file mode 100644 index 0000000..b6b38f9 --- /dev/null +++ b/app/mobile/view/menu/datalist.html @@ -0,0 +1,125 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/mobile/view/types/add.html b/app/mobile/view/types/add.html new file mode 100644 index 0000000..0b14d19 --- /dev/null +++ b/app/mobile/view/types/add.html @@ -0,0 +1,44 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              工作台菜单类型

              + + + + + + + +
              类型名称*排序
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/mobile/view/types/datalist.html b/app/mobile/view/types/datalist.html new file mode 100644 index 0000000..1fe7b33 --- /dev/null +++ b/app/mobile/view/types/datalist.html @@ -0,0 +1,105 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/common.php b/app/oa/common.php new file mode 100644 index 0000000..31d13eb --- /dev/null +++ b/app/oa/common.php @@ -0,0 +1,49 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +use think\facade\Db; + +//读取职位 +function get_position() +{ + $position = Db::name('Position')->where(['status' => 1])->select()->toArray(); + return $position; +} + +//读取印章类型 +function oa_seal_cate() +{ + $list = Db::name('SealCate')->where(['status' => 1])->select()->toArray(); + return $list; +} + +//读取会议室 +function oa_meeting_cate() +{ + $list = Db::name('MeetingCate')->where(['status' => 1])->select()->toArray(); + return $list; +} + +//读取车辆类型 +function oa_car_cate() +{ + $list = Db::name('CarCate')->where(['status' => 1])->select()->toArray(); + return $list; +} + +//读取费用类型 +function oa_cost_cate() +{ + $list = Db::name('CostCate')->where(['status' => 1])->select()->toArray(); + return $list; +} diff --git a/app/oa/controller/Api.php b/app/oa/controller/Api.php new file mode 100644 index 0000000..bffae35 --- /dev/null +++ b/app/oa/controller/Api.php @@ -0,0 +1,117 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\oa\controller; + +use app\api\BaseController; +use app\oa\model\Schedule; +use think\facade\Db; +use think\facade\View; + +class Api extends BaseController +{ + //获取工作日志列表 + public function get_schedule() + { + $param = get_params(); + $project_id = isset($param['project_id']) ? $param['project_id'] : 0; + $task_id = isset($param['task_id']) ? $param['task_id'] : 0; + if ($project_id>0) { + $task_ids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $project_id])->column('id'); + $where[] = ['a.tid', 'in', $task_ids]; + } + if ($task_id>0) { + $where[] = ['a.tid', '=', $task_id]; + } + $where[] = ['a.delete_time', '=', 0]; + $model = new Schedule(); + $list = $model->datalist($param,$where); + return table_assign(0, '', $list); + } + + //调整工时 + public function update_schedule() + { + $param = get_params(); + $is_leader = isLeader($this->uid); + $role_auth = isAuth($this->uid,'office_admin','conf_1'); + $hour_auth = valueAuth('office_admin','conf_2'); + $edit_role = false; + if($hour_auth==4 && $role_auth > 0){ + $edit_role = true; + } + if($hour_auth==3 && $is_leader > 0){ + $edit_role = true; + } + if($hour_auth==2){ + $admin_id = Db::name('Schedule')->where('id',$param['id'])->value('admin_id'); + if($admin_id == $this->uid){ + $edit_role = true; + } + } + if($edit_role == false){ + return to_assign(1, "您无权限编辑"); + } + + if (isset($param['start_time_a'])) { + $param['start_time'] = strtotime($param['start_time_a'] . '' . $param['start_time_b']); + } + if (isset($param['end_time_a'])) { + $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']); + } + if($param['start_time']>time()){ + return to_assign(1, "开始时间不能大于当前时间"); + } + if ($param['end_time'] <= $param['start_time']) { + return to_assign(1, "结束时间需要大于开始时间"); + } + $where1[] = ['delete_time', '=', 0]; + $where1[] = ['id', '<>', $param['id']]; + $where1[] = ['admin_id', '=', $param['admin_id']]; + $where1[] = ['start_time', 'between', [$param['start_time'], $param['end_time'] - 1]]; + + $where2[] = ['delete_time', '=', 0]; + $where2[] = ['id', '<>', $param['id']]; + $where2[] = ['admin_id', '=', $param['admin_id']]; + $where2[] = ['start_time', '<=', $param['start_time']]; + $where2[] = ['start_time', '>=', $param['end_time']]; + + $where3[] = ['delete_time', '=', 0]; + $where3[] = ['id', '<>', $param['id']]; + $where3[] = ['admin_id', '=', $param['admin_id']]; + $where3[] = ['end_time', 'between', [$param['start_time'] + 1, $param['end_time']]]; + + $record = Db::name('Schedule') + ->where(function ($query) use ($where1) { + $query->where($where1); + }) + ->whereOr(function ($query) use ($where2) { + $query->where($where2); + }) + ->whereOr(function ($query) use ($where3) { + $query->where($where3); + }) + ->count(); + if ($record > 0) { + return to_assign(1, "您所选的时间区间已有工作记录,请重新选时间"); + } + $param['labor_time'] = ($param['end_time'] - $param['start_time']) / 3600; + $res = Db::name('Schedule')->strict(false)->field(true)->update($param); + if ($res !== false) { + return to_assign(0, "操作成功"); + add_log('edit', $param['id'], $param); + } else { + return to_assign(1, "操作失败"); + } + } +} diff --git a/app/oa/controller/Meeting.php b/app/oa/controller/Meeting.php new file mode 100644 index 0000000..2b657ad --- /dev/null +++ b/app/oa/controller/Meeting.php @@ -0,0 +1,75 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\oa\controller; + +use app\base\BaseController; +use app\adm\model\MeetingRecords as MeetingRecordsModel; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Meeting extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new MeetingRecordsModel(); + } + + //会议纪要 + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + $whereOr = []; + $uid = $this->uid; + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['anchor_id'])) { + $where[] = ['anchor_id', '=', $param['anchor_id']]; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['meeting_date', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + $where[] = ['delete_time', '=', 0]; + $whereOr[] = ['recorder_id|anchor_id','=',$uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',join_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',sign_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',share_uids)")]; + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //查看会议纪要 + public function view($id) + { + View::assign('detail', $this->model->getById($id)); + if(is_mobile()){ + return view('qiye@/index/meeting_view'); + } + return view(); + } +} diff --git a/app/oa/controller/News.php b/app/oa/controller/News.php new file mode 100644 index 0000000..63130a0 --- /dev/null +++ b/app/oa/controller/News.php @@ -0,0 +1,80 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\oa\controller; + +use app\base\BaseController; +use app\adm\model\News as NewsModel; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class News extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new NewsModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name'); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/index/news_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + +} diff --git a/app/oa/controller/Note.php b/app/oa/controller/Note.php new file mode 100644 index 0000000..a8439cb --- /dev/null +++ b/app/oa/controller/Note.php @@ -0,0 +1,81 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\oa\controller; + +use app\base\BaseController; +use app\adm\model\Note as NoteModel; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Note extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new NoteModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $where[]=['a.delete_time','=',0]; + $where[]=['a.status','=',1]; + if (!empty($param['keywords'])) { + $where[] = ['a.id|a.title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['cate'] = Db::name('NoteCate')->where(['id' => $detail['cate_id']])->value('title'); + $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name'); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/index/note_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + +} diff --git a/app/oa/controller/Plan.php b/app/oa/controller/Plan.php new file mode 100644 index 0000000..7c658ec --- /dev/null +++ b/app/oa/controller/Plan.php @@ -0,0 +1,236 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\oa\controller; + +use app\base\BaseController; +use app\oa\model\Plan as PlanList; +use schedule\Schedule as ScheduleIndex; +use think\facade\Db; +use think\facade\View; + +class Plan extends BaseController +{ + function datalist() { + if (request()->isAjax()) { + $param = get_params(); + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['a.start_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + + if (!empty($param['keywords'])) { + $where[] = ['a.title', 'like', '%' . trim($param['keywords']) . '%']; + } + if (!empty($param['uid'])) { + $where[] = ['a.admin_id', '=', $param['uid']]; + } else { + $where[] = ['a.admin_id', '=', $this->uid]; + } + if (!empty($param['type'])) { + $where[] = ['a.type', '=', $param['type']]; + } + $where[] = ['a.delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $plan = PlanList::where($where) + ->field('a.*,u.name as create_admin') + ->alias('a') + ->join('admin u', 'u.id = a.admin_id', 'LEFT') + ->order('a.id desc') + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) { + $item->remind_time = empty($item->remind_time) ? '-' : to_date($item->remind_time,'Y-m-d H:i'); + $item->start_time = empty($item->start_time) ? '' : to_date($item->start_time,'Y-m-d H:i'); + $item->end_time = empty($item->end_time) ? '': to_date($item->end_time,'Y-m-d H:i'); + }); + return table_assign(0, '', $plan); + } else { + View::assign('is_leader', isLeader($this->uid)); + return view(); + } + } + + //工作记录 + public function calendar() + { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + if (!empty($param['uid'])) { + $uid = $param['uid']; + } + $where = []; + + $where[] = ['start_time','<=',strtotime($param['end'])]; + $where[] = ['end_time','>=',strtotime($param['start'])]; + $where[] = ['delete_time', '=', 0]; + $where[] = ['admin_id', '=', $uid]; + + $schedule = Db::name('Plan') + ->where($where) + ->field('id,title,type,remind_type,start_time,end_time') + ->select()->toArray(); + $events = []; + $bg_array=['#ECECEC','#FFD3D3','#F6F6C7','#D7EBFF','#CCEBCC','#E9E9CB']; + $border_array=['#CCCCCC','#FF9999','#E8E89B','#99CCFF','#99CC99','#CCCC99']; + foreach ($schedule as $k => $v) { + $v['backgroundColor'] = $bg_array[$v['type']]; + $v['borderColor'] = $border_array[$v['type']]; + $v['title'] = $v['title']; + $v['start'] = date('Y-m-d H:i', $v['start_time']); + $v['end'] = date('Y-m-d H:i', $v['end_time']); + unset($v['start_time']); + unset($v['end_time']); + $events[] = $v; + } + $input_arrays = $events; + $range_start = parseDateTime($param['start']); + $range_end = parseDateTime($param['end']); + $timeZone = null; + if (isset($_GET['timeZone'])) { + $timeZone = new DateTimeZone($_GET['timeZone']); + } + + // Accumulate an output array of event data arrays. + $output_arrays = array(); + foreach ($input_arrays as $array) { + // Convert the input array into a useful Event object + $event = new ScheduleIndex($array, $timeZone); + // If the event is in-bounds, add it to the output + if ($event->isWithinDayRange($range_start, $range_end)) { + $output_arrays[] = $event->toArray(); + } + } + return json($output_arrays); + } else { + View::assign('is_leader', isLeader($this->uid)); + return view(); + } + } + + //保存日志数据 + public function add() + { + $param = get_params(); + $admin_id = $this->uid; + if (isset($param['start_time'])) { + $param['start_time'] = strtotime($param['start_time']); + } + if (isset($param['end_time'])) { + $param['end_time'] = strtotime($param['end_time']); + } + if (isset($param['start_time_a'])) { + $param['start_time'] = strtotime($param['start_time_a'] . '' . $param['start_time_b']); + } + if (isset($param['end_time_a'])) { + $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']); + } + if ($param['end_time'] <= $param['start_time']) { + return to_assign(1, "结束时间需要大于开始时间"); + } + /* + if ($param['start_time'] <= time()) { + return to_assign(1, "开始时间需要大于当前时间"); + } + */ + if (isset($param['remind_type'])) { + if($param['remind_type']==1){ + $param['remind_time'] = $param['start_time']-5*60; + } + if($param['remind_type']==2){ + $param['remind_time'] = $param['start_time']-15*60; + } + if($param['remind_type']==3){ + $param['remind_time'] = $param['start_time']-30*60; + } + if($param['remind_type']==4){ + $param['remind_time'] = $param['start_time']-60*60; + } + if($param['remind_type']==5){ + $param['remind_time'] = $param['start_time']-120*60; + } + if($param['remind_type']==6){ + $param['remind_time'] = $param['start_time']-1440*60; + } + } + if ($param['id'] == 0) { + $param['admin_id'] = $admin_id; + $param['did'] = get_admin($admin_id)['did']; + $param['create_time'] = time(); + $addid = Db::name('Plan')->strict(false)->field(true)->insertGetId($param); + if ($addid > 0) { + add_log('add', $addid, $param); + return to_assign(0, '操作成功'); + } else { + return to_assign(0, '操作失败'); + } + } else { + $param['update_time'] = time(); + $res = Db::name('Plan')->strict(false)->field(true)->update($param); + if ($res !== false) { + add_log('edit', $param['id'], $param); + return to_assign(0, '操作成功'); + } else { + return to_assign(0, '操作失败'); + } + } + } + + //删除工作记录 + public function del() + { + $id = get_params("id"); + $data['id'] = $id; + $data['delete_time'] = time(); + if (Db::name('Plan')->update($data) !== false) { + add_log('delete', $data['id'], $data); + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } + + public function detail() + { + $id = get_params("id"); + $schedule = Db::name('Plan')->where(['id' => $id])->find(); + if (!empty($schedule)) { + $schedule['remind_time'] = $schedule['remind_time'] == 0?'-':date('Y-m-d H:i', $schedule['remind_time']); + $schedule['start_time_a'] = date('Y-m-d', $schedule['start_time']); + $schedule['end_time_a'] = date('Y-m-d', $schedule['end_time']); + $schedule['start_time_b'] = date('H:i', $schedule['start_time']); + $schedule['end_time_b'] = date('H:i', $schedule['end_time']); + $schedule['start_time'] = date('Y-m-d H:i', $schedule['start_time']); + $schedule['end_time'] = date('Y-m-d H:i', $schedule['end_time']); + $schedule['create_time'] = date('Y-m-d H:i:s', $schedule['create_time']); + $schedule['user'] = Db::name('Admin')->where(['id' => $schedule['admin_id']])->value('name'); + } + return $schedule; + } + + //读取日程弹层详情 + public function view() + { + $id = get_params("id"); + $schedule = $this->detail($id); + if (request()->isAjax()) { + return to_assign(0, "", $schedule); + } else { + return $schedule; + } + } + +} diff --git a/app/oa/controller/Schedule.php b/app/oa/controller/Schedule.php new file mode 100644 index 0000000..3942208 --- /dev/null +++ b/app/oa/controller/Schedule.php @@ -0,0 +1,282 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\oa\controller; + +use app\base\BaseController; +use app\oa\model\Schedule as ScheduleModel; +use schedule\Schedule as ScheduleIndex; +use think\facade\Db; +use think\facade\View; + +class Schedule extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ScheduleModel(); + } + + function datalist() { + if (request()->isAjax()) { + $param = get_params(); + $where = []; + $whereOr = []; + $uid= $this->uid; + if (!empty($param['keywords'])) { + $where[] = ['a.title', 'like', '%' . trim($param['keywords']) . '%']; + } + if (!empty($param['labor_type'])) { + $where[] = ['a.labor_type', '=',$param['labor_type']]; + } + if (!empty($param['cid'])) { + $where[] = ['a.cid', '=',$param['cid']]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['a.start_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1].' 23:59:59'))]]; + } + $where[] = ['a.delete_time', '=', 0]; + if (!empty($param['uid'])) { + $where[] = ['a.admin_id', '=', $param['uid']]; + } else { + $whereOr[] = ['a.admin_id', '=', $uid]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['a.did','in',$dids]; + } + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + View::assign('is_leader', isLeader($this->uid)); + View::assign('role_auth', isAuth($this->uid,'office_admin','conf_1')); + View::assign('hour_auth', valueAuth('office_admin','conf_2')); + return view(); + } + } + + //工作记录 + public function calendar() + { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + if (!empty($param['uid'])) { + $uid = $param['uid']; + } + $where = []; + $where[] = ['start_time', '>=', strtotime($param['start'])]; + $where[] = ['end_time', '<=', strtotime($param['end'])]; + $where[] = ['admin_id', '=', $uid]; + $where[] = ['delete_time', '=', 0]; + $schedule = Db::name('Schedule')->where($where)->field('id,title,labor_time,start_time,end_time')->select()->toArray(); + $events = []; + $countEvents = []; + foreach ($schedule as $k => $v) { + $v['backgroundColor'] = '#12bb37'; + $v['borderColor'] = '#12bb37'; + $v['title'] = '[' . $v['labor_time'] . '工时] ' . $v['title']; + $v['start'] = date('Y-m-d H:i', $v['start_time']); + $v['end'] = date('Y-m-d H:i', $v['end_time']); + $temData = date('Y-m-d', $v['start_time']); + if (array_key_exists($temData, $countEvents)) { + $countEvents[$temData]['times'] += $v['labor_time']; + } else { + $countEvents[$temData]['times'] = $v['labor_time']; + $countEvents[$temData]['start'] = date('Y-m-d', $v['start_time']); + } + unset($v['start_time']); + unset($v['end_time']); + $events[] = $v; + } + foreach ($countEvents as $kk => $vv) { + $vv['backgroundColor'] = '#eeeeee'; + $vv['borderColor'] = '#eeeeee'; + $vv['title'] = '【当天总工时:' . $vv['times'] . '】'; + $vv['end'] = $vv['start']; + $vv['id'] = 0; + unset($vv['times']); + $events[] = $vv; + } + $input_arrays = $events; + $range_start = parseDateTime($param['start']); + $range_end = parseDateTime($param['end']); + $timeZone = null; + if (isset($_GET['timeZone'])) { + $timeZone = new DateTimeZone($_GET['timeZone']); + } + + // Accumulate an output array of event data arrays. + $output_arrays = array(); + foreach ($input_arrays as $array) { + // Convert the input array into a useful Event object + $event = new ScheduleIndex($array, $timeZone); + // If the event is in-bounds, add it to the output + if ($event->isWithinDayRange($range_start, $range_end)) { + $output_arrays[] = $event->toArray(); + } + } + return json($output_arrays); + } else { + View::assign('is_leader', isLeader($this->uid)); + return view(); + } + } + + //保存日志数据 + public function add() + { + $param = get_params(); + $admin_id = $this->uid; + if ($param['id'] == 0) { + if (isset($param['start_time'])) { + $param['start_time'] = strtotime($param['start_time']); + } + if (isset($param['end_time'])) { + $param['end_time'] = strtotime($param['end_time']); + } + if (isset($param['end_time_a'])) { + $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']); + } + if (isset($param['start_time_a'])) { + $param['start_time'] = strtotime($param['start_time_a'] . '' . $param['start_time_b']); + } + if (isset($param['end_time_a'])) { + $param['end_time'] = strtotime($param['end_time_a'] . '' . $param['end_time_b']); + } + if($param['start_time']>time()){ + return to_assign(1, "开始时间不能大于现在时间"); + } + if ($param['end_time'] <= $param['start_time']) { + return to_assign(1, "结束时间需要大于开始时间"); + } + if (date('d',$param['end_time']) != date('d',$param['start_time'])) { + return to_assign(1, "结束时间与开始时间必须是同一天"); + } + $where1[] = ['delete_time', '=', 0]; + $where1[] = ['admin_id', '=', $admin_id]; + $where1[] = ['start_time', 'between', [$param['start_time'], $param['end_time'] - 1]]; + + $where2[] = ['delete_time', '=', 0]; + $where2[] = ['admin_id', '=', $admin_id]; + $where2[] = ['start_time', '<=', $param['start_time']]; + $where2[] = ['start_time', '>=', $param['end_time']]; + + $where3[] = ['delete_time', '=', 0]; + $where3[] = ['admin_id', '=', $admin_id]; + $where3[] = ['end_time', 'between', [$param['start_time'] + 1, $param['end_time']]]; + + $record = Db::name('Schedule') + ->where(function ($query) use ($where1) { + $query->where($where1); + }) + ->whereOr(function ($query) use ($where2) { + $query->where($where2); + }) + ->whereOr(function ($query) use ($where3) { + $query->where($where3); + }) + ->count(); + if ($record > 0) { + return to_assign(1, "您所选的时间区间已有工作记录,请重新选时间"); + } + $param['labor_time'] = ($param['end_time'] - $param['start_time']) / 3600; + $param['admin_id'] = $admin_id; + $param['did'] = get_admin($admin_id)['did']; + $param['create_time'] = time(); + $sid = Db::name('Schedule')->strict(false)->field(true)->insertGetId($param); + if ($sid > 0) { + add_log('add', $sid, $param); + return to_assign(0, '操作成功'); + } else { + return to_assign(0, '操作失败'); + } + } else { + $param['update_time'] = time(); + $res = Db::name('Schedule')->strict(false)->field(true)->update($param); + if ($res !== false) { + add_log('edit', $param['id'], $param); + return to_assign(0, '操作成功'); + } else { + return to_assign(0, '操作失败'); + } + } + } + + //删除工作记录 + public function del() + { + $id = get_params("id"); + $data['id'] = $id; + $data['delete_time'] = time(); + if (Db::name('schedule')->update($data) !== false) { + add_log('delete', $data['id'], $data); + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } + + public function view() + { + $id = get_params('id'); + $schedule = Db::name('Schedule')->where(['id' => $id])->find(); + if (!empty($schedule)) { + $schedule['start_time_1'] = date('H:i', $schedule['start_time']); + $schedule['end_time_1'] = date('H:i', $schedule['end_time']); + $schedule['start_time'] = date('Y-m-d', $schedule['start_time']); + $schedule['end_time'] = date('Y-m-d', $schedule['end_time']); + $schedule['create_time'] = date('Y-m-d H:i:s', $schedule['create_time']); + $schedule['name'] = Db::name('Admin')->where(['id' => $schedule['admin_id']])->value('name'); + $schedule['labor_type_string'] = '案头工作'; + if($schedule['labor_type'] == 2){ + $schedule['labor_type_string'] = '外勤工作'; + } + $schedule['department'] = get_admin($schedule['admin_id'])['department']; + $schedule['work_cate'] = Db::name('WorkCate')->where(['id' => $schedule['cid']])->value('title'); + if($schedule['tid']>0){ + $task = Db::name('ProjectTask')->where(['id' => $schedule['tid']])->find(); + $schedule['task'] = $task['title']; + if($task['project_id']>0){ + $schedule['project'] = Db::name('Project')->where(['id' => $task['project_id']])->value('name'); + } + else{ + $schedule['project'] ='-'; + } + } + else{ + $schedule['task'] ='-'; + } + } + if (request()->isAjax()) { + return to_assign(0, "", $schedule); + } else { + View::assign('detail',$schedule); + if(is_mobile()){ + return view('qiye@/index/schedule_view'); + } + return $schedule; + } + } + +} diff --git a/app/oa/controller/Work.php b/app/oa/controller/Work.php new file mode 100644 index 0000000..fa6c67b --- /dev/null +++ b/app/oa/controller/Work.php @@ -0,0 +1,289 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\oa\controller; + +use app\base\BaseController; +use app\oa\model\Work as WorkModel; +use app\oa\model\WorkRecord; +use think\facade\Db; +use think\facade\View; + +class Work extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new WorkModel(); + } + //获取接收汇报列表 + public function get_accept($map = [], $param = []) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $Work = WorkRecord::alias('a') + ->field('a.id,a.from_uid,a.to_uid,a.send_time,a.read_time,w.id as wid,w.types,w.works,w.file_ids,w.start_date,w.end_date') + ->join('Work w','a.work_id = w.id','left') + ->where($map) + ->order('a.send_time desc') + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) { + $item->send_time = empty($item->send_time) ? '-' : to_date($item->send_time,'Y-m-d H:i:s'); + $item->from_name = Db::name('Admin')->where(['id' => $item->from_uid])->value('name'); + $item->to_name = Db::name('Admin')->where(['id' => $item->to_uid])->value('name'); + if($item->start_date>0){ + $item->start_date = date('Y-m-d',$item->start_date); + } + if($item->end_date>0){ + $item->end_date = date('Y-m-d',$item->end_date); + } + $item->files = Db::name('File')->where('id', 'in', $item->file_ids)->count(); + }); + return $Work; + } + + //汇报列表 + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $map = []; + //按关键字检索 + if( !empty($param['keywords']) ){ + $map[] = ['works', 'like', '%'.$param['keywords'].'%']; + } + if($param['send']==1){ + if (!empty($param['types'])) { + $map[] = ['types', '=', $param['types']]; + } + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $map[] = ['start_date', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $map[] = ['admin_id', '=', $this->uid]; + $map[] = ['delete_time', '=', 0]; + $list = $this->model->get_send($param,$map); + } + else{ + if (!empty($param['read'])) { + if($param['read']==1){ + $map[] = ['a.read_time', '=', 0]; + }else{ + $map[] = ['a.read_time', '>', 0]; + } + } + if (!empty($param['types'])) { + $map[] = ['w.types', '=', $param['types']]; + } + $map[] = ['a.to_uid', '=', $this->uid]; + $map[] = ['a.delete_time', '=', 0]; + //按时间检索 + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $map[] = ['a.send_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $list = $this->get_accept($map, $param); + } + return table_assign(0, '', $list); + } else { + $send = empty(get_params('send')) ? 1 : get_params('send'); + return view('datalist_'.$send); + } + } + + //新增&编辑 + public function add() + { + if (request()->isAjax()) { + $param = get_params(); + $id = $param['id'] ? $param['id'] : 0; + if(!empty($param['start_date'])){ + $param['start_date'] = strtotime($param['start_date']); + } + if(!empty($param['end_date'])){ + $param['end_date'] = strtotime($param['end_date']); + } + if(!empty($param['range_date'])){ + $range_date =explode('~', $param['range_date']); + $param['start_date'] = strtotime(urldecode($range_date[0])); + $param['end_date'] = strtotime(urldecode($range_date[1])); + } + if($id>0){ + $param['update_time'] = time(); + $res = Db::name('Work')->strict(false)->field(true)->update($param); + if ($res !== false) { + add_log('edit',$id,$param); + if($param['send']==1){ + $users = explode(',',$param['to_uids']); + //组合要发的消息 + $send_data = []; + foreach ($users as $key => $value) { + if (!$value || ($value == $this->uid)) { + continue; + } + $send_data[] = array( + 'work_id' => $id,//关联id + 'to_uid' => $value,//接收人 + 'from_uid' => $this->uid,//发送人 + 'send_time' => time() + ); + } + Db::name('WorkRecord')->strict(false)->field(true)->insertAll($send_data); + Db::name('Work')->strict(false)->field('send_time')->update(['id' => $id,'send_time' => time()]); + add_log('send',$id); + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$param['to_uids'],//接收人 + 'template_id'=>'work',//消息模板标识 + 'content'=>[ //消息内容 + 'send_time'=>date('Y-m-d H:i:s'), + 'action_id'=>$id + ] + ]; + event('SendMessage',$msg); + return to_assign(0, '发送成功'); + } + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + else{ + $param['admin_id'] = $this->uid; + $param['create_time'] = time(); + $wid = Db::name('Work')->strict(false)->field(true)->insertGetId($param); + if ($wid !== false) { + add_log('add',$wid,$param); + if($param['send']==1){ + $users = explode(',',$param['to_uids']); + //组合要发的内容 + $send_data = []; + foreach ($users as $key => $value) { + if (!$value || ($value == $this->uid)) { + continue; + } + $send_data[] = array( + 'work_id' => $wid,//关联id + 'to_uid' => $value,//接收人 + 'from_uid' => $this->uid,//发送人 + 'send_time' => time() + ); + } + Db::name('WorkRecord')->strict(false)->field(true)->insertAll($send_data); + Db::name('Work')->strict(false)->field('send_time')->update(['id' => $wid,'send_time' => time()]); + add_log('send',$wid); + $msg=[ + 'from_uid'=>$this->uid,//发送人 + 'to_uids'=>$param['to_uids'],//接收人 + 'template_id'=>'work',//消息模板ID + 'content'=>[ //消息内容 + 'create_time'=>date('Y-m-d H:i:s'), + 'action_id'=>$wid + ] + ]; + event('SendMessage',$msg); + return to_assign(0, '发送成功'); + } + return to_assign(); + } + else{ + return to_assign(1,'操作失败'); + } + } + } + else{ + $id = empty(get_params('id')) ? 0 : get_params('id'); + $types = empty(get_params('types')) ? 1 : get_params('types'); + if ($id > 0) { + $detail = $this->model->detail($id); + $types = $detail['types']; + View::assign('detail', $detail); + } + View::assign('id', $id); + View::assign('types', $types); + return view('add_'.$types); + } + } + + //查看 + public function view() + { + $param = get_params(); + $id = $param['id']; + $detail = $this->model->detail($id); + //已读人查询 + $read_user_names = []; + if($detail['admin_id'] !=$this->uid){ + $record = Db::name('WorkRecord')->where(['work_id' => $detail['id'],'to_uid' => $this->uid])->count(); + if ($record == 0) { + echo '
              该汇报不存在
              ';exit; + } + else{ + Db::name('WorkRecord')->where(['work_id' => $detail['id'],'to_uid' => $this->uid])->update(['read_time' => time()]); + } + } + else{ + $read_user_ids= Db::name('WorkRecord')->where([['work_id','=',$detail['id']],['read_time','>',0]])->column('to_uid'); + $read_user_names = Db::name('Admin')->where('id', 'in', $read_user_ids)->column('name'); + } + $sender = get_admin($detail['admin_id']); + $detail['person_name'] = $sender['name']; + if($detail['send_time']>0){ + $detail['send_time'] = to_date($detail['send_time']); + } + //接收人查询 + $user_names = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['to_uids'])->column('name'); + $detail['users'] = implode(",", $user_names); + $detail['read_users'] = implode(",", $read_user_names); + $detail['comment_auth'] = 0; + $type_user_array = explode(",", $detail['to_uids']); + if (in_array($this->uid, $type_user_array)) { + $detail['comment_auth'] = 1; + } + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/index/work_view'); + } + return view(); + } + + + //删除汇报 + public function del() + { + $param = get_params(); + $id = $param['id']; + $detail = Db::name('Work')->where(['id' => $id])->find(); + if($detail['admin_id'] == $this->uid){ + $res = Db::name('Work')->where('id',$detail['id'])->update(['delete_time' => time()]); + if($res!==false){ + Db::name('WorkRecord')->where('work_id',$detail['id'])->update(['delete_time' => time()]); + add_log('delete', $param['id']); + return to_assign(); + } + else{ + return to_assign(1, '操作失败'); + } + } + else{ + return to_assign(1, '无权限删除'); + } + } +} diff --git a/app/oa/event.php b/app/oa/event.php new file mode 100644 index 0000000..c9322cf --- /dev/null +++ b/app/oa/event.php @@ -0,0 +1,9 @@ + [ + //注册监听类 + 'SendMessage' => ['app\listener\SendMessage'], + ], + //'subscribe' => ['app\subscribe\Message'], +]; + diff --git a/app/oa/middleware.php b/app/oa/middleware.php new file mode 100644 index 0000000..c482cdc --- /dev/null +++ b/app/oa/middleware.php @@ -0,0 +1,9 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\oa\model; +use think\Model; +class Plan extends Model +{ + +} \ No newline at end of file diff --git a/app/oa/model/Schedule.php b/app/oa/model/Schedule.php new file mode 100644 index 0000000..74da30b --- /dev/null +++ b/app/oa/model/Schedule.php @@ -0,0 +1,77 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\oa\model; +use think\Model; +use think\facade\Db; +class Schedule extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[], $where=[], $whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'a.end_time desc' : $param['order']; + try { + $list = self::field('a.*,u.name,w.title as work_cate') + ->alias('a') + ->join('Admin u', 'a.admin_id = u.id', 'LEFT') + ->join('WorkCate w', 'w.id = a.cid', 'LEFT') + ->where($where) + ->where(function ($query) use ($whereOr) { + if (!empty($whereOr)) + $query->whereOr($whereOr); + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) { + $item->labor_type_string = '案头工作'; + if($item->labor_type == 2){ + $item->labor_type_string = '外勤工作'; + } + if($item->did > 0){ + $item->department = Db::name('Department')->where(['id' => $item->did])->value('title'); + } + else{ + $item->department='-'; + } + if($item->tid > 0){ + $task = Db::name('ProjectTask')->where(['id' => $item->tid])->find(); + $item->task = $task['title']; + if($task['project_id']>0){ + $item->project = Db::name('Project')->where(['id' => $task['project_id']])->value('name'); + } + else{ + $item->project='-'; + } + } + else{ + $item->task = '-'; + } + $item->start_time_a = empty($item->start_time) ? '' : date('Y-m-d', $item->start_time); + $item->start_time_b = empty($item->start_time) ? '' : date('H:i', $item->start_time); + $item->end_time_a = empty($item->end_time) ? '' : date('Y-m-d', $item->end_time); + $item->end_time_b = empty($item->end_time) ? '' : date('H:i', $item->end_time); + $item->start_time = empty($item->start_time) ? '' : date('Y-m-d H:i', $item->start_time); + $item->end_time = empty($item->end_time) ? '' : date('H:i', $item->end_time); + $item->create_time = to_date($item->create_time ); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } +} \ No newline at end of file diff --git a/app/oa/model/Work.php b/app/oa/model/Work.php new file mode 100644 index 0000000..bc7d779 --- /dev/null +++ b/app/oa/model/Work.php @@ -0,0 +1,63 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\oa\model; + +use think\Model; +use think\facade\Db; + +class Work extends Model +{ + //获取发送汇报列表 + public function get_send($param = [],$where = []) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'create_time desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) { + if($item['start_date']>0){ + $item['start_date'] = date('Y-m-d',$item['start_date']); + } + if($item['end_date']>0){ + $item['end_date'] = date('Y-m-d',$item['end_date']); + } + $to_names = Db::name('Admin')->where('status', 1)->where('id', 'in', $item['to_uids'])->column('name'); + $item['to_names'] = implode(",", $to_names); + $item['files'] = Db::name('File')->where('id', 'in', $item['file_ids'])->count(); + $item->create_time = to_date($item->create_time); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + //详情 + public function detail($id) + { + $detail = self::find($id); + if($detail['types']>1){ + $detail['range_date'] = date('Y-m-d',$detail['start_date']).' ~ '.date('Y-m-d',$detail['end_date']); + } + else{ + $detail['range_date'] = date('Y-m-d',$detail['start_date']); + } + $to_unames = Db::name('Admin')->where('status', 1)->where('id', 'in', $detail['to_uids'])->column('name'); + $detail['to_unames'] = implode(",", $to_unames); + $detail['file_array'] = Db::name('File')->where([['id','in',$detail['file_ids']]])->select()->toArray(); + return $detail; + } +} diff --git a/app/oa/model/WorkRecord.php b/app/oa/model/WorkRecord.php new file mode 100644 index 0000000..6112ac8 --- /dev/null +++ b/app/oa/model/WorkRecord.php @@ -0,0 +1,22 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\oa\model; + +use think\Model; +use think\facade\Db; + +class WorkRecord extends Model +{ + +} diff --git a/app/oa/view/meeting/datalist.html b/app/oa/view/meeting/datalist.html new file mode 100644 index 0000000..5baf842 --- /dev/null +++ b/app/oa/view/meeting/datalist.html @@ -0,0 +1,102 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/oa/view/meeting/view.html b/app/oa/view/meeting/view.html new file mode 100644 index 0000000..4896628 --- /dev/null +++ b/app/oa/view/meeting/view.html @@ -0,0 +1,64 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              会议纪要

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              会议时间{$detail.meeting_date|date='Y-m-d H:i:s'}主持人{$detail.anchor_name}记录人{$detail.recorder_name}
              会 议 室{$detail.room}主办部门{$detail.did_name|default=""}
              参会人员{$detail.join_names}
              会议主题{$detail.title}
              会议内容{$detail.content}
              下一步
              工作计划
              {$detail.plans}
              参会人员签字{$detail.sign_names}
              共享给谁{$detail.share_names}
              备注信息{$detail.remarks|default=''}
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/news/datalist.html b/app/oa/view/news/datalist.html new file mode 100644 index 0000000..eba53ff --- /dev/null +++ b/app/oa/view/news/datalist.html @@ -0,0 +1,63 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/news/view.html b/app/oa/view/news/view.html new file mode 100644 index 0000000..c6f9098 --- /dev/null +++ b/app/oa/view/news/view.html @@ -0,0 +1,63 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
              +

              {$detail.title}

              +
              + {$detail.admin_name}发表于:{$detail.create_time | date='Y-m-d H:i:s'} +
              +
              + {$detail.content|raw} +
              + {notempty name="$detail.src"} +
              + 关联链接:{$detail.src} +
              + {/notempty} + {notempty name="$detail.file_ids"} +
              +

              相关附件

              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              + {/notempty} + +{/block} + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/oa/view/note/datalist.html b/app/oa/view/note/datalist.html new file mode 100644 index 0000000..d75d4af --- /dev/null +++ b/app/oa/view/note/datalist.html @@ -0,0 +1,64 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              + +
              + +
              +
              + + +
              + +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/note/view.html b/app/oa/view/note/view.html new file mode 100644 index 0000000..717caa7 --- /dev/null +++ b/app/oa/view/note/view.html @@ -0,0 +1,63 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
              +

              {$detail.title}

              +
              + {$detail.admin_name}发表于:{$detail.create_time | date='Y-m-d H:i:s'}公告分类:{$detail.cate} +
              +
              + {$detail.content|raw} +
              + {notempty name="$detail.src"} +
              + 关联链接:{$detail.src} +
              + {/notempty} + {notempty name="$detail.file_ids"} +
              +

              相关附件

              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              + {/notempty} + +{/block} + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/oa/view/plan/calendar.html b/app/oa/view/plan/calendar.html new file mode 100644 index 0000000..f074e5f --- /dev/null +++ b/app/oa/view/plan/calendar.html @@ -0,0 +1,548 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} + +
              +
              + {gt name="is_leader" value="0"} +
              +
              +
              + {/gt} +
              + +{/block} +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/plan/datalist.html b/app/oa/view/plan/datalist.html new file mode 100644 index 0000000..224330a --- /dev/null +++ b/app/oa/view/plan/datalist.html @@ -0,0 +1,464 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              + +
              + +
              + {gt name="is_leader" value="0"} +
              + + +
              + {/gt} +
              + +
              +
              + +
              +
              + + +
              + +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/schedule/calendar.html b/app/oa/view/schedule/calendar.html new file mode 100644 index 0000000..ab81e57 --- /dev/null +++ b/app/oa/view/schedule/calendar.html @@ -0,0 +1,219 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} + +
              +
              + {gt name="is_leader" value="0"} +
              +
              +
              + {/gt} +
              + +{/block} +{block name="copyright"}{/block} + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/schedule/datalist.html b/app/oa/view/schedule/datalist.html new file mode 100644 index 0000000..ca9016d --- /dev/null +++ b/app/oa/view/schedule/datalist.html @@ -0,0 +1,261 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +
              +
              + +
              + {gt name="is_leader" value="0"} +
              + + +
              + {/gt} +
              + +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/work/add_1.html b/app/oa/view/work/add_1.html new file mode 100644 index 0000000..91e01a0 --- /dev/null +++ b/app/oa/view/work/add_1.html @@ -0,0 +1,113 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
              +

              工作日报汇报

              + + + {if ($id == 0) OR ($detail.send_time == 0) } + + + {else/} + + + {/if} + + + + + + + + + + + + + + + + + +
              接收人* + + + 接收人{$detail.to_unames|default=''}汇报周期*
              今日工作*
              明日计划
              其它事项
              附件
              +
              + + {notempty name="$detail.file_array"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              + + + + + {if ($id == 0) OR ($detail.send_time == 0) } + + {/if} +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/work/add_2.html b/app/oa/view/work/add_2.html new file mode 100644 index 0000000..9f22734 --- /dev/null +++ b/app/oa/view/work/add_2.html @@ -0,0 +1,113 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
              +

              工作周报汇报

              + + + {if ($id == 0) OR ($detail.send_time == 0) } + + + {else/} + + + {/if} + + + + + + + + + + + + + + + + + +
              接收人* + + + 接收人{$detail.to_unames|default=''}汇报周期*
              本周工作*
              下周计划
              其它事项
              附件
              +
              + + {notempty name="$detail.file_array"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              + + + + + {if ($id == 0) OR ($detail.send_time == 0) } + + {/if} +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/work/add_3.html b/app/oa/view/work/add_3.html new file mode 100644 index 0000000..b3c40b3 --- /dev/null +++ b/app/oa/view/work/add_3.html @@ -0,0 +1,113 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
              +

              工作月报汇报

              + + + {if ($id == 0) OR ($detail.send_time == 0) } + + + {else/} + + + {/if} + + + + + + + + + + + + + + + + + +
              接收人* + + + 接收人{$detail.to_unames|default=''}汇报周期*
              本月工作*
              下月计划
              其它事项
              附件
              +
              + + {notempty name="$detail.file_array"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              + + + + + {if ($id == 0) OR ($detail.send_time == 0) } + + {/if} +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/work/datalist_1.html b/app/oa/view/work/datalist_1.html new file mode 100644 index 0000000..7391407 --- /dev/null +++ b/app/oa/view/work/datalist_1.html @@ -0,0 +1,157 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              + + + +
              +
              +
              +
              + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/work/datalist_2.html b/app/oa/view/work/datalist_2.html new file mode 100644 index 0000000..3bc8b20 --- /dev/null +++ b/app/oa/view/work/datalist_2.html @@ -0,0 +1,103 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              + + + +
              +
              +
              +
              + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/oa/view/work/view.html b/app/oa/view/work/view.html new file mode 100644 index 0000000..e48f217 --- /dev/null +++ b/app/oa/view/work/view.html @@ -0,0 +1,108 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} +{block name="body"} +
              +

              汇报详情

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_array"} + + + + + {/notempty} + {notempty name="$detail.read_users"} + + + + + {/notempty} +
              汇报人{$detail.person_name}汇报类型 + {eq name="$detail.types" value="1"}『日报』{/eq} + {eq name="$detail.types" value="2"}『周报』{/eq} + {eq name="$detail.types" value="3"}『月报』{/eq} + 汇报时间 + {eq name="$detail.send_time" value="0"} + 未汇报 + {else/} + {$detail.send_time} + {/eq} +
              汇报周期{$detail.range_date}接收人{$detail.users}
              工作内容 + {:nl2br($detail.works)} +
              工作计划 + {:nl2br($detail.plans)} +
              其他事项 + {:nl2br($detail.remark)} +
              相关附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              已读回执{$detail.read_users}
              + {gt name="$detail.update_time" value="0"} +
              该汇报于 {$detail.update_time} 进行过编辑
              + {/gt} +
              +

              工作点评

              +
              + +
              +
              +
              +
              +{/block} + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/app/project/common.php b/app/project/common.php new file mode 100644 index 0000000..3f2a153 --- /dev/null +++ b/app/project/common.php @@ -0,0 +1,170 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +use think\facade\Db; + +//获取项目状态 +function get_status($id=0) +{ + $status_array = ['未设置','未开始','进行中','已完成','已关闭']; + if($id==0){ + return $status_array; + } + else{ + $news_array=[]; + foreach($status_array as $key => $value){ + if($key>0){ + $news_array[]=array( + 'id'=>$key, + 'title'=>$value, + ); + } + } + return $news_array; + } +} + +//根据状态读取审批状态名称 +function status_name($status=0) +{ + $status_array = get_status(); + return $status_array[$status]; +} + + +//获取任务全部状态 +function get_task_status($id=0) +{ + $status_task_array = ['未设置','未开始','进行中','已完成','已拒绝','已关闭']; + if($id==0){ + return $status_task_array; + } + else{ + $news_array=[]; + foreach($status_task_array as $key => $value){ + if($key>0){ + $news_array[]=array( + 'id'=>$key, + 'title'=>$value, + ); + } + } + return $news_array; + } +} + +//根据任务状态读取审批状态名称 +function status_task_name($status=0) +{ + $status_task_array = get_task_status(); + return $status_task_array[$status]; +} + +//获取任务紧急程度 +function get_priority($id=0) +{ + $priority_array = ['未设置','低','中','高','紧急']; + if($id==0){ + return $priority_array; + } + else{ + $news_array=[]; + foreach($priority_array as $key => $value){ + if($key>0){ + $news_array[]=array( + 'id'=>$key, + 'title'=>$value, + ); + } + } + return $news_array; + } +} + +//根据任务紧急程度名称 +function priority_name($priority=0) +{ + $priority_array = get_priority(); + return $priority_array[$priority]; +} + +//是否是项目管理员,count>1即有权限 +function isAuthProject($uid) +{ + if($uid == 1){ + return 1; + } + $map = []; + $map[] = ['name', '=', 'project_admin']; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',conf_1)")]; + $count = Db::name('DataAuth')->where($map)->count(); + return $count; +} +//读取项目 +function get_project($uid = 0) +{ + $map = []; + $map[] = ['delete_time', '=', 0]; + if ($uid > 0) { + $project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id'); + $map[] = ['id', 'in', $project_ids]; + } + $project = Db::name('Project')->where($map)->select()->toArray(); + return $project; +} + +//任务分配情况统计 +function plan_count($arrData) +{ + $documents = array(); + foreach ($arrData as $index => $value) { + $planTime = date("Y-m-d", $value['end_time']); + if (empty($documents[$planTime])) { + $documents[$planTime] = 1; + } else { + $documents[$planTime] += 1; + } + } + return $documents; +} + +//工时登记情况统计 +function hour_count($arrData) +{ + $documents = array(); + foreach ($arrData as $index => $value) { + $hourTime = date("Y-m-d", $value['start_time']); + if (empty($documents[$hourTime])) { + $documents[$hourTime] = $value['labor_time'] + 0; + } else { + $documents[$hourTime] += $value['labor_time']; + } + $documents[$hourTime] = round($documents[$hourTime], 2); + } + return $documents; +} + +//燃尽图统计 +function cross_count($arrData) +{ + $documents = array(); + foreach ($arrData as $index => $value) { + $planTime = date("Y-m-d", $value['end_time']); + if (empty($documents[$planTime])) { + $documents[$planTime] = 1; + } else { + $documents[$planTime] += 1; + } + } + return $documents; +} \ No newline at end of file diff --git a/app/project/controller/Api.php b/app/project/controller/Api.php new file mode 100644 index 0000000..022089a --- /dev/null +++ b/app/project/controller/Api.php @@ -0,0 +1,623 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\project\controller; + +use app\api\BaseController; +use app\project\model\Project as ProjectModel; +use app\project\model\ProjectTask; +use app\oa\model\Schedule; +use think\facade\Db; +use think\facade\View; + +class Api extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ProjectModel(); + } + //获取项目列表 + public function get_project() + { + $param = get_params(); + $uid = $this->uid; + $auth = isAuth($uid,'project_admin','conf_1'); + $where = array(); + $whereOr = array(); + $where[] = ['delete_time', '=', 0]; + if($auth == 0){ + $whereOr[] = ['director_uid', '=', $uid]; + $project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id'); + $whereOr[] = ['id', 'in', $project_ids]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + if (!empty($param['keywords'])) { + $where[] = ['name|content', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + + //获取任务列表 + public function get_task() + { + $param = get_params(); + $uid = $this->uid; + $where = []; + $whereOr = []; + $where[] = ['delete_time', '=', 0]; + if (!empty($param['status'])) { + $where[] = ['status', '=', $param['status']]; + } + if (!empty($param['priority'])) { + $where[] = ['priority', '=', $param['priority']]; + } + if (!empty($param['work_id'])) { + $where[] = ['work_id', '=', $param['work_id']]; + } + if (!empty($param['director_uid'])) { + $where[] = ['director_uid', 'in', $param['director_uid']]; + } + if (!empty($param['keywords'])) { + $where[] = ['title|content', 'like', '%' . $param['keywords'] . '%']; + } + if(!empty($param['project_id'])){ + $where[] = ['project_id', '=', $param['project_id']]; + } + else{ + $auth = isAuth($uid,'project_admin','conf_1'); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',assist_admin_ids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + if (empty($param['director_uid'])) { + $whereOr[] = ['director_uid', '=', $uid]; + } + } + } + + $model = new ProjectTask(); + $list = $model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + + //获取项目概况数据 + public function get_chart_data() + { + $param = get_params(); + $tasks = Db::name('ProjectTask')->field('id,plan_hours,end_time,status,over_time')->order('end_time asc')->where([['project_id', '=', $param['project_id']],['end_time','>',0],['delete_time', '=', 0]])->select()->toArray(); + + $task_count = count($tasks); + $task_count_ok = Db::name('ProjectTask')->where([['project_id', '=', $param['project_id']], ['delete_time', '=', 0],['status', '>', 2]])->count(); + $task_delay = 0; + if ($task_count > 0) { + foreach ($tasks as $k => $v) { + if (($v['status'] < 3) && ($v['end_time'] < time() - 86400)) { + $task_delay++; + } + if (($v['status'] == 3) && ($v['end_time'] < $v['over_time'] - 86400)) { + $task_delay++; + } + } + } + $task_pie = [ + 'count' => $task_count, + 'count_ok' => $task_count_ok, + 'delay' => $task_delay, + 'ok_lv' => $task_count == 0 ? 100 : round($task_count_ok * 100 / $task_count, 2), + 'delay_lv' => $task_count == 0 ? 100 : round($task_delay * 100 / $task_count, 2), + ]; + + $date_tasks = []; + if ($tasks) { + $date_tasks = plan_count($tasks); + } + + $tasks_ok = Db::name('ProjectTask')->field('id,over_time as end_time')->order('over_time asc')->where([['over_time', '>', 0], ['delete_time', '=', 0], ['project_id', '=', $param['project_id']]])->select()->toArray(); + $date_tasks_ok = []; + if ($tasks_ok) { + $date_tasks_ok = plan_count($tasks_ok); + } + $tids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $param['project_id']])->column('id'); + $schedules = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->select()->toArray(); + $date_schedules = []; + if ($schedules) { + $date_schedules = hour_count($schedules); + } + $res['task_pie'] = $task_pie; + $res['date_tasks'] = $date_tasks; + $res['date_tasks_ok'] = $date_tasks_ok; + $res['date_schedules'] = $date_schedules; + to_assign(0, '', $res); + } + + //添加附件 + public function add_file() + { + $param = get_params(); + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $fid = Db::name('ProjectFile')->strict(false)->field(true)->insertGetId($param); + if ($fid) { + return to_assign(0, '上传成功', $fid); + } + } + + //删除 + public function delete_file() + { + if (request()->isDelete()) { + $id = get_params("id"); + $detail = Db::name('ProjectFile')->where('id', $id)->find(); + if (Db::name('ProjectFile')->where('id', $id)->delete() !== false) { + $file_name = Db::name('File')->where('id', $detail['file_id'])->value('name'); + return to_assign(0, "删除成功"); + } else { + return to_assign(0, "删除失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //工作记录列表 + public function schedule() + { + $param = get_params(); + $task_ids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $param['tid']])->column('id'); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['a.title', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['uid'])) { + $where[] = ['a.admin_id', '=', $param['uid']]; + } + if (!empty($task_ids)) { + $where[] = ['a.tid', 'in', $task_ids]; + } + $where[] = ['a.delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Schedule::where($where) + ->field('a.*,u.name,d.title as department,t.title as task,p.name as project,w.title as work_cate') + ->alias('a') + ->join('Admin u', 'a.admin_id = u.id', 'LEFT') + ->join('Department d', 'u.did = d.id', 'LEFT') + ->join('ProjectTask t', 'a.tid = t.id', 'LEFT') + ->join('WorkCate w', 'w.id = t.cate', 'LEFT') + ->join('Project p', 't.project_id = p.id', 'LEFT') + ->order('a.end_time desc') + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key) { + $item->start_time_a = empty($item->start_time) ? '' : date('Y-m-d', $item->start_time); + $item->start_time_b = empty($item->start_time) ? '' : date('H:i', $item->start_time); + $item->end_time_a = empty($item->end_time) ? '' : date('Y-m-d', $item->end_time); + $item->end_time_b = empty($item->end_time) ? '' : date('H:i', $item->end_time); + + $item->start_time = empty($item->start_time) ? '' : date('Y-m-d H:i', $item->start_time); + $item->end_time = empty($item->end_time) ? '' : date('H:i', $item->end_time); + }); + return table_assign(0, '', $list); + } + + //查看工作记录详情 + public function schedule_detail($id) + { + $id = get_params('id'); + $schedule = Schedule::where(['id' => $id])->find(); + if (!empty($schedule)) { + $schedule['start_time_1'] = date('H:i', $schedule['start_time']); + $schedule['end_time_1'] = date('H:i', $schedule['end_time']); + $schedule['start_time'] = date('Y-m-d', $schedule['start_time']); + $schedule['end_time'] = date('Y-m-d', $schedule['end_time']); + $schedule['user'] = Db::name('Admin')->where(['id' => $schedule['admin_id']])->value('name'); + $schedule['department'] = Db::name('Department')->where(['id' => $schedule['did']])->value('title'); + } + if (request()->isAjax()) { + return to_assign(0, "", $schedule); + } else { + return $schedule; + } + } + + //任务的工作记录列表 + public function task_schedule() + { + $param = get_params(); + $where = array(); + $where['a.tid'] = $param['tid']; + $where['a.delete_time'] = 0; + $list = Db::name('Schedule') + ->field('a.*,u.name') + ->alias('a') + ->join('Admin u', 'u.id = a.admin_id') + ->order('a.create_time desc') + ->where($where) + ->select()->toArray(); + foreach ($list as $k => $v) { + $list[$k]['start_time'] = empty($v['start_time']) ? '' : date('Y-m-d H:i', $v['start_time']); + $list[$k]['end_time'] = empty($v['end_time']) ? '' : date('H:i', $v['end_time']); + } + return to_assign(0, '', $list); + } + + + public function project_user() + { + $param = get_params(); + $project = Db::name('Project')->where(['id' => $param['tid']])->find(); + $users = Db::name('ProjectUser') + ->field('pu.*,a.name,a.mobile,p.title as position,d.title as department') + ->alias('pu') + ->join('Admin a', 'pu.uid = a.id', 'LEFT') + ->join('Department d', 'a.did = d.id', 'LEFT') + ->join('Position p', 'a.position_id = p.id', 'LEFT') + ->order('pu.id asc') + ->where(['pu.project_id' => $param['tid']]) + ->select()->toArray(); + if(!empty($users)){ + foreach ($users as $k => &$v) { + $v['role'] = 0; //普通项目成员 + if ($v['uid'] == $project['admin_id']) { + $v['role'] = 1; //项目创建人 + } + if ($v['uid'] == $project['director_uid']) { + $v['role'] = 2; //项目负责人 + } + + $v['create_time'] = date('Y-m-d', (int) $v['create_time']); + if($v['delete_time'] > 0){ + $v['delete_time'] = date('Y-m-d', (int) $v['delete_time']); + } + else{ + $v['delete_time'] = '-'; + } + + $tids = Db::name('ProjectTask')->where([['project_id','=',$param['tid']],['delete_time','=',0]])->column('id'); + $schedule_map = []; + $schedule_map[] = ['tid','in',$tids]; + $schedule_map[] = ['delete_time','=',0]; + $schedule_map[] = ['admin_id','=',$v['uid']]; + $v['schedules'] = Db::name('Schedule')->where($schedule_map)->count(); + $v['labor_times'] = Db::name('Schedule')->where($schedule_map)->sum('labor_time'); + + $task_map = []; + $task_map[] = ['project_id','=',$param['tid']]; + $task_map[] = ['delete_time', '=', 0]; + + $task_map1 = [ + ['admin_id', '=', $v['uid']], + ]; + $task_map2 = [ + ['director_uid', '=', $v['uid']], + ]; + $task_map3 = [ + ['', 'exp', Db::raw("FIND_IN_SET('{$v['uid']}',assist_admin_ids)")], + ]; + + //任务总数 + $v['tasks_total'] = Db::name('ProjectTask') + ->where(function ($query) use ($task_map1, $task_map2, $task_map3) { + $query->where($task_map1)->whereor($task_map2)->whereor($task_map3); + }) + ->where($task_map)->count(); + //已完成任务 + $task_map[] = ['status', '>', 2]; //已完成 + $v['tasks_finish'] = Db::name('ProjectTask')->where(function ($query) use ($task_map1, $task_map2, $task_map3) { + $query->where($task_map1)->whereor($task_map2)->whereor($task_map3); + }) + ->where($task_map)->count(); + //未完成任务 + $v['tasks_unfinish'] = $v['tasks_total'] - $v['tasks_finish']; + $v['tasks_pensent'] = "100%"; + if ($v['tasks_total'] > 0) { + $v['tasks_pensent'] = round($v['tasks_finish'] / $v['tasks_total'] * 100, 2) . "%"; + } + } + } + to_assign(0, '', $users); + } + + //新增项目成员 + public function add_user() + { + $param = get_params(); + if (request()->isPost()) { + if($param['uid'] == 0){ + to_assign(1, '已取消'); + } + $has = Db::name('ProjectUser')->where(['uid' => $param['uid'],'project_id'=>$param['project_id']])->find(); + if(!empty($has)){ + to_assign(1, '该员工已经是项目成员'); + } + $project = Db::name('Project')->where(['id' => $param['project_id']])->find(); + if($this->uid == 1 || $this->uid == $project['admin_id'] || $this->uid == $project['director_uid']){ + $param['admin_id'] = $this->uid; + $param['create_time'] = time(); + $res = Db::name('ProjectUser')->strict(false)->field(true)->insert($param); + if ($res) { + to_assign(); + } + }else{ + to_assign(1, '只有项目创建者和负责人才有权限新增项目成员'); + } + } + } + + //移除项目成员 + public function remove_user() + { + $param = get_params(); + if (request()->isDelete()) { + $detail = Db::name('ProjectUser')->where(['id' => $param['id']])->find(); + $project = Db::name('Project')->where(['id' => $detail['project_id']])->find(); + if($this->uid == $project['admin_id'] || $this->uid == $project['director_uid']){ + if($detail['uid'] == $project['admin_id']){ + to_assign(1, '该项目成员是项目的创建者,不能移除'); + } + if($detail['uid'] == $project['director_uid']){ + to_assign(1, '该项目成员是项目的负责人,需要去除负责人权限才能移除'); + } + $param['delete_time'] = time(); + if (Db::name('ProjectUser')->update($param) !== false) { + return to_assign(0, "移除成功"); + } else { + return to_assign(1, "移除失败"); + } + }else{ + to_assign(1, '只有项目创建者和负责人才有权限移除项目成员'); + } + }else{ + return to_assign(1, "错误的请求"); + } + } + //恢复项目成员 + public function recover_user() + { + $param = get_params(); + if (request()->isPost()) { + $detail = Db::name('ProjectUser')->where(['id' => $param['id']])->find(); + $project = Db::name('Project')->where(['id' => $detail['project_id']])->find(); + if($this->uid == $project['admin_id'] || $this->uid == $project['director_uid']){ + $param['delete_time'] = 0; + if (Db::name('ProjectUser')->update($param) !== false) { + return to_assign(0, "恢复成功"); + } else { + return to_assign(1, "恢复失败"); + } + }else{ + to_assign(1, '只有项目创建者和负责人才有权限恢复项目成员'); + } + }else{ + return to_assign(1, "错误的请求"); + } + } + + //关闭项目 + public function close() + { + if (request()->isPost()) { + $id = get_params("id"); + $project = Db::name('Project')->where('id', $id)->find(); + if($project['status'] == 3){ + return to_assign(1, "已完成的项目当不能关闭"); + } + $auth = isAuth($this->uid,'project_admin','conf_1'); + if($project['admin_id'] == $this->uid || $project['director_uid'] == $this->uid || $auth==1){ + if (Db::name('Project')->where('id', $id)->update(['status'=>4]) !== false) { + add_log('close', $id, [],'项目'); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } + else{ + return to_assign(1, "只有项目管理员、项目创建人、项目负责人才有权限关闭"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //开启项目 + public function open() + { + if (request()->isPost()) { + $id = get_params("id"); + $project = Db::name('Project')->where('id', $id)->find(); + if($project['status'] == 3){ + return to_assign(1, "已完成的项目当不能开启"); + } + $auth = isAuth($this->uid,'project_admin','conf_1'); + if($project['admin_id'] == $this->uid || $project['director_uid'] == $this->uid || $auth==1){ + if (Db::name('Project')->where('id', $id)->update(['status'=>2]) !== false) { + add_log('open', $id, [],'项目'); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } + else{ + return to_assign(1, "只有项目管理员、项目创建人、项目负责人才有权限开启"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //删除已有的项目步骤 + public function step_del() + { + if (request()->isDelete()) { + $id = get_params("id"); + $step = Db::name('ProjectStep')->where('id', $id)->find(); + if($step['is_current'] == 1){ + return to_assign(1, "项目当前所在步骤不能删除"); + } + $project = Db::name('Project')->where('id', $step['project_id'])->find(); + $auth = isAuth($this->uid,'project_admin','conf_1'); + if($project['admin_id'] == $this->uid || $project['director_uid'] == $this->uid || $auth==1){ + if (Db::name('ProjectStep')->where('id', $id)->update(['delete_time'=>time()]) !== false) { + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } + else{ + return to_assign(1, "只有项目管理员、项目创建人、项目负责人才有权限删除"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + //审核 + public function step_check() + { + $param = get_params(); + $detail = Db::name('Project')->where(['id' => $param['id']])->find(); + if($detail['status'] > 3){ + return to_assign(1, "不支持该操作:项目已关闭"); + } + //当前审核节点详情 + $step = Db::name('ProjectStep')->where(['project_id'=>$detail['id'],'is_current' => 1,'delete_time'=>0])->find(); + if (!empty($step) && $this->uid != $step['director_uid']){ + return to_assign(1,'您没权限操作'); + } + //审核通过 + if($param['check'] == 1){ + $next_step = Db::name('ProjectStep')->where([['project_id','=',$detail['id']],['sort','>',$step['sort']],['delete_time','=',0]])->order('sort', 'asc')->find(); + if(!empty($next_step)){ + Db::name('ProjectStep')->where('id', $step['id'])->strict(false)->field(true)->update(['is_current'=>0]); + Db::name('ProjectStep')->where('id', $next_step['id'])->strict(false)->field(true)->update(['is_current'=>1]); + $param['status'] = 2; + } + else{ + //不存在下一步审核,审核结束 + $param['status'] = 3; + Db::name('ProjectStep')->where('id', $step['id'])->strict(false)->field(true)->update(['is_current'=>0]); + } + //审核通过数据操作 + Db::name('Project')->strict(false)->field('status')->update($param); + $checkData=array( + 'project_id' => $detail['id'], + 'step_id' => $step['id'], + 'check_uid' => $this->uid, + 'check_time' => time(), + 'status' => $param['check'], + 'content' => $param['content'], + 'create_time' => time() + ); + Db::name('ProjectStepRecord')->strict(false)->field(true)->insertGetId($checkData); + add_log('check', $param['id'], $param,'项目阶段'); + return to_assign(); + } + //回退审核 + else if($param['check'] == 2){ + //获取上一步的审核信息 + $prev_step = Db::name('ProjectStep')->where([['project_id','=',$detail['id']],['sort','<',$step['sort']],['delete_time','=',0]])->order('sort', 'desc')->find(); + if(!empty($prev_step)){ + //存在上一步审核 + Db::name('ProjectStep')->where('id', $step['id'])->strict(false)->field(true)->update(['is_current'=>0]); + Db::name('ProjectStep')->where('id', $prev_step['id'])->strict(false)->field(true)->update(['is_current'=>1]); + $checkData=array( + 'project_id' => $detail['id'], + 'step_id' => $step['id'], + 'check_uid' => $this->uid, + 'check_time' => time(), + 'status' => $param['check'], + 'content' => $param['content'], + 'create_time' => time() + ); + Db::name('ProjectStepRecord')->strict(false)->field(true)->insertGetId($checkData); + add_log('refue', $param['id'], $param,'项目阶段'); + return to_assign(); + } + else{ + return to_assign(1,'已经是第一个阶段了'); + } + } + //回退审核 + else if($param['check'] == 3){ + $auth = isAuth($this->uid,'project_admin','conf_1'); + if($detail['admin_id'] == $this->uid || $detail['director_uid'] == $this->uid || $auth==1){ + //获取最后一步的审核信息 + $prev_step = Db::name('ProjectStep')->where([['project_id','=',$detail['id']],['delete_time','=',0]])->order('sort', 'desc')->find(); + if(!empty($prev_step)){ + //最后一步审核 + Db::name('ProjectStep')->where('id', $prev_step['id'])->strict(false)->field(true)->update(['is_current'=>1]); + Db::name('Project')->where('id', $detail['id'])->strict(false)->field(true)->update(['status'=>2]); + $checkData=array( + 'project_id' => $detail['id'], + 'step_id' => $prev_step['id'], + 'check_uid' => $this->uid, + 'check_time' => time(), + 'status' => $param['check'], + 'content' => $param['content'], + 'create_time' => time() + ); + Db::name('ProjectStepRecord')->strict(false)->field(true)->insertGetId($checkData); + add_log('refue', $param['id'], $param,'项目阶段'); + return to_assign(); + } + else{ + return to_assign(1,'项目阶段不存在'); + } + } + else{ + return to_assign(1, "只有项目管理员、项目创建人、项目负责人才有权限操作"); + } + } + } + + //获取项目类别 + public function get_project_cate() + { + $list = get_base_data('project_cate'); + return to_assign(0, '', $list); + } + + public function get_project_step() + { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['title', 'like', '%' . $param['keywords'] . '%']; + } + $where[] = ['status', '=', 1]; + $where[] = ['delete_time', '=', 0]; + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $list = Db::name('Step')->where($where)->order('id desc')->paginate(['list_rows'=> $rows]); + return table_assign(0, '', $list); + } + + public function project_edit() + { + $param = get_params(); + $this->model->apiedit($param); + } +} diff --git a/app/project/controller/Cate.php b/app/project/controller/Cate.php new file mode 100644 index 0000000..4e60023 --- /dev/null +++ b/app/project/controller/Cate.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\project\controller; + +use app\base\BaseController; +use app\project\model\ProjectCate as ProjectCateModel; +use app\project\validate\CateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Cate extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ProjectCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(CateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(CateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/project/controller/Document.php b/app/project/controller/Document.php new file mode 100644 index 0000000..8c4f024 --- /dev/null +++ b/app/project/controller/Document.php @@ -0,0 +1,163 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\project\controller; + +use app\base\BaseController; +use app\project\model\ProjectDocument; +use app\project\validate\DocumentCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Document extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ProjectDocument(); + } + + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $whereOr = array(); + if (!empty($param['keywords'])) { + $where[] = ['title|content', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['project_id'])) { + $where[] = ['project_id', '=', $param['project_id']]; + } else { + $project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => 0])->column('project_id'); + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['project_id', 'in', $project_ids]; + } + $where[] = ['delete_time', '=', 0]; + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //添加 + public function add() + { + $param = get_params(); + if (request()->isPost()) { + if (!empty($param['id']) && $param['id'] > 0) { + $detail = $this->model->detail($param['id']); + try { + validate(DocumentCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = ProjectDocument::where('id', $param['id'])->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(DocumentCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + $sid = ProjectDocument::strict(false)->field(true)->insertGetId($param); + if ($sid) { + add_log('add', $sid, $param); + } + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $project_id = isset($param['project_id']) ? $param['project_id'] : 0; + if($id>0){ + $detail = $this->model->detail($id); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + } + if($project_id>0){ + $project_name = Db::name('Project')->where(['id' => $project_id])->value('name'); + View::assign('project_name', $project_name); + } + View::assign('project_id', $project_id); + View::assign('id', $id); + return view(); + } + } + + //查看 + public function view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = $this->model->detail($id); + if (empty($detail)) { + if (empty($detail)) { + echo '
              该文档不存在
              ';exit; + } + } else { + $project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => 0])->column('project_id'); + if (in_array($detail['project_id'], $project_ids) || ($this->uid = $detail['admin_id'])) { + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/project/document_view'); + } + return view(); + } + else{ + echo '
              您没权限查看该文档
              ';exit; + } + } + } + + //删除 + public function delete() + { + if (request()->isDelete()) { + $id = get_params("id"); + $detail = Db::name('ProjectDocument')->where('id', $id)->find(); + if ($detail['admin_id'] != $this->uid) { + return to_assign(1, "你不是该文档的创建人,无权限删除"); + } + if (Db::name('ProjectDocument')->where('id', $id)->update(['delete_time' => time()]) !== false) { + return to_assign(0, "删除成功"); + } else { + return to_assign(0, "删除失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/project/controller/Index.php b/app/project/controller/Index.php new file mode 100644 index 0000000..f77c5ec --- /dev/null +++ b/app/project/controller/Index.php @@ -0,0 +1,311 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\project\controller; + +use app\base\BaseController; +use app\project\model\Project as ProjectModel; +use app\project\validate\IndexValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Index extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ProjectModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + $uid = $this->uid; + $auth = isAuth($uid,'project_admin','conf_1'); + $tab = isset($param['tab']) ? $param['tab'] : 0; + if (request()->isAjax()) { + $where = array(); + $whereOr = array(); + $where[] = ['delete_time', '=', 0]; + if (!empty($param['status'])) { + $where[] = ['status', '=', $param['status']]; + } + if (!empty($param['cate_id'])) { + $where[] = ['cate_id', '=', $param['cate_id']]; + } + if (!empty($param['keywords'])) { + $where[] = ['name|content', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['director_uid'])) { + $where[] = ['director_uid', 'in', $param['director_uid']]; + } + else{ + if($auth == 0){ + $whereOr[] = ['director_uid', '=', $uid]; + $project_ids = Db::name('ProjectUser')->where(['uid' => $uid, 'delete_time' => 0])->column('project_id'); + $whereOr[] = ['id', 'in', $project_ids]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 0){ + + } + if($tab == 1){ + $where[] = ['status', '=', 2]; + } + if($tab == 2){ + $time = time(); + $dalay_time = time()+7*86400; + $where[] = ['status', '<', 3]; + $where[] = ['end_time', 'between', [$time,$dalay_time]]; + } + if($tab == 3){ + $where[] = ['status', '<', 3]; + $where[] = ['end_time', '<', time()]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('auth', $auth); + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (isset($param['range_time'])) { + $range_time = explode('到',$param['range_time']); + $param['start_time'] = strtotime(urldecode(trim($range_time[0]))); + $param['end_time'] = strtotime(urldecode(trim($range_time[1]))); + } + else{ + $param['start_time'] = strtotime(urldecode(trim($param['start_time']))); + $param['end_time'] = strtotime(urldecode(trim($param['end_time']))); + } + $step_title_data = isset($param['step_title']) ? $param['step_title'] : ''; + $step_director_uid_data = isset($param['step_director_uid']) ? $param['step_director_uid'] : ''; + $step_uids_data = isset($param['step_uids']) ? $param['step_uids'] : ''; + $step_start_time_data = isset($param['step_start_time']) ? $param['step_start_time'] : ''; + $step_end_time_data = isset($param['step_end_time']) ? $param['step_end_time'] : ''; + $step_cycle_time_data = isset($param['step_cycle_time']) ? $param['step_cycle_time'] : ''; + $step_remark_data = isset($param['step_remark']) ? $param['step_remark'] : ''; + $step_id_data = isset($param['step_id']) ? $param['step_id'] : 0; + + $step = []; + $time_1 = $param['start_time']; + $time_2 = $param['end_time']; + if(!empty($step_title_data)){ + foreach ($step_title_data as $key => $value) { + if (!$value) { + continue; + } + if(!empty($step_cycle_time_data)){ + $step_cycle_time = explode('到',$step_cycle_time_data[$key]); + $start_time = strtotime(urldecode(trim($step_cycle_time[0]))); + $end_time = strtotime(urldecode(trim($step_cycle_time[1]))); + } + else{ + $start_time = strtotime(urldecode(trim($step_start_time_data[$key]))); + $end_time = strtotime(urldecode(trim($step_end_time_data[$key]))); + } + if($start_time<$time_1){ + return to_assign(1, '第'.($key+1).'阶段的开始时间不能小于项目计划周期的开始时间'); + break; + } + if($end_time>$time_2){ + return to_assign(1, '第'.($key+1).'阶段的结束时间不能大于项目计划周期的结束时间'); + break; + } + $item = []; + $item['title'] = $value; + $item['director_uid'] = $step_director_uid_data[$key]; + $item['uids'] = $step_uids_data[$key]; + $item['sort'] = $key; + $item['start_time'] = $start_time; + $item['end_time'] = $end_time; + $item['remark'] = $step_remark_data[$key]; + $item['id'] = $step_id_data[$key]; + $item['create_time'] = time(); + $step[]=$item; + } + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(IndexValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param,$step); + } else { + try { + validate(IndexValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['status'] = 2; + $param['step_sort'] = 0; + $param['admin_id'] = $this->uid; + $this->model->add($param,$step); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + $detail['current_step'] = Db::name('ProjectStep')->where(['project_id' => $id, 'is_current' => 1,'delete_time'=>0])->value('sort'); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/project/project_edit'); + } + return view('edit'); + } + if(is_mobile()){ + return view('qiye@/project/project_add'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['status_name'] = status_name($detail['status']); + $detail['cate'] = Db::name('ProjectCate')->where([['id', '=', $detail['cate_id']]])->value('title'); + $team_admin_ids = Db::name('ProjectUser')->where(['delete_time' => 0,'project_id'=>$id])->column('uid'); + $team_admin_names = Db::name('Admin')->where('id', 'in', $team_admin_ids)->column('name'); + $detail['team_admin_names'] = implode(',', $team_admin_names); + + $tids = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']], ['delete_time', '=', 0]])->column('id'); + $detail['schedules'] = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->count(); + $detail['hours'] = Db::name('Schedule')->where([['tid', 'in', $tids], ['delete_time', '=', 0]])->sum('labor_time'); + $detail['plan_hours'] = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']], ['delete_time', '=', 0]])->sum('plan_hours'); + + $detail['tasks'] = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']],['delete_time', '=', 0]])->count(); + $detail['tasks_finish'] = Db::name('ProjectTask')->where([['project_id', '=', $detail['id']],['status', '>', 2], ['delete_time', '=', 0]])->count(); + $detail['tasks_unfinish'] = $detail['tasks'] - $detail['tasks_finish']; + + $task_map = []; + $task_map[] = ['project_id', '=', $detail['id']]; + $task_map[] = ['delete_time', '=', 0]; + //判断是否是创建者或者负责人 + $role = 0; + if ($detail['admin_id'] == $this->uid) { + $role = 1; //创建人 + } + if ($detail['director_uid'] == $this->uid) { + $role = 2; //负责人 + } + $auth = isAuth($this->uid,'project_admin','conf_1'); + if ($auth == 1) { + $role = 3; //项目管理员 + } + + //相关附件 + $file_array = Db::name('ProjectFile') + ->field('mf.id,mf.topic_id,mf.admin_id,f.id as file_id,f.name,f.filesize,f.filepath,f.fileext,f.create_time,f.admin_id,a.name as admin_name') + ->alias('mf') + ->join('File f', 'mf.file_id = f.id', 'LEFT') + ->join('Admin a', 'mf.admin_id = a.id', 'LEFT') + ->order('mf.create_time desc') + ->where(array('mf.topic_id' => $id, 'mf.module' => 'project')) + ->select()->toArray(); + + //阶段操作记录 + $step_record = Db::name('ProjectStepRecord') + ->field('s.*,a.name as check_name,p.title') + ->alias('s') + ->join('Admin a', 'a.id = s.check_uid', 'LEFT') + ->join('ProjectStep p', 'p.id = s.step_id', 'LEFT') + ->order('s.check_time asc') + ->where(array('s.project_id' => $id)) + ->select()->toArray(); + foreach ($step_record as $kk => &$vv) { + $vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']); + $vv['status_str'] = '提交'; + if($vv['status'] == 1){ + $vv['status_str'] = '确认完成'; + } + else if($vv['status'] == 2){ + $vv['status_str'] = '回退'; + } + if($vv['status'] == 3){ + $vv['status_str'] = '撤销'; + } + if($vv['content'] == ''){ + $vv['content'] = '无'; + } + } + + //当前项目阶段 + $step = Db::name('ProjectStep')->where(array('project_id' => $id, 'is_current' => 1,'delete_time'=>0))->find(); + if(!empty($step)){ + $step['director_name'] = Db::name('Admin')->where(['id' => $step['director_uid']])->value('name'); + $unames = Db::name('Admin')->where([['id','in',$step['uids']]])->column('name'); + $step['unames'] = implode(',',$unames); + } + View::assign('role', $role); + View::assign('file_array', $file_array); + View::assign('step', $step); + View::assign('step_record', $step_record); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/project/view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/project/controller/Step.php b/app/project/controller/Step.php new file mode 100644 index 0000000..661837e --- /dev/null +++ b/app/project/controller/Step.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\project\controller; + +use app\base\BaseController; +use app\project\model\Step as StepModel; +use app\project\validate\StepValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Step extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new StepModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->where('delete_time',0)->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(StepValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(StepValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/project/controller/Task.php b/app/project/controller/Task.php new file mode 100644 index 0000000..02ed724 --- /dev/null +++ b/app/project/controller/Task.php @@ -0,0 +1,319 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\project\controller; + +use app\base\BaseController; +use app\project\model\ProjectTask; +use app\api\model\Comment; +use app\oa\model\Schedule; +use app\api\model\EditLog; +use app\project\validate\TaskCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Task extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new ProjectTask(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + $uid = $this->uid; + $auth = isAuth($uid,'project_admin','conf_1'); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $time = time(); + $time = time(); + $dalay_time = time()+7*86400; + $where = []; + $whereOr = []; + $where[] = ['delete_time', '=', 0]; + if (!empty($param['status'])) { + $where[] = ['status', '=', $param['status']]; + } + if (!empty($param['priority'])) { + $where[] = ['priority', '=', $param['priority']]; + } + if (!empty($param['work_id'])) { + $where[] = ['work_id', '=', $param['work_id']]; + } + if (!empty($param['keywords'])) { + $where[] = ['title|content', 'like', '%' . $param['keywords'] . '%']; + } + if(!empty($param['project_id'])){ + $where[] = ['project_id', '=', $param['project_id']]; + } + if (!empty($param['director_uid'])) { + $where[] = ['director_uid', 'in', $param['director_uid']]; + } + else{ + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',assist_admin_ids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + if (empty($param['director_uid'])) { + $whereOr[] = ['director_uid', '=', $uid]; + } + } + } + if($tab==1){ + //进行中 + $where[] = ['status', '<', 3]; + } + if($tab==2){ + //即将逾期 + $where[] = ['status', '<', 3]; + $where[] = ['end_time','between',[$time,$dalay_time]]; + } + if($tab==3){ + //已逾期 + $where[] = ['status', '<', 3]; + $where[] = ['end_time','<',$time]; + } + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'status asc,id desc' : $param['order']; + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('auth', $auth); + return view(); + } + } + + //添加 + public function add() + { + $param = get_params(); + if (request()->isPost()) { + if (isset($param['end_time'])) { + $param['end_time'] = strtotime(urldecode($param['end_time'])); + } + if (isset($param['status'])) { + if ($param['status'] == 3) { + $param['over_time'] = time(); + $param['done_ratio'] = 100; + } else { + $param['over_time'] = 0; + $param['done_ratio'] = 10; + } + } + if (!empty($param['id']) && $param['id'] > 0) { + $old = $this->model->detail($param['id']); + try { + validate(TaskCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + if(!empty($param['director_uid'])){ + $param['did'] = Db::name('Admin')->where(['id' => $param['director_uid']])->value('did'); + } + $res = ProjectTask::where('id', $param['id'])->strict(false)->field(true)->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + $log=new EditLog(); + $log->edit('Task',$param['id'],$param,$old); + } + return to_assign(); + } else { + try { + validate(TaskCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $param['admin_id'] = $this->uid; + if(empty($param['director_uid'])){ + $param['did'] = $this->did; + } + else{ + $param['did'] = Db::name('Admin')->where(['id' => $param['director_uid']])->value('did'); + } + $insertId = ProjectTask::strict(false)->field(true)->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + $log=new EditLog(); + $log->add('Task',$insertId); + //发消息 + //event('SendMessage',$msg); + } + return to_assign(); + } + } else { + if (isset($param['project_id'])) { + View::assign('project_id', $param['project_id']); + } + return view(); + } + } + + //查看 + public function view() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $detail = (new ProjectTask())->detail($id); + $role_uid = [$detail['admin_id'], $detail['director_uid']]; + $role_edit = 'view'; + if (in_array($this->uid, $role_uid)) { + $role_edit = 'edit'; + } + $project_ids = Db::name('ProjectUser')->where(['uid' => $this->uid, 'delete_time' => 0])->column('project_id'); + $auth = isAuth($this->uid,'project_admin','conf_1'); + if (in_array($detail['project_id'], $project_ids) || in_array($this->uid, $role_uid) || in_array($this->uid, explode(",",$detail['assist_admin_ids'])) || $auth==1) { + $file_array = Db::name('ProjectFile') + ->field('mf.id,mf.topic_id,mf.admin_id,mf.file_id,f.name,f.filesize,f.filepath,f.fileext,f.create_time,f.admin_id,a.name as admin_name') + ->alias('mf') + ->join('File f', 'mf.file_id = f.id', 'LEFT') + ->join('Admin a', 'mf.admin_id = a.id', 'LEFT') + ->order('mf.create_time desc') + ->where(array('mf.topic_id' => $id, 'mf.module' => 'task')) + ->select()->toArray(); + + View::assign('detail', $detail); + View::assign('file_array', $file_array); + View::assign('role_edit', $role_edit); + View::assign('id', $id); + if(is_mobile()){ + return view('qiye@/project/task_view'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>405,'warning'=>'无权限访问']); + } + } + + //删除 + public function del() + { + if (request()->isDelete()) { + $id = get_params("id"); + $auth = isAuth($this->uid,'project_admin','conf_1'); + $detail = Db::name('ProjectTask')->where('id', $id)->find(); + if ($detail['admin_id'] != $this->uid && $auth==0) { + return to_assign(1, "你不是该任务的创建人,无权限删除"); + } + $hour = Db::name('Schedule')->where(['tid' => $id,'delete_time' => 0])->count(); + if($hour>0){ + return to_assign(1, "已有工作日志的任务不支持删除"); + } + if (Db::name('ProjectTask')->where('id', $id)->update(['delete_time' => time()]) !== false) { + return to_assign(0, "删除成功"); + } else { + return to_assign(0, "删除失败"); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + public function hour() { + if (request()->isAjax()) { + $param = get_params(); + $uid = $this->uid; + $auth = isAuth($uid,'project_admin','conf_1'); + $tid = isset($param['tid']) ? $param['tid'] : 0; + $where = []; + $whereOr = []; + + //按时间检索 + if (!empty($param['range_time'])) { + $range_time =explode('至', $param['range_time']); + $where[] = ['a.start_time', 'between',[strtotime($range_time[0]),strtotime($range_time[1])]]; + } + + if ($tid>0) { + $task_ids = Db::name('ProjectTask')->where(['delete_time' => 0, 'project_id' => $param['tid']])->column('id'); + $where[] = ['a.tid', 'in', $task_ids]; + } + else{ + $where[] = ['a.tid', '>', 0]; + if (!empty($param['keywords'])) { + $where[] = ['a.title', 'like', '%' . trim($param['keywords']) . '%']; + } + if($auth == 0){ + if (!empty($param['uid'])) { + $where[] = ['a.admin_id', '=', $param['uid']]; + } else { + $whereOr[] = ['a.admin_id', '=', $uid]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['a.did','in',$dids]; + } + } + } + } + $where[] = ['a.delete_time', '=', 0]; + + $model = new Schedule(); + $list = $model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + View::assign('is_leader', isLeader($this->uid)); + View::assign('role_auth', isAuth($this->uid,'office_admin','conf_1')); + View::assign('hour_auth', valueAuth('office_admin','conf_2')); + return view(); + } + } + + public function comment() { + if (request()->isAjax()) { + $param = get_params(); + $param['admin_id'] = $this->uid; + if (!empty($param['uid'])) { + $where[] = ['admin_id', '=', $param['uid']]; + } + if (!empty($param['keywords'])) { + $where[] = ['content', 'like', '%' . trim($param['keywords']) . '%']; + } + if (!empty($param['module'])) { + $where[] = ['module', '=', $param['module']]; + } + if (!empty($param['topic_id'])) { + $where['topic_id'] = $param['topic_id']; + } + $where[] = ['delete_time', '=', 0]; + $model = new Comment(); + $list = $model->datalist($param,$where); + return table_assign(0, '', $list); + } else { + return view(); + } + } +} diff --git a/app/project/controller/Work.php b/app/project/controller/Work.php new file mode 100644 index 0000000..3299e76 --- /dev/null +++ b/app/project/controller/Work.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\project\controller; + +use app\base\BaseController; +use app\project\model\WorkCate as WorkCateModel; +use app\project\validate\WorkValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Work extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new WorkCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->order('sort asc')->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(WorkValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(WorkValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $type = isset($param['type']) ? $param['type'] : 0; + $this->model->delById($id,$type); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 设置 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } else { + return to_assign(1, "错误的请求"); + } + } + + +} diff --git a/app/project/event.php b/app/project/event.php new file mode 100644 index 0000000..afe5918 --- /dev/null +++ b/app/project/event.php @@ -0,0 +1,8 @@ + [ + //注册监听类 + 'SendMessage' => ['app\listener\SendMessage'], + ], + //'subscribe' => ['app\subscribe\Message'], +]; diff --git a/app/project/middleware.php b/app/project/middleware.php new file mode 100644 index 0000000..c482cdc --- /dev/null +++ b/app/project/middleware.php @@ -0,0 +1,9 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\project\model; +use think\model; +use think\facade\Db; +use app\api\model\EditLog; +class Project extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use ($whereOr) { + if (!empty($whereOr)) + $query->whereOr($whereOr); + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['title'] = $item['name']; + $item->director_name = Db::name('Admin')->where(['id' => $item->director_uid])->value('name'); + $item->department = Db::name('Department')->where(['id' => $item->did])->value('title'); + $item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name'); + $item->status_name = status_name($item->status); + $item->range_time = date('Y-m-d',$item->start_time). ' 至 ' .date('Y-m-d',$item->end_time); + $item->delay = count_days(date("Y-m-d"),date('Y-m-d', $item->end_time)); + $item->cate = Db::name('ProjectCate')->where('id', $item->cate_id)->value('title'); + $task_map = []; + $task_map[] = ['project_id', '=', $item->id]; + $task_map[] = ['delete_time', '=', 0]; + //任务总数 + $item->tasks_total = Db::name('ProjectTask')->where($task_map)->count(); + //已完成任务 + $task_map[] = ['status', '>', 2]; + $item->tasks_finish = Db::name('ProjectTask')->where($task_map)->count(); + //未完成任务 + $item->tasks_unfinish = $item->tasks_total - $item->tasks_finish; + $item->tasks_pensent = "0.00%"; + if ($item->tasks_total > 0) { + $item->tasks_pensent = round($item->tasks_finish / $item->tasks_total * 100, 2) . "%"; + } + $step = Db::name('ProjectStep')->where(['project_id' => $item->id,'is_current' => 1,'delete_time'=>0])->find(); + if(!empty($step)){ + $item->step_director = Db::name('Admin')->where(['id'=>$step['director_uid']])->value('name'); + $item->step = $step['title'] . '『' . $item->step_director. '』'; + } + else{ + $item->step = '-'; + } + $item['create_time'] = to_date($item['create_time'],'Y-m-d H:i:s'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + public function apilist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->field('id,status,name as title')->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param,$step) + { + $insertId = 0; + // 启动事务 + Db::startTrans(); + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + $step_users=[]; + //项目阶段 + foreach ($step as $key => &$value) { + if($key==0){ + $value['is_current'] = 1; + } + else{ + $value['is_current'] = 0; + } + $value['project_id'] = $insertId; + if(!empty($value['director_uid'])){ + $step_users[] = $value['director_uid']; + } + if(!empty($value['uids'])){ + $step_users[] = $value['uids']; + } + } + Db::name('ProjectStep')->strict(false)->field(true)->insertAll($step); + $step_users_str = implode(',',$step_users); + //项目成员 + $project_users = $param['admin_id']; + if (!empty($param['director_uid'])){ + $project_users.=",".$param['director_uid']; + } + if (!empty($param['team_admin_ids'])){ + $project_users.=",".$param['team_admin_ids']; + } + if (!empty($step_users_str)){ + $project_users.=",".$step_users_str; + } + $project_array = explode(",",(string)$project_users); + $project_array = array_unique($project_array); + $project_user_array=[]; + foreach ($project_array as $k => $v) { + if (is_numeric($v)) { + $project_user_array[]=array( + 'uid'=>$v, + 'admin_id'=>$param['admin_id'], + 'project_id'=>$insertId, + 'create_time'=>time(), + ); + } + } + Db::name('ProjectUser')->strict(false)->field(true)->insertAll($project_user_array); + + + add_log('add', $insertId, $param); + $log=new EditLog(); + $log->add('Project',$insertId); + // 提交事务 + Db::commit(); + } catch(\Exception $e) { + // 回滚事务 + Db::rollback(); + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param,$step) + { + // 启动事务 + Db::startTrans(); + try { + $param['update_time'] = time(); + $old = self::find($param['id']); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + $current_step = Db::name('ProjectStep')->where(['project_id' => $param['id'], 'is_current' => 1,'delete_time'=>0])->value('sort'); + //项目阶段 + foreach ($step as $key => $value) { + $value['project_id'] = $param['id']; + if($value['id'] == 0){ + Db::name('ProjectStep')->strict(false)->field(true)->insert($value); + } + else{ + $value['update_time'] = time(); + if($value['sort'] == $current_step){ + $value['is_current'] = 1; + } + else{ + $value['is_current'] = 0; + } + Db::name('ProjectStep')->strict(false)->field(true)->update($value); + } + } + add_log('edit', $param['id'], $param); + $log=new EditLog(); + $log->edit('Project',$param['id'],$param,$old); + // 提交事务 + Db::commit(); + } catch(\Exception $e) { + // 回滚事务 + Db::rollback(); + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + public function apiedit($param) + { + try { + $param['update_time'] = time(); + $old = self::find($param['id']); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param,'项目'); + $log=new EditLog(); + $log->edit('Project',$param['id'],$param,$old); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['admin_name'] = Db::name('Admin')->where(['id' => $info['admin_id']])->value('name'); + $info['director_name'] = Db::name('Admin')->where(['id' => $info['director_uid']])->value('name'); + $info['department'] = Db::name('Department')->where(['id' => $info['did']])->value('title'); + $info['contract_name'] = Db::name('Contract')->where(['id' => $info['contract_id']])->value('name'); + $info['create_time'] = to_date($info['create_time'],'Y-m-d H:i:s'); + $info['update_time'] = to_date($info['update_time'],'Y-m-d H:i:s'); + //项目阶段 + $step_array = Db::name('ProjectStep') + ->field('s.*,a.name as director_name') + ->alias('s') + ->join('Admin a', 'a.id = s.director_uid', 'LEFT') + ->order('s.sort asc') + ->where(array('s.project_id' => $id, 's.delete_time' => 0)) + ->select()->toArray(); + foreach ($step_array as $kk => &$vv) { + $unames = Db::name('Admin')->where([['id','in',$vv['uids']]])->column('name'); + $vv['unames'] = implode(',',$unames); + } + $info['step_array'] = $step_array; + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/project/model/ProjectCate.php b/app/project/model/ProjectCate.php new file mode 100644 index 0000000..a221f0c --- /dev/null +++ b/app/project/model/ProjectCate.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\project\model; +use think\model; +use think\facade\Db; +class ProjectCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/project/model/ProjectDocument.php b/app/project/model/ProjectDocument.php new file mode 100644 index 0000000..f6a38d8 --- /dev/null +++ b/app/project/model/ProjectDocument.php @@ -0,0 +1,64 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace app\Project\model; +use think\facade\Db; +use think\Model; + +class ProjectDocument extends Model +{ + public function datalist($param,$where,$whereOr) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->admin_name = Db::name('Admin')->where(['id' => $item->admin_id])->value('name'); + if ($item->project_id > 0) { + $item->project = Db::name('Project')->where(['id' => $item->project_id])->value('name'); + } + else{ + $item->project = '-'; + } + $item['create_time'] = to_date($item['create_time']); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + //详情 + public function detail($id) + { + $detail = Db::name('ProjectDocument')->where(['id' => $id])->find(); + if (!empty($detail)) { + $detail['project_name'] = '-'; + if ($detail['project_id'] > 0) { + $detail['project_name'] = Db::name('Project')->where(['id' => $detail['project_id']])->value('name'); + } + $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name'); + $detail['times'] = time_trans($detail['create_time']); + $detail['create_time'] = to_date($detail['create_time']); + } + return $detail; + } +} diff --git a/app/project/model/ProjectTask.php b/app/project/model/ProjectTask.php new file mode 100644 index 0000000..11a083e --- /dev/null +++ b/app/project/model/ProjectTask.php @@ -0,0 +1,118 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\model; + +use think\facade\Db; +use think\Model; + +class ProjectTask extends Model +{ + //列表 + function datalist($param=[],$where=[],$whereOr=[]) { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'status asc,id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use ($whereOr) { + if (!empty($whereOr)) + $query->whereOr($whereOr); + }) + ->withoutField('content') + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['director_name'] = '-'; + if ($item['director_uid'] > 0) { + $item['director_name'] = Db::name('Admin')->where(['id' => $item['director_uid']])->value('name'); + } + $assist_admin_names = Db::name('Admin')->where([['id', 'in', $item['assist_admin_ids']]])->column('name'); + if (empty($assist_admin_names)) { + $item['assist_admin_names'] = '-'; + } else { + $item['assist_admin_names'] = implode(',', $assist_admin_names); + } + $item['cate_name'] = Db::name('WorkCate')->where(['id' => $item['work_id']])->value('title'); + if ($item['project_id'] == 0) { + $item['project_name'] = '-'; + } else { + $item['project_name'] = Db::name('Project')->where(['id' => $item['project_id']])->value('name'); + } + $item['delay'] = 0; + if ($item['end_time'] > 0) { + $item['end_time'] = date('Y-m-d', $item['end_time']); + if ($item['over_time'] > 0 && $item['status'] < 4) { + $item['delay'] = count_days($item['end_time'], date('Y-m-d', $item['over_time'])); + } + if ($item['over_time'] == 0 && $item['status'] < 4) { + $item['delay'] = count_days($item['end_time']); + } + } + else{ + $item['delay'] = 9999; + $item['end_time'] = '-'; + } + $item['priority_name'] = priority_name($item['priority']); + $item['status_name'] = status_task_name($item['status']); + return $item; + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + //详情 + public function detail($id) + { + $detail = Db::name('ProjectTask')->where(['id' => $id])->find(); + if (!empty($detail)) { + $detail['project_name'] = ''; + if ($detail['project_id'] > 0) { + $detail['project_name'] = Db::name('Project')->where(['id' => $detail['project_id']])->value('name'); + } + $detail['admin_name'] = Db::name('Admin')->where(['id' => $detail['admin_id']])->value('name'); + $detail['work_hours'] = Db::name('Schedule')->where(['delete_time' => 0, 'tid' => $detail['id']])->sum('labor_time'); + $detail['cate_name'] = Db::name('WorkCate')->where(['id' => $detail['work_id']])->value('title'); + + $detail['director_name']= ''; + if($detail['director_uid'] > 0){ + $detail['director_name'] = Db::name('Admin')->where(['id' => $detail['director_uid']])->value('name'); + } + $detail['schedules'] = Db::name('Schedule')->where(['tid' => $detail['id'], 'delete_time' => 0])->count(); + $detail['logs'] = Db::name('EditLog')->where(['name' => 'Task', 'action_id' => $detail['id']])->count(); + $detail['comments'] = Db::name('Comment')->where(['module' => 'task', 'delete_time' => 0, 'topic_id' => $detail['id']])->count(); + $detail['assist_admin_names'] = ''; + if (!empty($detail['assist_admin_ids'])) { + $assist_admin_names = Db::name('Admin')->where('id', 'in', $detail['assist_admin_ids'])->column('name'); + $detail['assist_admin_names'] = implode(',', $assist_admin_names); + } + $detail['priority_name'] = priority_name($detail['priority']); + $detail['status_name'] = status_task_name($detail['status']); + $detail['times'] = time_trans($detail['create_time']); + $detail['delay'] = 0; + if($detail['end_time']>0){ + $detail['end_time'] = date('Y-m-d', $detail['end_time']); + if ($detail['over_time'] > 0 && $detail['status'] < 4) { + $detail['delay'] = count_days($detail['end_time'], date('Y-m-d', $detail['over_time'])); + } + if ($detail['over_time'] == 0 && $detail['status'] < 4) { + $detail['delay'] = count_days($detail['end_time']); + } + } + else{ + $detail['end_time'] = ''; + } + } + return $detail; + } +} diff --git a/app/project/model/Step.php b/app/project/model/Step.php new file mode 100644 index 0000000..cf7be29 --- /dev/null +++ b/app/project/model/Step.php @@ -0,0 +1,108 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\project\model; +use think\model; +use think\facade\Db; +class Step extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/project/model/WorkCate.php b/app/project/model/WorkCate.php new file mode 100644 index 0000000..9bdcf7c --- /dev/null +++ b/app/project/model/WorkCate.php @@ -0,0 +1,109 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\model; +use think\model; +use think\facade\Db; +class WorkCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/project/validate/CateValidate.php b/app/project/validate/CateValidate.php new file mode 100644 index 0000000..48d0413 --- /dev/null +++ b/app/project/validate/CateValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\validate; +use think\Validate; +use think\facade\Db; + +class CateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('ProjectCate')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/project/validate/DocumentCheck.php b/app/project/validate/DocumentCheck.php new file mode 100644 index 0000000..131aeb0 --- /dev/null +++ b/app/project/validate/DocumentCheck.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\validate; + +use think\Validate; + +class DocumentCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '文档标题不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id'], + ]; +} diff --git a/app/project/validate/IndexValidate.php b/app/project/validate/IndexValidate.php new file mode 100644 index 0000000..d44a98b --- /dev/null +++ b/app/project/validate/IndexValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\validate; +use think\Validate; +use think\facade\Db; + +class IndexValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Project')->where([['name','=',$data['name']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'name' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '项目名称不能为空', + 'name.checkOne' => '同样的项目名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/project/validate/StepValidate.php b/app/project/validate/StepValidate.php new file mode 100644 index 0000000..cc6eebe --- /dev/null +++ b/app/project/validate/StepValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\validate; +use think\Validate; +use think\facade\Db; + +class StepValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('Step')->where([['title','=',$data['title']],['id','<>',$id],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/project/validate/TaskCheck.php b/app/project/validate/TaskCheck.php new file mode 100644 index 0000000..5c7d9b1 --- /dev/null +++ b/app/project/validate/TaskCheck.php @@ -0,0 +1,38 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\validate; + +use think\Validate; + +class TaskCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'plan_hours' => 'require|regex:/^[0-9]+(.[0-9]{1,1})?$/', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '任务主题不能为空', + 'plan_hours.require' => '预估工时不能为空', + 'plan_hours.regex' => '预估工时只能是整数或者1位小数的数字', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'hours' => ['plan_hours'], + 'edit' => ['id'], + ]; +} diff --git a/app/project/validate/WorkValidate.php b/app/project/validate/WorkValidate.php new file mode 100644 index 0000000..b5d56e2 --- /dev/null +++ b/app/project/validate/WorkValidate.php @@ -0,0 +1,43 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\project\validate; +use think\Validate; +use think\facade\Db; + +class WorkValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count = Db::name('WorkCate')->where([['title','=',$data['title']],['id','<>',$id]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/project/view/cate/add.html b/app/project/view/cate/add.html new file mode 100644 index 0000000..09f9fa0 --- /dev/null +++ b/app/project/view/cate/add.html @@ -0,0 +1,45 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              项目分类

              + + + + + + + +
              项目分类名称*排序
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/cate/datalist.html b/app/project/view/cate/datalist.html new file mode 100644 index 0000000..b029162 --- /dev/null +++ b/app/project/view/cate/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/cate/view.html b/app/project/view/cate/view.html new file mode 100644 index 0000000..b31077a --- /dev/null +++ b/app/project/view/cate/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              项目分类详情

              + + + + + + + +
              项目分类名称{$detail.title|default=''}">排序{$detail.sort|default=0}
              +
              +{/block} + \ No newline at end of file diff --git a/app/project/view/document/add.html b/app/project/view/document/add.html new file mode 100644 index 0000000..09d1403 --- /dev/null +++ b/app/project/view/document/add.html @@ -0,0 +1,136 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
              + {eq name="id" value ="0"} +

              新建文档

              + + + + + + + + + + + + + + + +
              文档名称* + + 关联项目* + + +
              +
              相关附件
              +
              + +
              +
              +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              文档内容* + +
              + + {else/} +

              编辑文档

              + + + + + + + + + + + + + + + +
              文档名称* + + + 关联项目* + +
              +
              相关附件
              +
              + +
              +
              +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              文档内容* + +
              + {/eq} +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/app/project/view/document/datalist.html b/app/project/view/document/datalist.html new file mode 100644 index 0000000..65d7214 --- /dev/null +++ b/app/project/view/document/datalist.html @@ -0,0 +1,116 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              +
              + + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/document/view.html b/app/project/view/document/view.html new file mode 100644 index 0000000..0906695 --- /dev/null +++ b/app/project/view/document/view.html @@ -0,0 +1,58 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + + +{/block} + +{block name="body"} +
              +

              {$detail.title}

              +
              + {$detail.admin_name}发表于:{$detail.create_time}关联项目:{$detail.project_name} +
              +
              + {$detail.content|raw} +
              + {notempty name="$detail.file_ids"} +
              +

              相关附件

              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              + {/notempty} + +{/block} + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/project/view/index/add.html b/app/project/view/index/add.html new file mode 100644 index 0000000..cd2f318 --- /dev/null +++ b/app/project/view/index/add.html @@ -0,0 +1,266 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +

              新建项目

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              项目名称*项目类别* + +
              项目经理* + + + + 归属部门*始止日期*
              项目成员* + + +
              关联合同 + + +
              项目简介 + +
              + 项目阶段* + + 添加阶段 +
              + + + + + + + + + + + {volist name = ":get_base_data('step')" id="vo" key="k"} + + + + + + + + + + {/volist} +
              序号阶段名称阶段负责人阶段成员阶段周期阶段说明操作
              {$k} 阶段 +
              + +
              +
              +
              + + + + + + + +
              + 上移 + 下移 + 删除 +
              +
              +
              +
              + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/index/datalist.html b/app/project/view/index/datalist.html new file mode 100644 index 0000000..5ea2d36 --- /dev/null +++ b/app/project/view/index/datalist.html @@ -0,0 +1,154 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + +
              +
              + + +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/index/edit.html b/app/project/view/index/edit.html new file mode 100644 index 0000000..04f34e4 --- /dev/null +++ b/app/project/view/index/edit.html @@ -0,0 +1,297 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              编辑项目

              + + + + + + + + + + + + + + + + + + + + + + + + {lt name="$detail.status" value="3"} + + + + + + + {/lt} +
              项目名称*项目类别* + +
              项目经理* + + + + 归属部门*始止日期*
              关联合同 + + +
              项目简介 + +
              项目阶段* + 添加阶段
              + + + + + + + + + + + {volist name="$detail.step_array" id="vo" key="k"} + {egt name="$vo.sort" value="$detail.current_step"} + + + + + + + + + + {else/} + + + + + + + + + + {/egt} + {/volist} +
              序号阶段名称阶段负责人阶段成员阶段周期阶段说明操作
              {$k} 阶段 +
              + +
              +
              +
              + + + + + + + +
              + 上移 + 下移 + 删除 +
              +
              {$k} 阶段 + + + + + + + + - +
              +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/index/view.html b/app/project/view/index/view.html new file mode 100644 index 0000000..03bd88a --- /dev/null +++ b/app/project/view/index/view.html @@ -0,0 +1,552 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              + {$detail.name} + {gt name="$role" value="0"} + {eq name="$detail.status" value="4"} + 开启 + {else/} + 关闭 + {/eq} + {/gt} +

              +
              + #T{$detail.id} + {$detail.admin_name} + 创建于{$detail.create_time}{gt name="$detail.update_time" value="0"},最近更新于 {$detail.update_time}{/gt} +
              +
              +
                +
              • 项目概览
              • +
              • 项目任务
              • +
              • 工作记录
              • +
              • 项目文档
              • +
              • 项目人员
              • +
              • 项目动态
              • +
              • 项目评论
              • +
              +
              +
              + {include file="/index/view_overview" /} +
              + +
              + {include file="/index/view_task" /} +
              + +
              + {include file="/index/view_schedule" /} +
              + +
              + {include file="/index/view_document" /} +
              + +
              + {include file="/index/view_user" /} +
              + +
              + {include file="/index/view_log" /} +
              + +
              + {include file="/index/view_comment" /} +
              +
              +
              +
              +{/block} + + +{block name="script"} + + +{/block} + \ No newline at end of file diff --git a/app/project/view/index/view_comment.html b/app/project/view/index/view_comment.html new file mode 100644 index 0000000..05a7986 --- /dev/null +++ b/app/project/view/index/view_comment.html @@ -0,0 +1,6 @@ +
              +
              + +
              +
              +
              \ No newline at end of file diff --git a/app/project/view/index/view_document.html b/app/project/view/index/view_document.html new file mode 100644 index 0000000..9772c61 --- /dev/null +++ b/app/project/view/index/view_document.html @@ -0,0 +1,86 @@ +
              +
              +
              + + \ No newline at end of file diff --git a/app/project/view/index/view_log.html b/app/project/view/index/view_log.html new file mode 100644 index 0000000..18eacc3 --- /dev/null +++ b/app/project/view/index/view_log.html @@ -0,0 +1,9 @@ +
              +
              +
              + \ No newline at end of file diff --git a/app/project/view/index/view_overview.html b/app/project/view/index/view_overview.html new file mode 100644 index 0000000..5badffb --- /dev/null +++ b/app/project/view/index/view_overview.html @@ -0,0 +1,415 @@ + + + + + + + + + + + + + + + + + + {gt name="$detail.contract_id" value="0"} + + + + + {/gt} + {notempty name="$detail.content"} + + + + + {/notempty} +
              项目状态『{$detail.status_name}』项目类别{$detail.cate}始止日期{$detail.start_time|date='Y-m-d'} 到 {$detail.end_time|date='Y-m-d'}所属部门{$detail.department|default='-'}
              项目经理{$detail.director_name}项目成员{$detail.team_admin_names|default='-'}
              关联合同{$detail.contract_name}
              项目简介{$detail.content}
              + +
              +
              + 项目阶段 +
              +
              +
              + {volist name="$detail.step_array" id="vo"} +
              +
              + + + +
              +
              +
              {$vo.title} {$vo.director_name|default=''}
              +
              {$vo.start_time|date='Y-m-d'} 到 {$vo.end_time|date='Y-m-d'}
              +
              +
              +
              + {/volist} +
              +
              + {notempty name="$step"} +
              +
              + 当前阶段:{$step.title} + 阶段周期:{$step.start_time|date='Y-m-d'} 到 {$step.end_time|date='Y-m-d'} + 负责人:{$step.director_name} + {eq name="$step.director_uid" value="$login_admin.id"} + 确认完成 + 退回上一阶段 + {/eq} +
              + {notempty name="$step.unames"} +
              + 阶段成员:{$step.unames|default=''} +
              + {/notempty} + {notempty name="$step.remark"} +
              + 阶段说明:{$step.remark|default=''} +
              + {/notempty} +
              + {/notempty} +
              +

              阶段流转记录

              + {notempty name="$step_record"} +
                + {volist name="$step_record" id="vo"} +
              • + + {if ($vo.status == 1)} +

                {$vo.check_time_str}{$vo.check_name}{$vo.status_str}了『{$vo.title}』的工作。操作意见:{$vo.content|default='-'}

                + {else /} +

                {$vo.check_time_str}{$vo.check_name}在阶段『{$vo.title}』执行了{$vo.status_str}操作。操作意见:{$vo.content|default='-'}

                + {/if} +
              • + {/volist} +
              + {else/} +
              暂无阶段流转记录
              + {/notempty} +
              +
              + +
              +
              + 项目附件 + +
              +
              + {volist name="file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {empty name="$file_array" } +
              暂无项目附件
              + {/empty} +
              +
              + +
              +
              +
              +
              + 项目概况 +
              +
              +
              +
              任务 (已完成/全部)
              +
              {$detail.tasks_finish} / {$detail.tasks}
              +
              +
              +
              +
              +
              项目工时 (实际/计划)
              +
              {$detail.hours} / {$detail.plan_hours}
              +
              +
              +
              +
              +
              工作记录
              +
              {$detail.schedules}
              +
              +
              +
              +
              +
              +
              +
              + 项目进度 +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              + + +
              +
              + 项目燃尽图 +
              +
              +
              +
              +
              +
              + +
              +
              +
              +
              + 任务分配情况 +
              +
              +
              +
              +
              +
              +
              +
              +
              + 工时登记情况 +
              +
              +
              +
              +
              +
              +
              + \ No newline at end of file diff --git a/app/project/view/index/view_schedule.html b/app/project/view/index/view_schedule.html new file mode 100644 index 0000000..2bf700b --- /dev/null +++ b/app/project/view/index/view_schedule.html @@ -0,0 +1,64 @@ +
              +
              +
              + + \ No newline at end of file diff --git a/app/project/view/index/view_task.html b/app/project/view/index/view_task.html new file mode 100644 index 0000000..63dc8bd --- /dev/null +++ b/app/project/view/index/view_task.html @@ -0,0 +1,64 @@ +
              +
              +
              + + \ No newline at end of file diff --git a/app/project/view/index/view_user.html b/app/project/view/index/view_user.html new file mode 100644 index 0000000..2576b3d --- /dev/null +++ b/app/project/view/index/view_user.html @@ -0,0 +1,116 @@ +
              +
              +
              + + \ No newline at end of file diff --git a/app/project/view/step/add.html b/app/project/view/step/add.html new file mode 100644 index 0000000..01e774b --- /dev/null +++ b/app/project/view/step/add.html @@ -0,0 +1,45 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              项目步骤

              + + + + + + + +
              项目步骤名称*排序
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/step/datalist.html b/app/project/view/step/datalist.html new file mode 100644 index 0000000..d27423f --- /dev/null +++ b/app/project/view/step/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/step/view.html b/app/project/view/step/view.html new file mode 100644 index 0000000..9a83abb --- /dev/null +++ b/app/project/view/step/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              项目步骤详情

              + + + + + + + +
              项目步骤名称{$detail.title|default=''}">排序{$detail.sort|default=0}
              +
              +{/block} + \ No newline at end of file diff --git a/app/project/view/task/add.html b/app/project/view/task/add.html new file mode 100644 index 0000000..318569c --- /dev/null +++ b/app/project/view/task/add.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} +{block name="body"} +
              +

              新建任务

              + + + + + + + + + + + + + + + + + + + {empty name="$project_id"} + + + + + {else/} + + + {/empty} + + + + + +
              任务主题*任务优先级* + +
              工作类型* + + 预估工时*预计结束日期*
              负责人 + + + 协作人 + + + 关联项目 + + + 协作人 + + + +
              详细描述* + +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/app/project/view/task/comment.html b/app/project/view/task/comment.html new file mode 100644 index 0000000..28640a8 --- /dev/null +++ b/app/project/view/task/comment.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +
              +
              + + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/task/datalist.html b/app/project/view/task/datalist.html new file mode 100644 index 0000000..70477dd --- /dev/null +++ b/app/project/view/task/datalist.html @@ -0,0 +1,146 @@ +{extend name="../../base/view/common/base" /} + +{block name="style"} + +{/block} +{block name="body"} +
              +
              +
              +
              + +
              +
              + +
              +
              + +
              +
              + + +
              +
              + + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/task/hour.html b/app/project/view/task/hour.html new file mode 100644 index 0000000..5f1e3a7 --- /dev/null +++ b/app/project/view/task/hour.html @@ -0,0 +1,234 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +
              +
              + +
              +
              + + +
              +
              + +
              +
              + + +
              +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/task/view.html b/app/project/view/task/view.html new file mode 100644 index 0000000..dd6259e --- /dev/null +++ b/app/project/view/task/view.html @@ -0,0 +1,255 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} +{block name="body"} +
              +

              任务详情

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              任务主题{$detail.title|default=''}工作类型{$detail.cate_name|default='-'}
              负责人员{$detail.director_name|default=''}协作人{$detail.assist_admin_names|default=''}
              优先级{$detail.priority_name}关联项目{$detail.project_name|default='-'}
              完成进度{$detail.done_ratio|default='0'}%估计结束日期{$detail.end_time|date='Y-m-d'}{gt name="$detail.delay" value="0"}『逾期 {$detail.delay}天』{/gt}估计工作量(工时){$detail.plan_hours|default=''}
              任务状态{$detail.status_name}实际完成日期{eq name="$detail.over_time" value="0"}-{else/}{$detail.over_time|date='Y-m-d'}{/eq}实际工时{eq name="$detail.work_hours" value="0"}-{else/}{$detail.work_hours}{/eq}
              相关附件 +
              + + {notempty name="$file_array"} + {volist name="$file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              任务描述
              {$detail.content|raw}
              + + +
              +
                +
              • 工作记录({$detail.schedules})
              • +
              • 员工评论(0)
              • +
              • 操作日志(0)
              • +
              +
              +
              +
              +
              +
              +
              + +
              +
              +
              +
              +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} \ No newline at end of file diff --git a/app/project/view/work/datalist.html b/app/project/view/work/datalist.html new file mode 100644 index 0000000..ea199e1 --- /dev/null +++ b/app/project/view/work/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/project/view/work/view.html b/app/project/view/work/view.html new file mode 100644 index 0000000..9bb19a5 --- /dev/null +++ b/app/project/view/work/view.html @@ -0,0 +1,16 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              工作类型详情

              + + + + + + + +
              工作类型名称{$detail.title|default=''}">排序{$detail.sort|default=0}
              +
              +{/block} + \ No newline at end of file diff --git a/app/provider.php b/app/provider.php new file mode 100644 index 0000000..aee9966 --- /dev/null +++ b/app/provider.php @@ -0,0 +1,7 @@ + '\\app\\exception\\Http', +]; diff --git a/app/user/common.php b/app/user/common.php new file mode 100644 index 0000000..e7e2f8a --- /dev/null +++ b/app/user/common.php @@ -0,0 +1,14 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +use think\facade\Db; diff --git a/app/user/controller/Api.php b/app/user/controller/Api.php new file mode 100644 index 0000000..1e9d61b --- /dev/null +++ b/app/user/controller/Api.php @@ -0,0 +1,82 @@ + ++----------------------------------------------------------------------------------------------- +*/ +declare (strict_types = 1); +namespace app\user\controller; + +use app\api\BaseController; +use app\user\model\Department as DepartmentModel; +use think\facade\Db; + +class Api extends BaseController +{ + //删除档案记录相关 + public function del_profiles() + { + $id = get_params("id"); + if (Db::name('AdminProfiles')->where('id', $id)->update(['delete_time'=>time()]) !== false) { + return to_assign(0, "删除成功"); + } else { + return to_assign(1, "删除失败"); + } + } + + //一键调部门 + public function change_check() + { + $id = get_params("id"); + $data['id'] = $id; + $data['connect_time'] = time(); + $data['status'] = 2; + $detail = Db::name('DepartmentChange')->where('id', $id)->find(); + if (Db::name('DepartmentChange')->update($data) !== false) { + Db::name('Admin')->where('id', $detail['uid'])->update(['did' => $detail['to_did']]); + Db::name('DepartmentAdmin')->where(['admin_id'=>$detail['uid'],'department_id'=>$detail['to_did']])->delete(); + $info = Db::name('Admin')->where('id', $detail['uid'])->find(); + $model = new DepartmentModel(); + $auth_dids = $model->get_auth_departments($info); + $son_dids = $model->get_son_departments($info); + Db::name('Admin')->where('id',$detail['uid'])->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]); + return to_assign(0, "操作成功"); + } else { + return to_assign(1, "操作失败"); + } + } + + //一键交接资料 + public function leave_check() + { + $id = get_params("id"); + $data['id'] = $id; + $data['connect_time'] = time(); + $data['status'] = 2; + $detail = Db::name('PersonalQuit')->where('id', $id)->find(); + $uid = $detail['uid']; + $connect_uid = $detail['connect_id']; + if (Db::name('PersonalQuit')->update($data) !== false) { + //项目负责人 + Db::name('Project')->where([['director_uid','=',$uid],['status','<',3]])->update(['director_uid' => $connect_uid]); + //任务负责人 + Db::name('ProjectTask')->where([['director_uid','=',$uid],['status','<',3]])->update(['director_uid' => $connect_uid]); + //客户所属人 + $did = Db::name('Admin')->where('id', $connect_uid)->value('did'); + Db::name('Customer')->where([['belong_uid','=',$uid]])->update(['belong_uid' => $connect_uid,'belong_did'=>$did]); + //合同 + Db::name('Contract')->where([['admin_id','=',$uid],['check_status','<',3]])->update(['admin_id' => $connect_uid]); + Db::name('Admin')->where('id', $uid)->update(['status' => 2]); + add_log('hand', $id); + return to_assign(0, "交接成功"); + } else { + return to_assign(1, "交接失败"); + } + } +} diff --git a/app/user/controller/Basic.php b/app/user/controller/Basic.php new file mode 100644 index 0000000..95ca53b --- /dev/null +++ b/app/user/controller/Basic.php @@ -0,0 +1,93 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\validate\BasicUserCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Basic extends BaseController +{ + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + if (!empty($param['types'])) { + $where[] = ['types', '=', $param['types']]; + } + $list = Db::name('BasicUser')->where($where)->order('create_time asc')->select(); + return to_assign(0, '', $list); + } else { + return view(); + } + } + //新建编辑 + public function add() + { + if (request()->isAjax()) { + $param = get_params(); + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(BasicUserCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $res = Db::name('BasicUser')->strict(false)->field('title,types,id,update_time')->update($param); + if ($res) { + add_log('edit', $param['id'], $param); + } + return to_assign(); + } else { + try { + validate(BasicUserCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $insertId = Db::name('BasicUser')->strict(false)->field('title,types,id,create_time')->insertGetId($param); + if ($insertId) { + add_log('add', $insertId, $param); + } + return to_assign(); + } + } + } + + //设置 + public function set() + { + $param = get_params(); + $res = Db::name('BasicUser')->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } +} diff --git a/app/user/controller/Blacklist.php b/app/user/controller/Blacklist.php new file mode 100644 index 0000000..8be4292 --- /dev/null +++ b/app/user/controller/Blacklist.php @@ -0,0 +1,122 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\Blacklist as BlacklistModel; +use app\user\validate\BlacklistValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Blacklist extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new BlacklistModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $where=[]; + $whereOr=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|title', 'like', '%' . $param['keywords'] . '%']; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(BlacklistValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(BlacklistValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + View::assign('detail', $detail); + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + if (request()->isDelete()) { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/user/controller/Care.php b/app/user/controller/Care.php new file mode 100644 index 0000000..2fd95d2 --- /dev/null +++ b/app/user/controller/Care.php @@ -0,0 +1,136 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\Care as CareModel; +use app\user\validate\CareValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Care extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CareModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|thing|remark', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['status'])) { + $where[] = ['status', '=', $param['status']]; + } + if (!empty($param['care_cate'])) { + $where[] = ['care_cate', '=', $param['care_cate']]; + } + if (!empty($param['uid'])) { + $where[] = ['uid', '=', $param['uid']]; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['care_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['care_time'] = isset($param['care_time']) ? strtotime($param['care_time']) : 0; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(CareValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(CareValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['cate'] = Db::name('CareCate')->where('id',$detail['care_cate'])->value('title'); + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + $detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name'); + View::assign('detail', $detail); + return view(); + } + else{ + throw new \think\exception\HttpException(404, '找不到页面'); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $this->model->delById($id); + } + +} diff --git a/app/user/controller/Carecate.php b/app/user/controller/Carecate.php new file mode 100644 index 0000000..08caa95 --- /dev/null +++ b/app/user/controller/Carecate.php @@ -0,0 +1,105 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\CareCate as CareCateModel; +use app\user\validate\CareCateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Carecate extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new CareCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(CareCateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(CareCateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + } + return view(); + } + } + /** + * 设置 + */ + public function set() + { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + +} diff --git a/app/user/controller/Department.php b/app/user/controller/Department.php new file mode 100644 index 0000000..d620e7c --- /dev/null +++ b/app/user/controller/Department.php @@ -0,0 +1,116 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\Department as DepartmentModel; +use app\user\validate\DepartmentCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Department extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $list = Db::name('Department')->order('sort desc,id asc')->select()->toArray(); + foreach ($list as $key => &$v) { + $admin_array = Db::name('Admin')->where([['id','in',$v['leader_ids']]])->column('name'); + $v['leader'] = split_array_field($admin_array); + } + $res = generateTree($list); + return to_assign(0, '', $res); + } else { + return view(); + } + } + + //添加部门 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if ($param['id'] > 0) { + try { + validate(DepartmentCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['update_time'] = time(); + $department_array = get_department_son($param['id']); + if (in_array($param['pid'], $department_array)) { + return to_assign(1, '上级部门不能是该部门本身或其下属部门'); + } else { + Db::name('Department')->strict(false)->field(true)->update($param); + $model = new DepartmentModel(); + $model->update_auth_dids_son_dids(); + add_log('edit', $param['id'], $param); + return to_assign(); + } + } else { + try { + validate(DepartmentCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $did = Db::name('Department')->strict(false)->field(true)->insertGetId($param); + $model = new DepartmentModel(); + $model->update_auth_dids_son_dids(); + add_log('add', $did, $param); + return to_assign(); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $pid = isset($param['pid']) ? $param['pid'] : 0; + $department = set_recursion(get_department()); + if ($id > 0) { + $detail = Db::name('Department')->where(['id' => $id])->find(); + //获取子部门 + $department_array = get_department_son($id); + $users = get_department_employee($id); + View::assign('users', $users); + View::assign('detail', $detail); + } + View::assign('department', $department); + View::assign('pid', $pid); + View::assign('id', $id); + return view(); + } + } + + //删除 + public function delete() + { + $id = get_params("id"); + $count = Db::name('Department')->where([['pid', '=', $id], ['status', '>=', 0]])->count(); + if ($count > 0) { + return to_assign(1, "该部门下还有子部门,无法删除"); + } + $users = Db::name('Admin')->where([['did', '=', $id], ['status', '>=', 0]])->count(); + if ($users > 0) { + return to_assign(1, "该部门下还有员工,无法删除"); + } + if (Db::name('Department')->delete($id) !== false) { + add_log('delete', $id); + return to_assign(0, "删除部门成功"); + } else { + return to_assign(1, "删除失败"); + } + } +} diff --git a/app/user/controller/Files.php b/app/user/controller/Files.php new file mode 100644 index 0000000..dfb16e2 --- /dev/null +++ b/app/user/controller/Files.php @@ -0,0 +1,349 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\Admin as AdminList; +use think\facade\Db; +use think\facade\View; + +class Files extends BaseController +{ + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $whereOr = array(); + if (!empty($param['keywords'])) { + $where[] = ['a.id|a.username|a.name|a.nickname|a.mobile|a.desc', 'like', '%' . $param['keywords'] . '%']; + } + if (isset($param['status']) && $param['status']!='') { + $where[] = ['a.status', '=', $param['status']]; + } + else{ + $where[] = ['a.status', '=', 1]; + } + if (!empty($param['political'])) { + $where[] = ['a.political', '=', $param['political']]; + } + if (!empty($param['position_name'])) { + $where[] = ['a.position_name', '=', $param['position_name']]; + } + if (!empty($param['position_rank'])) { + $where[] = ['a.position_rank', '=', $param['position_rank']]; + } + if (!empty($param['did'])) { + $admin_array = Db::name('DepartmentAdmin')->where('department_id',$param['did'])->column('admin_id'); + $map1=[ + ['a.id','in',$admin_array], + ]; + $map2=[ + ['a.did', '=', $param['did']], + ]; + $whereOr =[$map1,$map2]; + } + $where[] = ['a.id', '>', 1]; + $list = AdminList::alias('a') + ->with('departments') + ->field('a.*,p.title as position,d.title as department') + ->join('Department d', 'd.id = a.did','left') + ->join('Position p', 'p.id = a.position_id','left') + ->where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->paginate(intval($this->pageSize)) + ->order('a.id desc') + ->each(function ($item, $key) { + //遍历次要部门数据 + $departments = $item->departments->toArray(); + if(empty($departments)){ + $item['departments'] = '-'; + } + else{ + $item['departments'] = split_array_field($departments,'title'); + } + if($item['political']==1){ + $item['political_str'] = '中共党员'; + } + else if($item['political']==2){ + $item['political_str'] = '团员'; + } + else{ + $item['political_str'] = '-'; + } + $item['entry_time'] = to_date($item['entry_time'],'Y-m-d'); + $item['birthday_str'] = to_date($item['birthday'],'Y-m-d'); + $item['last_login_time'] = to_date('Y-m-d H:i', $item->last_login_time); + $item['last_login_ip'] = empty($item['last_login_ip']) ? '-' : $item['last_login_ip']; + return $item; + }); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //添加 + public function add() + { + $param = get_params(); + $id = isset($param['id'])?$param['id']:0; + if (request()->isAjax()) { + if($id == 1){ + return to_assign(1, '超级管理员信息不支持编辑'); + } + $res = Db::name('Admin')->where(['id' => $id])->strict(false)->field(true)->update($param); + if($res!==false){ + + //教育经历 + $edu_start_time = isset($param['edu_start_time']) ? $param['edu_start_time'] : ''; + $edu_end_time = isset($param['edu_end_time']) ? $param['edu_end_time'] : ''; + $edu_title = isset($param['edu_title']) ? $param['edu_title'] : ''; + $edu_speciality = isset($param['edu_speciality']) ? $param['edu_speciality'] : ''; + $edu_education = isset($param['edu_education']) ? $param['edu_education'] : ''; + $edu_remark = isset($param['edu_remark']) ? $param['edu_remark'] : ''; + $edu_id = isset($param['edu_id']) ? $param['edu_id'] : 0; + + if ($edu_start_time) { + foreach ($edu_start_time as $key => $value) { + if (!$value && $value !=' ') { + continue; + } + $data = []; + $data['start_time'] = $value; + $data['end_time'] = $edu_end_time[$key]; + $data['title'] = $edu_title[$key]; + $data['speciality'] = $edu_speciality[$key]; + $data['education'] = $edu_education[$key]; + $data['remark'] = $edu_remark[$key]; + $data['admin_id'] = $id; + $data['types'] = 1; + if($edu_id[$key]>0){ + $data['id'] = $edu_id[$key]; + $data['update_time'] = time(); + Db::name('AdminProfiles')->strict(false)->field(true)->update($data); + } + else{ + $data['create_uid'] = $this->uid; + $data['create_time'] = time(); + $data['update_time'] = time(); + $eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data); + } + } + } + + + //工作经历 + $work_start_time = isset($param['work_start_time']) ? $param['work_start_time'] : ''; + $work_end_time = isset($param['work_end_time']) ? $param['work_end_time'] : ''; + $work_title = isset($param['work_title']) ? $param['work_title'] : ''; + $work_position = isset($param['work_position']) ? $param['work_position'] : ''; + $work_remark = isset($param['work_remark']) ? $param['work_remark'] : ''; + $work_id = isset($param['work_id']) ? $param['work_id'] : 0; + + if ($work_start_time) { + foreach ($work_start_time as $key => $value) { + if (!$value && $value !=' ') { + continue; + } + $data = []; + $data['start_time'] = $value; + $data['end_time'] = $work_end_time[$key]; + $data['title'] = $work_title[$key]; + $data['position'] = $work_position[$key]; + $data['remark'] = $work_remark[$key]; + $data['admin_id'] = $id; + $data['types'] = 2; + if($work_id[$key]>0){ + $data['id'] = $work_id[$key]; + $data['update_time'] = time(); + Db::name('AdminProfiles')->strict(false)->field(true)->update($data); + } + else{ + $data['create_uid'] = $this->uid; + $data['create_time'] = time(); + $data['update_time'] = time(); + $eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data); + } + } + } + + //相关证书 + $certificate_start_time = isset($param['certificate_start_time']) ? $param['certificate_start_time'] : ''; + $certificate_title = isset($param['certificate_title']) ? $param['certificate_title'] : ''; + $certificate_authority = isset($param['certificate_authority']) ? $param['certificate_authority'] : ''; + $certificate_remark = isset($param['certificate_remark']) ? $param['certificate_remark'] : ''; + $certificate_id = isset($param['certificate_id']) ? $param['certificate_id'] : 0; + + if ($certificate_start_time) { + foreach ($certificate_start_time as $key => $value) { + if (!$value && $value !=' ') { + continue; + } + $data = []; + $data['start_time'] = $value; + $data['title'] = $certificate_title[$key]; + $data['authority'] = $certificate_authority[$key]; + $data['remark'] = $certificate_remark[$key]; + $data['admin_id'] = $id; + $data['types'] = 3; + if($certificate_id[$key]>0){ + $data['id'] = $certificate_id[$key]; + $data['update_time'] = time(); + Db::name('AdminProfiles')->strict(false)->field(true)->update($data); + } + else{ + $data['create_uid'] = $this->uid; + $data['create_time'] = time(); + $data['update_time'] = time(); + $eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data); + } + } + } + + //计算机技能 + $skills_title = isset($param['skills_title']) ? $param['skills_title'] : ''; + $skills_know = isset($param['skills_know']) ? $param['skills_know'] : ''; + $skills_remark = isset($param['skills_remark']) ? $param['skills_remark'] : ''; + $skills_id = isset($param['skills_id']) ? $param['skills_id'] : 0; + + if ($skills_title) { + foreach ($skills_title as $key => $value) { + if (!$value && $value !=' ') { + continue; + } + $data = []; + $data['title'] = $skills_title[$key]; + $data['know'] = $skills_know[$key]; + $data['remark'] = $skills_remark[$key]; + $data['admin_id'] = $id; + $data['types'] = 4; + if($skills_id[$key]>0){ + $data['id'] = $skills_id[$key]; + $data['update_time'] = time(); + Db::name('AdminProfiles')->strict(false)->field(true)->update($data); + } + else{ + $data['create_uid'] = $this->uid; + $data['create_time'] = time(); + $data['update_time'] = time(); + $eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data); + } + } + } + + //语言能力 + $language_title = isset($param['language_title']) ? $param['language_title'] : ''; + $language_know = isset($param['language_know']) ? $param['language_know'] : ''; + $language_remark = isset($param['language_remark']) ? $param['language_remark'] : ''; + $language_id = isset($param['language_id']) ? $param['language_id'] : 0; + + if ($language_title) { + foreach ($language_title as $key => $value) { + if (!$value && $value !=' ') { + continue; + } + $data = []; + $data['title'] = $language_title[$key]; + $data['know'] = $language_know[$key]; + $data['remark'] = $language_remark[$key]; + $data['admin_id'] = $id; + $data['types'] = 5; + if($language_id[$key]>0){ + $data['id'] = $language_id[$key]; + $data['update_time'] = time(); + Db::name('AdminProfiles')->strict(false)->field(true)->update($data); + } + else{ + $data['create_uid'] = $this->uid; + $data['create_time'] = time(); + $data['update_time'] = time(); + $eid = Db::name('AdminProfiles')->strict(false)->field(true)->insertGetId($data); + } + } + } + + add_log('edit', $id, $param); + return to_assign(); + } + else{ + return to_assign(1, '提交失败'); + } + } else { + $detail = get_admin($id); + $detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name'); + $detail['position'] = Db::name('Position')->where('id',$detail['position_id'])->value('title'); + $detail['department'] = Db::name('Department')->where('id',$detail['did'])->value('title'); + $department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id'); + $department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title'); + $detail['department_names'] = implode(',',$department_names); + + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + + $edu = Db::name('AdminProfiles')->where(['types'=>1,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $work = Db::name('AdminProfiles')->where(['types'=>2,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $certificate = Db::name('AdminProfiles')->where(['types'=>3,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $skills = Db::name('AdminProfiles')->where(['types'=>4,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $language = Db::name('AdminProfiles')->where(['types'=>5,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + View::assign('edu', $edu); + View::assign('work', $work); + View::assign('skills', $skills); + View::assign('certificate', $certificate); + View::assign('language', $language); + View::assign('detail', $detail); + View::assign('id', $id); + return view(); + } + } + + //查看 + public function view() + { + $param = get_params(); + $id = isset($param['id'])?$param['id']:0; + $detail = get_admin($id); + $detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name'); + $detail['position'] = Db::name('Position')->where('id',$detail['position_id'])->value('title'); + $detail['department'] = Db::name('Department')->where('id',$detail['did'])->value('title'); + $department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id'); + $department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title'); + $detail['department_names'] = implode(',',$department_names); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + $edu = Db::name('AdminProfiles')->where(['types'=>1,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $work = Db::name('AdminProfiles')->where(['types'=>2,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $certificate = Db::name('AdminProfiles')->where(['types'=>3,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $skills = Db::name('AdminProfiles')->where(['types'=>4,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + $language = Db::name('AdminProfiles')->where(['types'=>5,'admin_id'=>$id,'delete_time'=>0])->select()->toArray(); + View::assign('edu', $edu); + View::assign('work', $work); + View::assign('skills', $skills); + View::assign('certificate', $certificate); + View::assign('language', $language); + View::assign('detail', $detail); + View::assign('id', $id); + return view(); + } +} diff --git a/app/user/controller/Laborcontract.php b/app/user/controller/Laborcontract.php new file mode 100644 index 0000000..5eb120e --- /dev/null +++ b/app/user/controller/Laborcontract.php @@ -0,0 +1,290 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\LaborContract as LaborContractModel; +use app\user\validate\LaborContractValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Laborcontract extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new LaborContractModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['status'])) { + $where[] = ['status', '=', $param['status']]; + } + if (!empty($param['types'])) { + $where[] = ['types', '=', $param['types']]; + } + if (!empty($param['cate'])) { + $where[] = ['cate', '=', $param['cate']]; + } + if (!empty($param['properties'])) { + $where[] = ['properties', '=', $param['properties']]; + } + if (!empty($param['uid'])) { + $where[] = ['uid', '=', $param['uid']]; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['sign_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + $this->model::where([['end_time','<',time()],['status','=',1]])->update(['status'=>2]); + View::assign('cate', $this->model::$laborcontract_cate); + View::assign('types', $this->model::$laborcontract_types); + View::assign('properties', $this->model::$laborcontract_properties); + View::assign('status', $this->model::$laborcontract_status); + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['sign_time'] = isset($param['sign_time']) ? strtotime($param['sign_time']) : 0; + $param['start_time'] = isset($param['start_time']) ? strtotime($param['start_time']) : 0; + $param['end_time'] = isset($param['end_time']) ? strtotime($param['end_time']) : 0; + $param['trial_end_time'] = isset($param['trial_end_time']) ? strtotime($param['trial_end_time']) : 0; + if($param['end_time']<=$param['start_time']){ + return to_assign(1,'合同失效时间需要大于开始时间'); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(LaborContractValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if($param['end_time']time() && $param['status']==2){ + $param['status'] = 1; + } + $this->model->edit($param); + } else { + try { + validate(LaborContractValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + if($param['end_time']uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + $cate_id = isset($param['cate_id']) ? $param['cate_id'] : 0; + View::assign('properties', $this->model::$laborcontract_properties); + if ($id>0) { + $detail = $this->model->getById($id); + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + View::assign('detail', $detail); + return view('edit'); + } + $cate_title=''; + if($cate_id>0){ + $cate_title = $this->model::$laborcontract_cate[$cate_id-1]['title']; + } + View::assign('id', $id); + View::assign('cate_id', $cate_id); + View::assign('cate_title', $cate_title); + return view(); + } + } + + /** + * 续签合同 + */ + public function add_renewal() + { + $param = get_params(); + if (request()->isAjax()) { + $param['sign_time'] = isset($param['sign_time']) ? strtotime($param['sign_time']) : 0; + $param['start_time'] = isset($param['start_time']) ? strtotime($param['start_time']) : 0; + $param['end_time'] = isset($param['end_time']) ? strtotime($param['end_time']) : 0; + $param['trial_end_time'] = isset($param['trial_end_time']) ? strtotime($param['trial_end_time']) : 0; + if($param['end_time']<=$param['start_time']){ + return to_assign(1,'合同失效时间需要大于开始时间'); + } + if($param['end_time']scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if($id>0){ + $detail = $this->model->getById($id); + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + View::assign('detail', $detail); + } + View::assign('properties', $this->model::$laborcontract_properties); + return view(); + } + } + + /** + * 变更合同 + */ + public function add_change() + { + $param = get_params(); + if (request()->isAjax()) { + $param['sign_time'] = isset($param['sign_time']) ? strtotime($param['sign_time']) : 0; + $param['start_time'] = isset($param['start_time']) ? strtotime($param['start_time']) : 0; + $param['end_time'] = isset($param['end_time']) ? strtotime($param['end_time']) : 0; + $param['trial_end_time'] = isset($param['trial_end_time']) ? strtotime($param['trial_end_time']) : 0; + if($param['end_time']<=$param['start_time']){ + return to_assign(1,'合同失效时间需要大于开始时间'); + } + if($param['end_time']scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if($id>0){ + $detail = $this->model->getById($id); + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + View::assign('detail', $detail); + } + View::assign('properties', $this->model::$laborcontract_properties); + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['cate_str'] = $this->model::$laborcontract_cate[$detail['cate']-1]['title']; + $detail['types_str'] = $this->model::$laborcontract_types[$detail['types']]; + $detail['properties_str'] = $this->model::$laborcontract_properties[$detail['properties']]; + $detail['status_str'] = $this->model::$laborcontract_status[$detail['status']]; + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + $detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name'); + if($detail['file_ids'] !=''){ + $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select(); + $detail['file_array'] = $file_array; + } + if($detail['renewal_pid'] > 0){ + $detail['renewal_ptitle'] = Db::name('LaborContract')->where('id',$detail['renewal_pid'])->value('title'); + } + if($detail['change_pid'] > 0){ + $detail['change_ptitle'] = Db::name('LaborContract')->where('id',$detail['change_pid'])->value('title'); + } + View::assign('detail', $detail); + View::assign('renewal', Db::name('LaborContract')->where(['renewal_pid'=>$id,'delete_time'=>0])->find()); + View::assign('change', Db::name('LaborContract')->where(['change_pid'=>$id,'delete_time'=>0])->find()); + return view(); + } + else{ + throw new \think\exception\HttpException(404, '找不到页面'); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + /** + * 解除、恢复 + */ + public function set() + { + if (request()->isAjax()) { + $param = get_params(); + $renewal = Db::name('LaborContract')->where(['renewal_pid'=> $param['id'],'delete_time'=>0])->count(); + $change = Db::name('LaborContract')->where(['change_pid'=> $param['id'],'delete_time'=>0])->count(); + if($renewal>0 || $change>0){ + return to_assign(1, "已续签或者已变更的合同不支持该操作"); + } + $this->model::where('id', $param['id'])->strict(false)->field(true)->update(['status'=> $param['status']]); + if($param['status']==3){ + add_log('secure',$param['id'], $param); + } + else{ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } else { + return to_assign(1, "错误的请求"); + } + } + +} diff --git a/app/user/controller/Personal.php b/app/user/controller/Personal.php new file mode 100644 index 0000000..208df0d --- /dev/null +++ b/app/user/controller/Personal.php @@ -0,0 +1,287 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\DepartmentChange as DepartmentChange; +use app\user\model\PersonalQuit as PersonalQuit; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Personal extends BaseController +{ + //调部门列表 + public function change() + { + if (request()->isAjax()) { + $param = get_params(); + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid = $this->uid; + $where=[]; + $whereOr=[]; + $where[]=['delete_time','=',0]; + if($tab == 0){ + //全部 + $auth = isAuth($uid,'office_admin','conf_1'); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 1){ + //我创建的 + $where[] = ['admin_id', '=', $this->uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + if (!empty($param['did'])) { + $where[] = ['did', '=',$param['did']]; + } + //按时间检索 + if (!empty($param['move_time'])) { + $move_time =explode('~', $param['move_time']); + $where[] = ['move_time', 'between', [strtotime(urldecode($move_time[0])),strtotime(urldecode($move_time[1]))]]; + } + $model = new DepartmentChange(); + $list = $model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } else { + return view(); + } + } + + //新增&编辑调部门 + public function change_add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['move_time'] = isset($param['move_time']) ? strtotime($param['move_time']) : 0; + $model = new DepartmentChange(); + if ($param['id'] > 0) { + $model->edit($param); + } else { + $uid = $param['uid']; + $map = []; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',leader_ids)")]; + $count = Db::name('Department')->where($map)->count(); + if($count>0){ + return to_assign(1,'请先撤销该员工的部门负责人头衔再申请'); + } + $has = Db::name('DepartmentChange')->where(['uid'=>$param['uid'],'status'=>1,'delete_time'=>0])->count(); + if($has>0){ + return to_assign(1, "该员工有调动记录未完成,不能重复申请"); + } + $param['admin_id'] = $this->uid; + $model->add($param); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $department = set_recursion(get_department()); + if ($id > 0) { + $model = new DepartmentChange(); + $detail = $model->getById($id); + View::assign('detail', $detail); + } + View::assign('department', $department); + View::assign('id', $id); + if(is_mobile()){ + return view('qiye@/approve/add_change'); + } + return view(); + } + } + + //查看调部门申请 + public function change_view() + { + $param = get_params(); + $model = new DepartmentChange(); + $detail = $model->getById($param['id']); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_change'); + } + return view(); + } + + //删除调部门申请 + public function change_delete() + { + $param = get_params(); + $id = $param['id']; + if (request()->isDelete()) { + $model = new DepartmentChange(); + $model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + + + //离职 + public function leave() + { + $param = get_params(); + if (request()->isAjax()) { + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid = $this->uid; + $where=[]; + $whereOr=[]; + $where[]=['delete_time','=',0]; + if($tab == 0){ + //全部 + $auth = isAuth($uid,'office_admin','conf_1'); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 1){ + //我创建的 + $where[] = ['admin_id', '=', $uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + if (!empty($param['did'])) { + $where[] = ['did', '=',$param['did']]; + } + //按时间检索 + if (!empty($param['quit_time'])) { + $quit_time =explode('~', $param['quit_time']); + $where[] = ['quit_time', 'between', [strtotime(urldecode($quit_time[0])),strtotime(urldecode($quit_time[1]))]]; + } + $model = new PersonalQuit(); + $list = $model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + //添加离职申请 + public function leave_add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['quit_time'] = isset($param['quit_time']) ? strtotime($param['quit_time']) : 0; + $model = new PersonalQuit(); + if ($param['id'] > 0) { + $has = Db::name('PersonalQuit')->where([['uid','=',$param['uid']],['delete_time','=',0],['id','<>',$param['id']]])->count(); + if($has>0){ + return to_assign(1, "该员工已申请有离职记录,不能重复申请"); + } + $detail = $model->edit($param); + } else { + $has = Db::name('PersonalQuit')->where(['uid'=>$param['uid'],'delete_time'=>0])->count(); + if($has>0){ + return to_assign(1, "该员工已申请有离职记录,不能重复申请"); + } + $param['admin_id'] = $this->uid; + $detail = $model->add($param); + } + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $uid = isset($param['uid']) ? $param['uid'] : 0; + $detail=[]; + if($uid>0){ + $admin = get_admin($uid); + $detail['name'] = $admin['name']; + $detail['did'] = $admin['did']; + $detail['department'] = $admin['department']; + } + if ($id>0) { + $model = new PersonalQuit(); + $detail = $model->getById($id); + } + View::assign('id', $id); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/add_leave'); + } + return view(); + } + } + + //查看离职申请 + public function leave_view() + { + $param = get_params(); + $model = new PersonalQuit(); + $detail = $model->getById($param['id']); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_leave'); + } + return view(); + } + + //删除离职申请 + public function leave_delete() + { + $param = get_params(); + $id = $param['id']; + if (request()->isDelete()) { + $model = new PersonalQuit(); + $model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } +} diff --git a/app/user/controller/Position.php b/app/user/controller/Position.php new file mode 100644 index 0000000..0e9d089 --- /dev/null +++ b/app/user/controller/Position.php @@ -0,0 +1,186 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\validate\PositionCheck; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Position extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $list = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select()->toArray(); + foreach ($list as &$val) { + $groupId = Db::name('PositionGroup')->where(['pid' => $val['id']])->column('group_id'); + $groupName = Db::name('AdminGroup')->where('id', 'in', $groupId)->column('title'); + $val['groupName'] = implode(',', $groupName); + } + $res['data'] = $list; + return table_assign(0, '', $res); + } else { + return view(); + } + } + + //添加&编辑 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + if($param['id']==1){ + return to_assign(1, '超级管理员不能编辑'); + } + try { + validate(PositionCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + // 启动事务 + Db::startTrans(); + try { + Db::name('Position')->where(['id' => $param['id']])->strict(false)->field(true)->update($param); + Db::name('PositionGroup')->where(['pid' => $param['id']])->delete(); + foreach ($param['group_id'] as $k => $v) { + $data[$k] = [ + 'pid' => $param['id'], + 'group_id' => $v, + 'create_time' => time(), + ]; + } + Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data); + add_log('edit', $param['id'], $param); + //清除菜单\权限缓存 + clear_cache('adminMenu'); + clear_cache('adminRules'); + // 提交事务 + Db::commit(); + } catch (\Exception $e) { + // 回滚事务 + Db::rollback(); + return to_assign(1, '提交失败:' . $e->getMessage()); + } + } else { + try { + validate(PositionCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + // 启动事务 + Db::startTrans(); + try { + $uid = Db::name('Position')->strict(false)->field(true)->insertGetId($param); + foreach ($param['group_id'] as $k => $v) { + $data[$k] = [ + 'pid' => $uid, + 'group_id' => $v, + 'create_time' => time(), + ]; + } + Db::name('PositionGroup')->strict(false)->field(true)->insertAll($data); + add_log('add', $uid, $param); + // 提交事务 + Db::commit(); + } catch (\Exception $e) { + // 回滚事务 + Db::rollback(); + return to_assign(1, '提交失败:' . $e->getMessage()); + } + } + return to_assign(); + } + else{ + $id = isset($param['id']) ? $param['id'] : 0; + $group = Db::name('AdminGroup')->order('create_time asc')->select()->toArray(); + if ($id > 0) { + $detail = Db::name('Position')->where(['id' => $id])->find(); + $detail['group_id'] = Db::name('PositionGroup')->where(['pid' => $id])->column('group_id'); + foreach ($group as &$val) { + if (in_array($val['id'], $detail['group_id'])) { + $val['checked'] = 1; + } else { + $val['checked'] = 0; + } + } + View::assign('detail', $detail); + } + View::assign('group', $group); + View::assign('id', $id); + return view(); + } + } + + //查看 + public function view() + { + $id = get_params('id'); + $group = Db::name('AdminGroup')->order('create_time asc')->select()->toArray(); + $detail = Db::name('Position')->where(['id' => $id])->find(); + $detail['group_id'] = Db::name('PositionGroup')->where(['pid' => $id])->column('group_id'); + foreach ($group as &$val) { + if (in_array($val['id'], $detail['group_id'])) { + $val['checked'] = 1; + } else { + $val['checked'] = 0; + } + } + + $rule = Db::name('AdminRule')->order('sort asc,id asc')->select()->toArray(); + $user_groups = Db::name('PositionGroup') + ->alias('a') + ->join("AdminGroup g", "a.group_id=g.id", 'LEFT') + ->where("a.pid='{$id}' and g.status='1'") + ->select() + ->toArray(); + $groups = $user_groups ?: []; + + $rules = []; + foreach ($groups as $g) { + $rules = array_merge($rules, explode(',', trim($g['rules'], ','))); + } + $rules = array_unique($rules); + + $role_rule = create_tree_list(0, $rule, $rules); + View::assign('role_rule', $role_rule); + View::assign('detail', $detail); + View::assign('group', $group); + add_log('view', $id); + return view(); + } + //删除 + public function delete() + { + $id = get_params("id"); + if ($id == 1) { + return to_assign(0, "超级岗位,不能删除"); + } + $data['status'] = '-1'; + $data['id'] = $id; + $data['update_time'] = time(); + if (Db::name('Position')->update($data) !== false) { + add_log('delete', $id); + return to_assign(0, "删除岗位成功"); + } else { + return to_assign(1, "删除失败"); + } + } +} diff --git a/app/user/controller/Rewards.php b/app/user/controller/Rewards.php new file mode 100644 index 0000000..07a9f68 --- /dev/null +++ b/app/user/controller/Rewards.php @@ -0,0 +1,141 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\Rewards as RewardsModel; +use app\user\validate\RewardsValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Rewards extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new RewardsModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $param = get_params(); + $where=[]; + $where[]=['delete_time','=',0]; + if (!empty($param['keywords'])) { + $where[] = ['id|thing|remark', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['status'])) { + $where[] = ['status', '=', $param['status']]; + } + if (!empty($param['types'])) { + $where[] = ['types', '=', $param['types']]; + } + if (!empty($param['rewards_cate'])) { + $where[] = ['rewards_cate', '=', $param['rewards_cate']]; + } + if (!empty($param['uid'])) { + $where[] = ['uid', '=', $param['uid']]; + } + if (!empty($param['diff_time'])) { + $diff_time =explode('~', $param['diff_time']); + $where[] = ['rewards_time', 'between', [strtotime(urldecode($diff_time[0])),strtotime(urldecode($diff_time[1]))]]; + } + $list = $this->model->datalist($where, $param); + return table_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['rewards_time'] = isset($param['rewards_time']) ? strtotime($param['rewards_time']) : 0; + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(RewardsValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(RewardsValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + $detail['rewards_time'] = to_date($detail['rewards_time'],'Y-m-d'); + View::assign('detail', $detail); + } + View::assign('id', $id); + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['cate'] = Db::name('RewardsCate')->where('id',$detail['rewards_cate'])->value('title'); + $detail['user_name'] = Db::name('Admin')->where('id',$detail['uid'])->value('name'); + $detail['admin_name'] = Db::name('Admin')->where('id',$detail['admin_id'])->value('name'); + $detail['rewards_time'] = to_date($detail['rewards_time'],'Y-m-d'); + View::assign('detail', $detail); + return view(); + } + else{ + throw new \think\exception\HttpException(404, '找不到页面'); + } + } + + /** + * 删除 + */ + public function del() + { + $param = get_params(); + $id = isset($param['id']) ? $param['id'] : 0; + $this->model->delById($id); + } + +} diff --git a/app/user/controller/Rewardscate.php b/app/user/controller/Rewardscate.php new file mode 100644 index 0000000..fb7e9f1 --- /dev/null +++ b/app/user/controller/Rewardscate.php @@ -0,0 +1,105 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\RewardsCate as RewardsCateModel; +use app\user\validate\RewardsCateValidate; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class Rewardscate extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new RewardsCateModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + if (request()->isAjax()) { + $list = $this->model->select(); + return to_assign(0, '', $list); + } + else{ + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(RewardsCateValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(RewardsCateValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getCateById($id); + } + return view(); + } + } + /** + * 设置 + */ + public function set() + { + $param = get_params(); + $res = $this->model->strict(false)->field('id,status')->update($param); + if ($res) { + if($param['status'] == 0){ + add_log('disable', $param['id'], $param); + } + else if($param['status'] == 1){ + add_log('recovery', $param['id'], $param); + } + return to_assign(); + } + else{ + return to_assign(0, '操作失败'); + } + } + + +} diff --git a/app/user/controller/Talent.php b/app/user/controller/Talent.php new file mode 100644 index 0000000..71e5944 --- /dev/null +++ b/app/user/controller/Talent.php @@ -0,0 +1,263 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\Talent as TalentModel; +use app\user\validate\TalentValidate; +use think\exception\ValidateException; +use Overtrue\Pinyin\Pinyin; +use think\facade\Db; +use think\facade\View; + +class Talent extends BaseController +{ + /** + * 构造函数 + */ + protected $model; + public function __construct() + { + parent::__construct(); // 调用父类构造函数 + $this->model = new TalentModel(); + } + + /** + * 数据列表 + */ + public function datalist() + { + $param = get_params(); + if (request()->isAjax()) { + $param = get_params(); + $tab = isset($param['tab']) ? $param['tab'] : 0; + $uid = $this->uid; + $where = array(); + $whereOr = array(); + $where[]=['delete_time','=',0]; + if($tab == 0){ + //全部 + $auth = isAuth($uid,'office_admin','conf_1'); + if($auth == 0){ + $whereOr[] = ['admin_id', '=', $this->uid]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + $whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + $dids_a = get_leader_departments($uid); + $dids_b = get_role_departments($uid); + $dids = array_merge($dids_a, $dids_b); + if(!empty($dids)){ + $whereOr[] = ['did','in',$dids]; + } + } + } + if($tab == 1){ + //我创建的 + $where[] = ['admin_id', '=', $this->uid]; + } + if($tab == 2){ + //待我审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_uids)")]; + } + if($tab == 3){ + //我已审核的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_history_uids)")]; + } + if($tab == 4){ + //抄送给我的 + $where[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',check_copy_uids)")]; + } + if (isset($param['check_status']) && $param['check_status'] != "") { + $where[] = ['check_status', '=', $param['check_status']]; + } + if (!empty($param['keywords'])) { + $where[] = ['name|mobile', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['did'])) { + $where[] = ['to_did', '=',$param['did']]; + } + //按时间检索 + if (!empty($param['entry_time'])) { + $entry_time =explode('~', $param['entry_time']); + $where[] = ['entry_time', 'between', [strtotime(urldecode($entry_time[0])),strtotime(urldecode($entry_time[1]))]]; + } + $list = $this->model->datalist($param,$where,$whereOr); + return table_assign(0, '', $list); + } + else{ + View::assign('is_auth', isAuth($this->uid,'office_admin','conf_1')); + return view(); + } + } + + /** + * 添加/编辑 + */ + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $param['entry_time'] = empty($param['entry_time']) ? '0':strtotime($param['entry_time']); + $count_a=0; + $count_b=0; + if(!empty($param['idcard'])){ + $count_a = Db::name('Blacklist')->where([['idcard','=',$param['idcard']],['delete_time','=',0]])->count(); + } + if(!empty($param['mobile'])){ + $count_b = Db::name('Blacklist')->where([['mobile','=',$param['mobile']],['delete_time','=',0]])->count(); + } + if($count_a>0 || $count_b>0){ + return to_assign(1, '该员工的信息已被列入黑名单,不支持申请'); + } + $count_c = Db::name('Admin')->where([['mobile','=',$param['mobile']],['status','in',['0,1']],['delete_time','=',0]])->count(); + $count_d = Db::name('Admin')->where([['email','=',$param['email']],['status','in',['0,1']],['delete_time','=',0]])->count(); + if($count_c>0){ + return to_assign(1, '该手机号已被其他员工占用,不支持申请'); + } + if($count_d>0){ + return to_assign(1, '该邮箱已被其他员工占用,不支持申请'); + } + if (!empty($param['id']) && $param['id'] > 0) { + try { + validate(IndexValidate::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $this->model->edit($param); + } else { + try { + validate(IndexValidate::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['admin_id'] = $this->uid; + $param['did'] = $this->did; + $this->model->add($param); + } + }else{ + $id = isset($param['id']) ? $param['id'] : 0; + if ($id>0) { + $detail = $this->model->getById($id); + View::assign('detail', $detail); + } + $position = Db::name('Position')->where([['status', '>=', 0]])->order('create_time asc')->select(); + View::assign('position', $position); + View::assign('id', $id); + if(is_mobile()){ + return view('qiye@/approve/add_talent'); + } + return view(); + } + } + + /** + * 查看 + */ + public function view($id) + { + $detail = $this->model->getById($id); + if (!empty($detail)) { + $detail['department'] = Db::name('Department')->where('id', '=', $detail['to_did'])->value('title'); + $detail['position'] = Db::name('Position')->where('id', '=', $detail['position_id'])->value('title'); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/view_talent'); + } + return view(); + } + else{ + return view(EEEOR_REPORTING,['code'=>404,'warning'=>'找不到页面']); + } + } + + /** + * 删除 + */ + public function del() + { + $id = get_params("id"); + if (request()->isDelete()) { + $this->model->delById($id); + } else { + return to_assign(1, "错误的请求"); + } + } + /** + * 转为正式员工 + */ + public function set() + { + $param = get_params(); + if (request()->isAjax()) { + $param['update_time'] = time(); + $param['entry_time'] = strtotime($param['entry_time']); + Db::name('Talent')->strict(false)->field(true)->update($param); + $detail = Db::name('Talent')->where('id', $param['id'])->find(); + $count_a = Db::name('Admin')->where([['status', 'in', [0,1]],['mobile','=',$detail['mobile']],['delete_time','=',0]])->count(); + if($count_a>0){ + return to_assign(1, "同样的手机号码已经存在,请检查一下是否被离职或者禁用员工占用"); + } + $detail['nickname'] = $detail['name']; + $char = $detail['name']; + $username = Pinyin::name($char,'none')->join(''); + $detail['username'] = $this->create_name($username,0); + $detail['did'] = $detail['to_did']; + $detail['salt'] = set_salt(20); + $detail['reg_pwd'] = $param['reg_pwd']; + $detail['thumb'] = get_file($detail['thumb']); + $detail['pwd'] = set_password($detail['reg_pwd'], $detail['salt']); + $detail['talent_id'] = $detail['id']; + unset($detail['id']); + $uid = Db::name('Admin')->strict(false)->field(true)->insertGetId($detail); + if($uid!==false){ + Db::name('Talent')->where('id',$param ['id'])->update(['status'=>2]); + add_log('add', $uid, $param); + return to_assign(); + } + else { + return to_assign(1, "操作失败"); + } + } + else{ + $position = Db::name('Position')->where([['status', '>=', 0]])->order('create_time asc')->select(); + $detail = $this->model->getById($param['id']); + View::assign('position', $position); + //初始化密码 + View::assign('reg_pwd', set_salt(6)); + View::assign('detail', $detail); + if(is_mobile()){ + return view('qiye@/approve/set_talent'); + } + return view(); + } + } + //生成登录名 + public function create_name($name,$id=0,$total=0,$old='') + { + $count = Db::name('Admin')->where([['username','=',$name],['id','<>',$id]])->count(); + if($total==0){ + $old = $name; + } + $total++; + if($count>0){ + $newname = $old.$total; + $name = $this->create_name($newname,$id,$total,$old); + } + return $name; + } +} diff --git a/app/user/controller/User.php b/app/user/controller/User.php new file mode 100644 index 0000000..df8dba4 --- /dev/null +++ b/app/user/controller/User.php @@ -0,0 +1,392 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); + +namespace app\user\controller; + +use app\base\BaseController; +use app\user\model\Admin as AdminList; +use app\user\model\Department as DepartmentModel; +use app\user\validate\AdminCheck; +use avatars\MDAvatars; +use Overtrue\Pinyin\Pinyin; +use think\exception\ValidateException; +use think\facade\Db; +use think\facade\View; + +class User extends BaseController +{ + public function index() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + $whereOr = array(); + if (!empty($param['keywords'])) { + $where[] = ['a.id|a.username|a.name|a.nickname|a.mobile|a.desc', 'like', '%' . $param['keywords'] . '%']; + } + if (isset($param['status']) && $param['status']!='') { + $where[] = ['a.status', '=', $param['status']]; + } + else{ + $where[] = ['a.status', '=', 1]; + } + if (!empty($param['type'])) { + $where[] = ['a.type', '=', $param['type']]; + } + if (!empty($param['did'])) { + $admin_array = Db::name('DepartmentAdmin')->where('department_id',$param['did'])->column('admin_id'); + $map1=[ + ['a.id','in',$admin_array], + ]; + $map2=[ + ['a.did', '=', $param['did']], + ]; + $whereOr =[$map1,$map2]; + } + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $admin = AdminList::alias('a') + ->with('departments') + ->field('a.*,p.title as position,d.title as department') + ->join('Department d', 'd.id = a.did','left') + ->join('Position p', 'p.id = a.position_id','left') + ->where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->paginate(['list_rows'=> $rows]) + ->order('a.id desc') + ->each(function ($item, $key) { + //遍历次要部门数据 + $departments = $item['departments']->toArray(); + if(empty($departments)){ + $item['departments'] = '-'; + } + else{ + $item['departments'] = split_array_field($departments,'title'); + } + $item['entry_time'] = to_date($item['entry_time'],'Y-m-d'); + $item['last_login_time'] = to_date($item['last_login_time'],'Y-m-d H:i'); + $item['last_login_ip'] = empty($item['last_login_ip']) ? '-' : $item['last_login_ip']; + }); + return table_assign(0, '', $admin); + } else { + return view(); + } + } + + //生成登录名 + public function create_name($name,$id=0,$total=0,$old='') + { + $count = Db::name('Admin')->where([['username','=',$name],['id','<>',$id]])->count(); + if($total==0){ + $old = $name; + } + $total++; + if($count>0){ + $newname = $old.$total; + $name = $this->create_name($newname,$id,$total,$old); + } + return $name; + } + + //添加 + public function add() + { + $param = get_params(); + if (request()->isAjax()) { + $id = isset($param['id'])?$param['id']:0; + $param['entry_time'] = strtotime($param['entry_time']); + $param['nickname'] = $param['name']; + if ($id > 0) { + if($id == 1){ + return to_assign(1, '超级管理员信息不支持编辑'); + } + try { + validate(AdminCheck::class)->scene('edit')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $detail = get_admin($param['id']); + $department_ids = Db::name('DepartmentAdmin')->where('admin_id',$param['id'])->column('department_id'); + $detail['department_ids'] = implode(',',$department_ids); + // 启动事务 + Db::startTrans(); + try { + Db::name('Admin')->where(['id' => $id])->strict(false)->field(true)->update($param); + if($detail['department_ids'] != $param['department_ids']){ + Db::name('DepartmentAdmin')->where('admin_id',$id)->whereIn('department_id', $detail['department_ids'])->delete(); + if(!empty($param['department_ids'])){ + $dids = explode(',',$param['department_ids']); + foreach ($dids as $did) { + Db::name('DepartmentAdmin')->insert(['admin_id'=>$param['id'],'department_id'=>$did,'create_time' => time()]); + } + } + } + if(empty($param['thumb'])){ + $char = mb_substr($param['name'], 0, 1, 'utf-8'); + Db::name('Admin')->where('id', $id)->update(['thumb' => $this->to_avatars($char)]); + } + $info = Db::name('Admin')->where('id', $id)->find(); + $model = new DepartmentModel(); + $auth_dids = $model->get_auth_departments($info); + $son_dids = $model->get_son_departments($info); + Db::name('Admin')->where('id',$id)->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]); + add_log('edit', $id, $param); + //清除菜单\权限缓存 + clear_cache('adminMenu'); + // 提交事务 + Db::commit(); + } catch (\Exception $e) { + // 回滚事务 + Db::rollback(); + return to_assign(1, '提交失败:' . $e->getMessage()); + } + } else { + $username = Pinyin::name($param['name'],'none')->join(''); + $param['username'] = $this->create_name($username,$id); + try { + validate(AdminCheck::class)->scene('add')->check($param); + } catch (ValidateException $e) { + // 验证失败 输出错误信息 + return to_assign(1, $e->getError()); + } + $param['create_time'] = time(); + $param['salt'] = set_salt(20); + $param['pwd'] = set_password($param['reg_pwd'], $param['salt']); + // 启动事务 + Db::startTrans(); + try { + $uid = Db::name('Admin')->strict(false)->field(true)->insertGetId($param); + if(!empty($param['department_ids'])){ + $dids = explode(',',$param['department_ids']); + foreach ($dids as $did) { + Db::name('DepartmentAdmin')->insert(['admin_id'=>$uid,'department_id'=>$did,'create_time' => time()]); + } + } + if(empty($param['thumb'])){ + $char = mb_substr($param['name'], 0, 1, 'utf-8'); + Db::name('Admin')->where('id', $uid)->update(['thumb' => $this->to_avatars($char)]); + } + $info = Db::name('Admin')->where('id', $uid)->find(); + $model = new DepartmentModel(); + $auth_dids = $model->get_auth_departments($info); + $son_dids = $model->get_son_departments($info); + Db::name('Admin')->where('id',$uid)->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]); + add_log('add', $uid, $param); + // 提交事务 + Db::commit(); + } catch (\Exception $e) { + // 回滚事务 + Db::rollback(); + return to_assign(1, '提交失败:' . $e->getMessage()); + } + } + return to_assign(); + } else { + $id = isset($param['id']) ? $param['id'] : 0; + $department = set_recursion(get_department()); + $position = Db::name('Position')->where('status', '>=', 0)->order('create_time asc')->select(); + if ($id > 0) { + $detail = get_admin($id); + $detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name'); + $department_ids = Db::name('DepartmentAdmin')->where('admin_id',$param['id'])->column('department_id'); + $detail['department_ids'] = implode(',',$department_ids); + View::assign('detail', $detail); + } else { + //初始化密码 + $reg_pwd = set_salt(6); + View::assign('reg_pwd', $reg_pwd); + } + View::assign('department', $department); + View::assign('position', $position); + View::assign('id', $id); + return view(); + } + } + //生成头像 + public function to_avatars($char) + { + $defaultData = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'S', 'Y', 'Z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾', + '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'); + if (isset($char)) { + $Char = $char; + } else { + $Char = $defaultData[mt_rand(0, count($defaultData) - 1)]; + } + $OutputSize = min(512, empty($_GET['size']) ? 36 : intval($_GET['size'])); + + $Avatar = new MDAvatars($Char, 256, 1); + $avatar_name = '/avatars/avatar_256_' . set_salt(10) . time() . '.png'; + $path = get_config('filesystem.disks.public.url') . $avatar_name; + $res = $Avatar->Save('.' . $path, 256); + $Avatar->Free(); + return $path; + } + + //查看 + public function view() + { + $id = get_params('id'); + $detail = get_admin($id); + $department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id'); + $department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title'); + $detail['department_names'] = implode(',',$department_names); + $detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name'); + //查询所有菜单和权限节点 + $menu = Db::name('AdminRule')->where(['menu' => 1])->order('sort asc,id asc')->select()->toArray(); + $rule = Db::name('AdminRule')->order('sort asc,id asc')->select()->toArray(); + + //查询用户拥有的菜单和节点 + $user_groups = Db::name('PositionGroup') + ->alias('a') + ->join("AdminGroup g", "a.group_id=g.id", 'LEFT') + ->where([['a.pid', '=', $detail["position_id"]], ['g.status', '=', 1]]) + ->select() + ->toArray(); + $groups = $user_groups ?: []; + + $rules = []; + foreach ($groups as $g) { + $rules = array_merge($rules, explode(',', trim($g['rules'], ','))); + } + $rules = array_unique($rules); + + //数据嵌套 + $role_rule = create_tree_list(0, $rule, $rules); + + View::assign('role_rule', $role_rule); + View::assign('detail', $detail); + add_log('view', get_params('id')); + return view(); + } + //禁用,恢复 + public function set() + { + $type = get_params("type"); + $ids = get_params("ids"); + $idArray = explode(',', $ids); + $list = []; + foreach ($idArray as $key => $val) { + if ($val == 1) { + continue; + } + $list[] = [ + 'status' => $type, + 'id' => $val, + 'update_time' => time(), + ]; + } + foreach ($list as $key => $v) { + if (Db::name('Admin')->update($v) !== false) { + if ($type == 0) { + add_log('disable', $v['id']); + } else if ($type == 1) { + add_log('recovery', $v['id']); + } + } + } + return to_assign(0, '操作成功'); + } + + //重置密码 + public function reset_psw() + { + $id = get_params("id"); + if($id == 1){ + return to_assign(1, '该账号是超级管理员,不允许重置'); + } + $new_pwd = set_salt(6); + $salt = set_salt(20); + $data = [ + 'reg_pwd' => $new_pwd, + 'salt' => $salt, + 'pwd' => set_password($new_pwd, $salt), + 'id' => $id, + 'update_time' => time(), + ]; + if (Db::name('Admin')->update($data) !== false) { + add_log('reset', $id); + return to_assign(0, '操作成功'); + } else { + return to_assign(1, '操作失败'); + } + } + + //删除员工 + public function del() + { + $id = get_params("id"); + if($id == 1){ + return to_assign(1, '该账号是超级管理员,不允许删除'); + } + $data = [ + 'id' => $id, + 'delete_time' => time(), + ]; + if (Db::name('Admin')->update($data) !== false) { + add_log('delete', $id); + return to_assign(0, '操作成功'); + } else { + return to_assign(1, '操作失败'); + } + } + + //管理员操作日志 + public function log() + { + if (request()->isAjax()) { + $param = get_params(); + $where = array(); + if (!empty($param['keywords'])) { + $where[] = ['name|rule_menu|param_id', 'like', '%' . $param['keywords'] . '%']; + } + if (!empty($param['title_cate'])) { + $where['title'] = $param['title_cate']; + } + if (!empty($param['rule_menu'])) { + $where['rule_menu'] = $param['rule_menu']; + } + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $content = DB::name('AdminLog') + ->field("id,uid,name,action,title,content,rule_menu,ip,param_id,param,FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i:%s') create_time") + ->order('create_time desc') + ->where($where) + ->paginate(['list_rows'=> $rows]); + $content->toArray(); + foreach ($content as $k => $v) { + $data = $v; + $param_array = json_decode($v['param'], true); + $param_value = ''; + foreach ($param_array as $key => $value) { + if (is_array($value)) { + $value = implode(',', $value); + } + $param_value .= $key . ':' . $value . '  |  '; + } + $data['param'] = $param_value; + $content->offsetSet($k, $data); + } + return table_assign(0, '', $content); + } else { + return view(); + } + } +} diff --git a/app/user/event.php b/app/user/event.php new file mode 100644 index 0000000..4eff890 --- /dev/null +++ b/app/user/event.php @@ -0,0 +1,5 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\model; +use think\Model; +class Admin extends Model +{ + public function position() + { + return $this->hasOne(Position::class); + } + // 定义与部门的多对多关联关系 + public function departments() + { + return $this->belongsToMany(Department::class, 'department_admin'); + } +} diff --git a/app/user/model/Blacklist.php b/app/user/model/Blacklist.php new file mode 100644 index 0000000..2d9245f --- /dev/null +++ b/app/user/model/Blacklist.php @@ -0,0 +1,120 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\model; +use think\model; +use think\facade\Db; +class Blacklist extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name'); + $item['create_time'] = to_date($item['create_time']); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/user/model/Care.php b/app/user/model/Care.php new file mode 100644 index 0000000..d24ba76 --- /dev/null +++ b/app/user/model/Care.php @@ -0,0 +1,119 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\user\model; +use think\model; +use think\facade\Db; +class Care extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->cate = Db::name('CareCate')->where('id',$item->care_cate)->value('title'); + $item->user_name = Db::name('Admin')->where('id',$item->uid)->value('name'); + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->care_time = to_date($item->care_time,'Y-m-d'); + $item->create_time = to_date($item->create_time,'Y-m-d H:i:s'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['care_time'] = to_date($info['care_time'],'Y-m-d'); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/user/model/CareCate.php b/app/user/model/CareCate.php new file mode 100644 index 0000000..ffb89c5 --- /dev/null +++ b/app/user/model/CareCate.php @@ -0,0 +1,78 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\user\model; +use think\model; +class CareCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function getList($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = slef::where('id', $id)->find(); + return $info; + } +} + diff --git a/app/user/model/Department.php b/app/user/model/Department.php new file mode 100644 index 0000000..e002f54 --- /dev/null +++ b/app/user/model/Department.php @@ -0,0 +1,191 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\model; +use think\Model; +use think\facade\Db; +class Department extends Model +{ + // 定义与员工的多对多关联关系 + public function admins() + { + return $this->belongsToMany(Admin::class, 'department_admin'); + } + + public function update_auth_dids_son_dids(){ + $admin = Db::name('Admin')->field('id,did,auth_did')->select()->toArray(); + foreach ($admin as $key => $val) { + $auth_dids = $this->get_auth_departments($val); + $son_dids = $this->get_son_departments($val); + Db::name('Admin')->where('id',$val['id'])->update(['auth_dids'=>$auth_dids,'son_dids'=>$son_dids]); + } + } + + /*获取某员工所能看的部门数据(dids) + *传入某员工uid,输出部门数组,如:'1,2,3'。 + *超级管理员默认返回全部部门数据 + */ + public function get_auth_departments($admin) + { + $str=''; + $uid = $admin['id']; + $did = $admin['did']; + $auth_did = $admin['auth_did']; + $dids = Db::name('Department')->where('status',1)->column('id'); + $departments = Db::name('Department')->where('status',1)->select()->toArray(); + //次要部门did + $secondary_dids = Db::name('DepartmentAdmin')->where('admin_id',$uid)->column('department_id'); + //全部可见部门 + $all_dids = array_merge($secondary_dids,[$did]); + + //超级管理员||所有部门数据权限 + if($uid==1 || $auth_did==10){ + $str = implode(',',$dids); + } + //仅自己关联的数据 + if($auth_did==0){ + $str=''; + } + + //所属主部门的数据 + if($auth_did==1){ + $str=$did; + } + + //所属次部门的数据 + if($auth_did==2){ + $str = implode(',',$secondary_dids); + } + + //仅所属主次部门数据 + if($auth_did==3){ + $str = implode(',',$all_dids); + } + + //所属主部门及其子部门数据 + if($auth_did==4){ + //获取子部门 + $department_list = get_data_node($departments, $did); + $department_array = array_column($department_list, 'id'); + //包括自己部门在内 + $department_array[] = $did; + $str = implode(',',$department_array); + } + + //所属次部门及其子部门数据 + if($auth_did==5){ + //获取子部门 + $list_array = []; + foreach ($secondary_dids as $key => $value) { + $department_list = get_data_node($departments, $value); + $department_array = array_column($department_list, 'id'); + //包括自己部门在内 + $department_array[] = $value; + $list_array = array_merge($list_array,$department_array); + } + $new_array = array_unique($list_array); + $str = implode(',',$new_array); + } + + //所属主次部门及其子部门数据 + if($auth_did==6){ + //获取子部门 + $list_array = []; + foreach ($all_dids as $key => $value) { + $department_list = get_data_node($departments, $value); + $department_array = array_column($department_list, 'id'); + //包括自己部门在内 + $department_array[] = $value; + $list_array = array_merge($list_array,$department_array); + } + $new_array = array_unique($list_array); + $str = implode(',',$new_array); + } + + //所属主部门所在顶级部门及其子部门数据 + if($auth_did==7){ + //获取顶级部门 + $top_did = get_department_top($did); + $new_array = get_department_son($top_did,1); + $str = implode(',',$new_array); + } + + //所属次部门所在顶级部门及其子部门数据 + if($auth_did==8){ + //获取顶级部门 + $top_dids =[]; + foreach ($secondary_dids as $key => $value) { + array_push($top_dids, get_department_top($value)); + } + + $list_array = []; + foreach ($top_dids as $key => $value) { + $list_array = array_merge($list_array,get_department_son($value,1)); + } + $new_array = array_unique($list_array); + $str = implode(',',$new_array); + } + + //所属主次部门所在顶级部门及其子部门数据 + if($auth_did==9){ + //获取顶级部门 + $top_dids =[]; + foreach ($all_dids as $key => $value) { + array_push($top_dids, get_department_top($value)); + } + + $list_array = []; + foreach ($top_dids as $key => $value) { + $list_array = array_merge($list_array,get_department_son($value,1)); + } + $new_array = array_unique($list_array); + $str = implode(',',$new_array); + } + return $str; + } + + /*获取某负责人所负责的部门的数据集(ids),传入某员工uid,输出部门字符串,如:1,2,3, + *逻辑:先判断传入的uid是否是负责人,如果是负责人再读取对应的部门数据。 + *超级管理员默认返回全部部门数据 + */ + public function get_son_departments($admin) + { + $str=''; + $uid = $admin['id']; + $dids = Db::name('Department')->where('status',1)->column('id'); + $departments = Db::name('Department')->where('status',1)->select()->toArray(); + if($uid==1){ + $str = implode(',',$dids); + } + else{ + $map = []; + $map[] = ['status','=',1]; + $map[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',leader_ids)")]; + $leader_dids = Db::name('Department')->where($map)->column('id'); + //判断是否是部门负责人 + if(!empty($leader_dids)){ + //获取子部门 + $list_array = []; + foreach ($leader_dids as $key => $value) { + $department_list = get_data_node($departments, $value); + $department_array = array_column($department_list, 'id'); + //包括自己部门在内 + $department_array[] = $value; + $list_array = array_merge($list_array,$department_array); + } + $str = implode(',',$list_array); + } + } + return $str; + } +} diff --git a/app/user/model/DepartmentChange.php b/app/user/model/DepartmentChange.php new file mode 100644 index 0000000..e9c602f --- /dev/null +++ b/app/user/model/DepartmentChange.php @@ -0,0 +1,155 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\model; +use think\Model; +use think\facade\Db; +class DepartmentChange extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param,$where,$whereOr) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['check_status_str'] = check_status_name($item['check_status']); + $item['check_user'] = '-'; + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_user'] = implode(',',$check_user); + } + + $item['name'] = Db::name('Admin')->where('id','=',$item['uid'])->value('name'); + $item['create_time'] = to_date($item['create_time']); + $item['admin_name'] = Db::name('Admin')->where('id','=',$item['admin_id'])->value('name'); + $item['from_department'] = Db::name('Department')->where(['id' => $item['from_did']])->value('title'); + $item['to_department'] = Db::name('Department')->where(['id' => $item['to_did']])->value('title'); + $item['move_time'] = to_date($item['move_time'],'Y-m-d'); + $status_str = '未执行'; + $connect_time_str = '-'; + if($item['status'] == 2){ + $status_str = '已执行'; + $connect_time_str = to_date($item['connect_time'],'Y-m-d'); + } + $item['status_str'] = $status_str; + $item['connect_time_str'] = $connect_time_str; + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=> $param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['name'] = Db::name('Admin')->where('id','=',$info['uid'])->value('name'); + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $info['from_department'] = Db::name('Department')->where(['id' => $info['from_did']])->value('title'); + $info['to_department'] = Db::name('Department')->where(['id' => $info['to_did']])->value('title'); + $info['move_time'] = to_date($info['move_time'],'Y-m-d'); + + $status_str = '未执行'; + $connect_time_str = '-'; + if($info['status'] == 2){ + $status_str = '已执行'; + $connect_time_str = to_date($info['connect_time'],'Y-m-d'); + } + $info['status_str'] = $status_str; + $info['connect_time_str'] = $connect_time_str; + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} \ No newline at end of file diff --git a/app/user/model/IndustryCate.php b/app/user/model/IndustryCate.php new file mode 100644 index 0000000..53f36c7 --- /dev/null +++ b/app/user/model/IndustryCate.php @@ -0,0 +1,19 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\model; +use think\Model; +class IndustryCate extends Model +{ + +} diff --git a/app/user/model/LaborContract.php b/app/user/model/LaborContract.php new file mode 100644 index 0000000..b9a39da --- /dev/null +++ b/app/user/model/LaborContract.php @@ -0,0 +1,156 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\user\model; +use think\model; +use think\facade\Db; +class LaborContract extends Model +{ + //合同类别 + public static $laborcontract_cate = array( + array('id' => 1, 'title' => '劳动合同'), + array('id' => 2, 'title' => '劳务合同'), + array('id' => 3, 'title' => '实习协议'), + array('id' => 4, 'title' => '保密协议') + ); + + //合同类型 + public static $laborcontract_types = ['','新签合同','续签合同','变更合同']; + + //合同属性 + public static $laborcontract_properties = ['','初级职称','中级职称','高级职称']; + + //合同状态 + public static $laborcontract_status = ['','正常','已到期','已解除']; + + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->cate_str = self::$laborcontract_cate[$item->cate-1]['title']; + $item->types_str = self::$laborcontract_types[$item->types]; + $item->properties_str = self::$laborcontract_properties[$item->properties]; + $item->status_str = self::$laborcontract_status[$item->status]; + $item->enterprise = Db::name('Enterprise')->where('id',$item->enterprise_id)->value('title'); + $item->user_name = Db::name('Admin')->where('id',$item->uid)->value('name'); + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->sign_time = date('Y-m-d',$item->sign_time); + $item->start_time = date('Y-m-d',$item->start_time); + $item->end_time = date('Y-m-d',$item->end_time); + $item->diff_time = $item->start_time.' 至 '.$item->end_time; + $item->renewal = Db::name('LaborContract')->where(['renewal_pid'=>$item->id,'delete_time'=>0])->count(); + $item->change = Db::name('LaborContract')->where(['change_pid'=>$item->id,'delete_time'=>0])->count(); + $item->create_time = to_date($item->create_time,'Y-m-d H:i:s'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $info['cate_str'] = self::$laborcontract_cate[$info['cate']-1]['title']; + $info['types_str'] = self::$laborcontract_types[$info['types']]; + $info['properties_str'] = self::$laborcontract_properties[$info['properties']]; + $info['status_str'] = self::$laborcontract_status[$info['status']]; + $info['enterprise'] = Db::name('Enterprise')->where('id',$info['enterprise_id'])->value('title'); + $info['user_name'] = Db::name('Admin')->where('id',$info['uid'])->value('name'); + $info['sign_time'] = date('Y-m-d',$info['sign_time']); + $info['start_time'] = date('Y-m-d',$info['start_time']); + $info['end_time'] = date('Y-m-d',$info['end_time']); + if($info['trial_end_time']>0){ + $info['trial_end_time'] = date('Y-m-d',$info['trial_end_time']); + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/user/model/PersonalQuit.php b/app/user/model/PersonalQuit.php new file mode 100644 index 0000000..33d80ae --- /dev/null +++ b/app/user/model/PersonalQuit.php @@ -0,0 +1,160 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\user\model; +use think\model; +use think\facade\Db; +class PersonalQuit extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param,$where,$whereOr) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['check_status_str'] = check_status_name($item['check_status']); + $item['check_user'] = '-'; + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_user = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_user'] = implode(',',$check_user); + } + $userinfo = Db::name('Admin')->where('id','=',$item->uid)->find(); + $item->name = $userinfo['name']; + $item->department = Db::name('Department')->where('id',$userinfo['did'])->value('title'); + $item->position = Db::name('Position')->where('id',$userinfo['position_id'])->value('title'); + + $item->admin_name = Db::name('Admin')->where('id','=',$item->admin_id)->value('name'); + $item->lead_admin_name = Db::name('Admin')->where('id','=',$item->lead_admin_id)->value('name'); + $item->connect_name = Db::name('admin')->where(['id' => $item->connect_id])->value('name'); + $item->quit_time = date('Y-m-d',$item->quit_time); + $item->create_time = to_date($item->create_time); + $connect_time_str = '-'; + if($item->status == 2){ + $connect_time_str = to_date($item->connect_time,'Y-m-d'); + } + $item->connect_time_str = $connect_time_str; + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=> $param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + $userinfo = Db::name('Admin')->where('id',$info['uid'])->find(); + $info['name'] = $userinfo['name']; + $info['department'] = Db::name('Department')->where('id',$userinfo['did'])->value('title'); + $info['position'] = Db::name('Position')->where('id',$userinfo['position_id'])->value('title'); + + $info['admin_name'] = Db::name('Admin')->where('id','=',$info['admin_id'])->value('name'); + $info['lead_admin_name'] = Db::name('Admin')->where('id','=',$info['lead_admin_id'])->value('name'); + $connect_uids_name = Db::name('Admin')->where([['id','in', $info['connect_uids']]])->column('name'); + $info['connect_names'] = implode(',', $connect_uids_name); + $info['quit_time'] = date('Y-m-d', $info['quit_time']); + $info['connect_name'] = Db::name('admin')->where(['id' => $info['connect_id']])->value('name'); + $status_str = '未交接'; + $connect_time_str = '-'; + if($info['status'] == 2){ + $status_str = '已交接离职'; + $connect_time_str = to_date($info['connect_time'],'Y-m-d'); + } + $info['status_str'] = $status_str; + $info['connect_time_str'] = $connect_time_str; + if(!empty($info['file_ids'])){ + $file_array = Db::name('File')->where('id','in',$info['file_ids'])->select(); + $info['file_array'] = $file_array; + } + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/user/model/Rewards.php b/app/user/model/Rewards.php new file mode 100644 index 0000000..3436a19 --- /dev/null +++ b/app/user/model/Rewards.php @@ -0,0 +1,118 @@ + ++----------------------------------------------------------------------------------------------- +*/ +namespace app\user\model; +use think\model; +use think\facade\Db; +class Rewards extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item->cate = Db::name('RewardsCate')->where('id',$item->rewards_cate)->value('title'); + $item->user_name = Db::name('Admin')->where('id',$item->uid)->value('name'); + $item->admin_name = Db::name('Admin')->where('id',$item->admin_id)->value('name'); + $item->rewards_time = to_date($item->rewards_time,'Y-m-d'); + $item->create_time = to_date($item->create_time,'Y-m-d H:i:s'); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/user/model/RewardsCate.php b/app/user/model/RewardsCate.php new file mode 100644 index 0000000..8e12aa9 --- /dev/null +++ b/app/user/model/RewardsCate.php @@ -0,0 +1,79 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\model; +use think\model; +class RewardsCate extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function getList($where, $param) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = $this->where($where)->order($order)->paginate(['list_rows'=> $rows]); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = $this->strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['aid'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + $this->where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(); + } + + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = $this->where('id', $id)->find(); + return $info; + } +} + diff --git a/app/user/model/Talent.php b/app/user/model/Talent.php new file mode 100644 index 0000000..7dd58c5 --- /dev/null +++ b/app/user/model/Talent.php @@ -0,0 +1,205 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\model; +use think\model; +use think\facade\Db; +class Talent extends Model +{ + /** + * 获取分页列表 + * @param $where + * @param $param + */ + public function datalist($param=[],$where=[],$whereOr=[]) + { + $rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit']; + $order = empty($param['order']) ? 'id desc' : $param['order']; + try { + $list = self::where($where) + ->where(function ($query) use($whereOr) { + if (!empty($whereOr)){ + $query->whereOr($whereOr); + } + }) + ->order($order) + ->paginate(['list_rows'=> $rows]) + ->each(function ($item, $key){ + $item['admin_name'] = Db::name('Admin')->where('id',$item['admin_id'])->value('name'); + $item['check_status_str'] = check_status_name($item['check_status']); + if($item['check_status']==1 && !empty($item['check_uids'])){ + $check_users = Db::name('Admin')->where('id','in',$item['check_uids'])->column('name'); + $item['check_users'] = implode(',',$check_users); + } + else{ + $item['check_users']='-'; + } + if(!empty($item['check_copy_uids'])){ + $check_copy_users = Db::name('Admin')->where('id','in',$item['check_copy_uids'])->column('name'); + $item['check_copy_users'] = implode(',',$check_copy_users); + } + else{ + $item['check_copy_users']='-'; + } + if($item['entry_time']>0){ + $item['entry_time'] = date('Y-m-d',$item['entry_time']); + } + else{ + $item['entry_time'] = '-'; + } + if($item['position_id']>0){ + $item['position']= Db::name('Position')->where('id',$item['position_id'])->value('title'); + } + if($item['to_did']>0){ + $item['department']= Db::name('Department')->where('id',$item['to_did'])->value('title'); + } + if($item['political']==1){ + $item['political'] = '中共党员'; + } + else if($item['political']==2){ + $item['political'] = '团员'; + } + else{ + $item['political'] = '其他'; + } + $item['create_time'] = to_date($item['create_time']); + $item['thumb'] = get_file($item['thumb']); + }); + return $list; + } catch(\Exception $e) { + return ['code' => 1, 'data' => [], 'msg' => $e->getMessage()]; + } + } + + /** + * 添加数据 + * @param $param + */ + public function add($param) + { + $insertId = 0; + try { + $param['create_time'] = time(); + $insertId = self::strict(false)->field(true)->insertGetId($param); + add_log('add', $insertId, $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$insertId]); + } + + /** + * 编辑信息 + * @param $param + */ + public function edit($param) + { + try { + $param['update_time'] = time(); + self::where('id', $param['id'])->strict(false)->field(true)->update($param); + add_log('edit', $param['id'], $param); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + return to_assign(0,'操作成功',['return_id'=>$param['id']]); + } + + /** + * 根据id获取信息 + * @param $id + */ + public function getById($id) + { + $info = self::find($id); + if($info['entry_time']>0){ + $info['entry_time'] = date('Y-m-d',$info['entry_time']); + } + else{ + $info['entry_time'] = ''; + } + if($info['position_id']>0){ + $info['position']= Db::name('Position')->where('id',$info['position_id'])->value('title'); + } + else{ + $info['position'] = ''; + } + if($info['pid']>0){ + $info['pname']= Db::name('Admin')->where('id',$info['pid'])->value('name'); + } + else{ + $info['pname'] = ''; + } + if($info['position_name']>0){ + $info['position_name_str']= Db::name('BasicUser')->where('id',$info['position_name'])->value('title'); + } + else{ + $info['position_name_str']=''; + } + if($info['position_rank']>0){ + $info['position_rank_str']= Db::name('BasicUser')->where('id',$info['position_rank'])->value('title'); + } + else{ + $info['position_rank_str']=''; + } + if($info['to_did']>0){ + $info['department']= Db::name('Department')->where('id',$info['to_did'])->value('title'); + } + else{ + $info['department']=''; + } + if(!empty($info['to_dids'])){ + $departments= Db::name('Department')->where('id','in',$info['to_dids'])->column('title'); + $info['departments']= implode(',' ,$departments); + } + if(!empty($info['admin_id'])){ + $info['admin_name'] = Db::name('Admin')->where([['id','=',$info['admin_id']]])->value('name'); + } + if($info['thumb'] !=''){ + $thumb_array = Db::name('File')->where('id','in',$info['thumb'])->select(); + $info['thumb_array'] = $thumb_array; + } + $info['create_time'] = to_date($info['create_time']); + return $info; + } + + /** + * 删除信息 + * @param $id + * @param $type + * @return array + */ + public function delById($id,$type=0) + { + if($type==0){ + //逻辑删除 + try { + $param['delete_time'] = time(); + self::where('id', $id)->update(['delete_time'=>time()]); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + else{ + //物理删除 + try { + self::destroy($id); + add_log('delete', $id); + } catch(\Exception $e) { + return to_assign(1, '操作失败,原因:'.$e->getMessage()); + } + } + return to_assign(); + } +} + diff --git a/app/user/validate/AdminCheck.php b/app/user/validate/AdminCheck.php new file mode 100644 index 0000000..d6b56cc --- /dev/null +++ b/app/user/validate/AdminCheck.php @@ -0,0 +1,84 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\facade\Db; +use think\Validate; + +class AdminCheck extends Validate +{ + protected $regex = [ 'checkUser' => '/^[A-Za-z]{1}[A-Za-z0-9_-]{3,19}$/']; + // 自定义验证规则 + protected function checkUnique($value, $rule, $data) + { + [$table, $field, $id] = explode(',', $rule); + $idField = $id ?: 'id'; + $idValue = $data[$idField] ?? null; + $map = [ + [$field, '=', $value], + ]; + if (!is_null($idValue)) { + $map[] = [$idField, '<>', $idValue]; + } + $map[] = ['status', 'in', [0,1]]; + $map[] = ['delete_time', '=', 0]; + return !Db::name($table)->where($map)->count(); + } + + protected $rule = [ + 'name' => 'require|chs', + 'username' => 'require|regex:checkUser', + 'mobile' => 'require|mobile|checkUnique:Admin,mobile,id', + 'email' => 'require|email|checkUnique:Admin,email,id', + 'reg_pwd' => 'require|min:6', + 'did' => 'require', + 'position_id' => 'require', + 'type' => 'require', + 'entry_time' => 'require', + 'id' => 'require', + 'pwd' => 'require|min:6|confirm', + 'old_pwd' => 'require|different:pwd', + ]; + + protected $message = [ + 'name.require' => '员工姓名不能为空', + 'name.chs' => '员工姓名只能是汉字', + 'username.require' => '登录账号不能为空', + 'username.regex' => '登录账号必须是以字母开头,只能包含字母数字下划线和减号,4到20位', + 'mobile.require' => '手机不能为空', + 'mobile.mobile' => '手机格式错误', + 'mobile.checkUnique' => '同样的手机号码已经存在,请检查一下是否被离职或者禁用员工占用', + 'email.require' => '邮箱不能为空', + 'email.email' => '邮箱格式错误', + 'email.checkUnique' => '同样的邮箱已经存在,请检查一下是否被离职或者禁用员工占用', + 'reg_pwd.require' => '密码不能为空', + 'reg_pwd.min' => '密码至少要6个字符', + 'did.require' => '请选择所在部门', + 'position_id.require' => '请选择职位', + 'type.require' => '请选择员工类型', + 'entry_time.require' => '请选择入职时间', + 'id.require' => '缺少更新条件', + 'pwd.require' => '密码不能为空', + 'pwd.min' => '密码至少要6个字符', + 'pwd.confirm' => '两次密码不一致', + 'old_pwd.require' => '请提供旧密码', + 'old_pwd.different' => '新密码不能和旧密码一样', + ]; + + protected $scene = [ + 'add' => ['name', 'username', 'mobile','email','reg_pwd', 'did', 'position_id', 'type', 'entry_time'], + 'edit' => ['name', 'mobile','email', 'did', 'position_id', 'entry_time', 'id'], + 'editPwd' => ['old_pwd', 'pwd'], + ]; + +} diff --git a/app/user/validate/BasicUserCheck.php b/app/user/validate/BasicUserCheck.php new file mode 100644 index 0000000..caf60f5 --- /dev/null +++ b/app/user/validate/BasicUserCheck.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; + +use think\Validate; + +class BasicUserCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} diff --git a/app/user/validate/BlacklistValidate.php b/app/user/validate/BlacklistValidate.php new file mode 100644 index 0000000..3a27b2b --- /dev/null +++ b/app/user/validate/BlacklistValidate.php @@ -0,0 +1,53 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\Validate; +use think\facade\Db; + +class BlacklistValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $id = isset($data['id'])?$data['id']:0; + $count_a = Db::name('Blacklist')->where([['idcard','=',$data['idcard']],['id','<>',$id],['delete_time','=',0]])->count(); + $count_b = Db::name('Blacklist')->where([['mobile','=',$data['mobile']],['id','<>',$id],['delete_time','=',0]])->count(); + if($count_a>0 || $count_b>0){ + return false; + } + else{ + return true; + } + } + + protected $rule = [ + 'name' => 'require', + 'mobile' => 'require|checkOne', + 'idcard' => 'checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '姓名不能为空', + 'mobile.require' => '手机号码不能为空', + 'mobile.checkOne' => '同样的手机号码已经存在', + 'idcard.checkOne' => '同样的身份证号码已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['name','idcard'], + 'edit' => ['name','idcard', 'id'], + ]; +} \ No newline at end of file diff --git a/app/user/validate/CareCateValidate.php b/app/user/validate/CareCateValidate.php new file mode 100644 index 0000000..283f055 --- /dev/null +++ b/app/user/validate/CareCateValidate.php @@ -0,0 +1,42 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\Validate; +use think\facade\Db; + +class CareCateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $count = Db::name('CareCate')->where([['title','=',$data['title']],['id','<>',$data['id']]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/user/validate/CareValidate.php b/app/user/validate/CareValidate.php new file mode 100644 index 0000000..ac093c2 --- /dev/null +++ b/app/user/validate/CareValidate.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\Validate; +use think\facade\Db; + +class CareValidate extends Validate +{ + protected $rule = [ + 'uid' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '员工不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['uid'], + 'edit' => ['uid', 'id'], + ]; +} \ No newline at end of file diff --git a/app/user/validate/DepartmentCheck.php b/app/user/validate/DepartmentCheck.php new file mode 100644 index 0000000..467d29a --- /dev/null +++ b/app/user/validate/DepartmentCheck.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; + +use think\Validate; + +class DepartmentCheck extends Validate +{ + protected $rule = [ + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '部门名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['id', 'title'], + ]; +} \ No newline at end of file diff --git a/app/user/validate/LaborContractValidate.php b/app/user/validate/LaborContractValidate.php new file mode 100644 index 0000000..0976f90 --- /dev/null +++ b/app/user/validate/LaborContractValidate.php @@ -0,0 +1,44 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\Validate; +use think\facade\Db; + +class LaborContractValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $count = Db::name('LaborContract')->where([['code','=',$data['code']],['id','<>',$data['id']],['delete_time','=',0]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'code' => 'require|checkOne', + 'title' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'code.require' => '合同编码不能为空', + 'code.checkOne' => '同样的合同编码已经存在', + 'title' => '合同名称不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['code','title'], + 'edit' => ['code','title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/user/validate/PositionCheck.php b/app/user/validate/PositionCheck.php new file mode 100644 index 0000000..0b88eba --- /dev/null +++ b/app/user/validate/PositionCheck.php @@ -0,0 +1,55 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\facade\Db; +use think\Validate; + +class PositionCheck extends Validate +{ + // 自定义验证规则 + protected function checkUnique($value, $rule, $data) + { + [$table, $field, $id] = explode(',', $rule); + $idField = $id ?: 'id'; + $idValue = $data[$idField] ?? null; + $map = [ + [$field, '=', $value], + ]; + if (!is_null($idValue)) { + $map[] = [$idField, '<>', $idValue]; + } + $map[] = ['status', '=', 1]; + return !Db::name($table)->where($map)->count(); + } + protected $rule = [ + 'title' => 'require|checkUnique:Position,title,id', + 'work_price' => 'require|number', + 'group_id' => 'require', + 'id' => 'require' + ]; + + protected $message = [ + 'title.require' => '岗位名称不能为空', + 'title.checkUnique' => '同样的岗位名称已经存在', + 'work_price.require' => '岗位工时单价不能为空', + 'work_price.number' => '岗位工时单价只能是整数', + 'group_id.require' => '至少要选择一个角色权限', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title', 'work_price', 'group_id'], + 'edit' => ['title', 'work_price', 'group_id', 'id'], + ]; +} diff --git a/app/user/validate/RewardsCateValidate.php b/app/user/validate/RewardsCateValidate.php new file mode 100644 index 0000000..d6d5880 --- /dev/null +++ b/app/user/validate/RewardsCateValidate.php @@ -0,0 +1,42 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\Validate; +use think\facade\Db; + +class RewardsCateValidate extends Validate +{ + // 自定义验证规则 + protected function checkOne($value,$rule,$data=[]) + { + $count = Db::name('RewardsCate')->where([['title','=',$data['title']],['id','<>',$data['id']]])->count(); + return $count == 0 ? true : false; + } + + protected $rule = [ + 'title' => 'require|checkOne', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '名称不能为空', + 'title.checkOne' => '同样的名称已经存在', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['title'], + 'edit' => ['title', 'id'], + ]; +} \ No newline at end of file diff --git a/app/user/validate/RewardsValidate.php b/app/user/validate/RewardsValidate.php new file mode 100644 index 0000000..3fe91a7 --- /dev/null +++ b/app/user/validate/RewardsValidate.php @@ -0,0 +1,34 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\Validate; +use think\facade\Db; + +class RewardsValidate extends Validate +{ + protected $rule = [ + 'uid' => 'require', + 'id' => 'require', + ]; + + protected $message = [ + 'title.require' => '员工不能为空', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['uid'], + 'edit' => ['uid', 'id'], + ]; +} \ No newline at end of file diff --git a/app/user/validate/TalentValidate.php b/app/user/validate/TalentValidate.php new file mode 100644 index 0000000..8c954a7 --- /dev/null +++ b/app/user/validate/TalentValidate.php @@ -0,0 +1,55 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace app\user\validate; +use think\Validate; +use think\facade\Db; + +class Talent extends Validate +{ + // 自定义验证规则 + protected function checkUnique($value, $rule, $data) + { + [$table, $field, $id] = explode(',', $rule); + $idField = $id ?: 'id'; + $idValue = $data[$idField] ?? null; + $map = [ + [$field, '=', $value], + ]; + if (!is_null($idValue)) { + $map[] = [$idField, '<>', $idValue]; + } + $map[] = ['status', '=', 1]; + return !Db::name($table)->where($map)->count(); + } + + protected $rule = [ + 'name' => 'require|chs', + 'mobile' => 'require|mobile|checkUnique:Admin,mobile,id', + 'id' => 'require', + ]; + + protected $message = [ + 'name.require' => '员工姓名不能为空', + 'name.chs' => '员工姓名只能是汉字', + 'mobile.require' => '手机不能为空', + 'mobile.mobile' => '手机号码格式错误', + 'mobile.checkUnique' => '同样的手机号码已经存在入职员工内,请与人事核对后再申请', + 'id.require' => '缺少更新条件', + ]; + + protected $scene = [ + 'add' => ['name', 'mobile'], + 'edit' => ['name', 'mobile','id'], + ]; +} \ No newline at end of file diff --git a/app/user/view/basic/datalist.html b/app/user/view/basic/datalist.html new file mode 100644 index 0000000..2ae8bc7 --- /dev/null +++ b/app/user/view/basic/datalist.html @@ -0,0 +1,138 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              +
                +
              • 职务
              • +
              • 职级
              • +
              +
              +
              +
              +
              +
              +
              + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/blacklist/add.html b/app/user/view/blacklist/add.html new file mode 100644 index 0000000..56a9710 --- /dev/null +++ b/app/user/view/blacklist/add.html @@ -0,0 +1,51 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              黑名单

              + + + + + + + + + + + + + +
              姓名*手机号码*身份证号码
              备注说明
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/blacklist/datalist.html b/app/user/view/blacklist/datalist.html new file mode 100644 index 0000000..858f596 --- /dev/null +++ b/app/user/view/blacklist/datalist.html @@ -0,0 +1,89 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/care/add.html b/app/user/view/care/add.html new file mode 100644 index 0000000..a0101b3 --- /dev/null +++ b/app/user/view/care/add.html @@ -0,0 +1,109 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              关怀信息

              + + {eq name="$id" value="0"} + + + + + + + + + {else/} + + + + + + + + + {/eq} + + + + + + + + + + + + + + + + +
              员工姓名* + + + 关怀项目* + + 当前状态 + + +
              员工姓名* + + + 关怀项目* + + 当前状态 + + +
              关怀金额(元)* + + 关怀日期* + + 关怀假日 + +
              关怀物品 + +
              关怀描述 + +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/care/datalist.html b/app/user/view/care/datalist.html new file mode 100644 index 0000000..844cbcf --- /dev/null +++ b/app/user/view/care/datalist.html @@ -0,0 +1,133 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + +
              +
              + + +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/care/view.html b/app/user/view/care/view.html new file mode 100644 index 0000000..55df025 --- /dev/null +++ b/app/user/view/care/view.html @@ -0,0 +1,53 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              奖罚信息

              + + + + + + + + + + + + + + + + + + + + + + + + + +
              员工姓名{$detail.user_name|default=''}关怀类型 + {eq name="$detail.types" value="1"}奖励{/eq} + {eq name="$detail.types" value="2"}惩罚{/eq} + 当前状态 + {eq name="$detail.status" value="1"}『待执行』{/eq} + {eq name="$detail.status" value="2"}『已执行』{/eq} +
              关怀项目{$detail.cate}关怀金额(元){$detail.cost}关怀日期{$detail.care_time}
              关怀物品{$detail.thing}
              奖罚描述{$detail.remark|default=''}
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/carecate/add.html b/app/user/view/carecate/add.html new file mode 100644 index 0000000..7584f4e --- /dev/null +++ b/app/user/view/carecate/add.html @@ -0,0 +1,48 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              关怀项目

              + + + + + + + +
              关怀项目名称* + + 排序 + +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/carecate/datalist.html b/app/user/view/carecate/datalist.html new file mode 100644 index 0000000..2407ac5 --- /dev/null +++ b/app/user/view/carecate/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/department/add.html b/app/user/view/department/add.html new file mode 100644 index 0000000..a0b07dc --- /dev/null +++ b/app/user/view/department/add.html @@ -0,0 +1,105 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              部门架构

              + {eq name="$id" value="0"} + + + + + + + + + + + + + +
              部门名称* + + 上级部门* + +
              排序* + + 部门联系电话 + +
              + {else/} + + + + + + + + + + + + + + + +
              部门名称* + + 上级部门* + + 排序* + +
              部门负责人 + + 部门联系电话 + +
              + {/eq} +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + diff --git a/app/user/view/department/index.html b/app/user/view/department/index.html new file mode 100644 index 0000000..92acfdd --- /dev/null +++ b/app/user/view/department/index.html @@ -0,0 +1,84 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              + +
              +
              +
              +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/files/add.html b/app/user/view/files/add.html new file mode 100644 index 0000000..843b2c5 --- /dev/null +++ b/app/user/view/files/add.html @@ -0,0 +1,531 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              编辑员工档案

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              基本信息
              员工姓名{$detail.name}员工性别 + {eq name="$detail.sex" value="1"}男{/eq} + {eq name="$detail.sex" value="2"}女{/eq} + 头像 +
              +
              + + +
              + +
              +
              出生日期身份证号码
              政治面貌 + + 婚姻状况 + + +
              民族籍贯
              户口性质 + + + 户口所在地
              毕业院校毕业日期
              最高学位专业参加工作时间
              家庭住址手机号码{$detail.mobile}电子邮箱{$detail.email}
              现住地址紧急联系人紧急联系电话
              员工简介 + +
              入职信息
              所在部门{$detail.department}上级主管{$detail.pname|default='无'}岗位{$detail.position}
              入职日期{$detail.entry_time|date='Y-m-d'}职务 + + 职级 + +
              员工类型 + {eq name="$detail.type" value="3"}实习{/eq} + {eq name="$detail.type" value="2"}试用{/eq} + {eq name="$detail.type" value="1"}正式{/eq} + 员工工号社保卡号
              工资卡开户行工资卡帐号公积金号
              教育经历
              + + + + + + + + + + + {empty name="$edu"} + + + + {else/} + {volist name="$edu" id="v"} + + + + + + + + + + {/volist} + {/empty} +
              开始时间结束时间就读院校学习专业所获学历备注说明操作
              暂无数据
              删除
              +
              工作经历
              + + + + + + + + + + {empty name="$work"} + + + + {else/} + {volist name="$work" id="v"} + + + + + + + + + {/volist} + {/empty} +
              开始时间结束时间公司名称职位备注说明操作
              暂无数据
              删除
              +
              相关证书
              + + + + + + + + + {empty name="$certificate"} + + + + {else/} + {volist name="$certificate" id="v"} + + + + + + + + {/volist} + {/empty} +
              证书名称获得时间颁发机构备注说明操作
              暂无数据
              删除
              +
              计算机技能
              + + + + + + + + {empty name="$skills"} + + + + {else/} + {volist name="$skills" id="v"} + + + + + + + {/volist} + {/empty} +
              技能名称熟悉程度备注说明操作
              暂无数据
              + + 删除
              +
              语言能力
              + + + + + + + + {empty name="$language"} + + + + {else/} + {volist name="$language" id="v"} + + + + + + + {/volist} + {/empty} +
              语言名称熟悉程度备注说明操作
              暂无数据
              + + 删除
              +
              档案相关附件
              +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              + +
              + + + +
              +
              + +
              + + + + + + + + + + + + +
              删除
              +
              + +
              + + + + + + + + + + + +
              删除
              +
              + +
              + + + + + + + + + + +
              删除
              +
              + +
              + + + + + + + + + +
              + + 删除
              +
              + +
              + + + + + + + + + +
              + + 删除
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/files/datalist.html b/app/user/view/files/datalist.html new file mode 100644 index 0000000..bd5e639 --- /dev/null +++ b/app/user/view/files/datalist.html @@ -0,0 +1,198 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +
              +

              企业组织架构

              +
              +
              +
              +
              +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              + + + +
              +
              +
              +
              +
              + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/files/view.html b/app/user/view/files/view.html new file mode 100644 index 0000000..be5af93 --- /dev/null +++ b/app/user/view/files/view.html @@ -0,0 +1,321 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              {$detail.name}员工档案详情

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$edu"} + + + + + + + {/notempty} + {notempty name="$work"} + + + + + + + {/notempty} + {notempty name="$certificate"} + + + + + + + {/notempty} + {notempty name="$certificate"} + + + + + + + {/notempty} + {notempty name="$language"} + + + + + + + {/notempty} + {notempty name="$detail.file_ids"} + + + + + + + {/notempty} +
              基本信息
              员工姓名{$detail.name}员工性别 + {eq name="$detail.sex" value="1"}男{/eq} + {eq name="$detail.sex" value="2"}女{/eq} + 头像 +
              + +
              +
              出生日期{$detail.birthday}身份证号码{$detail.idcard}
              政治面貌 + {eq name="$detail.political" value="0"}无{/eq} + {eq name="$detail.political" value="1"}中共党员{/eq} + {eq name="$detail.political" value="2"}团员{/eq} + 婚姻状况 + {eq name="$detail.marital_status" value="1"}未婚{/eq} + {eq name="$detail.marital_status" value="2"}已婚{/eq} +
              民族{$detail.nation}籍贯{$detail.native_place}
              户口性质 + {eq name="$detail.resident_type" value="1"}农村户口{/eq} + {eq name="$detail.resident_type" value="2"}城镇户口{/eq} + 户口所在地{$detail.resident_place}
              毕业院校{$detail.graduate_school}毕业日期{$detail.graduate_day}
              最高学位{$detail.education}专业{$detail.speciality}参加工作时间{$detail.work_date}
              家庭住址{$detail.home_address}手机号码{$detail.mobile}电子邮箱{$detail.email}
              现住地址{$detail.current_address}紧急联系人{$detail.contact}紧急联系电话{$detail.contact_mobile}
              员工简介 + {$detail.desc|default=''} +
              入职信息
              所在部门{$detail.department}上级主管{$detail.pname|default='无'}岗位{$detail.position}
              入职日期{$detail.entry_time|date='Y-m-d'}职务 + {volist name=":get_base_type_data('basic_user',1)" id="v"} + {eq name="$detail.position_name" value="$v.id"}{$v.title}{/eq} + {/volist} + 职级 + {volist name=":get_base_type_data('basic_user',2)" id="v"} + {eq name="$detail.position_rank" value="$v.id"}{$v.title}{/eq} + {/volist} +
              员工类型 + {eq name="$detail.type" value="3"}实习{/eq} + {eq name="$detail.type" value="2"}试用{/eq} + {eq name="$detail.type" value="1"}正式{/eq} + , + {eq name="$detail.is_staff" value="1"}企业员工{/eq} + {eq name="$detail.is_staff" value="2"}劳动派遣{/eq} + {eq name="$detail.is_staff" value="3"}兼职人员{/eq} + 员工工号{$detail.job_number}社保号{$detail.social_account}
              工资卡开户行{$detail.bank_info}工资卡帐号{$detail.bank_account}公积金号{$detail.provident_account}
              教育经历
              + + + + + + + + + + {volist name="$edu" id="v"} + + + + + + + + + {/volist} +
              开始时间结束时间就读院校学习专业所获学历备注说明
              {$v.start_time}{$v.end_time}{$v.title}{$v.speciality}{$v.education}{$v.remark}
              +
              工作经历
              + + + + + + + + + {volist name="$work" id="v"} + + + + + + + + {/volist} +
              开始时间结束时间公司名称职位备注说明
              {$v.start_time}{$v.end_time}{$v.title}{$v.position}{$v.remark}
              +
              相关证书
              + + + + + + + + {volist name="$certificate" id="v"} + + + + + + + {/volist} +
              证书名称获得时间颁发机构备注说明
              {$v.title}{$v.start_time}{$v.authority}{$v.remark}
              +
              计算机技能
              + + + + + + + {volist name="$skills" id="v"} + + + + + + {/volist} +
              技能名称熟悉程度备注说明
              {$v.title} + {eq name="$v.know" value="1"}熟练{/eq} + {eq name="$v.know" value="2"}良好{/eq} + {eq name="$v.know" value="3"}一般{/eq} + {eq name="$v.know" value="4"}较差{/eq} + {$v.remark}
              +
              语言能力
              + + + + + + + {volist name="$language" id="v"} + + + + + + {/volist} +
              语言名称熟悉程度备注说明
              {$v.title} + {eq name="$v.know" value="1"}熟练{/eq} + {eq name="$v.know" value="2"}良好{/eq} + {eq name="$v.know" value="3"}一般{/eq} + {eq name="$v.know" value="4"}较差{/eq} + {$v.remark}
              +
              档案相关附件
              +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              + +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/laborcontract/add.html b/app/user/view/laborcontract/add.html new file mode 100644 index 0000000..3f59b95 --- /dev/null +++ b/app/user/view/laborcontract/add.html @@ -0,0 +1,146 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              新增员工合同

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$cate_id" value="1"} + + + + + + + + + + + + + {/eq} + {in name="$cate_id" value="2,3"} + + + + + {/in} + + + + + + + + +
              合同类别{$cate_title}合同类型新签合同
              员工姓名* + + + 签约主体公司* + +
              合同名称* + + 合同编码* + +
              签订日期* + + 合同属性* + +
              合同生效时间* + + 合同失效时间* + +
              员工试用月数* + + 试用结束时间* + +
              试用工资(元)* + + 转正工资(元)* + +
              工资费用(元)* + +
              备注说明 + +
              相关附件 +
              + +
              +
              +
              + + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/laborcontract/add_change.html b/app/user/view/laborcontract/add_change.html new file mode 100644 index 0000000..6abd7a4 --- /dev/null +++ b/app/user/view/laborcontract/add_change.html @@ -0,0 +1,150 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              变更员工合同

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.cate" value="1"} + + + + + + + + + + + + + {/eq} + {in name="$detail.cate" value="2,3"} + + + + + {/in} + + + + + + + + +
              合同类别{$detail.cate_str}合同类型变更合同
              续签协议{$detail.title}
              员工姓名{$detail.user_name|default=''}签约主体公司 + +
              合同名称* + + 合同编码* + +
              签订日期* + + 合同属性* + +
              合同生效时间* + + 合同失效时间* + +
              员工试用月数* + + 试用结束时间* + +
              试用工资(元)* + + 转正工资(元)* + +
              工资费用(元)* + +
              备注说明 + +
              相关附件 +
              + +
              +
              +
              + + + + + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/laborcontract/add_renewal.html b/app/user/view/laborcontract/add_renewal.html new file mode 100644 index 0000000..f2e40af --- /dev/null +++ b/app/user/view/laborcontract/add_renewal.html @@ -0,0 +1,144 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              续签员工合同

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.cate" value="1"} + + + + + + + + + + + + + {/eq} + {in name="$detail.cate" value="2,3"} + + + + + {/in} + + + + + + + + +
              合同类别{$detail.cate_str}合同类型续签合同
              续签协议{$detail.title}
              员工姓名{$detail.user_name|default=''}签约主体公司{$detail.enterprise|default=''}
              合同名称* + + 合同编码* + +
              签订日期* + + 合同属性* + +
              合同生效时间* + + 合同失效时间* + +
              员工试用月数* + + 试用结束时间* + +
              试用工资(元)* + + 转正工资(元)* + +
              工资费用(元)* + +
              备注说明 + +
              相关附件 +
              + +
              +
              +
              + + + + + + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/laborcontract/datalist.html b/app/user/view/laborcontract/datalist.html new file mode 100644 index 0000000..6ad65b3 --- /dev/null +++ b/app/user/view/laborcontract/datalist.html @@ -0,0 +1,193 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + +
              +
              + +
              +
              + +
              +
              + + +
              +
              + +
              +
              + + +
              +
              +
              +
              + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/laborcontract/edit.html b/app/user/view/laborcontract/edit.html new file mode 100644 index 0000000..425eda4 --- /dev/null +++ b/app/user/view/laborcontract/edit.html @@ -0,0 +1,152 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              编辑员工合同

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.cate" value="1"} + + + + + + + + + + + + + {/eq} + {in name="$detail.cate" value="2,3"} + + + + + {/in} + + + + + + + + +
              合同类别{$detail.cate_str}合同类型新签合同
              员工姓名* + + + 签约主体公司* + +
              合同名称* + + 合同编码* + +
              签订日期* + + 合同属性* + +
              合同生效时间* + + 合同失效时间* + +
              员工试用月数* + + 试用结束时间* + +
              试用工资(元)* + + 转正工资(元)* + +
              工资费用(元)* + +
              备注说明 + +
              相关附件 +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              +
              + + + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/laborcontract/view.html b/app/user/view/laborcontract/view.html new file mode 100644 index 0000000..19c1fd0 --- /dev/null +++ b/app/user/view/laborcontract/view.html @@ -0,0 +1,150 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              员工合同详细信息

              + + + + + + + + {gt name="$detail.renewal_pid" value="0"} + + + + + {/gt} + {gt name="$detail.change_pid" value="0"} + + + + + {/gt} + + + + + + + + + + + + + + + + + + + + + + + + + + {eq name="$detail.cate" value="1"} + + + + + + + + + + + + + {/eq} + {in name="$detail.cate" value="2,3"} + + + + + {/in} + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} + + + {eq name="$detail.status" value="1"} + + {/eq} + {eq name="$detail.status" value="2"} + + {/eq} + {eq name="$detail.status" value="3"} + + {/eq} + + + + {empty name="$renewal"} + + {else/} + + {/empty} + + + + {empty name="$change"} + + {else/} + + {/empty} + +
              合同类别{$detail.cate_str}合同类型{$detail.types_str}
              续签母协议{$detail.renewal_ptitle}
              变更母协议{$detail.change_ptitle}
              员工姓名{$detail.user_name}签约主体公司{$detail.enterprise}
              合同名称{$detail.title}合同编码{$detail.code}
              签订日期{$detail.sign_time}合同属性{$detail.properties_str}
              合同生效时间{$detail.start_time}合同失效时间{$detail.end_time}
              员工试用月数{$detail.trial_months}试用结束时间{$detail.trial_end_time}
              试用工资(元){$detail.trial_salary}转正工资(元){$detail.worker_salary}
              工资费用(元){$detail.worker_salary}
              备注说明{$detail.remark|default=''}
              相关附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              合同状态正常解除合同已到期已解除恢复合同
              续签状态未续签{eq name="$detail.status" value="1"},新增续签合同{/eq}已续签,续签日期:{$renewal.create_time|date="Y-m-d"}。续签合同详情
              变更状态未变更{eq name="$detail.status" value="1"},新增变更合同{/eq}已变更,续签日期:{$change.create_time|date="Y-m-d"}。变更合同详情
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/personal/change.html b/app/user/view/personal/change.html new file mode 100644 index 0000000..ad47a9e --- /dev/null +++ b/app/user/view/personal/change.html @@ -0,0 +1,177 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              +
                +
              • 全部
              • +
              • 我申请的
              • +
              • 待我审批
              • +
              • 我已审批
              • +
              • 抄送我的
              • +
              +
              +
              +
              +
              + +
              +
              + +
              +
              + + + +
              +
              +
              +
              + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/personal/change_add.html b/app/user/view/personal/change_add.html new file mode 100644 index 0000000..9502eb6 --- /dev/null +++ b/app/user/view/personal/change_add.html @@ -0,0 +1,174 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              人事调动

              + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + + + +
              调动员工* + + + + 调出部门* + +
              调动日期*调入部门* + + +
              调动原因* + +
              附件 +
              + +
              +
              + {else/} + + + + + + + + + + + + + + + + + + + + + +
              调动员工{$detail.name}调出部门{$detail.from_department}
              调动日期*调入部门* + + +
              调动原因* + +
              附件 +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              + {/if} +
              +
              + + + +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/personal/change_view.html b/app/user/view/personal/change_view.html new file mode 100644 index 0000000..cabbc2c --- /dev/null +++ b/app/user/view/personal/change_view.html @@ -0,0 +1,60 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              人事调动

              + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
              调动员工{$detail.name}调出部门{$detail.from_department}
              调动日期{$detail.move_time}调入部门{$detail.to_department}
              调动原因{$detail.remark}
              执行状态{$detail.status_str}执行时间{$detail.connect_time_str}
              相关附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo,'view')}
              + {/volist} +
              +
              +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/personal/leave.html b/app/user/view/personal/leave.html new file mode 100644 index 0000000..8e9b543 --- /dev/null +++ b/app/user/view/personal/leave.html @@ -0,0 +1,175 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              +
                +
              • 全部
              • +
              • 我申请的
              • +
              • 待我审批
              • +
              • 我已审批
              • +
              • 抄送我的
              • +
              +
              +
              +
              +
              + +
              +
              + + +
              +
              + +
              +
              + + + +
              +
              +
              +
              + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/personal/leave_add.html b/app/user/view/personal/leave_add.html new file mode 100644 index 0000000..a7d45c0 --- /dev/null +++ b/app/user/view/personal/leave_add.html @@ -0,0 +1,197 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              离职申请

              + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              离职员工* + + + + 所在部门
              离职日期*上级领导* + + +
              资料接受人* + + + 参与交接人员* + + +
              离职原因* + +
              附件 +
              + +
              +
              + {else/} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              离职员工{$detail.name}所在部门 + {$detail.department} + + +
              离职日期* + 上级领导* + + +
              资料接受人* + + + 参与交接人员* + + +
              离职原因* + +
              附件 +
              + + {notempty name="$detail.file_ids"} + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} + {/notempty} +
              +
              + {/if} +
              +
              + + + +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/personal/leave_view.html b/app/user/view/personal/leave_view.html new file mode 100644 index 0000000..f93b95b --- /dev/null +++ b/app/user/view/personal/leave_view.html @@ -0,0 +1,66 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              离职申请

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {notempty name="$detail.file_ids"} + + + + + {/notempty} +
              离职员工{$detail.name} 「{$detail.position}」所在部门{$detail.department}
              离职日期{$detail.quit_time}上级领导{$detail.lead_admin_name}
              资料接受人{$detail.connect_name}参与交接人员{$detail.connect_names}
              离职原因{$detail.remark}
              交接状态{$detail.status_str}交接时间{$detail.connect_time_str}
              相关附件 +
              + {volist name="$detail.file_array" id="vo"} +
              {:file_card($vo)}
              + {/volist} +
              +
              +
              +
              +{/block} + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/position/add.html b/app/user/view/position/add.html new file mode 100644 index 0000000..47a3f01 --- /dev/null +++ b/app/user/view/position/add.html @@ -0,0 +1,106 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              岗位职称

              + {if condition="$id eq 0"} + + + + + + + + + + + + + + + + + + + +
              岗位名称* + + 岗位工时单价(元)* + +
              状态* + + +
              权限角色* + {volist name="$group" id="v"} + + {/volist} +
              岗位备注 + +
              + {else/} + + + + + + + + + + + + + + + + + + + +
              岗位名称* + + 岗位工时单价(元)* + +
              状态* + + +
              权限角色* + {volist name="$group" id="v"} + + {/volist} +
              岗位备注 + +
              + {/if} +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/position/index.html b/app/user/view/position/index.html new file mode 100644 index 0000000..f661300 --- /dev/null +++ b/app/user/view/position/index.html @@ -0,0 +1,117 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +
              +
              + + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/position/view.html b/app/user/view/position/view.html new file mode 100644 index 0000000..5522887 --- /dev/null +++ b/app/user/view/position/view.html @@ -0,0 +1,79 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              岗位信息

              + + + + + + + + + + + + + + + + + +
              岗位名称 + {$detail.title} + 岗位工时单价 + {$detail.work_price} + 状态 + {eq name="$detail.status" value="1" }正常{/eq} + {eq name="$detail.status" value="0" }禁止登录{/eq} +
              用户角色 + {volist name="$group" id="v"} + {eq name="$v.checked" value="1" }{$v.title},{/eq} + {/volist} +
              岗位备注 + {$detail.remark} +
              +

              岗位权限

              + + {volist name="role_rule" id="vo"} + + + {notempty name="vo.children"} + + {/notempty} + + {/volist} +
              + + +
              + {volist name="vo.children" key="k" id="voo"} +
              + +
              + {notempty name="voo.children"} +
              + {volist name="voo.children" id="vooo"} +
              + +
              + {/volist} +
              + {/notempty} + {/volist} +
              +
              +
              +{/block} + \ No newline at end of file diff --git a/app/user/view/rewards/add.html b/app/user/view/rewards/add.html new file mode 100644 index 0000000..501a6fe --- /dev/null +++ b/app/user/view/rewards/add.html @@ -0,0 +1,111 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              奖罚信息

              + + {eq name="$id" value="0"} + + + + + + + + + {else/} + + + + + + + + + {/eq} + + + + + + + + + + + + + + + + +
              奖惩项目* + + 奖惩类型 + + + 当前状态 + + +
              奖惩项目* + + 奖惩类型 + + + 当前状态 + + +
              员工姓名* + + + 奖惩金额(元)* + + 奖惩日期* + +
              奖惩物品 + +
              奖罚描述 + +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/rewards/datalist.html b/app/user/view/rewards/datalist.html new file mode 100644 index 0000000..2be6cd0 --- /dev/null +++ b/app/user/view/rewards/datalist.html @@ -0,0 +1,151 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + +
              +
              + +
              +
              + +
              +
              + + +
              +
              + +
              +
              + +
              +
              + + +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/rewards/view.html b/app/user/view/rewards/view.html new file mode 100644 index 0000000..302aec2 --- /dev/null +++ b/app/user/view/rewards/view.html @@ -0,0 +1,53 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              奖罚信息

              + + + + + + + + + + + + + + + + + + + + + + + + + +
              员工姓名{$detail.user_name|default=''}奖惩类型 + {eq name="$detail.types" value="1"}奖励{/eq} + {eq name="$detail.types" value="2"}惩罚{/eq} + 当前状态 + {eq name="$detail.status" value="1"}『待执行』{/eq} + {eq name="$detail.status" value="2"}『已执行』{/eq} +
              奖惩项目{$detail.cate}奖惩金额(元){$detail.cost}奖惩日期{$detail.rewards_time}
              奖惩物品{$detail.thing}
              奖罚描述{$detail.remark|default=''}
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/rewardscate/add.html b/app/user/view/rewardscate/add.html new file mode 100644 index 0000000..93b87b3 --- /dev/null +++ b/app/user/view/rewardscate/add.html @@ -0,0 +1,49 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              奖惩项目

              + + + + + + + +
              奖惩项目名称* + + 排序 + +
              +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/rewardscate/datalist.html b/app/user/view/rewardscate/datalist.html new file mode 100644 index 0000000..980c8df --- /dev/null +++ b/app/user/view/rewardscate/datalist.html @@ -0,0 +1,124 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} + +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/talent/add.html b/app/user/view/talent/add.html new file mode 100644 index 0000000..756f18b --- /dev/null +++ b/app/user/view/talent/add.html @@ -0,0 +1,291 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              入职申请

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {empty name="$detail"} + + + + + + + + + {else/} + + + + + + + + + {/empty} + + {empty name="$detail"} + + + {else/} + + + {/empty} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {empty name="$detail"} + + + + + + + + + {else/} + + + + + + + + + {/empty} +
              基本信息
              员工姓名*性别* + {empty name="$detail"} + + + {else/} + + + {/empty} + 头像照片* +
              +
              + {empty name="$detail"} + + {else/} + + {/empty} + +
              + +
              +
              手机号码*电子邮箱
              出生日期身份证号码
              民族籍贯
              政治面貌 + + 婚姻状况 + + + 参加工作时间
              政治面貌 + + 婚姻状况 + + + 参加工作时间
              户口性质 + + + 户口性质 + + + 户口所在地
              家庭住址紧急联系人
              现住地址紧急联系电话
              个人简介 + +
              教育信息
              毕业院校毕业日期
              专业最高学位
              入职信息
              入职部门*上级主管 + + + 入职时间*
              岗位职称* + + 职务* + + 职级* + +
              岗位职称* + + 职务* + + 职级* + +
              + +
              + +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/talent/datalist.html b/app/user/view/talent/datalist.html new file mode 100644 index 0000000..2729b15 --- /dev/null +++ b/app/user/view/talent/datalist.html @@ -0,0 +1,221 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} + +
              +
              +
              +
                +
              • 全部
              • +
              • 我申请的
              • +
              • 待我审批
              • +
              • 我已审批
              • +
              • 抄送我的
              • +
              +
              +
              +
              +
              + +
              +
              + + +
              +
              + +
              +
              + +
              +
              + + + +
              +
              +
              +
              + + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/talent/set.html b/app/user/view/talent/set.html new file mode 100644 index 0000000..4222c2a --- /dev/null +++ b/app/user/view/talent/set.html @@ -0,0 +1,207 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              转入职

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              基本信息
              员工姓名{$detail.name|default=''}性别 + {eq name="$detail.sex" value="1"}男{/eq} + {eq name="$detail.sex" value="2"}女{/eq} + 照片头像 +
              +
              + +
              +
              +
              手机号码*电子邮箱
              出生日期{$detail.birthday|default='-'}身份证号码{$detail.idcard|default='-'}
              民族{$detail.nation|default='-'}籍贯{$detail.native_place|default='-'}
              政治面貌 + {eq name="$detail.political" value="0"}无{/eq} + {eq name="$detail.political" value="1"}中共党员{/eq} + {eq name="$detail.political" value="2"}共青团员{/eq} + 婚姻状况 + {eq name="$detail.marital_status" value="1"}未婚{/eq} + {eq name="$detail.marital_status" value="2"}已婚{/eq} + 参加工作时间{$detail.work_date|default='-'}
              户口性质 + {eq name="$detail.resident_type" value="1"}农村户口{/eq} + {eq name="$detail.resident_type" value="2"}城镇户口{/eq} + 户口所在地{$detail.resident_place|default='-'}
              家庭住址{$detail.home_address|default='-'}紧急联系人{$detail.contact|default='-'}
              现住地址{$detail.current_address|default='-'}紧急联系电话{$detail.contact_mobile|default='-'}
              个人简介{$detail.desc|default='-'}
              教育信息
              毕业院校{$detail.graduate_school|default='-'}毕业日期{$detail.graduate_day|default='-'}
              专业{$detail.speciality|default='-'}最高学位{$detail.education|default='-'}
              入职信息
              入职部门*上级主管 + + + 入职时间*
              岗位职称* + + 职务* + + 职级* + +
              员工类型* + + + + 身份类型* + + + + 工号
              入职评语 + +
              + {eq name="$detail.status" value="1"} +
              + + + + + +
              + {/eq} +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/talent/view.html b/app/user/view/talent/view.html new file mode 100644 index 0000000..d97d969 --- /dev/null +++ b/app/user/view/talent/view.html @@ -0,0 +1,139 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              +

              入职审批信息{eq name="$detail.status" value="2"}『已入职』{/eq}

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              基本信息
              员工姓名{$detail.name|default=''}性别 + {eq name="$detail.sex" value="1"}男{/eq} + {eq name="$detail.sex" value="2"}女{/eq} + 照片头像 +
              +
              + +
              +
              +
              手机号码{$detail.mobile|default=''}电子邮箱{$detail.email|default='-'}
              出生日期{$detail.birthday|default='-'}身份证号码{$detail.idcard|default='-'}
              民族{$detail.nation|default='-'}籍贯{$detail.native_place|default='-'}
              政治面貌 + {eq name="$detail.political" value="0"}无{/eq} + {eq name="$detail.political" value="1"}中共党员{/eq} + {eq name="$detail.political" value="2"}共青团员{/eq} + 婚姻状况 + {eq name="$detail.marital_status" value="1"}未婚{/eq} + {eq name="$detail.marital_status" value="2"}已婚{/eq} + 参加工作时间{$detail.work_date|default='-'}
              户口性质 + {eq name="$detail.resident_type" value="1"}农村户口{/eq} + {eq name="$detail.resident_type" value="2"}城镇户口{/eq} + 户口所在地{$detail.resident_place|default='-'}
              家庭住址{$detail.home_address|default='-'}紧急联系人{$detail.contact|default='-'}
              现住地址{$detail.current_address|default='-'}紧急联系电话{$detail.contact_mobile|default='-'}
              个人简介{$detail.desc|default='-'}
              教育信息
              毕业院校{$detail.graduate_school|default='-'}毕业日期{$detail.graduate_day|default='-'}
              专业{$detail.speciality|default='-'}最高学位{$detail.education|default='-'}
              入职信息
              入职部门{$detail.department|default='-'}上级主管{$detail.pname|default='-'}入职时间{$detail.entry_time|default='-'}
              岗位职称{$detail.position|default='-'}职务{$detail.position_name_str|default='-'}职级{$detail.position_rank_str|default='-'}
              +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/user/add.html b/app/user/view/user/add.html new file mode 100644 index 0000000..2a2d382 --- /dev/null +++ b/app/user/view/user/add.html @@ -0,0 +1,289 @@ +{extend name="../../base/view/common/base" /} + +{block name="body"} +
              + {if condition="$id eq 0"} +

              添加员工信息

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              员工姓名*员工性别* + + + 初始密码 + {$reg_pwd} + +
              手机号码*电子邮箱*照片头像
              (如若不上传
              系统将自动生成)
              +
              +
              + + +
              + +
              +
              主部门*次要部门
              岗位职称* + + 上级主管 + + +
              入职日期* + + 身份类型* + + + + 隐藏联系方式 + + +
              员工类型* + + + +
              数据权限* + + + + + + + + + + + +
              + {else/} +

              编辑员工信息

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              员工姓名* + + 登录账号 + {$detail.username} + 初始密码 + {empty name="$detail.reg_pwd"} + 密码已重置 + {else/} + {$detail.reg_pwd} + {/empty} +
              手机号码* + + 电子邮箱* + + 头像
              (如若不上传
              系统将自动生成)
              +
              +
              + + +
              + +
              +
              员工性别* + + + 入职日期* + +
              主部门*次要部门
              岗位职称* + + 上级主管 + + +
              员工类型* + + + + 身份类型* + + + + 隐藏联系方式 + + +
              数据权限* + + + + + + + + + + + +
              + {/if} + +
              + + + +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/user/index.html b/app/user/view/user/index.html new file mode 100644 index 0000000..aca2483 --- /dev/null +++ b/app/user/view/user/index.html @@ -0,0 +1,302 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +
              +

              企业组织架构

              +
              +
              +
              +
              +
              + +
              +
              + +
              +
              + +
              +
              + + + +
              +
              +
              +
              +
              + + + +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/app/user/view/user/view.html b/app/user/view/user/view.html new file mode 100644 index 0000000..72c0a93 --- /dev/null +++ b/app/user/view/user/view.html @@ -0,0 +1,189 @@ +{extend name="../../base/view/common/base" /} +{block name="style"} + +{/block} + +{block name="body"} +
              +

              员工信息

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              登录账号{$detail.username}登录密码 + {empty name="$detail.reg_pwd"} + 密码已重置 + 重设新密码 + {else/} + {$detail.reg_pwd} + 复制初始密码 + {/empty} + 员工状态 + {eq name="$detail.status" value="0"}禁止登录{/eq} + {eq name="$detail.status" value="1"}正常{/eq} + {eq name="$detail.status" value="2"}已离职{/eq} + 头像 +
              + +
              +
              员工姓名 + {$detail.name} + {eq name="$detail.sex" value="1"} {/eq} + {eq name="$detail.sex" value="2"} {/eq} + 手机号码{$detail.mobile}电子邮箱{$detail.email}
              所在主部门{$detail.department}所在次部门{$detail.department_names|default=''}上级主管{$detail.pname|default=''}
              岗位职称{$detail.position}入职日期{$detail.entry_time | date='Y-m-d'}员工类型 + {eq name="$detail.type" value="1"}正式员工{/eq} + {eq name="$detail.type" value="2"}试用员工{/eq} + {eq name="$detail.type" value="3"}实 习 生{/eq} +
              身份类型 + {eq name="$detail.is_staff" value="1"}企业员工{/eq} + {eq name="$detail.is_staff" value="2"}劳务派遣{/eq} + {eq name="$detail.is_staff" value="3"}兼职员工{/eq} + 隐藏联系方式 + {eq name="$detail.is_hide" value="0"}否{/eq} + {eq name="$detail.is_hide" value="1"}是{/eq} +
              最后登录时间{eq name="$detail.last_login_time" value="0"}-{else/}{$detail.last_login_time|date='Y-m-d H:i:s'}{/eq}最后登录IP{$detail.last_login_ip}累计登录次数{$detail.login_num}
              数据权限 + + + + + + + + + + + +
              +

              用户权限

              + + {volist name="role_rule" id="vo"} + + + {notempty name="vo.children"} + + {/notempty} + + {/volist} +
              + + +
              + {volist name="vo.children" key="k" id="voo"} +
              + +
              + {notempty name="voo.children"} +
              + {volist name="voo.children" id="vooo"} +
              + +
              + {/volist} +
              + {/notempty} + {/volist} +
              +
              +
              +{/block} + + + +{block name="script"} + +{/block} + \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..dc744c6 --- /dev/null +++ b/composer.json @@ -0,0 +1,68 @@ +{ + "name": "gougu/oa", + "description": "the gouguoa project", + "type": "project", + "keywords": [ + "dev", + "oa", + "cms" + ], + "homepage": "http://www.gouguoa.com", + "license": "Apache-2.0", + "authors": [ + { + "name": "oa", + "email": "hdm58@qq.com" + } + ], + "require": { + "php": ">=8.2", + "ext-curl": "*", + "ext-fileinfo": "*", + "ext-openssl": "*", + "ext-pdo": "*", + "ext-zip": "*", + "topthink/framework": "^8.1.2", + "topthink/think-orm": "^4.0.5", + "topthink/think-filesystem": "^3.0", + "topthink/think-multi-app": "^1.0", + "topthink/think-view": "^2.0", + "topthink/think-captcha": "^3.0", + "topthink/think-helper": "^3.1", + "topthink/think-image": "^1.0.8", + "overtrue/pinyin": "^5.2", + "phpmailer/phpmailer": "^6.8", + "firebase/php-jwt": "^7.0", + "phpoffice/phpspreadsheet": "^1.2", + "phpoffice/phpword": "^1.2", + "mpdf/mpdf": "^8.1", + "alibabacloud/dysmsapi-20170525":"^4.3" + }, + "require-dev": { + "symfony/var-dumper": "^6.0", + "topthink/think-trace":"^1.6" + }, + "autoload": { + "psr-4": { + "app\\": "app" + }, + "psr-0": { + "": "extend/" + } + }, + "config": { + "preferred-install": "dist" + }, + "scripts": { + "post-autoload-dump": [ + "@php think service:discover", + "@php think vendor:publish" + ] + }, + "repositories": { + "packagist": { + "type": "composer", + "url": "https://mirrors.tencent.com/composer/" + } + } +} diff --git a/config/aliyun.php b/config/aliyun.php new file mode 100644 index 0000000..35b4dbe --- /dev/null +++ b/config/aliyun.php @@ -0,0 +1,11 @@ + 'xxxxxxxxxxxxxxxxxxxxxxx', + 'access_key_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', + 'sign_name' => 'xxxxxxxxxxxxx', // 短信签名 + 'region_id' => 'cn-hangzhou', // 固定值,除非特殊要求 +]; diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..21fed66 --- /dev/null +++ b/config/app.php @@ -0,0 +1,65 @@ + env('app.host', ''), + // 应用的命名空间 + 'app_namespace' => '', + // 是否启用路由 + 'with_route' => true, + // 默认应用 + 'default_app' => 'home', + // 默认时区 + 'default_timezone' => 'Asia/Shanghai', + //授权域名 + 'auth_host' => 'oa.a.gougucms.com', + //授权key + 'auth_key' => 'YcXACHWh0s', + //授权码 + 'auth_code' => 'o8aH.naS.4g8o7uwgkuKclmGsO.5c6oWmiY5cIXjAMCFHoW5ha0lslmkoabii9lteNERxeXYrUDByeFhBeFE9PQ==', + // 应用映射(自动多应用模式有效) + 'app_map' => [], + // 域名绑定(自动多应用模式有效) + 'domain_bind' => [], + // 禁止URL访问的应用列表(自动多应用模式有效) + 'deny_app_list' => [], + + // 默认全局过滤方法 用逗号分隔多个 + 'default_filter' => 'htmlspecialchars', + + // 异常页面的模板文件 + 'exception_tmpl' => app()->getRootPath() . '/public/tpl/think_exception.tpl', + // 默认跳转页面对应的模板文件【新增】 + 'dispatch_success_tmpl' => app()->getRootPath() . '/public/tpl/dispatch_jump.tpl', + 'dispatch_error_tmpl' => app()->getRootPath() . '/public/tpl/dispatch_jump.tpl', + // 错误显示信息,非调试模式有效 + 'error_message' => '😔错误~', + // 显示错误信息 + 'show_error_msg' => false, + + 'page_size' => 20,//分页默认数据长度 + + 'file_size' => 50,//附件大小50M + + 'session_user' => 'gougu_user', + + 'session_admin' => 'gougu_admin', + + 'http_exception_template' => [ + // 登录失败 + 401 => public_path() . 'tpl/401.html', + // 禁止访问 + 403 => public_path() . 'tpl/403.html', + // 无法找到文件 + 404 => public_path() . 'tpl/404.html', + // 无权限访问 + 405 => public_path() . 'tpl/405.html', + // 找不到数据 + 406 => public_path() . 'tpl/406.html', + //内部服务器错误 + 500 => public_path() . 'tpl/500.html', + ] +]; diff --git a/config/approve.php b/config/approve.php new file mode 100644 index 0000000..ae80622 --- /dev/null +++ b/config/approve.php @@ -0,0 +1,59 @@ + [ + [ + 'id' => '1', + 'title'=> '假勤', + 'db_type'=>1, + 'db_name'=>'', + ], + [ + 'id' => '2', + 'title'=> '行政', + 'db_type'=>1, + 'db_name'=>'', + ], + [ + 'id' => '3', + 'title'=> '财务', + 'db_type'=>1, + 'db_name'=>'', + ], + [ + 'id' => '4', + 'title'=> '人事', + 'db_type'=>1, + 'db_name'=>'', + ], + [ + 'id' => '5', + 'title'=> '其他', + 'db_type'=>1, + 'db_name'=>'', + ], + [ + 'id' => '6', + 'title'=> '报销' , + 'db_type'=>2, + 'db_name'=>'', + ], + [ + 'id' => '7', + 'title'=> '发票', + 'db_type'=>3, + 'db_name'=>'', + ], + [ + 'id' => '8', + 'title'=> '合同', + 'db_type'=>4, + 'db_name'=>'', + ], + ], +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..a8d69d2 --- /dev/null +++ b/config/cache.php @@ -0,0 +1,29 @@ + env('cache.driver', 'file'), + + // 缓存连接方式配置 + 'stores' => [ + 'file' => [ + // 驱动方式 + 'type' => 'File', + // 缓存保存目录 + 'path' => '', + // 缓存前缀 + 'prefix' => '', + // 缓存有效期 0表示永久缓存 + 'expire' => 0, + // 缓存标签前缀 + 'tag_prefix' => 'tag:', + // 序列化机制 例如 ['serialize', 'unserialize'] + 'serialize' => [], + ], + // 更多的缓存连接 + ], +]; diff --git a/config/captcha.php b/config/captcha.php new file mode 100644 index 0000000..9661b06 --- /dev/null +++ b/config/captcha.php @@ -0,0 +1,39 @@ + 5, + // 验证码字符集合 + 'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY', + // 验证码过期时间 + 'expire' => 1800, + // 是否使用中文验证码 + 'useZh' => false, + // 是否使用算术验证码 + 'math' => true, + // 是否使用背景图 + 'useImgBg' => false, + //验证码字符大小 + 'fontSize' => 25, + // 是否使用混淆曲线 + 'useCurve' => true, + //是否添加杂点 + 'useNoise' => true, + // 验证码字体 不设置则随机 + 'fontttf' => '', + //背景颜色 + 'bg' => [243, 251, 254], + // 验证码图片高度 + 'imageH' => 0, + // 验证码图片宽度 + 'imageW' => 0, + + // 添加额外的验证码设置 + // verify => [ + // 'length'=>4, + // ... + //], +]; diff --git a/config/console.php b/config/console.php new file mode 100644 index 0000000..e351a61 --- /dev/null +++ b/config/console.php @@ -0,0 +1,17 @@ + [ + 'crud' => 'app\crud\command\Crud', + ], + +]; + diff --git a/config/cookie.php b/config/cookie.php new file mode 100644 index 0000000..f728024 --- /dev/null +++ b/config/cookie.php @@ -0,0 +1,18 @@ + 0, + // cookie 保存路径 + 'path' => '/', + // cookie 有效域名 + 'domain' => '', + // cookie 启用安全传输 + 'secure' => false, + // httponly设置 + 'httponly' => false, + // 是否使用 setcookie + 'setcookie' => true, +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..8f05b71 --- /dev/null +++ b/config/database.php @@ -0,0 +1,54 @@ + 'mysql', + // 自定义时间查询规则 + 'time_query_rule' => [], + // 自动写入时间戳字段 + // true为自动识别类型 false关闭 + // 字符串则明确指定时间字段类型 支持 int timestamp datetime date + 'auto_timestamp' => true, + // 时间字段取出后的默认时间格式 + 'datetime_format' => 'Y-m-d H:i:s', + // 数据库连接配置信息 + 'connections' => [ + 'mysql' => [ + // 数据库类型 + 'type' => 'mysql', + // 服务器地址 + 'hostname' => '1Panel-mysql-jQfe', + // 数据库名 + 'database' => 'oa', + // 用户名 + 'username' => 'oa', + // 密码 + 'password' => 'yphMDpiXRJjm8N5b', + // 端口 + 'hostport' => '3306', + // 数据库表前缀 + 'prefix' => 'oa_', + // 数据库连接参数 + 'params' => [], + // 数据库编码默认采用utf8mb4 + 'charset' => 'utf8mb4', + // 数据库调试模式 + 'debug' => false, + // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'deploy' => 0, + // 数据库读写是否分离 主从式有效 + 'rw_separate' => false, + // 读写分离后 主服务器数量 + 'master_num' => 1, + // 指定从服务器序号 + 'slave_no' => '', + // 是否严格检查字段是否存在 + 'fields_strict' => true, + // 是否需要断线重连 + 'break_reconnect' => false, + // 监听SQL + 'trigger_sql' => true, + // 开启字段缓存 + 'fields_cache' => false, + ], + ], +]; \ No newline at end of file diff --git a/config/filesystem.php b/config/filesystem.php new file mode 100644 index 0000000..c851aed --- /dev/null +++ b/config/filesystem.php @@ -0,0 +1,26 @@ + Env::get('filesystem.driver', 'local'), + // 磁盘列表 + 'disks' => [ + 'local' => [ + 'type' => 'local', + 'root' => app()->getRuntimePath() . 'storage', + ], + 'public' => [ + // 磁盘类型 + 'type' => 'local', + // 磁盘路径 + 'root' => app()->getRootPath() . 'public/storage', + // 磁盘路径对应的外部URL路径 + 'url' => '/storage', + // 可见性 + 'visibility' => 'public', + ], + // 更多的磁盘配置信息 + ], +]; diff --git a/config/lang.php b/config/lang.php new file mode 100644 index 0000000..59f320f --- /dev/null +++ b/config/lang.php @@ -0,0 +1,27 @@ + env('lang.default_lang', 'zh-cn'), + // 允许的语言列表 + 'allow_lang_list' => [], + // 多语言自动侦测变量名 + 'detect_var' => 'lang', + // 是否使用Cookie记录 + 'use_cookie' => true, + // 多语言cookie变量 + 'cookie_var' => 'think_lang', + // 多语言header变量 + 'header_var' => 'think-lang', + // 扩展语言包 + 'extend_list' => [], + // Accept-Language转义为对应语言包名称 + 'accept_language' => [ + 'zh-hans-cn' => 'zh-cn', + ], + // 是否支持语言分组 + 'allow_group' => false, +]; diff --git a/config/layout.php b/config/layout.php new file mode 100644 index 0000000..875d936 --- /dev/null +++ b/config/layout.php @@ -0,0 +1,82 @@ + 1, + 'row' => 1, + 'name' => 'count', + 'title' => '模块统计', + ], + [ + 'id' => 2, + 'row' => 1, + 'name' => 'event', + 'title' => '待办事项', + ], + [ + 'id' => 3, + 'row' => 1, + 'name' => 'note', + 'title' => '企业公告', + ], + [ + 'id' => 4, + 'row' => 1, + 'name' => 'project', + 'title' => '项目列表', + ], + [ + 'id' => 5, + 'row' => 1, + 'name' => 'task', + 'title' => '任务列表', + ], + [ + 'id' => 6, + 'row' => 1, + 'name' => 'chartview', + 'title' => '今日员工活跃度', + ], + [ + 'id' => 7, + 'row' => 1, + 'name' => 'chartyear', + 'title' => '年度员工活跃度', + ], + [ + 'id' => 8, + 'row' => 2, + 'name' => 'fastentry', + 'title' => '快捷入口', + ], + [ + 'id' => 9, + 'row' => 2, + 'name' => 'approve', + 'title' => '办公审批', + ], + [ + 'id' => 13, + 'row' => 2, + 'name' => 'links', + 'title' => '办公工具', + ], + [ + 'id' => 10, + 'row' => 2, + 'name' => 'system', + 'title' => '系统信息', + ], + [ + 'id' => 11, + 'row' => 2, + 'name' => 'ranking', + 'title' => '活跃员工', + ], + [ + 'id' => 12, + 'row' => 2, + 'name' => 'action', + 'title' => '员工动态', + ] +]; diff --git a/config/log.php b/config/log.php new file mode 100644 index 0000000..78f9f2e --- /dev/null +++ b/config/log.php @@ -0,0 +1,91 @@ + env('log.channel', 'file'), + // 日志记录级别 + 'level' => [], + // 日志类型记录的通道 ['error'=>'email',...] + 'type_channel' => [], + // 关闭全局日志写入 + 'close' => false, + // 全局日志处理 支持闭包 + 'processor' => null, + + // 日志通道列表 + 'channels' => [ + 'file' => [ + // 日志记录方式 + 'type' => 'File', + // 日志保存目录 + 'path' => '', + // 单文件日志写入 + 'single' => false, + // 独立日志级别 + 'apart_level' => [], + // 最大日志文件数量 + 'max_files' => 0, + // 使用JSON格式记录 + 'json' => false, + // 日志处理 + 'processor' => null, + // 关闭通道日志写入 + 'close' => false, + // 日志输出格式化 + 'format' => '[%s][%s] %s', + // 是否实时写入 + 'realtime_write' => false, + ], + // 其它日志通道配置 + ], + 'type_action' => [ + 'login' => '登录', + 'upload' => '上传', + 'down' => '下载', + 'bak' => '备份', + 'optimize' => '优化', + 'repair' => '修复', + 'reduction' => '还原', + 'import' => '导入', + 'export' => '导出', + 'add' => '新增', + 'edit' => '编辑', + 'view' => '查看', + 'save' => '保存', + 'delete' => '删除', + 'send' => '发送', + 'disable' => '禁用', + 'close' => '关闭', + 'secure' => '解除', + 'recovery' => '恢复', + 'set' => '设置', + 'hand' => '交接', + 'apply' => '申请', + 'check' => '审核通过', + 'refue' => '审核拒绝', + 'grant' => '授予', + 'back' => '撤销', + 'topay' => '打款', + 'open' => '开具', + 'enter' => '到账', + 'tovoid' => '作废', + 'leave' => '离职', + 'get' => '获取', + 'allot' => '分配', + 'remove' => '移除', + 'clear' => '清除', + 'star' => '星标', + 'unstar' => '取消星标', + 'lock' => '锁住', + 'unlock' => '解锁', + 'tosea' => '公海移入', + 'totrash' => '废弃池移入', + 'reset' => '重新设置', + 'install' => '安装', + 'uninstall' => '卸载', + ], + +]; diff --git a/config/middleware.php b/config/middleware.php new file mode 100644 index 0000000..7e1972f --- /dev/null +++ b/config/middleware.php @@ -0,0 +1,8 @@ + [], + // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行 + 'priority' => [], +]; diff --git a/config/route.php b/config/route.php new file mode 100644 index 0000000..2f4cd12 --- /dev/null +++ b/config/route.php @@ -0,0 +1,45 @@ + '/', + // URL伪静态后缀 + 'url_html_suffix' => 'html', + // URL普通方式参数 用于自动生成 + 'url_common_param' => true, + // 是否开启路由延迟解析 + 'url_lazy_route' => false, + // 是否强制使用路由 + 'url_route_must' => false, + // 合并路由规则 + 'route_rule_merge' => false, + // 路由是否完全匹配 + 'route_complete_match' => false, + // 访问控制器层名称 + 'controller_layer' => 'controller', + // 空控制器名 + 'empty_controller' => 'Error', + // 是否使用控制器后缀 + 'controller_suffix' => false, + // 默认的路由变量规则 + 'default_route_pattern' => '[\w\.]+', + // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则 + 'request_cache_key' => false, + // 请求缓存有效期 + 'request_cache_expire' => null, + // 全局请求缓存排除规则 + 'request_cache_except' => [], + // 默认控制器名 + 'default_controller' => 'Index', + // 默认操作名 + 'default_action' => 'index', + // 操作方法后缀 + 'action_suffix' => '', + // 默认JSONP格式返回的处理方法 + 'default_jsonp_handler' => 'jsonpReturn', + // 默认JSONP处理方法 + 'var_jsonp_handler' => 'callback', +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..120cb90 --- /dev/null +++ b/config/session.php @@ -0,0 +1,19 @@ + 'PHPSESSID', + // SESSION_ID的提交变量,解决flash上传跨域 + 'var_session_id' => '', + // 驱动方式 支持file cache + 'type' => 'file', + // 存储连接标识 当type使用cache的时候有效 + 'store' => null, + // 过期时间 + 'expire' => 86400, + // 前缀 + 'prefix' => '', +]; diff --git a/config/trace.php b/config/trace.php new file mode 100644 index 0000000..fad2392 --- /dev/null +++ b/config/trace.php @@ -0,0 +1,10 @@ + 'Html', + // 读取的日志通道名 + 'channel' => '', +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..f74d49f --- /dev/null +++ b/config/view.php @@ -0,0 +1,32 @@ + 'Think', + // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 + 'auto_rule' => 1, + // 模板目录名 + 'view_dir_name' => 'view', + // 模板后缀 + 'view_suffix' => 'html', + // 模板文件名分隔符 + 'view_depr' => DIRECTORY_SEPARATOR, + // 模板引擎普通标签开始标记 + 'tpl_begin' => '{', + // 模板引擎普通标签结束标记 + 'tpl_end' => '}', + // 标签库标签开始标记 + 'taglib_begin' => '{', + // 标签库标签结束标记 + 'taglib_end' => '}', + 'tpl_replace_string' => array( + '{__STATIC__}' => '/static', + '{__GOUGU__}' => '/static/assets', + '{__CSS__}' => '/static/home/css', + '{__JS__}' => '/static/home/js', + '{__IMG__}' => '/static/home/images' + ), +]; diff --git a/config/workchat.php b/config/workchat.php new file mode 100644 index 0000000..1d24879 --- /dev/null +++ b/config/workchat.php @@ -0,0 +1,26 @@ + false, + // 企业id + 'corpid' => 'ww04ce31364b7e2322', + // 功能模块id + 'agentid' => '1000015', + // 功能模块secret + 'corpsecret' => 'VvBCWVmm9DVaTs-RbxJmSy-psruoN01VwnVqlwgxScU', + // 登录回调页面 + 'redirectUri' =>'http://www.gouguoa.com/qiye/login/callback', + 'host' =>'http://www.gouguoa.com', + // 是否是授权登录 + 'authorization' => true, + //授权域名 + 'auth_host' => '192.168.31.184', + //授权key + 'auth_key' => 'UtGcWvJkME', + //授权码 + 'auth_code' => '1D9T2J.R1o6y8t.T3/1o.91X8L4ZUft7Gpc9Wiv8Jjk1MkEymboVbhixlQeVE0aVh6akQrME4zL05SeHc9PQ==', +]; diff --git a/crud/.gitignore b/crud/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/crud/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/extend/avatars/MDAvatars.php b/extend/avatars/MDAvatars.php new file mode 100644 index 0000000..29596f8 --- /dev/null +++ b/extend/avatars/MDAvatars.php @@ -0,0 +1,432 @@ +Char = mb_strtoupper(mb_substr($Char, 0, 1, "UTF-8")); + $this->AvatarSize = $AvatarSize; + $this->Shape = $Shape; + $this->Padding = 30 * ($this->AvatarSize / 256); + $this->LetterFont = './static/font/MiSans-Regular.ttf'; + $this->AsianFont = './static/font/MiSans-Regular.ttf'; + $this->EnableAsianChar = is_file($this->AsianFont); + $path='./storage/avatars/'; + if(!is_dir($path)){ + mkdir($path, 0755, true); + } + $CNChar = ord($this->Char); + if (!$this->EnableAsianChar && + preg_match("/^[\x7f-\xff]/", $this->Char) && + !($CNChar >= ord("A") && $CNChar <= ord("z")) + ) { + //如果是中文,并且没有中文字体包,则按拼音首字母对其进行转换 + $CNByte = iconv("UTF-8", "gb2312", $this->Char); + $Code = ord($CNByte[0]) * 256 + ord($CNByte[1]) - 65536;//求其偏移量 + if ($Code >= -20319 and $Code <= -20284) $this->Char = "A"; + if ($Code >= -20283 and $Code <= -19776) $this->Char = "B"; + if ($Code >= -19775 and $Code <= -19219) $this->Char = "C"; + if ($Code >= -19218 and $Code <= -18711) $this->Char = "D"; + if ($Code >= -18710 and $Code <= -18527) $this->Char = "E"; + if ($Code >= -18526 and $Code <= -18240) $this->Char = "F"; + if ($Code >= -18239 and $Code <= -17923) $this->Char = "G"; + if ($Code >= -17922 and $Code <= -17418) $this->Char = "H"; + if ($Code >= -17417 and $Code <= -16475) $this->Char = "J"; + if ($Code >= -16474 and $Code <= -16213) $this->Char = "K"; + if ($Code >= -16212 and $Code <= -15641) $this->Char = "L"; + if ($Code >= -15640 and $Code <= -15166) $this->Char = "M"; + if ($Code >= -15165 and $Code <= -14923) $this->Char = "N"; + if ($Code >= -14922 and $Code <= -14915) $this->Char = "O"; + if ($Code >= -14914 and $Code <= -14631) $this->Char = "P"; + if ($Code >= -14630 and $Code <= -14150) $this->Char = "Q"; + if ($Code >= -14149 and $Code <= -14091) $this->Char = "R"; + if ($Code >= -14090 and $Code <= -13319) $this->Char = "S"; + if ($Code >= -13318 and $Code <= -12839) $this->Char = "T"; + if ($Code >= -12838 and $Code <= -12557) $this->Char = "W"; + if ($Code >= -12556 and $Code <= -11848) $this->Char = "X"; + if ($Code >= -11847 and $Code <= -11056) $this->Char = "Y"; + if ($Code >= -11055 and $Code <= -10247) $this->Char = "Z"; + } + if (in_array($this->Char, str_split('QWERTYUIOPASDFGHJKLZXCVBNM0123456789', 1))) { + $this->IsNotLetter = false; + $this->FontFile = $this->LetterFont; + } else { + $this->IsNotLetter = true; + $this->FontFile = $this->AsianFont; + } + $this->Initialize(); + } + + private function Initialize() + { + //extension_loaded('gd') + $Width = $this->AvatarSize;//Width of avatar + $Height = $this->AvatarSize;//Height of avatar + $Padding = $this->Padding; + $this->Avatar = imagecreatetruecolor($Width, $Height); + //全透明背景 + imageSaveAlpha($this->Avatar, true); + $BackgroundAlpha = imagecolorallocatealpha($this->Avatar, 255, 255, 255, 127); + imagefill($this->Avatar, 0, 0, $BackgroundAlpha); + //抗锯齿 + if (function_exists('imageantialias')) { + imageantialias($this->Avatar, true); + } + //Material Design参考颜色 + //http://www.google.com/design/spec/style/color.html#color-color-palette + $MaterialDesignColor = array( + array(239, 154, 154), + array(229, 115, 115), + array(239, 83, 80), + array(244, 67, 54), + array(229, 57, 53), + array(211, 47, 47), + array(198, 40, 40), + array(183, 28, 28), + array(255, 138, 128), + array(255, 82, 82), + array(255, 23, 68), + array(213, 0, 0), + array(248, 187, 208), + array(244, 143, 177), + array(240, 98, 146), + array(236, 64, 122), + array(233, 30, 99), + array(216, 27, 96), + array(194, 24, 91), + array(173, 20, 87), + array(136, 14, 79), + array(255, 128, 171), + array(255, 64, 129), + array(245, 0, 87), + array(197, 17, 98), + array(206, 147, 216), + array(186, 104, 200), + array(171, 71, 188), + array(156, 39, 176), + array(142, 36, 170), + array(123, 31, 162), + array(106, 27, 154), + array(74, 20, 140), + array(234, 128, 252), + array(224, 64, 251), + array(213, 0, 249), + array(170, 0, 255), + array(179, 157, 219), + array(149, 117, 205), + array(126, 87, 194), + array(103, 58, 183), + array(94, 53, 177), + array(81, 45, 168), + array(69, 39, 160), + array(49, 27, 146), + array(179, 136, 255), + array(124, 77, 255), + array(101, 31, 255), + array(98, 0, 234), + array(197, 202, 233), + array(159, 168, 218), + array(121, 134, 203), + array(92, 107, 192), + array(63, 81, 181), + array(57, 73, 171), + array(48, 63, 159), + array(40, 53, 147), + array(26, 35, 126), + array(140, 158, 255), + array(83, 109, 254), + array(61, 90, 254), + array(48, 79, 254), + array(227, 242, 253), + array(187, 222, 251), + array(144, 202, 249), + array(100, 181, 246), + array(66, 165, 245), + array(33, 150, 243), + array(30, 136, 229), + array(25, 118, 210), + array(21, 101, 192), + array(13, 71, 161), + array(130, 177, 255), + array(68, 138, 255), + array(41, 121, 255), + array(41, 98, 255), + array(179, 229, 252), + array(129, 212, 250), + array(79, 195, 247), + array(41, 182, 252), + array(3, 169, 244), + array(3, 155, 229), + array(2, 136, 209), + array(2, 119, 189), + array(1, 87, 155), + array(128, 216, 255), + array(64, 196, 255), + array(0, 176, 255), + array(0, 145, 234), + array(178, 235, 242), + array(128, 222, 234), + array(77, 208, 225), + array(38, 198, 218), + array(0, 188, 212), + array(0, 172, 193), + array(0, 151, 167), + array(0, 131, 143), + array(0, 96, 100), + array(132, 255, 255), + array(24, 255, 255), + array(0, 229, 255), + array(0, 184, 212), + array(178, 223, 219), + array(128, 203, 196), + array(77, 182, 172), + array(38, 166, 154), + array(0, 150, 136), + array(0, 137, 123), + array(0, 121, 107), + array(0, 105, 92), + array(0, 77, 64), + array(167, 255, 235), + array(100, 255, 218), + array(29, 233, 182), + array(0, 191, 165), + array(165, 214, 167), + array(129, 199, 132), + array(102, 187, 106), + array(76, 175, 80), + array(67, 160, 71), + array(56, 142, 60), + array(46, 125, 50), + array(27, 94, 32), + array(185, 246, 202), + array(105, 240, 174), + array(0, 230, 118), + array(0, 200, 83), + array(197, 225, 165), + array(174, 213, 129), + array(156, 204, 101), + array(139, 195, 74), + array(124, 179, 66), + array(104, 159, 56), + array(85, 139, 47), + array(51, 105, 30), + array(178, 255, 89), + array(118, 255, 3), + array(100, 221, 23), + array(249, 251, 231), + array(240, 244, 195), + array(230, 238, 156), + array(220, 231, 117), + array(212, 225, 87), + array(205, 220, 57), + array(192, 202, 51), + array(164, 180, 43), + array(158, 157, 36), + array(130, 119, 23), + array(198, 255, 0), + array(174, 234, 0), + array(251, 192, 45), + array(249, 168, 37), + array(245, 127, 23), + array(255, 179, 0), + array(255, 160, 0), + array(255, 143, 0), + array(255, 111, 0), + array(255, 171, 0), + array(255, 183, 77), + array(255, 167, 38), + array(255, 152, 0), + array(251, 140, 0), + array(245, 124, 0), + array(239, 108, 0), + array(230, 81, 0), + array(255, 171, 64), + array(255, 145, 0), + array(255, 109, 0), + array(255, 171, 145), + array(255, 138, 101), + array(255, 112, 67), + array(255, 87, 34), + array(244, 81, 30), + array(230, 74, 25), + array(216, 67, 21), + array(191, 54, 12), + array(255, 158, 128), + array(255, 110, 64), + array(255, 61, 0), + array(221, 38, 0), + array(188, 170, 164), + array(161, 136, 127), + array(141, 110, 99), + array(121, 85, 72), + array(109, 76, 65), + array(93, 64, 55), + array(78, 52, 46), + array(62, 39, 35), + array(189, 189, 189), + array(158, 158, 158), + array(117, 117, 117), + array(97, 97, 97), + array(66, 66, 66), + array(33, 33, 33), + array(236, 239, 241), + array(176, 187, 197), + array(144, 164, 174), + array(120, 144, 156), + array(96, 125, 139), + array(84, 110, 122), + array(69, 90, 100), + array(55, 71, 79), + array(38, 50, 56) + ); + $BackgroundColorIndex = mt_rand(0, count($MaterialDesignColor) - 1); + $BackgroundColor = imagecolorallocate($this->Avatar, + $MaterialDesignColor[$BackgroundColorIndex][0], + $MaterialDesignColor[$BackgroundColorIndex][1], + $MaterialDesignColor[$BackgroundColorIndex][2] + ); + if($this->Shape == 1){ + //画一个矩形 + imagerectangle($this->Avatar, + 0, + 0, + $Width, + $Height, + $BackgroundColor + ); + imagefilledrectangle($this->Avatar, + 0, + 0, + $Width, + $Height, + $BackgroundColor + ); + } + else{ + //画一个居中圆形 + imagefilledellipse($this->Avatar, + $Width / 2, + $Height / 2, + $Width, + $Height, + $BackgroundColor + ); + } + //字体 + $FontColor = imagecolorallocate($this->Avatar, 255, 255, 255); + if ($this->IsNotLetter) { + //中文字符偏移 + $FontSize = $Width - $Padding * 3.5; + $X = $Padding + (-2 / 166) * $FontSize; + $Y = $Height - $Padding - (23.5 / 166) * $FontSize; + } else { + $FontSize = $Width - $Padding * 2; + $X = $Padding + (20 / 196) * $FontSize; + $Y = $Height - $Padding - (13 / 196) * $FontSize; + } + // 在圆正中央填入字符 + imagettftext($this->Avatar, $FontSize,0,intval($X), intval($Y),$FontColor,$this->FontFile, $this->Char); + } + + private function Resize($TargetSize) + { + if (isset($this->Avatar)) { + if ($this->AvatarSize > $TargetSize) { + $Percent = $TargetSize / $this->AvatarSize; + $TargetWidth = round($this->AvatarSize * $Percent); + $TargetHeight = round($this->AvatarSize * $Percent); + $TargetImageData = imagecreatetruecolor($TargetWidth, $TargetHeight); + //全透明背景 + imageSaveAlpha($TargetImageData, true); + $BackgroundAlpha = imagecolorallocatealpha($TargetImageData, 255, 255, 255, 127); + imagefill($TargetImageData, 0, 0, $BackgroundAlpha); + imagecopyresampled($TargetImageData, $this->Avatar, 0, 0, 0, 0, $TargetWidth, $TargetHeight, $this->AvatarSize, $this->AvatarSize); + return $TargetImageData; + } else { + return $this->Avatar; + } + } else { + return false; + } + } + + public function Free() + { + imagedestroy($this->Avatar); + } + + public function Output2Browser($AvatarSize = 0) + { + if (!$AvatarSize) { + $AvatarSize = $this->AvatarSize; + } + header('Content-Type: image/png'); + return imagepng($this->Resize($AvatarSize)); + } + + /** + * Get image resource identifier + * @param int $AvatarSize + * @return resource + */ + public function Output2ImageResource($AvatarSize = 0) + { + if (!$AvatarSize) { + $AvatarSize = $this->AvatarSize; + } + return $this->Resize($AvatarSize); + } + + /** + * Output Base64 encoded image data + * @param int $AvatarSize + * @return string + */ + public function Output2Base64($AvatarSize = 0) + { + if (!$AvatarSize) { + $AvatarSize = $this->AvatarSize; + } + + ob_start(); + imagepng($this->Resize($AvatarSize)); + $content = ob_get_contents(); + ob_end_clean(); + + return 'data:image/png;base64,' . base64_encode($content); + } + + public function Save($Path, $AvatarSize = 0) + { + if (!$AvatarSize) { + $AvatarSize = $this->AvatarSize; + } + return imagepng($this->Resize($AvatarSize), $Path); + } +} \ No newline at end of file diff --git a/extend/backup/Backup.php b/extend/backup/Backup.php new file mode 100644 index 0000000..8003dcc --- /dev/null +++ b/extend/backup/Backup.php @@ -0,0 +1,524 @@ + './backup/', + //数据库备份卷大小,默认10MB + 'part' => 10485760, + //数据库备份文件是否启用压缩 0不压缩 1 压缩 + 'compress' => 0, + //数压缩级别 + 'level' => 9, + ); + /** + * 数据库备份构造方法 + * @param array $file 备份或还原的文件信息 + * @param array $config 备份配置信息 + */ + public function __construct($config = []) + { + $this->config = array_merge($this->config, $config); + //初始化文件名 + $this->setFile(); + //初始化数据库连接参数 + $this->setDbConn(); + //检查文件是否可写 + if (!$this->checkPath($this->config['path'])) { + throw new \think\Exception("The current directory is not writable"); + } + } + /** + * 设置脚本运行超时时间 + * 0表示不限制,支持连贯操作 + */ + public function setTimeout($time=null) + { + if (!is_null($time)) { + set_time_limit($time)||ini_set("max_execution_time", $time); + } + return $this; + } + /** + * 设置数据库连接必备参数 + * @param array $dbconfig 数据库连接配置信息 + * @return object + */ + public function setDbConn($dbconfig = []) + { + if (empty($dbconfig)) { + $this->dbconfig = Config::get('database'); + } else { + $this->dbconfig = $dbconfig; + } + return $this; + } + /** + * 设置备份文件名 + * @param Array $file 文件名字 + * @return object + */ + public function setFile($file = null) + { + if (is_null($file)) { + $this->file = ['name' => date('Ymd-His'), 'part' => 1]; + } else { + if (!array_key_exists("name", $file) && !array_key_exists("part", $file)) { + $this->file = $file['1']; + } else { + $this->file = $file; + } + } + return $this; + } + //数据类连接 + public static function connect() + { + return \think\facade\Db::connect(); + } + //数据库表列表 + public function dataList($table = null,$type=1) + { + $db = self::connect(); + if (is_null($table)) { + $list = $db->query("SHOW TABLE STATUS"); + } else { + if ($type) { + $list = $db->query("SHOW FULL COLUMNS FROM {$table}"); + }else{ + $list = $db->query("show columns from {$table}"); + } + } + return array_map('array_change_key_case', $list); + //$list; + } + //数据库备份文件列表 + public function fileList() + { + if (!is_dir($this->config['path'])) { + mkdir($this->config['path'], 0755, true); + } + $path = realpath($this->config['path']); + $flag = \FilesystemIterator::KEY_AS_FILENAME; + $glob = new \FilesystemIterator($path, $flag); + $list = array(); + foreach ($glob as $name => $file) { + if (preg_match('/^\\d{8,8}-\\d{6,6}-\\d+\\.sql(?:\\.gz)?$/', $name)) { + $name1= $name; + $name = sscanf($name, '%4s%2s%2s-%2s%2s%2s-%d'); + $date = "{$name[0]}-{$name[1]}-{$name[2]}"; + $time = "{$name[3]}:{$name[4]}:{$name[5]}"; + $part = $name[6]; + if (isset($list["{$date} {$time}"])) { + $info = $list["{$date} {$time}"]; + $info['part'] = max($info['part'], $part); + $info['size'] = $info['size'] + $file->getSize(); + } else { + $info['part'] = $part; + $info['size'] = $file->getSize(); + } + $extension = strtoupper(pathinfo($file->getFilename(), PATHINFO_EXTENSION)); + $info['name']=$name1; + $info['compress'] = $extension === 'SQL' ? '-' : $extension; + $info['time'] = strtotime("{$date} {$time}"); + $list["{$date} {$time}"] = $info; + } + } + return $list; + } + public function getFile($type = '', $time = 0) + { + // + if (!is_numeric($time)) { + throw new \think\Exception("{$time} Illegal data type"); + } + switch ($type) { + case 'time': + $name = date('Ymd-His', $time) . '-*.sql*'; + $path = realpath($this->config['path']) . DIRECTORY_SEPARATOR . $name; + return glob($path); + break; + case 'timeverif': + $name = date('Ymd-His', $time) . '-*.sql*'; + $path = realpath($this->config['path']) . DIRECTORY_SEPARATOR . $name; + $files = glob($path); + $list = array(); + foreach ($files as $name) { + $basename = basename($name); + $match = sscanf($basename, '%4s%2s%2s-%2s%2s%2s-%d'); + $gz = preg_match('/^\\d{8,8}-\\d{6,6}-\\d+\\.sql.gz$/', $basename); + $list[$match[6]] = array($match[6], $name, $gz); + } + $last = end($list); + if (count($list) === $last[0]) { + return $list; + } else { + throw new \think\Exception("File {$files['0']} may be damaged, please check again"); + } + break; + case 'pathname': + return "{$this->config['path']}{$this->file['name']}-{$this->file['part']}.sql"; + break; + case 'filename': + return "{$this->file['name']}-{$this->file['part']}.sql"; + break; + case 'filepath': + return $this->config['path']; + break; + default: + $arr = array('pathname' => "{$this->config['path']}{$this->file['name']}-{$this->file['part']}.sql", 'filename' => "{$this->file['name']}-{$this->file['part']}.sql", 'filepath' => $this->config['path'], 'file' => $this->file); + return $arr; + } + } + //删除备份文件 + public function delFile($time) + { + if ($time) { + $file = $this->getFile('time', $time); + array_map("unlink", $this->getFile('time', $time)); + if (count($this->getFile('time', $time))) { + throw new \think\Exception("File {$path} deleted failed"); + } else { + return $time; + } + } else { + throw new \think\Exception("{$time} Time parameter is incorrect"); + } + } + /** + * 下载备份 + * @param string $time + * @param integer $part + * @return array|mixed|string + */ + public function downloadFile($time, $part = 0) + { + $file = $this->getFile('time', $time); + $fileName = $file[$part]; + if (file_exists($fileName)) { + ob_end_clean(); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header('Content-Description: File Transfer'); + header('Content-Type: application/octet-stream'); + header('Content-Length: ' . filesize($fileName)); + header('Content-Disposition: attachment; filename=' . basename($fileName)); + readfile($fileName); + } else { + throw new \think\Exception("{$time} File is abnormal"); + } + } + public function import($start,$time,$part) + { + //还原数据 + $db = self::connect(); + //$this->file=$this->getFile('time',$time); + $file = $this->getFile('time', $time); + $fileName = $file[$part-1]; + if (!file_exists($fileName)) { + return false; + } + if ($this->config['compress']) { + $gz = gzopen($fileName, 'r'); + $size = 0; + } else { + $size = filesize($fileName); + $gz = fopen($fileName, 'r'); + } + $sql = ''; + if ($start) { + $this->config['compress'] ? gzseek($gz, $start) : fseek($gz, $start); + } + for ($i = 0; $i < 1000; $i++) { + $sql .= $this->config['compress'] ? gzgets($gz) : fgets($gz); + if (preg_match('/.*;$/', trim($sql))) { + if (false !== $db->execute($sql)) { + $start += strlen($sql); + } else { + return false; + } + $sql = ''; + } elseif ($this->config['compress'] ? gzeof($gz) : feof($gz)) { + return 0; + } + } + return array($start, $size); + } + /** + * 写入初始数据 + * @return boolean true - 写入成功,false - 写入失败 + */ + public function Backup_Init() + { + $sql = "-- -----------------------------\n"; + $sql .= "-- Think MySQL Data Transfer \n"; + $sql .= "-- \n"; + $sql .= "-- \n"; + $sql .= "-- Part : #{$this->file['part']}\n"; + $sql .= "-- Date : " . date("Y-m-d H:i:s") . "\n"; + $sql .= "-- -----------------------------\n\n"; + $sql .= "SET FOREIGN_KEY_CHECKS = 0;\n\n"; + return $this->write($sql); + } + /** + * 备份表结构 + * @param string $table 表名 + * @param integer $start 起始行数 + * @return boolean false - 备份失败 + */ + public function backup($table, $start) + { + $db = self::connect(); + // 备份表结构 + if (0 == $start) { + $result = $db->query("SHOW CREATE TABLE `{$table}`"); + $sql = "\n"; + $sql .= "-- -----------------------------\n"; + $sql .= "-- Table structure for `{$table}`\n"; + $sql .= "-- -----------------------------\n"; + $sql .= "DROP TABLE IF EXISTS `{$table}`;\n"; + $sql .= trim($result[0]['Create Table']) . ";\n\n"; + if (false === $this->write($sql)) { + return false; + } + } + //数据总数 + $result = $db->query("SELECT COUNT(*) AS count FROM `{$table}`"); + $count = $result['0']['count']; + //备份表数据 + if ($count) { + //写入数据注释 + if (0 == $start) { + $sql = "-- -----------------------------\n"; + $sql .= "-- Records of `{$table}`\n"; + $sql .= "-- -----------------------------\n"; + $this->write($sql); + } + //备份数据记录 + $result = $db->query("SELECT * FROM `{$table}` LIMIT {$start}, 1000"); + foreach ($result as $row) { + $sql = "INSERT INTO `{$table}` VALUES ('" . str_replace(array("\r", "\n"), array('\\r', '\\n'), implode("', '", $row)) . "');\n"; + if (false === $this->write($sql)) { + return false; + } + } + //还有更多数据 + if ($count > $start + 1000) { + return $this->backup($table, $start + 1000); + } + } + //备份下一表 + return 0; + } + /** + * 优化表 + * @param String $tables 表名 + * @return String $tables + */ + public function optimize($tables = null) + { + if ($tables) { + $db = self::connect(); + if (is_array($tables)) { + $tables = implode('`,`', $tables); + $list = $db->query("OPTIMIZE TABLE `{$tables}`"); + } else { + $list = $db->query("OPTIMIZE TABLE `{$tables}`"); + } + if ($list) { + return $tables; + } else { + throw new \think\Exception("data sheet'{$tables}'Repair mistakes please try again!"); + } + } else { + throw new \think\Exception("Please specify the table to be repaired!"); + } + } + /** + * 修复表 + * @param String $tables 表名 + * @return String $tables + */ + public function repair($tables = null) + { + if ($tables) { + $db = self::connect(); + if (is_array($tables)) { + $tables = implode('`,`', $tables); + $list = $db->query("REPAIR TABLE `{$tables}`"); + } else { + $list = $db->query("REPAIR TABLE `{$tables}`"); + } + if ($list) { + return $list; + } else { + throw new \think\Exception("data sheet'{$tables}'Repair mistakes please try again!"); + } + } else { + throw new \think\Exception("Please specify the table to be repaired!"); + } + } + /** + * 写入SQL语句 + * @param string $sql 要写入的SQL语句 + * @return boolean true - 写入成功,false - 写入失败! + */ + private function write($sql) + { + $size = strlen($sql); + //由于压缩原因,无法计算出压缩后的长度,这里假设压缩率为50%, + //一般情况压缩率都会高于50%; + $size = $this->config['compress'] ? $size / 2 : $size; + $this->open($size); + return $this->config['compress'] ? @gzwrite($this->fp, $sql) : @fwrite($this->fp, $sql); + } + /** + * 打开一个卷,用于写入数据 + * @param integer $size 写入数据的大小 + */ + private function open($size) + { + if ($this->fp) { + $this->size += $size; + if ($this->size > $this->config['part']) { + $this->config['compress'] ? @gzclose($this->fp) : @fclose($this->fp); + $this->fp = null; + $this->file['part']++; + session('backup_file', $this->file); + $this->Backup_Init(); + } + } else { + $backuppath = $this->config['path']; + $filename = "{$backuppath}{$this->file['name']}-{$this->file['part']}.sql"; + if ($this->config['compress']) { + $filename = "{$filename}.gz"; + $this->fp = @gzopen($filename, "a{$this->config['level']}"); + } else { + $this->fp = @fopen($filename, 'a'); + } + $this->size = filesize($filename) + $size; + } + } + /** + * 检查目录是否可写 + * @param string $path 目录 + * @return boolean + */ + protected function checkPath($path) + { + if (is_dir($path)) { + return true; + } + if (mkdir($path, 0755, true)) { + return true; + } else { + return false; + } + } + /** + * 析构方法,用于关闭文件资源 + */ + public function __destruct() + { + if($this->fp){ + $this->config['compress'] ? @gzclose($this->fp) : @fclose($this->fp); + } + } + + //判断某数据表是否存在 + public function check_table($table){ + $prefix = config('database.connections.mysql.prefix'); + $db = self::connect(); + $res = $db->query('SHOW TABLES LIKE '."'".$prefix.$table."'"); + if($res){ + return 1; + }else{ + return 0; + } + } + //判断某数据表中某字段是否存在 + public function check_column($table,$column){ + $prefix = config('database.mysql.prefix'); + $db = self::connect(); + $res = $db->query('select count(*) from information_schema.columns where table_name = '."'".$table."' ". 'and column_name ='."'".$column."'"); + if($res[0]['count(*)'] != 0){ + return 1; + }else{ + return 0; + } + } + + //添加字段 + public function add_column($table,$column,$type,$condition,$after){ + $db = self::connect(); + $res = $db->execute('alter table'." `".$table."` ".'add'." `".$column."` ".$type." ".$condition." ".'after'." `".$after."`"); + if($res){ + return 1; + }else{ + return 0; + } + } + + //删除字段 + public function del_column($table,$column){ + $db = self::connect(); + $res = $db->execute('alter table '."`".$table."`".' drop column'."`".$column."`"); + if($res){ + return 1; + }else{ + return 0; + } + } + + //修改字段 + public function update_column($table,$old_column,$column,$type){ + //字段名和类型同时修改才会返回1不然返回0 + $db = self::connect(); + $res = $db->execute('alter table' ." `".$table."` ". 'change' ." `".$old_column."` " ."`".$column."`" .$type); + if($res){ + return 1; + }else{ + return 0; + } + } + //执行sql + public function run_sql($sql){ + $prefix = config('database.connections.mysql.prefix'); + $db = self::connect(); + $sql_array = preg_split("/;[\r\n]+/", str_replace("oa_", $prefix, $sql)); + foreach ($sql_array as $k => $v) { + if (!empty($v)) { + try { + $res = $db->query($v); + } catch (\Exception $e) { + return 0; + break; + } + } + } + return 1; + } +} diff --git a/extend/dateset/Dateset.php b/extend/dateset/Dateset.php new file mode 100644 index 0000000..9001207 --- /dev/null +++ b/extend/dateset/Dateset.php @@ -0,0 +1,545 @@ + $yes_start_time && $time < $yes_end_time) { + return '昨天'; + } + + if ($time > $yes_start_time && $time < $two_end_time) { + return '1天前'; + } + + if ($time > $yes_start_time && $time < $three_end_time) { + return '2天前'; + } + + if ($time > $yes_start_time && $time < $four_end_time) { + return '3天前'; + } + + if ($time > $yes_start_time && $time < $five_end_time) { + return '4天前'; + } + + if ($time > $yes_start_time && $time < $six_end_time) { + return '5天前'; + } + + if ($time > $yes_start_time && $time < $seven_end_time) { + return '6天前'; + } + + switch ($format) { + case 'd': + $show_time = date('Y-m-d', $time); + break; + case 'i': + $show_time = date('Y-m-d H:i', $time); + break; + case 's': + $show_time = date('Y-m-d H:i:s', $time); + break; + } + return $show_time; + } + + + /** + * 计算两个时间戳之间相差的时间 + * + * $differ = self::differ(60, 182, 'minutes,seconds'); // array('minutes' => 2, 'seconds' => 2) + * $differ = self::differ(60, 182, 'minutes'); // 2 + * + * @param int $remote timestamp to find the span of + * @param int $local timestamp to use as the baseline + * @param string $output formatting string + * @return string when only a single output is requested + * @return array associative list of all outputs requested + * @from https://github.com/kohana/ohanzee-helpers/blob/master/src/Date.php + */ + public static function differ($remote, $local = null, $output = 'years,months,weeks,days,hours,minutes,seconds') + { + // Normalize output + $output = trim(strtolower((string)$output)); + if (!$output) { + // Invalid output + return false; + } + // Array with the output formats + $output = preg_split('/[^a-z]+/', $output); + // Convert the list of outputs to an associative array + $output = array_combine($output, array_fill(0, count($output), 0)); + // Make the output values into keys + extract(array_flip($output), EXTR_SKIP); + if ($local === null) { + // Calculate the span from the current time + $local = time(); + } + // Calculate timespan (seconds) + $timespan = abs($remote - $local); + if (isset($output['years'])) { + $timespan -= self::YEAR * ($output['years'] = (int)floor($timespan / self::YEAR)); + } + if (isset($output['months'])) { + $timespan -= self::MONTH * ($output['months'] = (int)floor($timespan / self::MONTH)); + } + if (isset($output['weeks'])) { + $timespan -= self::WEEK * ($output['weeks'] = (int)floor($timespan / self::WEEK)); + } + if (isset($output['days'])) { + $timespan -= self::DAY * ($output['days'] = (int)floor($timespan / self::DAY)); + } + if (isset($output['hours'])) { + $timespan -= self::HOUR * ($output['hours'] = (int)floor($timespan / self::HOUR)); + } + if (isset($output['minutes'])) { + $timespan -= self::MINUTE * ($output['minutes'] = (int)floor($timespan / self::MINUTE)); + } + // Seconds ago, 1 + if (isset($output['seconds'])) { + $output['seconds'] = $timespan; + } + if (count($output) === 1) { + // Only a single output was requested, return it + return array_pop($output); + } + // Return array + return $output; + } + + /** + * 获取指定年月拥有的天数 + * @param int $month + * @param int $year + * @return false|int|string + */ + public static function days_in_month($month, $year) + { + if (function_exists("cal_days_in_month")) { + return cal_days_in_month(CAL_GREGORIAN, $month, $year); + } else { + return date('t', mktime(0, 0, 0, $month, 1, $year)); + } + } + + + /** + * 将秒数转换为时间 (小时、分、秒) + * @param + */ + function getTimeBySec($time,$second=true) + { + if (is_numeric($time)) { + $value = array( + "hours" => 0, + "minutes" => 0, "seconds" => 0, + ); + $t=''; + if ($time >= 3600) { + $value["hours"] = floor($time / 3600); + $time = ($time % 3600); + $t .= $value["hours"] . "小时"; + } + if ($time >= 60) { + $value["minutes"] = floor($time / 60); + $time = ($time % 60); + $t .= $value["minutes"] . "分钟"; + } + if ($time > 0 && $time < 60 && $second==true) { + $value["seconds"] = floor($time); + $t .= $value["seconds"] . "秒"; + } + return $t; + } else { + return (bool)FALSE; + } + } + + /** + * 将秒数转换为时间 (年、天、小时、分、秒) + * @param + */ + function getDateBySec($time,$second=false) + { + if (is_numeric($time)) { + $value = array( + "years" => 0, "days" => 0, "hours" => 0, + "minutes" => 0, "seconds" => 0, + ); + $t=''; + if ($time >= 31556926) { + $value["years"] = floor($time / 31556926); + $time = ($time % 31556926); + $t .= $value["years"] . "年"; + } + if ($time >= 86400) { + $value["days"] = floor($time / 86400); + $time = ($time % 86400); + $t .= $value["days"] . "天"; + } + if ($time >= 3600) { + $value["hours"] = floor($time / 3600); + $time = ($time % 3600); + $t .= $value["hours"] . "小时"; + } + if ($time >= 60) { + $value["minutes"] = floor($time / 60); + $time = ($time % 60); + $t .= $value["minutes"] . "分钟"; + } + if ($time < 60 && $second==true) { + $value["seconds"] = floor($time); + $t .= $value["seconds"] . "秒"; + } + return $t; + } else { + return (bool)FALSE; + } + } + + /* + *根据年月计算有几天 + */ + function getmonthByYM($param) + { + $month = $param['month'] ? $param['month'] : date('m', time()); + $year = $param['year'] ? $param['year'] : date('Y', time()); + if (in_array($month, array('1', '3', '5', '7', '8', '01', '03', '05', '07', '08', '10', '12'))) { + $days = '31'; + } elseif ($month == 2) { + if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 !== 0)) { + //判断是否是闰年 + $days = '29'; + } else { + $days = '28'; + } + } else { + $days = '30'; + } + return $days; + } + + /** + * 根据时间戳计算当月天数 + * @param + */ + function getmonthdays($time) + { + $month = date('m', $time); + $year = date('Y', $time); + if (in_array($month, array('1', '3', '5', '7', '8', '01', '03', '05', '07', '08', '10', '12'))) { + $days = '31'; + } elseif ($month == 2) { + if ($year % 400 == 0 || ($year % 4 == 0 && $year % 100 !== 0)) { + //判断是否是闰年 + $days = '29'; + } else { + $days = '28'; + } + } else { + $days = '30'; + } + return $days; + } + + /** + * 生成从开始时间到结束时间的日期数组 + * @param type,默认时间戳格式 + * @param type = 1 时,date格式 + * @param type = 2 时,获取每日开始、结束时间 + */ + function dateList($start, $end, $type = 0) + { + if (!is_numeric($start) || !is_numeric($end) || ($end <= $start)) return ''; + $i = 0; + //从开始日期到结束日期的每日时间戳数组 + $d = array(); + if ($type == 1) { + while ($start <= $end) { + $d[$i] = date('Y-m-d', $start); + $start = $start + 86400; + $i++; + } + } else { + while ($start <= $end) { + $d[$i] = $start; + $start = $start + 86400; + $i++; + } + } + if ($type == 2) { + $list = array(); + foreach ($d as $k => $v) { + $list[$k] = $this->getDateRange($v); + } + return $list; + } else { + return $d; + } + } + + /** + * 获取指定日期开始时间与结束时间 + */ + function getDateRange($timestamp) + { + $ret = array(); + $ret['sdate'] = strtotime(date('Y-m-d', $timestamp)); + $ret['edate'] = strtotime(date('Y-m-d', $timestamp)) + 86400; + return $ret; + } + + /** + * 生成从开始月份到结束月份的月份数组 + * @param int $start 开始时间戳 + * @param int $end 结束时间戳 + */ + function monthList($start, $end) + { + if (!is_numeric($start) || !is_numeric($end) || ($end <= $start)) return ''; + $start = date('Y-m', $start); + $end = date('Y-m', $end); + //转为时间戳 + $start = strtotime($start . '-01'); + $end = strtotime($end . '-01'); + $i = 0; + $d = array(); + while ($start <= $end) { + //这里累加每个月的的总秒数 计算公式:上一月1号的时间戳秒数减去当前月的时间戳秒数 + $d[$i] = $start; + $start += strtotime('+1 month', $start) - $start; + $i++; + } + return $d; + } + + /** + * 等于(时间段)数据处理 + * + * @param $type + * @return array + * @since 2021-06-11 + * @author fanqi + */ + function advancedDate($type) + { + // 本年度 + if ($type == 'year') { + $arrTime = DataTime::year(); + $start_time = date('Y-m-d 00:00:00', $arrTime[0]); + $end_time = date('Y-m-d 23:59:59', $arrTime[1]); + } + + // 上一年度 + if ($type == 'lastYear') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-1 year')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 year')); + } + + // 下一年度 + if ($type == 'nextYear') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 year')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+1 year')); + } + + // 上半年 + if ($type == 'firstHalfYear') { + $start_time = date('Y-01-01 00:00:00'); + $end_time = date('Y-06-30 23:59:59'); + } + + // 下半年 + if ($type == 'nextHalfYear') { + $start_time = date('Y-07-01 00:00:00'); + $end_time = date('Y-12-31 23:59:59'); + } + + // 本季度 + if ($type == 'quarter') { + $season = ceil((date('n')) / 3); + $start_time = date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'))); + $end_time = date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'))); + } + + // 上一季度 + if ($type == 'lastQuarter') { + $season = ceil((date('n')) / 3) - 1; + $start_time = date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 - 3 + 1, 1, date('Y'))); + $end_time = date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'))); + } + + // 下一季度 + if ($type == 'nextQuarter') { + $season = ceil((date('n')) / 3); + $start_time = date('Y-m-d H:i:s', mktime(0, 0, 0, $season * 3 + 1, 1, date('Y'))); + $end_time = date('Y-m-d H:i:s', mktime(23, 59, 59, $season * 3 + 3, date('t', mktime(0, 0, 0, $season * 3, 1, date("Y"))), date('Y'))); + } + + // 本月 + if ($type == 'month') { + $start_time = date('Y-m-01 00:00:00'); + $end_time = date('Y-m-31 23:59:59'); + } + + // 上月 + if ($type == 'lastMonth') { + $start_time = date('Y-m-01 00:00:00', strtotime(date('Y-m-d') . '-1 month')); + $end_time = date('Y-m-31 23:59:59', strtotime(date('Y-m-d') . '-1 month')); + } + + // 下月 + if ($type == 'nextMonth') { + $start_time = date('Y-m-01 00:00:00', strtotime(date('Y-m-d') . '+1 month')); + $end_time = date('Y-m-31 23:59:59', strtotime(date('Y-m-d') . '+1 month')); + } + + // 本周 + if ($type == 'week') { + $start_time = date('Y-m-d 00:00:00', mktime(0, 0, 0, date('m'), date('d') - date('w') + 1, date('Y'))); + $end_time = date('Y-m-d 23:59:59', mktime(23, 59, 59, date('m'), date('d') - date('w') + 7, date('Y'))); + } + + // 上周 + if ($type == 'lastWeek') { + $date = date("Y-m-d"); + $w = date("w", strtotime($date)); + $d = $w ? $w - 1 : 6; + $start = date("Y-m-d", strtotime($date . " - " . $d . " days")); + $start_time = date('Y-m-d', strtotime($start . " - 7 days")); + $end_time = date('Y-m-d', strtotime($start . " - 1 days")); + } + + // 下周 + if ($type == 'nextWeek') { + $date = date("Y-m-d"); + $w = date("w", strtotime($date)); + $d = $w ? $w - 1 : 6; + $start = date("Y-m-d", strtotime($date . " - " . $d . " days")); + $start_time = date('Y-m-d', strtotime($start . " + 7 days")); + $end_time = date('Y-m-d', strtotime($start . " + 13 days")); + } + + // 今天 + if ($type == 'today') { + $start_time = date('Y-m-d 00:00:00'); + $end_time = date('Y-m-d 23:59:59'); + } + + // 昨天 + if ($type == 'yesterday') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-1 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day')); + } + + // 明天 + if ($type == 'tomorrow') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+1 day')); + } + + // 过去3天 + if ($type == 'previous3day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-3 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day')); + } + + // 过去5天 + if ($type == 'previous5day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-5 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day')); + } + + // 过去7天 + if ($type == 'previous7day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-7 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day')); + } + // 过去10天 + if ($type == 'previous10day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-10 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day')); + } + // 过去30天 + if ($type == 'previous30day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '-30 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '-1 day')); + } + // 未来3天 + if ($type == 'future3day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+3 day')); + } + // 未来5天 + if ($type == 'future5day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+5 day')); + } + // 未来7天 + if ($type == 'future7day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+7 day')); + } + // 未来10天 + if ($type == 'future10day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+10 day')); + } + // 未来30天 + if ($type == 'future30day') { + $start_time = date('Y-m-d 00:00:00', strtotime(date('Y-m-d') . '+1 day')); + $end_time = date('Y-m-d 23:59:59', strtotime(date('Y-m-d') . '+30 day')); + } + return [$start_time,$end_time]; + } + + /** + * 根据时间戳获取星期几 + * @param $time 要转换的时间戳 + */ + function getTimeWeek($time, $i = 0) + { + $weekarray = array("日", "一", "二", "三", "四", "五", "六"); + $oneD = 24 * 60 * 60; + return "星期" . $weekarray[date("w", $time + $oneD * $i)]; + } +} diff --git a/extend/schedule/Schedule.php b/extend/schedule/Schedule.php new file mode 100644 index 0000000..4a18fd8 --- /dev/null +++ b/extend/schedule/Schedule.php @@ -0,0 +1,102 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +namespace Schedule; + +class Schedule { + // Tests whether the given ISO8601 string has a time-of-day or not + const ALL_DAY_REGEX = '/^\d{4}-\d\d-\d\d$/'; // matches strings like "2013-12-29" + + public $title; + public $allDay; // a boolean + public $start; // a DateTime + public $end; // a DateTime, or null + public $properties = array(); // an array of other misc properties + + // Constructs an Event object from the given array of key=>values. + // You can optionally force the timeZone of the parsed dates. + public function __construct($array, $timeZone=null) { + + $this->title = $array['title']; + + if (isset($array['allDay'])) { + // allDay has been explicitly specified + $this->allDay = (bool)$array['allDay']; + } + else { + // Guess allDay based off of ISO8601 date strings + $this->allDay = preg_match(self::ALL_DAY_REGEX, $array['start']) && + (!isset($array['end']) || preg_match(self::ALL_DAY_REGEX, $array['end'])); + } + + if ($this->allDay) { + // If dates are allDay, we want to parse them in UTC to avoid DST issues. + $timeZone = null; + } + + // Parse dates + $this->start = parseDateTime($array['start'], $timeZone); + $this->end = isset($array['end']) ? parseDateTime($array['end'], $timeZone) : null; + + // Record misc properties + foreach ($array as $name => $value) { + if (!in_array($name, array('title', 'allDay', 'start', 'end'))) { + $this->properties[$name] = $value; + } + } + } + + // Returns whether the date range of our event intersects with the given all-day range. + // $rangeStart and $rangeEnd are assumed to be dates in UTC with 00:00:00 time. + public function isWithinDayRange($rangeStart, $rangeEnd) { + + // Normalize our event's dates for comparison with the all-day range. + $eventStart = stripTime($this->start); + + if (isset($this->end)) { + $eventEnd = stripTime($this->end); // normalize + } + else { + $eventEnd = $eventStart; // consider this a zero-duration event + } + + // Check if the two whole-day ranges intersect. + return $eventStart < $rangeEnd && $eventEnd >= $rangeStart; + } + + // Converts this Event object back to a plain data array, to be used for generating JSON + public function toArray() { + + // Start with the misc properties (don't worry, PHP won't affect the original array) + $array = $this->properties; + + $array['title'] = $this->title; + + // Figure out the date format. This essentially encodes allDay into the date string. + if ($this->allDay) { + $format = 'Y-m-d'; // output like "2013-12-29" + } + else { + $format = 'Y-m-d H:i:s'; + // $format = 'c'; // full ISO8601 output, like "2013-12-29T09:00:00+08:00" + } + + // Serialize dates into strings + $array['start'] = $this->start->format($format); + if (isset($this->end)) { + $array['end'] = $this->end->format($format); + } + return $array; + } + +} \ No newline at end of file diff --git a/extend/smsservice/Smsservice.php b/extend/smsservice/Smsservice.php new file mode 100644 index 0000000..f3d0929 --- /dev/null +++ b/extend/smsservice/Smsservice.php @@ -0,0 +1,68 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace smsservice; + +use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi; +use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest; +use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions; +use AlibabaCloud\Tea\Exception\TeaError; +use think\facade\Config; +use think\facade\Log; + +class Smsservice +{ + protected $client; + + public function __construct() + { + $config = config('aliyun'); + + $configData = new \Darabonba\OpenApi\Models\Config([ + 'accessKeyId' => $config['access_key_id'], + 'accessKeySecret' => $config['access_key_secret'], + 'endpoint' => 'dysmsapi.aliyuncs.com', + 'protocol' => 'HTTP', + 'regionId' => $config['region_id'] + ]); + + $this->client = new Dysmsapi($configData); + } + + /** + * 发送短信 + * + * @param string $phone 手机号 + * @param string $templateCode 模板CODE(如:SMS_123456789) + * @param array $params 模板变量,如 ['code' => '1234'] + * @return array + */ + public function sendSms(string $phone, string $templateCode, array $params = []) + { + $request = new SendSmsRequest([ + "signName" => config('aliyun.sign_name'), + "templateCode" => $templateCode, + "phoneNumbers" => $phone, + "templateParam" => json_encode($params, JSON_UNESCAPED_UNICODE) + ]); + + try { + $response = $this->client->sendSms($request); + $body = $response->body; + return json_decode(json_encode($body),true); + } catch (TeaUnableRetryError $e) { + return ['code' => 1, 'msg' => '网络错误或请求失败', 'error' => $e->getMessage()]; + } + } +} diff --git a/extend/systematic/Systematic.php b/extend/systematic/Systematic.php new file mode 100644 index 0000000..33138f4 --- /dev/null +++ b/extend/systematic/Systematic.php @@ -0,0 +1,65 @@ + ++----------------------------------------------------------------------------------------------- +*/ + +declare (strict_types = 1); +namespace systematic; +use think\facade\Config; +use think\facade\Cache; +use think\facade\Db; +/** + * 系统类 + */ +class Systematic +{ + public function auth($uid) + { + if (!Cache::get('RulesSrc' . $uid) || !Cache::get('RulesSrc0')) { + //用户所在权限组及所拥有的权限 + $groups = []; + $position_id = Db::name('Admin')->where('id', $uid)->value('position_id'); + $groups = Db::name('PositionGroup') + ->alias('a') + ->join("AdminGroup g", "a.group_id=g.id", 'LEFT') + ->where([['a.pid', '=', $position_id], ['g.status', '=', 1]]) + ->select()->toArray(); + //保存用户所属用户组设置的所有权限规则id + $ids = []; + foreach ($groups as $g) { + $ids = array_merge($ids, explode(',', trim($g['rules'], ','))); + } + $ids = array_unique($ids); + //读取所有权限规则 + $rules_all = Db::name('AdminRule')->field('src')->select()->toArray(); + //读取用户组所有权限规则 + $rules = Db::name('AdminRule')->where('id', 'in', $ids)->field('src')->select()->toArray(); + //循环规则,判断结果。 + $auth_list_all = []; + $auth_list = []; + foreach ($rules_all as $rule_all) { + $auth_list_all[] = strtolower($rule_all['src']); + } + foreach ($rules as $rule) { + $auth_list[] = strtolower($rule['src']); + } + //规则列表结果保存到Cache + Cache::tag('adminRules')->set('RulesSrc0', $auth_list_all, 36000); + Cache::tag('adminRules')->set('RulesSrc' . $uid, $auth_list, 36000); + } + } + + //读取文件配置 + public function getConfig($key) + { + return Config::get($key); + } +} diff --git a/index.php b/index.php new file mode 100644 index 0000000..5cd4e8c --- /dev/null +++ b/index.php @@ -0,0 +1,25 @@ +欢迎使用 PHP!'; +echo '

              版本信息

              '; + +echo '
                '; +echo '
              • PHP版本:', PHP_VERSION, '
              • '; +echo '
              '; + +echo '

              已安装扩展

              '; +printExtensions(); + +/** + * 获取已安装扩展列表 + */ +function printExtensions() +{ + echo '
                '; + foreach (get_loaded_extensions() as $i => $name) { + echo "
              1. ", $name, '=', phpversion($name), '
              2. '; + } + echo '
              '; +} \ No newline at end of file diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/public/.htaccess @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..5964fc3 --- /dev/null +++ b/public/404.html @@ -0,0 +1,36 @@ + + + + + + + + + 页面不存在 + + + + +
              +
              +
              4
              😔
              4
              +
              哎呀!找不到页面
              请检查URL,或者系统伪静态配置
              +
              + +
              + + + \ No newline at end of file diff --git a/public/backup/.gitignore b/public/backup/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/public/backup/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e73c72a Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..8d91ebd --- /dev/null +++ b/public/index.php @@ -0,0 +1,33 @@ +这里。'; + exit; +} +require __DIR__ . '/../vendor/autoload.php'; + +// 定义当前版本号 +define('CMS_VERSION','5.10.0'); + +// 定义手机端当前版本号 +define('MB_VERSION','1.8'); + +// 定义Layui版本号 +define('LAYUI_VERSION','2.13.5'); + +// 定义项目目录 +define('CMS_ROOT', __DIR__ . '/../'); + +// 定义报错模版 +define('EEEOR_REPORTING',CMS_ROOT.'/public/tpl/error.html'); + +// 执行HTTP应用并响应 +$http = (new App())->http; + +$response = $http->run(); + +$response->send(); + +$http->end($response); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/public/router.php b/public/router.php new file mode 100644 index 0000000..9b39a62 --- /dev/null +++ b/public/router.php @@ -0,0 +1,19 @@ + +// +---------------------------------------------------------------------- +// $Id$ + +if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) { + return false; +} else { + $_SERVER["SCRIPT_FILENAME"] = __DIR__ . '/index.php'; + + require __DIR__ . "/index.php"; +} diff --git a/public/static/assets/gougu/css/gougu.css b/public/static/assets/gougu/css/gougu.css new file mode 100644 index 0000000..08f19a7 --- /dev/null +++ b/public/static/assets/gougu/css/gougu.css @@ -0,0 +1,481 @@ +@import url("../../layui/css/layui.css"); +@import url("../../icon/iconfont.css"); +/*reset layui*/ +.layui-card{margin-bottom:16px; box-shadow: 0 1px 3px 0 rgb(5 32 96 / 10%);} +.layui-card-header {position: relative; padding:0 12px;} +.layui-card-header .layui-icon,.layui-card-header .pull-right{line-height: initial; position: absolute;right: 12px;top: 50%; margin-top: -9px} +.layui-card-title {font-size: 18px;font-weight: 600;padding: 12px;} + +.layui-table td, .layui-table th{padding:8px;} +.gougu-picker .layui-layer-btn1{background-color:#f5f5f5} +.gougu-picker .layui-layer-btn2{background-color:#EAFAFF} +.picker-table{padding:8px 8px 0;} +.picker-table .layui-table-cell {padding:4px; height: 32px;line-height: 24px;} +.layui-table-cell{padding:6px;} +.layui-table-box{background-color:#fff;} +.layui-table-page{background-color:#fff;border-bottom:1px solid #eeeeee;} +.layui-table-tool{box-shadow: 0 0 0 rgb(0 0 0 / 1%);padding:10px 12px; background-color:#fff;} +.layui-input, .layui-select, .layui-textarea {height: 36px;line-height: 1.22;line-height: 36px\9; border-color:#dddddd} +.layui-input, .layui-textarea {padding-left:6px;} +.layui-input-readonly {border-style: dashed; background-color:#fafafa;} +.layui-form-pane .layui-form-label{height: 36px; padding:8px;} +.layui-form-pane .layui-label-inline{height: 24px; padding:8px; float:left;} + +.layui-btn {height: 36px;line-height: 36px; padding:0 16px;} +.layui-btn-sm {height: 30px; line-height: 30px; padding:0 8px;} +.layui-btn-xs {height: 22px; line-height: 22px; padding:0 4px;} +.layui-btn-reset {height: 36px;background-color: #fff; line-height: 36px; border: 1px solid transparent;padding: 0 8px; white-space: nowrap; color: #767a82;font-size: 14px;cursor: pointer;vertical-align: middle;} +.layui-btn-reset:hover{color: #323232;} + +.layui-tab-brief>.layui-tab-title .layui-this, +.layui-tabs-header .layui-this, +.layui-tabs-header li:hover{color:#1A75FF} + +.layui-tab-brief>.layui-tab-more li.layui-this:after, +.layui-tabs-brief>.layui-tab-title .layui-this:after, +.layui-tabs-header .layui-this:after{border-color:#1A75FF;} + +.layui-form-radio{padding-right:4px;} +.layui-form-radio>i{margin-right:4px;} +.layui-form-label{padding:9px; color:#909399} +.layui-form-label font{color:#FF6347; margin-right: 2px;} +.layui-input-block{margin-left:100px;} +.layui-form-2 .layui-form-label{width:112px;} +.layui-form-2 .layui-input-block{margin-left:130px;} + +.layui-table-view{margin:0;} +.layui-table-view .layui-table th{background-color:#f8f8f8;} +.layui-table-form{margin:0;} +.layui-table-form tbody tr:hover{background-color: #fff;} +.layui-td-gray,.layui-td-gray-2,.layui-td-gray-3,.layui-td-gray-4{color:#909399; width:68px; text-align:right; background-color:#fafafa;} +.layui-td-gray-2{width:96px;} +.layui-td-gray-3{width:124px;} +.layui-td-gray-4{width:150px;} +.layui-td-gray font,.layui-td-gray-2 font,.layui-td-gray-3 font,.layui-td-gray-4 font{color:#FF6347; margin-left: 2px;} +.layui-table-min th{font-size:13px; text-align:center; background-color:#f8f8f8;} +.layui-table-min td{font-size:13px; padding:6px;text-align:center;} + +.layui-tree-entry{line-height:24px} +.layui-tree-set{padding:2px 0} +.layui-tree-main.on .layui-tree-txt,.layui-tree-main.on .layui-icon{color:#1A75FF;} +.layui-icon layui-icon-file{font-size:16px;} +.layui-tree-icon {height: 16px;line-height: 14px; width: 16px; text-align: center;} +.layui-tree-icon .layui-icon{color:#969696} +.layui-tree-line .layui-tree-set .layui-tree-set:after{top:18px;} +.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{text-decoration:none; color:#186AF2;} +.layui-tree-iconClick .layui-icon.layui-icon-file:before { content: "\e857";} +.layui-select-tags{padding:10px 0;} +.layui-tags-span{padding:3px 6px 4px; font-size:14px; border-radius:3px; margin-bottom:6px; margin-right:6px; border:1px solid #e6e6e6; display:inline-block;cursor:pointer;} +.layui-tags-span:hover{border:1px solid #ddd; background-color:#f5f5f5;} +.layui-tags-span.on{border:1px solid #eee; color:#bbb; background-color:#ffffff;cursor:not-allowed} +.layui-readonly{background-color: #f5f5f5; color:#999;} +.layui-tags-span i{margin-left:5px; font-size:14px;} +.layui-tags-span i:hover{border-radius:2px;background-color:#FF6347;color:#fff} +.layui-letter-span{padding:10px 5px; font-size:16px; display:inline-block; cursor:pointer;} +.layui-letter-span.on{color:#FF6347;} +.layui-letter-span:hover{color:#1e9fff;} +.layui-tags-all{float: right; font-weight: 200; background-color:#1e9fff; color:#fff; border-radius: 3px; padding: 2px 6px; cursor: pointer; display: none;} + +.layui-data-none{padding:12px 0; color:#969696; text-align:center; font-size:12px;} +.gougu-data-none{background:url(../images/data-none.png) no-repeat center center; background-size:auto 80%;} + +.click-edit{position: relative; padding-right:24px; box-sizing:border-box;} +.click-edit.on{cursor:pointer;} +.click-edit::after{content: ""; width: 36px; height: 24px; display: block; position: absolute; right:0; top: 0; background:url(../images/click-edit.png) no-repeat center; background-size:24px auto; opacity: 0; transition: opacity ease-in-out .2s;} +.click-edit.on:hover::after {opacity: 1;} + +html {background-color: #F9F9F9;} +html,body{height:100%;scrollbar-width: thin; color:#323232;} +.p-page{padding:15px 12px 0;box-sizing: border-box; width:100%; position:relative;} +.copyright{padding:10px 0; text-align:center; font-size:12px; color: #989898; text-shadow: 2px 2px 0px #fff} +.copyright a{margin-left:12px; color: #989898;text-shadow: 2px 2px 0px #fff} +.bg-white{background-color:#fff;} +a.tab-a,a.open-a,a.link-a,a.right-a,a.side-a{color:#1A75FF; cursor:pointer;} +a.tab-a:hover,a:hover,a.open-a:hover,a.link-a:hover,a.right-a:hover{color:#1A75FF; opacity:0.8} +.layui-btn.side-a{color:#fff;} +.left{float:left;} +.right{float:right;} +.h1,h1{font-size:24px; font-weight: 600;} +.h2,h2{font-size:20px; font-weight: 600;} +.h3,h3{font-size:18px; font-weight: 600;} +.h4,h4{font-size:16px; font-weight: 600;} + +.f12{font-size:12px;} +.f14{font-size:14px;} +.f16{font-size:16px;} +.f18{font-size:18px;} +.f20{font-size:20px;} +.f24{font-size:24px;} +.f28{font-size:28px;} +.f32{font-size:32px;} +.f36{font-size:36px;} + +.m-0{margin:0} +.m-1{margin:4px} +.m-2{margin:8px} +.m-3{margin:12px} +.m-4{margin:16px} +.m-5{margin:20px} +.my-1{margin-top:4px;margin-bottom:4px} +.my-2{margin-top:8px;margin-bottom:8px} +.my-3{margin-top:12px;margin-bottom:12px} +.my-4{margin-top:16px;margin-bottom:16px} +.my-5{margin-top:20px;margin-bottom:20px} +.mx-1{margin-left:4px;margin-right:4px} +.mx-2{margin-left:8px;margin-right:8px} +.mx-3{margin-left:12px;margin-right:12px} +.mx-4{margin-left:16px;margin-right:16px} +.mx-5{margin-left:20px;margin-right:20px} +.ml-1{margin-left:4px} +.ml-2{margin-left:8px} +.ml-3{margin-left:12px} +.ml-4{margin-left:16px} +.ml-5{margin-left:20px} +.mt-1{margin-top:4px} +.mt-2{margin-top:8px} +.mt-3{margin-top:12px} +.mt-4{margin-top:16px} +.mt-5{margin-top:20px} +.mr-1{margin-right:4px} +.mr-2{margin-right:8px} +.mr-3{margin-right:12px} +.mr-4{margin-right:16px} +.mr-5{margin-right:20px} +.mb-1{margin-bottom:4px} +.mb-2{margin-bottom:8px} +.mb-3{margin-bottom:12px} +.mb-4{margin-bottom:16px} +.mb-5{margin-bottom:20px} + +.p-0{padding:0} +.p-1{padding:4px} +.p-2{padding:8px} +.p-3{padding:12px} +.p-4{padding:16px} +.p-5{padding:20px} +.py-1{padding-top:4px;padding-bottom:4px} +.py-2{padding-top:8px;padding-bottom:8px} +.py-3{padding-top:12px;padding-bottom:12px} +.py-4{padding-top:16px;padding-bottom:16px} +.py-5{padding-top:20px;padding-bottom:20px} +.px-1{padding-left:4px;padding-right:4px} +.px-2{padding-left:8px;padding-right:8px} +.px-3{padding-left:12px;padding-right:12px} +.px-4{padding-left:16px;padding-right:16px} +.px-5{padding-left:20px;padding-right:20px} +.pl-1{padding-left:4px} +.pl-2{padding-left:8px} +.pl-3{padding-left:12px} +.pl-4{padding-left:16px} +.pt-1{padding-top:4px} +.pt-2{padding-top:8px} +.pt-3{padding-top:12px} +.pt-4{padding-top:16px} +.pt-5{padding-top:20px} +.pr-1{padding-right:4px} +.pr-2{padding-right:8px} +.pr-3{padding-right:12px} +.pr-4{padding-right:16px} +.pr-5{padding-right:20px} +.pb-1{padding-bottom:4px} +.pb-2{padding-bottom:8px} +.pb-3{padding-bottom:12px} +.pb-4{padding-bottom:16px} +.pb-5{padding-bottom:20px} + +.border{border:1px solid #eee; box-sizing:border-box} +.border-y{border-top:1px solid #eee;border-bottom:1px solid #eee; box-sizing:border-box} +.border-x{border-left:1px solid #eee;border-right:1px solid #eee; box-sizing:border-box} +.border-t{border-top:1px solid #eee; box-sizing:border-box} +.border-b{border-bottom:1px solid #eee; box-sizing:border-box} +.border-l{border-left:1px solid #eee; box-sizing:border-box} +.border-r{border-right:1px solid #eee; box-sizing:border-box} + +.layui-bg-0{background-color:#648A8D !important;}/*灰青*/ +.layui-bg-1,.layui-bg-green{background-color:#16b777 !important;}/*亮绿*/ +.layui-bg-2{background-color:#1A75FF !important;}/*亮蓝*/ +.layui-bg-3{background-color:#FEC939 !important;}/*亮黄*/ +.layui-bg-4{background-color:#FD6206 !important;}/*亮橙*/ +.layui-bg-5{background-color:#FF5823 !important;}/*亮红*/ +.layui-bg-6{background-color:#4AC8BE !important;}/*亮青*/ +.layui-bg-7{background-color:#7860C0 !important;}/*亮紫*/ +.layui-bg-8{background-color:#9F6000 !important;}/*橙黄*/ +.layui-bg-9{background-color:#383D41 !important;}/*中性灰*/ +.layui-bg-10{background-color:#969696 !important;}/*灰黑*/ + +.layui-color-0{color:#648A8D !important;}/*灰青*/ +.layui-color-1{color:#16b777 !important;}/*亮绿*/ +.layui-color-2{color:#1A75FF !important;}/*亮蓝*/ +.layui-color-3{color:#FEC939 !important;}/*亮黄*/ +.layui-color-4{color:#FD6206 !important;}/*亮橙*/ +.layui-color-5{color:#FF5823 !important;}/*亮红*/ +.layui-color-6{color:#4AC8BE !important;}/*亮青*/ +.layui-color-7{color:#7860C0 !important;}/*亮紫*/ +.layui-color-8{color:#9F6000 !important;}/*橙黄*/ +.layui-color-9{color:#383D41 !important;}/*中性灰*/ +.layui-color-10{color:#969696 !important;}/*灰黑*/ + +.status-color-0{color:#FF5823 !important;}/*亮红*/ +.status-color-1{color:#1A75FF !important;}/*亮蓝*/ +.status-color-2{color:#16b777 !important;}/*亮绿*/ +.status-color-3{color:#7860C0 !important;}/*亮紫*/ + +.check-status-color-0{color:#856404 !important;}/*待提交,柔和黄色,提醒关注*/ +.check-status-color-1{color:#1A75FF !important;}/*审核中,浅蓝,表示进行中*/ +.check-status-color-2{color:#16b777 !important;}/*已通过,浅绿,成功/完成*/ +.check-status-color-3{color:#721C24 !important;}/*已拒绝,浅红,表示拒绝*/ +.check-status-color-4{color:#383D41 !important;}/*已撤销,中性灰,取消操作*/ +.check-status-color-5{color:#9F6000 !important;}/*反确认,橙黄,需注意但非错误*/ + +.black{color:#182b50} + +.blue{color:#1A75FF} +.blue-dark{color:#3c9cff;} +.blue-disabled{color:#9acafc;} +.blue-light{color:#ecf5ff;} + +.yellow{color:#f9ae3d;} +.yellow-dark{color:#f1a532;} +.yellow-disabled{color:#f9d39b;} +.yellow-light{color:#fdf6ec;} + +.green{color:#16b777;} +.green-dark{color:#53c21d;} +.green-disabled{color:#a9e08f;} +.green-light{color:#f5fff0;} + +.red{color:#f56c6c;} +.red-dark{color:#e45656;} +.red-disabled{color:#f7b2b2;} +.red-light{color:#fef0f0;} + +.gray{color:#969696;} +.gray-dark{color:#767676;} +.gray-disabled{color:#c6c6c6;} +.gray-light{color:#f1f1f1;} + +/* 滚动条 */ +::-webkit-scrollbar { + width: 8px; +} +::-webkit-scrollbar-thumb { + background-color:rgba(0,0,0,.15);background-clip:content-box;border:1px solid transparent;border-radius:8px +} + +::-webkit-scrollbar-track{background-color:transparent} +::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} +::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:1px solid transparent} +::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} + +::-moz-scrollbar { + width: 8px; + background-color: transparent; +} +::-moz-scrollbar-thumb { + background-color: #c1c1c1; + border-radius: 8px; +} +body.right-open{overflow-y:clip;overflow:hidden;} +div.layui-table-main::-webkit-scrollbar{width:12px;height:12px} +div.layui-table-main::-webkit-scrollbar-thumb{min-width:12px;min-height:12px;background-color:rgba(0,0,0,.15);background-clip:content-box;border:2px solid transparent;border-radius:12px} +div.layui-table-main::-webkit-scrollbar-track{background-color:transparent} +div.layui-table-main::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,.04)} +div.layui-table-main::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.4);border:2px solid transparent} +div.layui-table-main::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.65)} +/*placeholder*/ +::-webkit-input-placeholder { /* WebKit, Blink, Edge */ + color: #aaa; +} +:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color:#aaa; +} +::-moz-placeholder { /* Mozilla Firefox 19+ */ + color:#aaa; +} + :-ms-input-placeholder { /* Internet Explorer 10-11 */ + color:#aaa; + } + /*text ellipsis*/ +.text-overflow1{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} +.text-overflow2{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} +.text-overflow3{ overflow: hidden; text-overflow: ellipsis; word-break: break-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} + +/*gg-DIY*/ +.gg-form-bar{padding:12px 12px 0; background-color:#fff;} +.gg-form-bar .layui-input-inline{margin-bottom:10px;} +.gg-tab-bar{background-color:#fff;} +.gg-tab{text-align: left!important;} +.gg-tab-title{position: relative;left: 0; height: 40px; white-space: nowrap; font-size: 0;} +.gg-tab-title li{display: inline-block;*display: inline;*zoom: 1;vertical-align: middle; font-size: 16px; position: relative;line-height: 40px; min-width: 64px; padding: 0 12px;text-align: center;cursor: pointer;} +.gg-tab-title li:hover,.gougu-tab li.tab-this{ color:#1A75FF;} +.gg-tab-title li.tab-this:after{border-bottom: 2px solid #1A75FF;position: absolute;left: 0; top: 0; content: ""; width: 100%; height: 41px; box-sizing: border-box;pointer-events: none;} +.gg-tab-title.big{height: 46px;} +.gg-tab-title.big li{line-height: 46px;} +.gg-tab-title.big li{line-height: 46px;} +.gg-tab-title.big li.tab-this:after{height: 47px;} +.gg-img-center{display: table-cell;vertical-align: middle;} +.gg-img-center img{max-width: 100%; max-height: 100%; display: block; margin: auto;} +.gg-img-radius img{border-radius:4px;max-width: 100%; max-height: 100%;} +.gg-img-round img{border-radius:50%;max-width: 100%; max-height: 100%;} +.gg-img-cover { width: 100%; position: relative; padding-top: 0; border-radius: 3px; overflow: hidden; background-color: #f0f0f0;} +.gg-img-cover img { width: 100%;height: 100%; object-fit: cover; position: absolute; top: 0; left: 0; border-radius: 2px; max-width: 100%;} +.gg-img-cover.cover-2-1 { padding-top: 50%;} +.gg-img-cover.cover-4-3 { padding-top: 75%;} +.gg-img-cover.cover-16-9 { padding-top: 56.25%;} + +.sub-menu { overflow: hidden; position: absolute; height: 100%;top: 0;left: 0;} +.sub-menu ul{padding:0; line-height:2.7} +.sub-menu li.sub-menu-title{margin-top:10px;} +.sub-menu li.sub-menu-title i{font-size:18px; font-weight:800} +.sub-menu li.sub-menu-title span{padding-left:8px; font-size:15px;} +.sub-menu li.sub-menu-title cite{font-size:12px; margin-left:4px; color:#999} +.sub-menu li.sub-menu-title.active a{color:#4285F4;} +.sub-menu li.sub-menu-li a{padding-left:12px; font-size:14px; display:inline-block; width:100%; box-sizing:border-box;} +.sub-menu li.sub-menu-li a .iconfont{margin-right:8px; font-weight:600} +.sub-menu li.sub-menu-li.active a{color:#4285F4; background-color:#F2F8FF} +.sub-menu li.sub-menu-li span.num{margin-left:4px} +/*审批*/ +.check-items{overflow-x: auto; padding: 2px 0;} +.flow-flex-row {box-direction: row; + box-orient: horizontal; + -webkit-box-orient: horizontal; + -ms-flex-direction: row; + flex-direction: row; +} +.flow-flexbox { width: 100%;text-align: left; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + display: -webkit-flex; + box-align: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + flex-wrap: wrap; +} +.check-item{width: auto; -ms-flex-negative: 0; flex-shrink: 0; padding:4px 0} +.check-item i{margin-right:3px; color:#646464;} +.check-item span{color:#999;margin:0 3px;} +.check-item .layui-icon {font-size:18px;} +.check-item .layui-icon.layui-icon-right{font-size:12px;} +.layui-icon[data-ok]{color:#34a853} +.layui-icon[data-no]{color:#FF5722;} +.check-item-status{color:#999; font-size:12px; margin-left:3px;} + +.flow-tips{padding:6px 10px;} +.flow-tips li{padding:5px 0;} +.flow-tips li i{color:#4285f4;} +.flow-tips li span{color:#999; font-size:12px; margin-left:4px;} + +.flow-record{padding:4px 4px 0;} +.flow-record .layui-timeline-item{text-decoration:line-through; color:#acacac; padding-bottom:10px;} +.flow-record .layui-timeline-item .file-card{text-decoration:line-through; color:#acacac;} +.flow-record .layui-timeline-item.delete-0{text-decoration:none; color:#323232;} +.flow-record .layui-timeline-item.delete-0 .file-card{text-decoration:none; color:#323232;} +.layui-timeline-content ul{font-size:12px;} +.check-status{color:#999; margin-left:5px;} +.check-remark{padding:6px; margin-top:6px; margin-bottom:10px; border-radius:4px; background-color:#f5f5f5;} +.check-record{line-height:1.5; padding:4px 0} +.flow-this{font-weight:800;color:#4285f4} +.flow-this .check-item-status{color:#4285f4} +.flow-this i{color:#4285f4} + + +.editormd,.editormd-toolbar,.editormd .CodeMirror,.CodeMirror-gutters{border-color:#eeeeee!important;} +.editormd{margin-bottom:0!important;} +.CodeMirror-gutters{background-color:#fafafa!important;} + +.layui-layer-gougu-admin {box-shadow: 1px 1px 10px rgba(0,0,0,.1); border-radius: 0!important;overflow:initial!important;} +.express-box { position: fixed; z-index:9999; height:100%; right: -100%; top:0;background-color: #fff;} +.express-box article{width:100%; height:100%; overflow:auto;} +.express-mask{ display: none; position: fixed; top: 0; left: 0; z-index: 9998; width: 100%; height: 100%; background-color: rgba(0,0,0,.6); } + + +.express-close{width: 40px; height:200px;position: absolute; left:-39px; right: 0; top: 12%; cursor: pointer;} +.express-close.parent-colse{width: 0!important; overflow:hidden;} +.express-container{position:relative; width:40px;} +.express-bar{left:-92px;top: 80px; width: 220px; height: 44px; position: absolute; + transform:rotate(-90deg); + clip-path: url(#menu); + will-change: transform; + background-color: #F9F9F9; +} +.express-close .express-btn{top:85px; width:20px; height:20px; padding:6px; position: absolute; border-radius: 50%; left:8px;background-color: #FF5722;transition: transform 0.3s ease-in-out; transform:rotate(0deg);} +.express-close .express-btn .express-icon{width:20px; height:20px;} +.express-close:hover .express-btn{transform:rotate(-90deg);} + + +/*uploadPlus*/ +.gougu-upload-files{background-color: #ffffff; border:1px solid #e4e7ed;color: #c0c4cc; min-width:400px; cursor: not-allowed; padding:0 12px; box-sizing: border-box; display: inline-block; font-size: inherit; height: 38px; line-height: 35px; margin-right:8px; border-radius:2px;} +.gougu-upload-box{background-color:#f8f8f8; border:1px solid #eee; border-radius:6px; width:888px; height:440px; padding:5px; overflow-y:auto; margin:0 auto; position:relative;-webkit-user-select:none;-moz-user-select:none-ms-user-select:none;} +.select .gougu-upload-btn{width:100%; height:100%; position:absolute;top:0;left:0; line-height:440px;} +.select .gougu-upload-btn-box{width:100%; height:100%; box-sizing: border-box; padding-top:160px; line-height:1.2;text-align:center; cursor:pointer; color:#49bc85;font-size:22px;} +.select .gougu-upload-btn-box i{font-size:60px;} +.selected .gougu-upload-btn{width:100px; height:100px; float:left; padding:5px;} +.selected .gougu-upload-btn-box{width:100px; height:100px; box-sizing: border-box; background-color:#eaf7f0; border:1px solid #49bc85; padding-top:16px; line-height:1.2;font-size:14px; text-align:center; cursor:pointer; color:#49bc85} +.selected .gougu-upload-btn-box i{font-size:36px;} +.gougu-upload-card{width:100px; height:100px; float:left; padding:5px;} +.gougu-upload-card-box{width:100px; height:100px; box-sizing: border-box; background-color:#fff; border:1px solid #eee;position: relative;overflow: hidden;} +.gougu-upload-card-box img {width: 100px; height: 100px; object-fit: cover;} +.gougu-upload-card-text{background-color:rgba(0,0,0,.618); color:#fff; position:absolute;left:0; bottom:0; line-height:1.6; font-size:12px; width:100px; text-overflow:hidden; white-space: nowrap; text-overflow: ellipsis;} +.gougu-upload-card-reload{width:50px; height:32px; position:absolute; top:5px; left:3px; font-size:12px;display:none;} +.gougu-upload-card-del{width:32px; height:32px; position:absolute; top:5px; right:0; display:none;} +.gougu-upload-card:hover .gougu-upload-card-del{display:block;} +.uploadok.gougu-upload-card .gougu-upload-card-del{display:none;} +.reload.gougu-upload-card .gougu-upload-card-reload{display:block;}\ +.gougu-upload-card-bar{width:100%; position:absolute;left:0; bottom:16px;} +.gougu-upload-tips{color:#969696; font-size:12px; margin-right:24px;} +.gougu-import-tips{color:#969696; font-size:14px; padding-right:20px;line-height:1.8;} +.layui-import .layui-form-item{margin-bottom:8px;} +.layui-import .layui-input-block{min-height:24px;} +/*附件*/ +.file-card {background: #fff;border: 1px solid #f1f1f1; border-radius: 2px; padding:0; margin:4px 6px;line-height:1; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.file-card .file-icon{font-size:48px; color:#646464; margin-right: 4px;} +.file-card .file-info {width: calc(100% - 86px); line-height:1.6;} +.file-card .file-title {font-size: 14px; word-break:keep-all; overflow: hidden; text-overflow: ellipsis; display: width: 100%;} +.file-card .file-ops{font-size:12px; color:#aaa;} +.file-card .file-tool{padding:5px 0;} +.file-card .file-tool .iconfont{font-size:28px; font-weight:400; padding:3px 0; display:inline-block; cursor:pointer;} +.file-hasdelete{background:url(../images/delete_icon.png) no-repeat 99% 0; background-size: auto 58px; color:#aaa} +.file-hasdelete .file-icon{color:#aaa;} +.file-hasdelete .file-tool{display:none} +.layui-dropdown.file-menu{min-width:64px;} +.layui-menu{margin:0} +/*编辑日志*/ +.log-timeline{position: relative; min-height:120px; padding-left: 48px; background-color:#fff;} +.log-timeline:after {content: ""; position: absolute; top: 0; left: 24px; width: 1px; height: 100%; background: #e3e9ed;} +.log-timeline dl{padding-bottom: 8px; position: relative;} +.log-timeline dt{font-size: 16px; line-height: 2.4; color: #323232; font-weight:600} +.log-timeline dd{font-size: 14px; line-height: 1.6; padding:5px 0} +.log-timeline .date-second-point{width: 10px; height: 10px; display: block; border-radius: 50%; border: 3px solid #FBBC05; background: #fff; position: absolute; z-index: 99; left:-32px; top:9px} +.log-timeline .log-thumb{width: 24px; height: 24px; border-radius: 50%; margin-right:4px;} +.log-timeline .open-a{margin:0 4px;} +.log-item i{font-weight:800; color:#323232} +.log-content strong{margin:0 4px; color:#323232} +.layui-timeline-item{color:#c9c9c9; padding-bottom:8px} +.layui-timeline-item.delete_0{color:#646464;} +/*评论*/ +.comment-input .comment-image{width:40px; height:40px; border-radius:50%} +.comment-item .comment-avatar{width:50px; float:left} +.comment-item .comment-image{width:36px; height:36px; border-radius:50%} +.comment-item .comment-body{margin-left:50px;} +.comment-item .comment-content blockquote{border-left:3px solid #f1f1f1; padding:4px 8px;} +.comment-item .comment-actions a{color:#8c95a8; cursor:pointer; font-size:12px;} +.comment-item .comment-actions a:hover{color:#3582fb;} +.comment-meta span{font-size:12px;} diff --git a/public/static/assets/gougu/css/layout.css b/public/static/assets/gougu/css/layout.css new file mode 100644 index 0000000..9265a5e --- /dev/null +++ b/public/static/assets/gougu/css/layout.css @@ -0,0 +1,271 @@ +body{color:#323232} +.gg-layout .layui-header {position: fixed; top: 0;left: 0; width: 100%; height: 50px; border-bottom: 1px solid #eeeeee;box-sizing: border-box;background-color: #fff} +.gg-layout .layui-header a, +.gg-layout .layui-header a cite {color: #323232} +.gg-layout .layui-header a:hover {color: #000} +.gg-head-item{display:block; padding:0 16px; height:50px; line-height:50px; float:left;} +.gg-head-item i.layui-icon{font-size:20px;} +.gg-head-item .layui-nav{background:0 0;padding:0;} +.gg-head-item .layui-nav .layui-nav-item a{padding:0;} +.layui-layout-right .gg-head-item{border-left:1px solid #eeeeee;} +.layui-layout-right .gg-head-item i.layui-icon{font-weight:600} + +.layui-layout-right .gg-head-message{position:relative;} +.layui-layout-right .gg-message-num{height: 18px;position: absolute; top: -12px;margin-left: -4px;left: 50%;} +.layui-layout-right .gg-message-num span {min-width: 18px; height: 18px; margin: 0;padding: 0 4px; display: inline-block; font-size: 11px; line-height: 18px; text-align: center;background-color: #FF5722; color: #fff; border-radius: 12px;cursor: pointer;} +.gg-head-avatar img{width:28px; height:28px; border-radius:50%; margin-right:3px;} +.gg-head-avatar i.layui-icon{font-size:14px;position: relative;} +.layui-layout-right .layui-nav .layui-nav-item{height: 50px;line-height: 50px} +.gg-head-item .layui-nav .layui-this:after{display:none;} + +/*默认菜单模式*/ +.gg-layout .layui-side { width: 180px; height:100%; z-index: 1000; overflow: auto;} +.gg-layout .layui-side::-webkit-scrollbar { width: 0; } +.gg-layout .layui-side{scrollbar-width: none;} +.gg-layout .layui-logo {position: fixed;left: 0; top: 0; z-index: 1001; width: 180px; height: 49px; text-align:center; line-height:49px; overflow: hidden;background-color: #111827; border-bottom: 1px solid #011120; cursor:pointer;} +.gg-layout .layui-logo,.gg-layout .layui-logo a {color: #f1f1f1; text-align:center;} +.gg-layout .layui-side .layui-nav-item .iconfont{font-weight:600; font-size:18px;} +.gg-layout .layui-side .layui-nav-bar{width:3px;left:inherit;right:0; background-color:#1A75FF} + +/** 展开菜单模式 **/ +.gg-layout .layui-side-expand, +.gg-layout .layui-side-expand .layui-logo{width: 120px;} +.layui-side-expand ul {margin-top: 49px;} +.layui-side-expand .menu-li {padding-top:1px;} +.layui-side-expand .menu-li > a { position: relative; display: block; padding-right: 12px; padding-left: 36px; height: 42px; color: rgba(255, 255, 255, 0.75); transition: 0.1s cubic-bezier(0.145, 0.045, 0.355, 1); line-height: 42px;} +.layui-side-expand .menu-li > a > i { position: absolute; top: 50%; left: 8px; margin-top: -21px;} +.layui-side-expand .menu-li > a > cite { overflow: hidden; font-size: 14px; text-overflow: ellipsis; white-space: nowrap; } + +/**二级菜单**/ +.layui-side-expand .menu-li .gg-second-menu::-webkit-scrollbar { width: 0; } +.layui-side-expand .menu-li .gg-second-menu { position: fixed; top: 93px; bottom: 0; left: 120px; display: none; overflow-y: auto; width: 120px; background: #ffffff;border-left: 1px solid rgba(0, 0, 0, .05); box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05);transition: all 0.3s;} +.layui-side-expand .menu-li .gg-second-menu.current { display: block; } +.layui-side-expand .menu-li .gg-second-menu dt {height: 42px; font-size: 15px; line-height:42px; border-bottom: 1px solid #eeeeee;} +.layui-side-expand .menu-li .gg-second-menu dt strong {display: block; padding-left: 12px; color:#323232;} +.layui-side-expand .menu-li .gg-second-menu dd { display: block; width: 100%; line-height: 43px; } +.layui-side-expand .menu-li .gg-second-menu dd a { position: relative; display: block; padding-left: 12px; font-size: 14px; color: #323232!important;} +.layui-side-expand .menu-li .gg-second-menu dd > a > i { position: absolute; top: 1px; right: 5px; display: inline-block; font-size: 12px; transition: all 0.3s ease-in-out; } +.layui-side-expand .menu-li .gg-second-menu dd a.layui-this {background: #F0F6FE; color:#1A75FF!important;border-right:3px solid #186AF2} +.layui-side-expand .menu-li .gg-second-menu dd a:hover {color:#1A75FF!important;} + +.layui-side-expand .menu-li .gg-three-menu dt {height: 43px; font-size: 14px; line-height:43px; cursor:pointer; border-bottom: 0; position:relative;} +.layui-side-expand .menu-li .gg-three-menu dt strong {display: block; padding-left: 12px; color:#323232;} +.layui-side-expand .menu-li .gg-three-menu .layui-icon{position: absolute; top: 50%;right: 12px; margin-top: -22px; color:#677C91} +.layui-side-expand .menu-li .gg-three-menu .layui-icon-up{display:block} +.layui-side-expand .menu-li .gg-three-menu .layui-icon-down{display:none;} +.layui-side-expand .menu-li .gg-three-menu.show-up .layui-icon-down{display:block} +.layui-side-expand .menu-li .gg-three-menu.show-up .layui-icon-up,.layui-side-expand .menu-li .gg-three-menu.show-up dd{display:none;} + +/**默认菜单模式**/ +.layui-side-menu {box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05);background-color: #001529; color: #fff} +.layui-side-menu .layui-side-scroll {width: 100%;} +.layui-side-menu .layui-nav {width: 180px; margin-top: 50px; background: 0 0} +.layui-side-menu .layui-nav-item a {height: 42px;line-height: 42px; padding-left: 44px; padding-right: 20px} +.layui-side-menu .layui-nav-item>a {padding-top: 2px;padding-bottom: 2px} +.layui-side-menu .layui-nav-itemed>.layui-nav-child { padding: 0} +.layui-side-menu .layui-nav-item .bi, +.layui-side-menu .layui-nav-item .iconfont, +.layui-side-menu .layui-nav-item .layui-icon{position: absolute; top: 50%;left: 16px; margin-top: -21px} +.layui-side-menu .layui-nav-item .layui-nav-more {margin-top: -24px; color:#677C91} +.layui-side-menu .layui-nav-child .layui-nav-more {margin-top: -20px; color:#677C91} + +.layui-side-menu .layui-nav-child .layui-nav-child { background: 0 0 !important} +.layui-side-menu .layui-nav-child .layui-nav-child a {padding-left: 58px} +.layui-side-menu .layui-nav-more {right: 12px} + + +/**black**/ +.layui-side-black{background-color:#111827;} +.layui-side-black .layui-logo {border-bottom: 1px solid #000F1D;} +.layui-side-black .layui-nav-child dd.layui-this, +.layui-side-black .layui-nav-child dd.layui-this a, +.layui-side-black .layui-this, +.layui-side-black .layui-this>a, +.layui-side-black .layui-this>a:hover {background-color: #2F333F;} +.layui-side-black .layui-nav-child dd a:hover{background-color:#2F333F!important;} + + +/**white**/ +.layui-side-white{background-color: #fff; color: #323232; box-shadow: 1px 0 2px 0 rgba(0, 0, 0, .05);} +.layui-side-white .layui-logo {background-color: #ffffff;border-bottom: 1px solid #eeeeee;} +.layui-side-white .layui-nav-itemed>.layui-nav-child{background-color:#ffffff!important;} +.layui-side-white .layui-nav-item a,.layui-side-white .layui-nav-itemed>a{color:#323232!important;} +.layui-side-white .layui-nav-item a:hover{color:#1A75FF!important;} +.layui-side-white .layui-nav-item a.layui-this{color:#1A75FF!important;} +.layout-menu-classical .layui-side-white .layui-nav-item a.layui-this{border-right:3px solid #186AF2} +.layui-side-white .layui-nav-child dd.layui-this, +.layui-side-white .layui-nav-child dd.layui-this a, +.layui-side-white .layui-this, +.layui-side-white .layui-this>a, +.layui-side-white .layui-this>a:hover {background-color: #EBF3FF;} +.layui-side-white .layui-nav-child dd a:hover{background-color:#F8FAFF!important;color: #1A75FF!important; opacity: 0.9;} +.layui-side-white .layui-nav-tree .layui-nav-child,.layui-side-white .layui-nav{background-color:#ffffff!important;} +/**blue**/ +.layui-side-blue{background-color:#192A5E; color: #C5C9D2;} +.layui-side-blue .layui-logo {background-color:#192A5E;border-bottom: 1px solid #122150;} +.layui-side-blue .layui-nav-itemed>.layui-nav-child{background-color:#122150!important;} +.layui-side-blue .layui-nav-item a, +.layui-side-blue .layui-nav-itemed>a, +.layui-side-blue .layui-nav-title a, +.layui-side-blue .layui-nav-title a:hover{color:#C5C9D2!important;} +.layui-side-blue .layui-nav-child dd.layui-this, +.layui-side-blue .layui-nav-child dd.layui-this a, +.layui-side-blue .layui-this, +.layui-side-blue .layui-this>a, +.layui-side-blue .layui-this>a:hover {background-color: #3c508c;color: #ffffff;} +.layui-side-blue .layui-nav-child dd a:hover{background-color:#2b3e79!important;color: #C5C9D2!important;} + +.page-tabs{ position: fixed; top: 50px; right: 0; z-index: 999; height: 42px; line-height: 42px; padding: 0 80px 0 40px; background-color: #fff; box-sizing: border-box; box-shadow: 0 1px 3px rgb(0 0 0 / 12%);} +.gg-layout .page-tabs, +.gg-layout .layui-body, +.gg-layout .layui-footer, +.gg-layout .layui-layout-left {left: 180px} + +.layout-menu-expand .page-tabs, +.layout-menu-expand .layui-body, +.layout-menu-expand .layui-footer, +.layout-menu-expand .layui-layout-left {left: 120px;} +.layout-menu-expand .layui-logo{width:120px;} + +.layout-menu-expand .layui-body.expand-menu{left: 240px;} + +.page-tabs, +.gg-layout .layui-body, +.gg-layout .layui-footer, +.gg-layout .layui-header .layui-layout-right, +.gg-layout .layui-header .layui-nav .layui-nav-item, +.gg-layout .layui-layout-left, +.gg-layout .layui-logo, +.gg-layout .layui-side {transition: all .3s;-webkit-transition: all .3s} + +.gg-layout .layui-body {top: 90px;bottom: 0; height:calc(100% - 90px); position: fixed;} +.gg-layout .gg-tab-page {position: absolute; top: 0; bottom: 0;left: 0; right: 0; display: none; overflow: hidden;} +.gg-layout .layui-footer {padding: 10px 0;text-align: center; box-shadow: 0 -1px 2px 0 rgba(0, 0, 0, .05)} +.gg-body-shade {position: fixed; display: none;left: 0; right: 0; top: 0; bottom: 0; background-color: rgba(0, 0, 0, .3); z-index: 1000} + +.page-tabs .gg-tabs-control { position: absolute; top: 0;width: 40px; height: 100%;text-align: center; cursor: pointer;box-sizing: border-box; border-left: 1px solid #eeeeee; + transition: all .3s; + -webkit-transition: all .3s; +} +.page-tabs .gg-tabs-control:hover {background-color: #fafafa} +.page-tabs .layui-icon-prev {left: 0; border-left: none; border-right: 1px solid #eeeeee} +.page-tabs .layui-icon-next {right: 40px} +.page-tabs .layui-icon-down {right: 0} +.page-tabs .layui-tab {margin: 0; overflow: hidden} +.page-tabs .layui-tab-title {height: 42px;border: none} +.page-tabs .layui-tab-title i{font-size:18px; font-weight:600} + +.page-tabs .layui-tab-title li { min-width: 0; line-height: 42px; max-width: 160px; text-overflow: ellipsis; padding-left:12px; padding-right: 32px;overflow: hidden;border-right: 1px solid #eeeeee;vertical-align: top} +.page-tabs .layui-tab-title li:first-child {padding-right: 15px} +.page-tabs .layui-tab-title li .layui-tab-close { position: absolute;right: 8px; top: 50%;margin: -7px 0 0; width: 16px; height: 16px;line-height: 16px;border-radius: 50%;font-size: 12px} +.page-tabs .layui-tab-title li:after { content: ''; position: absolute; top: 0; left: 0;width: 0; height: 3px; border-radius: 0; background-color: #1A75FF; + transition: all .3s; + -webkit-transition: all .3s +} + +.page-tabs .layui-tab-title li:hover:after {width: 100%} + +.page-tabs .layui-tab-title li.layui-this, +.page-tabs .layui-tab-title li:hover { background-color: #fafafa; color:#1A75FF} + +.page-tabs .layui-tab-title li.layui-this:after {width: 100%; border: none; background-color: #1A75FF} + +.page-tabs .layui-tab-title li:first-child .layui-tab-close, +.gg-tabs-select.layui-nav .layui-nav-bar, +.gg-tabs-select.layui-nav .layui-nav-more {display: none} + +.gg-tabs-select.layui-nav { position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 0; background: 0 0} +.gg-tabs-select.layui-nav .layui-nav-item { line-height: 40px} +.gg-tabs-select.layui-nav .layui-nav-item>a {height: 40px} +.gg-tabs-select.layui-nav .layui-nav-item a {color: #666} +.gg-tabs-select.layui-nav .layui-nav-child {top: 40px;left: auto;right: 0} + +.gg-tabs-select.layui-nav .layui-nav-child dd.layui-this, +.gg-tabs-select.layui-nav .layui-nav-child dd.layui-this a {background-color: #f2f2f2 !important;color: #323232} + +.gg-layout .layui-logo .logo{display: none} +.side-spread .gg-layout .layui-logo {width: 52px;} +.side-spread .gg-layout .layui-logo .syslogo{display: none} +.side-spread .gg-layout .layui-logo .logo{display: inline-block} +.side-spread .layui-side {left: 0;width: 52px} +.side-spread .layui-side-expand .menu-li > a > i{left:15px;} +.side-spread .layui-side-expand .menu-li .gg-second-menu{left:52px;} + +.side-spread .page-tabs, +.side-spread .gg-layout .layui-body, +.side-spread .gg-layout .layui-footer, +.side-spread .gg-layout .layui-layout-left {left: 52px} + +.side-spread .layout-menu-expand .layui-body.expand-menu{left: 172px;} + +.side-spread .layui-side .layui-nav {position: static; width: 52px} +.side-spread .layui-side .layui-nav-item {position: static} +.side-spread .layui-side .layui-nav-item>a {padding-right: 0;padding-left:55px;} + +.side-spread .layui-side .layui-nav-item cite, +.side-spread .layui-side .layui-nav>.layui-nav-item>.layui-nav-child, +.side-spread .layui-side .layui-nav>.layui-nav-item>a .layui-nav-more {display: none!important; padding: 8px 0;width: 180px} + +.side-spread .layui-side .layui-nav>.layui-nav-itemed>a {background: rgba(0, 0, 0, .3)} + +.side-layout .layui-layer-TipsG.layui-layer-TipsR{display:none;} +.side-layout.layui-layer-tips .layui-layer-content{padding:0!important; border-radius:0!important;} +.side-layout .layui-nav-tree .layui-nav-bar{background-color: #3C9CFF;width:3px;} + +.side-spread-sm .layui-side { + transform: translate3d(0,0,0); + -webkit-transform: translate3d(0,0,0); +} +.side-spread-sm .page-tabs, +.side-spread-sm .gg-layout .layui-body, +.side-spread-sm .gg-layout .layui-footer, +.side-spread-sm .gg-layout .layui-layout-left { + left: 0; + transform: translate3d(200px,0,0); + -webkit-transform: translate3d(200px,0,0); +} +.side-spread-sm .gg-body-shade { + display: block; +} + +/** tab过场动画 **/ +.tab-loading{ position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 666666; display: block; width: 100%; height: 100%; background-color: #fafafa;} +.tab-loader {position: absolute;top: calc(50% - 1.6em);left: calc(50% - 1.6em); width: 3.2em; height: 3.2em; transform: rotate(165deg);} +.tab-loader:before,.tab-loader:after {content: ""; position: absolute; top: 50%; left: 50%; display: block; width: 0.6em; height: 0.6em; border-radius: 0.3em; transform: translate(-50%, -50%);} +.tab-loader:before { animation: before 2s infinite;} +.tab-loader:after {animation: after 2s infinite;} + +@keyframes before { + 0% { + width: 0.6em; + box-shadow: 1.6em -0.6em rgba(225, 20, 98, 0.88), -1.6em 0.6em rgba(111, 202, 220, 0.88); + } + 35% { + width: 3.2em; + box-shadow: 0 -0.6em rgba(225, 20, 98, 0.88), 0 0.6em rgba(111, 202, 220, 0.88); + } + 70% { + width: 0.6em; + box-shadow: -1em -0.6em rgba(225, 20, 98, 0.88), 1.6em 0.6em rgba(111, 202, 220, 0.88); + } + 100% { + box-shadow: 1em -0.6em rgba(225, 20, 98, 0.88), -1.6em 0.6em rgba(111, 202, 220, 0.88); + } +} +@keyframes after { + 0% { + height: 0.6em; + box-shadow: 0.6em 1.6em rgba(61, 184, 143, 0.88), -0.6em -1.6em rgba(233, 169, 32, 0.88); + } + 35% { + height: 3.2em; + box-shadow: 0.6em 0 rgba(61, 184, 143, 0.88), -0.6em 0 rgba(233, 169, 32, 0.88); + } + 70% { + height: 0.6em; + box-shadow: 0.6em -1.6em rgba(61, 184, 143, 0.88), -0.6em 1.6em rgba(233, 169, 32, 0.88); + } + 100% { + box-shadow: 0.6em 1.6em rgba(61, 184, 143, 0.88), -0.6em -1.6em rgba(233, 169, 32, 0.88); + } +} \ No newline at end of file diff --git a/public/static/assets/gougu/gouguInit.js b/public/static/assets/gougu/gouguInit.js new file mode 100644 index 0000000..1656a5e --- /dev/null +++ b/public/static/assets/gougu/gouguInit.js @@ -0,0 +1,37 @@ +window.rootPath = (function (src) { + src = document.currentScript + ? document.currentScript.src + : document.scripts[document.scripts.length - 1].src; + return src.substring(0, src.lastIndexOf("/") + 1); +})(); + +window.rootVersion = (function (src) { + src = document.currentScript + ? document.currentScript.src + : document.scripts[document.scripts.length - 1].src; + return src.split('?v=')[1]; +})(); + +if (typeof $ == "undefined") { + window.jQuery = layui.jquery; + window.$ = layui.jquery; +} +if (typeof moduleInit == "undefined") { + window.moduleInit = []; +} +var module = {}; +if (moduleInit.length > 0) { + for (var i = 0; i < moduleInit.length; i++) { + module[moduleInit[i]] = moduleInit[i]; + } +} +layui.config({ + base: rootPath + "module/", + version: rootVersion +}).extend(module).use(moduleInit, function () { + if (typeof gouguInit === 'function') { + gouguInit(); + } +}); + + diff --git a/public/static/assets/gougu/images/click-edit.png b/public/static/assets/gougu/images/click-edit.png new file mode 100644 index 0000000..0995dec Binary files /dev/null and b/public/static/assets/gougu/images/click-edit.png differ diff --git a/public/static/assets/gougu/images/data-none.png b/public/static/assets/gougu/images/data-none.png new file mode 100644 index 0000000..67d9b32 Binary files /dev/null and b/public/static/assets/gougu/images/data-none.png differ diff --git a/public/static/assets/gougu/images/delete_icon.png b/public/static/assets/gougu/images/delete_icon.png new file mode 100644 index 0000000..40d0263 Binary files /dev/null and b/public/static/assets/gougu/images/delete_icon.png differ diff --git a/public/static/assets/gougu/images/gouguadmin.png b/public/static/assets/gougu/images/gouguadmin.png new file mode 100644 index 0000000..e85e113 Binary files /dev/null and b/public/static/assets/gougu/images/gouguadmin.png differ diff --git a/public/static/assets/gougu/images/icon.png b/public/static/assets/gougu/images/icon.png new file mode 100644 index 0000000..9a516e4 Binary files /dev/null and b/public/static/assets/gougu/images/icon.png differ diff --git a/public/static/assets/gougu/images/logo.png b/public/static/assets/gougu/images/logo.png new file mode 100644 index 0000000..82e9893 Binary files /dev/null and b/public/static/assets/gougu/images/logo.png differ diff --git a/public/static/assets/gougu/images/nonepic600x360.jpg b/public/static/assets/gougu/images/nonepic600x360.jpg new file mode 100644 index 0000000..d15f7d1 Binary files /dev/null and b/public/static/assets/gougu/images/nonepic600x360.jpg differ diff --git a/public/static/assets/gougu/module/admin.js b/public/static/assets/gougu/module/admin.js new file mode 100644 index 0000000..8b653e8 --- /dev/null +++ b/public/static/assets/gougu/module/admin.js @@ -0,0 +1,542 @@ +layui.define([], function (exports) { + let element = layui.element; + let $gouguApp = $("#GouguApp"); + let $gouguAppBody = $("#GouguAppBody"); + let $gouguMenuList = $("#menuList"); + let tab = { + // tab动画加载效果 + loading: function() { + let load = '
              '; + let $iframe = $gouguAppBody.find('.gg-tab-page.layui-show iframe'); + if (!$iframe.next().length) { + $iframe.parent().append(load); + let tabLoad = $iframe.parent().find('.tab-loading'); + let tab_timestamp = $iframe.data('timestamp'); + let timestamp = new Date().getTime(); + //console.log(tab_timestamp); + if(timestamp-tab_timestamp<666){ + $iframe.on('load', function() { + tabLoad.fadeOut(666, function() { + tabLoad.remove(); + }); + }) + } + else{ + tabLoad.fadeOut(666, function() { + tabLoad.remove(); + }); + } + } + }, + //历史tab预加载 + tabTem: function (id, url, title) { + element.tabAdd('gg-admin-tab', { + id: id, + url:url, + title: '' + title + }); + $gouguAppBody.append('
              '); + }, + /*新增一个Tab页面 + * @id,tab页面唯一标识,可是标签中data-id的属性值 + * @url,tab页面地址 + * @name,tab页面标题, + */ + tabAdd: function (id, url, title) { + let thetabs = $('#pageTabUl').find('li'); + if (thetabs.length > 15) { + layer.tips('点击LOGO快速关闭已开的TAB页面', $('.layui-logo')); + } + if (thetabs.length > 20) { + layer.msg('你已打开了太多TAB页面了,请关闭部分TAB再使用'); + return false; + } + element.tabAdd('gg-admin-tab', { + id: id, + url:url, + title: '' + title + }); + // 获取当前时间戳(毫秒数) + let timestamp = new Date().getTime(); + $gouguAppBody.append('
              '); + this.tabChange(id); + }, + //从子页面打开新的Tab页面,防止id重复,使用时间戳作为唯一标识 + sonAdd: function (url, title,id) { + if ($(".layui-tab-title li[lay-id]").length <= 0) { + //打开新的tab项 + this.tabAdd(id, url, title); + } else { + //否则判断该tab项是否以及存在 + let isHas = false; + $.each($(".layui-tab-title li[lay-id]"), function () { + //如果点击左侧菜单栏所传入的id 在右侧tab项中的lay-id属性可以找到,则说明该tab项已经打开 + if ($(this).attr("lay-id") == id) { + isHas = true; + $('[data-frameid="' + id + '"]').attr('src', url); + //最后不管是否新增tab,最后都转到要打开的选项页面上 + tab.tabChange(id); + } + }) + if (isHas == false) { + //标志为false 新增一个tab项 + tab.tabAdd(id, url, title); + } + } + try { + layer.close(window.openTips); + } catch (e) { + console.log(e.message); + } + }, + //根据传入的id传入到指定的tab项,并滚动定位 + tabChange: function (id) { + element.tabChange('gg-admin-tab', id); + }, + //删除tab页面 + tabDelete: function (id) { + if (id == 0) { + return; + } + element.tabDelete('gg-admin-tab', id); + }, + /*删除所有tab页面 + *@ids 是一个数组,存放多个id,调用tabDelete方法分别删除 + */ + tabDeleteAll: function (ids) { + let that = this; + $.each(ids, function (i, item) { + that.tabDelete(item); + }) + }, + //tab页面关闭自己,需要使用父iframe配合一起调用,如:parent.tab.sonClose(); + sonClose: function (id) { + $('.layui-tab .layui-tab-title .layui-this i').click(); + }, + //滚动tab + tabRoll: function (event, index) { + let $tabTitle = $("#pageTabs .layui-tab-title"), + $tabs = $tabTitle.children("li"), + $outerWidth = ($tabTitle.prop("scrollWidth"), $tabTitle.outerWidth()), + $left = parseFloat($tabTitle.css("left")); + if ("left" === event) { + if (!$left && $left <= 0){ + return; + } + let roll = -$left - $outerWidth; + $tabs.each(function (item, i) { + let $item = $(i),$itemleft = $item.position().left; + if ($itemleft >= roll) { + return $tabTitle.css("left", -$itemleft), false; + } + }) + } else "auto" === event ? ! function () { + let $itemleft, $item = $tabs.eq(index); + if ($item[0]) { + if ($itemleft = $item.position().left, $itemleft < -$left) return $tabTitle.css("left", -$itemleft); + if ($itemleft + $item.outerWidth() >= $outerWidth - $left) { + let $diff = $itemleft + $item.outerWidth() - ($outerWidth - $left); + $tabs.each(function (e, i) { + let $tabitem = $(i),$tabitemleft = $tabitem.position().left; + if ($tabitemleft + $left > 0 && $tabitemleft - $left > $diff) return $tabTitle.css("left", -$tabitemleft), false; + }) + } + } + }() : $tabs.each(function (item, i) { + let $item = $(i),$itemleft = $item.position().left; + if ($itemleft + $item.outerWidth() >= $outerWidth - $left) return $tabTitle.css("left", -$itemleft), false; + }) + }, + tabFollow:function(id){ + $gouguMenuList.find('.side-menu-item').removeClass('layui-this'); + $gouguMenuList.find('dd').removeClass('layui-this').removeClass('layui-nav-itemed'); + $gouguMenuList.find('.menu-li').removeClass('layui-nav-itemed'); + $gouguMenuList.find('.gg-second-menu').removeClass('current'); + $('#GouguAppBody').removeClass('expand-menu'); + $('.side-menu-item').each(function (index,item){ + if($(item).data("id") == id) { + //console.log(item); + $(item).addClass('layui-this'); + $(item).parents('dd').addClass('layui-nav-itemed'); + $(item).parents('dl').addClass('current'); + + let $menuli = $(item).parents('.menu-li'); + $menuli.addClass('layui-nav-itemed'); + + // 展开菜单模式 + if ($('.layout-menu-expand').length) { + $menuli.siblings().find('a').removeClass('layui-this'); + $menuli.children('a').addClass('layui-this'); + // 子级菜单 + $menuli.siblings().find('.gg-second-menu').removeClass('current'); + if ($menuli.children('.gg-second-menu').length) { + $('#GouguAppBody').addClass('expand-menu'); + let second_menu = $(this).parent().parent(); + second_menu.removeClass('show-up'); + //console.log(second_menu.html()); + } + } + } + }) + }, + refresh:function(id){ + if(parent.document.getElementById(id)){ + let src = parent.document.getElementById(id).contentWindow.location.href ? parent.document.getElementById(id).contentWindow.location.href : iframe.src; + document.getElementById(id).src = src; + } + }, + tabCookie:function(){ + let thetabs = $('#pageTabUl').find('li'),tab_id = 0,tab_array=[]; + thetabs.each(function(index,item){ + let _id = $(item).attr('lay-id'),_url = $(item).attr('lay-url'),_title = $(item).text(); + if(_id>0){ + tab_array.push({'id':_id,'url':_url,'title':_title}); + } + if($(item).hasClass('layui-this')){ + tab_id = _id; + } + }) + if(tab_array.length>0){ + let tabs_obj = {'tab_id':tab_id,'tab_array':tab_array}; + tab.setCookie('gougutab',JSON.stringify(tabs_obj)); + } + else{ + tab.delCookie('gougutab'); + } + }, + setCookie: function (name, value, days) { + let expires = ""; + if (days) { + let date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = "; expires=" + date.toGMTString(); + } + document.cookie = name + "=" + value + expires + "; path=/"; + }, + getCookie: function (name) { + let arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); + if (arr != null) { + return unescape(arr[ 2 ]); + } + return null; + }, + delCookie: function (name) { + this.setCookie(name, "", -1); + }, + officeView:function (id,mode){ + layer.open({ + type: 2, + title: 'OFFICE文件查看(当前使用的是微软官方的OFFICE接口,服务器需要连接外网才能查看)', + id:'officeView', + shadeClose: false, + maxmin: false, //开启最大化最小化按钮 + area: ['100%', window.innerHeight+'px'], + offset: 'b', + //zIndex:2999, + resize:false, + anim: 2, + scrollbar:false, + //content: '/api/office/view?id='+id+'&mode='+mode, + content: '/api/office/officeapps?id='+id+'&mode='+mode, + cancel: function(index, layero, that){ + //layer.msg('文件在后台保存中,请稍再查看或下载...', {time: 3*1000}); + } + }); + }, + pdfView:function (href){ + layer.open({ + type: 2, + title: 'PDF文件查看(当前使用的是浏览器自身接口查看)', + id:'pdfView', + shadeClose: false, + anim: 2, + maxmin: false, //开启最大化最小化按钮 + area: ['100%', window.innerHeight+'px'], + offset: 'b', + //zIndex:2999, + resize:false, + content: href + }); + }, + videoView:function (href){ + layer.open({ + type: 1, + title: '视频文件播放', + id:'videoView', + shadeClose: false, + area: ['810px', '510px'], + content: '
              ' + }); + }, + audioView:function (href){ + layer.open({ + type: 1, + title: '音频文件播放', + id:'audioView', + shadeClose: false, + area: ['500px', '120px'], + content: '' + }); + }, + photoView:function (href){ + let photos = { "data": [{"src": href}]}; + layer.photos({ + photos: photos, + anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数) + }); + } + }; + //切换tab + element.on('tab(gg-admin-tab)', function (data) { + let thisPage = $gouguAppBody.find('.gg-tab-page').eq(data.index); + let id = thisPage.data('id'); + let url = thisPage.data('url'); + if(thisPage.find('iframe').length==0){ + // 获取当前时间戳(毫秒数) + let timestamp = new Date().getTime(); + thisPage.html(''); + } + tab.tabFollow(id); + $gouguAppBody.find('.gg-tab-page').removeClass('layui-show'); + thisPage.addClass('layui-show'); + if(data.index==0){ + tab.refresh(0); + } + tab.loading(); + tab.tabRoll("auto", data.index); + tab.tabCookie(); + }); + //删除tab + element.on('tabDelete(gg-admin-tab)', function (data) { + $gouguAppBody.find('.gg-tab-page').eq(data.index).remove(); + tab.tabRoll("auto", data.index); + tab.tabCookie(); + }); + + //右滚动tab + $('[gg-event="tabRollRight"]').click(function () { + tab.tabRoll("right"); + }) + //左滚动tab + $('[gg-event="tabRollLeft"]').click(function () { + tab.tabRoll("left"); + }) + + //关闭全部tab,只保留首页 + $gouguApp.on('click', '[gg-event="closeAllTabs"]', function () { + let thetabs = $('#pageTabs .layui-tab-title').find('li'), ids = []; + for (let i = 0; i < thetabs.length; i++) { + let id = thetabs.eq(i).attr('lay-id'); + ids.push(id); + } + tab.tabDeleteAll(ids); + return false; + }) + + //关闭其他tab + $gouguApp.on('click', '[gg-event="closeOtherTabs"]', function () { + let thetabs = $('#pageTabs .layui-tab-title').find('li'), ids = []; + let thisid = $('#pageTabs .layui-tab-title').find('.layui-this').attr('lay-id'); + for (let i = 0; i < thetabs.length; i++) { + let id = thetabs.eq(i).attr('lay-id'); + if (id != thisid) { + ids.push(id); + } + } + tab.tabDeleteAll(ids); + return false; + }) + + //关闭当前tab + $gouguApp.on('click', '[gg-event="closeThisTabs"]', function () { + let thisid = $('#pageTabs .layui-tab-title').find('.layui-this').attr('lay-id'); + tab.tabDelete(thisid); + return false; + }) + + //当点击有side-menu-item属性的标签时,即左侧菜单栏中内容 ,触发tab + $('body').on('click', 'a.side-menu-item', function () { + let that = $(this); + let url = that.data("href"), id = that.data("id"), title = that.data("title"); + if (url == '' || url == '/') { + return false; + } + //这时会判断右侧.layui-tab-title属性下的有lay-id属性的li的数目,即已经打开的tab项数目 + //$('.site-menu-active').removeClass('layui-this'); + //that.addClass('layui-this'); + //$gouguApp.removeClass('side-spread-sm'); + if ($(".layui-tab-title li[lay-id]").length <= 0) { + //打开新的tab项 + tab.tabAdd(id, url, title); + } else { + //否则判断该tab项是否以及存在 + let isHas = false; + $.each($(".layui-tab-title li[lay-id]"), function () { + //如果点击左侧菜单栏所传入的id 在右侧tab项中的lay-id属性可以找到,则说明该tab项已经打开 + if ($(this).attr("lay-id") == id) { + isHas = true; + $('[data-frameid="' + id + '"]').attr('src', url); + //最后不管是否新增tab,最后都转到要打开的选项页面上 + tab.tabChange(id); + } + }) + if (isHas == false) { + //标志为false 新增一个tab项 + tab.tabAdd(id, url, title); + } + } + try { + layer.close(window.openTips); + } catch (e) { + console.log(e.message); + } + }); + + //左侧菜单展开&收缩 + $gouguApp.on('click', '[gg-event="shrink"]', function () { + let that_i = $(this).children('i'); + if (that_i.hasClass("layui-icon-shrink-right")) { + that_i.removeClass("layui-icon-shrink-right").addClass("layui-icon-spread-left"); + } + else{ + that_i.removeClass("layui-icon-spread-left").addClass("layui-icon-shrink-right"); + } + $gouguApp.toggleClass('side-spread'); + }) + /* + $gouguApp.on('click', '[gg-event="shade"]', function () { + $gouguApp.removeClass('side-spread-sm'); + }) + */ + + //左上角清除缓存 + $gouguApp.on('click', '[gg-event="cache"]', function (e) { + let that = $(this); + let url = $(this).data('href'); + if (that.attr('class') === 'clearThis') { + layer.tips('正在努力清理中...', this); + return false; + } + layer.tips('正在清理系统缓存...', this); + that.attr('class', 'clearThis'); + $.ajax({ + url: url, + success: function (res) { + if (res.code == 1) { + setTimeout(function () { + that.attr('class', ''); + layer.tips(res.msg, that); + }, 1000) + } else { + layer.tips(res.msg, that); + } + } + }) + }) + + //右上角刷新当前tab页面 + $gouguApp.on('click', '[gg-event="refresh"]', function () { + let that = $(this); + if (that.hasClass("refreshThis")) { + that.removeClass("refreshThis"); + let iframe = $(".gg-tab-page.layui-show").find("iframe")[0]; + if (iframe) { + tab.refresh(iframe.id); + } + setTimeout(function () { + that.attr("class", "refreshThis"); + }, 2000) + } else { + layer.tips("每2秒只可刷新一次", this, { + tips: 1 + }); + } + return false; + }) + + //右上角全屏&退出全屏 + $gouguApp.on("click", ".fullScreen", function () { + if ($(this).hasClass("layui-icon-screen-restore")) { + screenFun(2).then(function () { + $(".fullScreen").eq(0).removeClass("layui-icon-screen-restore"); + }); + } else { + screenFun(1).then(function () { + $(".fullScreen").eq(0).addClass("layui-icon-screen-restore"); + }); + } + }); + + //小菜单展现多级菜单 + $gouguApp.on("mouseenter", ".layui-nav-tree .menu-li", function () { + let tips = $(this).prop("innerHTML"); + if ($gouguApp.hasClass('side-spread') && tips) { + tips = "
              • " + tips + "
              "; + window.openTips = layer.tips(tips, $(this), { + tips: [2, '#2f4056'], + time: 300000, + skin: "popup-tips", + success: function (el) { + let left = $(el).position().left - 10; + $(el).addClass('side-layout').css({ left: left }); + element.render(); + } + }); + } + }); + + $("body").on("mouseleave", ".popup-tips", function () { + try { + layer.close(window.openTips); + } catch (e) { + console.log(e.message); + } + }); + + function screenFun(num) { + num = num || 1; + num = num * 1; + let docElm = document.documentElement; + switch (num) { + case 1: + if (docElm.requestFullscreen) { + docElm.requestFullscreen(); + } else if (docElm.mozRequestFullScreen) { + docElm.mozRequestFullScreen(); + } else if (docElm.webkitRequestFullScreen) { + docElm.webkitRequestFullScreen(); + } else if (docElm.msRequestFullscreen) { + docElm.msRequestFullscreen(); + } + break; + case 2: + if (document.exitFullscreen) { + document.exitFullscreen(); + } else if (document.mozCancelFullScreen) { + document.mozCancelFullScreen(); + } else if (document.webkitCancelFullScreen) { + document.webkitCancelFullScreen(); + } else if (document.msExitFullscreen) { + document.msExitFullscreen(); + } + break; + } + return new Promise(function (res, rej) { + res("返回值"); + }); + } + + function isFullscreen() { + return document.fullscreenElement || + document.msFullscreenElement || + document.mozFullScreenElement || + document.webkitFullscreenElement || false; + } + + window.onresize = function () { + if (!isFullscreen()) { + $(".fullScreen").eq(0).removeClass("layui-icon-screen-restore"); + } + } + exports('admin', tab); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/areaSelect.js b/public/static/assets/gougu/module/areaSelect.js new file mode 100644 index 0000000..b010ad4 --- /dev/null +++ b/public/static/assets/gougu/module/areaSelect.js @@ -0,0 +1,235 @@ +layui.define([], function (exports) { + let $ = layui.$, form = layui.form; + let gouguarea = { + _id: 0, + config: {}, + set: function (options) { + let that = this; + that.config = $.extend({}, that.config, options); + return that; + }, + on: function (events, callback) { + return layui.onevent.call(this, 'gouguarea', events, callback); + } + }; + let thisArea = function () { + let that = this; + return { + gouguarea: function (files) { + that.gouguarea.call(that, files); + }, + config: that.config + } + }; + let Class = function (options) { + let that = this; + that.config = $.extend({}, that.config, gouguarea.config, options); + that.render(); + }; + + let areaList = { + province_list: { "110000": "北京市", "120000": "天津市", "130000": "河北省", "140000": "山西省", "150000": "内蒙古自治区", "210000": "辽宁省", "220000": "吉林省", "230000": "黑龙江省", "310000": "上海市", "320000": "江苏省", "330000": "浙江省", "340000": "安徽省", "350000": "福建省", "360000": "江西省", "370000": "山东省", "410000": "河南省", "420000": "湖北省", "430000": "湖南省", "440000": "广东省", "450000": "广西壮族自治区", "460000": "海南省", "500000": "重庆市", "510000": "四川省", "520000": "贵州省", "530000": "云南省", "540000": "西藏自治区", "610000": "陕西省", "620000": "甘肃省", "630000": "青海省", "640000": "宁夏回族自治区", "650000": "新疆维吾尔自治区", "714368": "香港特别行政区", "714390": "澳门特别行政区", "714401": "台湾" }, + city_list: { "110100": "北京市", "120100": "天津市", "130100": "石家庄市", "130200": "唐山市", "130300": "秦皇岛市", "130400": "邯郸市", "130500": "邢台市", "130600": "保定市", "130700": "张家口市", "130800": "承德市", "130900": "沧州市", "131000": "廊坊市", "131100": "衡水市", "140100": "太原市", "140200": "大同市", "140300": "阳泉市", "140400": "长治市", "140500": "晋城市", "140600": "朔州市", "140700": "晋中市", "140800": "运城市", "140900": "忻州市", "141000": "临汾市", "141100": "吕梁市", "150100": "呼和浩特市", "150200": "包头市", "150300": "乌海市", "150400": "赤峰市", "150500": "通辽市", "150600": "鄂尔多斯市", "150700": "呼伦贝尔市", "150800": "巴彦淖尔市", "150900": "乌兰察布市", "152200": "兴安盟", "152500": "锡林郭勒盟", "152900": "阿拉善盟", "210100": "沈阳市", "210200": "大连市", "210300": "鞍山市", "210400": "抚顺市", "210500": "本溪市", "210600": "丹东市", "210700": "锦州市", "210800": "营口市", "210900": "阜新市", "211000": "辽阳市", "211100": "盘锦市", "211200": "铁岭市", "211300": "朝阳市", "211400": "葫芦岛市", "220100": "长春市", "220200": "吉林市", "220300": "四平市", "220400": "辽源市", "220500": "通化市", "220600": "白山市", "220700": "松原市", "220800": "白城市", "222400": "延边朝鲜族自治州", "230100": "哈尔滨市", "230200": "齐齐哈尔市", "230300": "鸡西市", "230400": "鹤岗市", "230500": "双鸭山市", "230600": "大庆市", "230700": "伊春市", "230800": "佳木斯市", "230900": "七台河市", "231000": "牡丹江市", "231100": "黑河市", "231200": "绥化市", "232700": "大兴安岭地区", "310100": "上海市", "320100": "南京市", "320200": "无锡市", "320300": "徐州市", "320400": "常州市", "320500": "苏州市", "320600": "南通市", "320700": "连云港市", "320800": "淮安市", "320900": "盐城市", "321000": "扬州市", "321100": "镇江市", "321200": "泰州市", "321300": "宿迁市", "330100": "杭州市", "330200": "宁波市", "330300": "温州市", "330400": "嘉兴市", "330500": "湖州市", "330600": "绍兴市", "330700": "金华市", "330800": "衢州市", "330900": "舟山市", "331000": "台州市", "331100": "丽水市", "340100": "合肥市", "340200": "芜湖市", "340300": "蚌埠市", "340400": "淮南市", "340500": "马鞍山市", "340600": "淮北市", "340700": "铜陵市", "340800": "安庆市", "341000": "黄山市", "341100": "滁州市", "341200": "阜阳市", "341300": "宿州市", "341500": "六安市", "341600": "亳州市", "341700": "池州市", "341800": "宣城市", "350100": "福州市", "350200": "厦门市", "350300": "莆田市", "350400": "三明市", "350500": "泉州市", "350600": "漳州市", "350700": "南平市", "350800": "龙岩市", "350900": "宁德市", "360100": "南昌市", "360200": "景德镇市", "360300": "萍乡市", "360400": "九江市", "360500": "新余市", "360600": "鹰潭市", "360700": "赣州市", "360800": "吉安市", "360900": "宜春市", "361000": "抚州市", "361100": "上饶市", "370100": "济南市", "370200": "青岛市", "370300": "淄博市", "370400": "枣庄市", "370500": "东营市", "370600": "烟台市", "370700": "潍坊市", "370800": "济宁市", "370900": "泰安市", "371000": "威海市", "371100": "日照市", "371300": "临沂市", "371400": "德州市", "371500": "聊城市", "371600": "滨州市", "371700": "菏泽市", "410100": "郑州市", "410200": "开封市", "410300": "洛阳市", "410400": "平顶山市", "410500": "安阳市", "410600": "鹤壁市", "410700": "新乡市", "410800": "焦作市", "410900": "濮阳市", "411000": "许昌市", "411100": "漯河市", "411200": "三门峡市", "411300": "南阳市", "411400": "商丘市", "411500": "信阳市", "411600": "周口市", "411700": "驻马店市", "411800": "济源市", "420100": "武汉市", "420200": "黄石市", "420300": "十堰市", "420500": "宜昌市", "420600": "襄阳市", "420700": "鄂州市", "420800": "荆门市", "420900": "孝感市", "421000": "荆州市", "421100": "黄冈市", "421200": "咸宁市", "421300": "随州市", "422800": "恩施土家族苗族自治州", "430100": "长沙市", "430200": "株洲市", "430300": "湘潭市", "430400": "衡阳市", "430500": "邵阳市", "430600": "岳阳市", "430700": "常德市", "430800": "张家界市", "430900": "益阳市", "431000": "郴州市", "431100": "永州市", "431200": "怀化市", "431300": "娄底市", "433100": "湘西土家族苗族自治州", "440100": "广州市", "440200": "韶关市", "440300": "深圳市", "440400": "珠海市", "440500": "汕头市", "440600": "佛山市", "440700": "江门市", "440800": "湛江市", "440900": "茂名市", "441200": "肇庆市", "441300": "惠州市", "441400": "梅州市", "441500": "汕尾市", "441600": "河源市", "441700": "阳江市", "441800": "清远市", "441900": "东莞市", "442000": "中山市", "445100": "潮州市", "445200": "揭阳市", "445300": "云浮市", "450100": "南宁市", "450200": "柳州市", "450300": "桂林市", "450400": "梧州市", "450500": "北海市", "450600": "防城港市", "450700": "钦州市", "450800": "贵港市", "450900": "玉林市", "451000": "百色市", "451100": "贺州市", "451200": "河池市", "451300": "来宾市", "451400": "崇左市", "460100": "海口市", "460200": "三亚市", "460300": "三沙市", "460400": "儋州市", "500100": "重庆市", "510100": "成都市", "510300": "自贡市", "510400": "攀枝花市", "510500": "泸州市", "510600": "德阳市", "510700": "绵阳市", "510800": "广元市", "510900": "遂宁市", "511000": "内江市", "511100": "乐山市", "511300": "南充市", "511400": "眉山市", "511500": "宜宾市", "511600": "广安市", "511700": "达州市", "511800": "雅安市", "511900": "巴中市", "512000": "资阳市", "513200": "阿坝藏族羌族自治州", "513300": "甘孜藏族自治州", "513400": "凉山彝族自治州", "520100": "贵阳市", "520200": "六盘水市", "520300": "遵义市", "520400": "安顺市", "520500": "毕节市", "520600": "铜仁市", "522300": "黔西南布依族苗族自治州", "522600": "黔东南苗族侗族自治州", "522700": "黔南布依族苗族自治州", "530100": "昆明市", "530300": "曲靖市", "530400": "玉溪市", "530500": "保山市", "530600": "昭通市", "530700": "丽江市", "530800": "普洱市", "530900": "临沧市", "532300": "楚雄彝族自治州", "532500": "红河哈尼族彝族自治州", "532600": "文山壮族苗族自治州", "532800": "西双版纳傣族自治州", "532900": "大理白族自治州", "533100": "德宏傣族景颇族自治州", "533300": "怒江傈僳族自治州", "533400": "迪庆藏族自治州", "540100": "拉萨市", "540200": "日喀则市", "540300": "昌都市", "540400": "林芝市", "540500": "山南市", "540600": "那曲市", "542500": "阿里地区", "610100": "西安市", "610200": "铜川市", "610300": "宝鸡市", "610400": "咸阳市", "610500": "渭南市", "610600": "延安市", "610700": "汉中市", "610800": "榆林市", "610900": "安康市", "611000": "商洛市", "620100": "兰州市", "620200": "嘉峪关市", "620300": "金昌市", "620400": "白银市", "620500": "天水市", "620600": "武威市", "620700": "张掖市", "620800": "平凉市", "620900": "酒泉市", "621000": "庆阳市", "621100": "定西市", "621200": "陇南市", "622900": "临夏回族自治州", "623000": "甘南藏族自治州", "630100": "西宁市", "630200": "海东市", "632200": "海北藏族自治州", "632300": "黄南藏族自治州", "632500": "海南藏族自治州", "632600": "果洛藏族自治州", "632700": "玉树藏族自治州", "632800": "海西蒙古族藏族自治州", "640100": "银川市", "640200": "石嘴山市", "640300": "吴忠市", "640400": "固原市", "640500": "中卫市", "650100": "乌鲁木齐市", "650200": "克拉玛依市", "650400": "吐鲁番市", "650500": "哈密市", "652300": "昌吉回族自治州", "652700": "博尔塔拉蒙古自治州", "652800": "巴音郭楞蒙古自治州", "652900": "阿克苏地区", "653000": "克孜勒苏柯尔克孜自治州", "653100": "喀什地区", "653200": "和田地区", "654000": "伊犁哈萨克自治州", "654200": "塔城地区", "654300": "阿勒泰地区", "659000": "直辖县级行政区", "714402": "彰化县", "717531": "新北市", "719868": "澎湖县", "720118": "屏东县", "722024": "臺中市", "725488": "臺南市", "727730": "臺北市", "729928": "臺东县", "730843": "桃园市", "734179": "宜兰县", "736051": "南投县", "737856": "南海岛", "737861": "苗栗县", "739957": "嘉义市", "740510": "嘉义县", "742126": "新竹市", "742636": "新竹县", "743938": "花莲县", "745674": "高雄市", "748553": "基隆市", "749571": "金门县", "749930": "连江县", "749957": "云林县", "752150": "香港特别行政区", "752169": "澳门特别行政区" }, + district_list: { "110101": "东城区", "110102": "西城区", "110105": "朝阳区", "110106": "丰台区", "110107": "石景山区", "110108": "海淀区", "110109": "门头沟区", "110111": "房山区", "110112": "通州区", "110113": "顺义区", "110114": "昌平区", "110115": "大兴区", "110116": "怀柔区", "110117": "平谷区", "110118": "密云区", "110119": "延庆区", "120101": "和平区", "120102": "河东区", "120103": "河西区", "120104": "南开区", "120105": "河北区", "120106": "红桥区", "120110": "东丽区", "120111": "西青区", "120112": "津南区", "120113": "北辰区", "120114": "武清区", "120115": "宝坻区", "120116": "滨海新区", "120117": "宁河区", "120118": "静海区", "120119": "蓟州区", "130102": "长安区", "130104": "桥西区", "130105": "新华区", "130107": "井陉矿区", "130108": "裕华区", "130109": "藁城区", "130110": "鹿泉区", "130111": "栾城区", "130121": "井陉县", "130123": "正定县", "130125": "行唐县", "130126": "灵寿县", "130127": "高邑县", "130128": "深泽县", "130129": "赞皇县", "130130": "无极县", "130131": "平山县", "130132": "元氏县", "130133": "赵县", "130181": "辛集市", "130183": "晋州市", "130184": "新乐市", "130202": "路南区", "130203": "路北区", "130204": "古冶区", "130205": "开平区", "130207": "丰南区", "130208": "丰润区", "130209": "曹妃甸区", "130224": "滦南县", "130225": "乐亭县", "130227": "迁西县", "130229": "玉田县", "130281": "遵化市", "130283": "迁安市", "130284": "滦州市", "130302": "海港区", "130303": "山海关区", "130304": "北戴河区", "130306": "抚宁区", "130321": "青龙满族自治县", "130322": "昌黎县", "130324": "卢龙县", "130402": "邯山区", "130403": "丛台区", "130404": "复兴区", "130406": "峰峰矿区", "130407": "肥乡区", "130408": "永年区", "130423": "临漳县", "130424": "成安县", "130425": "大名县", "130426": "涉县", "130427": "磁县", "130430": "邱县", "130431": "鸡泽县", "130432": "广平县", "130433": "馆陶县", "130434": "魏县", "130435": "曲周县", "130481": "武安市", "130502": "襄都区", "130503": "信都区", "130505": "任泽区", "130506": "南和区", "130522": "临城县", "130523": "内丘县", "130524": "柏乡县", "130525": "隆尧县", "130528": "宁晋县", "130529": "巨鹿县", "130530": "新河县", "130531": "广宗县", "130532": "平乡县", "130533": "威县", "130534": "清河县", "130535": "临西县", "130581": "南宫市", "130582": "沙河市", "130602": "竞秀区", "130606": "莲池区", "130607": "满城区", "130608": "清苑区", "130609": "徐水区", "130623": "涞水县", "130624": "阜平县", "130626": "定兴县", "130627": "唐县", "130628": "高阳县", "130629": "容城县", "130630": "涞源县", "130631": "望都县", "130632": "安新县", "130633": "易县", "130634": "曲阳县", "130635": "蠡县", "130636": "顺平县", "130637": "博野县", "130638": "雄县", "130681": "涿州市", "130682": "定州市", "130683": "安国市", "130684": "高碑店市", "130702": "桥东区", "130703": "桥西区", "130705": "宣化区", "130706": "下花园区", "130708": "万全区", "130709": "崇礼区", "130722": "张北县", "130723": "康保县", "130724": "沽源县", "130725": "尚义县", "130726": "蔚县", "130727": "阳原县", "130728": "怀安县", "130730": "怀来县", "130731": "涿鹿县", "130732": "赤城县", "130802": "双桥区", "130803": "双滦区", "130804": "鹰手营子矿区", "130821": "承德县", "130822": "兴隆县", "130824": "滦平县", "130825": "隆化县", "130826": "丰宁满族自治县", "130827": "宽城满族自治县", "130828": "围场满族蒙古族自治县", "130881": "平泉市", "130902": "新华区", "130903": "运河区", "130921": "沧县", "130922": "青县", "130923": "东光县", "130924": "海兴县", "130925": "盐山县", "130926": "肃宁县", "130927": "南皮县", "130928": "吴桥县", "130929": "献县", "130930": "孟村回族自治县", "130981": "泊头市", "130982": "任丘市", "130983": "黄骅市", "130984": "河间市", "131002": "安次区", "131003": "广阳区", "131022": "固安县", "131023": "永清县", "131024": "香河县", "131025": "大城县", "131026": "文安县", "131028": "大厂回族自治县", "131081": "霸州市", "131082": "三河市", "131102": "桃城区", "131103": "冀州区", "131121": "枣强县", "131122": "武邑县", "131123": "武强县", "131124": "饶阳县", "131125": "安平县", "131126": "故城县", "131127": "景县", "131128": "阜城县", "131182": "深州市", "140105": "小店区", "140106": "迎泽区", "140107": "杏花岭区", "140108": "尖草坪区", "140109": "万柏林区", "140110": "晋源区", "140121": "清徐县", "140122": "阳曲县", "140123": "娄烦县", "140181": "古交市", "140212": "新荣区", "140213": "平城区", "140214": "云冈区", "140215": "云州区", "140221": "阳高县", "140222": "天镇县", "140223": "广灵县", "140224": "灵丘县", "140225": "浑源县", "140226": "左云县", "140302": "城区", "140303": "矿区", "140311": "郊区", "140321": "平定县", "140322": "盂县", "140403": "潞州区", "140404": "上党区", "140405": "屯留区", "140406": "潞城区", "140423": "襄垣县", "140425": "平顺县", "140426": "黎城县", "140427": "壶关县", "140428": "长子县", "140429": "武乡县", "140430": "沁县", "140431": "沁源县", "140502": "城区", "140521": "沁水县", "140522": "阳城县", "140524": "陵川县", "140525": "泽州县", "140581": "高平市", "140602": "朔城区", "140603": "平鲁区", "140621": "山阴县", "140622": "应县", "140623": "右玉县", "140681": "怀仁市", "140702": "榆次区", "140703": "太谷区", "140721": "榆社县", "140722": "左权县", "140723": "和顺县", "140724": "昔阳县", "140725": "寿阳县", "140727": "祁县", "140728": "平遥县", "140729": "灵石县", "140781": "介休市", "140802": "盐湖区", "140821": "临猗县", "140822": "万荣县", "140823": "闻喜县", "140824": "稷山县", "140825": "新绛县", "140826": "绛县", "140827": "垣曲县", "140828": "夏县", "140829": "平陆县", "140830": "芮城县", "140881": "永济市", "140882": "河津市", "140902": "忻府区", "140921": "定襄县", "140922": "五台县", "140923": "代县", "140924": "繁峙县", "140925": "宁武县", "140926": "静乐县", "140927": "神池县", "140928": "五寨县", "140929": "岢岚县", "140930": "河曲县", "140931": "保德县", "140932": "偏关县", "140981": "原平市", "141002": "尧都区", "141021": "曲沃县", "141022": "翼城县", "141023": "襄汾县", "141024": "洪洞县", "141025": "古县", "141026": "安泽县", "141027": "浮山县", "141028": "吉县", "141029": "乡宁县", "141030": "大宁县", "141031": "隰县", "141032": "永和县", "141033": "蒲县", "141034": "汾西县", "141081": "侯马市", "141082": "霍州市", "141102": "离石区", "141121": "文水县", "141122": "交城县", "141123": "兴县", "141124": "临县", "141125": "柳林县", "141126": "石楼县", "141127": "岚县", "141128": "方山县", "141129": "中阳县", "141130": "交口县", "141181": "孝义市", "141182": "汾阳市", "150102": "新城区", "150103": "回民区", "150104": "玉泉区", "150105": "赛罕区", "150121": "土默特左旗", "150122": "托克托县", "150123": "和林格尔县", "150124": "清水河县", "150125": "武川县", "150202": "东河区", "150203": "昆都仑区", "150204": "青山区", "150205": "石拐区", "150206": "白云鄂博矿区", "150207": "九原区", "150221": "土默特右旗", "150222": "固阳县", "150223": "达尔罕茂明安联合旗", "150302": "海勃湾区", "150303": "海南区", "150304": "乌达区", "150402": "红山区", "150403": "元宝山区", "150404": "松山区", "150421": "阿鲁科尔沁旗", "150422": "巴林左旗", "150423": "巴林右旗", "150424": "林西县", "150425": "克什克腾旗", "150426": "翁牛特旗", "150428": "喀喇沁旗", "150429": "宁城县", "150430": "敖汉旗", "150502": "科尔沁区", "150521": "科尔沁左翼中旗", "150522": "科尔沁左翼后旗", "150523": "开鲁县", "150524": "库伦旗", "150525": "奈曼旗", "150526": "扎鲁特旗", "150581": "霍林郭勒市", "150602": "东胜区", "150603": "康巴什区", "150621": "达拉特旗", "150622": "准格尔旗", "150623": "鄂托克前旗", "150624": "鄂托克旗", "150625": "杭锦旗", "150626": "乌审旗", "150627": "伊金霍洛旗", "150702": "海拉尔区", "150703": "扎赉诺尔区", "150721": "阿荣旗", "150722": "莫力达瓦达斡尔族自治旗", "150723": "鄂伦春自治旗", "150724": "鄂温克族自治旗", "150725": "陈巴尔虎旗", "150726": "新巴尔虎左旗", "150727": "新巴尔虎右旗", "150781": "满洲里市", "150782": "牙克石市", "150783": "扎兰屯市", "150784": "额尔古纳市", "150785": "根河市", "150802": "临河区", "150821": "五原县", "150822": "磴口县", "150823": "乌拉特前旗", "150824": "乌拉特中旗", "150825": "乌拉特后旗", "150826": "杭锦后旗", "150902": "集宁区", "150921": "卓资县", "150922": "化德县", "150923": "商都县", "150924": "兴和县", "150925": "凉城县", "150926": "察哈尔右翼前旗", "150927": "察哈尔右翼中旗", "150928": "察哈尔右翼后旗", "150929": "四子王旗", "150981": "丰镇市", "152201": "乌兰浩特市", "152202": "阿尔山市", "152221": "科尔沁右翼前旗", "152222": "科尔沁右翼中旗", "152223": "扎赉特旗", "152224": "突泉县", "152501": "二连浩特市", "152502": "锡林浩特市", "152522": "阿巴嘎旗", "152523": "苏尼特左旗", "152524": "苏尼特右旗", "152525": "东乌珠穆沁旗", "152526": "西乌珠穆沁旗", "152527": "太仆寺旗", "152528": "镶黄旗", "152529": "正镶白旗", "152530": "正蓝旗", "152531": "多伦县", "152921": "阿拉善左旗", "152922": "阿拉善右旗", "152923": "额济纳旗", "210102": "和平区", "210103": "沈河区", "210104": "大东区", "210105": "皇姑区", "210106": "铁西区", "210111": "苏家屯区", "210112": "浑南区", "210113": "沈北新区", "210114": "于洪区", "210115": "辽中区", "210123": "康平县", "210124": "法库县", "210181": "新民市", "210202": "中山区", "210203": "西岗区", "210204": "沙河口区", "210211": "甘井子区", "210212": "旅顺口区", "210213": "金州区", "210214": "普兰店区", "210224": "长海县", "210281": "瓦房店市", "210283": "庄河市", "210302": "铁东区", "210303": "铁西区", "210304": "立山区", "210311": "千山区", "210321": "台安县", "210323": "岫岩满族自治县", "210381": "海城市", "210402": "新抚区", "210403": "东洲区", "210404": "望花区", "210411": "顺城区", "210421": "抚顺县", "210422": "新宾满族自治县", "210423": "清原满族自治县", "210502": "平山区", "210503": "溪湖区", "210504": "明山区", "210505": "南芬区", "210521": "本溪满族自治县", "210522": "桓仁满族自治县", "210602": "元宝区", "210603": "振兴区", "210604": "振安区", "210624": "宽甸满族自治县", "210681": "东港市", "210682": "凤城市", "210702": "古塔区", "210703": "凌河区", "210711": "太和区", "210726": "黑山县", "210727": "义县", "210781": "凌海市", "210782": "北镇市", "210802": "站前区", "210803": "西市区", "210804": "鲅鱼圈区", "210811": "老边区", "210881": "盖州市", "210882": "大石桥市", "210902": "海州区", "210903": "新邱区", "210904": "太平区", "210905": "清河门区", "210911": "细河区", "210921": "阜新蒙古族自治县", "210922": "彰武县", "211002": "白塔区", "211003": "文圣区", "211004": "宏伟区", "211005": "弓长岭区", "211011": "太子河区", "211021": "辽阳县", "211081": "灯塔市", "211102": "双台子区", "211103": "兴隆台区", "211104": "大洼区", "211122": "盘山县", "211202": "银州区", "211204": "清河区", "211221": "铁岭县", "211223": "西丰县", "211224": "昌图县", "211281": "调兵山市", "211282": "开原市", "211302": "双塔区", "211303": "龙城区", "211321": "朝阳县", "211322": "建平县", "211324": "喀喇沁左翼蒙古族自治县", "211381": "北票市", "211382": "凌源市", "211402": "连山区", "211403": "龙港区", "211404": "南票区", "211421": "绥中县", "211422": "建昌县", "211481": "兴城市", "220102": "南关区", "220103": "宽城区", "220104": "朝阳区", "220105": "二道区", "220106": "绿园区", "220112": "双阳区", "220113": "九台区", "220122": "农安县", "220182": "榆树市", "220183": "德惠市", "220184": "公主岭市", "220202": "昌邑区", "220203": "龙潭区", "220204": "船营区", "220211": "丰满区", "220221": "永吉县", "220281": "蛟河市", "220282": "桦甸市", "220283": "舒兰市", "220284": "磐石市", "220302": "铁西区", "220303": "铁东区", "220322": "梨树县", "220323": "伊通满族自治县", "220382": "双辽市", "220402": "龙山区", "220403": "西安区", "220421": "东丰县", "220422": "东辽县", "220502": "东昌区", "220503": "二道江区", "220521": "通化县", "220523": "辉南县", "220524": "柳河县", "220581": "梅河口市", "220582": "集安市", "220602": "浑江区", "220605": "江源区", "220621": "抚松县", "220622": "靖宇县", "220623": "长白朝鲜族自治县", "220681": "临江市", "220702": "宁江区", "220721": "前郭尔罗斯蒙古族自治县", "220722": "长岭县", "220723": "乾安县", "220781": "扶余市", "220802": "洮北区", "220821": "镇赉县", "220822": "通榆县", "220881": "洮南市", "220882": "大安市", "222401": "延吉市", "222402": "图们市", "222403": "敦化市", "222404": "珲春市", "222405": "龙井市", "222406": "和龙市", "222424": "汪清县", "222426": "安图县", "230102": "道里区", "230103": "南岗区", "230104": "道外区", "230108": "平房区", "230109": "松北区", "230110": "香坊区", "230111": "呼兰区", "230112": "阿城区", "230113": "双城区", "230123": "依兰县", "230124": "方正县", "230125": "宾县", "230126": "巴彦县", "230127": "木兰县", "230128": "通河县", "230129": "延寿县", "230183": "尚志市", "230184": "五常市", "230202": "龙沙区", "230203": "建华区", "230204": "铁锋区", "230205": "昂昂溪区", "230206": "富拉尔基区", "230207": "碾子山区", "230208": "梅里斯达斡尔族区", "230221": "龙江县", "230223": "依安县", "230224": "泰来县", "230225": "甘南县", "230227": "富裕县", "230229": "克山县", "230230": "克东县", "230231": "拜泉县", "230281": "讷河市", "230302": "鸡冠区", "230303": "恒山区", "230304": "滴道区", "230305": "梨树区", "230306": "城子河区", "230307": "麻山区", "230321": "鸡东县", "230381": "虎林市", "230382": "密山市", "230402": "向阳区", "230403": "工农区", "230404": "南山区", "230405": "兴安区", "230406": "东山区", "230407": "兴山区", "230421": "萝北县", "230422": "绥滨县", "230502": "尖山区", "230503": "岭东区", "230505": "四方台区", "230506": "宝山区", "230521": "集贤县", "230522": "友谊县", "230523": "宝清县", "230524": "饶河县", "230602": "萨尔图区", "230603": "龙凤区", "230604": "让胡路区", "230605": "红岗区", "230606": "大同区", "230621": "肇州县", "230622": "肇源县", "230623": "林甸县", "230624": "杜尔伯特蒙古族自治县", "230717": "伊美区", "230718": "乌翠区", "230719": "友好区", "230722": "嘉荫县", "230723": "汤旺县", "230724": "丰林县", "230725": "大箐山县", "230726": "南岔县", "230751": "金林区", "230781": "铁力市", "230803": "向阳区", "230804": "前进区", "230805": "东风区", "230811": "郊区", "230822": "桦南县", "230826": "桦川县", "230828": "汤原县", "230881": "同江市", "230882": "富锦市", "230883": "抚远市", "230902": "新兴区", "230903": "桃山区", "230904": "茄子河区", "230921": "勃利县", "231002": "东安区", "231003": "阳明区", "231004": "爱民区", "231005": "西安区", "231025": "林口县", "231081": "绥芬河市", "231083": "海林市", "231084": "宁安市", "231085": "穆棱市", "231086": "东宁市", "231102": "爱辉区", "231123": "逊克县", "231124": "孙吴县", "231181": "北安市", "231182": "五大连池市", "231183": "嫩江市", "231202": "北林区", "231221": "望奎县", "231222": "兰西县", "231223": "青冈县", "231224": "庆安县", "231225": "明水县", "231226": "绥棱县", "231281": "安达市", "231282": "肇东市", "231283": "海伦市", "232701": "漠河市", "232721": "呼玛县", "232722": "塔河县", "310101": "黄浦区", "310104": "徐汇区", "310105": "长宁区", "310106": "静安区", "310107": "普陀区", "310109": "虹口区", "310110": "杨浦区", "310112": "闵行区", "310113": "宝山区", "310114": "嘉定区", "310115": "浦东新区", "310116": "金山区", "310117": "松江区", "310118": "青浦区", "310120": "奉贤区", "310151": "崇明区", "320102": "玄武区", "320104": "秦淮区", "320105": "建邺区", "320106": "鼓楼区", "320111": "浦口区", "320113": "栖霞区", "320114": "雨花台区", "320115": "江宁区", "320116": "六合区", "320117": "溧水区", "320118": "高淳区", "320205": "锡山区", "320206": "惠山区", "320211": "滨湖区", "320213": "梁溪区", "320214": "新吴区", "320281": "江阴市", "320282": "宜兴市", "320302": "鼓楼区", "320303": "云龙区", "320305": "贾汪区", "320311": "泉山区", "320312": "铜山区", "320321": "丰县", "320322": "沛县", "320324": "睢宁县", "320381": "新沂市", "320382": "邳州市", "320402": "天宁区", "320404": "钟楼区", "320411": "新北区", "320412": "武进区", "320413": "金坛区", "320481": "溧阳市", "320505": "虎丘区", "320506": "吴中区", "320507": "相城区", "320508": "姑苏区", "320509": "吴江区", "320581": "常熟市", "320582": "张家港市", "320583": "昆山市", "320585": "太仓市", "320602": "崇川区", "320611": "港闸区", "320612": "通州区", "320623": "如东县", "320681": "启东市", "320682": "如皋市", "320684": "海门市", "320685": "海安市", "320703": "连云区", "320706": "海州区", "320707": "赣榆区", "320722": "东海县", "320723": "灌云县", "320724": "灌南县", "320803": "淮安区", "320804": "淮阴区", "320812": "清江浦区", "320813": "洪泽区", "320826": "涟水县", "320830": "盱眙县", "320831": "金湖县", "320902": "亭湖区", "320903": "盐都区", "320904": "大丰区", "320921": "响水县", "320922": "滨海县", "320923": "阜宁县", "320924": "射阳县", "320925": "建湖县", "320981": "东台市", "321002": "广陵区", "321003": "邗江区", "321012": "江都区", "321023": "宝应县", "321081": "仪征市", "321084": "高邮市", "321102": "京口区", "321111": "润州区", "321112": "丹徒区", "321181": "丹阳市", "321182": "扬中市", "321183": "句容市", "321202": "海陵区", "321203": "高港区", "321204": "姜堰区", "321281": "兴化市", "321282": "靖江市", "321283": "泰兴市", "321302": "宿城区", "321311": "宿豫区", "321322": "沭阳县", "321323": "泗阳县", "321324": "泗洪县", "330102": "上城区", "330103": "下城区", "330104": "江干区", "330105": "拱墅区", "330106": "西湖区", "330108": "滨江区", "330109": "萧山区", "330110": "余杭区", "330111": "富阳区", "330112": "临安区", "330122": "桐庐县", "330127": "淳安县", "330182": "建德市", "330203": "海曙区", "330205": "江北区", "330206": "北仑区", "330211": "镇海区", "330212": "鄞州区", "330213": "奉化区", "330225": "象山县", "330226": "宁海县", "330281": "余姚市", "330282": "慈溪市", "330302": "鹿城区", "330303": "龙湾区", "330304": "瓯海区", "330305": "洞头区", "330324": "永嘉县", "330326": "平阳县", "330327": "苍南县", "330328": "文成县", "330329": "泰顺县", "330381": "瑞安市", "330382": "乐清市", "330383": "龙港市", "330402": "南湖区", "330411": "秀洲区", "330421": "嘉善县", "330424": "海盐县", "330481": "海宁市", "330482": "平湖市", "330483": "桐乡市", "330502": "吴兴区", "330503": "南浔区", "330521": "德清县", "330522": "长兴县", "330523": "安吉县", "330602": "越城区", "330603": "柯桥区", "330604": "上虞区", "330624": "新昌县", "330681": "诸暨市", "330683": "嵊州市", "330702": "婺城区", "330703": "金东区", "330723": "武义县", "330726": "浦江县", "330727": "磐安县", "330781": "兰溪市", "330782": "义乌市", "330783": "东阳市", "330784": "永康市", "330802": "柯城区", "330803": "衢江区", "330822": "常山县", "330824": "开化县", "330825": "龙游县", "330881": "江山市", "330902": "定海区", "330903": "普陀区", "330921": "岱山县", "330922": "嵊泗县", "331002": "椒江区", "331003": "黄岩区", "331004": "路桥区", "331022": "三门县", "331023": "天台县", "331024": "仙居县", "331081": "温岭市", "331082": "临海市", "331083": "玉环市", "331102": "莲都区", "331121": "青田县", "331122": "缙云县", "331123": "遂昌县", "331124": "松阳县", "331125": "云和县", "331126": "庆元县", "331127": "景宁畲族自治县", "331181": "龙泉市", "340102": "瑶海区", "340103": "庐阳区", "340104": "蜀山区", "340111": "包河区", "340121": "长丰县", "340122": "肥东县", "340123": "肥西县", "340124": "庐江县", "340181": "巢湖市", "340202": "镜湖区", "340207": "鸠江区", "340209": "弋江区", "340210": "湾沚区", "340211": "繁昌区", "340223": "南陵县", "340281": "无为市", "340302": "龙子湖区", "340303": "蚌山区", "340304": "禹会区", "340311": "淮上区", "340321": "怀远县", "340322": "五河县", "340323": "固镇县", "340402": "大通区", "340403": "田家庵区", "340404": "谢家集区", "340405": "八公山区", "340406": "潘集区", "340421": "凤台县", "340422": "寿县", "340503": "花山区", "340504": "雨山区", "340506": "博望区", "340521": "当涂县", "340522": "含山县", "340523": "和县", "340602": "杜集区", "340603": "相山区", "340604": "烈山区", "340621": "濉溪县", "340705": "铜官区", "340706": "义安区", "340711": "郊区", "340722": "枞阳县", "340802": "迎江区", "340803": "大观区", "340811": "宜秀区", "340822": "怀宁县", "340825": "太湖县", "340826": "宿松县", "340827": "望江县", "340828": "岳西县", "340881": "桐城市", "340882": "潜山市", "341002": "屯溪区", "341003": "黄山区", "341004": "徽州区", "341021": "歙县", "341022": "休宁县", "341023": "黟县", "341024": "祁门县", "341102": "琅琊区", "341103": "南谯区", "341122": "来安县", "341124": "全椒县", "341125": "定远县", "341126": "凤阳县", "341181": "天长市", "341182": "明光市", "341202": "颍州区", "341203": "颍东区", "341204": "颍泉区", "341221": "临泉县", "341222": "太和县", "341225": "阜南县", "341226": "颍上县", "341282": "界首市", "341302": "埇桥区", "341321": "砀山县", "341322": "萧县", "341323": "灵璧县", "341324": "泗县", "341502": "金安区", "341503": "裕安区", "341504": "叶集区", "341522": "霍邱县", "341523": "舒城县", "341524": "金寨县", "341525": "霍山县", "341602": "谯城区", "341621": "涡阳县", "341622": "蒙城县", "341623": "利辛县", "341702": "贵池区", "341721": "东至县", "341722": "石台县", "341723": "青阳县", "341802": "宣州区", "341821": "郎溪县", "341823": "泾县", "341824": "绩溪县", "341825": "旌德县", "341881": "宁国市", "341882": "广德市", "350102": "鼓楼区", "350103": "台江区", "350104": "仓山区", "350105": "马尾区", "350111": "晋安区", "350112": "长乐区", "350121": "闽侯县", "350122": "连江县", "350123": "罗源县", "350124": "闽清县", "350125": "永泰县", "350128": "平潭县", "350181": "福清市", "350203": "思明区", "350205": "海沧区", "350206": "湖里区", "350211": "集美区", "350212": "同安区", "350213": "翔安区", "350302": "城厢区", "350303": "涵江区", "350304": "荔城区", "350305": "秀屿区", "350322": "仙游县", "350402": "梅列区", "350403": "三元区", "350421": "明溪县", "350423": "清流县", "350424": "宁化县", "350425": "大田县", "350426": "尤溪县", "350427": "沙县", "350428": "将乐县", "350429": "泰宁县", "350430": "建宁县", "350481": "永安市", "350502": "鲤城区", "350503": "丰泽区", "350504": "洛江区", "350505": "泉港区", "350521": "惠安县", "350524": "安溪县", "350525": "永春县", "350526": "德化县", "350527": "金门县", "350581": "石狮市", "350582": "晋江市", "350583": "南安市", "350602": "芗城区", "350603": "龙文区", "350622": "云霄县", "350623": "漳浦县", "350624": "诏安县", "350625": "长泰县", "350626": "东山县", "350627": "南靖县", "350628": "平和县", "350629": "华安县", "350681": "龙海市", "350702": "延平区", "350703": "建阳区", "350721": "顺昌县", "350722": "浦城县", "350723": "光泽县", "350724": "松溪县", "350725": "政和县", "350781": "邵武市", "350782": "武夷山市", "350783": "建瓯市", "350802": "新罗区", "350803": "永定区", "350821": "长汀县", "350823": "上杭县", "350824": "武平县", "350825": "连城县", "350881": "漳平市", "350902": "蕉城区", "350921": "霞浦县", "350922": "古田县", "350923": "屏南县", "350924": "寿宁县", "350925": "周宁县", "350926": "柘荣县", "350981": "福安市", "350982": "福鼎市", "360102": "东湖区", "360103": "西湖区", "360104": "青云谱区", "360111": "青山湖区", "360112": "新建区", "360113": "红谷滩区", "360121": "南昌县", "360123": "安义县", "360124": "进贤县", "360202": "昌江区", "360203": "珠山区", "360222": "浮梁县", "360281": "乐平市", "360302": "安源区", "360313": "湘东区", "360321": "莲花县", "360322": "上栗县", "360323": "芦溪县", "360402": "濂溪区", "360403": "浔阳区", "360404": "柴桑区", "360423": "武宁县", "360424": "修水县", "360425": "永修县", "360426": "德安县", "360428": "都昌县", "360429": "湖口县", "360430": "彭泽县", "360481": "瑞昌市", "360482": "共青城市", "360483": "庐山市", "360502": "渝水区", "360521": "分宜县", "360602": "月湖区", "360603": "余江区", "360681": "贵溪市", "360702": "章贡区", "360703": "南康区", "360704": "赣县区", "360722": "信丰县", "360723": "大余县", "360724": "上犹县", "360725": "崇义县", "360726": "安远县", "360728": "定南县", "360729": "全南县", "360730": "宁都县", "360731": "于都县", "360732": "兴国县", "360733": "会昌县", "360734": "寻乌县", "360735": "石城县", "360781": "瑞金市", "360783": "龙南市", "360802": "吉州区", "360803": "青原区", "360821": "吉安县", "360822": "吉水县", "360823": "峡江县", "360824": "新干县", "360825": "永丰县", "360826": "泰和县", "360827": "遂川县", "360828": "万安县", "360829": "安福县", "360830": "永新县", "360881": "井冈山市", "360902": "袁州区", "360921": "奉新县", "360922": "万载县", "360923": "上高县", "360924": "宜丰县", "360925": "靖安县", "360926": "铜鼓县", "360981": "丰城市", "360982": "樟树市", "360983": "高安市", "361002": "临川区", "361003": "东乡区", "361021": "南城县", "361022": "黎川县", "361023": "南丰县", "361024": "崇仁县", "361025": "乐安县", "361026": "宜黄县", "361027": "金溪县", "361028": "资溪县", "361030": "广昌县", "361102": "信州区", "361103": "广丰区", "361104": "广信区", "361123": "玉山县", "361124": "铅山县", "361125": "横峰县", "361126": "弋阳县", "361127": "余干县", "361128": "鄱阳县", "361129": "万年县", "361130": "婺源县", "361181": "德兴市", "370102": "历下区", "370103": "市中区", "370104": "槐荫区", "370105": "天桥区", "370112": "历城区", "370113": "长清区", "370114": "章丘区", "370115": "济阳区", "370116": "莱芜区", "370117": "钢城区", "370124": "平阴县", "370126": "商河县", "370202": "市南区", "370203": "市北区", "370211": "黄岛区", "370212": "崂山区", "370213": "李沧区", "370214": "城阳区", "370215": "即墨区", "370281": "胶州市", "370283": "平度市", "370285": "莱西市", "370302": "淄川区", "370303": "张店区", "370304": "博山区", "370305": "临淄区", "370306": "周村区", "370321": "桓台县", "370322": "高青县", "370323": "沂源县", "370402": "市中区", "370403": "薛城区", "370404": "峄城区", "370405": "台儿庄区", "370406": "山亭区", "370481": "滕州市", "370502": "东营区", "370503": "河口区", "370505": "垦利区", "370522": "利津县", "370523": "广饶县", "370602": "芝罘区", "370611": "福山区", "370612": "牟平区", "370613": "莱山区", "370614": "蓬莱区", "370681": "龙口市", "370682": "莱阳市", "370683": "莱州市", "370685": "招远市", "370686": "栖霞市", "370687": "海阳市", "370702": "潍城区", "370703": "寒亭区", "370704": "坊子区", "370705": "奎文区", "370724": "临朐县", "370725": "昌乐县", "370781": "青州市", "370782": "诸城市", "370783": "寿光市", "370784": "安丘市", "370785": "高密市", "370786": "昌邑市", "370811": "任城区", "370812": "兖州区", "370826": "微山县", "370827": "鱼台县", "370828": "金乡县", "370829": "嘉祥县", "370830": "汶上县", "370831": "泗水县", "370832": "梁山县", "370881": "曲阜市", "370883": "邹城市", "370902": "泰山区", "370911": "岱岳区", "370921": "宁阳县", "370923": "东平县", "370982": "新泰市", "370983": "肥城市", "371002": "环翠区", "371003": "文登区", "371082": "荣成市", "371083": "乳山市", "371102": "东港区", "371103": "岚山区", "371121": "五莲县", "371122": "莒县", "371302": "兰山区", "371311": "罗庄区", "371312": "河东区", "371321": "沂南县", "371322": "郯城县", "371323": "沂水县", "371324": "兰陵县", "371325": "费县", "371326": "平邑县", "371327": "莒南县", "371328": "蒙阴县", "371329": "临沭县", "371402": "德城区", "371403": "陵城区", "371422": "宁津县", "371423": "庆云县", "371424": "临邑县", "371425": "齐河县", "371426": "平原县", "371427": "夏津县", "371428": "武城县", "371481": "乐陵市", "371482": "禹城市", "371502": "东昌府区", "371503": "茌平区", "371521": "阳谷县", "371522": "莘县", "371524": "东阿县", "371525": "冠县", "371526": "高唐县", "371581": "临清市", "371602": "滨城区", "371603": "沾化区", "371621": "惠民县", "371622": "阳信县", "371623": "无棣县", "371625": "博兴县", "371681": "邹平市", "371702": "牡丹区", "371703": "定陶区", "371721": "曹县", "371722": "单县", "371723": "成武县", "371724": "巨野县", "371725": "郓城县", "371726": "鄄城县", "371728": "东明县", "410102": "中原区", "410103": "二七区", "410104": "管城回族区", "410105": "金水区", "410106": "上街区", "410108": "惠济区", "410122": "中牟县", "410181": "巩义市", "410182": "荥阳市", "410183": "新密市", "410184": "新郑市", "410185": "登封市", "410202": "龙亭区", "410203": "顺河回族区", "410204": "鼓楼区", "410205": "禹王台区", "410212": "祥符区", "410221": "杞县", "410222": "通许县", "410223": "尉氏县", "410225": "兰考县", "410302": "老城区", "410303": "西工区", "410304": "瀍河回族区", "410305": "涧西区", "410306": "吉利区", "410311": "洛龙区", "410322": "孟津县", "410323": "新安县", "410324": "栾川县", "410325": "嵩县", "410326": "汝阳县", "410327": "宜阳县", "410328": "洛宁县", "410329": "伊川县", "410381": "偃师市", "410402": "新华区", "410403": "卫东区", "410404": "石龙区", "410411": "湛河区", "410421": "宝丰县", "410422": "叶县", "410423": "鲁山县", "410425": "郏县", "410481": "舞钢市", "410482": "汝州市", "410502": "文峰区", "410503": "北关区", "410505": "殷都区", "410506": "龙安区", "410522": "安阳县", "410523": "汤阴县", "410526": "滑县", "410527": "内黄县", "410581": "林州市", "410602": "鹤山区", "410603": "山城区", "410611": "淇滨区", "410621": "浚县", "410622": "淇县", "410702": "红旗区", "410703": "卫滨区", "410704": "凤泉区", "410711": "牧野区", "410721": "新乡县", "410724": "获嘉县", "410725": "原阳县", "410726": "延津县", "410727": "封丘县", "410781": "卫辉市", "410782": "辉县市", "410783": "长垣市", "410802": "解放区", "410803": "中站区", "410804": "马村区", "410811": "山阳区", "410821": "修武县", "410822": "博爱县", "410823": "武陟县", "410825": "温县", "410882": "沁阳市", "410883": "孟州市", "410902": "华龙区", "410922": "清丰县", "410923": "南乐县", "410926": "范县", "410927": "台前县", "410928": "濮阳县", "411002": "魏都区", "411003": "建安区", "411024": "鄢陵县", "411025": "襄城县", "411081": "禹州市", "411082": "长葛市", "411102": "源汇区", "411103": "郾城区", "411104": "召陵区", "411121": "舞阳县", "411122": "临颍县", "411202": "湖滨区", "411203": "陕州区", "411221": "渑池县", "411224": "卢氏县", "411281": "义马市", "411282": "灵宝市", "411302": "宛城区", "411303": "卧龙区", "411321": "南召县", "411322": "方城县", "411323": "西峡县", "411324": "镇平县", "411325": "内乡县", "411326": "淅川县", "411327": "社旗县", "411328": "唐河县", "411329": "新野县", "411330": "桐柏县", "411381": "邓州市", "411402": "梁园区", "411403": "睢阳区", "411421": "民权县", "411422": "睢县", "411423": "宁陵县", "411424": "柘城县", "411425": "虞城县", "411426": "夏邑县", "411481": "永城市", "411502": "浉河区", "411503": "平桥区", "411521": "罗山县", "411522": "光山县", "411523": "新县", "411524": "商城县", "411525": "固始县", "411526": "潢川县", "411527": "淮滨县", "411528": "息县", "411602": "川汇区", "411603": "淮阳区", "411621": "扶沟县", "411622": "西华县", "411623": "商水县", "411624": "沈丘县", "411625": "郸城县", "411627": "太康县", "411628": "鹿邑县", "411681": "项城市", "411702": "驿城区", "411721": "西平县", "411722": "上蔡县", "411723": "平舆县", "411724": "正阳县", "411725": "确山县", "411726": "泌阳县", "411727": "汝南县", "411728": "遂平县", "411729": "新蔡县", "411802": "沁园街道", "411821": "济水街道", "411822": "北海街道", "411823": "天坛街道", "411824": "玉泉街道", "411825": "克井镇", "411826": "五龙口镇", "411827": "轵城镇", "411828": "承留镇", "411829": "邵原镇", "411831": "坡头镇", "411832": "梨林镇", "411833": "大峪镇", "411834": "思礼镇", "411835": "王屋镇", "411836": "下冶镇", "420102": "江岸区", "420103": "江汉区", "420104": "硚口区", "420105": "汉阳区", "420106": "武昌区", "420107": "青山区", "420111": "洪山区", "420112": "东西湖区", "420113": "汉南区", "420114": "蔡甸区", "420115": "江夏区", "420116": "黄陂区", "420117": "新洲区", "420202": "黄石港区", "420203": "西塞山区", "420204": "下陆区", "420205": "铁山区", "420222": "阳新县", "420281": "大冶市", "420302": "茅箭区", "420303": "张湾区", "420304": "郧阳区", "420322": "郧西县", "420323": "竹山县", "420324": "竹溪县", "420325": "房县", "420381": "丹江口市", "420502": "西陵区", "420503": "伍家岗区", "420504": "点军区", "420505": "猇亭区", "420506": "夷陵区", "420525": "远安县", "420526": "兴山县", "420527": "秭归县", "420528": "长阳土家族自治县", "420529": "五峰土家族自治县", "420581": "宜都市", "420582": "当阳市", "420583": "枝江市", "420602": "襄城区", "420606": "樊城区", "420607": "襄州区", "420624": "南漳县", "420625": "谷城县", "420626": "保康县", "420682": "老河口市", "420683": "枣阳市", "420684": "宜城市", "420702": "梁子湖区", "420703": "华容区", "420704": "鄂城区", "420802": "东宝区", "420804": "掇刀区", "420822": "沙洋县", "420881": "钟祥市", "420882": "京山市", "420902": "孝南区", "420921": "孝昌县", "420922": "大悟县", "420923": "云梦县", "420981": "应城市", "420982": "安陆市", "420984": "汉川市", "421002": "沙市区", "421003": "荆州区", "421022": "公安县", "421023": "监利县", "421024": "江陵县", "421081": "石首市", "421083": "洪湖市", "421087": "松滋市", "421102": "黄州区", "421121": "团风县", "421122": "红安县", "421123": "罗田县", "421124": "英山县", "421125": "浠水县", "421126": "蕲春县", "421127": "黄梅县", "421181": "麻城市", "421182": "武穴市", "421202": "咸安区", "421221": "嘉鱼县", "421222": "通城县", "421223": "崇阳县", "421224": "通山县", "421281": "赤壁市", "421303": "曾都区", "421321": "随县", "421381": "广水市", "422801": "恩施市", "422802": "利川市", "422822": "建始县", "422823": "巴东县", "422825": "宣恩县", "422826": "咸丰县", "422827": "来凤县", "422828": "鹤峰县", "429004": "仙桃市", "429005": "潜江市", "429006": "天门市", "429021": "神农架林区", "430102": "芙蓉区", "430103": "天心区", "430104": "岳麓区", "430105": "开福区", "430111": "雨花区", "430112": "望城区", "430121": "长沙县", "430181": "浏阳市", "430182": "宁乡市", "430202": "荷塘区", "430203": "芦淞区", "430204": "石峰区", "430211": "天元区", "430212": "渌口区", "430223": "攸县", "430224": "茶陵县", "430225": "炎陵县", "430281": "醴陵市", "430302": "雨湖区", "430304": "岳塘区", "430321": "湘潭县", "430381": "湘乡市", "430382": "韶山市", "430405": "珠晖区", "430406": "雁峰区", "430407": "石鼓区", "430408": "蒸湘区", "430412": "南岳区", "430421": "衡阳县", "430422": "衡南县", "430423": "衡山县", "430424": "衡东县", "430426": "祁东县", "430481": "耒阳市", "430482": "常宁市", "430502": "双清区", "430503": "大祥区", "430511": "北塔区", "430522": "新邵县", "430523": "邵阳县", "430524": "隆回县", "430525": "洞口县", "430527": "绥宁县", "430528": "新宁县", "430529": "城步苗族自治县", "430581": "武冈市", "430582": "邵东市", "430602": "岳阳楼区", "430603": "云溪区", "430611": "君山区", "430621": "岳阳县", "430623": "华容县", "430624": "湘阴县", "430626": "平江县", "430681": "汨罗市", "430682": "临湘市", "430702": "武陵区", "430703": "鼎城区", "430721": "安乡县", "430722": "汉寿县", "430723": "澧县", "430724": "临澧县", "430725": "桃源县", "430726": "石门县", "430781": "津市市", "430802": "永定区", "430811": "武陵源区", "430821": "慈利县", "430822": "桑植县", "430902": "资阳区", "430903": "赫山区", "430921": "南县", "430922": "桃江县", "430923": "安化县", "430981": "沅江市", "431002": "北湖区", "431003": "苏仙区", "431021": "桂阳县", "431022": "宜章县", "431023": "永兴县", "431024": "嘉禾县", "431025": "临武县", "431026": "汝城县", "431027": "桂东县", "431028": "安仁县", "431081": "资兴市", "431102": "零陵区", "431103": "冷水滩区", "431121": "祁阳县", "431122": "东安县", "431123": "双牌县", "431124": "道县", "431125": "江永县", "431126": "宁远县", "431127": "蓝山县", "431128": "新田县", "431129": "江华瑶族自治县", "431202": "鹤城区", "431221": "中方县", "431222": "沅陵县", "431223": "辰溪县", "431224": "溆浦县", "431225": "会同县", "431226": "麻阳苗族自治县", "431227": "新晃侗族自治县", "431228": "芷江侗族自治县", "431229": "靖州苗族侗族自治县", "431230": "通道侗族自治县", "431281": "洪江市", "431302": "娄星区", "431321": "双峰县", "431322": "新化县", "431381": "冷水江市", "431382": "涟源市", "433101": "吉首市", "433122": "泸溪县", "433123": "凤凰县", "433124": "花垣县", "433125": "保靖县", "433126": "古丈县", "433127": "永顺县", "433130": "龙山县", "440103": "荔湾区", "440104": "越秀区", "440105": "海珠区", "440106": "天河区", "440111": "白云区", "440112": "黄埔区", "440113": "番禺区", "440114": "花都区", "440115": "南沙区", "440117": "从化区", "440118": "增城区", "440203": "武江区", "440204": "浈江区", "440205": "曲江区", "440222": "始兴县", "440224": "仁化县", "440229": "翁源县", "440232": "乳源瑶族自治县", "440233": "新丰县", "440281": "乐昌市", "440282": "南雄市", "440303": "罗湖区", "440304": "福田区", "440305": "南山区", "440306": "宝安区", "440307": "龙岗区", "440308": "盐田区", "440309": "龙华区", "440310": "坪山区", "440311": "光明区", "440402": "香洲区", "440403": "斗门区", "440404": "金湾区", "440507": "龙湖区", "440511": "金平区", "440512": "濠江区", "440513": "潮阳区", "440514": "潮南区", "440515": "澄海区", "440523": "南澳县", "440604": "禅城区", "440605": "南海区", "440606": "顺德区", "440607": "三水区", "440608": "高明区", "440703": "蓬江区", "440704": "江海区", "440705": "新会区", "440781": "台山市", "440783": "开平市", "440784": "鹤山市", "440785": "恩平市", "440802": "赤坎区", "440803": "霞山区", "440804": "坡头区", "440811": "麻章区", "440823": "遂溪县", "440825": "徐闻县", "440881": "廉江市", "440882": "雷州市", "440883": "吴川市", "440902": "茂南区", "440904": "电白区", "440981": "高州市", "440982": "化州市", "440983": "信宜市", "441202": "端州区", "441203": "鼎湖区", "441204": "高要区", "441223": "广宁县", "441224": "怀集县", "441225": "封开县", "441226": "德庆县", "441284": "四会市", "441302": "惠城区", "441303": "惠阳区", "441322": "博罗县", "441323": "惠东县", "441324": "龙门县", "441402": "梅江区", "441403": "梅县区", "441422": "大埔县", "441423": "丰顺县", "441424": "五华县", "441426": "平远县", "441427": "蕉岭县", "441481": "兴宁市", "441502": "城区", "441521": "海丰县", "441523": "陆河县", "441581": "陆丰市", "441602": "源城区", "441621": "紫金县", "441622": "龙川县", "441623": "连平县", "441624": "和平县", "441625": "东源县", "441702": "江城区", "441704": "阳东区", "441721": "阳西县", "441781": "阳春市", "441802": "清城区", "441803": "清新区", "441821": "佛冈县", "441823": "阳山县", "441825": "连山壮族瑶族自治县", "441826": "连南瑶族自治县", "441881": "英德市", "441882": "连州市", "445102": "湘桥区", "445103": "潮安区", "445122": "饶平县", "445202": "榕城区", "445203": "揭东区", "445222": "揭西县", "445224": "惠来县", "445281": "普宁市", "445302": "云城区", "445303": "云安区", "445321": "新兴县", "445322": "郁南县", "445381": "罗定市", "450102": "兴宁区", "450103": "青秀区", "450105": "江南区", "450107": "西乡塘区", "450108": "良庆区", "450109": "邕宁区", "450110": "武鸣区", "450123": "隆安县", "450124": "马山县", "450125": "上林县", "450126": "宾阳县", "450127": "横县", "450202": "城中区", "450203": "鱼峰区", "450204": "柳南区", "450205": "柳北区", "450206": "柳江区", "450222": "柳城县", "450223": "鹿寨县", "450224": "融安县", "450225": "融水苗族自治县", "450226": "三江侗族自治县", "450302": "秀峰区", "450303": "叠彩区", "450304": "象山区", "450305": "七星区", "450311": "雁山区", "450312": "临桂区", "450321": "阳朔县", "450323": "灵川县", "450324": "全州县", "450325": "兴安县", "450326": "永福县", "450327": "灌阳县", "450328": "龙胜各族自治县", "450329": "资源县", "450330": "平乐县", "450332": "恭城瑶族自治县", "450381": "荔浦市", "450403": "万秀区", "450405": "长洲区", "450406": "龙圩区", "450421": "苍梧县", "450422": "藤县", "450423": "蒙山县", "450481": "岑溪市", "450502": "海城区", "450503": "银海区", "450512": "铁山港区", "450521": "合浦县", "450602": "港口区", "450603": "防城区", "450621": "上思县", "450681": "东兴市", "450702": "钦南区", "450703": "钦北区", "450721": "灵山县", "450722": "浦北县", "450802": "港北区", "450803": "港南区", "450804": "覃塘区", "450821": "平南县", "450881": "桂平市", "450902": "玉州区", "450903": "福绵区", "450921": "容县", "450922": "陆川县", "450923": "博白县", "450924": "兴业县", "450981": "北流市", "451002": "右江区", "451003": "田阳区", "451022": "田东县", "451024": "德保县", "451026": "那坡县", "451027": "凌云县", "451028": "乐业县", "451029": "田林县", "451030": "西林县", "451031": "隆林各族自治县", "451081": "靖西市", "451082": "平果市", "451102": "八步区", "451103": "平桂区", "451121": "昭平县", "451122": "钟山县", "451123": "富川瑶族自治县", "451202": "金城江区", "451203": "宜州区", "451221": "南丹县", "451222": "天峨县", "451223": "凤山县", "451224": "东兰县", "451225": "罗城仫佬族自治县", "451226": "环江毛南族自治县", "451227": "巴马瑶族自治县", "451228": "都安瑶族自治县", "451229": "大化瑶族自治县", "451302": "兴宾区", "451321": "忻城县", "451322": "象州县", "451323": "武宣县", "451324": "金秀瑶族自治县", "451381": "合山市", "451402": "江州区", "451421": "扶绥县", "451422": "宁明县", "451423": "龙州县", "451424": "大新县", "451425": "天等县", "451481": "凭祥市", "460105": "秀英区", "460106": "龙华区", "460107": "琼山区", "460108": "美兰区", "460202": "海棠区", "460203": "吉阳区", "460204": "天涯区", "460205": "崖州区", "460321": "西沙群岛", "460322": "南沙群岛", "460323": "中沙群岛的岛礁及其海域", "469001": "五指山市", "469002": "琼海市", "469005": "文昌市", "469006": "万宁市", "469007": "东方市", "469021": "定安县", "469022": "屯昌县", "469023": "澄迈县", "469024": "临高县", "469025": "白沙黎族自治县", "469026": "昌江黎族自治县", "469027": "乐东黎族自治县", "469028": "陵水黎族自治县", "469029": "保亭黎族苗族自治县", "469030": "琼中黎族苗族自治县", "500101": "万州区", "500102": "涪陵区", "500103": "渝中区", "500104": "大渡口区", "500105": "江北区", "500106": "沙坪坝区", "500107": "九龙坡区", "500108": "南岸区", "500109": "北碚区", "500110": "綦江区", "500111": "大足区", "500112": "渝北区", "500113": "巴南区", "500114": "黔江区", "500115": "长寿区", "500116": "江津区", "500117": "合川区", "500118": "永川区", "500119": "南川区", "500120": "璧山区", "500151": "铜梁区", "500152": "潼南区", "500153": "荣昌区", "500154": "开州区", "500155": "梁平区", "500156": "武隆区", "500229": "城口县", "500230": "丰都县", "500231": "垫江县", "500233": "忠县", "500235": "云阳县", "500236": "奉节县", "500237": "巫山县", "500238": "巫溪县", "500240": "石柱土家族自治县", "500241": "秀山土家族苗族自治县", "500242": "酉阳土家族苗族自治县", "500243": "彭水苗族土家族自治县", "510104": "锦江区", "510105": "青羊区", "510106": "金牛区", "510107": "武侯区", "510108": "成华区", "510112": "龙泉驿区", "510113": "青白江区", "510114": "新都区", "510115": "温江区", "510116": "双流区", "510117": "郫都区", "510118": "新津区", "510121": "金堂县", "510129": "大邑县", "510131": "蒲江县", "510181": "都江堰市", "510182": "彭州市", "510183": "邛崃市", "510184": "崇州市", "510185": "简阳市", "510302": "自流井区", "510303": "贡井区", "510304": "大安区", "510311": "沿滩区", "510321": "荣县", "510322": "富顺县", "510402": "东区", "510403": "西区", "510411": "仁和区", "510421": "米易县", "510422": "盐边县", "510502": "江阳区", "510503": "纳溪区", "510504": "龙马潭区", "510521": "泸县", "510522": "合江县", "510524": "叙永县", "510525": "古蔺县", "510603": "旌阳区", "510604": "罗江区", "510623": "中江县", "510681": "广汉市", "510682": "什邡市", "510683": "绵竹市", "510703": "涪城区", "510704": "游仙区", "510705": "安州区", "510722": "三台县", "510723": "盐亭县", "510725": "梓潼县", "510726": "北川羌族自治县", "510727": "平武县", "510781": "江油市", "510802": "利州区", "510811": "昭化区", "510812": "朝天区", "510821": "旺苍县", "510822": "青川县", "510823": "剑阁县", "510824": "苍溪县", "510903": "船山区", "510904": "安居区", "510921": "蓬溪县", "510923": "大英县", "510981": "射洪市", "511002": "市中区", "511011": "东兴区", "511024": "威远县", "511025": "资中县", "511083": "隆昌市", "511102": "市中区", "511111": "沙湾区", "511112": "五通桥区", "511113": "金口河区", "511123": "犍为县", "511124": "井研县", "511126": "夹江县", "511129": "沐川县", "511132": "峨边彝族自治县", "511133": "马边彝族自治县", "511181": "峨眉山市", "511302": "顺庆区", "511303": "高坪区", "511304": "嘉陵区", "511321": "南部县", "511322": "营山县", "511323": "蓬安县", "511324": "仪陇县", "511325": "西充县", "511381": "阆中市", "511402": "东坡区", "511403": "彭山区", "511421": "仁寿县", "511423": "洪雅县", "511424": "丹棱县", "511425": "青神县", "511502": "翠屏区", "511503": "南溪区", "511504": "叙州区", "511523": "江安县", "511524": "长宁县", "511525": "高县", "511526": "珙县", "511527": "筠连县", "511528": "兴文县", "511529": "屏山县", "511602": "广安区", "511603": "前锋区", "511621": "岳池县", "511622": "武胜县", "511623": "邻水县", "511681": "华蓥市", "511702": "通川区", "511703": "达川区", "511722": "宣汉县", "511723": "开江县", "511724": "大竹县", "511725": "渠县", "511781": "万源市", "511802": "雨城区", "511803": "名山区", "511822": "荥经县", "511823": "汉源县", "511824": "石棉县", "511825": "天全县", "511826": "芦山县", "511827": "宝兴县", "511902": "巴州区", "511903": "恩阳区", "511921": "通江县", "511922": "南江县", "511923": "平昌县", "512002": "雁江区", "512021": "安岳县", "512022": "乐至县", "513201": "马尔康市", "513221": "汶川县", "513222": "理县", "513223": "茂县", "513224": "松潘县", "513225": "九寨沟县", "513226": "金川县", "513227": "小金县", "513228": "黑水县", "513230": "壤塘县", "513231": "阿坝县", "513232": "若尔盖县", "513233": "红原县", "513301": "康定市", "513322": "泸定县", "513323": "丹巴县", "513324": "九龙县", "513325": "雅江县", "513326": "道孚县", "513327": "炉霍县", "513328": "甘孜县", "513329": "新龙县", "513330": "德格县", "513331": "白玉县", "513332": "石渠县", "513333": "色达县", "513334": "理塘县", "513335": "巴塘县", "513336": "乡城县", "513337": "稻城县", "513338": "得荣县", "513401": "西昌市", "513422": "木里藏族自治县", "513423": "盐源县", "513424": "德昌县", "513425": "会理县", "513426": "会东县", "513427": "宁南县", "513428": "普格县", "513429": "布拖县", "513430": "金阳县", "513431": "昭觉县", "513432": "喜德县", "513433": "冕宁县", "513434": "越西县", "513435": "甘洛县", "513436": "美姑县", "513437": "雷波县", "520102": "南明区", "520103": "云岩区", "520111": "花溪区", "520112": "乌当区", "520113": "白云区", "520115": "观山湖区", "520121": "开阳县", "520122": "息烽县", "520123": "修文县", "520181": "清镇市", "520201": "钟山区", "520203": "六枝特区", "520221": "水城县", "520281": "盘州市", "520302": "红花岗区", "520303": "汇川区", "520304": "播州区", "520322": "桐梓县", "520323": "绥阳县", "520324": "正安县", "520325": "道真仡佬族苗族自治县", "520326": "务川仡佬族苗族自治县", "520327": "凤冈县", "520328": "湄潭县", "520329": "余庆县", "520330": "习水县", "520381": "赤水市", "520382": "仁怀市", "520402": "西秀区", "520403": "平坝区", "520422": "普定县", "520423": "镇宁布依族苗族自治县", "520424": "关岭布依族苗族自治县", "520425": "紫云苗族布依族自治县", "520502": "七星关区", "520521": "大方县", "520522": "黔西县", "520523": "金沙县", "520524": "织金县", "520525": "纳雍县", "520526": "威宁彝族回族苗族自治县", "520527": "赫章县", "520602": "碧江区", "520603": "万山区", "520621": "江口县", "520622": "玉屏侗族自治县", "520623": "石阡县", "520624": "思南县", "520625": "印江土家族苗族自治县", "520626": "德江县", "520627": "沿河土家族自治县", "520628": "松桃苗族自治县", "522301": "兴义市", "522302": "兴仁市", "522323": "普安县", "522324": "晴隆县", "522325": "贞丰县", "522326": "望谟县", "522327": "册亨县", "522328": "安龙县", "522601": "凯里市", "522622": "黄平县", "522623": "施秉县", "522624": "三穗县", "522625": "镇远县", "522626": "岑巩县", "522627": "天柱县", "522628": "锦屏县", "522629": "剑河县", "522630": "台江县", "522631": "黎平县", "522632": "榕江县", "522633": "从江县", "522634": "雷山县", "522635": "麻江县", "522636": "丹寨县", "522701": "都匀市", "522702": "福泉市", "522722": "荔波县", "522723": "贵定县", "522725": "瓮安县", "522726": "独山县", "522727": "平塘县", "522728": "罗甸县", "522729": "长顺县", "522730": "龙里县", "522731": "惠水县", "522732": "三都水族自治县", "530102": "五华区", "530103": "盘龙区", "530111": "官渡区", "530112": "西山区", "530113": "东川区", "530114": "呈贡区", "530115": "晋宁区", "530124": "富民县", "530125": "宜良县", "530126": "石林彝族自治县", "530127": "嵩明县", "530128": "禄劝彝族苗族自治县", "530129": "寻甸回族彝族自治县", "530181": "安宁市", "530302": "麒麟区", "530303": "沾益区", "530304": "马龙区", "530322": "陆良县", "530323": "师宗县", "530324": "罗平县", "530325": "富源县", "530326": "会泽县", "530381": "宣威市", "530402": "红塔区", "530403": "江川区", "530423": "通海县", "530424": "华宁县", "530425": "易门县", "530426": "峨山彝族自治县", "530427": "新平彝族傣族自治县", "530428": "元江哈尼族彝族傣族自治县", "530481": "澄江市", "530502": "隆阳区", "530521": "施甸县", "530523": "龙陵县", "530524": "昌宁县", "530581": "腾冲市", "530602": "昭阳区", "530621": "鲁甸县", "530622": "巧家县", "530623": "盐津县", "530624": "大关县", "530625": "永善县", "530626": "绥江县", "530627": "镇雄县", "530628": "彝良县", "530629": "威信县", "530681": "水富市", "530702": "古城区", "530721": "玉龙纳西族自治县", "530722": "永胜县", "530723": "华坪县", "530724": "宁蒗彝族自治县", "530802": "思茅区", "530821": "宁洱哈尼族彝族自治县", "530822": "墨江哈尼族自治县", "530823": "景东彝族自治县", "530824": "景谷傣族彝族自治县", "530825": "镇沅彝族哈尼族拉祜族自治县", "530826": "江城哈尼族彝族自治县", "530827": "孟连傣族拉祜族佤族自治县", "530828": "澜沧拉祜族自治县", "530829": "西盟佤族自治县", "530902": "临翔区", "530921": "凤庆县", "530922": "云县", "530923": "永德县", "530924": "镇康县", "530925": "双江拉祜族佤族布朗族傣族自治县", "530926": "耿马傣族佤族自治县", "530927": "沧源佤族自治县", "532301": "楚雄市", "532322": "双柏县", "532323": "牟定县", "532324": "南华县", "532325": "姚安县", "532326": "大姚县", "532327": "永仁县", "532328": "元谋县", "532329": "武定县", "532331": "禄丰县", "532501": "个旧市", "532502": "开远市", "532503": "蒙自市", "532504": "弥勒市", "532523": "屏边苗族自治县", "532524": "建水县", "532525": "石屏县", "532527": "泸西县", "532528": "元阳县", "532529": "红河县", "532530": "金平苗族瑶族傣族自治县", "532531": "绿春县", "532532": "河口瑶族自治县", "532601": "文山市", "532622": "砚山县", "532623": "西畴县", "532624": "麻栗坡县", "532625": "马关县", "532626": "丘北县", "532627": "广南县", "532628": "富宁县", "532801": "景洪市", "532822": "勐海县", "532823": "勐腊县", "532901": "大理市", "532922": "漾濞彝族自治县", "532923": "祥云县", "532924": "宾川县", "532925": "弥渡县", "532926": "南涧彝族自治县", "532927": "巍山彝族回族自治县", "532928": "永平县", "532929": "云龙县", "532930": "洱源县", "532931": "剑川县", "532932": "鹤庆县", "533102": "瑞丽市", "533103": "芒市", "533122": "梁河县", "533123": "盈江县", "533124": "陇川县", "533301": "泸水市", "533323": "福贡县", "533324": "贡山独龙族怒族自治县", "533325": "兰坪白族普米族自治县", "533401": "香格里拉市", "533422": "德钦县", "533423": "维西傈僳族自治县", "540102": "城关区", "540103": "堆龙德庆区", "540104": "达孜区", "540121": "林周县", "540122": "当雄县", "540123": "尼木县", "540124": "曲水县", "540127": "墨竹工卡县", "540202": "桑珠孜区", "540221": "南木林县", "540222": "江孜县", "540223": "定日县", "540224": "萨迦县", "540225": "拉孜县", "540226": "昂仁县", "540227": "谢通门县", "540228": "白朗县", "540229": "仁布县", "540230": "康马县", "540231": "定结县", "540232": "仲巴县", "540233": "亚东县", "540234": "吉隆县", "540235": "聂拉木县", "540236": "萨嘎县", "540237": "岗巴县", "540302": "卡若区", "540321": "江达县", "540322": "贡觉县", "540323": "类乌齐县", "540324": "丁青县", "540325": "察雅县", "540326": "八宿县", "540327": "左贡县", "540328": "芒康县", "540329": "洛隆县", "540330": "边坝县", "540402": "巴宜区", "540421": "工布江达县", "540422": "米林县", "540423": "墨脱县", "540424": "波密县", "540425": "察隅县", "540426": "朗县", "540502": "乃东区", "540521": "扎囊县", "540522": "贡嘎县", "540523": "桑日县", "540524": "琼结县", "540525": "曲松县", "540526": "措美县", "540527": "洛扎县", "540528": "加查县", "540529": "隆子县", "540530": "错那县", "540531": "浪卡子县", "540602": "色尼区", "540621": "嘉黎县", "540622": "比如县", "540623": "聂荣县", "540624": "安多县", "540625": "申扎县", "540626": "索县", "540627": "班戈县", "540628": "巴青县", "540629": "尼玛县", "540630": "双湖县", "542521": "普兰县", "542522": "札达县", "542523": "噶尔县", "542524": "日土县", "542525": "革吉县", "542526": "改则县", "542527": "措勤县", "610102": "新城区", "610103": "碑林区", "610104": "莲湖区", "610111": "灞桥区", "610112": "未央区", "610113": "雁塔区", "610114": "阎良区", "610115": "临潼区", "610116": "长安区", "610117": "高陵区", "610118": "鄠邑区", "610122": "蓝田县", "610124": "周至县", "610202": "王益区", "610203": "印台区", "610204": "耀州区", "610222": "宜君县", "610302": "渭滨区", "610303": "金台区", "610304": "陈仓区", "610322": "凤翔县", "610323": "岐山县", "610324": "扶风县", "610326": "眉县", "610327": "陇县", "610328": "千阳县", "610329": "麟游县", "610330": "凤县", "610331": "太白县", "610402": "秦都区", "610403": "杨陵区", "610404": "渭城区", "610422": "三原县", "610423": "泾阳县", "610424": "乾县", "610425": "礼泉县", "610426": "永寿县", "610428": "长武县", "610429": "旬邑县", "610430": "淳化县", "610431": "武功县", "610481": "兴平市", "610482": "彬州市", "610502": "临渭区", "610503": "华州区", "610522": "潼关县", "610523": "大荔县", "610524": "合阳县", "610525": "澄城县", "610526": "蒲城县", "610527": "白水县", "610528": "富平县", "610581": "韩城市", "610582": "华阴市", "610602": "宝塔区", "610603": "安塞区", "610621": "延长县", "610622": "延川县", "610625": "志丹县", "610626": "吴起县", "610627": "甘泉县", "610628": "富县", "610629": "洛川县", "610630": "宜川县", "610631": "黄龙县", "610632": "黄陵县", "610681": "子长市", "610702": "汉台区", "610703": "南郑区", "610722": "城固县", "610723": "洋县", "610724": "西乡县", "610725": "勉县", "610726": "宁强县", "610727": "略阳县", "610728": "镇巴县", "610729": "留坝县", "610730": "佛坪县", "610802": "榆阳区", "610803": "横山区", "610822": "府谷县", "610824": "靖边县", "610825": "定边县", "610826": "绥德县", "610827": "米脂县", "610828": "佳县", "610829": "吴堡县", "610830": "清涧县", "610831": "子洲县", "610881": "神木市", "610902": "汉滨区", "610921": "汉阴县", "610922": "石泉县", "610923": "宁陕县", "610924": "紫阳县", "610925": "岚皋县", "610926": "平利县", "610927": "镇坪县", "610928": "旬阳县", "610929": "白河县", "611002": "商州区", "611021": "洛南县", "611022": "丹凤县", "611023": "商南县", "611024": "山阳县", "611025": "镇安县", "611026": "柞水县", "620102": "城关区", "620103": "七里河区", "620104": "西固区", "620105": "安宁区", "620111": "红古区", "620121": "永登县", "620122": "皋兰县", "620123": "榆中县", "620302": "金川区", "620321": "永昌县", "620402": "白银区", "620403": "平川区", "620421": "靖远县", "620422": "会宁县", "620423": "景泰县", "620502": "秦州区", "620503": "麦积区", "620521": "清水县", "620522": "秦安县", "620523": "甘谷县", "620524": "武山县", "620525": "张家川回族自治县", "620602": "凉州区", "620621": "民勤县", "620622": "古浪县", "620623": "天祝藏族自治县", "620702": "甘州区", "620721": "肃南裕固族自治县", "620722": "民乐县", "620723": "临泽县", "620724": "高台县", "620725": "山丹县", "620802": "崆峒区", "620821": "泾川县", "620822": "灵台县", "620823": "崇信县", "620825": "庄浪县", "620826": "静宁县", "620881": "华亭市", "620902": "肃州区", "620921": "金塔县", "620922": "瓜州县", "620923": "肃北蒙古族自治县", "620924": "阿克塞哈萨克族自治县", "620981": "玉门市", "620982": "敦煌市", "621002": "西峰区", "621021": "庆城县", "621022": "环县", "621023": "华池县", "621024": "合水县", "621025": "正宁县", "621026": "宁县", "621027": "镇原县", "621102": "安定区", "621121": "通渭县", "621122": "陇西县", "621123": "渭源县", "621124": "临洮县", "621125": "漳县", "621126": "岷县", "621202": "武都区", "621221": "成县", "621222": "文县", "621223": "宕昌县", "621224": "康县", "621225": "西和县", "621226": "礼县", "621227": "徽县", "621228": "两当县", "622901": "临夏市", "622921": "临夏县", "622922": "康乐县", "622923": "永靖县", "622924": "广河县", "622925": "和政县", "622926": "东乡族自治县", "622927": "积石山保安族东乡族撒拉族自治县", "623001": "合作市", "623021": "临潭县", "623022": "卓尼县", "623023": "舟曲县", "623024": "迭部县", "623025": "玛曲县", "623026": "碌曲县", "623027": "夏河县", "630102": "城东区", "630103": "城中区", "630104": "城西区", "630105": "城北区", "630106": "湟中区", "630121": "大通回族土族自治县", "630123": "湟源县", "630202": "乐都区", "630203": "平安区", "630222": "民和回族土族自治县", "630223": "互助土族自治县", "630224": "化隆回族自治县", "630225": "循化撒拉族自治县", "632221": "门源回族自治县", "632222": "祁连县", "632223": "海晏县", "632224": "刚察县", "632301": "同仁市", "632322": "尖扎县", "632323": "泽库县", "632324": "河南蒙古族自治县", "632521": "共和县", "632522": "同德县", "632523": "贵德县", "632524": "兴海县", "632525": "贵南县", "632621": "玛沁县", "632622": "班玛县", "632623": "甘德县", "632624": "达日县", "632625": "久治县", "632626": "玛多县", "632701": "玉树市", "632722": "杂多县", "632723": "称多县", "632724": "治多县", "632725": "囊谦县", "632726": "曲麻莱县", "632801": "格尔木市", "632802": "德令哈市", "632803": "茫崖市", "632821": "乌兰县", "632822": "都兰县", "632823": "天峻县", "640104": "兴庆区", "640105": "西夏区", "640106": "金凤区", "640121": "永宁县", "640122": "贺兰县", "640181": "灵武市", "640202": "大武口区", "640205": "惠农区", "640221": "平罗县", "640302": "利通区", "640303": "红寺堡区", "640323": "盐池县", "640324": "同心县", "640381": "青铜峡市", "640402": "原州区", "640422": "西吉县", "640423": "隆德县", "640424": "泾源县", "640425": "彭阳县", "640502": "沙坡头区", "640521": "中宁县", "640522": "海原县", "650102": "天山区", "650103": "沙依巴克区", "650104": "新市区", "650105": "水磨沟区", "650106": "头屯河区", "650107": "达坂城区", "650109": "米东区", "650121": "乌鲁木齐县", "650202": "独山子区", "650203": "克拉玛依区", "650204": "白碱滩区", "650205": "乌尔禾区", "650402": "高昌区", "650421": "鄯善县", "650422": "托克逊县", "650502": "伊州区", "650521": "巴里坤哈萨克自治县", "650522": "伊吾县", "652301": "昌吉市", "652302": "阜康市", "652323": "呼图壁县", "652324": "玛纳斯县", "652325": "奇台县", "652327": "吉木萨尔县", "652328": "木垒哈萨克自治县", "652701": "博乐市", "652702": "阿拉山口市", "652722": "精河县", "652723": "温泉县", "652801": "库尔勒市", "652822": "轮台县", "652823": "尉犁县", "652824": "若羌县", "652825": "且末县", "652826": "焉耆回族自治县", "652827": "和静县", "652828": "和硕县", "652829": "博湖县", "652901": "阿克苏市", "652902": "库车市", "652922": "温宿县", "652924": "沙雅县", "652925": "新和县", "652926": "拜城县", "652927": "乌什县", "652928": "阿瓦提县", "652929": "柯坪县", "653001": "阿图什市", "653022": "阿克陶县", "653023": "阿合奇县", "653024": "乌恰县", "653101": "喀什市", "653121": "疏附县", "653122": "疏勒县", "653123": "英吉沙县", "653124": "泽普县", "653125": "莎车县", "653126": "叶城县", "653127": "麦盖提县", "653128": "岳普湖县", "653129": "伽师县", "653130": "巴楚县", "653131": "塔什库尔干塔吉克自治县", "653201": "和田市", "653221": "和田县", "653222": "墨玉县", "653223": "皮山县", "653224": "洛浦县", "653225": "策勒县", "653226": "于田县", "653227": "民丰县", "654002": "伊宁市", "654003": "奎屯市", "654004": "霍尔果斯市", "654021": "伊宁县", "654022": "察布查尔锡伯自治县", "654023": "霍城县", "654024": "巩留县", "654025": "新源县", "654026": "昭苏县", "654027": "特克斯县", "654028": "尼勒克县", "654201": "塔城市", "654202": "乌苏市", "654221": "额敏县", "654223": "沙湾县", "654224": "托里县", "654225": "裕民县", "654226": "和布克赛尔蒙古自治县", "654301": "阿勒泰市", "654321": "布尔津县", "654322": "富蕴县", "654323": "福海县", "654324": "哈巴河县", "654325": "青河县", "654326": "吉木乃县", "659001": "石河子市", "659002": "阿拉尔市", "659003": "图木舒克市", "659004": "五家渠市", "659005": "北屯市", "659006": "铁门关市", "659007": "双河市", "659008": "可克达拉市", "659009": "昆玉市", "659010": "胡杨河市", "714403": "芳苑乡", "714632": "芬园乡", "714701": "福兴乡", "714777": "和美镇", "715055": "花坛乡", "715172": "鹿港镇", "715490": "埤头乡", "715602": "埔心乡", "715745": "埔盐乡", "715795": "伸港乡", "715960": "社头乡", "716105": "田尾乡", "716202": "田中镇", "716341": "线西乡", "716421": "溪湖镇", "716750": "秀水乡", "716874": "溪州乡", "717107": "永靖乡", "717238": "员林市", "717447": "竹塘乡", "717532": "八里区", "717645": "板桥区", "717902": "贡寮区", "717955": "金山区", "718036": "林口区", "718195": "芦洲区", "718266": "坪林区", "718327": "平溪区", "718375": "瑞芳区", "718490": "三重区", "718786": "三峡区", "718879": "三芝区", "718980": "深坑区", "719023": "石碇区", "719115": "石门区", "719155": "双溪区", "719243": "树林区", "719382": "泰山区", "719498": "淡水区", "719731": "土城区", "719869": "白沙乡", "719890": "湖西乡", "719916": "马公市", "720065": "七美乡", "720090": "望安乡", "720102": "西屿乡", "720119": "三地门乡", "720142": "狮子乡", "720163": "泰武乡", "720186": "万丹乡", "720415": "万峦乡", "720480": "雾臺乡", "720502": "新埤乡", "720553": "新园乡", "720649": "盐埔乡", "720748": "竹田乡", "720835": "长治乡", "720975": "潮州镇", "721293": "车城乡", "721335": "春日乡", "721344": "东港镇", "721490": "枋寮乡", "721617": "枋山乡", "721638": "高树乡", "721805": "恆春镇", "721930": "佳冬乡", "722025": "梧栖区", "722212": "乌日区", "722402": "新社区", "722474": "西屯区", "722699": "北屯区", "722879": "中区", "722923": "大肚区", "723021": "大甲区", "723211": "大里区", "723592": "大雅区", "723756": "大安区", "723802": "东势区", "723966": "东区", "724148": "丰原区", "724424": "和平区", "724504": "后里区", "724656": "龙井区", "724797": "南屯区", "724872": "北区", "725199": "清水区", "725489": "佳里区", "725588": "将军区", "725620": "六甲区", "725679": "柳营区", "725795": "龙崎区", "725841": "麻豆区", "725927": "南化区", "725938": "楠西区", "725973": "北区", "726300": "七股区", "726338": "仁德区", "726539": "善化区", "726675": "山上区", "726691": "南区", "727041": "中西区", "727251": "下营区", "727339": "西港区", "727375": "新化区", "727425": "新市区", "727529": "新营区", "727731": "北投区", "727897": "大同区", "728070": "大安区", "728116": "南港区", "728220": "内湖区", "728340": "士林区", "728550": "松山区", "728713": "万华区", "728920": "文山区", "729073": "信义区", "729277": "中山区", "729583": "中正区", "729929": "卑南乡", "729994": "长滨乡", "730033": "成功镇", "730107": "池上乡", "730196": "达仁乡", "730219": "大武乡", "730268": "东河乡", "730308": "关山镇", "730384": "海端乡", "730409": "金峰乡", "730416": "兰屿乡", "730423": "绿岛乡", "730438": "鹿野乡", "730510": "太麻里乡", "730565": "臺东市", "730832": "延平乡", "730844": "八德区", "731212": "大溪区", "731471": "大园区", "731767": "復兴区", "731835": "观音区", "732079": "龟山区", "732469": "龙潭区", "732800": "芦竹区", "733144": "平镇区", "733179": "桃园区", "733390": "新屋区", "733537": "杨梅区", "733876": "中坜区", "734180": "大同乡", "734246": "钓鱼臺", "734248": "冬山乡", "734579": "礁溪乡", "734681": "罗东镇", "734842": "南澳乡", "734865": "三星乡", "735104": "苏澳镇", "735319": "头城镇", "735419": "五结乡", "735620": "宜兰市", "735851": "员山乡", "735970": "壮围乡", "736052": "草屯镇", "736305": "国姓乡", "736356": "集集镇", "736449": "鹿谷乡", "736522": "名间乡", "736622": "南投市", "736887": "埔里镇", "737266": "仁爱乡", "737337": "水里乡", "737496": "信义乡", "737533": "鱼池乡", "737591": "中寮乡", "737625": "竹山镇", "737857": "东沙群岛", "737859": "南沙群岛", "737862": "头屋乡", "737894": "西湖乡", "737948": "苑里镇", "738050": "造桥乡", "738158": "竹南镇", "738454": "卓兰镇", "738528": "大湖乡", "738619": "公馆乡", "738695": "后龙镇", "738882": "苗栗市", "739250": "南庄乡", "739302": "三湾乡", "739369": "三义乡", "739419": "狮潭乡", "739465": "泰安乡", "739487": "铜锣乡", "739564": "通霄镇", "739642": "头份市", "739958": "东区", "740140": "西区", "740511": "阿里山乡", "740536": "布袋镇", "740625": "大林镇", "740746": "大埔乡", "740792": "东石乡", "740845": "番路乡", "740943": "六脚乡", "740975": "鹿草乡", "741010": "梅山乡", "741137": "民雄乡", "741312": "朴子市", "741451": "水上乡", "741550": "太保市", "741646": "溪口乡", "741688": "新港乡", "741750": "义竹乡", "741785": "中埔乡", "741936": "竹崎乡", "742127": "东区", "742309": "北区", "742637": "峨眉乡", "742674": "关西镇", "742797": "横山乡", "742852": "湖口乡", "743201": "尖石乡", "743246": "芎林乡", "743298": "五峰乡", "743319": "新丰乡", "743414": "新埔镇", "743527": "竹北市", "743565": "竹东镇", "743725": "宝山乡", "743888": "北埔乡", "743939": "卓溪乡", "743956": "丰滨乡", "743993": "凤林镇", "744128": "富里乡", "744185": "光復乡", "744246": "花莲市", "744625": "吉安乡", "745050": "瑞穗乡", "745196": "寿丰乡", "745354": "万荣乡", "745363": "新城乡", "745486": "秀林乡", "745532": "玉里镇", "745675": "阿莲区", "745715": "大寮区", "746083": "大社区", "746199": "大树区", "746294": "凤山区", "746624": "冈山区", "746906": "鼓山区", "747053": "湖内区", "747108": "甲仙区", "747150": "苓雅区", "747342": "林园区", "747481": "六龟区", "747536": "路竹区", "747643": "茂林区", "747647": "美浓区", "747764": "弥陀区", "747894": "那玛夏区", "747902": "楠梓区", "748258": "内门区", "748344": "鸟松区", "748554": "安乐区", "748581": "暖暖区", "748599": "七堵区", "748670": "仁爱区", "748716": "信义区", "748920": "中山区", "749226": "中正区", "749572": "金城镇", "749647": "金湖镇", "749752": "金宁乡", "749810": "金沙镇", "749894": "烈屿乡", "749928": "乌坵乡", "749931": "北竿乡", "749938": "东引乡", "749941": "莒光乡", "749947": "南竿乡", "749958": "褒忠乡", "749991": "北港镇", "750170": "莿桐乡", "750218": "大埤乡", "750291": "东势乡", "750363": "斗六市", "750795": "斗南镇", "751009": "二崙乡", "751071": "古坑乡", "751147": "虎尾镇", "751400": "口湖乡", "751493": "林内乡", "751555": "崙背乡", "751674": "麦寮乡", "751764": "水林乡", "751832": "四湖乡", "751907": "臺西乡", "751956": "土库镇", "752034": "西螺镇", "752149": "元长乡", "752151": "中西区", "752152": "东区", "752153": "九龙城区", "752154": "观塘区", "752155": "南区", "752156": "深水埗区", "752157": "湾仔区", "752158": "黄大仙区", "752159": "油尖旺区", "752160": "离岛区", "752161": "葵青区", "752162": "北区", "752163": "西贡区", "752164": "沙田区", "752165": "屯门区", "752166": "大埔区", "752167": "荃湾区", "752168": "元朗区", "752170": "澳门半岛", "752171": "凼仔", "752172": "路凼城", "752173": "路环", "752177": "龙华区", "441900003": "东城街道办事处", "441900004": "南城街道办事处", "441900005": "万江街道办事处", "441900006": "莞城街道办事处", "441900101": "石碣镇", "441900102": "石龙镇", "441900103": "茶山镇", "441900104": "石排镇", "441900105": "企石镇", "441900106": "横沥镇", "441900107": "桥头镇", "441900108": "谢岗镇", "441900109": "东坑镇", "441900110": "常平镇", "441900111": "寮步镇", "441900112": "樟木头镇", "441900113": "大朗镇", "441900114": "黄江镇", "441900115": "清溪镇", "441900116": "塘厦镇", "441900117": "凤岗镇", "441900118": "大岭山镇", "441900119": "长安镇", "441900121": "虎门镇", "441900122": "厚街镇", "441900123": "沙田镇", "441900124": "道滘镇", "441900125": "洪梅镇", "441900126": "麻涌镇", "441900127": "望牛墩镇", "441900128": "中堂镇", "441900129": "高埗镇", "441900401": "松山湖管委会", "441900402": "虎门港管委会", "441900403": "东莞生态园", "442000001": "石岐区街道办事处", "442000002": "东区街道办事处", "442000003": "火炬开发区街道办事处", "442000004": "西区街道办事处", "442000005": "南区街道办事处", "442000006": "五桂山街道办事处", "442000100": "小榄镇", "442000101": "黄圃镇", "442000102": "民众镇", "442000103": "东凤镇", "442000104": "东升镇", "442000105": "古镇镇", "442000106": "沙溪镇", "442000107": "坦洲镇", "442000108": "港口镇", "442000109": "三角镇", "442000110": "横栏镇", "442000111": "南头镇", "442000112": "阜沙镇", "442000113": "南朗镇", "442000114": "三乡镇", "442000115": "板芙镇", "442000116": "大涌镇", "442000117": "神湾镇", "460400100": "那大镇", "460400101": "和庆镇", "460400102": "南丰镇", "460400103": "大成镇", "460400104": "雅星镇", "460400105": "兰洋镇", "460400106": "光村镇", "460400107": "木棠镇", "460400108": "海头镇", "460400109": "峨蔓镇", "460400110": "三都镇", "460400111": "王五镇", "460400112": "白马井镇", "460400113": "中和镇", "460400114": "排浦镇", "460400115": "东成镇", "460400116": "新州镇", "460400400": "国营西培农场", "460400404": "国营西联农场", "460400405": "国营蓝洋农场", "460400407": "国营八一农场", "460400499": "洋浦经济开发区", "460400500": "华南热作学院" } + }; + + Class.prototype.config = { + elem: '', + data: { + province: {code:0,name:'--请选择省--'}, + city: {code:0,name:'--请选择市--'}, + district: {code:0,name:'--请选择区--'}, + }, + change: function(result){} + }; + + Class.prototype.index = 0; + Class.prototype.render = function () { + let that = this, options = that.config; + options.elem = $(options.elem); + options.bindAction = $(options.bindAction); + that.events(); + }; + + Class.prototype.events = function () { + let that = this, options = that.config, index; + let provinceFilter = 'province-' + gouguarea._id; + let cityFilter = 'city-' + gouguarea._id; + let districtFilter = 'district-' + gouguarea._id; + + let provinceEl = options.elem.find('.province-select'); + let cityEl = options.elem.find('.city-select'); + let districtEl = options.elem.find('.district-select'); + + //filter + if(provinceEl.attr('lay-filter')){ + provinceFilter = provinceEl.attr('lay-filter'); + } + if(cityEl.attr('lay-filter')){ + cityFilter = cityEl.attr('lay-filter'); + } + if(districtEl.attr('lay-filter')){ + districtFilter = districtEl.attr('lay-filter'); + } + provinceEl.attr('lay-filter', provinceFilter); + cityEl.attr('lay-filter', cityFilter); + districtEl.attr('lay-filter', districtFilter); + + //获取默认值 + if(provinceEl.data('value')){ + options.data.province.code = provinceEl.data('value'); + options.data.province.name = getName('province', provinceEl.data('value')); + } + if(cityEl.data('value')){ + options.data.city.code = cityEl.data('value'); + options.data.city.name = getName('city', cityEl.data('value')); + } + if(districtEl.data('value')){ + options.data.district.code = districtEl.data('value'); + options.data.district.name = getName('district', districtEl.data('value')); + } + provinceEl.attr('lay-filter', provinceFilter); + cityEl.attr('lay-filter', cityFilter); + districtEl.attr('lay-filter', districtFilter); + + //监听结果 + form.on('select('+provinceFilter+')', function(data){ + options.data.province.code = data.value; + options.data.province.name = getName('province', data.value); + renderCity(data.value); + options.change(options.data); + }); + form.on('select('+cityFilter+')', function(data){ + options.data.city.code = data.value; + options.data.city.name = getName('city', data.value); + renderDistrict(data.value); + options.change(options.data); + }); + form.on('select('+districtFilter+')', function(data){ + options.data.district.code = data.value; + options.data.district.name = getName('district', data.value); + options.change(options.data); + }); + + //查找province + function renderProvince(){ + let tpl = ''; + let provinceList = getList("province"); + let currentCode = ''; + let currentName = ''; + provinceList.forEach(function(_item){ + if (!currentCode){ + currentCode = _item.code; + currentName = _item.name; + } + if(_item.code == options.data.province.code){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + options.data.province.code = currentCode; + options.data.province.name = currentName; + provinceEl.html(tpl); + provinceEl.val(options.data.province.code); + form.render('select'); + renderCity(currentCode); + } + + //查找city + function renderCity(provinceCode){ + let tpl = ''; + let cityList = getList('city', provinceCode.slice(0, 2)); + let currentCode = ''; + let currentName = ''; + cityList.forEach(function(_item){ + if (!currentCode){ + currentCode = _item.code; + currentName = _item.name; + } + if(_item.code == options.data.city.code){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + options.data.city.code = currentCode; + options.data.city.name = currentName; + cityEl.html(tpl); + cityEl.val(options.data.city.code); + form.render('select'); + renderDistrict(currentCode); + } + + //查找district + function renderDistrict(cityCode){ + let tpl = ''; + let districtList = getList('district', cityCode.slice(0, 4)); + let currentCode = ''; + let currentName = ''; + districtList.forEach(function(_item){ + if (!currentCode){ + currentCode = _item.code; + currentName = _item.name; + } + if(_item.code == options.data.district.code){ + currentCode = _item.code; + currentName = _item.name; + } + tpl += ''; + }); + options.data.district.code = currentCode; + options.data.district.name = currentName; + districtEl.html(tpl); + districtEl.val(options.data.district.code); + form.render('select'); + } + + function getList(type, code) { + let result = []; + if (type !== 'province' && !code) { + return result; + } + let list = areaList[type + "_list"] || {}; + result = Object.keys(list).map(function (code) { + return { + code: code, + name: list[code] + }; + }); + if (code) { + if (code[0] === '9' && type === 'city') { + code = '9'; + } + result = result.filter(function (item) { + return item.code.indexOf(code) === 0; + }); + } + return result; + } + + function getCode(type, name){ + let code = ''; + let list = areaList[type + "_list"] || {}; + layui.each(list, function(_code, _name){ + if(_name === name){ + code = _code; + } + }); + return code; + } + + function getName(type, code){ + let list = areaList[type + "_list"] || {}; + return list[code]; + } + renderProvince(); + }; + + gouguarea.render = function (options) { + let inst = new Class(options); + gouguarea._id++; + return thisArea.call(inst); + }; + exports('areaSelect', gouguarea); + }); \ No newline at end of file diff --git a/public/static/assets/gougu/module/excel.js b/public/static/assets/gougu/module/excel.js new file mode 100644 index 0000000..9038f77 --- /dev/null +++ b/public/static/assets/gougu/module/excel.js @@ -0,0 +1,35 @@ +layui.define([], function (exports) { + var MOD_NAME = 'excel'; + var modFile = layui.cache.modules['excel']; + var modPath = modFile.substr(0, modFile.lastIndexOf('.')); + var settings = { + name: '表格' + }; + var excel = { + init: function (tableId, options) { + loadScript(); + var opts = $.extend({}, settings, options); + $('#'+tableId).table2excel({ + name: opts.name, + filename: opts.name + new Date().getTime() + ".xls", + exclude: ".noExl", + exclude_img: false, + exclude_links: false, + exclude_inputs: false, + preserveColors:true + }); + } + } + function loadScript() { + if (typeof table2excel == 'undefined') { + $.ajax({ //获取插件 + url: modPath + '/table2excel.js' , + dataType: 'script', + cache: true, + async: false + }); + } + } + loadScript(); + exports(MOD_NAME, excel); +}); diff --git a/public/static/assets/gougu/module/excel/table2excel.js b/public/static/assets/gougu/module/excel/table2excel.js new file mode 100644 index 0000000..58197d4 --- /dev/null +++ b/public/static/assets/gougu/module/excel/table2excel.js @@ -0,0 +1,276 @@ +/* + * jQuery table2excel - v1.1.2 + * jQuery plugin to export an .xls file in browser from an HTML table + * https://github.com/rainabba/jquery-table2excel + * + * Made by rainabba + * Under MIT License + */ +(function ($, window, document, undefined) { + var pluginName = "table2excel", + defaults = { + exclude: ".noExl", + name: "Table2Excel", + filename: "table2excel", + fileext: ".xls", + exclude_img: true, + exclude_links: true, + exclude_inputs: true, + preserveColors: true, + subtotal: 0,//"合计"行所在的行号(不包括标题行),0表示没有合计行... + width: 50,//表格宽度百分比,默认100% + trHeight:32,//表格行高,默认32px + thBackgroundColor:"#eeeeee"//TH背景色 + }; + //插件配置 + function Plugin(element, options) { + this.element = element; + this.settings = $.extend({}, defaults, options); + this._defaults = defaults; + this._name = pluginName; + this.init(); + } + Plugin.prototype = { + init: function () { + var e = this; + var w = getWidth(e.settings);//导出EXCEL表格的宽度,默认100% + var utf8Heading = ""; + e.template = { + head: "" + utf8Heading + "", + table: { + head: " ",//
              的边框&宽度 + tail: "
              " + }, + foot: "" + }; + e.tableRows = []; + + //读取原始表 + var rowNumber = 0;//行号 + $(e.element).each(function (i, o) { + var tempRows = "";//table的html + $(o).find("tr").not(e.settings.exclude).each(function (i, p) { + //的样式 + var trStyles = "height:"+e.settings.trHeight+"px;";//整行样式 + //开始创建一行表格 + tempRows += "";//内容居中:align='center' + + //读取原始的"; //空格! + } else { + tempRows += " 0) { + tempRows += " rowspan='" + rc.rows + "' ";//跨行 + } + if (rc.cols > 0) { + tempRows += " colspan='" + rc.cols + "' ";//跨列 + } + if (thStyles) { + tempRows += " style='" + thStyles + "'";//样式 + } + tempRows += ">" + $(q).html() + "";//内容 + } + }); + + //读取原始
              表头行(表头必须是!表头如果是的话则会当做普通数据行处理...) + $(p).find("th").not(e.settings.exclude).each(function (i, q) { + //的样式: + var thStyles = "background-color: "+e.settings.thBackgroundColor+";"; + var rc = { + rows: $(this).attr("rowspan"), + cols: $(this).attr("colspan"), + flag: $(q).find(e.settings.exclude) + }; + if (rc.flag.length > 0) { + tempRows += "
              的"; //空格! + } else { + tempRows += ""; + } + }); + tempRows += "";//生成一行结束 + rowNumber++;//行号+1 + }); + // exclude img tags + if (e.settings.exclude_img) { + tempRows = exclude_img(tempRows); + } + // exclude link tags + if (e.settings.exclude_links) { + tempRows = exclude_links(tempRows); + } + // exclude input tags + if (e.settings.exclude_inputs) { + tempRows = exclude_inputs(tempRows); + } + e.tableRows.push(tempRows); + }); + e.tableToExcel(e.tableRows, e.settings.name, e.settings.sheetName); + }, + tableToExcel: function (table, name, sheetName) { + var e = this, fullTemplate = "", i, link, a; + e.format = function (s, c) { + return s.replace(/{(\w+)}/g, function (m, p) { + return c[p]; + }); + }; + sheetName = typeof sheetName === "undefined" ? "Sheet" : sheetName; + e.ctx = { + worksheet: name || "Worksheet", + table: table, + sheetName: sheetName + }; + fullTemplate = e.template.head; + if ($.isArray(table)) { + Object.keys(table).forEach(function (i) { + //fullTemplate += e.template.sheet.head + "{worksheet" + i + "}" + e.template.sheet.tail; + fullTemplate += e.template.sheet.head + sheetName + i + e.template.sheet.tail; + }); + } + fullTemplate += e.template.mid; + if ($.isArray(table)) { + Object.keys(table).forEach(function (i) { + fullTemplate += e.template.table.head + "{table" + i + "}" + e.template.table.tail; + }); + } + fullTemplate += e.template.foot; + for (i in table) { + e.ctx["table" + i] = table[i]; + } + delete e.ctx.table; + var isIE = navigator.appVersion.indexOf("MSIE 10") !== -1 || (navigator.userAgent.indexOf("Trident") !== -1 && navigator.userAgent.indexOf("rv:11") !== -1); // this works with IE10 and IE11 both :) + //if (typeof msie !== "undefined" && msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // this works ONLY with IE 11!!! + if (isIE) { + if (typeof Blob !== "undefined") { + //use blobs if we can + fullTemplate = e.format(fullTemplate, e.ctx); // with this, works with IE + fullTemplate = [fullTemplate]; + //convert to array + var blob1 = new Blob(fullTemplate, { type: "text/html" }); + window.navigator.msSaveBlob(blob1, getFileName(e.settings)); + } else { + //otherwise use the iframe and save + //requires a blank iframe on page called txtArea1 + txtArea1.document.open("text/html", "replace"); + txtArea1.document.write(e.format(fullTemplate, e.ctx)); + txtArea1.document.close(); + txtArea1.focus(); + sa = txtArea1.document.execCommand("SaveAs", true, getFileName(e.settings)); + } + + } else { + var blob = new Blob([e.format(fullTemplate, e.ctx)], { type: "application/vnd.ms-excel" }); + window.URL = window.URL || window.webkitURL; + link = window.URL.createObjectURL(blob); + a = document.createElement("a"); + a.download = getFileName(e.settings); + a.href = link; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + } + return true; + } + }; + //获取excel文件名 + function getFileName(settings) { + return (settings.filename ? settings.filename : "table2excel"); + } + //获取"合计"行所在的行号(不包括标题行) + function getSubtotal(settings) { + return (settings.subtotal ? settings.subtotal : 0);//默认值0 + } + //导出Excel的表格宽度百分比的值(不含%号),默认100% + function getWidth(settings) { + return (settings.width ? settings.width : 100); + } + // Removes all img tags + function exclude_img(string) { + var _patt = /(\s+alt\s*=\s*"([^"]*)"|\s+alt\s*=\s*'([^']*)')/i; + return string.replace(/]*>/gi, function myFunction(x) { + var res = _patt.exec(x); + if (res !== null && res.length >= 2) { + return res[2]; + } else { + return ""; + } + }); + } + // Removes all link tags + function exclude_links(string) { + return string.replace(/]*>|<\/a>/gi, ""); + } + // Removes input params + function exclude_inputs(string) { + var _patt = /(\s+value\s*=\s*"([^"]*)"|\s+value\s*=\s*'([^']*)')/i; + return string.replace(/]*>|<\/input>/gi, function myFunction(x) { + var res = _patt.exec(x); + if (res !== null && res.length >= 2) { + return res[2]; + } else { + return ""; + } + }); + } + $.fn[pluginName] = function (options) { + var e = this; + e.each(function () { + if (!$.data(e, "plugin_" + pluginName)) { + $.data(e, "plugin_" + pluginName, new Plugin(this, options)); + } + }); + // chain jQuery functions + return e; + }; +})(jQuery, window, document); \ No newline at end of file diff --git a/public/static/assets/gougu/module/formSelects.css b/public/static/assets/gougu/module/formSelects.css new file mode 100644 index 0000000..dc3547c --- /dev/null +++ b/public/static/assets/gougu/module/formSelects.css @@ -0,0 +1,174 @@ +/* formSelects多选css */ +select[xm-select]{display: none !important;} +.xm-select-parent * {margin: 0;padding: 0;font-family: "Helvetica Neue", Helvetica, "PingFang SC", 微软雅黑, Tahoma, Arial, sans-serif; box-sizing: initial;} +.xm-select-parent {text-align: left;} +.xm-select-parent select {display: none;} +.xm-select-parent .xm-select-title {position: relative;min-height: 36px;} +.xm-select-parent .xm-input {cursor: pointer;border-radius: 2px;border-width: 1px;border-style: solid;border-color: #E6E6E6;display: block;width: 100%;box-sizing: border-box;background-color: #FFF;height: 36px;line-height: 1.3;padding-left: 10px;outline: 0} +.xm-select-parent .xm-select-sj {display: inline-block;width: 0;height: 0;border-style: dashed;border-color: transparent;overflow: hidden;position: absolute;right: 10px;top: 50%;margin-top: -3px;cursor: pointer;border-width: 6px;border-top-color: #C2C2C2;border-top-style: solid;transition: all .3s;-webkit-transition: all .3s} +.xm-select-parent .xm-form-selected .xm-select-sj {margin-top: -9px;transform: rotate(180deg)} +.xm-select-parent .xm-form-select dl {display: none;position: absolute;left: 0;top: 42px;padding: 5px 0;z-index: 999;min-width: 100%;border: 1px solid #d2d2d2;max-height: 300px;overflow-y: auto;background-color: #fff;border-radius: 2px;box-shadow: 0 2px 4px rgba(0, 0, 0, .12);box-sizing: border-box;animation-fill-mode: both;-webkit-animation-name: layui-upbit;animation-name: layui-upbit;-webkit-animation-duration: .3s;animation-duration: .3s;-webkit-animation-fill-mode: both;animation-fill-mode: both} +@-webkit-keyframes layui-upbit { + from {-webkit-transform: translate3d(0, 30px, 0);opacity: .3} + to {-webkit-transform: translate3d(0, 0, 0);opacity: 1} +} +@keyframes layui-upbit { + from {transform: translate3d(0, 30px, 0);opacity: .3} + to {transform: translate3d(0, 0, 0);opacity: 1} +} +.xm-select-parent .xm-form-selected dl {display: block} +.xm-select-parent .xm-form-select dl dd,.xm-select-parent .xm-form-select dl dt {padding: 0 10px;line-height: 30px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis} +.xm-select-parent .xm-form-select dl dd {cursor: pointer;height: 30px;} +.xm-select-parent .xm-form-select dl dd:hover {background-color: #f2f2f2} +.xm-select-parent .xm-form-select dl dt {font-size: 12px;color: #999} +.layui-select-disabled .xm-dis-disabled {border-color: #eee!important} +.xm-select-parent .xm-form-select dl .xm-select-tips {padding-left: 10px!important;color: #999;font-size: 14px} +.xm-unselect {-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none} + +.xm-form-checkbox {position: relative;display: block;vertical-align: middle;cursor: pointer;font-size: 0;-webkit-transition: .1s linear;transition: .1s linear;box-sizing: border-box;height: auto!important;line-height: normal!important;border: none!important;margin-right: 0;padding-right: 0;background: 0 0;} +.xm-form-checkbox > i {color: #FFF; font-size: 14px; width: 14px; height: 14px; position: absolute; top: 7px; border: 1px solid #5FB878; border-radius: 2px; z-index: 2;} +.xm-form-checkbox:hover > i {border-color: #5FB878;} +.xm-form-checkbox > span{display: block;position: relative;padding: 0 15px 0 30px;height: 100%;font-size: 14px;border-radius: 2px 0 0 2px;background-color: #d2d2d2;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;background: 0 0;color: #666;line-height: 30px;} + +.xm-select-parent dl{width: 100%;} +.xm-select-parent dl dd{position: relative;} +.xm-select-parent dl dd > i:not(.icon-sousuo){position: absolute; right: 10px; top: 2px; color: #AAAAAA;} +.xm-select-parent dl dd.xm-select-this div i {border: none; color: #009688; font-size: 18px;} +.xm-select-parent dl dd.xm-select-this div i:after{content: '\e613';} +.xm-select-parent dl dd.xm-dis-disabled div i {border-color: #C2C2C2;} +.xm-select-parent dl dd.xm-dis-disabled.xm-select-this div i {color: #C2C2C2;} +.xm-select-radio div.xm-form-checkbox > i {border-radius: 20px;} +.xm-select-parent dl.xm-select-radio dd.xm-select-this div i:after{content: '\e62b';} + +.xm-dis-disabled,.xm-dis-disabled:hover {cursor: not-allowed!important} +.xm-form-select dl dd.xm-dis-disabled {background-color: #fff!important} +.xm-form-select dl dd.xm-dis-disabled span {color: #C2C2C2} +.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes {border-color: #C2C2C2} +.xm-select-parent {position: relative;-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none} +.xm-select-parent .xm-select {line-height: normal;height: auto;padding: 4px 10px 1px 10px;overflow: hidden;min-height: 36px;left: 0;z-index: 99;position: absolute;background: 0 0;padding-right: 20px} +.xm-select-parent .xm-select:hover {border-color: #C0C4CC} +.xm-select-parent .xm-select .xm-select-label {display: inline-block;margin: 0;vertical-align: middle} +.xm-select-parent .xm-select-title div.xm-select-label>span {position: relative;padding: 2px 5px;background-color: #009688;border-radius: 2px;color: #FFF;display: inline-block;line-height: 18px;height: 18px;margin: 2px 5px 2px 0;cursor: initial;user-select: none;font-size: 14px;padding-right: 25px;-webkit-user-select: none;} +.xm-select-parent .xm-select-title div.xm-select-label>span i {position: absolute; margin-left: 8px; font-size: 12px; cursor: pointer; line-height: 20px;} +.xm-select-parent .xm-select .xm-select-input {border: none;height: 28px;background-color: transparent;padding: 0;vertical-align: middle;display: inline-block;width: 50px} +.xm-select-parent .xm-select--suffix input {border: none} +.xm-form-selected .xm-select,.xm-form-selected .xm-select:hover {border-color: #009688!important} +.xm-select--suffix+div {position: absolute;top: 0;left: 0;bottom: 0;right: 0} +.xm-select-dis .xm-select--suffix+div {z-index: 100;cursor: no-drop!important;opacity: .2;background-color: #FFF;} +.xm-select-disabled,.xm-select-disabled:hover {color: #d2d2d2!important;cursor: not-allowed!important;background-color: #fff} +.xm-select-none {display: none;margin: 5px 0;text-align: center;} +.xm-select-none:hover {background-color: #FFF!important} +.xm-select-empty {display: block} +.xm-span-hide {display: none!important;} +.layui-form-pane .xm-select,.layui-form-pane .xm-select:hover {border: none!important;top: 0px} +.layui-form-pane .xm-select-title {border: 1px solid #e6e6e6!important} +.xm-select-hide {display: none !important;} +div[xm-hg] .xm-select-label{white-space: nowrap; overflow: hidden; position: absolute; right: 30px; left: 0; padding-left: 10px;} + +/* 颜色相关 */ +div[xm-select-skin] .xm-select-title div.xm-select-label>span {border: 1px solid #009688} +div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover {opacity: .8;filter: alpha(opacity=80);cursor: pointer} +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span {background-color: #F0F2F5;color: #909399;border: 1px solid #F0F2F5} +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i {color: #C0C4CC} +div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i:before {content: '\e60b'; font-size: 14px; margin-left: -3px;} +div[xm-select-skin=default] dl dd:not(.xm-dis-disabled) i {border-color: #5FB878} +div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #5FB878} +div[xm-select-skin=default].xm-form-selected .xm-select,div[xm-select-skin=default].xm-form-selected .xm-select:hover {border-color: #C0C4CC!important} +div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span {background-color: #009688;color: #FFF;border: 1px solid #009688} +div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i {background-color: #009688; color: #FFF} +div[xm-select-skin=primary] dl dd:not(.xm-dis-disabled) i {border-color: #009688} +div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #009688} +div[xm-select-skin=primary].xm-form-selected .xm-select,div[xm-select-skin=primary].xm-form-selected .xm-select:hover {border-color: #009688!important} +div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span {background-color: #1E9FFF;color: #FFF;border: 1px solid #1E9FFF} +div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i {background-color: #1E9FFF;color: #FFF} +div[xm-select-skin=normal] dl dd:not(.xm-dis-disabled) i {border-color: #1E9FFF} +div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #1E9FFF} +div[xm-select-skin=normal].xm-form-selected .xm-select,div[xm-select-skin=normal].xm-form-selected .xm-select:hover {border-color: #1E9FFF!important} +div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span {background-color: #FFB800;color: #FFF;border: 1px solid #FFB800} +div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i {background-color: #FFB800;color: #FFF} +div[xm-select-skin=warm] dl dd:not(.xm-dis-disabled) i {border-color: #FFB800} +div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #FFB800} +div[xm-select-skin=warm].xm-form-selected .xm-select,div[xm-select-skin=warm].xm-form-selected .xm-select:hover {border-color: #FFB800!important} +div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span {background-color: #FF5722;color: #FFF;border: 1px solid #FF5722} +div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i {background-color: #FF5722;color: #FFF} +div[xm-select-skin=danger] dl dd:not(.xm-dis-disabled) i {border-color: #FF5722} +div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i {color: #FF5722} +div[xm-select-skin=danger].xm-form-selected .xm-select,div[xm-select-skin=danger].xm-form-selected .xm-select:hover {border-color: #FF5722!important} + + +/* 多选联动 */ +.xm-select-parent .layui-form-danger+.xm-select-title .xm-select {border-color: #FF5722 !important;} +.xm-select-linkage li {padding: 10px 0px;cursor: pointer;} +.xm-select-linkage li span {padding-left: 20px;padding-right: 30px;display: inline-block;height: 20px;overflow: hidden;text-overflow: ellipsis;} +.xm-select-linkage li.xm-select-this span {border-left: 5px solid #009688;color: #009688;padding-left: 15px;} +.xm-select-linkage-group {position: absolute;left: 0;top: 0;right: 0;bottom: 0;overflow-x: hidden;overflow-y: auto;} +.xm-select-linkage-group li:hover {border-left: 1px solid #009688;} +.xm-select-linkage-group li:hover span {padding-left: 19px;} +.xm-select-linkage-group li.xm-select-this:hover span {padding-left: 15px;border-left-width: 4px;} +.xm-select-linkage-group:nth-child(4n+1){background-color: #EFEFEF; left: 0;} +.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active{background-color: #F5F5F5;} +.xm-select-linkage-group:nth-child(4n+2){background-color: #F5F5F5; left: 100px;} +.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FAFAFA;} +.xm-select-linkage-group:nth-child(4n+3){background-color: #FAFAFA; left: 200px;} +.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FFFFFF;} +.xm-select-linkage-group:nth-child(4n+4){background-color: #FFFFFF; left: 300px;} +.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active{background-color: #EFEFEF;} +.xm-select-linkage li{list-style: none;} +.xm-select-linkage-hide {display: none;} +.xm-select-linkage-show {display: block;} + +div[xm-select-skin='default'] .xm-select-linkage li.xm-select-this span {border-left-color: #5FB878;color: #5FB878;} +div[xm-select-skin='default'] .xm-select-linkage-group li:hover {border-left-color: #5FB878;} +div[xm-select-skin='primary'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;} +div[xm-select-skin='primary'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;} +div[xm-select-skin='normal'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;} +div[xm-select-skin='normal'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;} +div[xm-select-skin='warm'] .xm-select-linkage li.xm-select-this span {border-left-color: #FFB800;color: #FFB800;} +div[xm-select-skin='warm'] .xm-select-linkage-group li:hover {border-left-color: #FFB800;} +div[xm-select-skin='danger'] .xm-select-linkage li.xm-select-this span {border-left-color: #FF5722;color: #FF5722;} +div[xm-select-skin='danger'] .xm-select-linkage-group li:hover {border-left-color: #FF5722;} + + +/* 快捷操作 */ +.xm-select-tips[style]:hover{background-color: #FFF!important;} +.xm-select-parent dd > .xm-cz{position: absolute; top: 0px; right: 10px;} +.xm-select-parent dd > .xm-cz-group{margin-right: 30px; border-right: 2px solid #ddd; height: 16px; margin-top: 8px; line-height: 16px; overflow: hidden;} +.xm-select-parent dd > .xm-cz-group .xm-cz{display: inline-block; margin-right: 30px;} +.xm-select-parent dd > .xm-cz-group .xm-cz i{margin-right: 5px;} +.xm-select-parent dd > .xm-cz-group[show='name'] .xm-cz i{display: none;} +.xm-select-parent dd > .xm-cz-group[show='icon'] .xm-cz span{display: none;} +.xm-select-parent dd .xm-cz:hover{color: #009688;} +div[xm-select-skin='default'] dd .xm-cz:hover{color: #C0C4CC;} +div[xm-select-skin='primary'] dd .xm-cz:hover{color: #009688;} +div[xm-select-skin='normal'] dd .xm-cz:hover{color: #1E9FFF;} +div[xm-select-skin='warm'] dd .xm-cz:hover{color: #FFB800;} +div[xm-select-skin='danger'] dd .xm-cz:hover{color: #FF5722;} + + +/* 下拉里面的搜索 */ +.xm-select-tips .xm-input{border: none; border-bottom: 1px solid #E6E6E6; padding-left: 27px;} +.xm-select-tips .icon-sousuo{position: absolute;} +.xm-select-tips.xm-dl-input{display: none;} +div[xm-select-search-type="1"] .xm-select-tips.xm-dl-input{display: block;} +div[xm-select-search-type="1"] .xm-select .xm-select-input{display: none !important;} + +/* 阿里巴巴矢量图标库 */ +@font-face {font-family: "xm-iconfont"; + src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831'); /* IE9*/ + src: url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.eot?t=1534240067831#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAsYAAsAAAAAEQwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8ukovY21hcAAAAYAAAACrAAACPBtV6wxnbHlmAAACLAAABnEAAAmMovtEvWhlYWQAAAigAAAAMQAAADYSctBCaGhlYQAACNQAAAAgAAAAJAgBA69obXR4AAAI9AAAABsAAAAwMCX//WxvY2EAAAkQAAAAGgAAABoN8gwubWF4cAAACSwAAAAeAAAAIAEiAM9uYW1lAAAJTAAAAUUAAAJtPlT+fXBvc3QAAAqUAAAAhAAAALJ1LunfeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWacwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeMbwwZ27438AQw9zMcAQozAiSAwDk4AxmeJzlks0JwzAMhZ8bN/1xD4GU0h2Se26BbJMJOkkn6KmTPbJF8mT5UGg3qMRn0EPIRs8A9gAq0YsIhDcCLF5SQ9YrnLMe8VB9RSMlMjCxYcueIyfOy7CuAFHU7lP9iqApt5L3ksBJbzlgZ9PVkXDUvbWa6x8T/i0u+XyWKtmmHW0NDI55yeRok2DjaKdg65jX7Bzzm71jXnN08vzJkQvg7Ng/WAYH9Qb3wzM/AHicjVVvbFzFEd/Zfbv7/vn9uXf33vl8Pt/dO99BHOzEZ9/DKTImRS0KjUoLDUFCjtpCMGkT1D9qldQmhkiUSv2G1BBB1VYqilGREOIDViWEGzttqkpI/cAXqyL5gFRALVIF+VCJe9fZd+fEpR/o6d3s7G9mZ2dmZ3aJIKR3h0ZYmVgkIjGZJV8mDxECtenOTDOu1UU+hJoD+TCqzcNMk2V8O5OCbDVRPgZhEt4JCNTZ/4HA3+DfuWIxl8pcFFErG3K7oD7fvev8UaMUmEu259lrRjBsfs6cLhYbRfzSbSjGRVAkfQYihUXsyPkHTVyyZDNmXzSHg3Tl+aPKxpJFqbWGdtLl8w8iYDxuDTQIx7yc1YCdIx7Jk3HSwbwQwGBcyMKZVtG0ZCuJxjFJBb+foMSfhJaPOSr4FYgwSwqIx2MHJALtAdBi/7xcSMJL+fxmmBS2guD61tZm96X02mgcj0J1NAaIR9UMmhXIV24FuLUC71+r1AEmK1AYrQHUK/Tly/m8MrOZz2+FSf7jzc3NK9XR9F2lVq+gmRp0r+HK9B+VJmR263Rgd7ALwR/FOFfx/FeJS0YxQh9drakgMJhaBVizkwgqWxLD6eQ0Qo8f7p44fJziSH9x+PjLZUO+/jZ9+K35X37ljn/Rv+yW4Ziuf2nl4PfS5/LrP47OHTsFJULYjf369UZAEBmSqEOSJmG4Me6LeznA0BFkcDoJlGynVzmH2vY21DhPr25v9DjvbfTp2TXG1s5mlK0q4S7lT++6obbRox/s6CHF2LMEsHvoFfSFQIKnKQMZJVFCD6WH0p0PVvvcRx8uph8eUks0jOFNtskOkpDsJ18k9+NqVRg3qqMCSSerjyRuYUi1/vFH7YIqikGVcD+ehFl/pqPSPKZ6DG6mHisljFhBFvU/PoRkSNd/JHO6Ja5JOXcfwIGJbm/igBq/hn8Kfb57YbYUxyX4cwkLKH1u4gD9GVSL6USxCjjCO2p8VdcvH9XRYIQWqUblu3pR/v2BvXMAc3tTmJiDAQ895B9NL0C9BFdKqqRKczDX/Whg7O1irVbcqZ8/sbfYBOZwihC+6wSDzszUf+dF7rRO1O+fKaDO+nXOr6+vf8L5J44Qe4UvnlyRntwrxMoKzpFdeRJBNb9dGyiur1+nE59R+uwi9M1G395jb9KP0bcK2YM9nJB5cojcS75OFskxclzdc+pW699z8iYbtf14BGKf77ruZNyXKC0e50OEBI+V/Aug5Dex/9WjJfipuqnS00gfybjXbNe1f762tXmRPp3Bdl/l6g5JXyqXR0bK8J3PR+jvwYs8/GBnTM+kr8FX4ZknwC16XtG9iH9QfNn1vDHPe2GAj3ieV3XdF2+IPdeteh62Ra+HfQrsKWKSBtlHSOBgM7KkKQBLWnZoq1mVwotCLRGhOtSkMzMuqq2ml3SqUehdnZtynbtPLB88/Dy9dDrYVzoy/MTT6Svnlpd/AHueon5wpnGsEae/PZm+d3Jp6SSUTy7R3xw4f9/B5RN3O+5t3VNncjm6Cnt+uLx8DpedGj4yvD84HceNxTcG6ku4VPmZ9n6nNdj95BHyB3IJKxBPsKm6rpn4QopmqzlFm1MwqdxO5rPGnIc7aSfCGg1Vqyo6nUlQhnh7WiFhXzgGhVC4qjPRki9xdGCc4zXeSWb9BG1ktlqz2Q5Y7S2sIJfivkpVKCCDpyCWdbQzECj76qMVqvyJ/LxyI2rTv1bTC25lSM9xAUJ4Lc+U0wXTsKXDmaA8tHX+hvDt4Wa9IHLcMUBz9VwpL4xi2aGasAPPKNUbbmD/2jAtk0uXY4eJx8zRgj9iAnVNt5X+BL5vlHTOaiOmG7g6+7ZBNUOaefNXuJF3u25RjVvBLeW8E4wV7ZJBpbAXXGnqrwgupWVTAKqZjq5HbW44fMguNJhgwmw8oOk8GCqE8F3GhLB0uS/UDVt4lgjtqGxK/rpwuaDAqKHZNuWmJjVKuWUxbpg2B9DtoRdN3TKF9B0hw4p41C5i3CI9w4civP3aQLlmLMK3wpJpaI7BvmlhPtH3nPWCKQAdE2hK9zyuUeAm921qCA2kvqY8N1yDMq4beJlG+4XQqHDCQnqPlJIyyN579S4tIGcRv/82BbFfK9SgnVHkZzMeaSQjqR5/fP5XF2Chh+sW0g0gn27snqXv3/bsszsfJbCAIiTdjRTVCBL6jV0K5D8H/8xVAAAAeJxjYGRgYADi16c/vIvnt/nKwM3CAALXZxxzhtH///23YVFhbgZyORiYQKIAm34OJQAAAHicY2BkYGBu+N/AEMOi/P/f//8sKgxAERTAAwCmuAa3eJxjYWBgYAFhRiiNFf//z6L8/x+IDQAkCQRQAAAAAAAAjAEAATgBfgGaAiACbgMMA2AEhATGAAB4nGNgZGBg4GE4DMQgwATEXEDIwPAfzGcAAB2tAfIAAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nG2L3QqCQBCFZ9RWU7sOfAeh8IFi3N10EHYUG1p8+gSjqz44F+cPEjgo4T81Jphihic0mGOBZyyxwhovUCxKIe4ylthRuDqV+I22UcLQ6+QH4ubWdZZkU3m4o/0tUqtSvT33TPLits12fzc+zhRcvoquo0o281OLhcMw7Q+AD8sULE0=') format('woff'), + url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.ttf?t=1534240067831') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('//at.alicdn.com/t/font_792691_qxv28s6g1l9.svg?t=1534240067831#iconfont') format('svg'); /* iOS 4.1- */ +} +.xm-iconfont {font-family:"xm-iconfont" !important; font-size:14px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;} +.icon-quanxuan:before { content: "\e62c"; } +.icon-caidan:before { content: "\e610"; } +.icon-fanxuan:before { content: "\e837"; } +.icon-pifu:before { content: "\e668"; } +.icon-qingkong:before { content: "\e63e"; } +.icon-sousuo:before { content: "\e600"; } +.icon-danx:before { content: "\e62b"; } +.icon-duox:before { content: "\e613"; } +.icon-close:before { content: "\e601"; } +.icon-expand:before { content: "\e641"; } + diff --git a/public/static/assets/gougu/module/formSelects.js b/public/static/assets/gougu/module/formSelects.js new file mode 100644 index 0000000..f675e94 --- /dev/null +++ b/public/static/assets/gougu/module/formSelects.js @@ -0,0 +1 @@ +"use strict";var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol==="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function _defineProperty(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}(function(e,t,n){if((typeof exports==="undefined"?"undefined":_typeof(exports))==="object"){module.exports=n()}else if(typeof define==="function"&&define.amd){define(n)}else if(t.layui&&e.define){e.define(["jquery"],function(e){e("formSelects",n())})}else{t.formSelects=n()}})(typeof layui=="undefined"?null:layui,window,function(){var t="4.0.0.0910",v="xm-select",m="xm-select-parent",y="xm-select-input",g="xm-select--suffix",w="xm-select-this",x="xm-select-label",k="xm-select-search",b="xm-select-search-type",C="xm-select-show-count",S="xm-select-create",d="xm-select-create-long",T="xm-select-max",L="xm-select-skin",j="xm-select-direction",A="xm-select-height",E="xm-dis-disabled",N="xm-select-dis",p="xm-select-temp",D="xm-select-radio",H="xm-select-linkage",F="xm-select-dl",h="xm-select-hide",_="xm-hide-input",O="xm-select-sj",e="xm-icon-close",I="xm-select-title",P="xm-form-select",f="xm-form-selected",V="xm-select-none",U="xm-select-empty",M="xm-input",W="xm-dl-input",J="xm-select-tips",s="xm-iconfont",B="XM_PID_VALUE",R="xm-cz",l="xm-cz-group",n="请选择",q={},z={on:{},endOn:{},filter:{},maxTips:{},opened:{},closed:{}},X={type:"get",header:{},first:true,data:{},searchUrl:"",searchName:"keyword",searchVal:null,keyName:"name",keyVal:"value",keySel:"selected",keyDis:"disabled",keyChildren:"children",dataType:"",delay:500,beforeSuccess:null,success:null,error:null,beforeSearch:null,response:{statusCode:0,statusName:"code",msgName:"msg",dataName:"data"},tree:{nextClick:function e(t,n,i){i([])},folderChoose:true,lazy:true}},i=[{icon:"xm-iconfont icon-quanxuan",name:"全选",click:function e(t,n){n.selectAll(t,true,true)}},{icon:"xm-iconfont icon-qingkong",name:"清空",click:function e(t,n){n.removeAll(t,true,true)}},{icon:"xm-iconfont icon-fanxuan",name:"反选",click:function e(t,n){n.reverse(t,true,true)}},{icon:"xm-iconfont icon-pifu",name:"换肤",click:function e(t,n){n.skin(t)}}],Q=window.$||window.layui&&window.layui.jquery,c=Q(window),Y={},a={},r={},$=function e(t){var l=this;this.config={name:null,max:null,maxTips:function e(t,n,i,a){var r=Q('[xid="'+l.config.name+'"]').prev().find("."+v);if(r.parents(".layui-form-item[pane]").length){r=r.parents(".layui-form-item[pane]")}r.attr("style","border-color: red !important");setTimeout(function(){r.removeAttr("style")},300)},init:null,on:null,opened:null,closed:null,filter:function e(t,n,i,a){return i.name.indexOf(n)==-1},clearid:-1,direction:"auto",height:null,isEmpty:false,btns:[i[0],i[1],i[2]],searchType:0,create:function e(t,n){return Date.now()},template:function e(t,n){return n.name},showCount:0,isCreate:false,placeholder:n,clearInput:false};this.select=null;this.values=[];Q.extend(this.config,t,{searchUrl:t.isSearch?t.searchUrl:null,placeholder:t.optionsFirst?t.optionsFirst.value?n:t.optionsFirst.innerHTML||n:n,btns:t.radio?[i[1]]:[i[0],i[1],i[2]]},r[t.name]||a);if(isNaN(this.config.showCount)||this.config.showCount<=0){this.config.showCount=19921012}};var o=function e(){this.appender();this.on();this.onreset()};o.prototype.appender=function(){if(!Array.prototype.map){Array.prototype.map=function(e,t){var n,i,a,r=Object(this),l=r.length>>>0;if(t){n=t}i=new Array(l);a=0;while(a>>0;if(typeof t!=="function"){throw new TypeError(t+" is not a function")}if(arguments.length>1){i=n}a=0;while(a>>0;if(typeof e!=="function"){throw new TypeError}var i=[];var a=arguments[1];for(var r=0;r','',""];var u=Q('
              \n\t\t\t\t\t\n\t\t\t\t\t
              \n\t\t\t\t\t\t
              \n\t\t\t\t\t\t\t"+f.join("")+'\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
              \n\t\t\t\t\t\t
              \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
              \n\t\t\t\t\t\t
              \n\t\t\t\t\t
              \n\t\t\t\t\t
              '+d+"
              \n\t\t\t\t
              ");var p=Q('
              ');p.append(u);n.after(p);n.attr("lay-ignore","");n.removeAttr("name")&&n.attr("_name",s.config.formname);n.removeAttr("lay-verify")&&n.attr("_lay-verify",s.config.layverify);if(s.config.isSearch){Y[i]=Q.extend({},X,{searchUrl:s.config.searchUrl},Y[i]);Q(document).on("input","div."+m+'[FS_ID="'+i+'"] .'+y,function(e){h.search(i,e,s.config.searchUrl)});if(s.config.searchUrl){h.triggerSearch(u,true)}}else{u.find("dl dd."+W).css("display","none")}})};o.prototype.search=function(a,e,t,n){var r=this;var i=void 0;if(n){i=n}else{i=e.target;var l=e.keyCode;if(l===9||l===13||l===37||l===38||l===39||l===40){return false}}var o=Q.trim(i.value);this.changePlaceHolder(Q(i));var s=Y[a]?Y[a]:X;t=s.searchUrl||t;var d=q[a],c=d.config.isCreate,f=Q('dl[xid="'+a+'"]').parents("."+P);if(t){if(s.searchVal){o=s.searchVal;s.searchVal=""}if(!s.beforeSearch||s.beforeSearch&&s.beforeSearch instanceof Function&&s.beforeSearch(a,t,o)){var u=s.delay;if(s.first){s.first=false;u=10}clearTimeout(d.clearid);d.clearid=setTimeout(function(){f.find("dl > *:not(."+J+")").remove();f.find("dd."+V).addClass(U).text("请求中");r.ajax(a,t,o,false,null,true)},u)}}else{f.find("dl ."+h).removeClass(h);f.find("dl dd:not(."+J+")").each(function(e,t){var n=Q(t);var i=z.filter[a]||q[a].config.filter;if(i&&i(a,o,r.getItem(a,n),n.hasClass(E))==true){n.addClass(h)}});f.find("dl dt").each(function(e,t){if(!Q(t).nextUntil("dt",":not(."+h+")").length){Q(t).addClass(h)}});this.create(a,c,o);var p=f.find("dl dd:not(."+J+"):not(."+h+")");if(!p.length){f.find("dd."+V).addClass(U).text("无匹配项")}else{f.find("dd."+V).removeClass(U)}}};o.prototype.isArray=function(e){return Object.prototype.toString.call(e)=="[object Array]"};o.prototype.triggerSearch=function(e,i){var a=this;(e?[e]:Q("."+P).toArray()).forEach(function(e,t){e=Q(e);var n=e.find("dl").attr("xid");if(n&&q[n]&&q[n].config.isEmpty||i){a.search(n,null,null,q[n].config.searchType==0?e.find("."+x+" ."+y):e.find("dl ."+W+" ."+y))}})};o.prototype.clearInput=function(e){var t=Q("."+m+'[fs_id="'+e+'"]');var n=q[e].config.searchType==0?t.find("."+x+" ."+y):t.find("dl ."+W+" ."+y);n.val("")};o.prototype.ajax=function(i,a,r,l,o,s,d,c){var f=this;var u=Q("."+m+' dl[xid="'+i+'"]').parents("."+P);if(!u[0]||!a){return}var p=Y[i]?Y[i]:X;var e=Q.extend(true,{},p.data);e[p.searchName]=r;Q.ajax({type:p.type,headers:p.header,url:a,data:p.dataType=="json"?JSON.stringify(e):e,success:function e(t){if(typeof t=="string"){t=JSON.parse(t)}p.beforeSuccess&&p.beforeSuccess instanceof Function&&(t=p.beforeSuccess(i,a,r,t));if(f.isArray(t)){var n={};n[p.response.statusName]=p.response.statusCode;n[p.response.msgName]="";n[p.response.dataName]=t;t=n}if(t[p.response.statusName]!=p.response.statusCode){u.find("dd."+V).addClass(U).text(t[p.response.msgName])}else{u.find("dd."+V).removeClass(U);f.renderData(i,t[p.response.dataName],l,o,s,c);q[i].config.isEmpty=t[p.response.dataName].length==0}d&&d(i);p.success&&p.success instanceof Function&&p.success(i,a,r,t)},error:function e(t){u.find("dd[lay-value]:not(."+J+")").remove();u.find("dd."+V).addClass(U).text("服务异常");p.error&&p.error instanceof Function&&p.error(i,a,r,t)}})};o.prototype.renderData=function(n,e,t,i,a,r){var l=this;if(t){this.renderLinkage(n,e,i);return}if(r){this.renderReplace(n,e);return}var o=Q("."+m+' dl[xid="'+n+'"]').parents("."+P);var s=Y[n]?Y[n]:X;var d=o.find("."+g+" input");e=this.exchangeData(n,e);var c=[];o.find("dl").html(this.renderSelect(n,d.attr("placeholder")||d.attr("back"),e.map(function(e){var t=Q.extend({},e,{innerHTML:e[s.keyName],value:e[s.keyVal],sel:e[s.keySel],disabled:e[s.keyDis],type:e.type,name:e[s.keyName]});if(t.sel){c.push(t)}return t})));var f=o.find("."+x);var u=o.find("dl[xid]");if(a){var p=q[n].values;p.forEach(function(e,t){u.find('dd[lay-value="'+e.value+'"]').addClass(w)});c.forEach(function(e,t){if(l.indexOf(p,e)==-1){l.addLabel(n,f,e);u.find('dd[lay-value="'+e.value+'"]').addClass(w);p.push(e)}})}else{c.forEach(function(e,t){l.addLabel(n,f,e);u.find('dd[lay-value="'+e.value+'"]').addClass(w)});q[n].values=c}this.commonHandler(n,f)};o.prototype.renderLinkage=function(l,e,n){var i=[],a=0,o={0:e},s=Y[l]?Y[l]:X;G[l]={};var t=function e(){var r=i[a++]=[],t=o;o={};Q.each(t,function(a,e){Q.each(e,function(e,t){var n={pid:a,name:t[s.keyName],value:t[s.keyVal]};G[l][n.value]=Q.extend(t,n);r.push(n);var i=t[s.keyChildren];if(i&&i.length){o[n.value]=i}})})};do{t()}while(Object.getOwnPropertyNames(o).length);var r=Q("."+m+' dl[xid="'+l+'"]').parents("."+P);var d=['
              '];Q.each(i,function(e,t){var i=['
              '];Q.each(t,function(e,t){var n='
            • '+t.name+"
            • ";i.push(n)});i.push("
              ");d=d.concat(i)});d.push('
              ');d.push("
              ");r.find("dl").html(d.join(""));r.find("."+y).css("display","none")};o.prototype.renderReplace=function(n,e){var i=this;var t=Q("."+m+' dl[xid="'+n+'"]');var a=Y[n]?Y[n]:X;e=this.exchangeData(n,e);G[n]=e;var r=e.map(function(e){var t=Q.extend({},e,{innerHTML:e[a.keyName],value:e[a.keyVal],sel:e[a.keySel],disabled:e[a.keyDis],type:e.type,name:e[a.keyName]});return i.createDD(n,t)}).join("");t.find("dd:not(."+J+"),dt:not([style])").remove();t.find("dt[style]").after(Q(r))};o.prototype.exchangeData=function(e,t){var n=Y[e]?Y[e]:X;var i=n["keyChildren"];var a=n["keyDis"];G[e]={};var r=this.getChildrenList(t,i,a,[],false);return r};o.prototype.getChildrenList=function(e,t,n,i,a){var r=[],l=0;for(var o=0;o\n\t\t\t\t\t
              \n\t\t\t\t\t\t\n\t\t\t\t\t\t'+r+"\n\t\t\t\t\t
              \n\t\t\t\t"};o.prototype.createQuickBtn=function(e,t){return'
              '+e.name+"
              "};o.prototype.renderBtns=function(e,t,n){var i=this;var a=[];var r=Q('dl[xid="'+e+'"]');a.push('
              ');Q.each(q[e].config.btns,function(e,t){a.push(i.createQuickBtn(t,n))});a.push("
              ");a.push(this.createQuickBtn({icon:"xm-iconfont icon-caidan",name:""}));return a.join("")};o.prototype.renderSelect=function(n,e,t){var i=this;G[n]={};var a=[];if(q[n].config.btns.length){setTimeout(function(){var e=Q('dl[xid="'+n+'"]');e.parents("."+P).attr(b,q[n].config.searchType);e.find("."+l).css("max-width",e.prev().width()-54+"px")},10);a.push(['
              ',this.renderBtns(n,null,"30px"),"
              ",'
              ','','',"
              "].join(""))}else{a.push('
              '+e+"
              ")}if(this.isArray(t)){Q(t).each(function(e,t){if(t){if(t.type&&t.type==="optgroup"){a.push("
              "+t.name+"
              ")}else{a.push(i.createDD(n,t))}}})}else{Q(t).find("*").each(function(e,t){if(t.tagName.toLowerCase()=="option"&&e==0&&!t.value){return}if(t.tagName.toLowerCase()==="optgroup"){a.push("
              "+t.label+"
              ")}else{a.push(i.createDD(n,t))}})}a.push('
              ');a.push('
              没有选项
              ');return a.join("")};o.prototype.on=function(){var n=this;this.one();Q(document).on("click",function(e){if(!Q(e.target).parents("."+I)[0]){Q("."+m+" dl ."+h).removeClass(h);Q("."+m+" dl dd."+U).removeClass(U);Q("."+m+" dl dd."+p).remove();Q.each(q,function(e,t){n.clearInput(e);if(!t.values.length){n.changePlaceHolder(Q('div[FS_ID="'+e+'"] .'+x))}})}Q("."+m+" ."+f).each(function(e,t){n.changeShow(Q(t).find("."+I),false)})})};o.prototype.calcLabelLeft=function(e,t,n){var i=this.getPosition(e[0]);i.y=i.x+e[0].clientWidth;var a=e[0].offsetLeft;if(!e.find("span").length){a=0}else if(n){var r=e.find("span:last");r.css("display")=="none"?r=r.prev()[0]:r=r[0];var l=this.getPosition(r);l.y=l.x+r.clientWidth;if(l.y>i.y){a=a-(l.y-i.y)-5}else{a=0}}else{if(t<0){var o=e.find(":last");o.css("display")=="none"?o=o.prev()[0]:o=o[0];var s=this.getPosition(o);s.y=s.x+o.clientWidth;if(s.y>i.y){a-=10}}else{if(a<0){a+=10}if(a>0){a=0}}}e.css("left",a+"px")};o.prototype.one=function(e){var C=this;Q(e?e:document).off("click","."+I).on("click","."+I,function(e){var t=Q(e.target),n=t.is(I)?t:t.parents("."+I),i=n.next(),a=i.attr("xid");Q("dl[xid]").not(i).each(function(e,t){C.clearInput(Q(t).attr("xid"))});Q("dl[xid]").not(i).find("dd."+h).removeClass(h);if(n.hasClass(N)){return false}if(t.is("."+O)||t.is("."+y+"[readonly]")){C.changeShow(n,!n.parents("."+P).hasClass(f));return false}if(n.find("."+y+":not(readonly)")[0]){var r=n.find("."+y),l={x:e.pageX,y:e.pageY},o=C.getPosition(n[0]),s=n.width();while(l.x>o.x){if(Q(document.elementFromPoint(l.x,l.y)).is(r)){r.focus();C.changeShow(n,true);return false}l.x-=50}}if(t.is("."+y)){C.changeShow(n,true);return false}if(t.is('i[fsw="'+v+'"]')){var d=C.getItem(a,t),c=i.find("dd[lay-value='"+d.value+"']");if(c.hasClass(E)){return false}C.handlerLabel(a,c,false,d);return false}C.changeShow(n,!n.parents("."+P).hasClass(f));return false});Q(e?e:document).off("click","dl."+F).on("click","dl."+F,function(e){var t=Q(e.target);if(t.is("."+H)||t.parents("."+H)[0]){t=t.is("li")?t:t.parents("li[xm-value]");var n=t.parents(".xm-select-linkage-group"),i=t.parents("dl").attr("xid");if(!i){return false}n.find(".xm-select-active").removeClass("xm-select-active");t.addClass("xm-select-active");n.nextAll(".xm-select-linkage-group").addClass("xm-select-linkage-hide");var a=n.next(".xm-select-linkage-group");a.find("li").addClass("xm-select-linkage-hide");a.find('li[pid="'+t.attr("xm-value")+'"]').removeClass("xm-select-linkage-hide");if(!a[0]||a.find("li:not(.xm-select-linkage-hide)").length==0){var r=[],l=0,o=!t.hasClass("xm-select-this");if(q[i].config.radio){t.parents(".xm-select-linkage").find(".xm-select-this").removeClass("xm-select-this")}do{r[l++]={name:t.find("span").text(),value:t.attr("xm-value")};t=t.parents(".xm-select-linkage-group").prev().find('li[xm-value="'+t.attr("pid")+'"]')}while(t.length);r.reverse();var s={name:r.map(function(e){return e.name}).join("/"),value:r.map(function(e){return e.value}).join("/")};C.handlerLabel(i,null,o,s)}else{a.removeClass("xm-select-linkage-hide")}return false}if(t.is("dl")){return false}if(t.is("dt")){t.nextUntil("dt").each(function(e,t){t=Q(t);if(t.hasClass(E)||t.hasClass(w)){}else{t.find("i:not(.icon-expand)").click()}});return false}var d=t.is("dd")?t:t.parents("dd");var c=d.parent("dl").attr("xid");if(d.hasClass(E)){return false}if(t.is("i.icon-caidan")){var f=[],u=[];t.parents("dl").find('dd[tree-folder="true"]').each(function(e,t){Q(t).attr("xm-tree-hidn")==undefined?f.push(t):u.push(t)});var p=u.length?u:f;p.forEach(function(e){return e.click()});return false}var h=d.attr("tree-id");if(h){if(t.is("i:not(.icon-expand)")){C.handlerLabel(c,d,!d.hasClass(w));return false}var v=Y[c]||X;var m=v.tree;var y=d.nextAll('dd[tree-id^="'+h+'"]');if(y&&y.length){var g=y[0].clientHeight;g?(C.addTreeHeight(d,g),g=0):(g=d.attr("xm-tree-hidn")||36,d.removeAttr("xm-tree-hidn"),d.find(">i").remove(),y=y.filter(function(e,t){return Q(t).attr("tree-id").split("-").length-1==h.split("-").length}));y.animate({height:g},150);return false}else{if(m.nextClick&&m.nextClick instanceof Function){m.nextClick(c,C.getItem(c,d),function(e){if(!e||!e.length){C.handlerLabel(c,d,!d.hasClass(w))}else{d.attr("tree-folder","true");var n=[];e.forEach(function(e,t){e.innerHTML=e[v.keyName];e[B]=JSON.stringify(h.split("-").concat([t]));n.push(C.createDD(c,e));G[c][e[v.keyVal]]=e});d.after(n.join(""))}});return false}}}if(d.hasClass(J)){var x=t.is("."+R)?t:t.parents("."+R);if(!x[0]){return false}var k=x.attr("method");var b=q[c].config.btns.filter(function(e){return e.name==k})[0];b&&b.click&&b.click instanceof Function&&b.click(c,C);return false}C.handlerLabel(c,d,!d.hasClass(w));return false})};o.prototype.addTreeHeight=function(e,i){var a=this;var t=e.attr("tree-id");var n=e.nextAll('dd[tree-id^="'+t+'"]');if(n.length){e.append('');e.attr("xm-tree-hidn",i);n.each(function(e,t){var n=Q(t);a.addTreeHeight(n,i)})}};var G={};o.prototype.getItem=function(e,t){if(t instanceof Q){if(t.is('i[fsw="'+v+'"]')){var n=t.parent();return G[e][t]||{name:n.find("font").text(),value:n.attr("value")}}var i=t.attr("lay-value");return!G[e][i]?G[e][i]={name:t.find("span[name]").attr("name"),value:i}:G[e][i]}else if(typeof t=="string"&&t.indexOf("/")!=-1){return G[e][t]||{name:this.valToName(e,t),value:t}}return G[e][t]};o.prototype.linkageAdd=function(e,t){var n=Q('dl[xid="'+e+'"]');n.find(".xm-select-active").removeClass("xm-select-active");var i=t.value.split("/");var a=void 0,r=void 0,l=0;var o=[];do{a=i[l];r=n.find(".xm-select-linkage-group"+(l+1)+' li[xm-value="'+a+'"]');r[0]&&o.push(r);l++}while(r.length&&a!=undefined);if(o.length==i.length){Q.each(o,function(e,t){t.addClass("xm-select-this")})}};o.prototype.linkageDel=function(e,t){var n=Q('dl[xid="'+e+'"]');var i=t.value.split("/");var a=void 0,r=void 0,l=i.length-1;do{a=i[l];r=n.find(".xm-select-linkage-group"+(l+1)+' li[xm-value="'+a+'"]');if(!r.parent().next().find("li[pid="+a+"].xm-select-this").length){r.removeClass("xm-select-this")}l--}while(r.length&&a!=undefined)};o.prototype.valToName=function(e,t){var i=Q('dl[xid="'+e+'"]');var n=(t+"").split("/");if(!n.length){return null}var a=[];Q.each(n,function(e,t){var n=i.find(".xm-select-linkage-group"+(e+1)+' li[xm-value="'+t+'"] span').text();a.push(n)});return a.length==n.length?a.join("/"):null};o.prototype.commonHandler=function(e,t){if(!t||!t[0]){return}this.checkHideSpan(e,t);this.changePlaceHolder(t);this.retop(t.parents("."+P));this.calcLabelLeft(t,0,true);this.setHidnVal(e,t);t.parents("."+I+" ."+v).attr("title",q[e].values.map(function(e){return e.name}).join(","))};o.prototype.initVal=function(e){var o=this;var t={};if(e){t[e]=q[e]}else{t=q}Q.each(t,function(n,e){var t=e.values,i=Q('dl[xid="'+n+'"]').parent(),a=i.find("."+x),r=i.find("dl");r.find("dd."+w).removeClass(w);var l=t.concat([]);l.concat([]).forEach(function(e,t){o.addLabel(n,a,e);r.find('dd[lay-value="'+e.value+'"]').addClass(w)});if(e.config.radio){l.length&&t.push(l[l.length-1])}o.commonHandler(n,a)})};o.prototype.setHidnVal=function(e,t){if(!t||!t[0]){return}t.parents("."+m).find("."+_).val(q[e].values.map(function(e){return e.value}).join(","))};o.prototype.handlerLabel=function(e,t,n,i,a){var r=Q('[xid="'+e+'"]').prev().find("."+x),l=t&&this.getItem(e,t),o=q[e].values,s=q[e].config.on||z.on[e],d=q[e].config.endOn||z.endOn[e];if(i){l=i}var c=q[e];if(n&&c.config.max&&c.values.length>=c.config.max){var f=z.maxTips[e]||q[e].config.maxTips;f&&f(e,o.concat([]),l,c.config.max);return}if(!a){if(s&&s instanceof Function&&s(e,o.concat([]),l,n,t&&t.hasClass(E))==false){return}}var u=Q('dl[xid="'+e+'"]');n?(t&&t[0]?(t.addClass(w),t.removeClass(p)):u.find(".xm-select-linkage")[0]&&this.linkageAdd(e,l),this.addLabel(e,r,l),o.push(l)):(t&&t[0]?t.removeClass(w):u.find(".xm-select-linkage")[0]&&this.linkageDel(e,l),this.delLabel(e,r,l),this.remove(o,l));if(!r[0])return;if(c.config.radio){this.changeShow(r,false)}r.parents("."+I).prev().removeClass("layui-form-danger");c.config.clearInput&&this.clearInput(e);this.commonHandler(e,r);!a&&d&&d instanceof Function&&d(e,o.concat([]),l,n,t&&t.hasClass(E))};o.prototype.addLabel=function(e,t,n){if(!n)return;var i='fsw="'+v+'"';var a=[Q(""+n.name+""),Q("')],r=a[0],l=a[1];r.append(l);var o=q[e];if(o.config.radio){o.values.length=0;Q('dl[xid="'+e+'"]').find("dd."+w+':not([lay-value="'+n.value+'"])').removeClass(w);t.find("span").remove()}t.find("input").css("width","50px");t.find("input").before(r)};o.prototype.delLabel=function(e,t,n){if(!n)return;t.find('span[value="'+n.value+'"]:first').remove()};o.prototype.checkHideSpan=function(e,t){var n=t.parents("."+v)[0].offsetHeight+5;t.find("span.xm-span-hide").removeClass("xm-span-hide");t.find("span[style]").remove();var i=q[e].config.showCount;t.find("span").each(function(e,t){if(e>=i){Q(t).addClass("xm-span-hide")}});var a=t.find("span:eq("+i+")");a[0]&&a.before(Q(' + '+(t.find("span").length-i)+""))};o.prototype.retop=function(e){var t=e.find("dl"),n=e.offset().top+e.outerHeight()+5-c.scrollTop(),i=t.outerHeight();var a=e.hasClass("layui-form-selectup")||t.css("top").indexOf("-")!=-1||n+i>c.height()&&n>=i;e=e.find("."+v);var r=q[t.attr("xid")];var l=t.parents(".layui-form-pane")[0]&&t.prev()[0].clientHeight>38?14:10;if(r&&r.config.direction=="up"||a){a=true;if(r&&r.config.direction=="down"){a=false}}var o=e[0].offsetTop+e.height()+l;if(a){t.css({top:"auto",bottom:o+3+"px"})}else{t.css({top:o+"px",bottom:"auto"})}};o.prototype.changeShow=function(e,t){Q(".layui-form-selected").removeClass("layui-form-selected");var n=e.parents("."+P),i=n.hasClass(f),a=n.find("dl").attr("xid");Q("."+m+" ."+P).not(n).removeClass(f);if(t){this.retop(n);n.addClass(f);n.find("."+y).focus();if(!n.find("dl dd[lay-value]:not(."+J+")").length){n.find("dl ."+V).addClass(U)}}else{n.removeClass(f);this.clearInput(a);n.find("dl ."+U).removeClass(U);n.find("dl dd."+h).removeClass(h);n.find("dl dd."+p).remove();if(a&&q[a]&&q[a].config.isEmpty){this.triggerSearch(n)}this.changePlaceHolder(n.find("."+x))}if(t!=i){var r=q[a].config.opened||z.opened[a];t&&r&&r instanceof Function&&r(a);var l=q[a].config.closed||z.closed[a];!t&&l&&l instanceof Function&&l(a)}};o.prototype.changePlaceHolder=function(e){var t=e.parents("."+I);t[0]||(t=e.parents("dl").prev());if(!t[0]){return}var n=e.parents("."+m).find("dl[xid]").attr("xid");if(q[n]&&q[n].config.height){}else{var i=t.find("."+v)[0].clientHeight;t.css("height",(i>36?i+4:i)+"px");var a=t.parents("."+m).parent().prev();if(a.is(".layui-form-label")&&t.parents(".layui-form-pane")[0]){i=i>36?i+4:i;t.css("height",i+"px");a.css({height:i+2+"px",lineHeight:i-18+"px"})}}var r=t.find("."+g+" input"),l=!e.find("span:last")[0]&&!t.find("."+y).val();if(l){var o=r.attr("back");r.removeAttr("back");r.attr("placeholder",o)}else{var s=r.attr("placeholder");r.removeAttr("placeholder");r.attr("back",s)}};o.prototype.indexOf=function(e,t){for(var n=0;n-1){e.splice(n,1);return true}return false};o.prototype.selectAll=function(i,a,e){var r=this;var l=Q('[xid="'+i+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){return}l.find("dd[lay-value]:not(."+J+"):not(."+w+")"+(e?":not(."+E+")":"")).each(function(e,t){t=Q(t);var n=r.getItem(i,t);r.handlerLabel(i,l.find('dd[lay-value="'+n.value+'"]'),true,n,!a)})};o.prototype.removeAll=function(n,i,a){var r=this;var l=Q('[xid="'+n+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){q[n].values.concat([]).forEach(function(e,t){var n=e.value.split("/");var i=void 0,a=void 0,r=0;do{i=n[r++];a=l.find(".xm-select-linkage-group"+r+':not(.xm-select-linkage-hide) li[xm-value="'+i+'"]');a.click()}while(a.length&&i!=undefined)});return}q[n].values.concat([]).forEach(function(e,t){if(a&&l.find('dd[lay-value="'+e.value+'"]').hasClass(E)){}else{r.handlerLabel(n,l.find('dd[lay-value="'+e.value+'"]'),false,e,!i)}})};o.prototype.reverse=function(i,a,e){var r=this;var l=Q('[xid="'+i+'"]');if(!l[0]){return}if(l.find(".xm-select-linkage")[0]){return}l.find("dd[lay-value]:not(."+J+")"+(e?":not(."+E+")":"")).each(function(e,t){t=Q(t);var n=r.getItem(i,t);r.handlerLabel(i,l.find('dd[lay-value="'+n.value+'"]'),!t.hasClass(w),n,!a)})};o.prototype.skin=function(e){var t=["default","primary","normal","warm","danger"];var n=t[Math.floor(Math.random()*t.length)];Q('dl[xid="'+e+'"]').parents("."+m).find("."+P).attr("xm-select-skin",n);this.check(e)&&this.commonHandler(e,Q('dl[xid="'+e+'"]').parents("."+m).find("."+x))};o.prototype.getPosition=function(e){var t=0,n=0;while(e!=null){t+=e.offsetLeft;n+=e.offsetTop;e=e.offsetParent}return{x:t,y:n}};o.prototype.onreset=function(){Q(document).on("click","[type=reset]",function(e){Q(e.target).parents("form").find("."+m+" dl[xid]").each(function(e,t){var n=t.getAttribute("xid"),i=Q(t),a=void 0,r={};K.removeAll(n);q[n].config.init.forEach(function(e,t){if(e&&(!r[e]||q[n].config.repeat)&&(a=i.find('dd[lay-value="'+e.value+'"]'))[0]){K.handlerLabel(n,a,true);r[e]=1}})})})};o.prototype.bindEvent=function(n,e,i){if(e&&e instanceof Function){i=e;e=null}if(i&&i instanceof Function){if(!e){Q.each(q,function(e,t){q[e]?q[e].config[n]=i:z[n][e]=i})}else{q[e]?(q[e].config[n]=i,delete z[n][e]):z[n][e]=i}}};o.prototype.check=function(e,t){if(Q('dl[xid="'+e+'"]').length){return true}else if(Q('select[xm-select="'+e+'"]').length){if(!t){this.render(e,Q('select[xm-select="'+e+'"]'));return true}}else{delete q[e];return false}};o.prototype.render=function(e,t){K.init(t);K.one(Q('dl[xid="'+e+'"]').parents("."+m));K.initVal(e)};o.prototype.log=function(e){console.log(e)};var u=function e(){this.v=t;this.render()};var K=new o;u.prototype.value=function(i,e,t){if(typeof i!="string"){return[]}var a=q[i];if(!K.check(i)){return[]}if(typeof e=="string"||e==undefined){var n=a.values.concat([])||[];if(e=="val"){return n.map(function(e){return e.value})}if(e=="valStr"){return n.map(function(e){return e.value}).join(",")}if(e=="name"){return n.map(function(e){return e.name})}if(e=="nameStr"){return n.map(function(e){return e.name}).join(",")}return n}if(K.isArray(e)){var r=Q('[xid="'+i+'"]'),l={},o=void 0,s=true;if(t==false){s=false}else if(t==true){s=true}else{K.removeAll(i)}if(s){a.values.forEach(function(e,t){l[e.value]=1})}e.forEach(function(e,t){if(e&&(!l[e]||a.config.repeat)){if((o=r.find('dd[lay-value="'+e+'"]'))[0]){K.handlerLabel(i,o,s,null,true);l[e]=1}else{var n=K.valToName(i,e);if(n){K.handlerLabel(i,o,s,K.getItem(i,e),true);l[e]=1}}}})}};u.prototype.on=function(e,t,n){K.bindEvent(n?"endOn":"on",e,t);return this};u.prototype.filter=function(e,t){K.bindEvent("filter",e,t);return this};u.prototype.maxTips=function(e,t){K.bindEvent("maxTips",e,t);return this};u.prototype.opened=function(e,t){K.bindEvent("opened",e,t);return this};u.prototype.closed=function(e,t){K.bindEvent("closed",e,t);return this};u.prototype.config=function(e,n,t){if(e&&(typeof e==="undefined"?"undefined":_typeof(e))=="object"){t=n==true;n=e;e=null}if(n&&(typeof n==="undefined"?"undefined":_typeof(n))=="object"){if(t){n.header||(n.header={});n.header["Content-Type"]="application/json; charset=UTF-8";n.dataType="json"}e?(Y[e]=Q.extend(true,{},Y[e]||X,n),!K.check(e)&&this.render(e),q[e]&&n.direction&&(q[e].config.direction=n.direction),q[e]&&n.clearInput&&(q[e].config.clearInput=true),n.searchUrl&&q[e]&&K.triggerSearch(Q("."+m+' dl[xid="'+e+'"]').parents("."+P),true)):(Q.extend(true,X,n),Q.each(Y,function(e,t){Q.extend(true,t,n)}))}return this};u.prototype.render=function(e,t){var n;if(e&&(typeof e==="undefined"?"undefined":_typeof(e))=="object"){t=e;e=null}var i=t?(n={init:t.init,disabled:t.disabled,max:t.max,isSearch:t.isSearch,searchUrl:t.searchUrl,isCreate:t.isCreate,radio:t.radio,skin:t.skin,direction:t.direction,height:t.height,formname:t.formname,layverify:t.layverify,layverType:t.layverType,showCount:t.showCount,placeholder:t.placeholder,create:t.create,filter:t.filter,maxTips:t.maxTips,on:t.on},_defineProperty(n,"on",t.on),_defineProperty(n,"opened",t.opened),_defineProperty(n,"closed",t.closed),_defineProperty(n,"template",t.template),_defineProperty(n,"clearInput",t.clearInput),n):{};t&&t.searchType!=undefined&&(i.searchType=t.searchType=="dl"?1:0);if(e){r[e]={};Q.extend(r[e],q[e]?q[e].config:{},i)}else{Q.extend(a,i)}(Q("select["+v+'="'+e+'"]')[0]?Q("select["+v+'="'+e+'"]'):Q("select["+v+"]")).each(function(e,t){var n=t.getAttribute(v);K.render(n,t);setTimeout(function(){return K.setHidnVal(n,Q('select[xm-select="'+n+'"] + div.'+m+" ."+x))},10)});return this};u.prototype.disabled=function(e){var t={};e?K.check(e)&&(t[e]=q[e]):t=q;Q.each(t,function(e,t){Q('dl[xid="'+e+'"]').prev().addClass(N)});return this};u.prototype.undisabled=function(e){var t={};e?K.check(e)&&(t[e]=q[e]):t=q;Q.each(t,function(e,t){Q('dl[xid="'+e+'"]').prev().removeClass(N)});return this};u.prototype.data=function(e,t,n){if(!e||!t||!n){K.log("id: "+e+" param error !!!");return this}if(!K.check(e)){K.log("id: "+e+" not render !!!");return this}this.value(e,[]);this.config(e,n);if(t=="local"){K.renderData(e,n.arr,n.linkage==true,n.linkageWidth?n.linkageWidth:"100")}else if(t=="server"){K.ajax(e,n.url,n.keyword,n.linkage==true,n.linkageWidth?n.linkageWidth:"100")}return this};u.prototype.btns=function(e,o,s){if(e&&K.isArray(e)){o=e;e=null}if(!o||!K.isArray(o)){return this}var t={};e?K.check(e)&&(t[e]=q[e]):t=q;o=o.map(function(e){if(typeof e=="string"){if(e=="select"){return i[0]}if(e=="remove"){return i[1]}if(e=="reverse"){return i[2]}if(e=="skin"){return i[3]}}return e});Q.each(t,function(e,t){t.config.btns=o;var n=Q('dl[xid="'+e+'"]').find("."+J+":first");if(o.length){var i=s&&s.show&&(s.show=="name"||s.show=="icon")?s.show:"";var a=K.renderBtns(e,i,s&&s.space?s.space:"30px");n.html(a)}else{var r=n.parents("."+P).find("."+g+" input");var l=r.attr("placeholder")||r.attr("back");n.html(l);n.removeAttr("style")}});return this};u.prototype.search=function(e,t){if(e&&K.check(e)){Y[e]=Q.extend(true,{},Y[e]||X,{first:true,searchVal:t});K.triggerSearch(Q('dl[xid="'+e+'"]').parents("."+P),true)}return this};u.prototype.replace=function(e,t,n){var i=this;if(!e||!t||!n){K.log("id: "+e+" param error !!!");return this}if(!K.check(e,true)){K.log("id: "+e+" not render !!!");return this}var a=this.value(e,"val");this.value(e,[]);this.config(e,n);if(t=="local"){K.renderData(e,n.arr,n.linkage==true,n.linkageWidth?n.linkageWidth:"100",false,true);this.value(e,a,true)}else if(t=="server"){K.ajax(e,n.url,n.keyword,n.linkage==true,n.linkageWidth?n.linkageWidth:"100",false,function(e){i.value(e,a,true)},true)}};layui.link(rootPath+'module/formSelects.css');return new u}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/laydatePlus.js b/public/static/assets/gougu/module/laydatePlus.js new file mode 100644 index 0000000..51ad2ee --- /dev/null +++ b/public/static/assets/gougu/module/laydatePlus.js @@ -0,0 +1,181 @@ +layui.define(['layer'],function(exports){ + //提示:模块也可以依赖其它模块,如:layui.define('layer', callback); + let laydate = layui.laydate; + const opts={ + "target":'laydateplus', + "type":'date', + "rangeLinked":false, + "callback": null + }; + var laydatePlus = function(options){ + this.settings = $.extend({}, opts, options); + let me = this; + $('#'+this.settings.target).click(function(){ + me.init(); + }); + }; + laydatePlus.prototype = { + init: function () { + var me = this; + + let shortcuts = [ + { + text: "昨天", + value: function(){ + var value = []; + var date1 = new Date(); + date1.setDate(date1.getDate() - 1); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(); + date2.setDate(date2.getDate() - 1); + date2.setHours(23, 59, 59, 999); + value.push(new Date(date2)); + return value; + }() + }, + { + text: "今天", + value: function(){ + var value = []; + var date1 = new Date(); + date1.setDate(date1.getDate()); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(); + date2.setDate(date2.getDate()); + date2.setHours(23, 59, 59, 999); + value.push(new Date(date2)); + return value; + }() + }, + { + text: "最近7天", + value: function(){ + var value = []; + var date1 = new Date(); + date1.setDate(date1.getDate() - 7); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(); + date2.setHours(23, 59, 59, 999); + value.push(new Date(date2)); + return value; + }() + }, + { + text: "最近30天", + value: function(){ + var value = []; + var date1 = new Date(); + date1.setDate(date1.getDate() - 30); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(); + date2.setHours(23, 59, 59, 999); + value.push(new Date(date2)); + return value; + }() + }, + { + text: "本周", + value: function(){ + var value = []; + var today = new Date(); + var date1 = new Date(today.setDate(today.getDate() - today.getDay() + (today.getDay() === 0 ? -6 : 1))); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(today.setDate(today.getDate() + 6)); + date2.setHours(23, 59, 59, 999); + value.push(new Date(date2)); + return value; + }() + }, + { + text: "上周", + value: function(){ + var value = []; + var today = new Date(); + var lastWeek = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7); + var date1 = new Date(lastWeek.getFullYear(), lastWeek.getMonth(), lastWeek.getDate() - lastWeek.getDay() + 1); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(lastWeek.getFullYear(), lastWeek.getMonth(), lastWeek.getDate() - lastWeek.getDay() + 7); + date2.setHours(23, 59, 59, 999); + value.push(new Date(date2)); + return value; + }() + }, + { + text: "上个月", + value: function(){ + var value = []; + var date1 = new Date(); + date1.setMonth(date1.getMonth() - 1); + date1.setDate(1); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(); + date2.setDate(1); + date2.setHours(0, 0, 0, 0); + date2 = date2.getTime() - 1; + value.push(new Date(date2)); + return value; + }() + }, + { + text: "这个月", + value: function(){ + var value = []; + var date1 = new Date(); + date1.setDate(1); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(); + date2.setMonth(date2.getMonth() + 1); + date2.setDate(1); + date2.setHours(0, 0, 0, 0); + date2 = date2.getTime() - 1; + value.push(new Date(date2)); + return value; + }() + }, + { + text: "下个月", + value: function(){ + var value = []; + var date1 = new Date(); + date1.setMonth(date1.getMonth() + 1); + date1.setDate(1); + date1.setHours(0, 0, 0, 0); + value.push(date1); + var date2 = new Date(); + date2.setMonth(date2.getMonth() + 2); + date2.setDate(1); + date2.setHours(0, 0, 0, 0); + date2 = date2.getTime() - 1; + value.push(new Date(date2)); + return value; + }() + } + ]; + // 日期时间范围 + laydate.render({ + elem: '#'+me.settings.target, + type: me.settings.type, + range: '~', + trigger: 'none', + rangeLinked:me.settings.rangeLinked, + shortcuts: shortcuts, + show:true, + done: function(value, date, endDate){ + if (typeof me.settings.callback === 'function') { + me.settings.callback(value, date, endDate); + } + } + }); + } + } + //输出接口 + exports('laydatePlus', laydatePlus); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/oaCheck.js b/public/static/assets/gougu/module/oaCheck.js new file mode 100644 index 0000000..7340687 --- /dev/null +++ b/public/static/assets/gougu/module/oaCheck.js @@ -0,0 +1,695 @@ +layui.define(['tool','oaPicker','uploadPlus'], function (exports) { + const layer = layui.layer; + const form = layui.form; + const tool = layui.tool; + const uploadPlus = layui.uploadPlus; + const opts={ + "checkBox":"checkBox",//审核容器id + "checking_btn":"",//待审核状态下自定义添加的按钮 + "checked_btn":"",//审核通过自定义添加的按钮 + "check_name": "",//审核类型标识 + "check_btn":1,//是否显示提交审核按钮 + "check_ok":function(){ + //审核通过的执行函数 + }, + "check_no":function(){ + //审核拒绝的执行函数 + }, + "check_back":function(){ + //撤回的执行函数 + }, + "check_reversed":function(){ + //反确认的执行函数 + } + }; + const obj = { + loading:false, + checkStatus: function (status) { + statusArray = ['待提交审批','审批中','审批通过','审批不通过','已撤回']; + return ''+statusArray[status]+''; + }, + statusTemplate: function (status) { + let me = this; + let tem =` +
              + + + + `; + return tem; + }, + uidsTemplate: function () { + let tem =` + + + `; + return tem; + }, + flowTemplate: function (data) { + let flowtype=''; + if(data && data.length>0){ + for(let i=0;i'+data[i].title+''; + } + } + let tem =` + + + + + `; + return tem; + }, + copyTemplate: function (detail) { + let me = this; + let tem =` + + + + + `; + return tem; + }, + btnTemplate: function () { + let me = this; + let tem =` +
              + + + ${me.sets.checking_btn} +
              + `; + if(me.sets.check_btn == 1){ + return tem; + }else{ + return ''; + } + }, + recordTemplate: function (record) { + let me = this; + let tem =''; + if(record.length>0){ + tem+=''; + } + return tem; + }, + createTemplate: function (flow) { + let me = this; + let checkHtml = ` + +

              审批操作

              +
              数据行 + $(p).find("td").not(e.settings.exclude).each(function (i, q) { + // Reset for this column + additionalStyles = ""; + // Preserve background and text colors on the row + if(e.settings.preserveColors){ + let compStyle = getComputedStyle(q); + additionalStyles += (compStyle && compStyle.backgroundColor ? "background-color: " + compStyle.backgroundColor + ";" : ""); + additionalStyles += (compStyle && compStyle.color ? "color: " + compStyle.color + ";" : ""); + } + + //的样式 + var tdStyles = "background-color:#8DB4E2;";//合计行的样式 + var rc = { + rows: $(this).attr("rowspan"), + cols: $(this).attr("colspan"), + align:$(this).attr("align"), + flag: $(q).find(e.settings.exclude) + }; + var align=''; + if( rc.align && rc.align.length > 1 ) { + align =' align="'+rc.align+'" valign="center" '; + } + if (rc.flag.length > 0) { + tempRows += " 0) { + tempRows += " rowspan='" + rc.rows + "' ";//跨行 + } + if (rc.cols > 0) { + tempRows += " colspan='" + rc.cols + "' ";//跨列 + } + var subtotal = getSubtotal(e.settings);//获取"合计"行所在的行号(不包括标题行) + if (rowNumber == subtotal) {//if(当前行行号 == 合计行行号) + if (tdStyles) { + tempRows += " style='mso-number-format:\"\@\"; " + tdStyles + "' ";//样式 + } + else { + tempRows += " style='mso-number-format:\"\@\";' ";//纯文本 + } + } + else { + if(additionalStyles!=''){ + tempRows += " style='" + additionalStyles + "'"; + } + else{ + tempRows += " style='mso-number-format:\"\@\";' ";//纯文本 + } + } + tempRows += ">" + $(q).html() + "
              审批状态${me.checkStatus(status)}
              审批人* + +
              审批流程* + +
              抄送人 + +
              审批记录
                '; + for(let l=0;l。'; + } + tem+='
              • \ + \ +

                '+record[l].check_time_str+''+record[l].name+'『'+record[l].status_str+'』了此申请。'+check_content+'

                '; + let file_array= record[l].file_array; + if(file_array.length>0){ + tem+='

                审批附件:

                '; + for(let f=0;f'; + } + tem+='
                '; + } + tem+='
              • '; + } + tem+='
              + ${me.flowTemplate(flow)} + ${me.uidsTemplate()} + ${me.copyTemplate(flow[0])} +
              + + `; + return checkHtml; + }, + //审批待提交模版 + initTemplate: function (detail) { + let me = this; + let checkHtml = ` +
              +

              审批操作

              + + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} + ${me.flowTemplate(detail.flow)} + ${me.uidsTemplate()} + ${me.copyTemplate(detail)} +
              + ${me.btnTemplate()} +
              + `; + let viewHtml = ` +
              +

              审批操作

              + + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} +
              +
              + `; + if(detail.is_creater==1){ + return checkHtml; + } + else{ + return viewHtml; + } + }, + //审批中模版 + checkTemplate: function (detail) { + let me = this,flowHtml='',list = detail.nodes; + for(var f=0;f1){ + check_types= ' 会签'; + if(list[f].check_types==2){ + check_types= ' 或签'; + } + } + } + if(list[f].check_role == 0 || list[f].check_role == 5){ + checkUser=list[f].check_uids_info[0].name; + } + if(list[f].check_role == 1 || list[f].check_role == 2 || list[f].check_role == 3 || list[f].check_role == 4){ + checkUser=list[f].flow_name; + } + if(list[f].check_list.length>0){ + let one=0,two=0,three=0; + for(var m=0;m 0){ + iconStatus =''; + strStatus ='
              拒绝
              '; + } + else{ + if(one > 0){ + iconStatus =''; + strStatus ='
              待审批
              '; + } + else{ + iconStatus =''; + strStatus ='
              通过
              '; + } + } + } + //或签 + if(list[f].check_types==2){ + if(two > 0){ + iconStatus =''; + strStatus ='
              通过
              '; + } + else{ + iconStatus =''; + strStatus ='
              拒绝
              '; + } + } + } + flowHtml+= '
              '+iconStatus+'
              '+check_types+checkUser+'
              '+strStatus+iconRight+'
              '; + } + + let checkCopy=`抄送人${detail.copy_unames}`; + + let checkNode = ` + 审批节点 * + + + +
              + +
              + + + `; + + let checkContent = ` + 审批附件 + +
              + + + + 审批意见 + + + + `; + + let btnCheck=' 通过 拒绝'; + + if(detail.step.check_role==5){ + btnCheck=' 通过 退回'; + } + + let btnBack=' 撤回'; + let btnCheckBack='反确认审核'; + let btnExport='审批单导出打印'; + + let checkHtml = ` +
              +

              审批操作

              + + + + + + + + ${checkCopy} + + + + + ${me.recordTemplate(detail.check_record)} + ${detail.is_checker==1 && detail.step.check_role==0?checkNode:''} + ${detail.is_checker==1?checkContent:''} +
              审批状态${me.checkStatus(detail.check_status)}当前审批人${detail.check_unames}
              审批流 +
              +
              + +
              ${detail.admin_name}
              +
              创建
              + +
              + ${flowHtml} +
              +
              +
              + + ${detail.is_checker==1?btnCheck:''} + ${detail.is_creater==1 && detail.is_back==1 && (detail.check_status==1 || detail.check_status==3)?btnBack:''} + ${detail.is_reversed == 1 && detail.is_creater==1 && typeof me.sets.check_reversed ==='function' && detail.check_status==2?btnCheckBack:''} + ${detail.is_export == 1 && detail.check_status==2?btnExport:''} + ${detail.check_status==2?me.sets.checked_btn:''} +
              +
              + `; + return checkHtml; + }, + //审批撤回模版 + backTemplate: function (detail) { + let me = this; + let btnHtml =''; + if(me.sets.check_btn == 1){ + btnHtml ='
              '; + } + let checkHtml = ` +
              +

              审批操作

              + + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} + ${me.flowTemplate(detail.flow)} + ${me.uidsTemplate()} + ${me.copyTemplate(detail)} +
              + ${me.btnTemplate()} +
              + `; + let viewHtml = ` +
              +

              审批操作

              + + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} +
              +
              + `; + if(detail.is_creater==1 && detail.is_back==1){ + return checkHtml; + } + else{ + return viewHtml; + } + }, + submit:function(data,callback){ + tool.post("/api/check/submit_check", data, callback); + }, + init: function (options) { + this.sets = $.extend({}, opts, options); + let me = this; + let checkBox = $('#'+me.sets.checkBox); + let action_id = checkBox.data('id'); + let check_status = checkBox.data('status'); + let check_flow_id = checkBox.data('checkflowid'); + if(action_id === undefined || check_status === undefined || check_flow_id === undefined){ + return false; + } + //获取审批信息 + $.ajax({ + url: "/api/check/get_flow_nodes", + type:'get', + data:{check_name:me.sets.check_name,action_id:action_id,flow_id:check_flow_id}, + success: function (e) { + if (e.code == 0) { + if(check_status==0){ + if(action_id==0){ + if(e.data.length>0){ + checkBox.append(me.createTemplate(e.data)); + } + else{ + let none = '

              审批操作

              \ + \ + \ + \ + \ + \ +
              审批流程*
              '; + checkBox.append(none); + } + } + else{ + checkBox.append(me.initTemplate(e.data)); + } + } + else if(check_status==4){ + checkBox.append(me.backTemplate(e.data)); + } + else{ + checkBox.append(me.checkTemplate(e.data)); + var fileUp = new uploadPlus({ + "target":'uploadBtnCheck', + "targetBox":'uploadBoxCheck', + }); + } + form.render(); + } + } + }) + + //选择审批流 + form.on('select(flowtype)', function(data){ + var check_type = data.elem[data.elem.selectedIndex].title; + if(data.value==''){ + $('#checkTR').html(me.uidsTemplate()); + checkBox.find('[name="check_copy_unames"]').val(''); + checkBox.find('[name="check_copy_uids"]').val(''); + form.render(); + return false; + } + if(check_type == 1){ + $('#checkTR').html(me.uidsTemplate()); + form.render(); + } + $.ajax({ + url: "/api/check/get_flow_users", + type:'get', + data:{id:data.value}, + success: function (e) { + if (e.code == 0) { + var flow_li='',flow_idx=0; + var flow_data = e.data.flow_data; + if(e.data.copy_uids && e.data.copy_uids !=''){ + checkBox.find('[name="check_copy_unames"]').val(e.data.copy_unames); + checkBox.find('[name="check_copy_uids"]').val(e.data.copy_uids.split(',')); + } + if(check_type == 2 || check_type == 3){ + for(var a=0;a0){ + flow_idx++; + for(var b=0;b'+check_uids_info[b].name+''; + } + flow_li+='
            • \ + \ +
              \ +

              第'+flow_idx+'级审批『'+check_role+'』'+check_types+'

              \ +
                '+user_li+'
              \ +
              \ +
            • '; + } + } + if(flow_li==''){ + flow_li='审批流程错误,请联系管理员设置'; + } + formHtml = '审批流\ + \ +
                '+flow_li+'
              \ + '; + $('#checkTR').html(formHtml); + } + } + } + }) + }); + + //提交审批 + form.on('submit(checkform)', function(data){ + data.field.action_id = action_id; + data.field.check_name = me.sets.check_name; + let callback = function (e) { + layer.msg(e.msg); + if (e.code == 0) { + tool.sideClose(1000); + } + } + if(typeof me.sets.post_form ==='string' && typeof me.sets.post_url ==='string'){ + let postData = form.val(me.sets.post_form); + tool.post(me.sets.post_url, postData, function(res){ + if (res.code == 0) { + tool.post("/api/check/submit_check", data.field, callback); + } + else{ + layer.msg(res.msg); + } + }); + } + else{ + tool.post("/api/check/submit_check", data.field, callback); + } + return false; + }); + + //审批操作按钮 + checkBox.on('click','.btn-check', function(data){ + let content=checkBox.find('[name="content"]').val(); + let check_status=$(this).data('status'); + let check_role = checkBox.find('input[name="check_role"]').val(); + + let check_node=0,check_uids='',check_files=''; + if(check_role == 0 && check_status==1){ + check_node = checkBox.find('input[name="check_node"]:checked').val(); + check_uids = checkBox.find('input[name="check_uids"]').val(); + if(!check_node){ + layer.msg('请选择下一审批节点'); + return false; + } + if(check_node == 2 && check_uids==''){ + layer.msg('请选择下一审批人'); + return false; + } + } + if(check_status ==1 || check_status==2){ + let check_files = checkBox.find('input[name="check_files"]').val(); + let confirmTips='确定通过该审批?'; + if(check_status==2){ + confirmTips='确定拒绝该审批?'; + if(content==''){ + layer.msg('请输入审批意见'); + return false; + } + } + tool.ask(confirmTips, function(index){ + if(typeof me.sets.post_form ==='string' && typeof me.sets.post_url ==='string'){ + let postData = form.val(me.sets.post_form); + tool.post(me.sets.post_url, postData, function(res){ + if (res.code == 0) { + $.ajax({ + url: "/api/check/flow_check", + type:'post', + data:{ + action_id:action_id, + check_name:me.sets.check_name, + check_flow_id:check_flow_id, + check_node:check_node, + check_uids:check_uids, + check:check_status, + check_files:check_files, + content:content + }, + success: function (e) { + layer.msg(e.msg); + if (e.code == 0) { + if(e.data.check_status==2 && typeof me.sets.check_ok ==='function'){ + me.sets.check_ok(e); + } + if(e.data.check_status==3 && typeof me.sets.check_no ==='function'){ + me.sets.check_no(e); + } + tool.sideClose(1000); + } + } + }) + } + else{ + layer.msg(res.msg); + } + }); + } + else{ + $.ajax({ + url: "/api/check/flow_check", + type:'post', + data:{ + action_id:action_id, + check_name:me.sets.check_name, + check_flow_id:check_flow_id, + check_node:check_node, + check_uids:check_uids, + check:check_status, + check_files:check_files, + content:content + }, + success: function (e) { + layer.msg(e.msg); + if (e.code == 0) { + if(e.data.check_status==2 && typeof me.sets.check_ok ==='function'){ + me.sets.check_ok(e); + } + if(e.data.check_status==3 && typeof me.sets.check_no ==='function'){ + me.sets.check_no(e); + } + tool.sideClose(1000); + } + } + }) + } + layer.close(index); + }); + } + else if(check_status ==3){ + $(parent.$('.express-close')).addClass('parent-colse'); + layer.prompt({ + formType: 2, + title: '请输入撤回理由', + area: ['480px', '120px'] //自定义文本域宽高 + }, function(value, index, elem){ + if(value==''){ + layer.msg('请输入撤回理由'); + return false; + } + $.ajax({ + url: "/api/check/flow_check", + type:'post', + data:{ + action_id:action_id, + check_name:me.sets.check_name, + check_flow_id:check_flow_id, + check:check_status, + content:value + }, + success: function (e) { + layer.msg(e.msg); + if (e.code == 0) { + if(e.data.check_status==4 && typeof me.sets.check_back ==='function'){ + me.sets.check_back(e); + } + tool.sideClose(1000); + } + } + }) + $(parent.$('.express-close')).removeClass('parent-colse'); + layer.close(index); + }); + } + else if(check_status ==4){ + $(parent.$('.express-close')).addClass('parent-colse'); + layer.prompt({ + formType: 2, + title: '请输入反确认理由', + area: ['480px', '120px'] //自定义文本域宽高 + }, function(value, index, elem){ + if(value==''){ + layer.msg('请输入反确认理由'); + return false; + } + $.ajax({ + url: "/api/check/flow_check", + type:'post', + data:{ + action_id:action_id, + check_name:me.sets.check_name, + check_flow_id:check_flow_id, + check:check_status, + content:value + }, + success: function (e) { + layer.msg(e.msg); + if (e.code == 0) { + if(e.data.check_status==0 && typeof me.sets.check_reversed ==='function'){ + me.sets.check_reversed(e); + } + tool.sideClose(1000); + } + } + }) + $(parent.$('.express-close')).removeClass('parent-colse'); + layer.close(index); + }); + } + return false; + }); + + } + }; + exports('oaCheck', obj); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/oaComment.js b/public/static/assets/gougu/module/oaComment.js new file mode 100644 index 0000000..be9f980 --- /dev/null +++ b/public/static/assets/gougu/module/oaComment.js @@ -0,0 +1,162 @@ +layui.define(['tool','oaPicker'], function (exports) { + const layer = layui.layer, tool = layui.tool; + const opts={ + "box":'commentBox',//容器id + "input": 'commentInput', + "total": 'commentTotal', + "topic_id":0, + "module": '', + "callback":function(e){ + layer.msg(e.msg); + if(e.code==0){ + setTimeout(function(){ + obj.load(); + },1000) + } + } + }; + const obj = { + load: function () { + let me = this; + let topic_id = me.sets.topic_id, module = me.sets.module; + let page=1; + let callback = function (res) { + layer.closeAll(); + me.template(res,page); + } + tool.get("/api/comment/datalist", {topic_id: topic_id,module: module,page:page}, callback); + }, + template:function(res,page){ + let me = this; + if (res.code == 0 && res.data.length > 0) { + let itemComment = ''; + $.each(res.data, function (index, item) { + let to_names = '', ops = '' ,ptext=''; + if (item.to_names !='' && item.to_names !='-') { + to_names = '@' + item.to_names + ''; + } + if (item.admin_id == login_admin) { + ops = `编辑删除`; + } + else{ + ops = `回复`; + } + if(item.pid>0){ + ptext=`
              回复『${item.padmin}』${item.ptimes}的评论${item.pcontent}
              `; + } + itemComment += ` +
              +
              + +
              +
              +
              + ${item.name}${item.create_times}${item.update_times} +
              +
              ${to_names} ${item.content}
              + ${ptext} +
              ${ops}
              +
              +
              + `; + }); + if(res.data.length>19){ + page++; + itemComment+='
              '; + } + $('#'+me.sets.box).html(itemComment).data('page',page); + $('#'+me.sets.total).html(res.totalRow.total); + } + else{ + if(page ==1){ + $('#'+me.sets.box).html('
              暂无记录
              '); + } + } + }, + add: function (id,content,pid,to_uids) { + let me = this; + if (content == '') { + layer.msg('请完善评论内容'); + return false; + } + let postData = { id: id, topic_id: me.sets.topic_id, pid: pid, to_uids: to_uids, module: me.sets.module, content: content}; + tool.post("/api/comment/add", postData, me.sets.callback); + }, + del: function (id) { + let me = this; + layer.confirm('确定删除该评论吗?', { + icon: 3, + title: '提示' + }, function (index) { + tool.delete("/api/comment/del", { id: id }, me.sets.callback); + layer.close(index); + }); + }, + //文本 + textarea: function (id,txt, pid, to_uid, to_uname) { + let that = this; + let display='',usersInput='',height='286px'; + if(id==0){ + usersInput='
              '; + height='320px'; + } + $(parent.$('.express-close')).addClass('parent-colse'); + layer.open({ + type: 1, + title: '请输入评论内容', + area: ['600px', height], + content: '
              '+usersInput+'
              ', + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + btnAlign: 'c', + btn: ['提交保存'], + yes: function () { + let to_uids = $("#to_uids").val(); + let newval = $("#editTextarea").val(); + if (newval != '') { + that.add(id,newval,pid,to_uids); + } else { + layer.msg('请输入评论内容'); + } + } + }) + }, + init: function (options) { + this.sets = $.extend({}, opts, options); + let me = this; + let commentBox = $('#'+me.sets.box); + me.load(); + $('#'+me.sets.input).on('click', function () { + me.textarea(0,'',0,0,''); + }) + //回复 + commentBox.on('click', '[data-event="replay"]', function () { + let pid = $(this).data('id'); + let to_uid = $(this).data('uid'); + let to_unames = $(this).data('unames'); + me.textarea(0,'',pid,to_uid,to_unames); + }) + //编辑 + commentBox.on('click', '[data-event="edit"]', function () { + let id = $(this).data('id'); + let content = commentBox.find('#comment_' + id).data('content'); + me.textarea(id,content,0,0,''); + }) + //删除 + commentBox.on('click', '[data-event="del"]', function () { + let id = $(this).data('id'); + me.del(id); + }) + //加载更多 + commentBox.on('click','.log-more',function(){ + let page = commentBox.data(page); + let callback = function (res) { + me.template(res,page); + } + tool.get("/api/comment/datalist", {topic_id: me.sets.topic_id,module: me.sets.module,page:page}, callback); + }); + } + }; + exports('oaComment', obj); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/oaEdit.js b/public/static/assets/gougu/module/oaEdit.js new file mode 100644 index 0000000..4515551 --- /dev/null +++ b/public/static/assets/gougu/module/oaEdit.js @@ -0,0 +1,390 @@ +layui.define(['tool','oaPicker','tinymce'],function(exports){ + let layer = layui.layer,tool=layui.tool,laydate = layui.laydate,dropdown = layui.dropdown,oaPicker = layui.oaPicker,tinymce = layui.tinymce; + const opts={ + "box":'editBox',//编辑容器id + "id":0,//编辑容器id + "url": '', + "dropdown":{}, + "callback":function(e){ + layer.msg(e.msg); + if(e.code==0){ + setTimeout(function(){ + location.reload(); + },1000) + } + } + }; + + const obj = { + log: function (box,name,action_id) { + let page=1; + let callback = function (res) { + if (res.code == 0 && res.data.length > 0) { + let itemLog = '',logTime=''; + $.each(res.data, function (index, item) { + let detail = ""; + if(logTime != item.create_time){ + if(logTime==''){ + itemLog+='
              '+item.create_time+'
              ' + } + else{ + itemLog+='
              '+item.create_time+'
              ' + } + logTime = item.create_time; + } + detail= ` + ${item.field_name}${item.old_content} ${item.action}为 ${item.new_content}${item.times} + `; + + if(item.field=='new'){ + detail= ` + 创建了该数据记录${item.times} + `; + } + + itemLog+= ` +
              ${item.admin_name}${detail}
              + `; + }); + itemLog+='
              '; + if(res.data.length>19){ + itemLog+='
              '; + } + $("#"+box).html(itemLog); + $('#'+box+'Total').html(res.action.total); + } + else{ + if(page ==1){ + $("#"+box).html('
              暂无记录
              '); + } + } + } + tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback); + $("#"+box).on('click','.log-more',function(){ + page++; + tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback); + }); + }, + //短文本 + text: function (that) { + let me = this; + let field = that.data('field'); + let text = that.data('text'); + if (typeof(text) == "undefined") { + text = that.text(); + } + $(parent.$('.express-close')).addClass('parent-colse'); + layer.open({ + type: 1, + title: '请输入内容', + area: ['360px', '158px'], + content: '
              ', + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + btnAlign: 'c', + btn: ['提交保存'], + yes: function () { + let val = $("#oaEditText").val(); + if (val != '') { + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } else { + layer.msg('请输入内容'); + } + } + }) + }, + //长文本 + textarea: function (that) { + let me = this; + let field = that.data('field'); + let target = that.data('target'); + let textarea=''; + if (typeof(target) == "undefined") { + textarea = that.text(); + } + else{ + textarea = $('#'+target).text(); + } + $(parent.$('.express-close')).addClass('parent-colse'); + layer.open({ + type: 1, + title: '请输入内容', + area: ['600px', '320px'], + content: '
              ', + btnAlign: 'c', + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + btn: ['提交保存'], + yes: function () { + let val = $("#oaEditTextarea").val(); + if (val != '') { + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } else { + layer.msg('请输入内容'); + } + } + }) + }, + //数字 + num: function (that) { + let me = this; + let field = that.data('field'); + let text = that.data('text'); + let min = that.data('min'); + let max = that.data('max'); + if (typeof(min) == "undefined") { + min = ''; + } + if (typeof(max) == "undefined") { + max = ''; + } + if (typeof(text) == "undefined") { + text = that.text(); + } + $(parent.$('.express-close')).addClass('parent-colse'); + layer.open({ + type: 1, + title: '请输入数字', + area: ['200px', '158px'], + content: '
              ', + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + btnAlign: 'c', + btn: ['提交保存'], + yes: function () { + let val = $("#oaEditNum").val(); + if (val != '') { + if(min !='' && valmax){ + layer.msg('输入数字不能大于'+max); + return false; + } + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } else { + layer.msg('请输入内容'); + } + } + }) + }, + dropdown: function (that) { + let me = this; + let field = that.data('field'); + let text = that.data('text'); + let cancel = that.data('cancel'); + let arrayidx = that.data('array'); + if (typeof(text) == "undefined") { + text = that.text(); + } + if (typeof(cancel) == "undefined") { + cancel = 0; + } + let data = me.sets.dropdown[arrayidx]; + let len = data.length; + while (len--) { + if (data[len].id == text) { + data.splice(len, 1); + } + } + if (data.length == 0) { + layer.msg('无可关联的内容'); + return false; + } + if (cancel==1) { + data.push({ id: 0, title: '取消关联' }); + } + dropdown.render({ + elem: that, + show: true, + data: data, + click: function (data, othis) { + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = data.id; + tool.post(me.sets.url,postData,me.sets.callback); + } + }); + }, + oadate: function (that) { + let me = this; + let type = that.data('type'); + let range = that.data('range'); + let min = that.data('min'); + let max = that.data('max'); + if (typeof(type) == "undefined" || type === '') { + type = 'date'; + } + if (typeof(range) == "undefined" || type === '') { + range = false; + } + if (typeof(min) == "undefined" || min === '') { + min = '1900-1-1'; + } + if (typeof(max) == "undefined" || max === '') { + max = '2099-1-1'; + } + let field = that.data('field'); + let text = that.data('text'); + if (typeof(text) == "undefined") { + text = that.text(); + } + layui.laydate.render({ + elem: that, + show: true, + type: type, + range: range, + min: min, + max: max, + fullPanel: true, + done: function (val, date) { + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } + }); + }, + adminpicker: function (that){ + let me = this; + let field = that.data('field'); + let ids = that.data('ids'); + let names = that.data('names'); + let type = that.data('type'); + if (typeof(type) == "undefined") { + type = 1; + } + oaPicker.employeeInit({ + ids:ids.toString(), + names:names.toString(), + type:type, + callback:function(seleted){ + let select_id=[],select_name=[]; + for(var a=0; a', + btnAlign: 'c', + btn: ['提交保存'], + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + success:function(){ + var edit = tinymce.render({ + selector: "#oaEditEditor"+index, + images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口 + height: 480 + }); + }, + yes: function () { + let val = tinyMCE.editors['oaEditEditor'+index].getContent(); + if (val != '') { + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } else { + layer.msg('请输入内容'); + } + } + }) + }, + init: function (options) { + this.sets = $.extend({}, opts, options); + let me = this; + let editBox = $('#'+me.sets.box); + editBox.find('.click-edit').addClass('on'); + editBox.on('click','.click-edit',function(){ + let that = $(this); + let types = that.data('types'); + switch (types) { + case "num": + me.num(that); + break; + case "oadate": + me.oadate(that); + break; + case "textarea": + me.textarea(that); + break; + case "dropdown": + me.dropdown(that); + break; + case "adminpicker": + me.adminpicker(that); + break; + case "picker": + me.picker(that); + break; + case "editor": + me.editor(that); + break; + default: + me.text(that); + } + }) + } + } + //输出接口 + exports('oaEdit', obj); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/oaFlow.js b/public/static/assets/gougu/module/oaFlow.js new file mode 100644 index 0000000..7a5a9f8 --- /dev/null +++ b/public/static/assets/gougu/module/oaFlow.js @@ -0,0 +1,247 @@ +layui.define(['tool'], function (exports) { + const layer = layui.layer; + const form = layui.form; + const tool = layui.tool; + const dropdown = layui.dropdown; + const opts={ + "flowBox":'flowBox', + "flowBar":'flowBar', + "callback": null + }; + const obj = { + loading:false, + size:1.0, + //节点模版 + nodeApend: function (types,nodeId) { + let nodeHtml = ''; + if(types == 1){ + //审核人 + nodeHtml = `
              +
              +
              + 审核人 + +
              +
              + 请设置审核人 + +
              +
              +
              +
              + +
              +
              +
              `; + } + else if(types == 2){ + //抄送人 + nodeHtml = `
              +
              +
              + 抄送人 + +
              +
              + 请设置抄送人 + +
              +
              +
              +
              + +
              +
              +
              `; + } + else if(types==3){ + //条件分支 + nodeHtml = `
              +
              +
              + 添加条件分支 +
              +
              +
              +
              +
              + + 优先级1 + +
              +
              + 请设置条件 +
              +
              +
              +
              + +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              + + 优先级2 +
              +
              + 如存在未满足其他分支条件的情况,则进入此分支 +
              +
              +
              +
              + +
              +
              +
              +
              +
              +
              +
              +
              +
              +
              + +
              +
              +
              +
              +
              `; + } + else{ + //条件内容 + nodeHtml = `
              +
              +
              +
              +
              + + 优先级1 + +
              +
              + 请设置条件 +
              +
              +
              +
              + +
              +
              +
              +
              +
              `; + } + return nodeHtml; + }, + init: function (options) { + this.settings = $.extend({}, opts, options); + let me = this; + let flowBox = $('#'+me.settings.flowBox); + let flowBar = $('#'+me.settings.flowBar); + //添加节点 + flowBox.on("click",".add-node",function(e){ + let that = $(this); + dropdown.render({ + elem: that, + show: true, // 外部事件触发即显示 + data: [{ + title: '审 核 人', + id: '1', + templet: function(d){ + return ' ' + d.title; + } + }, { + title: '抄 送 人', + id: '2', + templet: function(d){ + return ' ' + d.title; + } + }, { + title: '条件分支', + id: '3', + templet: function(d){ + return ' ' + d.title; + } + }], + click: function(data, othis){ + let timestamp = new Date().getTime(); + that.parent().parent().parent().parent().after(me.nodeApend(data.id,timestamp)); + } + }); + }); + + //添加条件 + flowBox.on("click",".add-branch",function(e){ + let timestamp = new Date().getTime(); + $(this).parent().find(".col-box").first().after(me.nodeApend(4,timestamp)); + let branchWrap = $($(this).parents(".branch-wrap")[0]); + let colBbox = branchWrap.find('.col-box'); + colBbox.each(function(index,item){ + $(item).find('.condition-priority').html('优先级'+(index+1)); + if(index3){ + layer.msg('已经是最大了'); + return false; + } + me.size = size; + flowBox.css("transform","scale("+size+")"); + flowBar.find('.zoom-num').html((size*100)+'%'); + }) + } + }; + exports('oaFlow', obj); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/oaNumber.js b/public/static/assets/gougu/module/oaNumber.js new file mode 100644 index 0000000..f649942 --- /dev/null +++ b/public/static/assets/gougu/module/oaNumber.js @@ -0,0 +1,119 @@ +layui.define([], function (exports) { + let oaNumber = { + // 加法函数 + accAdd:function(arg1, arg2) { + var r1, r2, m; + try { + // 获取到小数点的位数 + r1 = arg1.toString().split(".")[1].length; + } catch (e) { + r1 = 0; + } + try { + r2 = arg2.toString().split(".")[1].length; + } catch (e) { + r2 = 0; + } + // 取位数最大的 10^ n次方 + m = Math.pow(10, Math.max(r1, r2)); + return (arg1 * m + arg2 * m) / m; + }, + //减法函数 + accSub:function(arg1, arg2) { + var r1, r2, m, n; + try { + r1 = arg1.toString().split(".")[1].length; + } catch (e) { + r1 = 0; + } + try { + r2 = arg2.toString().split(".")[1].length; + } catch (e) { + r2 = 0; + } + m = Math.pow(10, Math.max(r1, r2)); // 动态控制精度长度 + // 计算结果保留的位数 + n = (r1 >= r2) ? r1 : r2; + return parseFloat(((arg1 * m - arg2 * m) / m).toFixed(n)); + }, + //乘法函数 + accMul:function(arg1, arg2) { + var m = 0, + s1 = arg1.toString(), + s2 = arg2.toString(); + try { + m += s1.split(".")[1].length; + } catch (e) { + } + try { + m += s2.split(".")[1].length; + } catch (e) { + } + return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); + }, + //除法函数 + accDiv(arg1, arg2) { + var t1 = 0, + t2 = 0, + r1, r2; + try { + t1 = arg1.toString().split(".")[1].length; + } catch (e) { + } + try { + t2 = arg2.toString().split(".")[1].length; + } catch (e) { + } + with (Math) { + r1 = Number(arg1.toString().replace(".", "")); + r2 = Number(arg2.toString().replace(".", "")); + return (r1 / r2) * pow(10, t2 - t1); + } + }, + //千分号格式化金额 + accFormat:function (num) { + if (typeof num !== 'number') { + return '-'; + } + if(num=='-'||num==''){ + return '-'; + } + var res=num.toString().replace(/\d+/, function(n){ // 先提取整数部分 + return n.replace(/(\d)(?=(\d{3})+$)/g,function($1){ + return $1+","; + }); + }) + return res; + }, + //金额转人民币大写 + accCny:function(num){ + if (typeof num !== 'number') { + return '-'; + } + if (num === 0) { + return '零元整'; + } + const fraction = ['角', '分']; + const digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; + const unit = [['元', '万', '亿'], ['', '拾', '佰', '仟']]; + let head = num < 0 ? '欠' : ''; + num = Math.abs(num); + let s = ''; + for (let i = 0; i < fraction.length; i++) { + s += (digit[Math.floor(num * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, ''); + } + s = s || '整'; + num = Math.floor(num); + for (let i = 0; i < unit[0].length && num > 0; i++) { + let p = ''; + for (let j = 0; j < unit[1].length && num > 0; j++) { + p = digit[num % 10] + unit[1][j] + p; + num = Math.floor(num / 10); + } + s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; + } + return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整'); + } + }; + exports('oaNumber', oaNumber); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/oaPicker.js b/public/static/assets/gougu/module/oaPicker.js new file mode 100644 index 0000000..0061f8c --- /dev/null +++ b/public/static/assets/gougu/module/oaPicker.js @@ -0,0 +1,539 @@ +layui.define(['tool'], function (exports) { + const layer = layui.layer, tool = layui.tool,form=layui.form, table=layui.table,tree = layui.tree; + + const dataPicker ={ + 'department':{ + title:'选择部门', + url:'/api/index/get_department', + area: ['400px', '524px'], + searchbar:'', + page:false, + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'部门名称'}] + }, + 'position':{ + title:'选择岗位', + url:'/api/index/get_position', + area: ['400px', '524px'], + searchbar:'', + page:false, + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'岗位名称'}] + }, + 'services':{ + title:'选择服务类型', + url:'/api/index/get_services', + area: ['400px', '524px'], + searchbar:'', + page:false, + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'服务名称'},{field:'price',title:'服务单价'}] + }, + 'template':{ + title:'选择消息模板', + url:'/api/index/get_template', + area: ['600px', '568px'], + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'消息模板名称'}] + }, + 'workcate':{ + title:'选择工作类型', + url:'/api/index/get_work_cate', + area: ['400px', '524px'], + searchbar:'', + page:false, + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'工作类型名称'}] + }, + 'property':{ + title:'选择固定资产', + url:'/adm/api/get_property', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'资产名称'}] + }, + 'car':{ + title:'选择车辆信息', + url:'/adm/api/get_car', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'车辆名称'},{field:'name',width:100,title:'车牌号码',align:'center'}] + }, + 'room':{ + title:'选择会议室', + url:'/adm/api/get_meeting_room', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'会议室名称'},{field:'num',width:100,title:'可容纳人数',align:'center'}] + }, + 'customer':{ + title:'选择客户', + url:'/customer/api/get_customer', + add:'/customer/customer/add', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'name',title:'客户名称'}] + }, + 'supplier':{ + title:'选择供应商', + url:'/contract/api/get_supplier', + add:'/contract/supplier/add', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'供应商名称'}] + }, + 'contract':{ + title:'选择销售合同', + url:'/contract/api/get_contract', + area: ['800px', '568px'], + cols:[{ field: 'code',width:160,title:'合同编号',align:'center'},{field:'name',title:'合同名称'},{ field:'customer',title:'关联客户',width: 240}] + }, + 'product':{ + title:'选择产品', + url:'/contract/api/get_product', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'产品名称'},{field:'sale_price',title:'销售单价',width: 120,align:'center'}] + }, + 'purchase':{ + title:'选择采购合同', + url:'/contract/api/get_purchase', + area: ['800px', '568px'], + cols:[{ field: 'code',width:160,title:'合同编号',align:'center'},{field:'name',title:'合同名称'},{ field:'supplier',title:'关联供应商',width: 240}] + }, + 'purchased':{ + title:'选择采购物品', + url:'/contract/api/get_purchased', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'采购物品名称'},{field:'purchase_price',title:'采购单价',width: 120,align:'center'}] + }, + 'project':{ + title:'选择项目', + url:'/project/api/get_project', + cols:[{field:'id',width:90,title:'序号',align:'center'},{field:'title',title:'项目名称'}] + }, + 'task':{ + title:'选择任务', + url:'/project/api/get_task', + area: ['800px', '568px'], + cols:[{field:'id',width:90,title:'序号',align:'center'},{ field:'title',title:'任务主题'},{field:'project',width:240,title:'关联项目'}] + }, + 'loan':{ + title:'选择借支冲抵', + url:'/finance/api/get_loan', + area: ['800px', '568px'], + cols:[{field: 'id',width: 80,title:'序号',align:'center'},{field:'cost',title:'借款金额(元)',width: 100},{field:'un_balance_cost',title:'未冲账金额(元)',width: 110},{field:'balance_cost',title:'已冲账金额(元)',width: 110},{field:'title',title:'借支主题',minWidth:200}] + } + } + + let select_ids=[];select_names=[];select_array=[]; + const obj = { + employeeRender:function(){ + var me=this,letterTem=''; + for(var i=0;i<26;i++){ + letterTem+=''+String.fromCharCode(65+i)+''; + } + var tpl='
              \ +
              \ +
              \ +
              \ +
              ⇐ 点击左边部门筛选员工,或者点击下面字母筛选
              '+letterTem+'
              \ +
              \ +
              已选择全选
              \ +
              '+me.employeeSelect(0)+'
              \ +
              '; + return tpl; + }, + employeeSelect:function(t){ + var me=this,select_tags=''; + if(me.settings.type == 0){ + select_tags+=''+me.settings.names+''; + } + else{ + select_ids=[]; + select_names=[]; + for(var a=0;a'; + } + else{ + select_tags+=''+select_array[a].name+''; + } + if(t==1){ + $('#employee').find('[data-id="'+select_array[a].id+'"]').addClass('on'); + } + select_ids.push(parseInt(select_array[a].id)); + select_names.push(select_array[a].name); + } + } + //console.log(select_array); + return select_tags; + }, + employeeInit: function (options) { + const opts={ + "title":"选择员工", + "department_url": "/api/index/get_department_tree", + "employee_url": "/api/index/get_employee", + "type":1,//1单人,2多人 + "fixedid":0, + "ids":"", + "names":"", + "ajax_data":[], + "callback": function(){} + }; + this.settings = $.extend({}, opts, options); + var me=this; + select_ids=[]; + select_names=[]; + select_array=[]; + if(me.settings.ids!='' && me.settings.names!=''){ + select_ids=me.settings.ids.split(','); + select_names=me.settings.names.split(','); + //select_ids.sort((a, b) => a - b); + for(var m=0;m1 && me.settings.type == 2){ + $('.layui-tags-all').show(); + } + else{ + $('.layui-tags-all').hide(); + } + if(dataList.length>0){ + tagsItem=''; + for(var i=0; i'+dataList[i].name+''; + } + else{ + tagsItem+=''+dataList[i].name+''; + } + } + } + employee.html(tagsItem); + } + }) + } + }); + + letterBar.on("click" ,'span',function(){ + var code=$(this).data('code'); + $(this).addClass('on').siblings().removeClass('on'); + $.ajax({ + url:me.settings.employee_url, + type:'get', + data:{id:1}, + success:function(res){ + me.ajax_data = res.data; + var letterData=[],tagsItem='
              暂无员工
              ';; + if(me.ajax_data.length>0){ + var tagsItemCode=''; + for(var i=0; i'+me.ajax_data[i].name+''; + } + else{ + tagsItemCode+=''+me.ajax_data[i].name+''; + } + letterData.push(me.ajax_data[i]); + } + } + dataList=letterData; + if(dataList.length>2 && me.settings.type == 2){ + $('.layui-tags-all').show(); + } + else{ + $('.layui-tags-all').hide(); + } + if(tagsItemCode!=''){ + tagsItem = tagsItemCode; + } + } + employee.html(tagsItem); + } + }) + }); + } + }) + + if(me.settings.type == 2){ + $('.layui-tags-all').on('click',function(){ + for(var a=0; a
              ', + "page":true, + "type":type,//1单选择,2多选 + "btnno":true, + "add": "",//新增url + "callback": callback + }; + if(Object.prototype.toString.call(types) === '[object Object]'){ + options = types; + } + else{ + options = dataPicker[types]; + } + let settings = $.extend({},opts,options); + //console.log(settings); + let btn = ['确定选择']; + if(settings.btnno==true){ + btn = ['确定选择','清空已选']; + } + if(settings.add!=''){ + btn = ['确定选择','清空已选','新增']; + } + $(parent.$('.express-close')).addClass('parent-colse'); + layer.open({ + title: settings.title, + area: settings.area, + type: 1, + skin: 'gougu-picker', + content: '
              '+settings.searchbar+'
              ', + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + success: function () { + let cols=[]; + if(settings.type==1){ + cols = [{type: 'radio', title: '选择'}, ...settings.cols]; + } + if(settings.type==2){ + cols = [{type: 'checkbox', title: '选择'}, ...settings.cols]; + } + pickerTable = table.render({ + elem: '#pickerTable'+pickerIndex, + url: settings.url, + where:settings.where, + page: settings.page, //开启分页 + limit: 10, + height: '407', + cols: [cols] + }); + //请求分类 + if(settings.cate_url){ + tool.get(settings.cate_url,{},function(res){ + let cate=''; + for(let b=0; b'+res.data[b].title+''; + } + $('#pickerBox'+pickerIndex).find('.table_cate_id').append(cate); + form.render('select'); + }) + } + form.render(); + //搜索提交 + form.on('submit(picker)', function (data) { + let maps = $.extend({}, settings.where, data.field); + pickerTable.reload({where:maps,page:{curr: 1}}); + return false; + }); + //重置搜索提交 + $('#pickerBox'+pickerIndex).on('click', '[lay-filter="picker-reset"]', function () { + let prev = $(this).prev(); + if (typeof(prev) != "undefined" ) { + setTimeout(function () { + prev.click(); + }, 10) + } + }); + }, + btn: btn, + btnAlign: 'c', + btn1: function (idx) { + var checkStatus = table.checkStatus(pickerTable.config.id); + var data = checkStatus.data; + if (data.length > 0) { + callback(data); + layer.close(idx); + } + else { + layer.msg('请先选择内容'); + return false; + } + }, + btn2: function (idx) { + callback([{'id':0,'title':'','name':''}]); + layer.close(idx); + }, + btn3: function (idx) { + tool.side(settings.add); + layer.close(idx); + } + }) + } + } + + //选择员工弹窗 + $('body').on('click','.picker-admin',function () { + let that = $(this); + let type = that.data('type'); + if (typeof(type) == "undefined" || type == '') { + type = 1; + } + let ids=that.next().val()+'',names = that.val()+''; + obj.employeeInit({ + ids:ids, + names:names, + type:type, + callback:function(data){ + let select_id=[],select_name=[],select_did=[]; + for(var a=0; a 0) { + let itemSchedule = ''; + $.each(res.data, function (index, item) { + itemSchedule += ` +
              +

              ${item.start_time}~${item.end_time},${item.labor_time}工时

              +

              ${item.name}:${item.title}

              +
              + `; + }); + $("#schedule_" + tid).html(itemSchedule); + layer.closeAll(); + } + } + tool.get("/project/api/task_schedule", { tid: tid }, callback); + }, + //保存 + save: function (postData) { + let callback = function (e) { + if (e.code == 0) { + layer.closeAll(); + layer.msg(e.msg); + if(layui.scheduleTable){ + layui.scheduleTable.reload(); + } + else{ + setTimeout(function(){ + location.reload(); + },1000); + } + } else { + layer.msg(e.msg); + } + } + tool.post("/oa/schedule/add", postData, callback); + }, + //查看 + view: function (detail) { + let project = ''; + if(detail.tid>0){ + project = ` + + + + + + + + +
              关联项目${detail.project}
              关联任务${detail.task}
              `; + } + let content = `
              + + + + + + + + + + + + + + + + + + + + + + + +
              执行员工${detail.name}所在部门${detail.department}工作类别${detail.work_cate}
              时间范围${detail.start_time} 至 ${detail.end_time},共${detail.labor_time}工时工作类型${detail.labor_type_string}
              工作内容${detail.title}
              补充描述${detail.remark}
              + ${project} +
              `; + $(parent.$('.express-close')).addClass('parent-colse'); + layer.open({ + type: 1, + title: '工作记录详情', + area: ['720px', '420px'], + content: content, + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + success: function () { + + }, + btn: ['关闭'], + btnAlign: 'c', + yes: function (idx) { + layer.close(idx); + } + }) + }, + add: function (tid, schedule) { + let that = this, detail = {}, title = '添加工作记录'; + if(that.loading == true){ + return false; + } + that.loading = true; + let html_time = ''; + if (schedule['id'] > 0) { + if(schedule['admin_id'] != login_admin){ + layer.msg('不能编辑他人的工作记录'); + that.loading = false; + return false; + } + title = '编辑工作记录'; + detail['id'] = schedule['id']; + detail['cid'] = schedule['cid']; + detail['tid'] = schedule['tid']; + detail['title'] = schedule['title']; + detail['labor_type'] = schedule['labor_type']; + detail['start_time_a'] = schedule['start_time_a']; + detail['start_time_b'] = schedule['start_time_b']; + detail['end_time_a'] = schedule['end_time_a']; + detail['end_time_b'] = schedule['end_time_b']; + detail['remark'] = schedule['remark']; + + html_time = detail.start_time_a+' '+detail.start_time_b+' 至 '+detail.end_time_b+',共'+schedule.labor_time+'工时'; + } else { + detail['id'] = schedule['id']; + detail['tid'] = tid; + detail['cid'] = 1; + detail['title'] = ''; + detail['labor_type'] = 0; + detail['start_time_a'] = schedule['start_time_a']?schedule['start_time_a']:''; + detail['start_time_b'] = '09:00'; + detail['end_time_a'] = schedule['end_time_a']?schedule['end_time_a']:''; + detail['end_time_b'] = '09:30'; + detail['remark'] = ''; + + html_time = `
              `; + } + let callback = function(e){ + that.loading = false; + if(e.code==0){ + let cate = e.data; + let content = `
              + + + + + + + + + + + + + + + + + + + +
              时间范围 *${html_time}工作类别*
              工作类型*
              工作内容 *
              补充描述 + + +
              +
              `; + $(parent.$('.express-close')).addClass('parent-colse'); + layer.open({ + type: 1, + title: title, + area: ['720px', '420px'], + content: content, + end: function(){ + $(parent.$('.express-close')).removeClass('parent-colse'); + }, + success: function () { + if (detail['id'] == 0) { + //日期时间范围 + laydate.render({ + elem: '#start_time_a', + type: 'date', + min: -7, + max: 0, + format: 'yyyy-MM-dd', + showBottom: false, + done: function (a, b, c) { + $('#end_time_a').val(a); + detail.start_time_a = a; + detail.end_time_a = a; + } + }); + + //日期时间范围 + laydate.render({ + elem: '#end_time_a', + type: 'date', + min: -7, + max: 0, + format: 'yyyy-MM-dd', + showBottom: false, + done: function (a, b, c) { + $('#start_time_a').val(a); + detail.start_time_a = a; + detail.end_time_a = a; + } + }); + $('#start_time_b,#end_time_b').empty(); + + var hourArray = []; + for (var h = 0; h < 24; h++) { + var t = h < 10 ? '0' + h : h + var t_1 = t + ':00', t_2 = t + ':15', t_3 = t + ':30', t_4 = t + ':45'; + hourArray.push(t_1, t_2, t_3, t_4); + } + + var html_1 = '', html_2 = '', def_h1 = detail['start_time_b'], def_h2 = detail['end_time_b']; + for (var s = 0; s < hourArray.length; s++) { + var check_1 = '', check_2 = ''; + if (hourArray[s] == def_h1) { + check_1 = 'selected'; + } + if (hourArray[s] == def_h2) { + check_2 = 'selected'; + } + html_1 += ''; + html_2 += ''; + } + + $('#start_time_b').append(html_1); + $('#end_time_b').append(html_2); + } + $("input[name=labor_type][value="+detail.labor_type+"]").prop("checked","true"); + + var html_c=''; + for (var c = 0; c < cate.length; c++) { + var check_c = ''; + if (cate[c].id == detail['cid']) { + check_c = 'selected'; + } + html_c += ''; + } + + $('#work_cate').append(html_c); + + form.render(); + + form.on('select(start_time_b)', function (data) { + detail.start_time_b = data.value; + }); + form.on('select(end_time_b)', function (data) { + detail.end_time_b = data.value; + }); + $('[name="title"]').on('input', function () { + var _val = $(this).val(); + detail.title = _val; + }); + form.on('radio(labor_type)', function(data){ + detail.labor_type=data.value; + }) + form.on('select(work_cate)', function(data){ + detail.cid=data.value; + }) + $('[form-input="remark"]').on('input', function () { + var _val = $(this).val(); + detail.remark = _val; + }); + }, + btn: ['确定提交'], + btnAlign: 'c', + yes: function (idx) { + if (detail.start_time_a == '' || detail.end_time_a == '') { + layer.msg('请选择工作时间范围'); + return; + } + if(detail.labor_type==0){ + layer.msg('请选择工作类型'); + return; + } + if (detail.title == '') { + layer.msg('请填写工作内容'); + return; + } + that.save(detail); + } + }) + } + } + tool.get("/api/index/get_work_cate", {}, callback); + } + }; + exports('oaSchedule', obj); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/oaWork.js b/public/static/assets/gougu/module/oaWork.js new file mode 100644 index 0000000..47da5a0 --- /dev/null +++ b/public/static/assets/gougu/module/oaWork.js @@ -0,0 +1,359 @@ +layui.define(['tool','oaPicker'], function (exports) { + const layer = layui.layer; + const form = layui.form; + const tool = layui.tool; + const laydate = layui.laydate; + const oaPicker = layui.oaPicker; + // 定义工作时间段 + const workPeriods = [ + { start: 8, end: 12 }, // 早上工作时间段 + { start: 14, end: 18 } // 下午工作时间段 + ]; + const obj = { + //计算工时 + calculateWorkHours:function(startTimeStr, endTimeStr) { + if(startTimeStr == '' || endTimeStr==''){ + return 0; + } + // 解析时间字符串为Date对象 + const startTime = new Date(startTimeStr); + const endTime = new Date(endTimeStr); + + // 确保结束时间晚于或等于开始时间 + if (endTime < startTime) { + layer.msg('结束时间必须晚于或等于开始时间'); + return 0; + } + let totalWorkHours = 0; + + // 遍历每一天 + let currentDay = new Date(startTime); + let nextDay = new Date(currentDay); + //nextDay.setDate(nextDay.getDate() + 1); // 设置为下一天的同一时间 + + while (currentDay <= endTime) { + // 计算当前天的工作时间 + for (const period of workPeriods) { + // 获取当前天的工作时间段开始和结束时间 + let dayStart = new Date(currentDay.getFullYear(), currentDay.getMonth(), currentDay.getDate(), period.start, 0, 0); + let dayEnd = new Date(currentDay.getFullYear(), currentDay.getMonth(), currentDay.getDate(), period.end, 0, 0); + + // 检查是否在当前天的工作时间段内 + if (currentDay <= dayEnd && (dayStart <= endTime || dayStart <= currentDay)) { + // 计算重叠的时间段 + let overlapStart = Math.max(dayStart, Math.max(currentDay, startTime)); + let overlapEnd = Math.min(dayEnd, endTime); + + // 计算重叠时间段的时长(以毫秒为单位) + let overlapDuration = overlapEnd - overlapStart; + + // 将时长转换为小时,并累加到总工时 + totalWorkHours += overlapDuration / (1000 * 60 * 60); + } + } + + // 移到下一天 + currentDay = nextDay; + nextDay.setDate(nextDay.getDate() + 1); + } + // 保留两位小数 + return totalWorkHours.toFixed(2); + }, + count_total:function(detail){ + let amount=0,work_total=0; + if(detail.fee==''){ + detail.fee=0; + } + if(detail.hours==0){ + amount = detail.fee; + } + else{ + work_total = detail.hours*detail.work_price; + amount = (detail.fee*100+work_total*100)/100; + } + let total = {amount:amount.toFixed(2),work_total:work_total.toFixed(2)} + return total; + }, + //保存 + save: function (postData) { + let callback = function (e) { + if (e.code == 0) { + layer.closeAll(); + layer.msg(e.msg); + if(layui.workTable){ + layui.workTable.reload(); + } + else{ + setTimeout(function(){ + location.reload(); + },1000); + } + } else { + layer.msg(e.msg); + } + } + tool.post("/task/work/add", postData, callback); + }, + //查看 + view: function (detail) { + let demand = '',problems = '',task = ''; + if(detail.demand_id>0){ + demand = `关联请求${detail.demand}`; + } + if(detail.problems_id>0){ + problems = `关联问题${detail.problems}`; + } + if(detail.task_id>0){ + task = `关联任务${detail.task}`; + } + let content = `
              + + ${demand} + ${problems} + ${task} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              开始时间${detail.start_time}结束时间${detail.end_time}
              所有者${detail.director_name}工时费用(元)${detail.work_price}
              所用工时(小时)${detail.hours}技术费用(元)${detail.work_total}
              其他费用(元)${detail.fee}总费用(元)${detail.amount}
              工作内容${detail.title}
              补充描述${detail.remark}
              +
              `; + layer.open({ + type: 1, + title: '工作记录详情', + area: ['692px', '432px'], + content: content, + success: function () { + + }, + btn: ['关闭'], + btnAlign: 'c', + yes: function (idx) { + layer.close(idx); + } + }) + }, + add: function (schedule) { + let that = this, detail = {}, title = '添加工作记录',timestamp = new Date().getTime();; + let html_time = ''; + if (schedule['id'] > 0) { + title = '编辑工作记录'; + detail['id'] = schedule['id']; + detail['title'] = schedule['title']; + detail['start_time'] = schedule['start_time']; + detail['end_time'] = schedule['end_time']; + detail['director_name'] = schedule['director_name']; + detail['director_id'] = schedule['director_id']; + detail['hours'] = schedule['hours']; + detail['work_price'] = schedule['work_price']; + detail['fee'] = schedule['fee']; + detail['work_total'] = schedule['work_total']; + detail['amount'] = schedule['amount']; + detail['remark'] = schedule['remark']; + } else { + detail['task_id'] = schedule['task_id']; + detail['problems_id'] = schedule['problems_id']; + detail['demand_id'] = schedule['demand_id']; + detail['title'] = ''; + detail['start_time'] = ''; + detail['end_time'] = ''; + detail['director_name'] = ''; + detail['director_id'] = 0; + detail['hours'] = 0; + detail['work_price'] = 0; + detail['fee'] = 0; + detail['work_total'] = 0; + detail['amount'] = 0; + detail['remark'] = ''; + } + let content = `
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              开始时间 *结束时间 *
              所有者* + + + 工时费用(元)
              所用工时(小时)技术费用(元)
              其他费用(元)总费用(元)
              工作内容 *
              补充描述 + + +
              +
              `; + layer.open({ + type: 1, + title: title, + area: ['800px', '500px'], + content: content, + success: function () { + //选择员工弹窗 + $('#table'+timestamp).on('click','.picker-diy',function () { + let self = $(this); + let ids=self.next().val()+'',names = self.val()+''; + oaPicker.employeeInit({ + ids:ids, + names:names, + type:1,//1是单选,2是多选 + callback:function(data){ + self.val(data[0].name); + self.next().val(data[0].id); + detail.director_id = data[0].id; + if(data[0].id==0){ + data[0].work_price=0.00; + } + detail.work_price = data[0].work_price; + $('[name="work_price"]').val(data[0].work_price); + let total = that.count_total(detail); + $('[name="amount"]').val(total.amount); + $('[name="work_total"]').val(total.work_total); + detail.amount = total.amount; + detail.work_total = total.work_total; + } + }); + }); + //日期时间范围 + laydate.render({ + elem: '#start_time', + max: 0, + type: 'datetime', + format: 'yyyy-MM-dd HH:mm', + fullPanel: true, + done: function (a, b, c) { + detail.start_time = a; + detail.hours = that.calculateWorkHours(detail.start_time,detail.end_time); + $('[name="hours"]').val(detail.hours); + let total = that.count_total(detail); + $('[name="amount"]').val(total.amount); + $('[name="work_total"]').val(total.work_total); + detail.amount = total.amount; + detail.work_total = total.work_total; + } + }); + + //日期时间范围 + laydate.render({ + elem: '#end_time', + max: 0, + type: 'datetime', + format: 'yyyy-MM-dd HH:mm', + fullPanel: true, + done: function (a, b, c) { + detail.end_time = a; + that.calculateWorkHours(detail.start_time,detail.end_time); + detail.hours = that.calculateWorkHours(detail.start_time,detail.end_time); + $('[name="hours"]').val(detail.hours); + let total = that.count_total(detail); + $('[name="amount"]').val(total.amount); + $('[name="work_total"]').val(total.work_total); + detail.amount = total.amount; + detail.work_total = total.work_total; + } + }); + + form.render(); + + $('[name="title"]').on('input', function () { + var _val = $(this).val(); + detail.title = _val; + }); + $('[name="fee"]').on('input', function () { + this.value = this.value.replace(/[^0-9]/g,''); + var _val = $(this).val(); + detail.fee = _val; + let total = that.count_total(detail); + $('[name="amount"]').val(total.amount); + $('[name="work_total"]').val(total.work_total); + detail.amount = total.amount; + detail.work_total = total.work_total; + }); + $('[form-input="remark"]').on('input', function () { + var _val = $(this).val(); + detail.remark = _val; + }); + }, + btn: ['确定提交'], + btnAlign: 'c', + yes: function (idx) { + if (detail.start_time == '') { + layer.msg('请选择开始时间'); + return; + } + if (detail.end_time == '') { + layer.msg('请选择结束时间'); + return; + } + if(detail.hours*100<=0){ + layer.msg('请选择工作时间有问题'); + return; + } + if(detail.director_id==0){ + layer.msg('请完善所有者'); + return; + } + if (detail.title == '') { + layer.msg('请填写工作内容'); + return; + } + console.log(detail); + that.save(detail); + } + }) + } + }; + exports('oaWork', obj); +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tablePlus.js b/public/static/assets/gougu/module/tablePlus.js new file mode 100644 index 0000000..f3c0cdd --- /dev/null +++ b/public/static/assets/gougu/module/tablePlus.js @@ -0,0 +1,221 @@ +layui.define(function(exports) { + //tablePlus在原来的table模块的基础上实现了批量数据导出功能,实现defaultToolbar中筛选列记忆功能,实现了外部搜索功能 + var table = layui.table; + var form = layui.form; + var MOD_NAME='tablePlus'; + var tablePlus=$.extend({},table); + tablePlus._render = tablePlus.render; + tablePlus.excel = function(total,options){ + //console.log(options); + let _page = parseInt(total/options.excel_limit); + let page = total%options.excel_limit>0?(_page+1):_page; + let pageHtml='

              由于导出数据比较消耗服务器资源,建议使用搜索功能筛选好数据再导出

              如果点击导出后,没有立即导出文件,请耐心等待一下,30秒内请勿重复点击。

              共查询到 '+total+' 条数据,每次最多导出'+options.excel_limit+'条,共'+page+'页,请点击下面的页码导出

              '; + for (i = 1; i <= page; i++) { + pageHtml += ''+i+''; + } + pageHtml+='
              '; + layer.open({ + type: 1, + title: '导出数据', + area:['580px','240px'], + content: pageHtml, + success:function(res){ + let tableWhere = JSON.parse(JSON.stringify(options.where)); + tableWhere.limit=options.excel_limit; + $('#exportPage').on('click','a',function(){ + tableWhere.page=$(this).data('page'); + let msg = layer.msg('正在导出数据...', {time:3000}); + $.ajax({ + url: options.url, + data: tableWhere, + success:function(res){ + table.exportFile(options.id, res.data,'csv'); + setTimeout(function(){ + layer.msg('导出完成'); + },2000) + } + }); + }) + } + }); + } + //重写渲染方法 + tablePlus.render=function(params){ + if(params.excel_auth === undefined){ + params.excel_auth = 1; + } + if(params.excel_limit === undefined){ + params.excel_limit = 10000; + } + if(params.cols_save === undefined){ + params.cols_save = false; + } + if(params.limit === undefined){ + params.limit = 20; + } + if(params.page === undefined){ + params.page = true; + } + if(params.cellMinWidth === undefined){ + params.cellMinWidth = 80; + } + if(params.help === undefined){ + params.help = '无帮助说明'; + } + if(params.order_field === undefined){ + params.order_field = 'order_field'; + } + if(params.order_type === undefined){ + params.order_type = 'order_type'; + } + + let defaultToolbar = [ + 'filter', + { + name: 'exports', + onClick: function(obj) { + // 当前示例配置项 + let options = obj.config; + let total = obj.data.length; + // 弹出面板 + obj.openPanel({ + list: [ // 列表 + '
            • 导出当前页
            • ', + '
            • 导出全部
            • ' + ].join(''), + done: function(panel, list) { + list.on('click', function() { + if(options.excel_auth==0){ + layer.msg('无权限导出'); + return false; + } + if(total==0){ + layer.msg('暂无数据'); + return false; + } + let type = $(this).data('type') + if(type === 'page') { + // 调用内置导出方法 + let msg = layer.msg('正在导出数据...', {time:1000}); + table.exportFile(options.id, null, 'csv'); + }else if(type === 'all') { + let tableWhere = JSON.parse(JSON.stringify(options.where)); + tableWhere.limit=options.excel_limit; + if(total<=tableWhere.limit){ + tableWhere.page=1; + let msg = layer.msg('正在导出数据...', {time:3000}); + $.ajax({ + url: options.url, + data: tableWhere, + success:function(res){ + table.exportFile(options.id, res.data,'csv'); + setTimeout(function(){ + layer.msg('导出完成'); + },3000) + } + }); + } + else{ + tablePlus.excel(total,options) + } + } + }); + } + }); + } + },{ + title:'数据说明', + icon: 'layui-icon-help', + layEvent: 'LAYTABLE_HELP', + onClick: function(obj) { + layer.open({ + shadeClose: true, + title:'帮助说明', + type: 1, + content: '
              '+obj.config.help+'
              ' + }) + } + } + ] + + if(params.defaultToolbar != false){ + params.defaultToolbar = defaultToolbar; + } + if(params.cols_save == true){ + // 从本地存储获取用户保存的列显示设置 + let savedCols = localStorage.getItem('col-filter-'+params.url); + let colsStatus = savedCols ? JSON.parse(savedCols) : {}; + let cols = params.cols; + for (var i=0;i',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-style":'',"border-width":'',brightness:'',browse:'',cancel:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',export:'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',"vertical-align":'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/jquery.tinymce.min.js b/public/static/assets/gougu/module/tinymce/jquery.tinymce.min.js new file mode 100644 index 0000000..46e24d2 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/jquery.tinymce.min.js @@ -0,0 +1,91 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + */ +/** + * Jquery integration plugin. + * + * @class tinymce.core.JqueryIntegration + * @private + */ +!function(){function f(){ +// Reference to tinymce needs to be lazily evaluated since tinymce +// might be loaded through the compressor or other means +return d.tinymce}var p,c,u,s=[],d="undefined"!=typeof global?global:window,m=d.jQuery;m.fn.tinymce=function(o){var e,t,i,n,l=this,r=""; +// No match then just ignore the call +return l.length? +// Get editor instance +o?(l.css("visibility","hidden"), +// Load TinyMCE on demand, if we need to +d.tinymce||c||!(e=o.script_url)? +// Delay the init call until tinymce is loaded +1===c?s.push(a):a():(c=1,t=e.substring(0,e.lastIndexOf("/")), +// Check if it's a dev/src version they want to load then +// make sure that all plugins, themes etc are loaded in source mode as well +-1!=e.indexOf(".min")&&(r=".min"), +// Setup tinyMCEPreInit object this will later be used by the TinyMCE +// core script to locate other resources like CSS files, dialogs etc +// You can also predefined a tinyMCEPreInit object and then it will use that instead +d.tinymce=d.tinyMCEPreInit||{base:t,suffix:r}, +// url contains gzip then we assume it's a compressor +-1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""), +// Check if compressor script is already loaded otherwise setup a basic one +d.tinyMCE_GZ||(d.tinyMCE_GZ={start:function(){function n(e){f().ScriptLoader.markDone(f().baseURI.toAbsolute(e))} +// Add core languages +n("langs/"+i+".js"), +// Add themes with languages +n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"), +// Add plugins with languages +m.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}})),(n=document.createElement("script")).type="text/javascript",n.onload=n.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(n.readyState)||(f().dom.Event.domLoaded=1,c=2, +// Execute callback after mainscript has been loaded and before the initialization occurs +o.script_loaded&&o.script_loaded(),a(),m.each(s,function(e,t){t()}))},n.src=e,document.body.appendChild(n)),l):f()?f().get(l[0].id):null:l;function a(){var a=[],c=0; +// Apply patches to the jQuery object, only once +u||(v(),u=!0), +// Create an editor instance for each matched node +l.each(function(e,t){var n,i=t.id,r=o.oninit; +// Generate unique id for target element if needed +i||(t.id=i=f().DOM.uniqueId()), +// Only init the editor once +f().get(i)||( +// Create editor instance and render it +n=f().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""), +// Run this if the oninit setting is defined +// this logic will fire the oninit callback ones each +// matched editor instance is initialized +r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:f().resolve(t.replace(/\.\w+$/,"")),t=f().resolve(t)), +// Call the oninit function with the object +t.apply(e||f(),a))}))}), +// Render the editor instances in a separate loop since we +// need to have the full editors array used in the onInit calls +m.each(a,function(e,t){t.render()})}}, +// Add :tinymce pseudo selector this will select elements that has been converted into editor instances +// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. +m.extend(m.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in d&&(t=f().get(e.id))&&t.editorManager===f())}}); +// This function patches internal jQuery functions so that if +// you for example remove an div element containing an editor it's +// automatically destroyed by the TinyMCE API +var v=function(){function r(e){ +// If the function is remove +"remove"===e&&this.each(function(e,t){var n=u(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=f().get(t.id.replace(/_parent$/,""));n&&n.remove()})}function o(i){var e,t=this; +// Handle set value +/*jshint eqnull:true */if(null!=i)r.call(t), +// Saves the contents before get/set value of textarea/div +t.each(function(e,t){var n;(n=f().get(t.id))&&n.setContent(i)});else if(0])*>/g,""):n.getContent({save:!0}):a.apply(m(t),r)}),i}}), +// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe +m.each(["append","prepend"],function(e,t){var n=s[t]=m.fn[t],r="prepend"===t;m.fn[t]=function(i){var e=this;return l(e)?i!==p?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=u(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}), +// Makes sure that the editor instance gets properly destroyed when the parent element is removed +m.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=m.fn[t];m.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=m.fn.attr, +// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents +m.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!l(n))return s.attr.apply(n,i);if(t!==p)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining +var r=n[0],a=u(r);return a?a.getContent({save:!0}):s.attr.apply(m(r),i)}}}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/langs/README.md b/public/static/assets/gougu/module/tinymce/langs/README.md new file mode 100644 index 0000000..a52bf03 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/langs/README.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/public/static/assets/gougu/module/tinymce/langs/zh_CN.js b/public/static/assets/gougu/module/tinymce/langs/zh_CN.js new file mode 100644 index 0000000..a9e86f2 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/langs/zh_CN.js @@ -0,0 +1,417 @@ +tinymce.addI18n('zh_CN',{ +"Redo": "恢复", +"Undo": "撤销", +"Cut": "剪切", +"Copy": "复制", +"Paste": "粘贴", +"Select all": "全选", +"New document": "新建文档", +"Ok": "确定", +"Cancel": "取消", +"Visual aids": "网格线", +"Bold": "粗体", +"Italic": "斜体", +"Underline": "下划线", +"Strikethrough": "删除线", +"Superscript": "上标", +"Subscript": "下标", +"Clear formatting": "清除格式", +"Align left": "左对齐", +"Align center": "居中", +"Align right": "右对齐", +"Justify": "两端对齐", +"Bullet list": "符号列表", +"Numbered list": "数字列表", +"Decrease indent": "减少缩进", +"Increase indent": "增加缩进", +"Close": "关闭", +"Formats": "格式", +"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "当前浏览器不支持访问剪贴板,请使用快捷键Ctrl+X/C/V复制粘贴", +"Headers": "标题", +"Header 1": "标题1", +"Header 2": "标题2", +"Header 3": "标题3", +"Header 4": "标题4", +"Header 5": "标题5", +"Header 6": "标题6", +"Headings": "标题", +"Heading 1": "标题1", +"Heading 2": "标题2", +"Heading 3": "标题3", +"Heading 4": "标题4", +"Heading 5": "标题5", +"Heading 6": "标题6", +"Preformatted": "预格式化", +"Div": "Div区块", +"Pre": "预格式文本", +"Code": "代码", +"Paragraph": "段落", +"Blockquote": "引用", +"Inline": "文本", +"Blocks": "区块", +"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "当前为纯文本粘贴模式,再次点击可以回到普通粘贴模式。", +"Fonts": "字体", +"Font Sizes": "字号", +"Class": "Class", +"Browse for an image": "浏览图像", +"OR": "或", +"Drop an image here": "拖放一张图片文件至此", +"Upload": "上传", +"Block": "块", +"Align": "对齐", +"Default": "默认", +"Circle": "空心圆", +"Disc": "实心圆", +"Square": "方块", +"Lower Alpha": "小写英文字母", +"Lower Greek": "小写希腊字母", +"Lower Roman": "小写罗马字母", +"Upper Alpha": "大写英文字母", +"Upper Roman": "大写罗马字母", +"Anchor...": "锚点...", +"Name": "名称", +"Id": "id", +"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "id应该以字母开头,后跟字母、数字、横线、点、冒号或下划线。", +"You have unsaved changes are you sure you want to navigate away?": "你对文档的修改尚未保存,确定离开吗?", +"Restore last draft": "恢复上次的草稿", +"Special characters...": "特殊字符...", +"Source code": "HTML源码", +"Insert\/Edit code sample": "插入/编辑代码示例", +"Language": "语言", +"Code sample...": "代码示例...", +"Color Picker": "选取颜色", +"R": "R", +"G": "G", +"B": "B", +"Left to right": "从左到右", +"Right to left": "从右到左", +"Emoticons...": "表情符号...", +"Metadata and Document Properties": "元数据和文档属性", +"Title": "标题", +"Keywords": "关键词", +"Description": "描述", +"Robots": "机器人", +"Author": "作者", +"Encoding": "编码", +"Fullscreen": "全屏", +"Action": "操作", +"Shortcut": "快捷键", +"Help": "帮助", +"Address": "地址", +"Focus to menubar": "移动焦点到菜单栏", +"Focus to toolbar": "移动焦点到工具栏", +"Focus to element path": "移动焦点到元素路径", +"Focus to contextual toolbar": "移动焦点到上下文菜单", +"Insert link (if link plugin activated)": "插入链接 (如果链接插件已激活)", +"Save (if save plugin activated)": "保存(如果保存插件已激活)", +"Find (if searchreplace plugin activated)": "查找(如果查找替换插件已激活)", +"Plugins installed ({0}):": "已安装插件 ({0}):", +"Premium plugins:": "优秀插件:", +"Learn more...": "了解更多...", +"You are using {0}": "你正在使用 {0}", +"Plugins": "插件", +"Handy Shortcuts": "快捷键", +"Horizontal line": "水平分割线", +"Insert\/edit image": "插入/编辑图片", +"Image description": "图片描述", +"Source": "地址", +"Dimensions": "大小", +"Constrain proportions": "保持宽高比", +"General": "常规", +"Advanced": "高级", +"Style": "样式", +"Vertical space": "垂直边距", +"Horizontal space": "水平边距", +"Border": "边框", +"Insert image": "插入图片", +"Image...": "图片...", +"Image list": "图片列表", +"Rotate counterclockwise": "逆时针旋转", +"Rotate clockwise": "顺时针旋转", +"Flip vertically": "垂直翻转", +"Flip horizontally": "水平翻转", +"Edit image": "编辑图片", +"Image options": "图片选项", +"Zoom in": "放大", +"Zoom out": "缩小", +"Crop": "裁剪", +"Resize": "调整大小", +"Orientation": "方向", +"Brightness": "亮度", +"Sharpen": "锐化", +"Contrast": "对比度", +"Color levels": "色阶", +"Gamma": "伽马值", +"Invert": "反转", +"Apply": "应用", +"Back": "后退", +"Insert date\/time": "插入日期/时间", +"Date\/time": "日期/时间", +"Insert\/Edit Link": "插入/编辑链接", +"Insert\/edit link": "插入/编辑链接", +"Text to display": "显示文字", +"Url": "地址", +"Open link in...": "链接打开方式...", +"Current window": "当前窗口打开", +"None": "在当前窗口/框架打开", +"New window": "在新窗口打开", +"Remove link": "删除链接", +"Anchors": "锚点", +"Link...": "链接...", +"Paste or type a link": "粘贴或输入链接", +"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "你所填写的URL地址为邮件地址,需要加上mailto:前缀吗?", +"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "你所填写的URL地址属于外部链接,需要加上http://:前缀吗?", +"Link list": "链接列表", +"Insert video": "插入视频", +"Insert\/edit video": "插入/编辑视频", +"Insert\/edit media": "插入/编辑媒体", +"Alternative source": "替代资源", +"Alternative image URL": "资源备用地址", +"Media poster (Image URL)": "封面(图片地址)", +"Paste your embed code below:": "将内嵌代码粘贴在下面:", +"Embed": "内嵌", +"Media...": "多媒体...", +"Nonbreaking space": "不间断空格", +"Page break": "分页符", +"Paste as text": "粘贴为文本", +"Preview": "预览", +"Print...": "打印...", +"Save": "保存", +"Find": "查找", +"Replace with": "替换为", +"Replace": "替换", +"Replace all": "替换全部", +"Previous": "上一个", +"Next": "下一个", +"Find and replace...": "查找并替换...", +"Could not find the specified string.": "未找到搜索内容。", +"Match case": "区分大小写", +"Find whole words only": "全单词匹配", +"Spell check": "拼写检查", +"Ignore": "忽略", +"Ignore all": "忽略全部", +"Finish": "完成", +"Add to Dictionary": "添加到字典", +"Insert table": "插入表格", +"Table properties": "表格属性", +"Delete table": "删除表格", +"Cell": "单元格", +"Row": "行", +"Column": "列", +"Cell properties": "单元格属性", +"Merge cells": "合并单元格", +"Split cell": "拆分单元格", +"Insert row before": "在上方插入", +"Insert row after": "在下方插入", +"Delete row": "删除行", +"Row properties": "行属性", +"Cut row": "剪切行", +"Copy row": "复制行", +"Paste row before": "粘贴到上方", +"Paste row after": "粘贴到下方", +"Insert column before": "在左侧插入", +"Insert column after": "在右侧插入", +"Delete column": "删除列", +"Cols": "列", +"Rows": "行", +"Width": "宽", +"Height": "高", +"Cell spacing": "单元格外间距", +"Cell padding": "单元格内边距", +"Show caption": "显示标题", +"Left": "左对齐", +"Center": "居中", +"Right": "右对齐", +"Cell type": "单元格类型", +"Scope": "范围", +"Alignment": "对齐方式", +"H Align": "水平对齐", +"V Align": "垂直对齐", +"Top": "顶部对齐", +"Middle": "垂直居中", +"Bottom": "底部对齐", +"Header cell": "表头单元格", +"Row group": "行组", +"Column group": "列组", +"Row type": "行类型", +"Header": "表头", +"Body": "表体", +"Footer": "表尾", +"Border color": "边框颜色", +"Insert template...": "插入模板...", +"Templates": "模板", +"Template": "模板", +"Text color": "文字颜色", +"Background color": "背景色", +"Custom...": "自定义...", +"Custom color": "自定义颜色", +"No color": "无", +"Remove color": "删除颜色", +"Table of Contents": "目录", +"Show blocks": "显示区块边框", +"Show invisible characters": "显示不可见字符", +"Word count": "字数统计", +"Words: {0}": "字数:{0}", +"{0} words": "{0} 个字", +"File": "文件", +"Edit": "编辑", +"Insert": "插入", +"View": "查看", +"Format": "格式", +"Table": "表格", +"Tools": "工具", +"Powered by {0}": "Powered by {0}", +"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "在编辑区按ALT+F9打开菜单,按ALT+F10打开工具栏,按ALT+0查看帮助", +"Image title": "图片标题", +"Border width": "边框宽度", +"Border style": "边框样式", +"Error": "错误", +"Warn": "警告", +"Valid": "有效", +"To open the popup, press Shift+Enter": "此快捷为软回车(插入
              )", +"Rich Text Area. Press ALT-0 for help.": "编辑区. 按Alt+0键打开帮助", +"System Font": "默认字体", +"Failed to upload image: {0}": "图片上传失败: {0}", +"Failed to load plugin: {0} from url {1}": "插件加载失败: {0} - {1}", +"Failed to load plugin url: {0}": "插件加载失败: {0}", +"Failed to initialize plugin: {0}": "插件初始化失败: {0}", +"example": "示例", +"Search": "查找", +"All": "全部", +"Currency": "货币", +"Text": "文本", +"Quotations": "引用", +"Mathematical": "数学运算符", +"Extended Latin": "拉丁语扩充", +"Symbols": "符号", +"Arrows": "箭头", +"User Defined": "自定义", +"dollar sign": "美元", +"currency sign": "货币", +"euro-currency sign": "欧元", +"colon sign": "冒号", +"cruzeiro sign": "克鲁赛罗币", +"french franc sign": "法郎", +"lira sign": "里拉", +"mill sign": "密尔", +"naira sign": "奈拉", +"peseta sign": "比塞塔", +"rupee sign": "卢比", +"won sign": "韩元", +"new sheqel sign": "新谢克尔", +"dong sign": "越南盾", +"kip sign": "老挝基普", +"tugrik sign": "图格里克", +"drachma sign": "德拉克马", +"german penny symbol": "德国便士", +"peso sign": "比索", +"guarani sign": "瓜拉尼", +"austral sign": "澳元", +"hryvnia sign": "格里夫尼亚", +"cedi sign": "塞地", +"livre tournois sign": "里弗弗尔", +"spesmilo sign": "一千spesoj的货币符号,该货币未使用", +"tenge sign": "坚戈", +"indian rupee sign": "印度卢比", +"turkish lira sign": "土耳其里拉", +"nordic mark sign": "北欧马克", +"manat sign": "马纳特", +"ruble sign": "卢布", +"yen character": "日元", +"yuan character": "人民币元", +"yuan character, in hong kong and taiwan": "元的繁体字", +"yen\/yuan character variant one": "元(大写)", +"Loading emoticons...": "正在加载表情文字...", +"Could not load emoticons": "不能加载表情文字", +"People": "人类", +"Animals and Nature": "动物和自然", +"Food and Drink": "食物和饮品", +"Activity": "活动", +"Travel and Places": "旅游和地点", +"Objects": "物件", +"Flags": "旗帜", +"Characters": "字数", +"Characters (no spaces)": "字数(不含空格)", +"Error: Form submit field collision.": "错误: 表单提交字段冲突.", +"Error: No form element found.": "错误: 未找到可用的form.", +"Update": "更新", +"Color swatch": "颜色样本", +"Turquoise": "青绿", +"Green": "绿色", +"Blue": "蓝色", +"Purple": "紫色", +"Navy Blue": "海军蓝", +"Dark Turquoise": "深蓝绿色", +"Dark Green": "暗绿", +"Medium Blue": "中蓝", +"Medium Purple": "中紫", +"Midnight Blue": "深蓝", +"Yellow": "黄色", +"Orange": "橙色", +"Red": "红色", +"Light Gray": "浅灰", +"Gray": "灰色", +"Dark Yellow": "暗黄", +"Dark Orange": "暗橙", +"Dark Red": "暗红", +"Medium Gray": "中灰", +"Dark Gray": "深灰", +"Black": "黑色", +"White": "白色", +"Switch to or from fullscreen mode": "切换全屏模式", +"Open help dialog": "打开帮助对话框", +"history": "历史", +"styles": "样式", +"formatting": "格式化", +"alignment": "对齐", +"indentation": "缩进", +"permanent pen": "记号笔", +"comments": "注释", +"Anchor": "锚点", +"Special character": "特殊字符", +"Code sample": "代码示例", +"Color": "颜色", +"Emoticons": "表情", +"Document properties": "文档属性", +"Image": "图片", +"Insert link": "插入链接", +"Target": "目标", +"Link": "链接", +"Poster": "封面", +"Media": "音视频", +"Print": "打印", +"Prev": "上一个", +"Find and replace": "查找并替换", +"Whole words": "全字匹配", +"Spellcheck": "拼写检查", +"Caption": "标题", +"Insert template": "插入模板", +//以下为补充汉化内容 by 莫若卿 +"Code view": "代码区域", +"Select...": "选择...", +"Format Painter": "格式刷", +"No templates defined.": "无内置模板", +"Special character...": "特殊字符...", +"Open link": "打开链接", +"None": "无", +"Count": "统计", +"Document": "整个文档", +"Selection": "选取部分", +"Words": "字词数", +"{0} characters": "{0} 个字符", +"Alternative source URL": "替代资源地址", +"Alternative description": "替代说明文字", +"Accessibility": "可访问性", +"Image is decorative": "仅用于装饰", +//5.6新增 +"Line height": "行高", +"Cut column": "剪切列", +"Copy column": "复制列", +"Paste column before": "粘贴到前方", +"Paste column after": "粘贴到后方", +"Copy column": "复制列", +//帮助窗口内的文字 +"Version": "版本", +"Keyboard Navigation": "键盘导航", +"Open popup menu for split buttons": "该组合键的作用是软回车(插入br)", +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/license.txt b/public/static/assets/gougu/module/tinymce/license.txt new file mode 100644 index 0000000..b17fc90 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/public/static/assets/gougu/module/tinymce/plugins/advlist/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/advlist/plugin.min.js new file mode 100644 index 0000000..78c9663 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/advlist/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function f(t,e,n){t.execCommand("UL"===e?"InsertUnorderedList":"InsertOrderedList",!1,!1===n?null:{"list-style-type":n})}function i(t){return function(){return t}}function t(t){return t}function e(){return s}var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=tinymce.util.Tools.resolve("tinymce.util.Tools"),u=i(!1),l=i(!0),s={fold:function(t,e){return t()},isSome:u,isNone:l,getOr:t,getOrThunk:r,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:r,map:e,each:function(){},bind:e,exists:u,forall:l,filter:function(){return s},toArray:function(){return[]},toString:i("none()")};function r(t){return t()}function d(t){return t&&/^(TH|TD)$/.test(t.nodeName)}function m(c,a){return function(s){function t(t){var e,n,r,o,i,u,l;s.setActive((e=c,r=a,i=-1!==(o=function(t,e){for(var n=0;n=(y="www.").length&&m.substr(0,0+y.length)===y?C=w+"://"+C:-1===C.indexOf("@")||/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(C)||(C="mailto:"+C),r=e.selection.getBookmark(),e.selection.setRng(c),e.execCommand("createlink",!1,C),!1!==f&&e.dom.setAttrib(e.selection.getNode(),"target",f),e.selection.moveToBookmark(r),e.nodeChanged())}}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.Env"),v=new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-+~=.,%()\/\w]*[-+~=%()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i");e.add("autolink",function(e){var t,n;(t=e).on("keydown",function(e){13===e.keyCode&&i(t,-1,"")}),r.browser.isIE()?t.on("focus",function(){if(!n){n=!0;try{t.execCommand("AutoUrlDetect",!1,!0)}catch(e){}}}):(t.on("keypress",function(e){41===e.keyCode&&i(t,-1,"(")}),t.on("keyup",function(e){32===e.keyCode&&i(t,0,"")}))})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/autoresize/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/autoresize/plugin.min.js new file mode 100644 index 0000000..d558aed --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/autoresize/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function y(e){return e.getParam("min_height",e.getElement().offsetHeight,"number")}function p(e,t){var n=e.getBody();n&&(n.style.overflowY=t?"":"hidden",t||(n.scrollTop=0))}function v(e,t,n,i){var o=parseInt(e.getStyle(t,n,i),10);return isNaN(o)?0:o}var l=Object.hasOwnProperty,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),b=tinymce.util.Tools.resolve("tinymce.Env"),r=tinymce.util.Tools.resolve("tinymce.util.Delay"),u=function(e,t,n,i,o){r.setEditorTimeout(e,function(){C(e,t),n--?u(e,t,n,i,o):o&&o()},i)},C=function(e,t,n){var i,o,r,s,a,l,u,g,c,m,f,d=e.dom,h=e.getDoc();h&&(e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen()?p(e,!0):(i=h.documentElement,o=e.getParam("autoresize_bottom_margin",50,"number"),r=y(e),s=v(d,i,"margin-top",!0),a=v(d,i,"margin-bottom",!0),(l=(l=i.offsetHeight+s+a+o)<0?0:l)+(u=e.getContainer().offsetHeight-e.getContentAreaContainer().offsetHeight)>y(e)&&(r=l+u),(g=e.getParam("max_height",0,"number"))&&go(t.getParam("autosave_retention"),"20m")&&(g(t,!1),1))}function s(t){var e=n(t);!i(t)&&t.isDirty()&&(v.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),v.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))}function f(t){var e=n(t);u(t)&&(t.setContent(v.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))}function c(t){t.undoManager.transact(function(){f(t),g(t)}),t.focus()}function m(r){return function(t){function e(){return t.setDisabled(!u(r))}return t.setDisabled(!u(r)),r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(t){return void 0===t},l=tinymce.util.Tools.resolve("tinymce.util.Delay"),v=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),d=tinymce.util.Tools.resolve("tinymce.util.Tools"),g=function(t,e){var r=n(t);v.removeItem(r+"draft"),v.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},y=tinymce.util.Tools.resolve("tinymce.EditorManager");t.add("autosave",function(t){var e,r,n,a;return t.editorManager.on("BeforeUnload",function(t){var e;d.each(y.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),n=e=t,a=o(n.getParam("autosave_interval"),"30s"),l.setEditorInterval(n,function(){s(n)},a),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){c(e)},onSetup:m(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&f(t)}),r=t,{hasDraft:function(){return u(r)},storeDraft:function(){return s(r)},restoreDraft:function(){return f(r)},removeDraft:function(t){return g(r,t)},isEmpty:function(t){return i(r,t)}}})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/bbcode/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/bbcode/plugin.min.js new file mode 100644 index 0000000..a4fa39e --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/bbcode/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function i(t){function o(o,e){t=t.replace(o,e)}return t=n.trim(t),o(/\n/gi,"
              "),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t}var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),n=tinymce.util.Tools.resolve("tinymce.util.Tools");o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=i(o.content)}),o.on("PostProcess",function(o){function e(o,e){t=t.replace(o,e)}var t;o.set&&(o.content=i(o.content)),o.get&&(o.content=(t=o.content,t=n.trim(t),e(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),e(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),e(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),e(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),e(/(.*?)<\/font>/gi,"$1"),e(//gi,"[img]$1[/img]"),e(/(.*?)<\/span>/gi,"[code]$1[/code]"),e(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),e(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),e(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),e(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),e(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),e(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),e(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),e(/<\/(strong|b)>/gi,"[/b]"),e(/<(strong|b)>/gi,"[b]"),e(/<\/(em|i)>/gi,"[/i]"),e(/<(em|i)>/gi,"[i]"),e(/<\/u>/gi,"[/u]"),e(/(.*?)<\/span>/gi,"[u]$1[/u]"),e(//gi,"[u]"),e(/]*>/gi,"[quote]"),e(/<\/blockquote>/gi,"[/quote]"),e(/
              /gi,"\n"),e(//gi,"\n"),e(/
              /gi,"\n"),e(/

              /gi,""),e(/<\/p>/gi,"\n"),e(/ |\u00a0/gi," "),e(/"/gi,'"'),e(/</gi,"<"),e(/>/gi,">"),e(/&/gi,"&"),t))})})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/charmap/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/charmap/plugin.min.js new file mode 100644 index 0000000..a17128e --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/charmap/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function l(e,r){var n=e.fire("insertCustomChar",{chr:r}).chr;e.execCommand("mceInsertContent",!1,n)}function i(e){return function(){return e}}function e(e){return e}function r(){return c}var t,g,n=tinymce.util.Tools.resolve("tinymce.PluginManager"),a=function(e){return n=typeof(r=e),(null===r?"null":"object"==n&&(Array.prototype.isPrototypeOf(r)||r.constructor&&"Array"===r.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(r)||r.constructor&&"String"===r.constructor.name)?"string":n)===t;var r,n},m=i(!(t="array")),o=i(!(g=null)),c={fold:function(e,r){return e()},isSome:m,isNone:o,getOr:e,getOrThunk:u,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:u,map:r,each:function(){},bind:r,exists:m,forall:o,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function u(e){return e()}function f(e,r){for(var n=e.length,t=new Array(n),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?n.push(o):(o-=65536,n.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,n),n.length=0)}return t+String.fromCharCode.apply(null,n)}function v(e,r){var c=[],u=r.toLowerCase();return function(e){for(var r,n,t,a,i=0,o=e.length;i'+r+""),t.selection.select(t.$("#__new").removeAttr("id")[0])},function(e){t.dom.setAttrib(e,"class","language-"+a),e.innerHTML=r,h(t).highlightElement(e),t.selection.select(e)})}),e.close()}})}!function(e,n){var t,a,r=window.Prism;window.Prism={manual:!0},t=this,a=function(){var e,n,h,t,a,r,s,i,o,l,u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:f,c={exports:{}};function y(e,n){return"___"+e.toUpperCase()+n+"___"}return e=c,n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,e={},j={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof T?new T(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=i.reach);y+=h.value.length,h=h.next){var w=h.value;if(t.length>n.length)return;if(!(w instanceof T)){var k,v=1;if(b){if(!(k=O(f,y,n,g)))break;var _=k.index,x=k.index+k[0].length,F=y;for(F+=h.value.length;F<=_;)F+=(h=h.next).value.length;if(y=F-=h.value.length,h.value instanceof T)continue;for(var P=h;P!==t.tail&&(Fi.reach&&(i.reach=z);var E=h.prev;S&&(E=N(t,E,S),y+=S.length),function(e,n,t){for(var a=n.next,r=0;ri.reach&&(i.reach=C.reach))}}}}(e,r,n,r.head,0),function(e){for(var n=[],t=e.head.next;t!==e.tail;)n.push(t.value),t=t.next;return n}(r)},hooks:{all:{},add:function(e,n){var t=j.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=j.hooks.all[e];if(t&&t.length)for(var a,r=0;a=t[r++];)a(n)}},Token:T};function T(e,n,t,a){this.type=e,this.content=n,this.alias=t,this.length=0|(a||"").length}function O(e,n,t,a){e.lastIndex=n;var r,s=e.exec(t);return s&&a&&s[1]&&(r=s[1].length,s.index+=r,s[0]=s[0].slice(r)),s}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function N(e,n,t){var a=n.next,r={value:t,prev:n,next:a};return n.next=r,a.prev=r,e.length++,r}if(u.Prism=j,T.stringify=function n(e,t){if("string"==typeof e)return e;if(Array.isArray(e)){var a="";return e.forEach(function(e){a+=n(e,t)}),a}var r={type:e.type,content:n(e.content,t),tag:"span",classes:["token",e.type],attributes:{},language:t},s=e.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(r.classes,s):r.classes.push(s)),j.hooks.run("wrap",r);var i,o="";for(i in r.attributes)o+=" "+i+'="'+(r.attributes[i]||"").replace(/"/g,""")+'"';return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+o+">"+r.content+""},!u.document)return u.addEventListener&&(j.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,a=n.code,r=n.immediateClose;u.postMessage(j.highlight(a,j.languages[t],t)),r&&u.close()},!1)),j;var t,a=j.util.currentScript();function r(){j.manual||j.highlightAll()}return a&&(j.filename=a.src,a.hasAttribute("data-manual")&&(j.manual=!0)),j.manual||("loading"===(t=document.readyState)||"interactive"===t&&a&&a.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)),j}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}),e.exports&&(e.exports=n),void 0!==u&&(u.Prism=n),Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},h=Prism,Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,s){var i;a.language===r&&(i=a.tokenStack=[],a.code=a.code.replace(e,function(e){if("function"==typeof s&&!s(e))return e;for(var n,t=i.length;-1!==a.code.indexOf(n=y(r,t));)++t;return i[t]=e,n}),a.grammar=h.languages.markup)}},tokenizePlaceholders:{value:function(g,b){var m,f;g.language===b&&g.tokenStack&&(g.grammar=h.languages[b],m=0,f=Object.keys(g.tokenStack),function e(n){for(var t=0;t=f.length);t++){var a,r,s,i,o,l,u,c,d,p=n[t];"string"==typeof p||p.content&&"string"==typeof p.content?(a=f[m],r=g.tokenStack[a],s="string"==typeof p?p:p.content,i=y(b,a),-1<(o=s.indexOf(i))&&(++m,l=s.substring(0,o),u=new h.Token(b,h.tokenize(r,g.grammar),"language-"+b,r),c=s.substring(o+i.length),d=[],l&&d.push.apply(d,e([l])),d.push(u),c&&d.push.apply(d,e([c])),"string"==typeof p?n.splice.apply(n,[t,1].concat(d)):p.content=d)):p.content&&e(p.content)}return n}(g.tokens))}}}),Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c.boolean,t=Prism,a=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,r=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return a.source}),t.languages.cpp=t.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return a.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:a,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),t.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:module|import)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return r})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),t.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t.languages.cpp}}}}),t.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),t.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:t.languages.extend("cpp",{})}}),t.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},t.languages.cpp["base-clause"]),function(t){function a(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function r(e,n,t){return RegExp(a(e,n),t||"")}function e(e,n){for(var t=0;t>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",s="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(s),c=RegExp(l(n+" "+s+" "+i+" "+o)),d=l(s+" "+i+" "+o),p=l(n+" "+s+" "+o),g=e(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=e(/\((?:[^()]|<>)*\)/.source,2),m=/@?\b[A-Za-z_]\w*\b/.source,f=a(/<<0>>(?:\s*<<1>>)?/.source,[m,g]),h=a(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=a(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[h,y]),k=a(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[g,b,y]),v=a(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=a(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,h,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,P=/"(?:\\.|[^\\"\r\n])*"/.source;t.languages.csharp=t.languages.extend("clike",{string:[{pattern:r(/(^|[^$\\])<<0>>/.source,[/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source]),lookbehind:!0,greedy:!0},{pattern:r(/(^|[^@$\\])<<0>>/.source,[P]),lookbehind:!0,greedy:!0},{pattern:RegExp(F),greedy:!0,alias:"character"}],"class-name":[{pattern:r(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[m,_]),lookbehind:!0,inside:x},{pattern:r(/(\busing\s+)<<0>>(?=\s*=)/.source,[m]),lookbehind:!0},{pattern:r(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:r(/(\bcatch\s*\(\s*)<<0>>/.source,[h]),lookbehind:!0,inside:x},{pattern:r(/(\bwhere\s+)<<0>>/.source,[m]),lookbehind:!0},{pattern:r(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:r(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,p,m]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:ul|lu|[dflmu])?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),t.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),t.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:r(/([(,]\s*)<<0>>(?=\s*:)/.source,[m]),lookbehind:!0,alias:"punctuation"}}),t.languages.insertBefore("csharp","class-name",{namespace:{pattern:r(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[m]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:r(/(\b(?:default|typeof|sizeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:r(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,h]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:r(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:r(/<<0>>\s*<<1>>(?=\s*\()/.source,[m,g]),inside:{function:r(/^<<0>>/.source,[m]),generic:{pattern:RegExp(g),alias:"class-name",inside:x}}},"type-list":{pattern:r(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,m,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:r(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:t.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var A=P+"|"+F,S=a(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[A]),$=e(a(/[^"'/()]|<<0>>|\(<>*\)/.source,[S]),2),z=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,E=a(/<<0>>(?:\s*\(<<1>>*\))?/.source,[h,$]);t.languages.insertBefore("csharp","class-name",{attribute:{pattern:r(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[z,E]),lookbehind:!0,greedy:!0,inside:{target:{pattern:r(/^<<0>>(?=\s*:)/.source,[z]),alias:"keyword"},"attribute-arguments":{pattern:r(/\(<<0>>*\)/.source,[$]),inside:t.languages.csharp},"class-name":{pattern:RegExp(h),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var C=/:[^}\r\n]+/.source,j=e(a(/[^"'/()]|<<0>>|\(<>*\)/.source,[S]),2),T=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[j,C]),O=e(a(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[A]),2),N=a(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[O,C]);function B(e,n){return{interpolation:{pattern:r(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[e]),lookbehind:!0,inside:{"format-string":{pattern:r(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[n,C]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:t.languages.csharp}}},string:/[\s\S]+/}}t.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:r(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[T]),lookbehind:!0,greedy:!0,inside:B(T,j)},{pattern:r(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:B(N,O)}]})}(Prism),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp,function(e){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism),s=Prism,i=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,o=/(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,l={pattern:RegExp(o+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}},s.languages.java=s.languages.extend("clike",{"class-name":[l,{pattern:RegExp(o+/[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),lookbehind:!0,inside:l.inside}],keyword:i,function:[s.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),s.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),s.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":l,keyword:i,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return i.source})),lookbehind:!0,inside:{punctuation:/\./}}}),Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),Prism.languages.js=Prism.languages.javascript,Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,n){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:Prism.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml,function(n){var e=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,t=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,r=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;n.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/i,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:bool|boolean|int|integer|float|string|object|array)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:bool|int|float|string|object|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*[\w|]\|\s*)(?:null|false)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|self|static|callable|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?[\w|]\|\s*)(?:null|false)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:bool|int|float|string|object|void|array(?!\s*\()|mixed|iterable|(?:null|false)(?=\s*\|))\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:null|false)\b/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|match|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:r,punctuation:s};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:n.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];n.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:a,operator:r,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),n.hooks.add("before-tokenize",function(e){/<\?/.test(e.code)&&n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/gi)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism),Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp(/%r/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp(/%[qQiIwWxs]?/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S])*\)/.source,/\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S])*\]/.source,/<(?:[^<>\\]|\\[\s\S])*>/.source].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?/}},interpolation:n}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|[a-z_]\w*$/i,alias:"symbol",inside:{punctuation:/^<<[-~]?'|'$/}}}}],e.languages.rb=e.languages.ruby}(Prism),{boltExport:c.exports}},"object"==typeof e&&void 0!==n?n.exports=a():(t="undefined"!=typeof globalThis?globalThis:t||self).EphoxContactWrapper=a();window.Prism;window.Prism=r}(b,m);var k=m.exports.boltExport;t.add("codesample",function(n){var t,r,a,s;function e(){return s.execCommand("codesample")}r=(t=n).$,t.on("PreProcess",function(e){r("pre[contenteditable=false]",e.node).filter(c(u)).each(function(e,n){var t=r(n),a=n.textContent;t.attr("class",r.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(r("").each(function(){this.textContent=a}))})}),t.on("SetContent",function(){var e=r("pre").filter(c(u)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){r(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),h(t).highlightElement(n),n.className=r.trim(n.className)})})}),(s=n).ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:e,onSetup:function(t){function e(){var e,n;t.setActive((n=(e=s).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))}return s.on("NodeChange",e),function(){return s.off("NodeChange",e)}}}),s.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:e}),(a=n).addCommand("codesample",function(){var e=a.selection.getNode();a.selection.isCollapsed()||u(e)?w(a):a.formatter.toggle("code")}),n.on("dblclick",function(e){u(e.target)&&w(n)})})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/colorpicker/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/colorpicker/plugin.min.js new file mode 100644 index 0000000..3b92473 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/colorpicker/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/contextmenu/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/contextmenu/plugin.min.js new file mode 100644 index 0000000..258bb2c --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/contextmenu/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/directionality/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/directionality/plugin.min.js new file mode 100644 index 0000000..9cf34af --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/directionality/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function n(t){return function(n){return typeof n===t}}function u(n){return function(){return n}}function t(n){return n}function r(){return d}var o,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return r=typeof(t=n),(null===t?"null":"object"==r&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":r)===o;var t,r},c=n("boolean"),f=n("function"),l=n("number"),a=u(!(o="string")),m=u(!0),d={fold:function(n,t){return n()},isSome:a,isNone:m,getOr:t,getOrThunk:s,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(void 0),or:t,orThunk:s,map:r,each:function(){},bind:r,exists:a,forall:m,filter:function(){return d},toArray:function(){return[]},toString:u("none()")};function s(n){return n()}function g(n,t){for(var r=0,o=n.length;r', + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + char: '\ud83d\udd22', + fitzpatrick_scale: false, + category: "symbols" + }, + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + char: '\ud83d\ude00', + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + char: '\ud83d\ude2c', + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + char: '\ud83d\ude01', + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + char: '\ud83d\ude02', + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + char: '\ud83e\udd23', + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + char: '\ud83e\udd73', + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + char: '\ud83d\ude03', + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + char: '\ud83d\ude04', + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + char: '\ud83d\ude05', + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + char: '\ud83d\ude06', + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + char: '\ud83d\ude07', + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + char: '\ud83d\ude09', + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + char: '\ud83d\ude0a', + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + char: '\ud83d\ude42', + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + char: '\ud83d\ude43', + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + char: '\u263a\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + char: '\ud83d\ude0b', + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + char: '\ud83d\ude0c', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + char: '\ud83d\ude0d', + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + char: '\ud83e\udd70', + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude18', + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude17', + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude19', + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: '\ud83d\ude1a', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + char: '\ud83d\ude1c', + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + char: '\ud83e\udd2a', + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + char: '\ud83e\udd28', + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + char: '\ud83e\uddd0', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + char: '\ud83d\ude1d', + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + char: '\ud83d\ude1b', + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + char: '\ud83e\udd11', + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + char: '\ud83e\udd13', + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + char: '\ud83d\ude0e', + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + char: '\ud83e\udd29', + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + char: '\ud83e\udd21', + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + char: '\ud83e\udd20', + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + char: '\ud83e\udd17', + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + char: '\ud83d\ude0f', + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + char: '\ud83d\ude36', + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + char: '\ud83d\ude10', + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + char: '\ud83d\ude11', + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + char: '\ud83d\ude12', + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + char: '\ud83d\ude44', + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + char: '\ud83e\udd14', + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + char: '\ud83e\udd25', + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + char: '\ud83e\udd2d', + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + char: '\ud83e\udd2b', + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + char: '\ud83e\udd2c', + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + char: '\ud83e\udd2f', + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + char: '\ud83d\ude33', + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + char: '\ud83d\ude1e', + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + char: '\ud83d\ude1f', + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + char: '\ud83d\ude20', + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + char: '\ud83d\ude21', + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + char: '\ud83d\ude14', + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + char: '\ud83d\ude15', + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + char: '\ud83d\ude41', + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + char: '\u2639', + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + char: '\ud83d\ude23', + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + char: '\ud83d\ude16', + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + char: '\ud83d\ude2b', + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + char: '\ud83d\ude29', + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + char: '\ud83e\udd7a', + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + char: '\ud83d\ude24', + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + char: '\ud83d\ude2e', + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + char: '\ud83d\ude31', + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + char: '\ud83d\ude28', + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + char: '\ud83d\ude30', + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + char: '\ud83d\ude2f', + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + char: '\ud83d\ude26', + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + char: '\ud83d\ude27', + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + char: '\ud83d\ude22', + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + char: '\ud83d\ude25', + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + char: '\ud83e\udd24', + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + char: '\ud83d\ude2a', + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + char: '\ud83d\ude13', + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + char: '\ud83e\udd75', + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + char: '\ud83e\udd76', + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + char: '\ud83d\ude2d', + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + char: '\ud83d\ude35', + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + char: '\ud83d\ude32', + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + char: '\ud83e\udd10', + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + char: '\ud83e\udd22', + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + char: '\ud83e\udd27', + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + char: '\ud83e\udd2e', + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + char: '\ud83d\ude37', + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + char: '\ud83e\udd12', + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + char: '\ud83e\udd15', + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + char: '\ud83e\udd74', + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + char: '\ud83d\ude34', + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + char: '\ud83d\udca4', + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + char: '\ud83d\udca9', + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + char: '\ud83d\ude08', + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + char: '\ud83d\udc7f', + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + char: '\ud83d\udc79', + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + char: '\ud83d\udc7a', + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + char: '\ud83d\udc80', + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + char: '\ud83d\udc7b', + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + char: '\ud83d\udc7d', + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + char: '\ud83e\udd16', + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + char: '\ud83d\ude3a', + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + char: '\ud83d\ude38', + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + char: '\ud83d\ude39', + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + char: '\ud83d\ude3b', + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + char: '\ud83d\ude3c', + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + char: '\ud83d\ude3d', + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + char: '\ud83d\ude40', + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + char: '\ud83d\ude3f', + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + char: '\ud83d\ude3e', + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + char: '\ud83e\udd32', + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + char: '\ud83d\ude4c', + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + char: '\ud83d\udc4f', + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + char: '\ud83d\udc4b', + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + char: '\ud83e\udd19', + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + char: '\ud83d\udc4d', + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + char: '\ud83d\udc4e', + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + char: '\ud83d\udc4a', + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + char: '\u270a', + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + char: '\ud83e\udd1b', + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + char: '\ud83e\udd1c', + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + char: '\u270c', + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + char: '\ud83d\udc4c', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + char: '\u270b', + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + char: '\ud83e\udd1a', + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + char: '\ud83d\udc50', + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + char: '\ud83d\udcaa', + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + char: '\ud83d\ude4f', + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + char: '\ud83e\uddb6', + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + char: '\ud83e\uddb5', + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + char: '\ud83e\udd1d', + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + char: '\u261d', + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + char: '\ud83d\udc46', + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + char: '\ud83d\udc47', + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + char: '\ud83d\udc48', + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + char: '\ud83d\udc49', + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + char: '\ud83d\udd95', + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + char: '\ud83d\udd90', + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + char: '\ud83e\udd1f', + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + char: '\ud83e\udd18', + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + char: '\ud83e\udd1e', + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + char: '\ud83d\udd96', + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + char: '\u270d', + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + char: '\ud83e\udd33', + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + char: '\ud83d\udc85', + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + char: '\ud83d\udc44', + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + char: '\ud83e\uddb7', + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + char: '\ud83d\udc45', + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + char: '\ud83d\udc42', + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + char: '\ud83d\udc43', + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + char: '\ud83d\udc41', + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + char: '\ud83d\udc40', + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + char: '\ud83e\udde0', + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + char: '\ud83d\udc64', + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + char: '\ud83d\udc65', + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + char: '\ud83d\udde3', + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + char: '\ud83d\udc76', + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + char: '\ud83e\uddd2', + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + char: '\ud83d\udc66', + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + char: '\ud83d\udc67', + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + char: '\ud83e\uddd1', + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + char: '\ud83d\udc68', + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + char: '\ud83d\udc69', + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + char: '\ud83d\udc71\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + char: '\ud83d\udc71', + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + char: '\ud83e\uddd4', + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + char: '\ud83e\uddd3', + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + char: '\ud83d\udc74', + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + char: '\ud83d\udc75', + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + char: '\ud83d\udc72', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + char: '\ud83e\uddd5', + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + char: '\ud83d\udc73\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + char: '\ud83d\udc73', + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + char: '\ud83d\udc6e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + char: '\ud83d\udc6e', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + char: '\ud83d\udc77\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + char: '\ud83d\udc77', + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + char: '\ud83d\udc82\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + char: '\ud83d\udc82', + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + char: '\ud83d\udd75\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + char: '\ud83d\udd75', + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + char: '\ud83d\udc69\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + char: '\ud83d\udc68\u200d\u2695\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udf3e', + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udf73', + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udf93', + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfa4', + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfeb', + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfed', + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + char: '\ud83d\udc69\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + char: '\ud83d\udc68\u200d\ud83d\udcbb', + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\udcbc', + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + char: '\ud83d\udc69\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + char: '\ud83d\udc68\u200d\ud83d\udd27', + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\udd2c', + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83c\udfa8', + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\ude92', + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + char: '\ud83d\udc69\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + char: '\ud83d\udc68\u200d\u2708\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + char: '\ud83d\udc69\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + char: '\ud83d\udc68\u200d\ud83d\ude80', + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + char: '\ud83d\udc69\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + char: '\ud83d\udc68\u200d\u2696\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + char: '\ud83e\uddb8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + char: '\ud83e\uddb8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + char: '\ud83e\uddb9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + char: '\ud83e\uddb9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + char: '\ud83e\udd36', + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + char: '\ud83c\udf85', + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + char: '\ud83e\uddd9\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + char: '\ud83e\uddd9\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + char: '\ud83e\udddd\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + char: '\ud83e\udddd\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + char: '\ud83e\udddb\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + char: '\ud83e\udddb\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + char: '\ud83e\udddf\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + char: '\ud83e\udddf\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + char: '\ud83e\uddde\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + char: '\ud83e\uddde\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + char: '\ud83e\udddc\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + char: '\ud83e\udddc\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + char: '\ud83e\uddda\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + char: '\ud83e\uddda\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + char: '\ud83d\udc7c', + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + char: '\ud83e\udd30', + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + char: '\ud83e\udd31', + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + char: '\ud83d\udc78', + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + char: '\ud83e\udd34', + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + char: '\ud83d\udc70', + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + char: '\ud83e\udd35', + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + char: '\ud83c\udfc3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + char: '\ud83c\udfc3', + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + char: '\ud83d\udeb6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + char: '\ud83d\udeb6', + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + char: '\ud83d\udc83', + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + char: '\ud83d\udd7a', + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + char: '\ud83d\udc6f', + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + char: '\ud83d\udc6f\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + char: '\ud83d\udc6b', + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + char: '\ud83d\udc6c', + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + char: '\ud83d\udc6d', + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + char: '\ud83d\ude47\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + char: '\ud83d\ude47', + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + char: '\ud83e\udd26\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + char: '\ud83e\udd26\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + char: '\ud83e\udd37', + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + char: '\ud83e\udd37\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + char: '\ud83d\udc81', + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + char: '\ud83d\udc81\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + char: '\ud83d\ude45', + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + char: '\ud83d\ude45\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + char: '\ud83d\ude46', + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + char: '\ud83d\ude46\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + char: '\ud83d\ude4b', + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + char: '\ud83d\ude4b\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + char: '\ud83d\ude4e', + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + char: '\ud83d\ude4e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + char: '\ud83d\ude4d', + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + char: '\ud83d\ude4d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + char: '\ud83d\udc87', + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + char: '\ud83d\udc87\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + char: '\ud83d\udc86', + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + char: '\ud83d\udc86\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + char: '\ud83e\uddd6\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + char: '\ud83e\uddd6\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: '\ud83d\udc91', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: '\ud83d\udc8f', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: '\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69', + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: '\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + char: '\ud83d\udc6a', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc69\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc69\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc68\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: '\ud83d\udc68\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66', + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: '\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67', + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + char: '\ud83e\uddf6', + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + char: '\ud83e\uddf5', + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + char: '\ud83e\udde5', + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + char: '\ud83e\udd7c', + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + char: '\ud83d\udc5a', + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + char: '\ud83d\udc55', + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + char: '\ud83d\udc56', + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + char: '\ud83d\udc54', + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + char: '\ud83d\udc57', + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + char: '\ud83d\udc59', + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + char: '\ud83d\udc58', + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + char: '\ud83d\udc84', + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + char: '\ud83d\udc8b', + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + char: '\ud83d\udc63', + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + char: '\ud83e\udd7f', + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + char: '\ud83d\udc60', + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + char: '\ud83d\udc61', + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + char: '\ud83d\udc62', + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + char: '\ud83d\udc5e', + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + char: '\ud83d\udc5f', + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + char: '\ud83e\udd7e', + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + char: '\ud83e\udde6', + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + char: '\ud83e\udde4', + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + char: '\ud83e\udde3', + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + char: '\ud83d\udc52', + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + char: '\ud83c\udfa9', + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + char: '\ud83e\udde2', + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + char: '\u26d1', + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + char: '\ud83c\udf93', + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + char: '\ud83d\udc51', + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + char: '\ud83c\udf92', + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + char: '\ud83e\uddf3', + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + char: '\ud83d\udc5d', + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + char: '\ud83d\udc5b', + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + char: '\ud83d\udc5c', + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + char: '\ud83d\udcbc', + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + char: '\ud83d\udc53', + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + char: '\ud83d\udd76', + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + char: '\ud83e\udd7d', + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + char: '\ud83d\udc8d', + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + char: '\ud83c\udf02', + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + char: '\ud83d\udc36', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + char: '\ud83d\udc31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + char: '\ud83d\udc2d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + char: '\ud83d\udc30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + char: '\ud83e\udd8a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + char: '\ud83d\udc3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + char: '\ud83d\udc3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + char: '\ud83d\udc2f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + char: '\ud83e\udd81', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: '\ud83d\udc2e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + char: '\ud83d\udc37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + char: '\ud83d\udc3d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + char: '\ud83d\udc38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + char: '\ud83e\udd91', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + char: '\ud83d\udc19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + char: '\ud83e\udd90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + char: '\ud83d\udc35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + char: '\ud83e\udd8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + char: '\ud83d\ude48', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + char: '\ud83d\ude49', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + char: '\ud83d\ude4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + char: '\ud83d\udc12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + char: '\ud83d\udc14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + char: '\ud83d\udc26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + char: '\ud83d\udc24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + char: '\ud83d\udc23', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + char: '\ud83d\udc25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + char: '\ud83e\udd86', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + char: '\ud83e\udd85', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + char: '\ud83e\udd89', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + char: '\ud83e\udd87', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + char: '\ud83d\udc3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + char: '\ud83d\udc34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + char: '\ud83e\udd84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + char: '\ud83d\udc1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + char: '\ud83d\udc1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + char: '\ud83e\udd8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + char: '\ud83d\udc0c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + char: '\ud83d\udc1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + char: '\ud83d\udc1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + char: '\ud83e\udd97', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + char: '\ud83d\udd77', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + char: '\ud83e\udd82', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + char: '\ud83e\udd80', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + char: '\ud83d\udc0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + char: '\ud83e\udd8e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + char: '\ud83e\udd96', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + char: '\ud83e\udd95', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + char: '\ud83d\udc22', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + char: '\ud83d\udc20', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + char: '\ud83d\udc1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + char: '\ud83d\udc21', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + char: '\ud83d\udc2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + char: '\ud83e\udd88', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: '\ud83d\udc33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: '\ud83d\udc0b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + char: '\ud83d\udc0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc06', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + char: '\ud83e\udd93', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + char: '\ud83d\udc05', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + char: '\ud83d\udc03', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + char: '\ud83d\udc02', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: '\ud83d\udc04', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + char: '\ud83e\udd8c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + char: '\ud83d\udc2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + char: '\ud83d\udc2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + char: '\ud83e\udd92', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + char: '\ud83d\udc18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + char: '\ud83e\udd8f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc10', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + char: '\ud83d\udc0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + char: '\ud83d\udc11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + char: '\ud83d\udc0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + char: '\ud83d\udc16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + char: '\ud83d\udc00', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + char: '\ud83d\udc01', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + char: '\ud83d\udc13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + char: '\ud83e\udd83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + char: '\ud83d\udd4a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + char: '\ud83d\udc15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + char: '\ud83d\udc29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + char: '\ud83d\udc08', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + char: '\ud83d\udc07', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + char: '\ud83d\udc3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + char: '\ud83e\udd94', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + char: '\ud83e\udd9d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + char: '\ud83e\udd99', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + char: '\ud83e\udd9b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + char: '\ud83e\udd98', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + char: '\ud83e\udda1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + char: '\ud83e\udda2', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + char: '\ud83e\udd9a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + char: '\ud83e\udd9c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + char: '\ud83e\udd9e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + char: '\ud83e\udd9f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + char: '\ud83d\udc3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: '\ud83d\udc09', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: '\ud83d\udc32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + char: '\ud83c\udf35', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + char: '\ud83c\udf84', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + char: '\ud83c\udf32', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + char: '\ud83c\udf33', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + char: '\ud83c\udf34', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + char: '\ud83c\udf31', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + char: '\ud83c\udf3f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + char: '\u2618', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + char: '\ud83c\udf40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + char: '\ud83c\udf8d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + char: '\ud83c\udf8b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + char: '\ud83c\udf43', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + char: '\ud83c\udf42', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + char: '\ud83c\udf41', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + char: '\ud83c\udf3e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + char: '\ud83c\udf3a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + char: '\ud83c\udf3b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + char: '\ud83c\udf39', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + char: '\ud83e\udd40', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + char: '\ud83c\udf37', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + char: '\ud83c\udf3c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + char: '\ud83c\udf38', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + char: '\ud83d\udc90', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + char: '\ud83c\udf44', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + char: '\ud83c\udf30', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + char: '\ud83c\udf83', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + char: '\ud83d\udc1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + char: '\ud83d\udd78', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + char: '\ud83c\udf0e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + char: '\ud83c\udf0d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + char: '\ud83c\udf0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf15', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + char: '\ud83c\udf16', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf17', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf18', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf11', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf12', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf13', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + char: '\ud83c\udf14', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1d', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: '\ud83c\udf1c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + char: '\ud83c\udf1e', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + char: '\ud83c\udf19', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + char: '\u2b50', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + char: '\ud83c\udf1f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + char: '\ud83d\udcab', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + char: '\u2728', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + char: '\u2604', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + char: '\u2600\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + char: '\ud83c\udf24', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + char: '\u26c5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + char: '\ud83c\udf25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + char: '\ud83c\udf26', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + char: '\u2601\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + char: '\ud83c\udf27', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + char: '\u26c8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + char: '\ud83c\udf29', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + char: '\u26a1', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + char: '\ud83d\udd25', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + char: '\ud83d\udca5', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + char: '\u2744\ufe0f', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + char: '\ud83c\udf28', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + char: '\u26c4', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + char: '\u2603', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + char: '\ud83c\udf2c', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + char: '\ud83d\udca8', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + char: '\ud83c\udf2a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + char: '\ud83c\udf2b', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + char: '\u2602', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + char: '\u2614', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + char: '\ud83d\udca7', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + char: '\ud83d\udca6', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + char: '\ud83c\udf0a', + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + char: '\ud83c\udf4f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + char: '\ud83c\udf4e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + char: '\ud83c\udf4a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + char: '\ud83c\udf4b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + char: '\ud83c\udf4c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + char: '\ud83c\udf49', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + char: '\ud83c\udf47', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + char: '\ud83c\udf53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf48', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + char: '\ud83c\udf52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + char: '\ud83c\udf4d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + char: '\ud83e\udd65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + char: '\ud83e\udd5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + char: '\ud83e\udd6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + char: '\ud83e\udd51', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + char: '\ud83e\udd66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + char: '\ud83c\udf45', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + char: '\ud83c\udf46', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + char: '\ud83e\udd52', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + char: '\ud83e\udd55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + char: '\ud83c\udf36', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + char: '\ud83e\udd54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + char: '\ud83c\udf3d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + char: '\ud83e\udd6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + char: '\ud83c\udf60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + char: '\ud83e\udd5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + char: '\ud83c\udf6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + char: '\ud83e\udd50', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + char: '\ud83c\udf5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + char: '\ud83e\udd56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + char: '\ud83e\udd6f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + char: '\ud83e\udd68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + char: '\ud83e\uddc0', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + char: '\ud83e\udd5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + char: '\ud83e\udd53', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + char: '\ud83e\udd69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + char: '\ud83e\udd5e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + char: '\ud83c\udf57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + char: '\ud83c\udf56', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + char: '\ud83e\uddb4', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + char: '\ud83c\udf64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + char: '\ud83c\udf73', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + char: '\ud83c\udf54', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + char: '\ud83c\udf5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + char: '\ud83e\udd59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + char: '\ud83c\udf2d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + char: '\ud83c\udf55', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + char: '\ud83e\udd6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + char: '\ud83e\udd6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + char: '\ud83c\udf5d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + char: '\ud83c\udf2e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + char: '\ud83c\udf2f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + char: '\ud83e\udd57', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + char: '\ud83e\udd58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + char: '\ud83c\udf5c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + char: '\ud83c\udf72', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + char: '\ud83c\udf65', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + char: '\ud83e\udd60', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + char: '\ud83c\udf63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + char: '\ud83c\udf71', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + char: '\ud83c\udf5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + char: '\ud83c\udf59', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + char: '\ud83c\udf5a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + char: '\ud83c\udf58', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + char: '\ud83c\udf62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + char: '\ud83c\udf61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + char: '\ud83c\udf67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + char: '\ud83c\udf68', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + char: '\ud83c\udf66', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + char: '\ud83e\udd67', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + char: '\ud83c\udf70', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + char: '\ud83e\uddc1', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + char: '\ud83e\udd6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + char: '\ud83c\udf82', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + char: '\ud83c\udf6e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + char: '\ud83c\udf6c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + char: '\ud83c\udf6d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + char: '\ud83c\udf6b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + char: '\ud83c\udf7f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + char: '\ud83e\udd5f', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + char: '\ud83c\udf69', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + char: '\ud83c\udf6a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + char: '\ud83e\udd5b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: '\ud83c\udf7a', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: '\ud83c\udf7b', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + char: '\ud83e\udd42', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + char: '\ud83c\udf77', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + char: '\ud83e\udd43', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + char: '\ud83c\udf78', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + char: '\ud83c\udf79', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + char: '\ud83c\udf7e', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + char: '\ud83c\udf76', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + char: '\ud83c\udf75', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + char: '\ud83e\udd64', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + char: '\u2615', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + char: '\ud83c\udf7c', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + char: '\ud83e\uddc2', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + char: '\ud83e\udd44', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + char: '\ud83c\udf74', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + char: '\ud83c\udf7d', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + char: '\ud83e\udd63', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + char: '\ud83e\udd61', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + char: '\ud83e\udd62', + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + char: '\u26bd', + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + char: '\ud83c\udfc0', + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + char: '\ud83c\udfc8', + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + char: '\u26be', + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + char: '\ud83e\udd4e', + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + char: '\ud83c\udfbe', + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + char: '\ud83c\udfd0', + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + char: '\ud83c\udfc9', + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + char: '\ud83e\udd4f', + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + char: '\ud83c\udfb1', + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + char: '\u26f3', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + char: '\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + char: '\ud83c\udfcc', + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + char: '\ud83c\udfd3', + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + char: '\ud83c\udff8', + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + char: '\ud83e\udd45', + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + char: '\ud83c\udfd2', + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + char: '\ud83c\udfd1', + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + char: '\ud83e\udd4d', + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + char: '\ud83c\udfcf', + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + char: '\ud83c\udfbf', + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + char: '\u26f7', + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + char: '\ud83c\udfc2', + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + char: '\ud83e\udd3a', + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: '\ud83e\udd3c\u200d\u2640\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: '\ud83e\udd3c\u200d\u2642\ufe0f', + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + char: '\ud83e\udd38\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + char: '\ud83e\udd38\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + char: '\ud83e\udd3e\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + char: '\ud83e\udd3e\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + char: '\u26f8', + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + char: '\ud83e\udd4c', + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + char: '\ud83d\udef9', + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + char: '\ud83d\udef7', + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + char: '\ud83c\udff9', + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + char: '\ud83c\udfa3', + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + char: '\ud83e\udd4a', + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + char: '\ud83e\udd4b', + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + char: '\ud83d\udea3\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + char: '\ud83d\udea3', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + char: '\ud83e\uddd7\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + char: '\ud83e\uddd7\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + char: '\ud83c\udfca\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + char: '\ud83c\udfca', + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: '\ud83e\udd3d\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: '\ud83e\udd3d\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: '\ud83e\uddd8\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: '\ud83e\uddd8\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + char: '\ud83c\udfc4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + char: '\ud83c\udfc4', + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + char: '\ud83d\udec0', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + char: '\u26f9\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + char: '\u26f9', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + char: '\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + char: '\ud83c\udfcb', + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + char: '\ud83d\udeb4\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + char: '\ud83d\udeb4', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + char: '\ud83d\udeb5\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + char: '\ud83d\udeb5', + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + char: '\ud83c\udfc7', + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + char: '\ud83d\udd74', + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + char: '\ud83c\udfc6', + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + char: '\ud83c\udfbd', + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + char: '\ud83c\udfc5', + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + char: '\ud83c\udf96', + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + char: '\ud83e\udd47', + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + char: '\ud83e\udd48', + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + char: '\ud83e\udd49', + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + char: '\ud83c\udf97', + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + char: '\ud83c\udff5', + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + char: '\ud83c\udfab', + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + char: '\ud83c\udf9f', + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + char: '\ud83c\udfad', + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + char: '\ud83c\udfa8', + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + char: '\ud83c\udfaa', + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: '\ud83e\udd39\u200d\u2640\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: '\ud83e\udd39\u200d\u2642\ufe0f', + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + char: '\ud83c\udfa4', + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + char: '\ud83c\udfa7', + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + char: '\ud83c\udfbc', + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + char: '\ud83c\udfb9', + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + char: '\ud83e\udd41', + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + char: '\ud83c\udfb7', + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + char: '\ud83c\udfba', + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + char: '\ud83c\udfb8', + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + char: '\ud83c\udfbb', + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + char: '\ud83c\udfac', + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + char: '\ud83c\udfae', + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + char: '\ud83d\udc7e', + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + char: '\ud83c\udfaf', + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + char: '\ud83c\udfb2', + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + char: "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + char: '\ud83c\udfb0', + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + char: '\ud83e\udde9', + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + char: '\ud83c\udfb3', + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + char: '\ud83d\ude97', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + char: '\ud83d\ude95', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude99', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + char: '\ud83d\ude8c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + char: '\ud83d\ude8e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + char: '\ud83c\udfce', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + char: '\ud83d\ude93', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + char: '\ud83d\ude91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + char: '\ud83d\ude92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + char: '\ud83d\ude90', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + char: '\ud83d\ude9a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + char: '\ud83d\ude9b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + char: '\ud83d\ude9c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + char: '\ud83d\udef4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + char: '\ud83c\udfcd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + char: '\ud83d\udeb2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + char: '\ud83d\udef5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + char: '\ud83d\udea8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + char: '\ud83d\ude94', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + char: '\ud83d\ude8d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + char: '\ud83d\ude98', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + char: '\ud83d\ude96', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: '\ud83d\udea1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: '\ud83d\udea0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + char: '\ud83d\ude9f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude83', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + char: '\ud83d\ude8b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude9d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude84', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + char: '\ud83d\ude85', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude88', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude9e', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + char: '\ud83d\ude82', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + char: '\ud83d\ude87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + char: '\ud83d\ude8a', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + char: '\ud83d\ude89', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + char: '\ud83d\udef8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + char: '\ud83d\ude81', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + char: '\ud83d\udee9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + char: '\u2708\ufe0f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + char: '\ud83d\udeeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + char: '\ud83d\udeec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + char: '\u26f5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + char: '\ud83d\udee5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + char: '\ud83d\udea4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + char: '\u26f4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + char: '\ud83d\udef3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + char: '\ud83d\ude80', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + char: '\ud83d\udef0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + char: '\ud83d\udcba', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + char: '\ud83d\udef6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + char: '\u2693', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + char: '\ud83d\udea7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + char: '\u26fd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + char: '\ud83d\ude8f', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + char: '\ud83d\udea6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + char: '\ud83d\udea5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + char: '\ud83c\udfc1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + char: '\ud83d\udea2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + char: '\ud83c\udfa1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + char: '\ud83c\udfa2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + char: '\ud83c\udfa0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + char: '\ud83c\udfd7', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + char: '\ud83c\udf01', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + char: '\ud83d\uddfc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + char: '\ud83c\udfed', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + char: '\u26f2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + char: '\ud83c\udf91', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + char: '\u26f0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + char: '\ud83c\udfd4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + char: '\ud83d\uddfb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + char: '\ud83c\udf0b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + char: '\ud83d\uddfe', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + char: '\ud83c\udfd5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + char: '\u26fa', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + char: '\ud83c\udfde', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + char: '\ud83d\udee3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + char: '\ud83d\udee4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + char: '\ud83c\udf05', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + char: '\ud83c\udf04', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + char: '\ud83c\udfdc', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + char: '\ud83c\udfd6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + char: '\ud83c\udfdd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + char: '\ud83c\udf07', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + char: '\ud83c\udf06', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + char: '\ud83c\udfd9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + char: '\ud83c\udf03', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + char: '\ud83c\udf09', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + char: '\ud83c\udf0c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + char: '\ud83c\udf20', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + char: '\ud83c\udf87', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + char: '\ud83c\udf86', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + char: '\ud83c\udf08', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + char: '\ud83c\udfd8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + char: '\ud83c\udff0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + char: '\ud83c\udfef', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + char: '\ud83c\udfdf', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + char: '\ud83d\uddfd', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + char: '\ud83c\udfe0', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + char: '\ud83c\udfe1', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + char: '\ud83c\udfda', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + char: '\ud83c\udfe2', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + char: '\ud83c\udfec', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + char: '\ud83c\udfe3', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + char: '\ud83c\udfe4', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + char: '\ud83c\udfe5', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + char: '\ud83c\udfe6', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + char: '\ud83c\udfe8', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + char: '\ud83c\udfea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + char: '\ud83c\udfeb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + char: '\ud83c\udfe9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + char: '\ud83d\udc92', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + char: '\ud83c\udfdb', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + char: '\u26ea', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + char: '\ud83d\udd4c', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + char: '\ud83d\udd4d', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + char: '\ud83d\udd4b', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + char: '\u26e9', + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + char: '\u231a', + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + char: '\ud83d\udcf1', + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + char: '\ud83d\udcf2', + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + char: '\ud83d\udcbb', + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + char: '\u2328', + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + char: '\ud83d\udda5', + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + char: '\ud83d\udda8', + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + char: '\ud83d\uddb1', + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + char: '\ud83d\uddb2', + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + char: '\ud83d\udd79', + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + char: '\ud83d\udddc', + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + char: '\ud83d\udcbd', + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + char: '\ud83d\udcbe', + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + char: '\ud83d\udcbf', + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + char: '\ud83d\udcc0', + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + char: '\ud83d\udcfc', + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + char: '\ud83d\udcf7', + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + char: '\ud83d\udcf8', + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + char: '\ud83d\udcf9', + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + char: '\ud83c\udfa5', + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + char: '\ud83d\udcfd', + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + char: '\ud83c\udf9e', + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + char: '\ud83d\udcde', + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + char: '\u260e\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + char: '\ud83d\udcdf', + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + char: '\ud83d\udce0', + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + char: '\ud83d\udcfa', + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + char: '\ud83d\udcfb', + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + char: '\ud83c\udf99', + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + char: '\ud83c\udf9a', + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + char: '\ud83c\udf9b', + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + char: '\ud83e\udded', + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + char: '\u23f1', + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + char: '\u23f2', + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + char: '\u23f0', + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + char: '\ud83d\udd70', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + char: '\u23f3', + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + char: '\u231b', + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + char: '\ud83d\udce1', + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + char: '\ud83d\udd0b', + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + char: '\ud83d\udd0c', + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + char: '\ud83d\udca1', + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + char: '\ud83d\udd26', + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + char: '\ud83d\udd6f', + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + char: '\ud83e\uddef', + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + char: '\ud83d\uddd1', + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + char: '\ud83d\udee2', + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + char: '\ud83d\udcb8', + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + char: '\ud83d\udcb5', + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + char: '\ud83d\udcb4', + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + char: '\ud83d\udcb6', + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + char: '\ud83d\udcb7', + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + char: '\ud83d\udcb0', + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + char: '\ud83d\udcb3', + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + char: '\ud83d\udc8e', + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + char: '\u2696', + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + char: '\ud83e\uddf0', + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + char: '\ud83d\udd27', + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + char: '\ud83d\udd28', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + char: '\u2692', + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + char: '\ud83d\udee0', + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + char: '\u26cf', + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + char: '\ud83d\udd29', + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + char: '\u2699', + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + char: '\ud83e\uddf1', + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + char: '\u26d3', + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + char: '\ud83e\uddf2', + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + char: '\ud83d\udd2b', + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + char: '\ud83d\udca3', + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + char: '\ud83e\udde8', + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + char: '\ud83d\udd2a', + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + char: '\ud83d\udde1', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + char: '\u2694', + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + char: '\ud83d\udee1', + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + char: '\ud83d\udeac', + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + char: '\u2620', + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + char: '\u26b0', + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + char: '\u26b1', + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + char: '\ud83c\udffa', + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + char: '\ud83d\udd2e', + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + char: '\ud83d\udcff', + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + char: '\ud83e\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + char: '\ud83d\udc88', + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + char: '\u2697', + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + char: '\ud83d\udd2d', + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + char: '\ud83d\udd2c', + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + char: '\ud83d\udd73', + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + char: '\ud83d\udc8a', + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + char: '\ud83d\udc89', + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + char: '\ud83e\uddec', + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + char: '\ud83e\udda0', + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + char: '\ud83e\uddeb', + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + char: '\ud83e\uddea', + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + char: '\ud83c\udf21', + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + char: '\ud83e\uddf9', + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + char: '\ud83e\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + char: '\ud83e\uddfb', + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + char: '\ud83c\udff7', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + char: '\ud83d\udd16', + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + char: '\ud83d\udebd', + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + char: '\ud83d\udebf', + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + char: '\ud83d\udec1', + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + char: '\ud83e\uddfc', + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + char: '\ud83e\uddfd', + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + char: '\ud83e\uddf4', + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + char: '\ud83d\udd11', + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + char: '\ud83d\udddd', + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + char: '\ud83d\udecb', + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + char: '\ud83d\udecc', + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + char: '\ud83d\udecf', + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + char: '\ud83d\udeaa', + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + char: '\ud83d\udece', + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + char: '\ud83e\uddf8', + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + char: '\ud83d\uddbc', + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + char: '\ud83d\uddfa', + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + char: '\u26f1', + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + char: '\ud83d\uddff', + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + char: '\ud83d\udecd', + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + char: '\ud83d\uded2', + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + char: '\ud83c\udf88', + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + char: '\ud83c\udf8f', + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + char: '\ud83c\udf80', + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + char: '\ud83c\udf81', + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + char: '\ud83c\udf8a', + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + char: '\ud83c\udf89', + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + char: '\ud83c\udf8e', + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + char: '\ud83c\udf90', + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + char: '\ud83c\udf8c', + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + char: '\ud83c\udfee', + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + char: '\ud83e\udde7', + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + char: '\u2709\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + char: '\ud83d\udce9', + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + char: '\ud83d\udce8', + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + char: '\ud83d\udce7', + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + char: '\ud83d\udc8c', + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + char: '\ud83d\udcee', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + char: '\ud83d\udcea', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + char: '\ud83d\udceb', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + char: '\ud83d\udcec', + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + char: '\ud83d\udced', + fitzpatrick_scale: false, + category: "objects" + }, + package: { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + char: '\ud83d\udce6', + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + char: '\ud83d\udcef', + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + char: '\ud83d\udce5', + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + char: '\ud83d\udce4', + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + char: '\ud83d\udcdc', + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + char: '\ud83d\udcc3', + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + char: '\ud83d\udcd1', + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + char: '\ud83e\uddfe', + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + char: '\ud83d\udcca', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + char: '\ud83d\udcc8', + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + char: '\ud83d\udcc9', + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + char: '\ud83d\udcc4', + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + char: '\ud83d\udcc5', + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + char: '\ud83d\udcc6', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + char: '\ud83d\uddd3', + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + char: '\ud83d\udcc7', + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + char: '\ud83d\uddc3', + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + char: '\ud83d\uddf3', + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + char: '\ud83d\uddc4', + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + char: '\ud83d\udccb', + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + char: '\ud83d\uddd2', + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + char: '\ud83d\udcc1', + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + char: '\ud83d\udcc2', + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + char: '\ud83d\uddc2', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + char: '\ud83d\uddde', + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + char: '\ud83d\udcf0', + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + char: '\ud83d\udcd3', + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + char: '\ud83d\udcd5', + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + char: '\ud83d\udcd7', + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + char: '\ud83d\udcd8', + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + char: '\ud83d\udcd9', + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + char: '\ud83d\udcd4', + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + char: '\ud83d\udcd2', + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + char: '\ud83d\udcda', + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + char: '\ud83d\udcd6', + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + char: '\ud83e\uddf7', + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + char: '\ud83d\udd17', + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + char: '\ud83d\udcce', + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + char: '\ud83d\udd87', + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + char: '\u2702\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + char: '\ud83d\udcd0', + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + char: '\ud83d\udccf', + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + char: '\ud83e\uddee', + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + char: '\ud83d\udccc', + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + char: '\ud83d\udccd', + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + char: '\ud83d\udea9', + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + char: '\ud83c\udff3', + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + char: '\ud83c\udff4', + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + char: '\ud83c\udff3\ufe0f\u200d\ud83c\udf08', + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + char: '\ud83d\udd10', + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + char: '\ud83d\udd12', + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + char: '\ud83d\udd13', + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + char: '\ud83d\udd0f', + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + char: '\ud83d\udd8a', + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + char: '\ud83d\udd8b', + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + char: '\u2712\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + char: '\ud83d\udcdd', + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + char: '\u270f\ufe0f', + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + char: '\ud83d\udd8d', + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + char: '\ud83d\udd8c', + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + char: '\ud83d\udd0d', + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + char: '\ud83d\udd0e', + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + char: '\u2764\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83e\udde1', + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9b', + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9a', + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc99', + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9c', + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + char: '\ud83d\udda4', + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + char: '\ud83d\udc94', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + char: '\u2763', + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + char: '\ud83d\udc95', + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc9e', + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + char: '\ud83d\udc93', + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + char: '\ud83d\udc97', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: '\ud83d\udc96', + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + char: '\ud83d\udc98', + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + char: '\ud83d\udc9d', + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + char: '\ud83d\udc9f', + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + char: '\u262e', + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + char: '\u271d', + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + char: '\u262a', + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: '\ud83d\udd49', + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: '\u2638', + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + char: '\u2721', + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + char: '\ud83d\udd2f', + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + char: '\ud83d\udd4e', + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + char: '\u262f', + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + char: '\u2626', + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + char: '\ud83d\uded0', + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + char: '\u26ce', + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u2648', + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: '\u2649', + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u264a', + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u264b', + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u264c', + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u264d', + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u264e', + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + char: '\u264f', + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u2650', + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: '\u2651', + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: '\u2652', + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: '\u2653', + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + char: '\ud83c\udd94', + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + char: '\u269b', + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + char: '\ud83c\ude33', + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + char: '\ud83c\ude39', + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + char: '\u2622', + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + char: '\u2623', + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + char: '\ud83d\udcf4', + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + char: '\ud83d\udcf3', + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + char: '\ud83c\ude36', + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + char: '\ud83c\ude1a', + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + char: '\ud83c\ude38', + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + char: '\ud83c\ude3a', + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + char: '\ud83c\ude37\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + char: '\u2734\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + char: '\ud83c\udd9a', + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + char: '\ud83c\ude51', + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + char: '\ud83d\udcae', + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + char: '\ud83c\ude50', + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + char: '\u3299\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + char: '\u3297\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + char: '\ud83c\ude34', + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + char: '\ud83c\ude35', + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + char: '\ud83c\ude32', + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + char: '\ud83c\udd70\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + char: '\ud83c\udd71\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + char: '\ud83c\udd8e', + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + char: '\ud83c\udd91', + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + char: '\ud83c\udd7e\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + char: '\ud83c\udd98', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + char: '\u26d4', + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + char: '\ud83d\udcdb', + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + char: '\ud83d\udeab', + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + char: '\u274c', + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + char: '\u2b55', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + char: '\ud83d\uded1', + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + char: '\ud83d\udca2', + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + char: '\u2668\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + char: '\ud83d\udeb7', + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + char: '\ud83d\udeaf', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + char: '\ud83d\udeb3', + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + char: '\ud83d\udeb1', + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + char: '\ud83d\udd1e', + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + char: '\ud83d\udcf5', + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + char: '\u2757', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + char: '\u2755', + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + char: '\u2753', + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + char: '\u2754', + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + char: '\u203c\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + char: '\u2049\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + char: '\ud83d\udd05', + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + char: '\ud83d\udd06', + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + char: '\ud83d\udd31', + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + char: '\u269c', + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + char: '\u303d\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + char: '\u26a0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + char: '\ud83d\udeb8', + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + char: '\ud83d\udd30', + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + char: '\u267b\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + char: '\ud83c\ude2f', + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + char: '\ud83d\udcb9', + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + char: '\u2747\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + char: '\u2733\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + char: '\u274e', + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + char: '\u2705', + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + char: '\ud83d\udca0', + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + char: '\ud83c\udf00', + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + char: '\u27bf', + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + char: '\ud83c\udf10', + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + char: '\u24c2\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + char: '\ud83c\udfe7', + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + char: '\ud83c\ude02\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + char: '\ud83d\udec2', + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + char: '\ud83d\udec3', + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + char: '\ud83d\udec4', + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + char: '\ud83d\udec5', + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + char: '\u267f', + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + char: '\ud83d\udead', + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + char: '\ud83d\udebe', + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + char: '\ud83c\udd7f\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + char: '\ud83d\udeb0', + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + char: '\ud83d\udeb9', + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + char: '\ud83d\udeba', + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + char: '\ud83d\udebc', + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + char: '\ud83d\udebb', + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + char: '\ud83d\udeae', + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + char: '\ud83c\udfa6', + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + char: '\ud83d\udcf6', + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + char: '\ud83c\ude01', + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + char: '\ud83c\udd96', + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + char: '\ud83c\udd97', + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + char: '\ud83c\udd99', + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + char: '\ud83c\udd92', + fitzpatrick_scale: false, + category: "symbols" + }, + new: { + keywords: [ "blue-square", "words", "start" ], + char: '\ud83c\udd95', + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + char: '\ud83c\udd93', + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + char: '0\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + char: '1\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + char: '2\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + char: '3\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + char: '4\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + char: '5\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + char: '6\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + char: '7\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + char: '8\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + char: '9\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + char: '\ud83d\udd1f', + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + char: '*\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + char: '\u23cf\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + char: '\u25b6\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + char: '\u23f8', + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + char: '\u23ed', + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + char: '\u23f9', + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + char: '\u23fa', + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + char: '\u23ef', + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + char: '\u23ee', + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + char: '\u23e9', + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + char: '\u23ea', + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + char: '\ud83d\udd00', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + char: '\ud83d\udd01', + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + char: '\ud83d\udd02', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + char: '\u25c0\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + char: '\ud83d\udd3c', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\ud83d\udd3d', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + char: '\u23eb', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\u23ec', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + char: '\u27a1\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + char: '\u2b05\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + char: '\u2b06\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\u2b07\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + char: '\u2197\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + char: '\u2198\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + char: '\u2199\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + char: '\u2196\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + char: '\u2195\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + char: '\u2194\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + char: '\ud83d\udd04', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + char: '\u21aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + char: '\u21a9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + char: '\u2934\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: '\u2935\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + char: '#\ufe0f\u20e3', + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + char: '\u2139\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + char: '\ud83d\udd24', + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + char: '\ud83d\udd21', + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + char: '\ud83d\udd20', + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + char: '\ud83d\udd23', + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + char: '\ud83c\udfb5', + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + char: '\ud83c\udfb6', + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + char: '\u3030\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + char: '\u27b0', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + char: '\u2714\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + char: '\ud83d\udd03', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + char: '\u2795', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + char: '\u2796', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + char: '\u2797', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + char: '\u2716\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + char: '\u267e', + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + char: '\ud83d\udcb2', + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + char: '\ud83d\udcb1', + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + char: '\xa9\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + char: '\xae\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + char: '\u2122\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + char: '\ud83d\udd1a', + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + char: '\ud83d\udd19', + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + char: '\ud83d\udd1b', + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + char: '\ud83d\udd1d', + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + char: '\ud83d\udd1c', + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + char: '\u2611\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + char: '\ud83d\udd18', + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + char: '\u26aa', + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + char: '\u26ab', + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + char: '\ud83d\udd34', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + char: '\ud83d\udd35', + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd38', + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd39', + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd36', + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: '\ud83d\udd37', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + char: '\ud83d\udd3a', + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + char: '\u25aa\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + char: '\u25ab\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + char: '\u2b1b', + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + char: '\u2b1c', + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + char: '\ud83d\udd3b', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + char: '\u25fc\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + char: '\u25fb\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + char: '\u25fe', + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + char: '\u25fd', + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + char: '\ud83d\udd32', + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + char: '\ud83d\udd33', + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + char: '\ud83d\udd08', + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + char: '\ud83d\udd09', + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + char: '\ud83d\udd0a', + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + char: '\ud83d\udd07', + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + char: '\ud83d\udce3', + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + char: '\ud83d\udce2', + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + char: '\ud83d\udd14', + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + char: '\ud83d\udd15', + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + char: '\ud83c\udccf', + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + char: '\ud83c\udc04', + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + char: '\u2660\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: '\u2663\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: '\u2665\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: '\u2666\ufe0f', + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + char: '\ud83c\udfb4', + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + char: '\ud83d\udcad', + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + char: '\ud83d\uddef', + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + char: '\ud83d\udcac', + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + char: '\ud83d\udde8', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd50', + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd51', + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd52', + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd53', + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd54', + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + char: '\ud83d\udd55', + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd56', + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd57', + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd58', + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd59', + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5a', + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + char: '\ud83d\udd5b', + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5c', + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5d', + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5e', + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd5f', + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd60', + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd61', + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd62', + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd63', + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd64', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd65', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd66', + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + char: '\ud83d\udd67', + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + char: '\ud83c\udde8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + char: '\ud83c\uddea\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + char: '\ud83c\uddeb\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + char: '\ud83c\udde9\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + char: '\ud83c\udded\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddee\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddef\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfd\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf6', + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfe\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddeb\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf2\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf5', + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf3\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf4\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf6\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde7\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf5\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfc\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf7\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddfd', + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddff\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddec\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + char: '\ud83c\uddf0\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf1\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\udde9', + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde8\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf8\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddef', + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf1', + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf0', + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf4', + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf9', + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf7', + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\udde8', + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + char: '\ud83c\uddf9\ud83c\uddfb', + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddec', + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + char: '\ud83c\udde6\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + char: '\ud83c\uddec\ud83c\udde7', + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + char: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f', + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddf8', + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddee', + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddfe', + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfa\ud83c\uddff', + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddfa', + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\udde6', + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfb\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfc\ud83c\uddeb', + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddea\ud83c\udded', + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddfe\ud83c\uddea', + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddff\ud83c\uddf2', + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + char: '\ud83c\uddff\ud83c\uddfc', + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + char: '\ud83c\uddfa\ud83c\uddf3', + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + char: '\ud83c\udff4\u200d\u2620\ufe0f', + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.min.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.min.js new file mode 100644 index 0000000..a045162 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojiimages.min.js @@ -0,0 +1,3 @@ +// Source: npm package: emojilib +// Images provided by twemoji: https://github.com/twitter/twemoji +window.tinymce.Resource.add("tinymce.plugins.emoticons",{100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:'\ud83d\udcaf',fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:'\ud83d\udd22',fitzpatrick_scale:!1,category:"symbols"},grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:'\ud83d\ude00',fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:'\ud83d\ude2c',fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:'\ud83d\ude01',fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:'\ud83d\ude02',fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:'\ud83e\udd23',fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:'\ud83e\udd73',fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:'\ud83d\ude03',fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:'\ud83d\ude04',fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:'\ud83d\ude05',fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:'\ud83d\ude06',fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:'\ud83d\ude07',fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:'\ud83d\ude09',fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:'\ud83d\ude0a',fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:'\ud83d\ude42',fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:'\ud83d\ude43',fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:'\u263a\ufe0f',fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:'\ud83d\ude0b',fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:'\ud83d\ude0c',fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:'\ud83d\ude0d',fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:'\ud83e\udd70',fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\ud83d\ude18',fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:'\ud83d\ude17',fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:'\ud83d\ude19',fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:'\ud83d\ude1a',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:'\ud83d\ude1c',fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:'\ud83e\udd2a',fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:'\ud83e\udd28',fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:'\ud83e\uddd0',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:'\ud83d\ude1d',fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:'\ud83d\ude1b',fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:'\ud83e\udd11',fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:'\ud83e\udd13',fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:'\ud83d\ude0e',fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:'\ud83e\udd29',fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:'\ud83e\udd21',fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:'\ud83e\udd20',fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:'\ud83e\udd17',fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:'\ud83d\ude0f',fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:'\ud83d\ude36',fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:'\ud83d\ude10',fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:'\ud83d\ude11',fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:'\ud83d\ude12',fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:'\ud83d\ude44',fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:'\ud83e\udd14',fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:'\ud83e\udd25',fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:'\ud83e\udd2d',fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:'\ud83e\udd2b',fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:'\ud83e\udd2c',fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:'\ud83e\udd2f',fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:'\ud83d\ude33',fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:'\ud83d\ude1e',fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:'\ud83d\ude1f',fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:'\ud83d\ude20',fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:'\ud83d\ude21',fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:'\ud83d\ude14',fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:'\ud83d\ude15',fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:'\ud83d\ude41',fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:'\u2639',fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:'\ud83d\ude23',fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:'\ud83d\ude16',fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:'\ud83d\ude2b',fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:'\ud83d\ude29',fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:'\ud83e\udd7a',fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:'\ud83d\ude24',fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:'\ud83d\ude2e',fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:'\ud83d\ude31',fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:'\ud83d\ude28',fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:'\ud83d\ude30',fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:'\ud83d\ude2f',fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:'\ud83d\ude26',fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:'\ud83d\ude27',fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:'\ud83d\ude22',fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:'\ud83d\ude25',fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:'\ud83e\udd24',fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:'\ud83d\ude2a',fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:'\ud83d\ude13',fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:'\ud83e\udd75',fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:'\ud83e\udd76',fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:'\ud83d\ude2d',fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:'\ud83d\ude35',fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:'\ud83d\ude32',fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:'\ud83e\udd10',fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:'\ud83e\udd22',fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:'\ud83e\udd27',fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:'\ud83e\udd2e',fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:'\ud83d\ude37',fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:'\ud83e\udd12',fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:'\ud83e\udd15',fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:'\ud83e\udd74',fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:'\ud83d\ude34',fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:'\ud83d\udca4',fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:'\ud83d\udca9',fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:'\ud83d\ude08',fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:'\ud83d\udc7f',fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:'\ud83d\udc79',fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:'\ud83d\udc7a',fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:'\ud83d\udc80',fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:'\ud83d\udc7b',fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:'\ud83d\udc7d',fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:'\ud83e\udd16',fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:'\ud83d\ude3a',fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:'\ud83d\ude38',fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:'\ud83d\ude39',fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:'\ud83d\ude3b',fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:'\ud83d\ude3c',fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:'\ud83d\ude3d',fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:'\ud83d\ude40',fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:'\ud83d\ude3f',fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:'\ud83d\ude3e',fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:'\ud83e\udd32',fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:'\ud83d\ude4c',fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:'\ud83d\udc4f',fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:'\ud83d\udc4b',fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:'\ud83e\udd19',fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:'\ud83d\udc4d',fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:'\ud83d\udc4e',fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:'\ud83d\udc4a',fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:'\u270a',fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:'\ud83e\udd1b',fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:'\ud83e\udd1c',fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:'\u270c',fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:'\ud83d\udc4c',fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:'\u270b',fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:'\ud83e\udd1a',fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:'\ud83d\udc50',fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:'\ud83d\udcaa',fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:'\ud83d\ude4f',fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:'\ud83e\uddb6',fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:'\ud83e\uddb5',fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:'\ud83e\udd1d',fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:'\u261d',fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:'\ud83d\udc46',fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:'\ud83d\udc47',fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:'\ud83d\udc48',fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:'\ud83d\udc49',fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:'\ud83d\udd95',fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:'\ud83d\udd90',fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:'\ud83e\udd1f',fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:'\ud83e\udd18',fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:'\ud83e\udd1e',fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:'\ud83d\udd96',fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:'\u270d',fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:'\ud83e\udd33',fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:'\ud83d\udc85',fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:'\ud83d\udc44',fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:'\ud83e\uddb7',fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:'\ud83d\udc45',fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:'\ud83d\udc42',fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:'\ud83d\udc43',fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:'\ud83d\udc41',fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:'\ud83d\udc40',fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:'\ud83e\udde0',fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:'\ud83d\udc64',fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:'\ud83d\udc65',fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:'\ud83d\udde3',fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:'\ud83d\udc76',fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:'\ud83e\uddd2',fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:'\ud83d\udc66',fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:'\ud83d\udc67',fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:'\ud83e\uddd1',fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:'\ud83d\udc68',fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:'\ud83d\udc69',fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:'\ud83d\udc71\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:'\ud83d\udc71',fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:'\ud83e\uddd4',fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:'\ud83e\uddd3',fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:'\ud83d\udc74',fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:'\ud83d\udc75',fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:'\ud83d\udc72',fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:'\ud83e\uddd5',fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:'\ud83d\udc73\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:'\ud83d\udc73',fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:'\ud83d\udc6e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:'\ud83d\udc6e',fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:'\ud83d\udc77\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:'\ud83d\udc77',fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:'\ud83d\udc82\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:'\ud83d\udc82',fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:'\ud83d\udd75\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:'\ud83d\udd75',fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:'\ud83d\udc69\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:'\ud83d\udc68\u200d\u2695\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf3e',fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf73',fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:'\ud83d\udc68\u200d\ud83c\udf93',fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfa4',fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfeb',fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfed',fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:'\ud83d\udc69\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:'\ud83d\udc68\u200d\ud83d\udcbb',fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:'\ud83d\udc69\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:'\ud83d\udc68\u200d\ud83d\udcbc',fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:'\ud83d\udc69\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:'\ud83d\udc68\u200d\ud83d\udd27',fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:'\ud83d\udc69\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:'\ud83d\udc68\u200d\ud83d\udd2c',fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:'\ud83d\udc69\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:'\ud83d\udc68\u200d\ud83c\udfa8',fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:'\ud83d\udc69\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:'\ud83d\udc68\u200d\ud83d\ude92',fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:'\ud83d\udc69\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:'\ud83d\udc68\u200d\u2708\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:'\ud83d\udc69\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:'\ud83d\udc68\u200d\ud83d\ude80',fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:'\ud83d\udc69\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:'\ud83d\udc68\u200d\u2696\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:'\ud83e\uddb8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:'\ud83e\uddb8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:'\ud83e\uddb9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:'\ud83e\uddb9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:'\ud83e\udd36',fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:'\ud83c\udf85',fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:'\ud83e\uddd9\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:'\ud83e\uddd9\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:'\ud83e\udddd\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:'\ud83e\udddd\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:'\ud83e\udddb\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:'\ud83e\udddb\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:'\ud83e\udddf\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:'\ud83e\udddf\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:'\ud83e\uddde\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:'\ud83e\uddde\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:'\ud83e\udddc\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:'\ud83e\udddc\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:'\ud83e\uddda\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:'\ud83e\uddda\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:'\ud83d\udc7c',fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:'\ud83e\udd30',fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:'\ud83e\udd31',fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:'\ud83d\udc78',fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:'\ud83e\udd34',fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:'\ud83d\udc70',fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:'\ud83e\udd35',fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:'\ud83c\udfc3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:'\ud83c\udfc3',fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:'\ud83d\udeb6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:'\ud83d\udeb6',fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:'\ud83d\udc83',fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:'\ud83d\udd7a',fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:'\ud83d\udc6f',fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:'\ud83d\udc6f\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:'\ud83d\udc6b',fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:'\ud83d\udc6c',fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:'\ud83d\udc6d',fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:'\ud83d\ude47\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:'\ud83d\ude47',fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:'\ud83e\udd26\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:'\ud83e\udd26\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:'\ud83e\udd37',fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:'\ud83e\udd37\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:'\ud83d\udc81',fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:'\ud83d\udc81\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:'\ud83d\ude45',fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:'\ud83d\ude45\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:'\ud83d\ude46',fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:'\ud83d\ude46\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:'\ud83d\ude4b',fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:'\ud83d\ude4b\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:'\ud83d\ude4e',fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:'\ud83d\ude4e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:'\ud83d\ude4d',fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:'\ud83d\ude4d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:'\ud83d\udc87',fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:'\ud83d\udc87\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:'\ud83d\udc86',fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:'\ud83d\udc86\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:'\ud83e\uddd6\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:'\ud83e\uddd6\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc91',fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc8f',fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69',fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:'\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:'\ud83d\udc6a',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc69\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc69\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:'\ud83d\udc68\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66',fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:'\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67',fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:'\ud83e\uddf6',fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:'\ud83e\uddf5',fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:'\ud83e\udde5',fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:'\ud83e\udd7c',fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:'\ud83d\udc5a',fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:'\ud83d\udc55',fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:'\ud83d\udc56',fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:'\ud83d\udc54',fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:'\ud83d\udc57',fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:'\ud83d\udc59',fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:'\ud83d\udc58',fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:'\ud83d\udc84',fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:'\ud83d\udc8b',fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:'\ud83d\udc63',fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:'\ud83e\udd7f',fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:'\ud83d\udc60',fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:'\ud83d\udc61',fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:'\ud83d\udc62',fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:'\ud83d\udc5e',fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:'\ud83d\udc5f',fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:'\ud83e\udd7e',fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:'\ud83e\udde6',fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:'\ud83e\udde4',fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:'\ud83e\udde3',fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:'\ud83d\udc52',fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:'\ud83c\udfa9',fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:'\ud83e\udde2',fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:'\u26d1',fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:'\ud83c\udf93',fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:'\ud83d\udc51',fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:'\ud83c\udf92',fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:'\ud83e\uddf3',fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:'\ud83d\udc5d',fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:'\ud83d\udc5b',fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:'\ud83d\udc5c',fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:'\ud83d\udcbc',fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:'\ud83d\udc53',fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:'\ud83d\udd76',fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:'\ud83e\udd7d',fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:'\ud83d\udc8d',fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:'\ud83c\udf02',fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:'\ud83d\udc36',fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:'\ud83d\udc31',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:'\ud83d\udc2d',fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:'\ud83d\udc39',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:'\ud83d\udc30',fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:'\ud83e\udd8a',fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:'\ud83d\udc3b',fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:'\ud83d\udc3c',fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:'\ud83d\udc28',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:'\ud83d\udc2f',fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:'\ud83e\udd81',fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\ud83d\udc2e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:'\ud83d\udc37',fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:'\ud83d\udc3d',fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:'\ud83d\udc38',fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:'\ud83e\udd91',fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:'\ud83d\udc19',fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:'\ud83e\udd90',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:'\ud83d\udc35',fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:'\ud83e\udd8d',fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:'\ud83d\ude48',fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:'\ud83d\ude49',fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:'\ud83d\ude4a',fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:'\ud83d\udc12',fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:'\ud83d\udc14',fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:'\ud83d\udc27',fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:'\ud83d\udc26',fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:'\ud83d\udc24',fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:'\ud83d\udc23',fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:'\ud83d\udc25',fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:'\ud83e\udd86',fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:'\ud83e\udd85',fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:'\ud83e\udd89',fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:'\ud83e\udd87',fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:'\ud83d\udc3a',fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:'\ud83d\udc17',fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:'\ud83d\udc34',fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:'\ud83e\udd84',fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:'\ud83d\udc1d',fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:'\ud83d\udc1b',fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:'\ud83e\udd8b',fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:'\ud83d\udc0c',fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:'\ud83d\udc1e',fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:'\ud83d\udc1c',fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:'\ud83e\udd97',fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:'\ud83d\udd77',fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:'\ud83e\udd82',fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:'\ud83e\udd80',fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:'\ud83d\udc0d',fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:'\ud83e\udd8e',fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:'\ud83e\udd96',fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:'\ud83e\udd95',fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:'\ud83d\udc22',fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:'\ud83d\udc20',fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:'\ud83d\udc1f',fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:'\ud83d\udc21',fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:'\ud83d\udc2c',fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:'\ud83e\udd88',fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:'\ud83d\udc33',fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:'\ud83d\udc0b',fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:'\ud83d\udc0a',fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:'\ud83d\udc06',fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:'\ud83e\udd93',fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:'\ud83d\udc05',fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:'\ud83d\udc03',fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:'\ud83d\udc02',fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:'\ud83d\udc04',fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:'\ud83e\udd8c',fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:'\ud83d\udc2a',fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:'\ud83d\udc2b',fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:'\ud83e\udd92',fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:'\ud83d\udc18',fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:'\ud83e\udd8f',fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:'\ud83d\udc10',fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:'\ud83d\udc0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:'\ud83d\udc11',fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:'\ud83d\udc0e',fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:'\ud83d\udc16',fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:'\ud83d\udc00',fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:'\ud83d\udc01',fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:'\ud83d\udc13',fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:'\ud83e\udd83',fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:'\ud83d\udd4a',fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:'\ud83d\udc15',fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:'\ud83d\udc29',fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:'\ud83d\udc08',fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:'\ud83d\udc07',fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:'\ud83d\udc3f',fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:'\ud83e\udd94',fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:'\ud83e\udd9d',fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:'\ud83e\udd99',fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:'\ud83e\udd9b',fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:'\ud83e\udd98',fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:'\ud83e\udda1',fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:'\ud83e\udda2',fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:'\ud83e\udd9a',fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:'\ud83e\udd9c',fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:'\ud83e\udd9e',fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:'\ud83e\udd9f',fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:'\ud83d\udc3e',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:'\ud83d\udc09',fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:'\ud83d\udc32',fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:'\ud83c\udf35',fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:'\ud83c\udf84',fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:'\ud83c\udf32',fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:'\ud83c\udf33',fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:'\ud83c\udf34',fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:'\ud83c\udf31',fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:'\ud83c\udf3f',fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:'\u2618',fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:'\ud83c\udf40',fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:'\ud83c\udf8d',fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:'\ud83c\udf8b',fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:'\ud83c\udf43',fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:'\ud83c\udf42',fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:'\ud83c\udf41',fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:'\ud83c\udf3e',fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:'\ud83c\udf3a',fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:'\ud83c\udf3b',fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:'\ud83c\udf39',fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:'\ud83e\udd40',fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:'\ud83c\udf37',fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:'\ud83c\udf3c',fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:'\ud83c\udf38',fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:'\ud83d\udc90',fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:'\ud83c\udf44',fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:'\ud83c\udf30',fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:'\ud83c\udf83',fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:'\ud83d\udc1a',fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:'\ud83d\udd78',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:'\ud83c\udf0e',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:'\ud83c\udf0d',fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:'\ud83c\udf0f',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf15',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:'\ud83c\udf16',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf17',fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf18',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf11',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf12',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf13',fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:'\ud83c\udf14',fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1a',fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1d',fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1b',fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:'\ud83c\udf1c',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:'\ud83c\udf1e',fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:'\ud83c\udf19',fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:'\u2b50',fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:'\ud83c\udf1f',fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:'\ud83d\udcab',fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:'\u2728',fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:'\u2604',fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:'\u2600\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:'\ud83c\udf24',fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:'\u26c5',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:'\ud83c\udf25',fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:'\ud83c\udf26',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:'\u2601\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:'\ud83c\udf27',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:'\u26c8',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:'\ud83c\udf29',fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:'\u26a1',fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:'\ud83d\udd25',fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:'\ud83d\udca5',fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:'\u2744\ufe0f',fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:'\ud83c\udf28',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:'\u26c4',fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:'\u2603',fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:'\ud83c\udf2c',fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:'\ud83d\udca8',fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:'\ud83c\udf2a',fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:'\ud83c\udf2b',fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:'\u2602',fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:'\u2614',fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:'\ud83d\udca7',fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:'\ud83d\udca6',fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:'\ud83c\udf0a',fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:'\ud83c\udf4f',fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:'\ud83c\udf4e',fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:'\ud83c\udf50',fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:'\ud83c\udf4a',fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:'\ud83c\udf4b',fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:'\ud83c\udf4c',fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:'\ud83c\udf49',fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:'\ud83c\udf47',fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:'\ud83c\udf53',fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:'\ud83c\udf48',fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:'\ud83c\udf52',fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:'\ud83c\udf51',fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:'\ud83c\udf4d',fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:'\ud83e\udd65',fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:'\ud83e\udd5d',fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:'\ud83e\udd6d',fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:'\ud83e\udd51',fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:'\ud83e\udd66',fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:'\ud83c\udf45',fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:'\ud83c\udf46',fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:'\ud83e\udd52',fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:'\ud83e\udd55',fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:'\ud83c\udf36',fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:'\ud83e\udd54',fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:'\ud83c\udf3d',fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:'\ud83e\udd6c',fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:'\ud83c\udf60',fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:'\ud83e\udd5c',fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:'\ud83c\udf6f',fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:'\ud83e\udd50',fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:'\ud83c\udf5e',fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:'\ud83e\udd56',fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:'\ud83e\udd6f',fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:'\ud83e\udd68',fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:'\ud83e\uddc0',fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:'\ud83e\udd5a',fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:'\ud83e\udd53',fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:'\ud83e\udd69',fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:'\ud83e\udd5e',fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:'\ud83c\udf57',fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:'\ud83c\udf56',fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:'\ud83e\uddb4',fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:'\ud83c\udf64',fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:'\ud83c\udf73',fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:'\ud83c\udf54',fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:'\ud83c\udf5f',fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:'\ud83e\udd59',fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:'\ud83c\udf2d',fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:'\ud83c\udf55',fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:'\ud83e\udd6a',fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:'\ud83e\udd6b',fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:'\ud83c\udf5d',fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:'\ud83c\udf2e',fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:'\ud83c\udf2f',fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:'\ud83e\udd57',fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:'\ud83e\udd58',fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:'\ud83c\udf5c',fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:'\ud83c\udf72',fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:'\ud83c\udf65',fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:'\ud83e\udd60',fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:'\ud83c\udf63',fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:'\ud83c\udf71',fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:'\ud83c\udf5b',fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:'\ud83c\udf59',fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:'\ud83c\udf5a',fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:'\ud83c\udf58',fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:'\ud83c\udf62',fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:'\ud83c\udf61',fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:'\ud83c\udf67',fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:'\ud83c\udf68',fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:'\ud83c\udf66',fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:'\ud83e\udd67',fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:'\ud83c\udf70',fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:'\ud83e\uddc1',fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:'\ud83e\udd6e',fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:'\ud83c\udf82',fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:'\ud83c\udf6e',fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:'\ud83c\udf6c',fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:'\ud83c\udf6d',fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:'\ud83c\udf6b',fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:'\ud83c\udf7f',fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:'\ud83e\udd5f',fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:'\ud83c\udf69',fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:'\ud83c\udf6a',fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:'\ud83e\udd5b',fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\ud83c\udf7a',fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:'\ud83c\udf7b',fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:'\ud83e\udd42',fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:'\ud83c\udf77',fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:'\ud83e\udd43',fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:'\ud83c\udf78',fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:'\ud83c\udf79',fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:'\ud83c\udf7e',fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:'\ud83c\udf76',fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:'\ud83c\udf75',fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:'\ud83e\udd64',fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:'\u2615',fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:'\ud83c\udf7c',fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:'\ud83e\uddc2',fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:'\ud83e\udd44',fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:'\ud83c\udf74',fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:'\ud83c\udf7d',fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:'\ud83e\udd63',fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:'\ud83e\udd61',fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:'\ud83e\udd62',fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:'\u26bd',fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:'\ud83c\udfc0',fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:'\ud83c\udfc8',fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:'\u26be',fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:'\ud83e\udd4e',fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:'\ud83c\udfbe',fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:'\ud83c\udfd0',fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:'\ud83c\udfc9',fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:'\ud83e\udd4f',fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:'\ud83c\udfb1',fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:'\u26f3',fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:'\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:'\ud83c\udfcc',fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:'\ud83c\udfd3',fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:'\ud83c\udff8',fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:'\ud83e\udd45',fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:'\ud83c\udfd2',fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:'\ud83c\udfd1',fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:'\ud83e\udd4d',fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:'\ud83c\udfcf',fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:'\ud83c\udfbf',fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:'\u26f7',fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:'\ud83c\udfc2',fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:'\ud83e\udd3a',fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:'\ud83e\udd3c\u200d\u2640\ufe0f',fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:'\ud83e\udd3c\u200d\u2642\ufe0f',fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:'\ud83e\udd38\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:'\ud83e\udd38\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:'\ud83e\udd3e\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:'\ud83e\udd3e\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:'\u26f8',fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:'\ud83e\udd4c',fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:'\ud83d\udef9',fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:'\ud83d\udef7',fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:'\ud83c\udff9',fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:'\ud83c\udfa3',fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:'\ud83e\udd4a',fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:'\ud83e\udd4b',fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:'\ud83d\udea3\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:'\ud83d\udea3',fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:'\ud83e\uddd7\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:'\ud83e\uddd7\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:'\ud83c\udfca\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:'\ud83c\udfca',fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:'\ud83e\udd3d\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:'\ud83e\udd3d\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:'\ud83e\uddd8\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:'\ud83e\uddd8\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:'\ud83c\udfc4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:'\ud83c\udfc4',fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:'\ud83d\udec0',fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:'\u26f9\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:'\u26f9',fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:'\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:'\ud83c\udfcb',fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:'\ud83d\udeb4\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:'\ud83d\udeb4',fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:'\ud83d\udeb5\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:'\ud83d\udeb5',fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:'\ud83c\udfc7',fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:'\ud83d\udd74',fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:'\ud83c\udfc6',fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:'\ud83c\udfbd',fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:'\ud83c\udfc5',fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:'\ud83c\udf96',fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:'\ud83e\udd47',fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:'\ud83e\udd48',fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:'\ud83e\udd49',fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:'\ud83c\udf97',fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:'\ud83c\udff5',fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:'\ud83c\udfab',fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:'\ud83c\udf9f',fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:'\ud83c\udfad',fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:'\ud83c\udfa8',fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:'\ud83c\udfaa',fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\ud83e\udd39\u200d\u2640\ufe0f',fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:'\ud83e\udd39\u200d\u2642\ufe0f',fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:'\ud83c\udfa4',fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:'\ud83c\udfa7',fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:'\ud83c\udfbc',fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:'\ud83c\udfb9',fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:'\ud83e\udd41',fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:'\ud83c\udfb7',fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:'\ud83c\udfba',fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:'\ud83c\udfb8',fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:'\ud83c\udfbb',fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:'\ud83c\udfac',fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:'\ud83c\udfae',fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:'\ud83d\udc7e',fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:'\ud83c\udfaf',fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:'\ud83c\udfb2',fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:'\ud83c\udfb0',fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:'\ud83e\udde9',fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:'\ud83c\udfb3',fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:'\ud83d\ude97',fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:'\ud83d\ude95',fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:'\ud83d\ude99',fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:'\ud83d\ude8c',fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:'\ud83d\ude8e',fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:'\ud83c\udfce',fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:'\ud83d\ude93',fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:'\ud83d\ude91',fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:'\ud83d\ude92',fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:'\ud83d\ude90',fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:'\ud83d\ude9a',fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:'\ud83d\ude9b',fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:'\ud83d\ude9c',fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:'\ud83d\udef4',fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:'\ud83c\udfcd',fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:'\ud83d\udeb2',fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:'\ud83d\udef5',fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:'\ud83d\udea8',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:'\ud83d\ude94',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:'\ud83d\ude8d',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:'\ud83d\ude98',fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:'\ud83d\ude96',fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:'\ud83d\udea1',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:'\ud83d\udea0',fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:'\ud83d\ude9f',fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:'\ud83d\ude83',fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:'\ud83d\ude8b',fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:'\ud83d\ude9d',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:'\ud83d\ude84',fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:'\ud83d\ude85',fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:'\ud83d\ude88',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:'\ud83d\ude9e',fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:'\ud83d\ude82',fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:'\ud83d\ude86',fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:'\ud83d\ude87',fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:'\ud83d\ude8a',fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:'\ud83d\ude89',fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:'\ud83d\udef8',fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:'\ud83d\ude81',fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:'\ud83d\udee9',fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:'\u2708\ufe0f',fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:'\ud83d\udeeb',fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:'\ud83d\udeec',fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:'\u26f5',fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:'\ud83d\udee5',fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:'\ud83d\udea4',fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:'\u26f4',fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:'\ud83d\udef3',fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:'\ud83d\ude80',fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:'\ud83d\udef0',fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:'\ud83d\udcba',fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:'\ud83d\udef6',fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:'\u2693',fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:'\ud83d\udea7',fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:'\u26fd',fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:'\ud83d\ude8f',fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:'\ud83d\udea6',fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:'\ud83d\udea5',fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:'\ud83c\udfc1',fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:'\ud83d\udea2',fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:'\ud83c\udfa1',fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:'\ud83c\udfa2',fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:'\ud83c\udfa0',fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:'\ud83c\udfd7',fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:'\ud83c\udf01',fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:'\ud83d\uddfc',fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:'\ud83c\udfed',fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:'\u26f2',fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:'\ud83c\udf91',fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:'\u26f0',fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:'\ud83c\udfd4',fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:'\ud83d\uddfb',fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:'\ud83c\udf0b',fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:'\ud83d\uddfe',fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:'\ud83c\udfd5',fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:'\u26fa',fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:'\ud83c\udfde',fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:'\ud83d\udee3',fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:'\ud83d\udee4',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:'\ud83c\udf05',fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:'\ud83c\udf04',fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:'\ud83c\udfdc',fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:'\ud83c\udfd6',fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:'\ud83c\udfdd',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:'\ud83c\udf07',fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:'\ud83c\udf06',fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:'\ud83c\udfd9',fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:'\ud83c\udf03',fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:'\ud83c\udf09',fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:'\ud83c\udf0c',fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:'\ud83c\udf20',fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:'\ud83c\udf87',fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:'\ud83c\udf86',fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:'\ud83c\udf08',fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:'\ud83c\udfd8',fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:'\ud83c\udff0',fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:'\ud83c\udfef',fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:'\ud83c\udfdf',fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:'\ud83d\uddfd',fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:'\ud83c\udfe0',fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:'\ud83c\udfe1',fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:'\ud83c\udfda',fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:'\ud83c\udfe2',fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:'\ud83c\udfec',fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:'\ud83c\udfe3',fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:'\ud83c\udfe4',fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:'\ud83c\udfe5',fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:'\ud83c\udfe6',fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:'\ud83c\udfe8',fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:'\ud83c\udfea',fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:'\ud83c\udfeb',fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:'\ud83c\udfe9',fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:'\ud83d\udc92',fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:'\ud83c\udfdb',fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:'\u26ea',fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:'\ud83d\udd4c',fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:'\ud83d\udd4d',fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:'\ud83d\udd4b',fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:'\u26e9',fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:'\u231a',fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:'\ud83d\udcf1',fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:'\ud83d\udcf2',fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:'\ud83d\udcbb',fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:'\u2328',fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:'\ud83d\udda5',fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:'\ud83d\udda8',fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:'\ud83d\uddb1',fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:'\ud83d\uddb2',fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:'\ud83d\udd79',fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:'\ud83d\udddc',fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:'\ud83d\udcbd',fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:'\ud83d\udcbe',fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:'\ud83d\udcbf',fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:'\ud83d\udcc0',fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:'\ud83d\udcfc',fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:'\ud83d\udcf7',fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:'\ud83d\udcf8',fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:'\ud83d\udcf9',fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:'\ud83c\udfa5',fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:'\ud83d\udcfd',fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:'\ud83c\udf9e',fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:'\ud83d\udcde',fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:'\u260e\ufe0f',fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:'\ud83d\udcdf',fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:'\ud83d\udce0',fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:'\ud83d\udcfa',fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:'\ud83d\udcfb',fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:'\ud83c\udf99',fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:'\ud83c\udf9a',fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:'\ud83c\udf9b',fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:'\ud83e\udded',fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:'\u23f1',fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:'\u23f2',fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:'\u23f0',fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:'\ud83d\udd70',fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:'\u23f3',fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:'\u231b',fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:'\ud83d\udce1',fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:'\ud83d\udd0b',fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:'\ud83d\udd0c',fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:'\ud83d\udca1',fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:'\ud83d\udd26',fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:'\ud83d\udd6f',fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:'\ud83e\uddef',fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:'\ud83d\uddd1',fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:'\ud83d\udee2',fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:'\ud83d\udcb8',fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:'\ud83d\udcb5',fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:'\ud83d\udcb4',fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:'\ud83d\udcb6',fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:'\ud83d\udcb7',fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:'\ud83d\udcb0',fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:'\ud83d\udcb3',fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:'\ud83d\udc8e',fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:'\u2696',fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:'\ud83e\uddf0',fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:'\ud83d\udd27',fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:'\ud83d\udd28',fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:'\u2692',fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:'\ud83d\udee0',fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:'\u26cf',fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:'\ud83d\udd29',fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:'\u2699',fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:'\ud83e\uddf1',fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:'\u26d3',fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:'\ud83e\uddf2',fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:'\ud83d\udd2b',fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:'\ud83d\udca3',fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:'\ud83e\udde8',fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:'\ud83d\udd2a',fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:'\ud83d\udde1',fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:'\u2694',fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:'\ud83d\udee1',fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:'\ud83d\udeac',fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:'\u2620',fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:'\u26b0',fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:'\u26b1',fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:'\ud83c\udffa',fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:'\ud83d\udd2e',fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:'\ud83d\udcff',fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:'\ud83e\uddff',fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:'\ud83d\udc88',fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:'\u2697',fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:'\ud83d\udd2d',fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:'\ud83d\udd2c',fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:'\ud83d\udd73',fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:'\ud83d\udc8a',fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:'\ud83d\udc89',fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:'\ud83e\uddec',fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:'\ud83e\udda0',fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:'\ud83e\uddeb',fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:'\ud83e\uddea',fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:'\ud83c\udf21',fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:'\ud83e\uddf9',fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:'\ud83e\uddfa',fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:'\ud83e\uddfb',fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:'\ud83c\udff7',fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:'\ud83d\udd16',fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:'\ud83d\udebd',fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:'\ud83d\udebf',fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:'\ud83d\udec1',fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:'\ud83e\uddfc',fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:'\ud83e\uddfd',fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:'\ud83e\uddf4',fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:'\ud83d\udd11',fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:'\ud83d\udddd',fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:'\ud83d\udecb',fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:'\ud83d\udecc',fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:'\ud83d\udecf',fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:'\ud83d\udeaa',fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:'\ud83d\udece',fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:'\ud83e\uddf8',fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:'\ud83d\uddbc',fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:'\ud83d\uddfa',fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:'\u26f1',fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:'\ud83d\uddff',fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:'\ud83d\udecd',fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:'\ud83d\uded2',fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:'\ud83c\udf88',fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:'\ud83c\udf8f',fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:'\ud83c\udf80',fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:'\ud83c\udf81',fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:'\ud83c\udf8a',fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:'\ud83c\udf89',fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:'\ud83c\udf8e',fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:'\ud83c\udf90',fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:'\ud83c\udf8c',fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:'\ud83c\udfee',fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:'\ud83e\udde7',fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:'\u2709\ufe0f',fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:'\ud83d\udce9',fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:'\ud83d\udce8',fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:'\ud83d\udce7',fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:'\ud83d\udc8c',fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:'\ud83d\udcee',fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:'\ud83d\udcea',fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:'\ud83d\udceb',fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:'\ud83d\udcec',fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:'\ud83d\udced',fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:'\ud83d\udce6',fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:'\ud83d\udcef',fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:'\ud83d\udce5',fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:'\ud83d\udce4',fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:'\ud83d\udcdc',fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:'\ud83d\udcc3',fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:'\ud83d\udcd1',fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:'\ud83e\uddfe',fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:'\ud83d\udcca',fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:'\ud83d\udcc8',fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:'\ud83d\udcc9',fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:'\ud83d\udcc4',fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:'\ud83d\udcc5',fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:'\ud83d\udcc6',fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:'\ud83d\uddd3',fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:'\ud83d\udcc7',fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:'\ud83d\uddc3',fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:'\ud83d\uddf3',fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:'\ud83d\uddc4',fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:'\ud83d\udccb',fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:'\ud83d\uddd2',fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:'\ud83d\udcc1',fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:'\ud83d\udcc2',fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:'\ud83d\uddc2',fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:'\ud83d\uddde',fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:'\ud83d\udcf0',fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:'\ud83d\udcd3',fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:'\ud83d\udcd5',fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:'\ud83d\udcd7',fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:'\ud83d\udcd8',fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:'\ud83d\udcd9',fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:'\ud83d\udcd4',fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:'\ud83d\udcd2',fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:'\ud83d\udcda',fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:'\ud83d\udcd6',fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:'\ud83e\uddf7',fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:'\ud83d\udd17',fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:'\ud83d\udcce',fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:'\ud83d\udd87',fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:'\u2702\ufe0f',fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:'\ud83d\udcd0',fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:'\ud83d\udccf',fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:'\ud83e\uddee',fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:'\ud83d\udccc',fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:'\ud83d\udccd',fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:'\ud83d\udea9',fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:'\ud83c\udff3',fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:'\ud83c\udff4',fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:'\ud83c\udff3\ufe0f\u200d\ud83c\udf08',fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:'\ud83d\udd10',fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:'\ud83d\udd12',fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:'\ud83d\udd13',fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:'\ud83d\udd0f',fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:'\ud83d\udd8a',fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:'\ud83d\udd8b',fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:'\u2712\ufe0f',fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:'\ud83d\udcdd',fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:'\u270f\ufe0f',fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:'\ud83d\udd8d',fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:'\ud83d\udd8c',fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:'\ud83d\udd0d',fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:'\ud83d\udd0e',fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:'\u2764\ufe0f',fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:'\ud83e\udde1',fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9b',fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9a',fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc99',fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9c',fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:'\ud83d\udda4',fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:'\ud83d\udc94',fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:'\u2763',fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:'\ud83d\udc95',fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc9e',fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:'\ud83d\udc93',fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:'\ud83d\udc97',fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:'\ud83d\udc96',fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:'\ud83d\udc98',fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:'\ud83d\udc9d',fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:'\ud83d\udc9f',fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:'\u262e',fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:'\u271d',fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:'\u262a',fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\ud83d\udd49',fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:'\u2638',fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:'\u2721',fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:'\ud83d\udd2f',fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:'\ud83d\udd4e',fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:'\u262f',fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:'\u2626',fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:'\ud83d\uded0',fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:'\u26ce',fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2648',fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2649',fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264a',fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264b',fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264c',fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u264d',fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u264e',fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:'\u264f',fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2650',fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:'\u2651',fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:'\u2652',fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:'\u2653',fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:'\ud83c\udd94',fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:'\u269b',fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:'\ud83c\ude33',fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:'\ud83c\ude39',fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:'\u2622',fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:'\u2623',fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:'\ud83d\udcf4',fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:'\ud83d\udcf3',fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:'\ud83c\ude36',fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:'\ud83c\ude1a',fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:'\ud83c\ude38',fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:'\ud83c\ude3a',fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:'\ud83c\ude37\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:'\u2734\ufe0f',fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:'\ud83c\udd9a',fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:'\ud83c\ude51',fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:'\ud83d\udcae',fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:'\ud83c\ude50',fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:'\u3299\ufe0f',fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:'\u3297\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:'\ud83c\ude34',fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:'\ud83c\ude35',fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:'\ud83c\ude32',fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:'\ud83c\udd70\ufe0f',fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:'\ud83c\udd71\ufe0f',fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:'\ud83c\udd8e',fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:'\ud83c\udd91',fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:'\ud83c\udd7e\ufe0f',fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:'\ud83c\udd98',fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:'\u26d4',fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:'\ud83d\udcdb',fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:'\ud83d\udeab',fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:'\u274c',fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:'\u2b55',fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:'\ud83d\uded1',fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:'\ud83d\udca2',fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:'\u2668\ufe0f',fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:'\ud83d\udeb7',fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:'\ud83d\udeaf',fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:'\ud83d\udeb3',fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:'\ud83d\udeb1',fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:'\ud83d\udd1e',fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:'\ud83d\udcf5',fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:'\u2757',fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:'\u2755',fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:'\u2753',fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:'\u2754',fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:'\u203c\ufe0f',fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:'\u2049\ufe0f',fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:'\ud83d\udd05',fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:'\ud83d\udd06',fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:'\ud83d\udd31',fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:'\u269c',fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:'\u303d\ufe0f',fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:'\u26a0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:'\ud83d\udeb8',fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:'\ud83d\udd30',fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:'\u267b\ufe0f',fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:'\ud83c\ude2f',fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:'\ud83d\udcb9',fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:'\u2747\ufe0f',fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:'\u2733\ufe0f',fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:'\u274e',fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:'\u2705',fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:'\ud83d\udca0',fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:'\ud83c\udf00',fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:'\u27bf',fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:'\ud83c\udf10',fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:'\u24c2\ufe0f',fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:'\ud83c\udfe7',fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:'\ud83c\ude02\ufe0f',fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:'\ud83d\udec2',fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:'\ud83d\udec3',fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:'\ud83d\udec4',fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:'\ud83d\udec5',fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:'\u267f',fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:'\ud83d\udead',fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:'\ud83d\udebe',fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:'\ud83c\udd7f\ufe0f',fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:'\ud83d\udeb0',fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:'\ud83d\udeb9',fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:'\ud83d\udeba',fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:'\ud83d\udebc',fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:'\ud83d\udebb',fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:'\ud83d\udeae',fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:'\ud83c\udfa6',fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:'\ud83d\udcf6',fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:'\ud83c\ude01',fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:'\ud83c\udd96',fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:'\ud83c\udd97',fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:'\ud83c\udd99',fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:'\ud83c\udd92',fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:'\ud83c\udd95',fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:'\ud83c\udd93',fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:'0\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:'1\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:'2\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:'3\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:'4\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:'5\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:'6\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:'7\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:'8\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:'9\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:'\ud83d\udd1f',fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:'*\u20e3',fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:'\u23cf\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:'\u25b6\ufe0f',fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:'\u23f8',fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:'\u23ed',fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:'\u23f9',fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:'\u23fa',fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:'\u23ef',fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:'\u23ee',fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:'\u23e9',fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:'\u23ea',fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:'\ud83d\udd00',fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:'\ud83d\udd01',fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:'\ud83d\udd02',fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:'\u25c0\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:'\ud83d\udd3c',fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:'\ud83d\udd3d',fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:'\u23eb',fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:'\u23ec',fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:'\u27a1\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:'\u2b05\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:'\u2b06\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:'\u2b07\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:'\u2197\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:'\u2198\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:'\u2199\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:'\u2196\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:'\u2195\ufe0f',fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:'\u2194\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:'\ud83d\udd04',fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:'\u21aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:'\u21a9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:'\u2934\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:'\u2935\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:'#\ufe0f\u20e3',fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:'\u2139\ufe0f',fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:'\ud83d\udd24',fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:'\ud83d\udd21',fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:'\ud83d\udd20',fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:'\ud83d\udd23',fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:'\ud83c\udfb5',fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:'\ud83c\udfb6',fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:'\u3030\ufe0f',fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:'\u27b0',fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:'\u2714\ufe0f',fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:'\ud83d\udd03',fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:'\u2795',fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:'\u2796',fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:'\u2797',fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:'\u2716\ufe0f',fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:'\u267e',fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:'\ud83d\udcb2',fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:'\ud83d\udcb1',fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:'\xa9\ufe0f',fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:'\xae\ufe0f',fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:'\u2122\ufe0f',fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:'\ud83d\udd1a',fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:'\ud83d\udd19',fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:'\ud83d\udd1b',fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:'\ud83d\udd1d',fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:'\ud83d\udd1c',fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:'\u2611\ufe0f',fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:'\ud83d\udd18',fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:'\u26aa',fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:'\u26ab',fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:'\ud83d\udd34',fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:'\ud83d\udd35',fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd38',fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd39',fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd36',fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:'\ud83d\udd37',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:'\ud83d\udd3a',fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:'\u25aa\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:'\u25ab\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:'\u2b1b',fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:'\u2b1c',fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:'\ud83d\udd3b',fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:'\u25fc\ufe0f',fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:'\u25fb\ufe0f',fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:'\u25fe',fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:'\u25fd',fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:'\ud83d\udd32',fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:'\ud83d\udd33',fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:'\ud83d\udd08',fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:'\ud83d\udd09',fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:'\ud83d\udd0a',fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:'\ud83d\udd07',fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:'\ud83d\udce3',fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:'\ud83d\udce2',fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:'\ud83d\udd14',fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:'\ud83d\udd15',fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:'\ud83c\udccf',fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:'\ud83c\udc04',fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:'\u2660\ufe0f',fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:'\u2663\ufe0f',fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:'\u2665\ufe0f',fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:'\u2666\ufe0f',fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:'\ud83c\udfb4',fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:'\ud83d\udcad',fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:'\ud83d\uddef',fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:'\ud83d\udcac',fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:'\ud83d\udde8',fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:'\ud83d\udd50',fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:'\ud83d\udd51',fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:'\ud83d\udd52',fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:'\ud83d\udd53',fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:'\ud83d\udd54',fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:'\ud83d\udd55',fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:'\ud83d\udd56',fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:'\ud83d\udd57',fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:'\ud83d\udd58',fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:'\ud83d\udd59',fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5a',fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:'\ud83d\udd5b',fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5c',fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5d',fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5e',fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:'\ud83d\udd5f',fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:'\ud83d\udd60',fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:'\ud83d\udd61',fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:'\ud83d\udd62',fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:'\ud83d\udd63',fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:'\ud83d\udd64',fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:'\ud83d\udd65',fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:'\ud83d\udd66',fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:'\ud83d\udd67',fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:'\ud83c\udde8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:'\ud83c\udde9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:'\ud83c\uddea\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:'\ud83c\uddeb\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:'\ud83c\udde9\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:'\ud83c\udded\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:'\ud83c\uddee\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:'\ud83c\uddef\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:'\ud83c\uddef\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:'\ud83c\uddfd\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf6',fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:'\ud83c\uddfe\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:'\ud83c\uddeb\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:'\ud83c\uddf2\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:'\ud83c\uddf0\ud83c\uddf5',fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:'\ud83c\uddf3\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:'\ud83c\uddf4\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:'\ud83c\uddf6\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:'\ud83c\udde7\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:'\ud83c\uddf0\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:'\ud83c\uddf5\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:'\ud83c\uddfc\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:'\ud83c\uddf7\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfd',fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:'\ud83c\uddec\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:'\ud83c\uddf0\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:'\ud83c\uddf1\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\udde9',fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:'\ud83c\udde8\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:'\ud83c\uddf8\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddef',fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf1',fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf0',fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf4',fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf9',fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf7',fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\udde8',fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:'\ud83c\uddf9\ud83c\uddfb',fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddec',fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:'\ud83c\udde6\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:'\ud83c\uddec\ud83c\udde7',fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:'\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f',fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddf8',fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddee',fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddfe',fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:'\ud83c\uddfa\ud83c\uddff',fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddfa',fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\udde6',fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:'\ud83c\uddfb\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:'\ud83c\uddfc\ud83c\uddeb',fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:'\ud83c\uddea\ud83c\udded',fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:'\ud83c\uddfe\ud83c\uddea',fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\uddf2',fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:'\ud83c\uddff\ud83c\uddfc',fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:'\ud83c\uddfa\ud83c\uddf3',fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:'\ud83c\udff4\u200d\u2620\ufe0f',fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.js new file mode 100644 index 0000000..cf7f472 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.js @@ -0,0 +1,9423 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons", { + grinning: { + keywords: [ "face", "smile", "happy", "joy", ":D", "grin" ], + char: "\ud83d\ude00", + fitzpatrick_scale: false, + category: "people" + }, + grimacing: { + keywords: [ "face", "grimace", "teeth" ], + char: "\ud83d\ude2c", + fitzpatrick_scale: false, + category: "people" + }, + grin: { + keywords: [ "face", "happy", "smile", "joy", "kawaii" ], + char: "\ud83d\ude01", + fitzpatrick_scale: false, + category: "people" + }, + joy: { + keywords: [ "face", "cry", "tears", "weep", "happy", "happytears", "haha" ], + char: "\ud83d\ude02", + fitzpatrick_scale: false, + category: "people" + }, + rofl: { + keywords: [ "face", "rolling", "floor", "laughing", "lol", "haha" ], + char: "\ud83e\udd23", + fitzpatrick_scale: false, + category: "people" + }, + partying: { + keywords: [ "face", "celebration", "woohoo" ], + char: "\ud83e\udd73", + fitzpatrick_scale: false, + category: "people" + }, + smiley: { + keywords: [ "face", "happy", "joy", "haha", ":D", ":)", "smile", "funny" ], + char: "\ud83d\ude03", + fitzpatrick_scale: false, + category: "people" + }, + smile: { + keywords: [ "face", "happy", "joy", "funny", "haha", "laugh", "like", ":D", ":)" ], + char: "\ud83d\ude04", + fitzpatrick_scale: false, + category: "people" + }, + sweat_smile: { + keywords: [ "face", "hot", "happy", "laugh", "sweat", "smile", "relief" ], + char: "\ud83d\ude05", + fitzpatrick_scale: false, + category: "people" + }, + laughing: { + keywords: [ "happy", "joy", "lol", "satisfied", "haha", "face", "glad", "XD", "laugh" ], + char: "\ud83d\ude06", + fitzpatrick_scale: false, + category: "people" + }, + innocent: { + keywords: [ "face", "angel", "heaven", "halo" ], + char: "\ud83d\ude07", + fitzpatrick_scale: false, + category: "people" + }, + wink: { + keywords: [ "face", "happy", "mischievous", "secret", ";)", "smile", "eye" ], + char: "\ud83d\ude09", + fitzpatrick_scale: false, + category: "people" + }, + blush: { + keywords: [ "face", "smile", "happy", "flushed", "crush", "embarrassed", "shy", "joy" ], + char: "\ud83d\ude0a", + fitzpatrick_scale: false, + category: "people" + }, + slightly_smiling_face: { + keywords: [ "face", "smile" ], + char: "\ud83d\ude42", + fitzpatrick_scale: false, + category: "people" + }, + upside_down_face: { + keywords: [ "face", "flipped", "silly", "smile" ], + char: "\ud83d\ude43", + fitzpatrick_scale: false, + category: "people" + }, + relaxed: { + keywords: [ "face", "blush", "massage", "happiness" ], + char: "\u263a\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + yum: { + keywords: [ "happy", "joy", "tongue", "smile", "face", "silly", "yummy", "nom", "delicious", "savouring" ], + char: "\ud83d\ude0b", + fitzpatrick_scale: false, + category: "people" + }, + relieved: { + keywords: [ "face", "relaxed", "phew", "massage", "happiness" ], + char: "\ud83d\ude0c", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "heart" ], + char: "\ud83d\ude0d", + fitzpatrick_scale: false, + category: "people" + }, + smiling_face_with_three_hearts: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "crush", "hearts", "adore" ], + char: "\ud83e\udd70", + fitzpatrick_scale: false, + category: "people" + }, + kissing_heart: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude18", + fitzpatrick_scale: false, + category: "people" + }, + kissing: { + keywords: [ "love", "like", "face", "3", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude17", + fitzpatrick_scale: false, + category: "people" + }, + kissing_smiling_eyes: { + keywords: [ "face", "affection", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude19", + fitzpatrick_scale: false, + category: "people" + }, + kissing_closed_eyes: { + keywords: [ "face", "love", "like", "affection", "valentines", "infatuation", "kiss" ], + char: "\ud83d\ude1a", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_winking_eye: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "wink", "tongue" ], + char: "\ud83d\ude1c", + fitzpatrick_scale: false, + category: "people" + }, + zany: { + keywords: [ "face", "goofy", "crazy" ], + char: "\ud83e\udd2a", + fitzpatrick_scale: false, + category: "people" + }, + raised_eyebrow: { + keywords: [ "face", "distrust", "scepticism", "disapproval", "disbelief", "surprise" ], + char: "\ud83e\udd28", + fitzpatrick_scale: false, + category: "people" + }, + monocle: { + keywords: [ "face", "stuffy", "wealthy" ], + char: "\ud83e\uddd0", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue_closed_eyes: { + keywords: [ "face", "prank", "playful", "mischievous", "smile", "tongue" ], + char: "\ud83d\ude1d", + fitzpatrick_scale: false, + category: "people" + }, + stuck_out_tongue: { + keywords: [ "face", "prank", "childish", "playful", "mischievous", "smile", "tongue" ], + char: "\ud83d\ude1b", + fitzpatrick_scale: false, + category: "people" + }, + money_mouth_face: { + keywords: [ "face", "rich", "dollar", "money" ], + char: "\ud83e\udd11", + fitzpatrick_scale: false, + category: "people" + }, + nerd_face: { + keywords: [ "face", "nerdy", "geek", "dork" ], + char: "\ud83e\udd13", + fitzpatrick_scale: false, + category: "people" + }, + sunglasses: { + keywords: [ "face", "cool", "smile", "summer", "beach", "sunglass" ], + char: "\ud83d\ude0e", + fitzpatrick_scale: false, + category: "people" + }, + star_struck: { + keywords: [ "face", "smile", "starry", "eyes", "grinning" ], + char: "\ud83e\udd29", + fitzpatrick_scale: false, + category: "people" + }, + clown_face: { + keywords: [ "face" ], + char: "\ud83e\udd21", + fitzpatrick_scale: false, + category: "people" + }, + cowboy_hat_face: { + keywords: [ "face", "cowgirl", "hat" ], + char: "\ud83e\udd20", + fitzpatrick_scale: false, + category: "people" + }, + hugs: { + keywords: [ "face", "smile", "hug" ], + char: "\ud83e\udd17", + fitzpatrick_scale: false, + category: "people" + }, + smirk: { + keywords: [ "face", "smile", "mean", "prank", "smug", "sarcasm" ], + char: "\ud83d\ude0f", + fitzpatrick_scale: false, + category: "people" + }, + no_mouth: { + keywords: [ "face", "hellokitty" ], + char: "\ud83d\ude36", + fitzpatrick_scale: false, + category: "people" + }, + neutral_face: { + keywords: [ "indifference", "meh", ":|", "neutral" ], + char: "\ud83d\ude10", + fitzpatrick_scale: false, + category: "people" + }, + expressionless: { + keywords: [ "face", "indifferent", "-_-", "meh", "deadpan" ], + char: "\ud83d\ude11", + fitzpatrick_scale: false, + category: "people" + }, + unamused: { + keywords: [ "indifference", "bored", "straight face", "serious", "sarcasm", "unimpressed", "skeptical", "dubious", "side_eye" ], + char: "\ud83d\ude12", + fitzpatrick_scale: false, + category: "people" + }, + roll_eyes: { + keywords: [ "face", "eyeroll", "frustrated" ], + char: "\ud83d\ude44", + fitzpatrick_scale: false, + category: "people" + }, + thinking: { + keywords: [ "face", "hmmm", "think", "consider" ], + char: "\ud83e\udd14", + fitzpatrick_scale: false, + category: "people" + }, + lying_face: { + keywords: [ "face", "lie", "pinocchio" ], + char: "\ud83e\udd25", + fitzpatrick_scale: false, + category: "people" + }, + hand_over_mouth: { + keywords: [ "face", "whoops", "shock", "surprise" ], + char: "\ud83e\udd2d", + fitzpatrick_scale: false, + category: "people" + }, + shushing: { + keywords: [ "face", "quiet", "shhh" ], + char: "\ud83e\udd2b", + fitzpatrick_scale: false, + category: "people" + }, + symbols_over_mouth: { + keywords: [ "face", "swearing", "cursing", "cussing", "profanity", "expletive" ], + char: "\ud83e\udd2c", + fitzpatrick_scale: false, + category: "people" + }, + exploding_head: { + keywords: [ "face", "shocked", "mind", "blown" ], + char: "\ud83e\udd2f", + fitzpatrick_scale: false, + category: "people" + }, + flushed: { + keywords: [ "face", "blush", "shy", "flattered" ], + char: "\ud83d\ude33", + fitzpatrick_scale: false, + category: "people" + }, + disappointed: { + keywords: [ "face", "sad", "upset", "depressed", ":(" ], + char: "\ud83d\ude1e", + fitzpatrick_scale: false, + category: "people" + }, + worried: { + keywords: [ "face", "concern", "nervous", ":(" ], + char: "\ud83d\ude1f", + fitzpatrick_scale: false, + category: "people" + }, + angry: { + keywords: [ "mad", "face", "annoyed", "frustrated" ], + char: "\ud83d\ude20", + fitzpatrick_scale: false, + category: "people" + }, + rage: { + keywords: [ "angry", "mad", "hate", "despise" ], + char: "\ud83d\ude21", + fitzpatrick_scale: false, + category: "people" + }, + pensive: { + keywords: [ "face", "sad", "depressed", "upset" ], + char: "\ud83d\ude14", + fitzpatrick_scale: false, + category: "people" + }, + confused: { + keywords: [ "face", "indifference", "huh", "weird", "hmmm", ":/" ], + char: "\ud83d\ude15", + fitzpatrick_scale: false, + category: "people" + }, + slightly_frowning_face: { + keywords: [ "face", "frowning", "disappointed", "sad", "upset" ], + char: "\ud83d\ude41", + fitzpatrick_scale: false, + category: "people" + }, + frowning_face: { + keywords: [ "face", "sad", "upset", "frown" ], + char: "\u2639", + fitzpatrick_scale: false, + category: "people" + }, + persevere: { + keywords: [ "face", "sick", "no", "upset", "oops" ], + char: "\ud83d\ude23", + fitzpatrick_scale: false, + category: "people" + }, + confounded: { + keywords: [ "face", "confused", "sick", "unwell", "oops", ":S" ], + char: "\ud83d\ude16", + fitzpatrick_scale: false, + category: "people" + }, + tired_face: { + keywords: [ "sick", "whine", "upset", "frustrated" ], + char: "\ud83d\ude2b", + fitzpatrick_scale: false, + category: "people" + }, + weary: { + keywords: [ "face", "tired", "sleepy", "sad", "frustrated", "upset" ], + char: "\ud83d\ude29", + fitzpatrick_scale: false, + category: "people" + }, + pleading: { + keywords: [ "face", "begging", "mercy" ], + char: "\ud83e\udd7a", + fitzpatrick_scale: false, + category: "people" + }, + triumph: { + keywords: [ "face", "gas", "phew", "proud", "pride" ], + char: "\ud83d\ude24", + fitzpatrick_scale: false, + category: "people" + }, + open_mouth: { + keywords: [ "face", "surprise", "impressed", "wow", "whoa", ":O" ], + char: "\ud83d\ude2e", + fitzpatrick_scale: false, + category: "people" + }, + scream: { + keywords: [ "face", "munch", "scared", "omg" ], + char: "\ud83d\ude31", + fitzpatrick_scale: false, + category: "people" + }, + fearful: { + keywords: [ "face", "scared", "terrified", "nervous", "oops", "huh" ], + char: "\ud83d\ude28", + fitzpatrick_scale: false, + category: "people" + }, + cold_sweat: { + keywords: [ "face", "nervous", "sweat" ], + char: "\ud83d\ude30", + fitzpatrick_scale: false, + category: "people" + }, + hushed: { + keywords: [ "face", "woo", "shh" ], + char: "\ud83d\ude2f", + fitzpatrick_scale: false, + category: "people" + }, + frowning: { + keywords: [ "face", "aw", "what" ], + char: "\ud83d\ude26", + fitzpatrick_scale: false, + category: "people" + }, + anguished: { + keywords: [ "face", "stunned", "nervous" ], + char: "\ud83d\ude27", + fitzpatrick_scale: false, + category: "people" + }, + cry: { + keywords: [ "face", "tears", "sad", "depressed", "upset", ":'(" ], + char: "\ud83d\ude22", + fitzpatrick_scale: false, + category: "people" + }, + disappointed_relieved: { + keywords: [ "face", "phew", "sweat", "nervous" ], + char: "\ud83d\ude25", + fitzpatrick_scale: false, + category: "people" + }, + drooling_face: { + keywords: [ "face" ], + char: "\ud83e\udd24", + fitzpatrick_scale: false, + category: "people" + }, + sleepy: { + keywords: [ "face", "tired", "rest", "nap" ], + char: "\ud83d\ude2a", + fitzpatrick_scale: false, + category: "people" + }, + sweat: { + keywords: [ "face", "hot", "sad", "tired", "exercise" ], + char: "\ud83d\ude13", + fitzpatrick_scale: false, + category: "people" + }, + hot: { + keywords: [ "face", "feverish", "heat", "red", "sweating" ], + char: "\ud83e\udd75", + fitzpatrick_scale: false, + category: "people" + }, + cold: { + keywords: [ "face", "blue", "freezing", "frozen", "frostbite", "icicles" ], + char: "\ud83e\udd76", + fitzpatrick_scale: false, + category: "people" + }, + sob: { + keywords: [ "face", "cry", "tears", "sad", "upset", "depressed" ], + char: "\ud83d\ude2d", + fitzpatrick_scale: false, + category: "people" + }, + dizzy_face: { + keywords: [ "spent", "unconscious", "xox", "dizzy" ], + char: "\ud83d\ude35", + fitzpatrick_scale: false, + category: "people" + }, + astonished: { + keywords: [ "face", "xox", "surprised", "poisoned" ], + char: "\ud83d\ude32", + fitzpatrick_scale: false, + category: "people" + }, + zipper_mouth_face: { + keywords: [ "face", "sealed", "zipper", "secret" ], + char: "\ud83e\udd10", + fitzpatrick_scale: false, + category: "people" + }, + nauseated_face: { + keywords: [ "face", "vomit", "gross", "green", "sick", "throw up", "ill" ], + char: "\ud83e\udd22", + fitzpatrick_scale: false, + category: "people" + }, + sneezing_face: { + keywords: [ "face", "gesundheit", "sneeze", "sick", "allergy" ], + char: "\ud83e\udd27", + fitzpatrick_scale: false, + category: "people" + }, + vomiting: { + keywords: [ "face", "sick" ], + char: "\ud83e\udd2e", + fitzpatrick_scale: false, + category: "people" + }, + mask: { + keywords: [ "face", "sick", "ill", "disease" ], + char: "\ud83d\ude37", + fitzpatrick_scale: false, + category: "people" + }, + face_with_thermometer: { + keywords: [ "sick", "temperature", "thermometer", "cold", "fever" ], + char: "\ud83e\udd12", + fitzpatrick_scale: false, + category: "people" + }, + face_with_head_bandage: { + keywords: [ "injured", "clumsy", "bandage", "hurt" ], + char: "\ud83e\udd15", + fitzpatrick_scale: false, + category: "people" + }, + woozy: { + keywords: [ "face", "dizzy", "intoxicated", "tipsy", "wavy" ], + char: "\ud83e\udd74", + fitzpatrick_scale: false, + category: "people" + }, + sleeping: { + keywords: [ "face", "tired", "sleepy", "night", "zzz" ], + char: "\ud83d\ude34", + fitzpatrick_scale: false, + category: "people" + }, + zzz: { + keywords: [ "sleepy", "tired", "dream" ], + char: "\ud83d\udca4", + fitzpatrick_scale: false, + category: "people" + }, + poop: { + keywords: [ "hankey", "shitface", "fail", "turd", "shit" ], + char: "\ud83d\udca9", + fitzpatrick_scale: false, + category: "people" + }, + smiling_imp: { + keywords: [ "devil", "horns" ], + char: "\ud83d\ude08", + fitzpatrick_scale: false, + category: "people" + }, + imp: { + keywords: [ "devil", "angry", "horns" ], + char: "\ud83d\udc7f", + fitzpatrick_scale: false, + category: "people" + }, + japanese_ogre: { + keywords: [ "monster", "red", "mask", "halloween", "scary", "creepy", "devil", "demon", "japanese", "ogre" ], + char: "\ud83d\udc79", + fitzpatrick_scale: false, + category: "people" + }, + japanese_goblin: { + keywords: [ "red", "evil", "mask", "monster", "scary", "creepy", "japanese", "goblin" ], + char: "\ud83d\udc7a", + fitzpatrick_scale: false, + category: "people" + }, + skull: { + keywords: [ "dead", "skeleton", "creepy", "death" ], + char: "\ud83d\udc80", + fitzpatrick_scale: false, + category: "people" + }, + ghost: { + keywords: [ "halloween", "spooky", "scary" ], + char: "\ud83d\udc7b", + fitzpatrick_scale: false, + category: "people" + }, + alien: { + keywords: [ "UFO", "paul", "weird", "outer_space" ], + char: "\ud83d\udc7d", + fitzpatrick_scale: false, + category: "people" + }, + robot: { + keywords: [ "computer", "machine", "bot" ], + char: "\ud83e\udd16", + fitzpatrick_scale: false, + category: "people" + }, + smiley_cat: { + keywords: [ "animal", "cats", "happy", "smile" ], + char: "\ud83d\ude3a", + fitzpatrick_scale: false, + category: "people" + }, + smile_cat: { + keywords: [ "animal", "cats", "smile" ], + char: "\ud83d\ude38", + fitzpatrick_scale: false, + category: "people" + }, + joy_cat: { + keywords: [ "animal", "cats", "haha", "happy", "tears" ], + char: "\ud83d\ude39", + fitzpatrick_scale: false, + category: "people" + }, + heart_eyes_cat: { + keywords: [ "animal", "love", "like", "affection", "cats", "valentines", "heart" ], + char: "\ud83d\ude3b", + fitzpatrick_scale: false, + category: "people" + }, + smirk_cat: { + keywords: [ "animal", "cats", "smirk" ], + char: "\ud83d\ude3c", + fitzpatrick_scale: false, + category: "people" + }, + kissing_cat: { + keywords: [ "animal", "cats", "kiss" ], + char: "\ud83d\ude3d", + fitzpatrick_scale: false, + category: "people" + }, + scream_cat: { + keywords: [ "animal", "cats", "munch", "scared", "scream" ], + char: "\ud83d\ude40", + fitzpatrick_scale: false, + category: "people" + }, + crying_cat_face: { + keywords: [ "animal", "tears", "weep", "sad", "cats", "upset", "cry" ], + char: "\ud83d\ude3f", + fitzpatrick_scale: false, + category: "people" + }, + pouting_cat: { + keywords: [ "animal", "cats" ], + char: "\ud83d\ude3e", + fitzpatrick_scale: false, + category: "people" + }, + palms_up: { + keywords: [ "hands", "gesture", "cupped", "prayer" ], + char: "\ud83e\udd32", + fitzpatrick_scale: true, + category: "people" + }, + raised_hands: { + keywords: [ "gesture", "hooray", "yea", "celebration", "hands" ], + char: "\ud83d\ude4c", + fitzpatrick_scale: true, + category: "people" + }, + clap: { + keywords: [ "hands", "praise", "applause", "congrats", "yay" ], + char: "\ud83d\udc4f", + fitzpatrick_scale: true, + category: "people" + }, + wave: { + keywords: [ "hands", "gesture", "goodbye", "solong", "farewell", "hello", "hi", "palm" ], + char: "\ud83d\udc4b", + fitzpatrick_scale: true, + category: "people" + }, + call_me_hand: { + keywords: [ "hands", "gesture" ], + char: "\ud83e\udd19", + fitzpatrick_scale: true, + category: "people" + }, + "+1": { + keywords: [ "thumbsup", "yes", "awesome", "good", "agree", "accept", "cool", "hand", "like" ], + char: "\ud83d\udc4d", + fitzpatrick_scale: true, + category: "people" + }, + "-1": { + keywords: [ "thumbsdown", "no", "dislike", "hand" ], + char: "\ud83d\udc4e", + fitzpatrick_scale: true, + category: "people" + }, + facepunch: { + keywords: [ "angry", "violence", "fist", "hit", "attack", "hand" ], + char: "\ud83d\udc4a", + fitzpatrick_scale: true, + category: "people" + }, + fist: { + keywords: [ "fingers", "hand", "grasp" ], + char: "\u270a", + fitzpatrick_scale: true, + category: "people" + }, + fist_left: { + keywords: [ "hand", "fistbump" ], + char: "\ud83e\udd1b", + fitzpatrick_scale: true, + category: "people" + }, + fist_right: { + keywords: [ "hand", "fistbump" ], + char: "\ud83e\udd1c", + fitzpatrick_scale: true, + category: "people" + }, + v: { + keywords: [ "fingers", "ohyeah", "hand", "peace", "victory", "two" ], + char: "\u270c", + fitzpatrick_scale: true, + category: "people" + }, + ok_hand: { + keywords: [ "fingers", "limbs", "perfect", "ok", "okay" ], + char: "\ud83d\udc4c", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand: { + keywords: [ "fingers", "stop", "highfive", "palm", "ban" ], + char: "\u270b", + fitzpatrick_scale: true, + category: "people" + }, + raised_back_of_hand: { + keywords: [ "fingers", "raised", "backhand" ], + char: "\ud83e\udd1a", + fitzpatrick_scale: true, + category: "people" + }, + open_hands: { + keywords: [ "fingers", "butterfly", "hands", "open" ], + char: "\ud83d\udc50", + fitzpatrick_scale: true, + category: "people" + }, + muscle: { + keywords: [ "arm", "flex", "hand", "summer", "strong", "biceps" ], + char: "\ud83d\udcaa", + fitzpatrick_scale: true, + category: "people" + }, + pray: { + keywords: [ "please", "hope", "wish", "namaste", "highfive" ], + char: "\ud83d\ude4f", + fitzpatrick_scale: true, + category: "people" + }, + foot: { + keywords: [ "kick", "stomp" ], + char: "\ud83e\uddb6", + fitzpatrick_scale: true, + category: "people" + }, + leg: { + keywords: [ "kick", "limb" ], + char: "\ud83e\uddb5", + fitzpatrick_scale: true, + category: "people" + }, + handshake: { + keywords: [ "agreement", "shake" ], + char: "\ud83e\udd1d", + fitzpatrick_scale: false, + category: "people" + }, + point_up: { + keywords: [ "hand", "fingers", "direction", "up" ], + char: "\u261d", + fitzpatrick_scale: true, + category: "people" + }, + point_up_2: { + keywords: [ "fingers", "hand", "direction", "up" ], + char: "\ud83d\udc46", + fitzpatrick_scale: true, + category: "people" + }, + point_down: { + keywords: [ "fingers", "hand", "direction", "down" ], + char: "\ud83d\udc47", + fitzpatrick_scale: true, + category: "people" + }, + point_left: { + keywords: [ "direction", "fingers", "hand", "left" ], + char: "\ud83d\udc48", + fitzpatrick_scale: true, + category: "people" + }, + point_right: { + keywords: [ "fingers", "hand", "direction", "right" ], + char: "\ud83d\udc49", + fitzpatrick_scale: true, + category: "people" + }, + fu: { + keywords: [ "hand", "fingers", "rude", "middle", "flipping" ], + char: "\ud83d\udd95", + fitzpatrick_scale: true, + category: "people" + }, + raised_hand_with_fingers_splayed: { + keywords: [ "hand", "fingers", "palm" ], + char: "\ud83d\udd90", + fitzpatrick_scale: true, + category: "people" + }, + love_you: { + keywords: [ "hand", "fingers", "gesture" ], + char: "\ud83e\udd1f", + fitzpatrick_scale: true, + category: "people" + }, + metal: { + keywords: [ "hand", "fingers", "evil_eye", "sign_of_horns", "rock_on" ], + char: "\ud83e\udd18", + fitzpatrick_scale: true, + category: "people" + }, + crossed_fingers: { + keywords: [ "good", "lucky" ], + char: "\ud83e\udd1e", + fitzpatrick_scale: true, + category: "people" + }, + vulcan_salute: { + keywords: [ "hand", "fingers", "spock", "star trek" ], + char: "\ud83d\udd96", + fitzpatrick_scale: true, + category: "people" + }, + writing_hand: { + keywords: [ "lower_left_ballpoint_pen", "stationery", "write", "compose" ], + char: "\u270d", + fitzpatrick_scale: true, + category: "people" + }, + selfie: { + keywords: [ "camera", "phone" ], + char: "\ud83e\udd33", + fitzpatrick_scale: true, + category: "people" + }, + nail_care: { + keywords: [ "beauty", "manicure", "finger", "fashion", "nail" ], + char: "\ud83d\udc85", + fitzpatrick_scale: true, + category: "people" + }, + lips: { + keywords: [ "mouth", "kiss" ], + char: "\ud83d\udc44", + fitzpatrick_scale: false, + category: "people" + }, + tooth: { + keywords: [ "teeth", "dentist" ], + char: "\ud83e\uddb7", + fitzpatrick_scale: false, + category: "people" + }, + tongue: { + keywords: [ "mouth", "playful" ], + char: "\ud83d\udc45", + fitzpatrick_scale: false, + category: "people" + }, + ear: { + keywords: [ "face", "hear", "sound", "listen" ], + char: "\ud83d\udc42", + fitzpatrick_scale: true, + category: "people" + }, + nose: { + keywords: [ "smell", "sniff" ], + char: "\ud83d\udc43", + fitzpatrick_scale: true, + category: "people" + }, + eye: { + keywords: [ "face", "look", "see", "watch", "stare" ], + char: "\ud83d\udc41", + fitzpatrick_scale: false, + category: "people" + }, + eyes: { + keywords: [ "look", "watch", "stalk", "peek", "see" ], + char: "\ud83d\udc40", + fitzpatrick_scale: false, + category: "people" + }, + brain: { + keywords: [ "smart", "intelligent" ], + char: "\ud83e\udde0", + fitzpatrick_scale: false, + category: "people" + }, + bust_in_silhouette: { + keywords: [ "user", "person", "human" ], + char: "\ud83d\udc64", + fitzpatrick_scale: false, + category: "people" + }, + busts_in_silhouette: { + keywords: [ "user", "person", "human", "group", "team" ], + char: "\ud83d\udc65", + fitzpatrick_scale: false, + category: "people" + }, + speaking_head: { + keywords: [ "user", "person", "human", "sing", "say", "talk" ], + char: "\ud83d\udde3", + fitzpatrick_scale: false, + category: "people" + }, + baby: { + keywords: [ "child", "boy", "girl", "toddler" ], + char: "\ud83d\udc76", + fitzpatrick_scale: true, + category: "people" + }, + child: { + keywords: [ "gender-neutral", "young" ], + char: "\ud83e\uddd2", + fitzpatrick_scale: true, + category: "people" + }, + boy: { + keywords: [ "man", "male", "guy", "teenager" ], + char: "\ud83d\udc66", + fitzpatrick_scale: true, + category: "people" + }, + girl: { + keywords: [ "female", "woman", "teenager" ], + char: "\ud83d\udc67", + fitzpatrick_scale: true, + category: "people" + }, + adult: { + keywords: [ "gender-neutral", "person" ], + char: "\ud83e\uddd1", + fitzpatrick_scale: true, + category: "people" + }, + man: { + keywords: [ "mustache", "father", "dad", "guy", "classy", "sir", "moustache" ], + char: "\ud83d\udc68", + fitzpatrick_scale: true, + category: "people" + }, + woman: { + keywords: [ "female", "girls", "lady" ], + char: "\ud83d\udc69", + fitzpatrick_scale: true, + category: "people" + }, + blonde_woman: { + keywords: [ "woman", "female", "girl", "blonde", "person" ], + char: "\ud83d\udc71\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + blonde_man: { + keywords: [ "man", "male", "boy", "blonde", "guy", "person" ], + char: "\ud83d\udc71", + fitzpatrick_scale: true, + category: "people" + }, + bearded_person: { + keywords: [ "person", "bewhiskered" ], + char: "\ud83e\uddd4", + fitzpatrick_scale: true, + category: "people" + }, + older_adult: { + keywords: [ "human", "elder", "senior", "gender-neutral" ], + char: "\ud83e\uddd3", + fitzpatrick_scale: true, + category: "people" + }, + older_man: { + keywords: [ "human", "male", "men", "old", "elder", "senior" ], + char: "\ud83d\udc74", + fitzpatrick_scale: true, + category: "people" + }, + older_woman: { + keywords: [ "human", "female", "women", "lady", "old", "elder", "senior" ], + char: "\ud83d\udc75", + fitzpatrick_scale: true, + category: "people" + }, + man_with_gua_pi_mao: { + keywords: [ "male", "boy", "chinese" ], + char: "\ud83d\udc72", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_headscarf: { + keywords: [ "female", "hijab", "mantilla", "tichel" ], + char: "\ud83e\uddd5", + fitzpatrick_scale: true, + category: "people" + }, + woman_with_turban: { + keywords: [ "female", "indian", "hinduism", "arabs", "woman" ], + char: "\ud83d\udc73\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_with_turban: { + keywords: [ "male", "indian", "hinduism", "arabs" ], + char: "\ud83d\udc73", + fitzpatrick_scale: true, + category: "people" + }, + policewoman: { + keywords: [ "woman", "police", "law", "legal", "enforcement", "arrest", "911", "female" ], + char: "\ud83d\udc6e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + policeman: { + keywords: [ "man", "police", "law", "legal", "enforcement", "arrest", "911" ], + char: "\ud83d\udc6e", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_woman: { + keywords: [ "female", "human", "wip", "build", "construction", "worker", "labor", "woman" ], + char: "\ud83d\udc77\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + construction_worker_man: { + keywords: [ "male", "human", "wip", "guy", "build", "construction", "worker", "labor" ], + char: "\ud83d\udc77", + fitzpatrick_scale: true, + category: "people" + }, + guardswoman: { + keywords: [ "uk", "gb", "british", "female", "royal", "woman" ], + char: "\ud83d\udc82\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + guardsman: { + keywords: [ "uk", "gb", "british", "male", "guy", "royal" ], + char: "\ud83d\udc82", + fitzpatrick_scale: true, + category: "people" + }, + female_detective: { + keywords: [ "human", "spy", "detective", "female", "woman" ], + char: "\ud83d\udd75\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + male_detective: { + keywords: [ "human", "spy", "detective" ], + char: "\ud83d\udd75", + fitzpatrick_scale: true, + category: "people" + }, + woman_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "woman", "human" ], + char: "\ud83d\udc69\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_health_worker: { + keywords: [ "doctor", "nurse", "therapist", "healthcare", "man", "human" ], + char: "\ud83d\udc68\u200d\u2695\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_farmer: { + keywords: [ "rancher", "gardener", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + man_farmer: { + keywords: [ "rancher", "gardener", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udf3e", + fitzpatrick_scale: true, + category: "people" + }, + woman_cook: { + keywords: [ "chef", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + man_cook: { + keywords: [ "chef", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udf73", + fitzpatrick_scale: true, + category: "people" + }, + woman_student: { + keywords: [ "graduate", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + man_student: { + keywords: [ "graduate", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udf93", + fitzpatrick_scale: true, + category: "people" + }, + woman_singer: { + keywords: [ "rockstar", "entertainer", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + man_singer: { + keywords: [ "rockstar", "entertainer", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfa4", + fitzpatrick_scale: true, + category: "people" + }, + woman_teacher: { + keywords: [ "instructor", "professor", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + man_teacher: { + keywords: [ "instructor", "professor", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfeb", + fitzpatrick_scale: true, + category: "people" + }, + woman_factory_worker: { + keywords: [ "assembly", "industrial", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + man_factory_worker: { + keywords: [ "assembly", "industrial", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfed", + fitzpatrick_scale: true, + category: "people" + }, + woman_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "woman", "human", "laptop", "computer" ], + char: "\ud83d\udc69\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + man_technologist: { + keywords: [ "coder", "developer", "engineer", "programmer", "software", "man", "human", "laptop", "computer" ], + char: "\ud83d\udc68\u200d\ud83d\udcbb", + fitzpatrick_scale: true, + category: "people" + }, + woman_office_worker: { + keywords: [ "business", "manager", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + man_office_worker: { + keywords: [ "business", "manager", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\udcbc", + fitzpatrick_scale: true, + category: "people" + }, + woman_mechanic: { + keywords: [ "plumber", "woman", "human", "wrench" ], + char: "\ud83d\udc69\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + man_mechanic: { + keywords: [ "plumber", "man", "human", "wrench" ], + char: "\ud83d\udc68\u200d\ud83d\udd27", + fitzpatrick_scale: true, + category: "people" + }, + woman_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + man_scientist: { + keywords: [ "biologist", "chemist", "engineer", "physicist", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\udd2c", + fitzpatrick_scale: true, + category: "people" + }, + woman_artist: { + keywords: [ "painter", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + man_artist: { + keywords: [ "painter", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83c\udfa8", + fitzpatrick_scale: true, + category: "people" + }, + woman_firefighter: { + keywords: [ "fireman", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + man_firefighter: { + keywords: [ "fireman", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\ude92", + fitzpatrick_scale: true, + category: "people" + }, + woman_pilot: { + keywords: [ "aviator", "plane", "woman", "human" ], + char: "\ud83d\udc69\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_pilot: { + keywords: [ "aviator", "plane", "man", "human" ], + char: "\ud83d\udc68\u200d\u2708\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_astronaut: { + keywords: [ "space", "rocket", "woman", "human" ], + char: "\ud83d\udc69\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + man_astronaut: { + keywords: [ "space", "rocket", "man", "human" ], + char: "\ud83d\udc68\u200d\ud83d\ude80", + fitzpatrick_scale: true, + category: "people" + }, + woman_judge: { + keywords: [ "justice", "court", "woman", "human" ], + char: "\ud83d\udc69\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_judge: { + keywords: [ "justice", "court", "man", "human" ], + char: "\ud83d\udc68\u200d\u2696\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_superhero: { + keywords: [ "woman", "female", "good", "heroine", "superpowers" ], + char: "\ud83e\uddb8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_superhero: { + keywords: [ "man", "male", "good", "hero", "superpowers" ], + char: "\ud83e\uddb8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_supervillain: { + keywords: [ "woman", "female", "evil", "bad", "criminal", "heroine", "superpowers" ], + char: "\ud83e\uddb9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_supervillain: { + keywords: [ "man", "male", "evil", "bad", "criminal", "hero", "superpowers" ], + char: "\ud83e\uddb9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + mrs_claus: { + keywords: [ "woman", "female", "xmas", "mother christmas" ], + char: "\ud83e\udd36", + fitzpatrick_scale: true, + category: "people" + }, + santa: { + keywords: [ "festival", "man", "male", "xmas", "father christmas" ], + char: "\ud83c\udf85", + fitzpatrick_scale: true, + category: "people" + }, + sorceress: { + keywords: [ "woman", "female", "mage", "witch" ], + char: "\ud83e\uddd9\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + wizard: { + keywords: [ "man", "male", "mage", "sorcerer" ], + char: "\ud83e\uddd9\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_elf: { + keywords: [ "woman", "female" ], + char: "\ud83e\udddd\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_elf: { + keywords: [ "man", "male" ], + char: "\ud83e\udddd\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_vampire: { + keywords: [ "woman", "female" ], + char: "\ud83e\udddb\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_vampire: { + keywords: [ "man", "male", "dracula" ], + char: "\ud83e\udddb\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_zombie: { + keywords: [ "woman", "female", "undead", "walking dead" ], + char: "\ud83e\udddf\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_zombie: { + keywords: [ "man", "male", "dracula", "undead", "walking dead" ], + char: "\ud83e\udddf\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + woman_genie: { + keywords: [ "woman", "female" ], + char: "\ud83e\uddde\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + man_genie: { + keywords: [ "man", "male" ], + char: "\ud83e\uddde\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + mermaid: { + keywords: [ "woman", "female", "merwoman", "ariel" ], + char: "\ud83e\udddc\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + merman: { + keywords: [ "man", "male", "triton" ], + char: "\ud83e\udddc\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_fairy: { + keywords: [ "woman", "female" ], + char: "\ud83e\uddda\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_fairy: { + keywords: [ "man", "male" ], + char: "\ud83e\uddda\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + angel: { + keywords: [ "heaven", "wings", "halo" ], + char: "\ud83d\udc7c", + fitzpatrick_scale: true, + category: "people" + }, + pregnant_woman: { + keywords: [ "baby" ], + char: "\ud83e\udd30", + fitzpatrick_scale: true, + category: "people" + }, + breastfeeding: { + keywords: [ "nursing", "baby" ], + char: "\ud83e\udd31", + fitzpatrick_scale: true, + category: "people" + }, + princess: { + keywords: [ "girl", "woman", "female", "blond", "crown", "royal", "queen" ], + char: "\ud83d\udc78", + fitzpatrick_scale: true, + category: "people" + }, + prince: { + keywords: [ "boy", "man", "male", "crown", "royal", "king" ], + char: "\ud83e\udd34", + fitzpatrick_scale: true, + category: "people" + }, + bride_with_veil: { + keywords: [ "couple", "marriage", "wedding", "woman", "bride" ], + char: "\ud83d\udc70", + fitzpatrick_scale: true, + category: "people" + }, + man_in_tuxedo: { + keywords: [ "couple", "marriage", "wedding", "groom" ], + char: "\ud83e\udd35", + fitzpatrick_scale: true, + category: "people" + }, + running_woman: { + keywords: [ "woman", "walking", "exercise", "race", "running", "female" ], + char: "\ud83c\udfc3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + running_man: { + keywords: [ "man", "walking", "exercise", "race", "running" ], + char: "\ud83c\udfc3", + fitzpatrick_scale: true, + category: "people" + }, + walking_woman: { + keywords: [ "human", "feet", "steps", "woman", "female" ], + char: "\ud83d\udeb6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + walking_man: { + keywords: [ "human", "feet", "steps" ], + char: "\ud83d\udeb6", + fitzpatrick_scale: true, + category: "people" + }, + dancer: { + keywords: [ "female", "girl", "woman", "fun" ], + char: "\ud83d\udc83", + fitzpatrick_scale: true, + category: "people" + }, + man_dancing: { + keywords: [ "male", "boy", "fun", "dancer" ], + char: "\ud83d\udd7a", + fitzpatrick_scale: true, + category: "people" + }, + dancing_women: { + keywords: [ "female", "bunny", "women", "girls" ], + char: "\ud83d\udc6f", + fitzpatrick_scale: false, + category: "people" + }, + dancing_men: { + keywords: [ "male", "bunny", "men", "boys" ], + char: "\ud83d\udc6f\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "people" + }, + couple: { + keywords: [ "pair", "people", "human", "love", "date", "dating", "like", "affection", "valentines", "marriage" ], + char: "\ud83d\udc6b", + fitzpatrick_scale: false, + category: "people" + }, + two_men_holding_hands: { + keywords: [ "pair", "couple", "love", "like", "bromance", "friendship", "people", "human" ], + char: "\ud83d\udc6c", + fitzpatrick_scale: false, + category: "people" + }, + two_women_holding_hands: { + keywords: [ "pair", "friendship", "couple", "love", "like", "female", "people", "human" ], + char: "\ud83d\udc6d", + fitzpatrick_scale: false, + category: "people" + }, + bowing_woman: { + keywords: [ "woman", "female", "girl" ], + char: "\ud83d\ude47\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + bowing_man: { + keywords: [ "man", "male", "boy" ], + char: "\ud83d\ude47", + fitzpatrick_scale: true, + category: "people" + }, + man_facepalming: { + keywords: [ "man", "male", "boy", "disbelief" ], + char: "\ud83e\udd26\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_facepalming: { + keywords: [ "woman", "female", "girl", "disbelief" ], + char: "\ud83e\udd26\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_shrugging: { + keywords: [ "woman", "female", "girl", "confused", "indifferent", "doubt" ], + char: "\ud83e\udd37", + fitzpatrick_scale: true, + category: "people" + }, + man_shrugging: { + keywords: [ "man", "male", "boy", "confused", "indifferent", "doubt" ], + char: "\ud83e\udd37\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_woman: { + keywords: [ "female", "girl", "woman", "human", "information" ], + char: "\ud83d\udc81", + fitzpatrick_scale: true, + category: "people" + }, + tipping_hand_man: { + keywords: [ "male", "boy", "man", "human", "information" ], + char: "\ud83d\udc81\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + no_good_woman: { + keywords: [ "female", "girl", "woman", "nope" ], + char: "\ud83d\ude45", + fitzpatrick_scale: true, + category: "people" + }, + no_good_man: { + keywords: [ "male", "boy", "man", "nope" ], + char: "\ud83d\ude45\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + ok_woman: { + keywords: [ "women", "girl", "female", "pink", "human", "woman" ], + char: "\ud83d\ude46", + fitzpatrick_scale: true, + category: "people" + }, + ok_man: { + keywords: [ "men", "boy", "male", "blue", "human", "man" ], + char: "\ud83d\ude46\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_woman: { + keywords: [ "female", "girl", "woman" ], + char: "\ud83d\ude4b", + fitzpatrick_scale: true, + category: "people" + }, + raising_hand_man: { + keywords: [ "male", "boy", "man" ], + char: "\ud83d\ude4b\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + pouting_woman: { + keywords: [ "female", "girl", "woman" ], + char: "\ud83d\ude4e", + fitzpatrick_scale: true, + category: "people" + }, + pouting_man: { + keywords: [ "male", "boy", "man" ], + char: "\ud83d\ude4e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + frowning_woman: { + keywords: [ "female", "girl", "woman", "sad", "depressed", "discouraged", "unhappy" ], + char: "\ud83d\ude4d", + fitzpatrick_scale: true, + category: "people" + }, + frowning_man: { + keywords: [ "male", "boy", "man", "sad", "depressed", "discouraged", "unhappy" ], + char: "\ud83d\ude4d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + haircut_woman: { + keywords: [ "female", "girl", "woman" ], + char: "\ud83d\udc87", + fitzpatrick_scale: true, + category: "people" + }, + haircut_man: { + keywords: [ "male", "boy", "man" ], + char: "\ud83d\udc87\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + massage_woman: { + keywords: [ "female", "girl", "woman", "head" ], + char: "\ud83d\udc86", + fitzpatrick_scale: true, + category: "people" + }, + massage_man: { + keywords: [ "male", "boy", "man", "head" ], + char: "\ud83d\udc86\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + woman_in_steamy_room: { + keywords: [ "female", "woman", "spa", "steamroom", "sauna" ], + char: "\ud83e\uddd6\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + man_in_steamy_room: { + keywords: [ "male", "man", "spa", "steamroom", "sauna" ], + char: "\ud83e\uddd6\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "people" + }, + couple_with_heart_woman_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: "\ud83d\udc91", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_woman_woman: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couple_with_heart_man_man: { + keywords: [ "pair", "love", "like", "affection", "human", "dating", "valentines", "marriage" ], + char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: "\ud83d\udc8f", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_woman_woman: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: "\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69", + fitzpatrick_scale: false, + category: "people" + }, + couplekiss_man_man: { + keywords: [ "pair", "valentines", "love", "like", "dating", "marriage" ], + char: "\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy: { + keywords: [ "home", "parents", "child", "mom", "dad", "father", "mother", "people", "human" ], + char: "\ud83d\udc6a", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl: { + keywords: [ "home", "parents", "people", "human", "child" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_woman_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_boy_boy: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_man_girl_girl: { + keywords: [ "home", "parents", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc69\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc69\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_woman_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc68\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl: { + keywords: [ "home", "parent", "people", "human", "child" ], + char: "\ud83d\udc68\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_boy_boy: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66", + fitzpatrick_scale: false, + category: "people" + }, + family_man_girl_girl: { + keywords: [ "home", "parent", "people", "human", "children" ], + char: "\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67", + fitzpatrick_scale: false, + category: "people" + }, + yarn: { + keywords: [ "ball", "crochet", "knit" ], + char: "\ud83e\uddf6", + fitzpatrick_scale: false, + category: "people" + }, + thread: { + keywords: [ "needle", "sewing", "spool", "string" ], + char: "\ud83e\uddf5", + fitzpatrick_scale: false, + category: "people" + }, + coat: { + keywords: [ "jacket" ], + char: "\ud83e\udde5", + fitzpatrick_scale: false, + category: "people" + }, + labcoat: { + keywords: [ "doctor", "experiment", "scientist", "chemist" ], + char: "\ud83e\udd7c", + fitzpatrick_scale: false, + category: "people" + }, + womans_clothes: { + keywords: [ "fashion", "shopping_bags", "female" ], + char: "\ud83d\udc5a", + fitzpatrick_scale: false, + category: "people" + }, + tshirt: { + keywords: [ "fashion", "cloth", "casual", "shirt", "tee" ], + char: "\ud83d\udc55", + fitzpatrick_scale: false, + category: "people" + }, + jeans: { + keywords: [ "fashion", "shopping" ], + char: "\ud83d\udc56", + fitzpatrick_scale: false, + category: "people" + }, + necktie: { + keywords: [ "shirt", "suitup", "formal", "fashion", "cloth", "business" ], + char: "\ud83d\udc54", + fitzpatrick_scale: false, + category: "people" + }, + dress: { + keywords: [ "clothes", "fashion", "shopping" ], + char: "\ud83d\udc57", + fitzpatrick_scale: false, + category: "people" + }, + bikini: { + keywords: [ "swimming", "female", "woman", "girl", "fashion", "beach", "summer" ], + char: "\ud83d\udc59", + fitzpatrick_scale: false, + category: "people" + }, + kimono: { + keywords: [ "dress", "fashion", "women", "female", "japanese" ], + char: "\ud83d\udc58", + fitzpatrick_scale: false, + category: "people" + }, + lipstick: { + keywords: [ "female", "girl", "fashion", "woman" ], + char: "\ud83d\udc84", + fitzpatrick_scale: false, + category: "people" + }, + kiss: { + keywords: [ "face", "lips", "love", "like", "affection", "valentines" ], + char: "\ud83d\udc8b", + fitzpatrick_scale: false, + category: "people" + }, + footprints: { + keywords: [ "feet", "tracking", "walking", "beach" ], + char: "\ud83d\udc63", + fitzpatrick_scale: false, + category: "people" + }, + flat_shoe: { + keywords: [ "ballet", "slip-on", "slipper" ], + char: "\ud83e\udd7f", + fitzpatrick_scale: false, + category: "people" + }, + high_heel: { + keywords: [ "fashion", "shoes", "female", "pumps", "stiletto" ], + char: "\ud83d\udc60", + fitzpatrick_scale: false, + category: "people" + }, + sandal: { + keywords: [ "shoes", "fashion", "flip flops" ], + char: "\ud83d\udc61", + fitzpatrick_scale: false, + category: "people" + }, + boot: { + keywords: [ "shoes", "fashion" ], + char: "\ud83d\udc62", + fitzpatrick_scale: false, + category: "people" + }, + mans_shoe: { + keywords: [ "fashion", "male" ], + char: "\ud83d\udc5e", + fitzpatrick_scale: false, + category: "people" + }, + athletic_shoe: { + keywords: [ "shoes", "sports", "sneakers" ], + char: "\ud83d\udc5f", + fitzpatrick_scale: false, + category: "people" + }, + hiking_boot: { + keywords: [ "backpacking", "camping", "hiking" ], + char: "\ud83e\udd7e", + fitzpatrick_scale: false, + category: "people" + }, + socks: { + keywords: [ "stockings", "clothes" ], + char: "\ud83e\udde6", + fitzpatrick_scale: false, + category: "people" + }, + gloves: { + keywords: [ "hands", "winter", "clothes" ], + char: "\ud83e\udde4", + fitzpatrick_scale: false, + category: "people" + }, + scarf: { + keywords: [ "neck", "winter", "clothes" ], + char: "\ud83e\udde3", + fitzpatrick_scale: false, + category: "people" + }, + womans_hat: { + keywords: [ "fashion", "accessories", "female", "lady", "spring" ], + char: "\ud83d\udc52", + fitzpatrick_scale: false, + category: "people" + }, + tophat: { + keywords: [ "magic", "gentleman", "classy", "circus" ], + char: "\ud83c\udfa9", + fitzpatrick_scale: false, + category: "people" + }, + billed_hat: { + keywords: [ "cap", "baseball" ], + char: "\ud83e\udde2", + fitzpatrick_scale: false, + category: "people" + }, + rescue_worker_helmet: { + keywords: [ "construction", "build" ], + char: "\u26d1", + fitzpatrick_scale: false, + category: "people" + }, + mortar_board: { + keywords: [ "school", "college", "degree", "university", "graduation", "cap", "hat", "legal", "learn", "education" ], + char: "\ud83c\udf93", + fitzpatrick_scale: false, + category: "people" + }, + crown: { + keywords: [ "king", "kod", "leader", "royalty", "lord" ], + char: "\ud83d\udc51", + fitzpatrick_scale: false, + category: "people" + }, + school_satchel: { + keywords: [ "student", "education", "bag", "backpack" ], + char: "\ud83c\udf92", + fitzpatrick_scale: false, + category: "people" + }, + luggage: { + keywords: [ "packing", "travel" ], + char: "\ud83e\uddf3", + fitzpatrick_scale: false, + category: "people" + }, + pouch: { + keywords: [ "bag", "accessories", "shopping" ], + char: "\ud83d\udc5d", + fitzpatrick_scale: false, + category: "people" + }, + purse: { + keywords: [ "fashion", "accessories", "money", "sales", "shopping" ], + char: "\ud83d\udc5b", + fitzpatrick_scale: false, + category: "people" + }, + handbag: { + keywords: [ "fashion", "accessory", "accessories", "shopping" ], + char: "\ud83d\udc5c", + fitzpatrick_scale: false, + category: "people" + }, + briefcase: { + keywords: [ "business", "documents", "work", "law", "legal", "job", "career" ], + char: "\ud83d\udcbc", + fitzpatrick_scale: false, + category: "people" + }, + eyeglasses: { + keywords: [ "fashion", "accessories", "eyesight", "nerdy", "dork", "geek" ], + char: "\ud83d\udc53", + fitzpatrick_scale: false, + category: "people" + }, + dark_sunglasses: { + keywords: [ "face", "cool", "accessories" ], + char: "\ud83d\udd76", + fitzpatrick_scale: false, + category: "people" + }, + goggles: { + keywords: [ "eyes", "protection", "safety" ], + char: "\ud83e\udd7d", + fitzpatrick_scale: false, + category: "people" + }, + ring: { + keywords: [ "wedding", "propose", "marriage", "valentines", "diamond", "fashion", "jewelry", "gem", "engagement" ], + char: "\ud83d\udc8d", + fitzpatrick_scale: false, + category: "people" + }, + closed_umbrella: { + keywords: [ "weather", "rain", "drizzle" ], + char: "\ud83c\udf02", + fitzpatrick_scale: false, + category: "people" + }, + dog: { + keywords: [ "animal", "friend", "nature", "woof", "puppy", "pet", "faithful" ], + char: "\ud83d\udc36", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat: { + keywords: [ "animal", "meow", "nature", "pet", "kitten" ], + char: "\ud83d\udc31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse: { + keywords: [ "animal", "nature", "cheese_wedge", "rodent" ], + char: "\ud83d\udc2d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hamster: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit: { + keywords: [ "animal", "nature", "pet", "spring", "magic", "bunny" ], + char: "\ud83d\udc30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fox_face: { + keywords: [ "animal", "nature", "face" ], + char: "\ud83e\udd8a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bear: { + keywords: [ "animal", "nature", "wild" ], + char: "\ud83d\udc3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + panda_face: { + keywords: [ "animal", "nature", "panda" ], + char: "\ud83d\udc3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + koala: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger: { + keywords: [ "animal", "cat", "danger", "wild", "nature", "roar" ], + char: "\ud83d\udc2f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lion: { + keywords: [ "animal", "nature" ], + char: "\ud83e\udd81", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: "\ud83d\udc2e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig: { + keywords: [ "animal", "oink", "nature" ], + char: "\ud83d\udc37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig_nose: { + keywords: [ "animal", "oink" ], + char: "\ud83d\udc3d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + frog: { + keywords: [ "animal", "nature", "croak", "toad" ], + char: "\ud83d\udc38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + squid: { + keywords: [ "animal", "nature", "ocean", "sea" ], + char: "\ud83e\udd91", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + octopus: { + keywords: [ "animal", "creature", "ocean", "sea", "nature", "beach" ], + char: "\ud83d\udc19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shrimp: { + keywords: [ "animal", "ocean", "nature", "seafood" ], + char: "\ud83e\udd90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey_face: { + keywords: [ "animal", "nature", "circus" ], + char: "\ud83d\udc35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + gorilla: { + keywords: [ "animal", "nature", "circus" ], + char: "\ud83e\udd8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + see_no_evil: { + keywords: [ "monkey", "animal", "nature", "haha" ], + char: "\ud83d\ude48", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hear_no_evil: { + keywords: [ "animal", "monkey", "nature" ], + char: "\ud83d\ude49", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + speak_no_evil: { + keywords: [ "monkey", "animal", "nature", "omg" ], + char: "\ud83d\ude4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + monkey: { + keywords: [ "animal", "nature", "banana", "circus" ], + char: "\ud83d\udc12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chicken: { + keywords: [ "animal", "cluck", "nature", "bird" ], + char: "\ud83d\udc14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + penguin: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bird: { + keywords: [ "animal", "nature", "fly", "tweet", "spring" ], + char: "\ud83d\udc26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + baby_chick: { + keywords: [ "animal", "chicken", "bird" ], + char: "\ud83d\udc24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatching_chick: { + keywords: [ "animal", "chicken", "egg", "born", "baby", "bird" ], + char: "\ud83d\udc23", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hatched_chick: { + keywords: [ "animal", "chicken", "baby", "bird" ], + char: "\ud83d\udc25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + duck: { + keywords: [ "animal", "nature", "bird", "mallard" ], + char: "\ud83e\udd86", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + eagle: { + keywords: [ "animal", "nature", "bird" ], + char: "\ud83e\udd85", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + owl: { + keywords: [ "animal", "nature", "bird", "hoot" ], + char: "\ud83e\udd89", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bat: { + keywords: [ "animal", "nature", "blind", "vampire" ], + char: "\ud83e\udd87", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wolf: { + keywords: [ "animal", "nature", "wild" ], + char: "\ud83d\udc3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boar: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + horse: { + keywords: [ "animal", "brown", "nature" ], + char: "\ud83d\udc34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + unicorn: { + keywords: [ "animal", "nature", "mystical" ], + char: "\ud83e\udd84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + honeybee: { + keywords: [ "animal", "insect", "nature", "bug", "spring", "honey" ], + char: "\ud83d\udc1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bug: { + keywords: [ "animal", "insect", "nature", "worm" ], + char: "\ud83d\udc1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + butterfly: { + keywords: [ "animal", "insect", "nature", "caterpillar" ], + char: "\ud83e\udd8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snail: { + keywords: [ "slow", "animal", "shell" ], + char: "\ud83d\udc0c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + beetle: { + keywords: [ "animal", "insect", "nature", "ladybug" ], + char: "\ud83d\udc1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ant: { + keywords: [ "animal", "insect", "nature", "bug" ], + char: "\ud83d\udc1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + grasshopper: { + keywords: [ "animal", "cricket", "chirp" ], + char: "\ud83e\udd97", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider: { + keywords: [ "animal", "arachnid" ], + char: "\ud83d\udd77", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + scorpion: { + keywords: [ "animal", "arachnid" ], + char: "\ud83e\udd82", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crab: { + keywords: [ "animal", "crustacean" ], + char: "\ud83e\udd80", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snake: { + keywords: [ "animal", "evil", "nature", "hiss", "python" ], + char: "\ud83d\udc0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lizard: { + keywords: [ "animal", "nature", "reptile" ], + char: "\ud83e\udd8e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + "t-rex": { + keywords: [ "animal", "nature", "dinosaur", "tyrannosaurus", "extinct" ], + char: "\ud83e\udd96", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sauropod: { + keywords: [ "animal", "nature", "dinosaur", "brachiosaurus", "brontosaurus", "diplodocus", "extinct" ], + char: "\ud83e\udd95", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turtle: { + keywords: [ "animal", "slow", "nature", "tortoise" ], + char: "\ud83d\udc22", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tropical_fish: { + keywords: [ "animal", "swim", "ocean", "beach", "nemo" ], + char: "\ud83d\udc20", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fish: { + keywords: [ "animal", "food", "nature" ], + char: "\ud83d\udc1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blowfish: { + keywords: [ "animal", "nature", "food", "sea", "ocean" ], + char: "\ud83d\udc21", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dolphin: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "flipper", "fins", "beach" ], + char: "\ud83d\udc2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shark: { + keywords: [ "animal", "nature", "fish", "sea", "ocean", "jaws", "fins", "beach" ], + char: "\ud83e\udd88", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: "\ud83d\udc33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + whale2: { + keywords: [ "animal", "nature", "sea", "ocean" ], + char: "\ud83d\udc0b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crocodile: { + keywords: [ "animal", "nature", "reptile", "lizard", "alligator" ], + char: "\ud83d\udc0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leopard: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc06", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zebra: { + keywords: [ "animal", "nature", "stripes", "safari" ], + char: "\ud83e\udd93", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tiger2: { + keywords: [ "animal", "nature", "roar" ], + char: "\ud83d\udc05", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + water_buffalo: { + keywords: [ "animal", "nature", "ox", "cow" ], + char: "\ud83d\udc03", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ox: { + keywords: [ "animal", "cow", "beef" ], + char: "\ud83d\udc02", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cow2: { + keywords: [ "beef", "ox", "animal", "nature", "moo", "milk" ], + char: "\ud83d\udc04", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deer: { + keywords: [ "animal", "nature", "horns", "venison" ], + char: "\ud83e\udd8c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dromedary_camel: { + keywords: [ "animal", "hot", "desert", "hump" ], + char: "\ud83d\udc2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + camel: { + keywords: [ "animal", "nature", "hot", "desert", "hump" ], + char: "\ud83d\udc2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + giraffe: { + keywords: [ "animal", "nature", "spots", "safari" ], + char: "\ud83e\udd92", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + elephant: { + keywords: [ "animal", "nature", "nose", "th", "circus" ], + char: "\ud83d\udc18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rhinoceros: { + keywords: [ "animal", "nature", "horn" ], + char: "\ud83e\udd8f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + goat: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc10", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ram: { + keywords: [ "animal", "sheep", "nature" ], + char: "\ud83d\udc0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sheep: { + keywords: [ "animal", "nature", "wool", "shipit" ], + char: "\ud83d\udc11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + racehorse: { + keywords: [ "animal", "gamble", "luck" ], + char: "\ud83d\udc0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + pig2: { + keywords: [ "animal", "nature" ], + char: "\ud83d\udc16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rat: { + keywords: [ "animal", "mouse", "rodent" ], + char: "\ud83d\udc00", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mouse2: { + keywords: [ "animal", "nature", "rodent" ], + char: "\ud83d\udc01", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rooster: { + keywords: [ "animal", "nature", "chicken" ], + char: "\ud83d\udc13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + turkey: { + keywords: [ "animal", "bird" ], + char: "\ud83e\udd83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dove: { + keywords: [ "animal", "bird" ], + char: "\ud83d\udd4a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dog2: { + keywords: [ "animal", "nature", "friend", "doge", "pet", "faithful" ], + char: "\ud83d\udc15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + poodle: { + keywords: [ "dog", "animal", "101", "nature", "pet" ], + char: "\ud83d\udc29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cat2: { + keywords: [ "animal", "meow", "pet", "cats" ], + char: "\ud83d\udc08", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rabbit2: { + keywords: [ "animal", "nature", "pet", "magic", "spring" ], + char: "\ud83d\udc07", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chipmunk: { + keywords: [ "animal", "nature", "rodent", "squirrel" ], + char: "\ud83d\udc3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hedgehog: { + keywords: [ "animal", "nature", "spiny" ], + char: "\ud83e\udd94", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + raccoon: { + keywords: [ "animal", "nature" ], + char: "\ud83e\udd9d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + llama: { + keywords: [ "animal", "nature", "alpaca" ], + char: "\ud83e\udd99", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hippopotamus: { + keywords: [ "animal", "nature" ], + char: "\ud83e\udd9b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + kangaroo: { + keywords: [ "animal", "nature", "australia", "joey", "hop", "marsupial" ], + char: "\ud83e\udd98", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + badger: { + keywords: [ "animal", "nature", "honey" ], + char: "\ud83e\udda1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + swan: { + keywords: [ "animal", "nature", "bird" ], + char: "\ud83e\udda2", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + peacock: { + keywords: [ "animal", "nature", "peahen", "bird" ], + char: "\ud83e\udd9a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + parrot: { + keywords: [ "animal", "nature", "bird", "pirate", "talk" ], + char: "\ud83e\udd9c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + lobster: { + keywords: [ "animal", "nature", "bisque", "claws", "seafood" ], + char: "\ud83e\udd9e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mosquito: { + keywords: [ "animal", "nature", "insect", "malaria" ], + char: "\ud83e\udd9f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + paw_prints: { + keywords: [ "animal", "tracking", "footprints", "dog", "cat", "pet", "feet" ], + char: "\ud83d\udc3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: "\ud83d\udc09", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dragon_face: { + keywords: [ "animal", "myth", "nature", "chinese", "green" ], + char: "\ud83d\udc32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cactus: { + keywords: [ "vegetable", "plant", "nature" ], + char: "\ud83c\udf35", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + christmas_tree: { + keywords: [ "festival", "vacation", "december", "xmas", "celebration" ], + char: "\ud83c\udf84", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + evergreen_tree: { + keywords: [ "plant", "nature" ], + char: "\ud83c\udf32", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + deciduous_tree: { + keywords: [ "plant", "nature" ], + char: "\ud83c\udf33", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + palm_tree: { + keywords: [ "plant", "vegetable", "nature", "summer", "beach", "mojito", "tropical" ], + char: "\ud83c\udf34", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + seedling: { + keywords: [ "plant", "nature", "grass", "lawn", "spring" ], + char: "\ud83c\udf31", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + herb: { + keywords: [ "vegetable", "plant", "medicine", "weed", "grass", "lawn" ], + char: "\ud83c\udf3f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shamrock: { + keywords: [ "vegetable", "plant", "nature", "irish", "clover" ], + char: "\u2618", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + four_leaf_clover: { + keywords: [ "vegetable", "plant", "nature", "lucky", "irish" ], + char: "\ud83c\udf40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bamboo: { + keywords: [ "plant", "nature", "vegetable", "panda", "pine_decoration" ], + char: "\ud83c\udf8d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tanabata_tree: { + keywords: [ "plant", "nature", "branch", "summer" ], + char: "\ud83c\udf8b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + leaves: { + keywords: [ "nature", "plant", "tree", "vegetable", "grass", "lawn", "spring" ], + char: "\ud83c\udf43", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fallen_leaf: { + keywords: [ "nature", "plant", "vegetable", "leaves" ], + char: "\ud83c\udf42", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + maple_leaf: { + keywords: [ "nature", "plant", "vegetable", "ca", "fall" ], + char: "\ud83c\udf41", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ear_of_rice: { + keywords: [ "nature", "plant" ], + char: "\ud83c\udf3e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + hibiscus: { + keywords: [ "plant", "vegetable", "flowers", "beach" ], + char: "\ud83c\udf3a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunflower: { + keywords: [ "nature", "plant", "fall" ], + char: "\ud83c\udf3b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + rose: { + keywords: [ "flowers", "valentines", "love", "spring" ], + char: "\ud83c\udf39", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wilted_flower: { + keywords: [ "plant", "nature", "flower" ], + char: "\ud83e\udd40", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tulip: { + keywords: [ "flowers", "plant", "nature", "summer", "spring" ], + char: "\ud83c\udf37", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + blossom: { + keywords: [ "nature", "flowers", "yellow" ], + char: "\ud83c\udf3c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cherry_blossom: { + keywords: [ "nature", "plant", "spring", "flower" ], + char: "\ud83c\udf38", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + bouquet: { + keywords: [ "flowers", "nature", "spring" ], + char: "\ud83d\udc90", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + mushroom: { + keywords: [ "plant", "vegetable" ], + char: "\ud83c\udf44", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + chestnut: { + keywords: [ "food", "squirrel" ], + char: "\ud83c\udf30", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + jack_o_lantern: { + keywords: [ "halloween", "light", "pumpkin", "creepy", "fall" ], + char: "\ud83c\udf83", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + shell: { + keywords: [ "nature", "sea", "beach" ], + char: "\ud83d\udc1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + spider_web: { + keywords: [ "animal", "insect", "arachnid", "silk" ], + char: "\ud83d\udd78", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_americas: { + keywords: [ "globe", "world", "USA", "international" ], + char: "\ud83c\udf0e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_africa: { + keywords: [ "globe", "world", "international" ], + char: "\ud83c\udf0d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + earth_asia: { + keywords: [ "globe", "world", "east", "international" ], + char: "\ud83c\udf0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon: { + keywords: [ "nature", "yellow", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf15", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_gibbous_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep", "waxing_gibbous_moon" ], + char: "\ud83c\udf16", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf17", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waning_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf18", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf11", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_crescent_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf12", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf13", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + waxing_gibbous_moon: { + keywords: [ "nature", "night", "sky", "gray", "twilight", "planet", "space", "evening", "sleep" ], + char: "\ud83c\udf14", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + new_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + full_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1d", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + first_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + last_quarter_moon_with_face: { + keywords: [ "nature", "twilight", "planet", "space", "night", "evening", "sleep" ], + char: "\ud83c\udf1c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_with_face: { + keywords: [ "nature", "morning", "sky" ], + char: "\ud83c\udf1e", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + crescent_moon: { + keywords: [ "night", "sleep", "sky", "evening", "magic" ], + char: "\ud83c\udf19", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star: { + keywords: [ "night", "yellow" ], + char: "\u2b50", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + star2: { + keywords: [ "night", "sparkle", "awesome", "good", "magic" ], + char: "\ud83c\udf1f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dizzy: { + keywords: [ "star", "sparkle", "shoot", "magic" ], + char: "\ud83d\udcab", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sparkles: { + keywords: [ "stars", "shine", "shiny", "cool", "awesome", "good", "magic" ], + char: "\u2728", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + comet: { + keywords: [ "space" ], + char: "\u2604", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sunny: { + keywords: [ "weather", "nature", "brightness", "summer", "beach", "spring" ], + char: "\u2600\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_small_cloud: { + keywords: [ "weather" ], + char: "\ud83c\udf24", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + partly_sunny: { + keywords: [ "weather", "nature", "cloudy", "morning", "fall", "spring" ], + char: "\u26c5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_large_cloud: { + keywords: [ "weather" ], + char: "\ud83c\udf25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sun_behind_rain_cloud: { + keywords: [ "weather" ], + char: "\ud83c\udf26", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud: { + keywords: [ "weather", "sky" ], + char: "\u2601\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_rain: { + keywords: [ "weather" ], + char: "\ud83c\udf27", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning_and_rain: { + keywords: [ "weather", "lightning" ], + char: "\u26c8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_lightning: { + keywords: [ "weather", "thunder" ], + char: "\ud83c\udf29", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + zap: { + keywords: [ "thunder", "weather", "lightning bolt", "fast" ], + char: "\u26a1", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fire: { + keywords: [ "hot", "cook", "flame" ], + char: "\ud83d\udd25", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + boom: { + keywords: [ "bomb", "explode", "explosion", "collision", "blown" ], + char: "\ud83d\udca5", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowflake: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas" ], + char: "\u2744\ufe0f", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + cloud_with_snow: { + keywords: [ "weather" ], + char: "\ud83c\udf28", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen", "without_snow" ], + char: "\u26c4", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + snowman_with_snow: { + keywords: [ "winter", "season", "cold", "weather", "christmas", "xmas", "frozen" ], + char: "\u2603", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + wind_face: { + keywords: [ "gust", "air" ], + char: "\ud83c\udf2c", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + dash: { + keywords: [ "wind", "air", "fast", "shoo", "fart", "smoke", "puff" ], + char: "\ud83d\udca8", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + tornado: { + keywords: [ "weather", "cyclone", "twister" ], + char: "\ud83c\udf2a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + fog: { + keywords: [ "weather" ], + char: "\ud83c\udf2b", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + open_umbrella: { + keywords: [ "weather", "spring" ], + char: "\u2602", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + umbrella: { + keywords: [ "rainy", "weather", "spring" ], + char: "\u2614", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + droplet: { + keywords: [ "water", "drip", "faucet", "spring" ], + char: "\ud83d\udca7", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + sweat_drops: { + keywords: [ "water", "drip", "oops" ], + char: "\ud83d\udca6", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + ocean: { + keywords: [ "sea", "water", "wave", "nature", "tsunami", "disaster" ], + char: "\ud83c\udf0a", + fitzpatrick_scale: false, + category: "animals_and_nature" + }, + green_apple: { + keywords: [ "fruit", "nature" ], + char: "\ud83c\udf4f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + apple: { + keywords: [ "fruit", "mac", "school" ], + char: "\ud83c\udf4e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pear: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tangerine: { + keywords: [ "food", "fruit", "nature", "orange" ], + char: "\ud83c\udf4a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lemon: { + keywords: [ "fruit", "nature" ], + char: "\ud83c\udf4b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + banana: { + keywords: [ "fruit", "food", "monkey" ], + char: "\ud83c\udf4c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + watermelon: { + keywords: [ "fruit", "food", "picnic", "summer" ], + char: "\ud83c\udf49", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + grapes: { + keywords: [ "fruit", "food", "wine" ], + char: "\ud83c\udf47", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + strawberry: { + keywords: [ "fruit", "food", "nature" ], + char: "\ud83c\udf53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + melon: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf48", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cherries: { + keywords: [ "food", "fruit" ], + char: "\ud83c\udf52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peach: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pineapple: { + keywords: [ "fruit", "nature", "food" ], + char: "\ud83c\udf4d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coconut: { + keywords: [ "fruit", "nature", "food", "palm" ], + char: "\ud83e\udd65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + kiwi_fruit: { + keywords: [ "fruit", "food" ], + char: "\ud83e\udd5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + mango: { + keywords: [ "fruit", "food", "tropical" ], + char: "\ud83e\udd6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + avocado: { + keywords: [ "fruit", "food" ], + char: "\ud83e\udd51", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + broccoli: { + keywords: [ "fruit", "food", "vegetable" ], + char: "\ud83e\udd66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tomato: { + keywords: [ "fruit", "vegetable", "nature", "food" ], + char: "\ud83c\udf45", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + eggplant: { + keywords: [ "vegetable", "nature", "food", "aubergine" ], + char: "\ud83c\udf46", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cucumber: { + keywords: [ "fruit", "food", "pickle" ], + char: "\ud83e\udd52", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + carrot: { + keywords: [ "vegetable", "food", "orange" ], + char: "\ud83e\udd55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hot_pepper: { + keywords: [ "food", "spicy", "chilli", "chili" ], + char: "\ud83c\udf36", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + potato: { + keywords: [ "food", "tuber", "vegatable", "starch" ], + char: "\ud83e\udd54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + corn: { + keywords: [ "food", "vegetable", "plant" ], + char: "\ud83c\udf3d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + leafy_greens: { + keywords: [ "food", "vegetable", "plant", "bok choy", "cabbage", "kale", "lettuce" ], + char: "\ud83e\udd6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sweet_potato: { + keywords: [ "food", "nature" ], + char: "\ud83c\udf60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + peanuts: { + keywords: [ "food", "nut" ], + char: "\ud83e\udd5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + honey_pot: { + keywords: [ "bees", "sweet", "kitchen" ], + char: "\ud83c\udf6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + croissant: { + keywords: [ "food", "bread", "french" ], + char: "\ud83e\udd50", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bread: { + keywords: [ "food", "wheat", "breakfast", "toast" ], + char: "\ud83c\udf5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baguette_bread: { + keywords: [ "food", "bread", "french" ], + char: "\ud83e\udd56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bagel: { + keywords: [ "food", "bread", "bakery", "schmear" ], + char: "\ud83e\udd6f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pretzel: { + keywords: [ "food", "bread", "twisted" ], + char: "\ud83e\udd68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cheese: { + keywords: [ "food", "chadder" ], + char: "\ud83e\uddc0", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + egg: { + keywords: [ "food", "chicken", "breakfast" ], + char: "\ud83e\udd5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bacon: { + keywords: [ "food", "breakfast", "pork", "pig", "meat" ], + char: "\ud83e\udd53", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + steak: { + keywords: [ "food", "cow", "meat", "cut", "chop", "lambchop", "porkchop" ], + char: "\ud83e\udd69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pancakes: { + keywords: [ "food", "breakfast", "flapjacks", "hotcakes" ], + char: "\ud83e\udd5e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + poultry_leg: { + keywords: [ "food", "meat", "drumstick", "bird", "chicken", "turkey" ], + char: "\ud83c\udf57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + meat_on_bone: { + keywords: [ "good", "food", "drumstick" ], + char: "\ud83c\udf56", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bone: { + keywords: [ "skeleton" ], + char: "\ud83e\uddb4", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_shrimp: { + keywords: [ "food", "animal", "appetizer", "summer" ], + char: "\ud83c\udf64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fried_egg: { + keywords: [ "food", "breakfast", "kitchen", "egg" ], + char: "\ud83c\udf73", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hamburger: { + keywords: [ "meat", "fast food", "beef", "cheeseburger", "mcdonalds", "burger king" ], + char: "\ud83c\udf54", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fries: { + keywords: [ "chips", "snack", "fast food" ], + char: "\ud83c\udf5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stuffed_flatbread: { + keywords: [ "food", "flatbread", "stuffed", "gyro" ], + char: "\ud83e\udd59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + hotdog: { + keywords: [ "food", "frankfurter" ], + char: "\ud83c\udf2d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pizza: { + keywords: [ "food", "party" ], + char: "\ud83c\udf55", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sandwich: { + keywords: [ "food", "lunch", "bread" ], + char: "\ud83e\udd6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + canned_food: { + keywords: [ "food", "soup" ], + char: "\ud83e\udd6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spaghetti: { + keywords: [ "food", "italian", "noodle" ], + char: "\ud83c\udf5d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + taco: { + keywords: [ "food", "mexican" ], + char: "\ud83c\udf2e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + burrito: { + keywords: [ "food", "mexican" ], + char: "\ud83c\udf2f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + green_salad: { + keywords: [ "food", "healthy", "lettuce" ], + char: "\ud83e\udd57", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shallow_pan_of_food: { + keywords: [ "food", "cooking", "casserole", "paella" ], + char: "\ud83e\udd58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ramen: { + keywords: [ "food", "japanese", "noodle", "chopsticks" ], + char: "\ud83c\udf5c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + stew: { + keywords: [ "food", "meat", "soup" ], + char: "\ud83c\udf72", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fish_cake: { + keywords: [ "food", "japan", "sea", "beach", "narutomaki", "pink", "swirl", "kamaboko", "surimi", "ramen" ], + char: "\ud83c\udf65", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fortune_cookie: { + keywords: [ "food", "prophecy" ], + char: "\ud83e\udd60", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sushi: { + keywords: [ "food", "fish", "japanese", "rice" ], + char: "\ud83c\udf63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bento: { + keywords: [ "food", "japanese", "box" ], + char: "\ud83c\udf71", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + curry: { + keywords: [ "food", "spicy", "hot", "indian" ], + char: "\ud83c\udf5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_ball: { + keywords: [ "food", "japanese" ], + char: "\ud83c\udf59", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice: { + keywords: [ "food", "china", "asian" ], + char: "\ud83c\udf5a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + rice_cracker: { + keywords: [ "food", "japanese" ], + char: "\ud83c\udf58", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + oden: { + keywords: [ "food", "japanese" ], + char: "\ud83c\udf62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dango: { + keywords: [ "food", "dessert", "sweet", "japanese", "barbecue", "meat" ], + char: "\ud83c\udf61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + shaved_ice: { + keywords: [ "hot", "dessert", "summer" ], + char: "\ud83c\udf67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + ice_cream: { + keywords: [ "food", "hot", "dessert" ], + char: "\ud83c\udf68", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + icecream: { + keywords: [ "food", "hot", "dessert", "summer" ], + char: "\ud83c\udf66", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + pie: { + keywords: [ "food", "dessert", "pastry" ], + char: "\ud83e\udd67", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cake: { + keywords: [ "food", "dessert" ], + char: "\ud83c\udf70", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cupcake: { + keywords: [ "food", "dessert", "bakery", "sweet" ], + char: "\ud83e\uddc1", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + moon_cake: { + keywords: [ "food", "autumn" ], + char: "\ud83e\udd6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + birthday: { + keywords: [ "food", "dessert", "cake" ], + char: "\ud83c\udf82", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + custard: { + keywords: [ "dessert", "food" ], + char: "\ud83c\udf6e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + candy: { + keywords: [ "snack", "dessert", "sweet", "lolly" ], + char: "\ud83c\udf6c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + lollipop: { + keywords: [ "food", "snack", "candy", "sweet" ], + char: "\ud83c\udf6d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chocolate_bar: { + keywords: [ "food", "snack", "dessert", "sweet" ], + char: "\ud83c\udf6b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + popcorn: { + keywords: [ "food", "movie theater", "films", "snack" ], + char: "\ud83c\udf7f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + dumpling: { + keywords: [ "food", "empanada", "pierogi", "potsticker" ], + char: "\ud83e\udd5f", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + doughnut: { + keywords: [ "food", "dessert", "snack", "sweet", "donut" ], + char: "\ud83c\udf69", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cookie: { + keywords: [ "food", "snack", "oreo", "chocolate", "sweet", "dessert" ], + char: "\ud83c\udf6a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + milk_glass: { + keywords: [ "beverage", "drink", "cow" ], + char: "\ud83e\udd5b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beer: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: "\ud83c\udf7a", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + beers: { + keywords: [ "relax", "beverage", "drink", "drunk", "party", "pub", "summer", "alcohol", "booze" ], + char: "\ud83c\udf7b", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + clinking_glasses: { + keywords: [ "beverage", "drink", "party", "alcohol", "celebrate", "cheers", "wine", "champagne", "toast" ], + char: "\ud83e\udd42", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + wine_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "booze" ], + char: "\ud83c\udf77", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tumbler_glass: { + keywords: [ "drink", "beverage", "drunk", "alcohol", "liquor", "booze", "bourbon", "scotch", "whisky", "glass", "shot" ], + char: "\ud83e\udd43", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cocktail: { + keywords: [ "drink", "drunk", "alcohol", "beverage", "booze", "mojito" ], + char: "\ud83c\udf78", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tropical_drink: { + keywords: [ "beverage", "cocktail", "summer", "beach", "alcohol", "booze", "mojito" ], + char: "\ud83c\udf79", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + champagne: { + keywords: [ "drink", "wine", "bottle", "celebration" ], + char: "\ud83c\udf7e", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + sake: { + keywords: [ "wine", "drink", "drunk", "beverage", "japanese", "alcohol", "booze" ], + char: "\ud83c\udf76", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + tea: { + keywords: [ "drink", "bowl", "breakfast", "green", "british" ], + char: "\ud83c\udf75", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + cup_with_straw: { + keywords: [ "drink", "soda" ], + char: "\ud83e\udd64", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + coffee: { + keywords: [ "beverage", "caffeine", "latte", "espresso" ], + char: "\u2615", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + baby_bottle: { + keywords: [ "food", "container", "milk" ], + char: "\ud83c\udf7c", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + salt: { + keywords: [ "condiment", "shaker" ], + char: "\ud83e\uddc2", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + spoon: { + keywords: [ "cutlery", "kitchen", "tableware" ], + char: "\ud83e\udd44", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + fork_and_knife: { + keywords: [ "cutlery", "kitchen" ], + char: "\ud83c\udf74", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + plate_with_cutlery: { + keywords: [ "food", "eat", "meal", "lunch", "dinner", "restaurant" ], + char: "\ud83c\udf7d", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + bowl_with_spoon: { + keywords: [ "food", "breakfast", "cereal", "oatmeal", "porridge" ], + char: "\ud83e\udd63", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + takeout_box: { + keywords: [ "food", "leftovers" ], + char: "\ud83e\udd61", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + chopsticks: { + keywords: [ "food" ], + char: "\ud83e\udd62", + fitzpatrick_scale: false, + category: "food_and_drink" + }, + soccer: { + keywords: [ "sports", "football" ], + char: "\u26bd", + fitzpatrick_scale: false, + category: "activity" + }, + basketball: { + keywords: [ "sports", "balls", "NBA" ], + char: "\ud83c\udfc0", + fitzpatrick_scale: false, + category: "activity" + }, + football: { + keywords: [ "sports", "balls", "NFL" ], + char: "\ud83c\udfc8", + fitzpatrick_scale: false, + category: "activity" + }, + baseball: { + keywords: [ "sports", "balls" ], + char: "\u26be", + fitzpatrick_scale: false, + category: "activity" + }, + softball: { + keywords: [ "sports", "balls" ], + char: "\ud83e\udd4e", + fitzpatrick_scale: false, + category: "activity" + }, + tennis: { + keywords: [ "sports", "balls", "green" ], + char: "\ud83c\udfbe", + fitzpatrick_scale: false, + category: "activity" + }, + volleyball: { + keywords: [ "sports", "balls" ], + char: "\ud83c\udfd0", + fitzpatrick_scale: false, + category: "activity" + }, + rugby_football: { + keywords: [ "sports", "team" ], + char: "\ud83c\udfc9", + fitzpatrick_scale: false, + category: "activity" + }, + flying_disc: { + keywords: [ "sports", "frisbee", "ultimate" ], + char: "\ud83e\udd4f", + fitzpatrick_scale: false, + category: "activity" + }, + "8ball": { + keywords: [ "pool", "hobby", "game", "luck", "magic" ], + char: "\ud83c\udfb1", + fitzpatrick_scale: false, + category: "activity" + }, + golf: { + keywords: [ "sports", "business", "flag", "hole", "summer" ], + char: "\u26f3", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_woman: { + keywords: [ "sports", "business", "woman", "female" ], + char: "\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + golfing_man: { + keywords: [ "sports", "business" ], + char: "\ud83c\udfcc", + fitzpatrick_scale: true, + category: "activity" + }, + ping_pong: { + keywords: [ "sports", "pingpong" ], + char: "\ud83c\udfd3", + fitzpatrick_scale: false, + category: "activity" + }, + badminton: { + keywords: [ "sports" ], + char: "\ud83c\udff8", + fitzpatrick_scale: false, + category: "activity" + }, + goal_net: { + keywords: [ "sports" ], + char: "\ud83e\udd45", + fitzpatrick_scale: false, + category: "activity" + }, + ice_hockey: { + keywords: [ "sports" ], + char: "\ud83c\udfd2", + fitzpatrick_scale: false, + category: "activity" + }, + field_hockey: { + keywords: [ "sports" ], + char: "\ud83c\udfd1", + fitzpatrick_scale: false, + category: "activity" + }, + lacrosse: { + keywords: [ "sports", "ball", "stick" ], + char: "\ud83e\udd4d", + fitzpatrick_scale: false, + category: "activity" + }, + cricket: { + keywords: [ "sports" ], + char: "\ud83c\udfcf", + fitzpatrick_scale: false, + category: "activity" + }, + ski: { + keywords: [ "sports", "winter", "cold", "snow" ], + char: "\ud83c\udfbf", + fitzpatrick_scale: false, + category: "activity" + }, + skier: { + keywords: [ "sports", "winter", "snow" ], + char: "\u26f7", + fitzpatrick_scale: false, + category: "activity" + }, + snowboarder: { + keywords: [ "sports", "winter" ], + char: "\ud83c\udfc2", + fitzpatrick_scale: true, + category: "activity" + }, + person_fencing: { + keywords: [ "sports", "fencing", "sword" ], + char: "\ud83e\udd3a", + fitzpatrick_scale: false, + category: "activity" + }, + women_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: "\ud83e\udd3c\u200d\u2640\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + men_wrestling: { + keywords: [ "sports", "wrestlers" ], + char: "\ud83e\udd3c\u200d\u2642\ufe0f", + fitzpatrick_scale: false, + category: "activity" + }, + woman_cartwheeling: { + keywords: [ "gymnastics" ], + char: "\ud83e\udd38\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_cartwheeling: { + keywords: [ "gymnastics" ], + char: "\ud83e\udd38\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_handball: { + keywords: [ "sports" ], + char: "\ud83e\udd3e\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_handball: { + keywords: [ "sports" ], + char: "\ud83e\udd3e\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + ice_skate: { + keywords: [ "sports" ], + char: "\u26f8", + fitzpatrick_scale: false, + category: "activity" + }, + curling_stone: { + keywords: [ "sports" ], + char: "\ud83e\udd4c", + fitzpatrick_scale: false, + category: "activity" + }, + skateboard: { + keywords: [ "board" ], + char: "\ud83d\udef9", + fitzpatrick_scale: false, + category: "activity" + }, + sled: { + keywords: [ "sleigh", "luge", "toboggan" ], + char: "\ud83d\udef7", + fitzpatrick_scale: false, + category: "activity" + }, + bow_and_arrow: { + keywords: [ "sports" ], + char: "\ud83c\udff9", + fitzpatrick_scale: false, + category: "activity" + }, + fishing_pole_and_fish: { + keywords: [ "food", "hobby", "summer" ], + char: "\ud83c\udfa3", + fitzpatrick_scale: false, + category: "activity" + }, + boxing_glove: { + keywords: [ "sports", "fighting" ], + char: "\ud83e\udd4a", + fitzpatrick_scale: false, + category: "activity" + }, + martial_arts_uniform: { + keywords: [ "judo", "karate", "taekwondo" ], + char: "\ud83e\udd4b", + fitzpatrick_scale: false, + category: "activity" + }, + rowing_woman: { + keywords: [ "sports", "hobby", "water", "ship", "woman", "female" ], + char: "\ud83d\udea3\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + rowing_man: { + keywords: [ "sports", "hobby", "water", "ship" ], + char: "\ud83d\udea3", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_woman: { + keywords: [ "sports", "hobby", "woman", "female", "rock" ], + char: "\ud83e\uddd7\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + climbing_man: { + keywords: [ "sports", "hobby", "man", "male", "rock" ], + char: "\ud83e\uddd7\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_woman: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer", "woman", "female" ], + char: "\ud83c\udfca\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + swimming_man: { + keywords: [ "sports", "exercise", "human", "athlete", "water", "summer" ], + char: "\ud83c\udfca", + fitzpatrick_scale: true, + category: "activity" + }, + woman_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: "\ud83e\udd3d\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_playing_water_polo: { + keywords: [ "sports", "pool" ], + char: "\ud83e\udd3d\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + woman_in_lotus_position: { + keywords: [ "woman", "female", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: "\ud83e\uddd8\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_in_lotus_position: { + keywords: [ "man", "male", "meditation", "yoga", "serenity", "zen", "mindfulness" ], + char: "\ud83e\uddd8\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_woman: { + keywords: [ "sports", "ocean", "sea", "summer", "beach", "woman", "female" ], + char: "\ud83c\udfc4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + surfing_man: { + keywords: [ "sports", "ocean", "sea", "summer", "beach" ], + char: "\ud83c\udfc4", + fitzpatrick_scale: true, + category: "activity" + }, + bath: { + keywords: [ "clean", "shower", "bathroom" ], + char: "\ud83d\udec0", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_woman: { + keywords: [ "sports", "human", "woman", "female" ], + char: "\u26f9\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + basketball_man: { + keywords: [ "sports", "human" ], + char: "\u26f9", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_woman: { + keywords: [ "sports", "training", "exercise", "woman", "female" ], + char: "\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + weight_lifting_man: { + keywords: [ "sports", "training", "exercise" ], + char: "\ud83c\udfcb", + fitzpatrick_scale: true, + category: "activity" + }, + biking_woman: { + keywords: [ "sports", "bike", "exercise", "hipster", "woman", "female" ], + char: "\ud83d\udeb4\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + biking_man: { + keywords: [ "sports", "bike", "exercise", "hipster" ], + char: "\ud83d\udeb4", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_woman: { + keywords: [ "transportation", "sports", "human", "race", "bike", "woman", "female" ], + char: "\ud83d\udeb5\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + mountain_biking_man: { + keywords: [ "transportation", "sports", "human", "race", "bike" ], + char: "\ud83d\udeb5", + fitzpatrick_scale: true, + category: "activity" + }, + horse_racing: { + keywords: [ "animal", "betting", "competition", "gambling", "luck" ], + char: "\ud83c\udfc7", + fitzpatrick_scale: true, + category: "activity" + }, + business_suit_levitating: { + keywords: [ "suit", "business", "levitate", "hover", "jump" ], + char: "\ud83d\udd74", + fitzpatrick_scale: true, + category: "activity" + }, + trophy: { + keywords: [ "win", "award", "contest", "place", "ftw", "ceremony" ], + char: "\ud83c\udfc6", + fitzpatrick_scale: false, + category: "activity" + }, + running_shirt_with_sash: { + keywords: [ "play", "pageant" ], + char: "\ud83c\udfbd", + fitzpatrick_scale: false, + category: "activity" + }, + medal_sports: { + keywords: [ "award", "winning" ], + char: "\ud83c\udfc5", + fitzpatrick_scale: false, + category: "activity" + }, + medal_military: { + keywords: [ "award", "winning", "army" ], + char: "\ud83c\udf96", + fitzpatrick_scale: false, + category: "activity" + }, + "1st_place_medal": { + keywords: [ "award", "winning", "first" ], + char: "\ud83e\udd47", + fitzpatrick_scale: false, + category: "activity" + }, + "2nd_place_medal": { + keywords: [ "award", "second" ], + char: "\ud83e\udd48", + fitzpatrick_scale: false, + category: "activity" + }, + "3rd_place_medal": { + keywords: [ "award", "third" ], + char: "\ud83e\udd49", + fitzpatrick_scale: false, + category: "activity" + }, + reminder_ribbon: { + keywords: [ "sports", "cause", "support", "awareness" ], + char: "\ud83c\udf97", + fitzpatrick_scale: false, + category: "activity" + }, + rosette: { + keywords: [ "flower", "decoration", "military" ], + char: "\ud83c\udff5", + fitzpatrick_scale: false, + category: "activity" + }, + ticket: { + keywords: [ "event", "concert", "pass" ], + char: "\ud83c\udfab", + fitzpatrick_scale: false, + category: "activity" + }, + tickets: { + keywords: [ "sports", "concert", "entrance" ], + char: "\ud83c\udf9f", + fitzpatrick_scale: false, + category: "activity" + }, + performing_arts: { + keywords: [ "acting", "theater", "drama" ], + char: "\ud83c\udfad", + fitzpatrick_scale: false, + category: "activity" + }, + art: { + keywords: [ "design", "paint", "draw", "colors" ], + char: "\ud83c\udfa8", + fitzpatrick_scale: false, + category: "activity" + }, + circus_tent: { + keywords: [ "festival", "carnival", "party" ], + char: "\ud83c\udfaa", + fitzpatrick_scale: false, + category: "activity" + }, + woman_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: "\ud83e\udd39\u200d\u2640\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + man_juggling: { + keywords: [ "juggle", "balance", "skill", "multitask" ], + char: "\ud83e\udd39\u200d\u2642\ufe0f", + fitzpatrick_scale: true, + category: "activity" + }, + microphone: { + keywords: [ "sound", "music", "PA", "sing", "talkshow" ], + char: "\ud83c\udfa4", + fitzpatrick_scale: false, + category: "activity" + }, + headphones: { + keywords: [ "music", "score", "gadgets" ], + char: "\ud83c\udfa7", + fitzpatrick_scale: false, + category: "activity" + }, + musical_score: { + keywords: [ "treble", "clef", "compose" ], + char: "\ud83c\udfbc", + fitzpatrick_scale: false, + category: "activity" + }, + musical_keyboard: { + keywords: [ "piano", "instrument", "compose" ], + char: "\ud83c\udfb9", + fitzpatrick_scale: false, + category: "activity" + }, + drum: { + keywords: [ "music", "instrument", "drumsticks", "snare" ], + char: "\ud83e\udd41", + fitzpatrick_scale: false, + category: "activity" + }, + saxophone: { + keywords: [ "music", "instrument", "jazz", "blues" ], + char: "\ud83c\udfb7", + fitzpatrick_scale: false, + category: "activity" + }, + trumpet: { + keywords: [ "music", "brass" ], + char: "\ud83c\udfba", + fitzpatrick_scale: false, + category: "activity" + }, + guitar: { + keywords: [ "music", "instrument" ], + char: "\ud83c\udfb8", + fitzpatrick_scale: false, + category: "activity" + }, + violin: { + keywords: [ "music", "instrument", "orchestra", "symphony" ], + char: "\ud83c\udfbb", + fitzpatrick_scale: false, + category: "activity" + }, + clapper: { + keywords: [ "movie", "film", "record" ], + char: "\ud83c\udfac", + fitzpatrick_scale: false, + category: "activity" + }, + video_game: { + keywords: [ "play", "console", "PS4", "controller" ], + char: "\ud83c\udfae", + fitzpatrick_scale: false, + category: "activity" + }, + space_invader: { + keywords: [ "game", "arcade", "play" ], + char: "\ud83d\udc7e", + fitzpatrick_scale: false, + category: "activity" + }, + dart: { + keywords: [ "game", "play", "bar", "target", "bullseye" ], + char: "\ud83c\udfaf", + fitzpatrick_scale: false, + category: "activity" + }, + game_die: { + keywords: [ "dice", "random", "tabletop", "play", "luck" ], + char: "\ud83c\udfb2", + fitzpatrick_scale: false, + category: "activity" + }, + chess_pawn: { + keywords: [ "expendable" ], + char: "\u265f", + fitzpatrick_scale: false, + category: "activity" + }, + slot_machine: { + keywords: [ "bet", "gamble", "vegas", "fruit machine", "luck", "casino" ], + char: "\ud83c\udfb0", + fitzpatrick_scale: false, + category: "activity" + }, + jigsaw: { + keywords: [ "interlocking", "puzzle", "piece" ], + char: "\ud83e\udde9", + fitzpatrick_scale: false, + category: "activity" + }, + bowling: { + keywords: [ "sports", "fun", "play" ], + char: "\ud83c\udfb3", + fitzpatrick_scale: false, + category: "activity" + }, + red_car: { + keywords: [ "red", "transportation", "vehicle" ], + char: "\ud83d\ude97", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + taxi: { + keywords: [ "uber", "vehicle", "cars", "transportation" ], + char: "\ud83d\ude95", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + blue_car: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude99", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bus: { + keywords: [ "car", "vehicle", "transportation" ], + char: "\ud83d\ude8c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + trolleybus: { + keywords: [ "bart", "transportation", "vehicle" ], + char: "\ud83d\ude8e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + racing_car: { + keywords: [ "sports", "race", "fast", "formula", "f1" ], + char: "\ud83c\udfce", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + police_car: { + keywords: [ "vehicle", "cars", "transportation", "law", "legal", "enforcement" ], + char: "\ud83d\ude93", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ambulance: { + keywords: [ "health", "911", "hospital" ], + char: "\ud83d\ude91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fire_engine: { + keywords: [ "transportation", "cars", "vehicle" ], + char: "\ud83d\ude92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + minibus: { + keywords: [ "vehicle", "car", "transportation" ], + char: "\ud83d\ude90", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + truck: { + keywords: [ "cars", "transportation" ], + char: "\ud83d\ude9a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + articulated_lorry: { + keywords: [ "vehicle", "cars", "transportation", "express" ], + char: "\ud83d\ude9b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tractor: { + keywords: [ "vehicle", "car", "farming", "agriculture" ], + char: "\ud83d\ude9c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kick_scooter: { + keywords: [ "vehicle", "kick", "razor" ], + char: "\ud83d\udef4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorcycle: { + keywords: [ "race", "sports", "fast" ], + char: "\ud83c\udfcd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bike: { + keywords: [ "sports", "bicycle", "exercise", "hipster" ], + char: "\ud83d\udeb2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_scooter: { + keywords: [ "vehicle", "vespa", "sasha" ], + char: "\ud83d\udef5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rotating_light: { + keywords: [ "police", "ambulance", "911", "emergency", "alert", "error", "pinged", "law", "legal" ], + char: "\ud83d\udea8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_police_car: { + keywords: [ "vehicle", "law", "legal", "enforcement", "911" ], + char: "\ud83d\ude94", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_bus: { + keywords: [ "vehicle", "transportation" ], + char: "\ud83d\ude8d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_automobile: { + keywords: [ "car", "vehicle", "transportation" ], + char: "\ud83d\ude98", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + oncoming_taxi: { + keywords: [ "vehicle", "cars", "uber" ], + char: "\ud83d\ude96", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + aerial_tramway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: "\ud83d\udea1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_cableway: { + keywords: [ "transportation", "vehicle", "ski" ], + char: "\ud83d\udea0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + suspension_railway: { + keywords: [ "vehicle", "transportation" ], + char: "\ud83d\ude9f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_car: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude83", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train: { + keywords: [ "transportation", "vehicle", "carriage", "public", "travel" ], + char: "\ud83d\ude8b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + monorail: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude9d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_side: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude84", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bullettrain_front: { + keywords: [ "transportation", "vehicle", "speed", "fast", "public", "travel" ], + char: "\ud83d\ude85", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + light_rail: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude88", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_railway: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude9e", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + steam_locomotive: { + keywords: [ "transportation", "vehicle", "train" ], + char: "\ud83d\ude82", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + train2: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + metro: { + keywords: [ "transportation", "blue-square", "mrt", "underground", "tube" ], + char: "\ud83d\ude87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tram: { + keywords: [ "transportation", "vehicle" ], + char: "\ud83d\ude8a", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + station: { + keywords: [ "transportation", "vehicle", "public" ], + char: "\ud83d\ude89", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flying_saucer: { + keywords: [ "transportation", "vehicle", "ufo" ], + char: "\ud83d\udef8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + helicopter: { + keywords: [ "transportation", "vehicle", "fly" ], + char: "\ud83d\ude81", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + small_airplane: { + keywords: [ "flight", "transportation", "fly", "vehicle" ], + char: "\ud83d\udee9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + airplane: { + keywords: [ "vehicle", "transportation", "flight", "fly" ], + char: "\u2708\ufe0f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_departure: { + keywords: [ "airport", "flight", "landing" ], + char: "\ud83d\udeeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + flight_arrival: { + keywords: [ "airport", "flight", "boarding" ], + char: "\ud83d\udeec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sailboat: { + keywords: [ "ship", "summer", "transportation", "water", "sailing" ], + char: "\u26f5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motor_boat: { + keywords: [ "ship" ], + char: "\ud83d\udee5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + speedboat: { + keywords: [ "ship", "transportation", "vehicle", "summer" ], + char: "\ud83d\udea4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferry: { + keywords: [ "boat", "ship", "yacht" ], + char: "\u26f4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + passenger_ship: { + keywords: [ "yacht", "cruise", "ferry" ], + char: "\ud83d\udef3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rocket: { + keywords: [ "launch", "ship", "staffmode", "NASA", "outer space", "outer_space", "fly" ], + char: "\ud83d\ude80", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + artificial_satellite: { + keywords: [ "communication", "gps", "orbit", "spaceflight", "NASA", "ISS" ], + char: "\ud83d\udef0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + seat: { + keywords: [ "sit", "airplane", "transport", "bus", "flight", "fly" ], + char: "\ud83d\udcba", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + canoe: { + keywords: [ "boat", "paddle", "water", "ship" ], + char: "\ud83d\udef6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + anchor: { + keywords: [ "ship", "ferry", "sea", "boat" ], + char: "\u2693", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + construction: { + keywords: [ "wip", "progress", "caution", "warning" ], + char: "\ud83d\udea7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fuelpump: { + keywords: [ "gas station", "petroleum" ], + char: "\u26fd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + busstop: { + keywords: [ "transportation", "wait" ], + char: "\ud83d\ude8f", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + vertical_traffic_light: { + keywords: [ "transportation", "driving" ], + char: "\ud83d\udea6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + traffic_light: { + keywords: [ "transportation", "signal" ], + char: "\ud83d\udea5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + checkered_flag: { + keywords: [ "contest", "finishline", "race", "gokart" ], + char: "\ud83c\udfc1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ship: { + keywords: [ "transportation", "titanic", "deploy" ], + char: "\ud83d\udea2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + ferris_wheel: { + keywords: [ "photo", "carnival", "londoneye" ], + char: "\ud83c\udfa1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + roller_coaster: { + keywords: [ "carnival", "playground", "photo", "fun" ], + char: "\ud83c\udfa2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + carousel_horse: { + keywords: [ "photo", "carnival" ], + char: "\ud83c\udfa0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + building_construction: { + keywords: [ "wip", "working", "progress" ], + char: "\ud83c\udfd7", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + foggy: { + keywords: [ "photo", "mountain" ], + char: "\ud83c\udf01", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tokyo_tower: { + keywords: [ "photo", "japanese" ], + char: "\ud83d\uddfc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + factory: { + keywords: [ "building", "industry", "pollution", "smoke" ], + char: "\ud83c\udfed", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fountain: { + keywords: [ "photo", "summer", "water", "fresh" ], + char: "\u26f2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rice_scene: { + keywords: [ "photo", "japan", "asia", "tsukimi" ], + char: "\ud83c\udf91", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain: { + keywords: [ "photo", "nature", "environment" ], + char: "\u26f0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mountain_snow: { + keywords: [ "photo", "nature", "environment", "winter", "cold" ], + char: "\ud83c\udfd4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mount_fuji: { + keywords: [ "photo", "mountain", "nature", "japanese" ], + char: "\ud83d\uddfb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + volcano: { + keywords: [ "photo", "nature", "disaster" ], + char: "\ud83c\udf0b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japan: { + keywords: [ "nation", "country", "japanese", "asia" ], + char: "\ud83d\uddfe", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + camping: { + keywords: [ "photo", "outdoors", "tent" ], + char: "\ud83c\udfd5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + tent: { + keywords: [ "photo", "camping", "outdoors" ], + char: "\u26fa", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + national_park: { + keywords: [ "photo", "environment", "nature" ], + char: "\ud83c\udfde", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + motorway: { + keywords: [ "road", "cupertino", "interstate", "highway" ], + char: "\ud83d\udee3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + railway_track: { + keywords: [ "train", "transportation" ], + char: "\ud83d\udee4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise: { + keywords: [ "morning", "view", "vacation", "photo" ], + char: "\ud83c\udf05", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sunrise_over_mountains: { + keywords: [ "view", "vacation", "photo" ], + char: "\ud83c\udf04", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert: { + keywords: [ "photo", "warm", "saharah" ], + char: "\ud83c\udfdc", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + beach_umbrella: { + keywords: [ "weather", "summer", "sunny", "sand", "mojito" ], + char: "\ud83c\udfd6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + desert_island: { + keywords: [ "photo", "tropical", "mojito" ], + char: "\ud83c\udfdd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunrise: { + keywords: [ "photo", "good morning", "dawn" ], + char: "\ud83c\udf07", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + city_sunset: { + keywords: [ "photo", "evening", "sky", "buildings" ], + char: "\ud83c\udf06", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + cityscape: { + keywords: [ "photo", "night life", "urban" ], + char: "\ud83c\udfd9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + night_with_stars: { + keywords: [ "evening", "city", "downtown" ], + char: "\ud83c\udf03", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bridge_at_night: { + keywords: [ "photo", "sanfrancisco" ], + char: "\ud83c\udf09", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + milky_way: { + keywords: [ "photo", "space", "stars" ], + char: "\ud83c\udf0c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stars: { + keywords: [ "night", "photo" ], + char: "\ud83c\udf20", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + sparkler: { + keywords: [ "stars", "night", "shine" ], + char: "\ud83c\udf87", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + fireworks: { + keywords: [ "photo", "festival", "carnival", "congratulations" ], + char: "\ud83c\udf86", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + rainbow: { + keywords: [ "nature", "happy", "unicorn_face", "photo", "sky", "spring" ], + char: "\ud83c\udf08", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + houses: { + keywords: [ "buildings", "photo" ], + char: "\ud83c\udfd8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_castle: { + keywords: [ "building", "royalty", "history" ], + char: "\ud83c\udff0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + japanese_castle: { + keywords: [ "photo", "building" ], + char: "\ud83c\udfef", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + stadium: { + keywords: [ "photo", "place", "sports", "concert", "venue" ], + char: "\ud83c\udfdf", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + statue_of_liberty: { + keywords: [ "american", "newyork" ], + char: "\ud83d\uddfd", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house: { + keywords: [ "building", "home" ], + char: "\ud83c\udfe0", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + house_with_garden: { + keywords: [ "home", "plant", "nature" ], + char: "\ud83c\udfe1", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + derelict_house: { + keywords: [ "abandon", "evict", "broken", "building" ], + char: "\ud83c\udfda", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + office: { + keywords: [ "building", "bureau", "work" ], + char: "\ud83c\udfe2", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + department_store: { + keywords: [ "building", "shopping", "mall" ], + char: "\ud83c\udfec", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + post_office: { + keywords: [ "building", "envelope", "communication" ], + char: "\ud83c\udfe3", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + european_post_office: { + keywords: [ "building", "email" ], + char: "\ud83c\udfe4", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hospital: { + keywords: [ "building", "health", "surgery", "doctor" ], + char: "\ud83c\udfe5", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + bank: { + keywords: [ "building", "money", "sales", "cash", "business", "enterprise" ], + char: "\ud83c\udfe6", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + hotel: { + keywords: [ "building", "accomodation", "checkin" ], + char: "\ud83c\udfe8", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + convenience_store: { + keywords: [ "building", "shopping", "groceries" ], + char: "\ud83c\udfea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + school: { + keywords: [ "building", "student", "education", "learn", "teach" ], + char: "\ud83c\udfeb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + love_hotel: { + keywords: [ "like", "affection", "dating" ], + char: "\ud83c\udfe9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + wedding: { + keywords: [ "love", "like", "affection", "couple", "marriage", "bride", "groom" ], + char: "\ud83d\udc92", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + classical_building: { + keywords: [ "art", "culture", "history" ], + char: "\ud83c\udfdb", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + church: { + keywords: [ "building", "religion", "christ" ], + char: "\u26ea", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + mosque: { + keywords: [ "islam", "worship", "minaret" ], + char: "\ud83d\udd4c", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + synagogue: { + keywords: [ "judaism", "worship", "temple", "jewish" ], + char: "\ud83d\udd4d", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + kaaba: { + keywords: [ "mecca", "mosque", "islam" ], + char: "\ud83d\udd4b", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + shinto_shrine: { + keywords: [ "temple", "japan", "kyoto" ], + char: "\u26e9", + fitzpatrick_scale: false, + category: "travel_and_places" + }, + watch: { + keywords: [ "time", "accessories" ], + char: "\u231a", + fitzpatrick_scale: false, + category: "objects" + }, + iphone: { + keywords: [ "technology", "apple", "gadgets", "dial" ], + char: "\ud83d\udcf1", + fitzpatrick_scale: false, + category: "objects" + }, + calling: { + keywords: [ "iphone", "incoming" ], + char: "\ud83d\udcf2", + fitzpatrick_scale: false, + category: "objects" + }, + computer: { + keywords: [ "technology", "laptop", "screen", "display", "monitor" ], + char: "\ud83d\udcbb", + fitzpatrick_scale: false, + category: "objects" + }, + keyboard: { + keywords: [ "technology", "computer", "type", "input", "text" ], + char: "\u2328", + fitzpatrick_scale: false, + category: "objects" + }, + desktop_computer: { + keywords: [ "technology", "computing", "screen" ], + char: "\ud83d\udda5", + fitzpatrick_scale: false, + category: "objects" + }, + printer: { + keywords: [ "paper", "ink" ], + char: "\ud83d\udda8", + fitzpatrick_scale: false, + category: "objects" + }, + computer_mouse: { + keywords: [ "click" ], + char: "\ud83d\uddb1", + fitzpatrick_scale: false, + category: "objects" + }, + trackball: { + keywords: [ "technology", "trackpad" ], + char: "\ud83d\uddb2", + fitzpatrick_scale: false, + category: "objects" + }, + joystick: { + keywords: [ "game", "play" ], + char: "\ud83d\udd79", + fitzpatrick_scale: false, + category: "objects" + }, + clamp: { + keywords: [ "tool" ], + char: "\ud83d\udddc", + fitzpatrick_scale: false, + category: "objects" + }, + minidisc: { + keywords: [ "technology", "record", "data", "disk", "90s" ], + char: "\ud83d\udcbd", + fitzpatrick_scale: false, + category: "objects" + }, + floppy_disk: { + keywords: [ "oldschool", "technology", "save", "90s", "80s" ], + char: "\ud83d\udcbe", + fitzpatrick_scale: false, + category: "objects" + }, + cd: { + keywords: [ "technology", "dvd", "disk", "disc", "90s" ], + char: "\ud83d\udcbf", + fitzpatrick_scale: false, + category: "objects" + }, + dvd: { + keywords: [ "cd", "disk", "disc" ], + char: "\ud83d\udcc0", + fitzpatrick_scale: false, + category: "objects" + }, + vhs: { + keywords: [ "record", "video", "oldschool", "90s", "80s" ], + char: "\ud83d\udcfc", + fitzpatrick_scale: false, + category: "objects" + }, + camera: { + keywords: [ "gadgets", "photography" ], + char: "\ud83d\udcf7", + fitzpatrick_scale: false, + category: "objects" + }, + camera_flash: { + keywords: [ "photography", "gadgets" ], + char: "\ud83d\udcf8", + fitzpatrick_scale: false, + category: "objects" + }, + video_camera: { + keywords: [ "film", "record" ], + char: "\ud83d\udcf9", + fitzpatrick_scale: false, + category: "objects" + }, + movie_camera: { + keywords: [ "film", "record" ], + char: "\ud83c\udfa5", + fitzpatrick_scale: false, + category: "objects" + }, + film_projector: { + keywords: [ "video", "tape", "record", "movie" ], + char: "\ud83d\udcfd", + fitzpatrick_scale: false, + category: "objects" + }, + film_strip: { + keywords: [ "movie" ], + char: "\ud83c\udf9e", + fitzpatrick_scale: false, + category: "objects" + }, + telephone_receiver: { + keywords: [ "technology", "communication", "dial" ], + char: "\ud83d\udcde", + fitzpatrick_scale: false, + category: "objects" + }, + phone: { + keywords: [ "technology", "communication", "dial", "telephone" ], + char: "\u260e\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + pager: { + keywords: [ "bbcall", "oldschool", "90s" ], + char: "\ud83d\udcdf", + fitzpatrick_scale: false, + category: "objects" + }, + fax: { + keywords: [ "communication", "technology" ], + char: "\ud83d\udce0", + fitzpatrick_scale: false, + category: "objects" + }, + tv: { + keywords: [ "technology", "program", "oldschool", "show", "television" ], + char: "\ud83d\udcfa", + fitzpatrick_scale: false, + category: "objects" + }, + radio: { + keywords: [ "communication", "music", "podcast", "program" ], + char: "\ud83d\udcfb", + fitzpatrick_scale: false, + category: "objects" + }, + studio_microphone: { + keywords: [ "sing", "recording", "artist", "talkshow" ], + char: "\ud83c\udf99", + fitzpatrick_scale: false, + category: "objects" + }, + level_slider: { + keywords: [ "scale" ], + char: "\ud83c\udf9a", + fitzpatrick_scale: false, + category: "objects" + }, + control_knobs: { + keywords: [ "dial" ], + char: "\ud83c\udf9b", + fitzpatrick_scale: false, + category: "objects" + }, + compass: { + keywords: [ "magnetic", "navigation", "orienteering" ], + char: "\ud83e\udded", + fitzpatrick_scale: false, + category: "objects" + }, + stopwatch: { + keywords: [ "time", "deadline" ], + char: "\u23f1", + fitzpatrick_scale: false, + category: "objects" + }, + timer_clock: { + keywords: [ "alarm" ], + char: "\u23f2", + fitzpatrick_scale: false, + category: "objects" + }, + alarm_clock: { + keywords: [ "time", "wake" ], + char: "\u23f0", + fitzpatrick_scale: false, + category: "objects" + }, + mantelpiece_clock: { + keywords: [ "time" ], + char: "\ud83d\udd70", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass_flowing_sand: { + keywords: [ "oldschool", "time", "countdown" ], + char: "\u23f3", + fitzpatrick_scale: false, + category: "objects" + }, + hourglass: { + keywords: [ "time", "clock", "oldschool", "limit", "exam", "quiz", "test" ], + char: "\u231b", + fitzpatrick_scale: false, + category: "objects" + }, + satellite: { + keywords: [ "communication", "future", "radio", "space" ], + char: "\ud83d\udce1", + fitzpatrick_scale: false, + category: "objects" + }, + battery: { + keywords: [ "power", "energy", "sustain" ], + char: "\ud83d\udd0b", + fitzpatrick_scale: false, + category: "objects" + }, + electric_plug: { + keywords: [ "charger", "power" ], + char: "\ud83d\udd0c", + fitzpatrick_scale: false, + category: "objects" + }, + bulb: { + keywords: [ "light", "electricity", "idea" ], + char: "\ud83d\udca1", + fitzpatrick_scale: false, + category: "objects" + }, + flashlight: { + keywords: [ "dark", "camping", "sight", "night" ], + char: "\ud83d\udd26", + fitzpatrick_scale: false, + category: "objects" + }, + candle: { + keywords: [ "fire", "wax" ], + char: "\ud83d\udd6f", + fitzpatrick_scale: false, + category: "objects" + }, + fire_extinguisher: { + keywords: [ "quench" ], + char: "\ud83e\uddef", + fitzpatrick_scale: false, + category: "objects" + }, + wastebasket: { + keywords: [ "bin", "trash", "rubbish", "garbage", "toss" ], + char: "\ud83d\uddd1", + fitzpatrick_scale: false, + category: "objects" + }, + oil_drum: { + keywords: [ "barrell" ], + char: "\ud83d\udee2", + fitzpatrick_scale: false, + category: "objects" + }, + money_with_wings: { + keywords: [ "dollar", "bills", "payment", "sale" ], + char: "\ud83d\udcb8", + fitzpatrick_scale: false, + category: "objects" + }, + dollar: { + keywords: [ "money", "sales", "bill", "currency" ], + char: "\ud83d\udcb5", + fitzpatrick_scale: false, + category: "objects" + }, + yen: { + keywords: [ "money", "sales", "japanese", "dollar", "currency" ], + char: "\ud83d\udcb4", + fitzpatrick_scale: false, + category: "objects" + }, + euro: { + keywords: [ "money", "sales", "dollar", "currency" ], + char: "\ud83d\udcb6", + fitzpatrick_scale: false, + category: "objects" + }, + pound: { + keywords: [ "british", "sterling", "money", "sales", "bills", "uk", "england", "currency" ], + char: "\ud83d\udcb7", + fitzpatrick_scale: false, + category: "objects" + }, + moneybag: { + keywords: [ "dollar", "payment", "coins", "sale" ], + char: "\ud83d\udcb0", + fitzpatrick_scale: false, + category: "objects" + }, + credit_card: { + keywords: [ "money", "sales", "dollar", "bill", "payment", "shopping" ], + char: "\ud83d\udcb3", + fitzpatrick_scale: false, + category: "objects" + }, + gem: { + keywords: [ "blue", "ruby", "diamond", "jewelry" ], + char: "\ud83d\udc8e", + fitzpatrick_scale: false, + category: "objects" + }, + balance_scale: { + keywords: [ "law", "fairness", "weight" ], + char: "\u2696", + fitzpatrick_scale: false, + category: "objects" + }, + toolbox: { + keywords: [ "tools", "diy", "fix", "maintainer", "mechanic" ], + char: "\ud83e\uddf0", + fitzpatrick_scale: false, + category: "objects" + }, + wrench: { + keywords: [ "tools", "diy", "ikea", "fix", "maintainer" ], + char: "\ud83d\udd27", + fitzpatrick_scale: false, + category: "objects" + }, + hammer: { + keywords: [ "tools", "build", "create" ], + char: "\ud83d\udd28", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_pick: { + keywords: [ "tools", "build", "create" ], + char: "\u2692", + fitzpatrick_scale: false, + category: "objects" + }, + hammer_and_wrench: { + keywords: [ "tools", "build", "create" ], + char: "\ud83d\udee0", + fitzpatrick_scale: false, + category: "objects" + }, + pick: { + keywords: [ "tools", "dig" ], + char: "\u26cf", + fitzpatrick_scale: false, + category: "objects" + }, + nut_and_bolt: { + keywords: [ "handy", "tools", "fix" ], + char: "\ud83d\udd29", + fitzpatrick_scale: false, + category: "objects" + }, + gear: { + keywords: [ "cog" ], + char: "\u2699", + fitzpatrick_scale: false, + category: "objects" + }, + brick: { + keywords: [ "bricks" ], + char: "\ud83e\uddf1", + fitzpatrick_scale: false, + category: "objects" + }, + chains: { + keywords: [ "lock", "arrest" ], + char: "\u26d3", + fitzpatrick_scale: false, + category: "objects" + }, + magnet: { + keywords: [ "attraction", "magnetic" ], + char: "\ud83e\uddf2", + fitzpatrick_scale: false, + category: "objects" + }, + gun: { + keywords: [ "violence", "weapon", "pistol", "revolver" ], + char: "\ud83d\udd2b", + fitzpatrick_scale: false, + category: "objects" + }, + bomb: { + keywords: [ "boom", "explode", "explosion", "terrorism" ], + char: "\ud83d\udca3", + fitzpatrick_scale: false, + category: "objects" + }, + firecracker: { + keywords: [ "dynamite", "boom", "explode", "explosion", "explosive" ], + char: "\ud83e\udde8", + fitzpatrick_scale: false, + category: "objects" + }, + hocho: { + keywords: [ "knife", "blade", "cutlery", "kitchen", "weapon" ], + char: "\ud83d\udd2a", + fitzpatrick_scale: false, + category: "objects" + }, + dagger: { + keywords: [ "weapon" ], + char: "\ud83d\udde1", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_swords: { + keywords: [ "weapon" ], + char: "\u2694", + fitzpatrick_scale: false, + category: "objects" + }, + shield: { + keywords: [ "protection", "security" ], + char: "\ud83d\udee1", + fitzpatrick_scale: false, + category: "objects" + }, + smoking: { + keywords: [ "kills", "tobacco", "cigarette", "joint", "smoke" ], + char: "\ud83d\udeac", + fitzpatrick_scale: false, + category: "objects" + }, + skull_and_crossbones: { + keywords: [ "poison", "danger", "deadly", "scary", "death", "pirate", "evil" ], + char: "\u2620", + fitzpatrick_scale: false, + category: "objects" + }, + coffin: { + keywords: [ "vampire", "dead", "die", "death", "rip", "graveyard", "cemetery", "casket", "funeral", "box" ], + char: "\u26b0", + fitzpatrick_scale: false, + category: "objects" + }, + funeral_urn: { + keywords: [ "dead", "die", "death", "rip", "ashes" ], + char: "\u26b1", + fitzpatrick_scale: false, + category: "objects" + }, + amphora: { + keywords: [ "vase", "jar" ], + char: "\ud83c\udffa", + fitzpatrick_scale: false, + category: "objects" + }, + crystal_ball: { + keywords: [ "disco", "party", "magic", "circus", "fortune_teller" ], + char: "\ud83d\udd2e", + fitzpatrick_scale: false, + category: "objects" + }, + prayer_beads: { + keywords: [ "dhikr", "religious" ], + char: "\ud83d\udcff", + fitzpatrick_scale: false, + category: "objects" + }, + nazar_amulet: { + keywords: [ "bead", "charm" ], + char: "\ud83e\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + barber: { + keywords: [ "hair", "salon", "style" ], + char: "\ud83d\udc88", + fitzpatrick_scale: false, + category: "objects" + }, + alembic: { + keywords: [ "distilling", "science", "experiment", "chemistry" ], + char: "\u2697", + fitzpatrick_scale: false, + category: "objects" + }, + telescope: { + keywords: [ "stars", "space", "zoom", "science", "astronomy" ], + char: "\ud83d\udd2d", + fitzpatrick_scale: false, + category: "objects" + }, + microscope: { + keywords: [ "laboratory", "experiment", "zoomin", "science", "study" ], + char: "\ud83d\udd2c", + fitzpatrick_scale: false, + category: "objects" + }, + hole: { + keywords: [ "embarrassing" ], + char: "\ud83d\udd73", + fitzpatrick_scale: false, + category: "objects" + }, + pill: { + keywords: [ "health", "medicine", "doctor", "pharmacy", "drug" ], + char: "\ud83d\udc8a", + fitzpatrick_scale: false, + category: "objects" + }, + syringe: { + keywords: [ "health", "hospital", "drugs", "blood", "medicine", "needle", "doctor", "nurse" ], + char: "\ud83d\udc89", + fitzpatrick_scale: false, + category: "objects" + }, + dna: { + keywords: [ "biologist", "genetics", "life" ], + char: "\ud83e\uddec", + fitzpatrick_scale: false, + category: "objects" + }, + microbe: { + keywords: [ "amoeba", "bacteria", "germs" ], + char: "\ud83e\udda0", + fitzpatrick_scale: false, + category: "objects" + }, + petri_dish: { + keywords: [ "bacteria", "biology", "culture", "lab" ], + char: "\ud83e\uddeb", + fitzpatrick_scale: false, + category: "objects" + }, + test_tube: { + keywords: [ "chemistry", "experiment", "lab", "science" ], + char: "\ud83e\uddea", + fitzpatrick_scale: false, + category: "objects" + }, + thermometer: { + keywords: [ "weather", "temperature", "hot", "cold" ], + char: "\ud83c\udf21", + fitzpatrick_scale: false, + category: "objects" + }, + broom: { + keywords: [ "cleaning", "sweeping", "witch" ], + char: "\ud83e\uddf9", + fitzpatrick_scale: false, + category: "objects" + }, + basket: { + keywords: [ "laundry" ], + char: "\ud83e\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + toilet_paper: { + keywords: [ "roll" ], + char: "\ud83e\uddfb", + fitzpatrick_scale: false, + category: "objects" + }, + label: { + keywords: [ "sale", "tag" ], + char: "\ud83c\udff7", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark: { + keywords: [ "favorite", "label", "save" ], + char: "\ud83d\udd16", + fitzpatrick_scale: false, + category: "objects" + }, + toilet: { + keywords: [ "restroom", "wc", "washroom", "bathroom", "potty" ], + char: "\ud83d\udebd", + fitzpatrick_scale: false, + category: "objects" + }, + shower: { + keywords: [ "clean", "water", "bathroom" ], + char: "\ud83d\udebf", + fitzpatrick_scale: false, + category: "objects" + }, + bathtub: { + keywords: [ "clean", "shower", "bathroom" ], + char: "\ud83d\udec1", + fitzpatrick_scale: false, + category: "objects" + }, + soap: { + keywords: [ "bar", "bathing", "cleaning", "lather" ], + char: "\ud83e\uddfc", + fitzpatrick_scale: false, + category: "objects" + }, + sponge: { + keywords: [ "absorbing", "cleaning", "porous" ], + char: "\ud83e\uddfd", + fitzpatrick_scale: false, + category: "objects" + }, + lotion_bottle: { + keywords: [ "moisturizer", "sunscreen" ], + char: "\ud83e\uddf4", + fitzpatrick_scale: false, + category: "objects" + }, + key: { + keywords: [ "lock", "door", "password" ], + char: "\ud83d\udd11", + fitzpatrick_scale: false, + category: "objects" + }, + old_key: { + keywords: [ "lock", "door", "password" ], + char: "\ud83d\udddd", + fitzpatrick_scale: false, + category: "objects" + }, + couch_and_lamp: { + keywords: [ "read", "chill" ], + char: "\ud83d\udecb", + fitzpatrick_scale: false, + category: "objects" + }, + sleeping_bed: { + keywords: [ "bed", "rest" ], + char: "\ud83d\udecc", + fitzpatrick_scale: true, + category: "objects" + }, + bed: { + keywords: [ "sleep", "rest" ], + char: "\ud83d\udecf", + fitzpatrick_scale: false, + category: "objects" + }, + door: { + keywords: [ "house", "entry", "exit" ], + char: "\ud83d\udeaa", + fitzpatrick_scale: false, + category: "objects" + }, + bellhop_bell: { + keywords: [ "service" ], + char: "\ud83d\udece", + fitzpatrick_scale: false, + category: "objects" + }, + teddy_bear: { + keywords: [ "plush", "stuffed" ], + char: "\ud83e\uddf8", + fitzpatrick_scale: false, + category: "objects" + }, + framed_picture: { + keywords: [ "photography" ], + char: "\ud83d\uddbc", + fitzpatrick_scale: false, + category: "objects" + }, + world_map: { + keywords: [ "location", "direction" ], + char: "\ud83d\uddfa", + fitzpatrick_scale: false, + category: "objects" + }, + parasol_on_ground: { + keywords: [ "weather", "summer" ], + char: "\u26f1", + fitzpatrick_scale: false, + category: "objects" + }, + moyai: { + keywords: [ "rock", "easter island", "moai" ], + char: "\ud83d\uddff", + fitzpatrick_scale: false, + category: "objects" + }, + shopping: { + keywords: [ "mall", "buy", "purchase" ], + char: "\ud83d\udecd", + fitzpatrick_scale: false, + category: "objects" + }, + shopping_cart: { + keywords: [ "trolley" ], + char: "\ud83d\uded2", + fitzpatrick_scale: false, + category: "objects" + }, + balloon: { + keywords: [ "party", "celebration", "birthday", "circus" ], + char: "\ud83c\udf88", + fitzpatrick_scale: false, + category: "objects" + }, + flags: { + keywords: [ "fish", "japanese", "koinobori", "carp", "banner" ], + char: "\ud83c\udf8f", + fitzpatrick_scale: false, + category: "objects" + }, + ribbon: { + keywords: [ "decoration", "pink", "girl", "bowtie" ], + char: "\ud83c\udf80", + fitzpatrick_scale: false, + category: "objects" + }, + gift: { + keywords: [ "present", "birthday", "christmas", "xmas" ], + char: "\ud83c\udf81", + fitzpatrick_scale: false, + category: "objects" + }, + confetti_ball: { + keywords: [ "festival", "party", "birthday", "circus" ], + char: "\ud83c\udf8a", + fitzpatrick_scale: false, + category: "objects" + }, + tada: { + keywords: [ "party", "congratulations", "birthday", "magic", "circus", "celebration" ], + char: "\ud83c\udf89", + fitzpatrick_scale: false, + category: "objects" + }, + dolls: { + keywords: [ "japanese", "toy", "kimono" ], + char: "\ud83c\udf8e", + fitzpatrick_scale: false, + category: "objects" + }, + wind_chime: { + keywords: [ "nature", "ding", "spring", "bell" ], + char: "\ud83c\udf90", + fitzpatrick_scale: false, + category: "objects" + }, + crossed_flags: { + keywords: [ "japanese", "nation", "country", "border" ], + char: "\ud83c\udf8c", + fitzpatrick_scale: false, + category: "objects" + }, + izakaya_lantern: { + keywords: [ "light", "paper", "halloween", "spooky" ], + char: "\ud83c\udfee", + fitzpatrick_scale: false, + category: "objects" + }, + red_envelope: { + keywords: [ "gift" ], + char: "\ud83e\udde7", + fitzpatrick_scale: false, + category: "objects" + }, + email: { + keywords: [ "letter", "postal", "inbox", "communication" ], + char: "\u2709\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + envelope_with_arrow: { + keywords: [ "email", "communication" ], + char: "\ud83d\udce9", + fitzpatrick_scale: false, + category: "objects" + }, + incoming_envelope: { + keywords: [ "email", "inbox" ], + char: "\ud83d\udce8", + fitzpatrick_scale: false, + category: "objects" + }, + "e-mail": { + keywords: [ "communication", "inbox" ], + char: "\ud83d\udce7", + fitzpatrick_scale: false, + category: "objects" + }, + love_letter: { + keywords: [ "email", "like", "affection", "envelope", "valentines" ], + char: "\ud83d\udc8c", + fitzpatrick_scale: false, + category: "objects" + }, + postbox: { + keywords: [ "email", "letter", "envelope" ], + char: "\ud83d\udcee", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_closed: { + keywords: [ "email", "communication", "inbox" ], + char: "\ud83d\udcea", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox: { + keywords: [ "email", "inbox", "communication" ], + char: "\ud83d\udceb", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_mail: { + keywords: [ "email", "inbox", "communication" ], + char: "\ud83d\udcec", + fitzpatrick_scale: false, + category: "objects" + }, + mailbox_with_no_mail: { + keywords: [ "email", "inbox" ], + char: "\ud83d\udced", + fitzpatrick_scale: false, + category: "objects" + }, + package: { + keywords: [ "mail", "gift", "cardboard", "box", "moving" ], + char: "\ud83d\udce6", + fitzpatrick_scale: false, + category: "objects" + }, + postal_horn: { + keywords: [ "instrument", "music" ], + char: "\ud83d\udcef", + fitzpatrick_scale: false, + category: "objects" + }, + inbox_tray: { + keywords: [ "email", "documents" ], + char: "\ud83d\udce5", + fitzpatrick_scale: false, + category: "objects" + }, + outbox_tray: { + keywords: [ "inbox", "email" ], + char: "\ud83d\udce4", + fitzpatrick_scale: false, + category: "objects" + }, + scroll: { + keywords: [ "documents", "ancient", "history", "paper" ], + char: "\ud83d\udcdc", + fitzpatrick_scale: false, + category: "objects" + }, + page_with_curl: { + keywords: [ "documents", "office", "paper" ], + char: "\ud83d\udcc3", + fitzpatrick_scale: false, + category: "objects" + }, + bookmark_tabs: { + keywords: [ "favorite", "save", "order", "tidy" ], + char: "\ud83d\udcd1", + fitzpatrick_scale: false, + category: "objects" + }, + receipt: { + keywords: [ "accounting", "expenses" ], + char: "\ud83e\uddfe", + fitzpatrick_scale: false, + category: "objects" + }, + bar_chart: { + keywords: [ "graph", "presentation", "stats" ], + char: "\ud83d\udcca", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_upwards_trend: { + keywords: [ "graph", "presentation", "stats", "recovery", "business", "economics", "money", "sales", "good", "success" ], + char: "\ud83d\udcc8", + fitzpatrick_scale: false, + category: "objects" + }, + chart_with_downwards_trend: { + keywords: [ "graph", "presentation", "stats", "recession", "business", "economics", "money", "sales", "bad", "failure" ], + char: "\ud83d\udcc9", + fitzpatrick_scale: false, + category: "objects" + }, + page_facing_up: { + keywords: [ "documents", "office", "paper", "information" ], + char: "\ud83d\udcc4", + fitzpatrick_scale: false, + category: "objects" + }, + date: { + keywords: [ "calendar", "schedule" ], + char: "\ud83d\udcc5", + fitzpatrick_scale: false, + category: "objects" + }, + calendar: { + keywords: [ "schedule", "date", "planning" ], + char: "\ud83d\udcc6", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_calendar: { + keywords: [ "date", "schedule", "planning" ], + char: "\ud83d\uddd3", + fitzpatrick_scale: false, + category: "objects" + }, + card_index: { + keywords: [ "business", "stationery" ], + char: "\ud83d\udcc7", + fitzpatrick_scale: false, + category: "objects" + }, + card_file_box: { + keywords: [ "business", "stationery" ], + char: "\ud83d\uddc3", + fitzpatrick_scale: false, + category: "objects" + }, + ballot_box: { + keywords: [ "election", "vote" ], + char: "\ud83d\uddf3", + fitzpatrick_scale: false, + category: "objects" + }, + file_cabinet: { + keywords: [ "filing", "organizing" ], + char: "\ud83d\uddc4", + fitzpatrick_scale: false, + category: "objects" + }, + clipboard: { + keywords: [ "stationery", "documents" ], + char: "\ud83d\udccb", + fitzpatrick_scale: false, + category: "objects" + }, + spiral_notepad: { + keywords: [ "memo", "stationery" ], + char: "\ud83d\uddd2", + fitzpatrick_scale: false, + category: "objects" + }, + file_folder: { + keywords: [ "documents", "business", "office" ], + char: "\ud83d\udcc1", + fitzpatrick_scale: false, + category: "objects" + }, + open_file_folder: { + keywords: [ "documents", "load" ], + char: "\ud83d\udcc2", + fitzpatrick_scale: false, + category: "objects" + }, + card_index_dividers: { + keywords: [ "organizing", "business", "stationery" ], + char: "\ud83d\uddc2", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper_roll: { + keywords: [ "press", "headline" ], + char: "\ud83d\uddde", + fitzpatrick_scale: false, + category: "objects" + }, + newspaper: { + keywords: [ "press", "headline" ], + char: "\ud83d\udcf0", + fitzpatrick_scale: false, + category: "objects" + }, + notebook: { + keywords: [ "stationery", "record", "notes", "paper", "study" ], + char: "\ud83d\udcd3", + fitzpatrick_scale: false, + category: "objects" + }, + closed_book: { + keywords: [ "read", "library", "knowledge", "textbook", "learn" ], + char: "\ud83d\udcd5", + fitzpatrick_scale: false, + category: "objects" + }, + green_book: { + keywords: [ "read", "library", "knowledge", "study" ], + char: "\ud83d\udcd7", + fitzpatrick_scale: false, + category: "objects" + }, + blue_book: { + keywords: [ "read", "library", "knowledge", "learn", "study" ], + char: "\ud83d\udcd8", + fitzpatrick_scale: false, + category: "objects" + }, + orange_book: { + keywords: [ "read", "library", "knowledge", "textbook", "study" ], + char: "\ud83d\udcd9", + fitzpatrick_scale: false, + category: "objects" + }, + notebook_with_decorative_cover: { + keywords: [ "classroom", "notes", "record", "paper", "study" ], + char: "\ud83d\udcd4", + fitzpatrick_scale: false, + category: "objects" + }, + ledger: { + keywords: [ "notes", "paper" ], + char: "\ud83d\udcd2", + fitzpatrick_scale: false, + category: "objects" + }, + books: { + keywords: [ "literature", "library", "study" ], + char: "\ud83d\udcda", + fitzpatrick_scale: false, + category: "objects" + }, + open_book: { + keywords: [ "book", "read", "library", "knowledge", "literature", "learn", "study" ], + char: "\ud83d\udcd6", + fitzpatrick_scale: false, + category: "objects" + }, + safety_pin: { + keywords: [ "diaper" ], + char: "\ud83e\uddf7", + fitzpatrick_scale: false, + category: "objects" + }, + link: { + keywords: [ "rings", "url" ], + char: "\ud83d\udd17", + fitzpatrick_scale: false, + category: "objects" + }, + paperclip: { + keywords: [ "documents", "stationery" ], + char: "\ud83d\udcce", + fitzpatrick_scale: false, + category: "objects" + }, + paperclips: { + keywords: [ "documents", "stationery" ], + char: "\ud83d\udd87", + fitzpatrick_scale: false, + category: "objects" + }, + scissors: { + keywords: [ "stationery", "cut" ], + char: "\u2702\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_ruler: { + keywords: [ "stationery", "math", "architect", "sketch" ], + char: "\ud83d\udcd0", + fitzpatrick_scale: false, + category: "objects" + }, + straight_ruler: { + keywords: [ "stationery", "calculate", "length", "math", "school", "drawing", "architect", "sketch" ], + char: "\ud83d\udccf", + fitzpatrick_scale: false, + category: "objects" + }, + abacus: { + keywords: [ "calculation" ], + char: "\ud83e\uddee", + fitzpatrick_scale: false, + category: "objects" + }, + pushpin: { + keywords: [ "stationery", "mark", "here" ], + char: "\ud83d\udccc", + fitzpatrick_scale: false, + category: "objects" + }, + round_pushpin: { + keywords: [ "stationery", "location", "map", "here" ], + char: "\ud83d\udccd", + fitzpatrick_scale: false, + category: "objects" + }, + triangular_flag_on_post: { + keywords: [ "mark", "milestone", "place" ], + char: "\ud83d\udea9", + fitzpatrick_scale: false, + category: "objects" + }, + white_flag: { + keywords: [ "losing", "loser", "lost", "surrender", "give up", "fail" ], + char: "\ud83c\udff3", + fitzpatrick_scale: false, + category: "objects" + }, + black_flag: { + keywords: [ "pirate" ], + char: "\ud83c\udff4", + fitzpatrick_scale: false, + category: "objects" + }, + rainbow_flag: { + keywords: [ "flag", "rainbow", "pride", "gay", "lgbt", "glbt", "queer", "homosexual", "lesbian", "bisexual", "transgender" ], + char: "\ud83c\udff3\ufe0f\u200d\ud83c\udf08", + fitzpatrick_scale: false, + category: "objects" + }, + closed_lock_with_key: { + keywords: [ "security", "privacy" ], + char: "\ud83d\udd10", + fitzpatrick_scale: false, + category: "objects" + }, + lock: { + keywords: [ "security", "password", "padlock" ], + char: "\ud83d\udd12", + fitzpatrick_scale: false, + category: "objects" + }, + unlock: { + keywords: [ "privacy", "security" ], + char: "\ud83d\udd13", + fitzpatrick_scale: false, + category: "objects" + }, + lock_with_ink_pen: { + keywords: [ "security", "secret" ], + char: "\ud83d\udd0f", + fitzpatrick_scale: false, + category: "objects" + }, + pen: { + keywords: [ "stationery", "writing", "write" ], + char: "\ud83d\udd8a", + fitzpatrick_scale: false, + category: "objects" + }, + fountain_pen: { + keywords: [ "stationery", "writing", "write" ], + char: "\ud83d\udd8b", + fitzpatrick_scale: false, + category: "objects" + }, + black_nib: { + keywords: [ "pen", "stationery", "writing", "write" ], + char: "\u2712\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + memo: { + keywords: [ "write", "documents", "stationery", "pencil", "paper", "writing", "legal", "exam", "quiz", "test", "study", "compose" ], + char: "\ud83d\udcdd", + fitzpatrick_scale: false, + category: "objects" + }, + pencil2: { + keywords: [ "stationery", "write", "paper", "writing", "school", "study" ], + char: "\u270f\ufe0f", + fitzpatrick_scale: false, + category: "objects" + }, + crayon: { + keywords: [ "drawing", "creativity" ], + char: "\ud83d\udd8d", + fitzpatrick_scale: false, + category: "objects" + }, + paintbrush: { + keywords: [ "drawing", "creativity", "art" ], + char: "\ud83d\udd8c", + fitzpatrick_scale: false, + category: "objects" + }, + mag: { + keywords: [ "search", "zoom", "find", "detective" ], + char: "\ud83d\udd0d", + fitzpatrick_scale: false, + category: "objects" + }, + mag_right: { + keywords: [ "search", "zoom", "find", "detective" ], + char: "\ud83d\udd0e", + fitzpatrick_scale: false, + category: "objects" + }, + heart: { + keywords: [ "love", "like", "valentines" ], + char: "\u2764\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + orange_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83e\udde1", + fitzpatrick_scale: false, + category: "symbols" + }, + yellow_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9b", + fitzpatrick_scale: false, + category: "symbols" + }, + green_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9a", + fitzpatrick_scale: false, + category: "symbols" + }, + blue_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc99", + fitzpatrick_scale: false, + category: "symbols" + }, + purple_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9c", + fitzpatrick_scale: false, + category: "symbols" + }, + black_heart: { + keywords: [ "evil" ], + char: "\ud83d\udda4", + fitzpatrick_scale: false, + category: "symbols" + }, + broken_heart: { + keywords: [ "sad", "sorry", "break", "heart", "heartbreak" ], + char: "\ud83d\udc94", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_heart_exclamation: { + keywords: [ "decoration", "love" ], + char: "\u2763", + fitzpatrick_scale: false, + category: "symbols" + }, + two_hearts: { + keywords: [ "love", "like", "affection", "valentines", "heart" ], + char: "\ud83d\udc95", + fitzpatrick_scale: false, + category: "symbols" + }, + revolving_hearts: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc9e", + fitzpatrick_scale: false, + category: "symbols" + }, + heartbeat: { + keywords: [ "love", "like", "affection", "valentines", "pink", "heart" ], + char: "\ud83d\udc93", + fitzpatrick_scale: false, + category: "symbols" + }, + heartpulse: { + keywords: [ "like", "love", "affection", "valentines", "pink" ], + char: "\ud83d\udc97", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkling_heart: { + keywords: [ "love", "like", "affection", "valentines" ], + char: "\ud83d\udc96", + fitzpatrick_scale: false, + category: "symbols" + }, + cupid: { + keywords: [ "love", "like", "heart", "affection", "valentines" ], + char: "\ud83d\udc98", + fitzpatrick_scale: false, + category: "symbols" + }, + gift_heart: { + keywords: [ "love", "valentines" ], + char: "\ud83d\udc9d", + fitzpatrick_scale: false, + category: "symbols" + }, + heart_decoration: { + keywords: [ "purple-square", "love", "like" ], + char: "\ud83d\udc9f", + fitzpatrick_scale: false, + category: "symbols" + }, + peace_symbol: { + keywords: [ "hippie" ], + char: "\u262e", + fitzpatrick_scale: false, + category: "symbols" + }, + latin_cross: { + keywords: [ "christianity" ], + char: "\u271d", + fitzpatrick_scale: false, + category: "symbols" + }, + star_and_crescent: { + keywords: [ "islam" ], + char: "\u262a", + fitzpatrick_scale: false, + category: "symbols" + }, + om: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: "\ud83d\udd49", + fitzpatrick_scale: false, + category: "symbols" + }, + wheel_of_dharma: { + keywords: [ "hinduism", "buddhism", "sikhism", "jainism" ], + char: "\u2638", + fitzpatrick_scale: false, + category: "symbols" + }, + star_of_david: { + keywords: [ "judaism" ], + char: "\u2721", + fitzpatrick_scale: false, + category: "symbols" + }, + six_pointed_star: { + keywords: [ "purple-square", "religion", "jewish", "hexagram" ], + char: "\ud83d\udd2f", + fitzpatrick_scale: false, + category: "symbols" + }, + menorah: { + keywords: [ "hanukkah", "candles", "jewish" ], + char: "\ud83d\udd4e", + fitzpatrick_scale: false, + category: "symbols" + }, + yin_yang: { + keywords: [ "balance" ], + char: "\u262f", + fitzpatrick_scale: false, + category: "symbols" + }, + orthodox_cross: { + keywords: [ "suppedaneum", "religion" ], + char: "\u2626", + fitzpatrick_scale: false, + category: "symbols" + }, + place_of_worship: { + keywords: [ "religion", "church", "temple", "prayer" ], + char: "\ud83d\uded0", + fitzpatrick_scale: false, + category: "symbols" + }, + ophiuchus: { + keywords: [ "sign", "purple-square", "constellation", "astrology" ], + char: "\u26ce", + fitzpatrick_scale: false, + category: "symbols" + }, + aries: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u2648", + fitzpatrick_scale: false, + category: "symbols" + }, + taurus: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: "\u2649", + fitzpatrick_scale: false, + category: "symbols" + }, + gemini: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u264a", + fitzpatrick_scale: false, + category: "symbols" + }, + cancer: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u264b", + fitzpatrick_scale: false, + category: "symbols" + }, + leo: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u264c", + fitzpatrick_scale: false, + category: "symbols" + }, + virgo: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u264d", + fitzpatrick_scale: false, + category: "symbols" + }, + libra: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u264e", + fitzpatrick_scale: false, + category: "symbols" + }, + scorpius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology", "scorpio" ], + char: "\u264f", + fitzpatrick_scale: false, + category: "symbols" + }, + sagittarius: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u2650", + fitzpatrick_scale: false, + category: "symbols" + }, + capricorn: { + keywords: [ "sign", "zodiac", "purple-square", "astrology" ], + char: "\u2651", + fitzpatrick_scale: false, + category: "symbols" + }, + aquarius: { + keywords: [ "sign", "purple-square", "zodiac", "astrology" ], + char: "\u2652", + fitzpatrick_scale: false, + category: "symbols" + }, + pisces: { + keywords: [ "purple-square", "sign", "zodiac", "astrology" ], + char: "\u2653", + fitzpatrick_scale: false, + category: "symbols" + }, + id: { + keywords: [ "purple-square", "words" ], + char: "\ud83c\udd94", + fitzpatrick_scale: false, + category: "symbols" + }, + atom_symbol: { + keywords: [ "science", "physics", "chemistry" ], + char: "\u269b", + fitzpatrick_scale: false, + category: "symbols" + }, + u7a7a: { + keywords: [ "kanji", "japanese", "chinese", "empty", "sky", "blue-square" ], + char: "\ud83c\ude33", + fitzpatrick_scale: false, + category: "symbols" + }, + u5272: { + keywords: [ "cut", "divide", "chinese", "kanji", "pink-square" ], + char: "\ud83c\ude39", + fitzpatrick_scale: false, + category: "symbols" + }, + radioactive: { + keywords: [ "nuclear", "danger" ], + char: "\u2622", + fitzpatrick_scale: false, + category: "symbols" + }, + biohazard: { + keywords: [ "danger" ], + char: "\u2623", + fitzpatrick_scale: false, + category: "symbols" + }, + mobile_phone_off: { + keywords: [ "mute", "orange-square", "silence", "quiet" ], + char: "\ud83d\udcf4", + fitzpatrick_scale: false, + category: "symbols" + }, + vibration_mode: { + keywords: [ "orange-square", "phone" ], + char: "\ud83d\udcf3", + fitzpatrick_scale: false, + category: "symbols" + }, + u6709: { + keywords: [ "orange-square", "chinese", "have", "kanji" ], + char: "\ud83c\ude36", + fitzpatrick_scale: false, + category: "symbols" + }, + u7121: { + keywords: [ "nothing", "chinese", "kanji", "japanese", "orange-square" ], + char: "\ud83c\ude1a", + fitzpatrick_scale: false, + category: "symbols" + }, + u7533: { + keywords: [ "chinese", "japanese", "kanji", "orange-square" ], + char: "\ud83c\ude38", + fitzpatrick_scale: false, + category: "symbols" + }, + u55b6: { + keywords: [ "japanese", "opening hours", "orange-square" ], + char: "\ud83c\ude3a", + fitzpatrick_scale: false, + category: "symbols" + }, + u6708: { + keywords: [ "chinese", "month", "moon", "japanese", "orange-square", "kanji" ], + char: "\ud83c\ude37\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_pointed_black_star: { + keywords: [ "orange-square", "shape", "polygon" ], + char: "\u2734\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + vs: { + keywords: [ "words", "orange-square" ], + char: "\ud83c\udd9a", + fitzpatrick_scale: false, + category: "symbols" + }, + accept: { + keywords: [ "ok", "good", "chinese", "kanji", "agree", "yes", "orange-circle" ], + char: "\ud83c\ude51", + fitzpatrick_scale: false, + category: "symbols" + }, + white_flower: { + keywords: [ "japanese", "spring" ], + char: "\ud83d\udcae", + fitzpatrick_scale: false, + category: "symbols" + }, + ideograph_advantage: { + keywords: [ "chinese", "kanji", "obtain", "get", "circle" ], + char: "\ud83c\ude50", + fitzpatrick_scale: false, + category: "symbols" + }, + secret: { + keywords: [ "privacy", "chinese", "sshh", "kanji", "red-circle" ], + char: "\u3299\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + congratulations: { + keywords: [ "chinese", "kanji", "japanese", "red-circle" ], + char: "\u3297\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u5408: { + keywords: [ "japanese", "chinese", "join", "kanji", "red-square" ], + char: "\ud83c\ude34", + fitzpatrick_scale: false, + category: "symbols" + }, + u6e80: { + keywords: [ "full", "chinese", "japanese", "red-square", "kanji" ], + char: "\ud83c\ude35", + fitzpatrick_scale: false, + category: "symbols" + }, + u7981: { + keywords: [ "kanji", "japanese", "chinese", "forbidden", "limit", "restricted", "red-square" ], + char: "\ud83c\ude32", + fitzpatrick_scale: false, + category: "symbols" + }, + a: { + keywords: [ "red-square", "alphabet", "letter" ], + char: "\ud83c\udd70\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + b: { + keywords: [ "red-square", "alphabet", "letter" ], + char: "\ud83c\udd71\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + ab: { + keywords: [ "red-square", "alphabet" ], + char: "\ud83c\udd8e", + fitzpatrick_scale: false, + category: "symbols" + }, + cl: { + keywords: [ "alphabet", "words", "red-square" ], + char: "\ud83c\udd91", + fitzpatrick_scale: false, + category: "symbols" + }, + o2: { + keywords: [ "alphabet", "red-square", "letter" ], + char: "\ud83c\udd7e\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + sos: { + keywords: [ "help", "red-square", "words", "emergency", "911" ], + char: "\ud83c\udd98", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry: { + keywords: [ "limit", "security", "privacy", "bad", "denied", "stop", "circle" ], + char: "\u26d4", + fitzpatrick_scale: false, + category: "symbols" + }, + name_badge: { + keywords: [ "fire", "forbid" ], + char: "\ud83d\udcdb", + fitzpatrick_scale: false, + category: "symbols" + }, + no_entry_sign: { + keywords: [ "forbid", "stop", "limit", "denied", "disallow", "circle" ], + char: "\ud83d\udeab", + fitzpatrick_scale: false, + category: "symbols" + }, + x: { + keywords: [ "no", "delete", "remove", "cancel", "red" ], + char: "\u274c", + fitzpatrick_scale: false, + category: "symbols" + }, + o: { + keywords: [ "circle", "round" ], + char: "\u2b55", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_sign: { + keywords: [ "stop" ], + char: "\ud83d\uded1", + fitzpatrick_scale: false, + category: "symbols" + }, + anger: { + keywords: [ "angry", "mad" ], + char: "\ud83d\udca2", + fitzpatrick_scale: false, + category: "symbols" + }, + hotsprings: { + keywords: [ "bath", "warm", "relax" ], + char: "\u2668\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_pedestrians: { + keywords: [ "rules", "crossing", "walking", "circle" ], + char: "\ud83d\udeb7", + fitzpatrick_scale: false, + category: "symbols" + }, + do_not_litter: { + keywords: [ "trash", "bin", "garbage", "circle" ], + char: "\ud83d\udeaf", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bicycles: { + keywords: [ "cyclist", "prohibited", "circle" ], + char: "\ud83d\udeb3", + fitzpatrick_scale: false, + category: "symbols" + }, + "non-potable_water": { + keywords: [ "drink", "faucet", "tap", "circle" ], + char: "\ud83d\udeb1", + fitzpatrick_scale: false, + category: "symbols" + }, + underage: { + keywords: [ "18", "drink", "pub", "night", "minor", "circle" ], + char: "\ud83d\udd1e", + fitzpatrick_scale: false, + category: "symbols" + }, + no_mobile_phones: { + keywords: [ "iphone", "mute", "circle" ], + char: "\ud83d\udcf5", + fitzpatrick_scale: false, + category: "symbols" + }, + exclamation: { + keywords: [ "heavy_exclamation_mark", "danger", "surprise", "punctuation", "wow", "warning" ], + char: "\u2757", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_exclamation: { + keywords: [ "surprise", "punctuation", "gray", "wow", "warning" ], + char: "\u2755", + fitzpatrick_scale: false, + category: "symbols" + }, + question: { + keywords: [ "doubt", "confused" ], + char: "\u2753", + fitzpatrick_scale: false, + category: "symbols" + }, + grey_question: { + keywords: [ "doubts", "gray", "huh", "confused" ], + char: "\u2754", + fitzpatrick_scale: false, + category: "symbols" + }, + bangbang: { + keywords: [ "exclamation", "surprise" ], + char: "\u203c\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + interrobang: { + keywords: [ "wat", "punctuation", "surprise" ], + char: "\u2049\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + 100: { + keywords: [ "score", "perfect", "numbers", "century", "exam", "quiz", "test", "pass", "hundred" ], + char: "\ud83d\udcaf", + fitzpatrick_scale: false, + category: "symbols" + }, + low_brightness: { + keywords: [ "sun", "afternoon", "warm", "summer" ], + char: "\ud83d\udd05", + fitzpatrick_scale: false, + category: "symbols" + }, + high_brightness: { + keywords: [ "sun", "light" ], + char: "\ud83d\udd06", + fitzpatrick_scale: false, + category: "symbols" + }, + trident: { + keywords: [ "weapon", "spear" ], + char: "\ud83d\udd31", + fitzpatrick_scale: false, + category: "symbols" + }, + fleur_de_lis: { + keywords: [ "decorative", "scout" ], + char: "\u269c", + fitzpatrick_scale: false, + category: "symbols" + }, + part_alternation_mark: { + keywords: [ "graph", "presentation", "stats", "business", "economics", "bad" ], + char: "\u303d\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + warning: { + keywords: [ "exclamation", "wip", "alert", "error", "problem", "issue" ], + char: "\u26a0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + children_crossing: { + keywords: [ "school", "warning", "danger", "sign", "driving", "yellow-diamond" ], + char: "\ud83d\udeb8", + fitzpatrick_scale: false, + category: "symbols" + }, + beginner: { + keywords: [ "badge", "shield" ], + char: "\ud83d\udd30", + fitzpatrick_scale: false, + category: "symbols" + }, + recycle: { + keywords: [ "arrow", "environment", "garbage", "trash" ], + char: "\u267b\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + u6307: { + keywords: [ "chinese", "point", "green-square", "kanji" ], + char: "\ud83c\ude2f", + fitzpatrick_scale: false, + category: "symbols" + }, + chart: { + keywords: [ "green-square", "graph", "presentation", "stats" ], + char: "\ud83d\udcb9", + fitzpatrick_scale: false, + category: "symbols" + }, + sparkle: { + keywords: [ "stars", "green-square", "awesome", "good", "fireworks" ], + char: "\u2747\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + eight_spoked_asterisk: { + keywords: [ "star", "sparkle", "green-square" ], + char: "\u2733\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + negative_squared_cross_mark: { + keywords: [ "x", "green-square", "no", "deny" ], + char: "\u274e", + fitzpatrick_scale: false, + category: "symbols" + }, + white_check_mark: { + keywords: [ "green-square", "ok", "agree", "vote", "election", "answer", "tick" ], + char: "\u2705", + fitzpatrick_scale: false, + category: "symbols" + }, + diamond_shape_with_a_dot_inside: { + keywords: [ "jewel", "blue", "gem", "crystal", "fancy" ], + char: "\ud83d\udca0", + fitzpatrick_scale: false, + category: "symbols" + }, + cyclone: { + keywords: [ "weather", "swirl", "blue", "cloud", "vortex", "spiral", "whirlpool", "spin", "tornado", "hurricane", "typhoon" ], + char: "\ud83c\udf00", + fitzpatrick_scale: false, + category: "symbols" + }, + loop: { + keywords: [ "tape", "cassette" ], + char: "\u27bf", + fitzpatrick_scale: false, + category: "symbols" + }, + globe_with_meridians: { + keywords: [ "earth", "international", "world", "internet", "interweb", "i18n" ], + char: "\ud83c\udf10", + fitzpatrick_scale: false, + category: "symbols" + }, + m: { + keywords: [ "alphabet", "blue-circle", "letter" ], + char: "\u24c2\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + atm: { + keywords: [ "money", "sales", "cash", "blue-square", "payment", "bank" ], + char: "\ud83c\udfe7", + fitzpatrick_scale: false, + category: "symbols" + }, + sa: { + keywords: [ "japanese", "blue-square", "katakana" ], + char: "\ud83c\ude02\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + passport_control: { + keywords: [ "custom", "blue-square" ], + char: "\ud83d\udec2", + fitzpatrick_scale: false, + category: "symbols" + }, + customs: { + keywords: [ "passport", "border", "blue-square" ], + char: "\ud83d\udec3", + fitzpatrick_scale: false, + category: "symbols" + }, + baggage_claim: { + keywords: [ "blue-square", "airport", "transport" ], + char: "\ud83d\udec4", + fitzpatrick_scale: false, + category: "symbols" + }, + left_luggage: { + keywords: [ "blue-square", "travel" ], + char: "\ud83d\udec5", + fitzpatrick_scale: false, + category: "symbols" + }, + wheelchair: { + keywords: [ "blue-square", "disabled", "a11y", "accessibility" ], + char: "\u267f", + fitzpatrick_scale: false, + category: "symbols" + }, + no_smoking: { + keywords: [ "cigarette", "blue-square", "smell", "smoke" ], + char: "\ud83d\udead", + fitzpatrick_scale: false, + category: "symbols" + }, + wc: { + keywords: [ "toilet", "restroom", "blue-square" ], + char: "\ud83d\udebe", + fitzpatrick_scale: false, + category: "symbols" + }, + parking: { + keywords: [ "cars", "blue-square", "alphabet", "letter" ], + char: "\ud83c\udd7f\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + potable_water: { + keywords: [ "blue-square", "liquid", "restroom", "cleaning", "faucet" ], + char: "\ud83d\udeb0", + fitzpatrick_scale: false, + category: "symbols" + }, + mens: { + keywords: [ "toilet", "restroom", "wc", "blue-square", "gender", "male" ], + char: "\ud83d\udeb9", + fitzpatrick_scale: false, + category: "symbols" + }, + womens: { + keywords: [ "purple-square", "woman", "female", "toilet", "loo", "restroom", "gender" ], + char: "\ud83d\udeba", + fitzpatrick_scale: false, + category: "symbols" + }, + baby_symbol: { + keywords: [ "orange-square", "child" ], + char: "\ud83d\udebc", + fitzpatrick_scale: false, + category: "symbols" + }, + restroom: { + keywords: [ "blue-square", "toilet", "refresh", "wc", "gender" ], + char: "\ud83d\udebb", + fitzpatrick_scale: false, + category: "symbols" + }, + put_litter_in_its_place: { + keywords: [ "blue-square", "sign", "human", "info" ], + char: "\ud83d\udeae", + fitzpatrick_scale: false, + category: "symbols" + }, + cinema: { + keywords: [ "blue-square", "record", "film", "movie", "curtain", "stage", "theater" ], + char: "\ud83c\udfa6", + fitzpatrick_scale: false, + category: "symbols" + }, + signal_strength: { + keywords: [ "blue-square", "reception", "phone", "internet", "connection", "wifi", "bluetooth", "bars" ], + char: "\ud83d\udcf6", + fitzpatrick_scale: false, + category: "symbols" + }, + koko: { + keywords: [ "blue-square", "here", "katakana", "japanese", "destination" ], + char: "\ud83c\ude01", + fitzpatrick_scale: false, + category: "symbols" + }, + ng: { + keywords: [ "blue-square", "words", "shape", "icon" ], + char: "\ud83c\udd96", + fitzpatrick_scale: false, + category: "symbols" + }, + ok: { + keywords: [ "good", "agree", "yes", "blue-square" ], + char: "\ud83c\udd97", + fitzpatrick_scale: false, + category: "symbols" + }, + up: { + keywords: [ "blue-square", "above", "high" ], + char: "\ud83c\udd99", + fitzpatrick_scale: false, + category: "symbols" + }, + cool: { + keywords: [ "words", "blue-square" ], + char: "\ud83c\udd92", + fitzpatrick_scale: false, + category: "symbols" + }, + new: { + keywords: [ "blue-square", "words", "start" ], + char: "\ud83c\udd95", + fitzpatrick_scale: false, + category: "symbols" + }, + free: { + keywords: [ "blue-square", "words" ], + char: "\ud83c\udd93", + fitzpatrick_scale: false, + category: "symbols" + }, + zero: { + keywords: [ "0", "numbers", "blue-square", "null" ], + char: "0\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + one: { + keywords: [ "blue-square", "numbers", "1" ], + char: "1\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + two: { + keywords: [ "numbers", "2", "prime", "blue-square" ], + char: "2\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + three: { + keywords: [ "3", "numbers", "prime", "blue-square" ], + char: "3\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + four: { + keywords: [ "4", "numbers", "blue-square" ], + char: "4\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + five: { + keywords: [ "5", "numbers", "blue-square", "prime" ], + char: "5\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + six: { + keywords: [ "6", "numbers", "blue-square" ], + char: "6\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + seven: { + keywords: [ "7", "numbers", "blue-square", "prime" ], + char: "7\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + eight: { + keywords: [ "8", "blue-square", "numbers" ], + char: "8\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + nine: { + keywords: [ "blue-square", "numbers", "9" ], + char: "9\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + keycap_ten: { + keywords: [ "numbers", "10", "blue-square" ], + char: "\ud83d\udd1f", + fitzpatrick_scale: false, + category: "symbols" + }, + asterisk: { + keywords: [ "star", "keycap" ], + char: "*\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + 1234: { + keywords: [ "numbers", "blue-square" ], + char: "\ud83d\udd22", + fitzpatrick_scale: false, + category: "symbols" + }, + eject_button: { + keywords: [ "blue-square" ], + char: "\u23cf\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_forward: { + keywords: [ "blue-square", "right", "direction", "play" ], + char: "\u25b6\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + pause_button: { + keywords: [ "pause", "blue-square" ], + char: "\u23f8", + fitzpatrick_scale: false, + category: "symbols" + }, + next_track_button: { + keywords: [ "forward", "next", "blue-square" ], + char: "\u23ed", + fitzpatrick_scale: false, + category: "symbols" + }, + stop_button: { + keywords: [ "blue-square" ], + char: "\u23f9", + fitzpatrick_scale: false, + category: "symbols" + }, + record_button: { + keywords: [ "blue-square" ], + char: "\u23fa", + fitzpatrick_scale: false, + category: "symbols" + }, + play_or_pause_button: { + keywords: [ "blue-square", "play", "pause" ], + char: "\u23ef", + fitzpatrick_scale: false, + category: "symbols" + }, + previous_track_button: { + keywords: [ "backward" ], + char: "\u23ee", + fitzpatrick_scale: false, + category: "symbols" + }, + fast_forward: { + keywords: [ "blue-square", "play", "speed", "continue" ], + char: "\u23e9", + fitzpatrick_scale: false, + category: "symbols" + }, + rewind: { + keywords: [ "play", "blue-square" ], + char: "\u23ea", + fitzpatrick_scale: false, + category: "symbols" + }, + twisted_rightwards_arrows: { + keywords: [ "blue-square", "shuffle", "music", "random" ], + char: "\ud83d\udd00", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat: { + keywords: [ "loop", "record" ], + char: "\ud83d\udd01", + fitzpatrick_scale: false, + category: "symbols" + }, + repeat_one: { + keywords: [ "blue-square", "loop" ], + char: "\ud83d\udd02", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_backward: { + keywords: [ "blue-square", "left", "direction" ], + char: "\u25c0\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_small: { + keywords: [ "blue-square", "triangle", "direction", "point", "forward", "top" ], + char: "\ud83d\udd3c", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down_small: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\ud83d\udd3d", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_up: { + keywords: [ "blue-square", "direction", "top" ], + char: "\u23eb", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_double_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\u23ec", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right: { + keywords: [ "blue-square", "next" ], + char: "\u27a1\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_left: { + keywords: [ "blue-square", "previous", "back" ], + char: "\u2b05\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up: { + keywords: [ "blue-square", "continue", "top", "direction" ], + char: "\u2b06\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\u2b07\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_right: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northeast" ], + char: "\u2197\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_right: { + keywords: [ "blue-square", "direction", "diagonal", "southeast" ], + char: "\u2198\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_lower_left: { + keywords: [ "blue-square", "direction", "diagonal", "southwest" ], + char: "\u2199\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_upper_left: { + keywords: [ "blue-square", "point", "direction", "diagonal", "northwest" ], + char: "\u2196\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_up_down: { + keywords: [ "blue-square", "direction", "way", "vertical" ], + char: "\u2195\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + left_right_arrow: { + keywords: [ "shape", "direction", "horizontal", "sideways" ], + char: "\u2194\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_counterclockwise: { + keywords: [ "blue-square", "sync", "cycle" ], + char: "\ud83d\udd04", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_right_hook: { + keywords: [ "blue-square", "return", "rotate", "direction" ], + char: "\u21aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + leftwards_arrow_with_hook: { + keywords: [ "back", "return", "blue-square", "undo", "enter" ], + char: "\u21a9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_up: { + keywords: [ "blue-square", "direction", "top" ], + char: "\u2934\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrow_heading_down: { + keywords: [ "blue-square", "direction", "bottom" ], + char: "\u2935\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hash: { + keywords: [ "symbol", "blue-square", "twitter" ], + char: "#\ufe0f\u20e3", + fitzpatrick_scale: false, + category: "symbols" + }, + information_source: { + keywords: [ "blue-square", "alphabet", "letter" ], + char: "\u2139\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + abc: { + keywords: [ "blue-square", "alphabet" ], + char: "\ud83d\udd24", + fitzpatrick_scale: false, + category: "symbols" + }, + abcd: { + keywords: [ "blue-square", "alphabet" ], + char: "\ud83d\udd21", + fitzpatrick_scale: false, + category: "symbols" + }, + capital_abcd: { + keywords: [ "alphabet", "words", "blue-square" ], + char: "\ud83d\udd20", + fitzpatrick_scale: false, + category: "symbols" + }, + symbols: { + keywords: [ "blue-square", "music", "note", "ampersand", "percent", "glyphs", "characters" ], + char: "\ud83d\udd23", + fitzpatrick_scale: false, + category: "symbols" + }, + musical_note: { + keywords: [ "score", "tone", "sound" ], + char: "\ud83c\udfb5", + fitzpatrick_scale: false, + category: "symbols" + }, + notes: { + keywords: [ "music", "score" ], + char: "\ud83c\udfb6", + fitzpatrick_scale: false, + category: "symbols" + }, + wavy_dash: { + keywords: [ "draw", "line", "moustache", "mustache", "squiggle", "scribble" ], + char: "\u3030\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + curly_loop: { + keywords: [ "scribble", "draw", "shape", "squiggle" ], + char: "\u27b0", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_check_mark: { + keywords: [ "ok", "nike", "answer", "yes", "tick" ], + char: "\u2714\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + arrows_clockwise: { + keywords: [ "sync", "cycle", "round", "repeat" ], + char: "\ud83d\udd03", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_plus_sign: { + keywords: [ "math", "calculation", "addition", "more", "increase" ], + char: "\u2795", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_minus_sign: { + keywords: [ "math", "calculation", "subtract", "less" ], + char: "\u2796", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_division_sign: { + keywords: [ "divide", "math", "calculation" ], + char: "\u2797", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_multiplication_x: { + keywords: [ "math", "calculation" ], + char: "\u2716\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + infinity: { + keywords: [ "forever" ], + char: "\u267e", + fitzpatrick_scale: false, + category: "symbols" + }, + heavy_dollar_sign: { + keywords: [ "money", "sales", "payment", "currency", "buck" ], + char: "\ud83d\udcb2", + fitzpatrick_scale: false, + category: "symbols" + }, + currency_exchange: { + keywords: [ "money", "sales", "dollar", "travel" ], + char: "\ud83d\udcb1", + fitzpatrick_scale: false, + category: "symbols" + }, + copyright: { + keywords: [ "ip", "license", "circle", "law", "legal" ], + char: "\xa9\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + registered: { + keywords: [ "alphabet", "circle" ], + char: "\xae\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + tm: { + keywords: [ "trademark", "brand", "law", "legal" ], + char: "\u2122\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + end: { + keywords: [ "words", "arrow" ], + char: "\ud83d\udd1a", + fitzpatrick_scale: false, + category: "symbols" + }, + back: { + keywords: [ "arrow", "words", "return" ], + char: "\ud83d\udd19", + fitzpatrick_scale: false, + category: "symbols" + }, + on: { + keywords: [ "arrow", "words" ], + char: "\ud83d\udd1b", + fitzpatrick_scale: false, + category: "symbols" + }, + top: { + keywords: [ "words", "blue-square" ], + char: "\ud83d\udd1d", + fitzpatrick_scale: false, + category: "symbols" + }, + soon: { + keywords: [ "arrow", "words" ], + char: "\ud83d\udd1c", + fitzpatrick_scale: false, + category: "symbols" + }, + ballot_box_with_check: { + keywords: [ "ok", "agree", "confirm", "black-square", "vote", "election", "yes", "tick" ], + char: "\u2611\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + radio_button: { + keywords: [ "input", "old", "music", "circle" ], + char: "\ud83d\udd18", + fitzpatrick_scale: false, + category: "symbols" + }, + white_circle: { + keywords: [ "shape", "round" ], + char: "\u26aa", + fitzpatrick_scale: false, + category: "symbols" + }, + black_circle: { + keywords: [ "shape", "button", "round" ], + char: "\u26ab", + fitzpatrick_scale: false, + category: "symbols" + }, + red_circle: { + keywords: [ "shape", "error", "danger" ], + char: "\ud83d\udd34", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_circle: { + keywords: [ "shape", "icon", "button" ], + char: "\ud83d\udd35", + fitzpatrick_scale: false, + category: "symbols" + }, + small_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd38", + fitzpatrick_scale: false, + category: "symbols" + }, + small_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd39", + fitzpatrick_scale: false, + category: "symbols" + }, + large_orange_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd36", + fitzpatrick_scale: false, + category: "symbols" + }, + large_blue_diamond: { + keywords: [ "shape", "jewel", "gem" ], + char: "\ud83d\udd37", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle: { + keywords: [ "shape", "direction", "up", "top" ], + char: "\ud83d\udd3a", + fitzpatrick_scale: false, + category: "symbols" + }, + black_small_square: { + keywords: [ "shape", "icon" ], + char: "\u25aa\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_small_square: { + keywords: [ "shape", "icon" ], + char: "\u25ab\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_large_square: { + keywords: [ "shape", "icon", "button" ], + char: "\u2b1b", + fitzpatrick_scale: false, + category: "symbols" + }, + white_large_square: { + keywords: [ "shape", "icon", "stone", "button" ], + char: "\u2b1c", + fitzpatrick_scale: false, + category: "symbols" + }, + small_red_triangle_down: { + keywords: [ "shape", "direction", "bottom" ], + char: "\ud83d\udd3b", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_square: { + keywords: [ "shape", "button", "icon" ], + char: "\u25fc\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_square: { + keywords: [ "shape", "stone", "icon" ], + char: "\u25fb\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + black_medium_small_square: { + keywords: [ "icon", "shape", "button" ], + char: "\u25fe", + fitzpatrick_scale: false, + category: "symbols" + }, + white_medium_small_square: { + keywords: [ "shape", "stone", "icon", "button" ], + char: "\u25fd", + fitzpatrick_scale: false, + category: "symbols" + }, + black_square_button: { + keywords: [ "shape", "input", "frame" ], + char: "\ud83d\udd32", + fitzpatrick_scale: false, + category: "symbols" + }, + white_square_button: { + keywords: [ "shape", "input" ], + char: "\ud83d\udd33", + fitzpatrick_scale: false, + category: "symbols" + }, + speaker: { + keywords: [ "sound", "volume", "silence", "broadcast" ], + char: "\ud83d\udd08", + fitzpatrick_scale: false, + category: "symbols" + }, + sound: { + keywords: [ "volume", "speaker", "broadcast" ], + char: "\ud83d\udd09", + fitzpatrick_scale: false, + category: "symbols" + }, + loud_sound: { + keywords: [ "volume", "noise", "noisy", "speaker", "broadcast" ], + char: "\ud83d\udd0a", + fitzpatrick_scale: false, + category: "symbols" + }, + mute: { + keywords: [ "sound", "volume", "silence", "quiet" ], + char: "\ud83d\udd07", + fitzpatrick_scale: false, + category: "symbols" + }, + mega: { + keywords: [ "sound", "speaker", "volume" ], + char: "\ud83d\udce3", + fitzpatrick_scale: false, + category: "symbols" + }, + loudspeaker: { + keywords: [ "volume", "sound" ], + char: "\ud83d\udce2", + fitzpatrick_scale: false, + category: "symbols" + }, + bell: { + keywords: [ "sound", "notification", "christmas", "xmas", "chime" ], + char: "\ud83d\udd14", + fitzpatrick_scale: false, + category: "symbols" + }, + no_bell: { + keywords: [ "sound", "volume", "mute", "quiet", "silent" ], + char: "\ud83d\udd15", + fitzpatrick_scale: false, + category: "symbols" + }, + black_joker: { + keywords: [ "poker", "cards", "game", "play", "magic" ], + char: "\ud83c\udccf", + fitzpatrick_scale: false, + category: "symbols" + }, + mahjong: { + keywords: [ "game", "play", "chinese", "kanji" ], + char: "\ud83c\udc04", + fitzpatrick_scale: false, + category: "symbols" + }, + spades: { + keywords: [ "poker", "cards", "suits", "magic" ], + char: "\u2660\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + clubs: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: "\u2663\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + hearts: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: "\u2665\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + diamonds: { + keywords: [ "poker", "cards", "magic", "suits" ], + char: "\u2666\ufe0f", + fitzpatrick_scale: false, + category: "symbols" + }, + flower_playing_cards: { + keywords: [ "game", "sunset", "red" ], + char: "\ud83c\udfb4", + fitzpatrick_scale: false, + category: "symbols" + }, + thought_balloon: { + keywords: [ "bubble", "cloud", "speech", "thinking", "dream" ], + char: "\ud83d\udcad", + fitzpatrick_scale: false, + category: "symbols" + }, + right_anger_bubble: { + keywords: [ "caption", "speech", "thinking", "mad" ], + char: "\ud83d\uddef", + fitzpatrick_scale: false, + category: "symbols" + }, + speech_balloon: { + keywords: [ "bubble", "words", "message", "talk", "chatting" ], + char: "\ud83d\udcac", + fitzpatrick_scale: false, + category: "symbols" + }, + left_speech_bubble: { + keywords: [ "words", "message", "talk", "chatting" ], + char: "\ud83d\udde8", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd50", + fitzpatrick_scale: false, + category: "symbols" + }, + clock2: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd51", + fitzpatrick_scale: false, + category: "symbols" + }, + clock3: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd52", + fitzpatrick_scale: false, + category: "symbols" + }, + clock4: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd53", + fitzpatrick_scale: false, + category: "symbols" + }, + clock5: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd54", + fitzpatrick_scale: false, + category: "symbols" + }, + clock6: { + keywords: [ "time", "late", "early", "schedule", "dawn", "dusk" ], + char: "\ud83d\udd55", + fitzpatrick_scale: false, + category: "symbols" + }, + clock7: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd56", + fitzpatrick_scale: false, + category: "symbols" + }, + clock8: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd57", + fitzpatrick_scale: false, + category: "symbols" + }, + clock9: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd58", + fitzpatrick_scale: false, + category: "symbols" + }, + clock10: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd59", + fitzpatrick_scale: false, + category: "symbols" + }, + clock11: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5a", + fitzpatrick_scale: false, + category: "symbols" + }, + clock12: { + keywords: [ "time", "noon", "midnight", "midday", "late", "early", "schedule" ], + char: "\ud83d\udd5b", + fitzpatrick_scale: false, + category: "symbols" + }, + clock130: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5c", + fitzpatrick_scale: false, + category: "symbols" + }, + clock230: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5d", + fitzpatrick_scale: false, + category: "symbols" + }, + clock330: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5e", + fitzpatrick_scale: false, + category: "symbols" + }, + clock430: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd5f", + fitzpatrick_scale: false, + category: "symbols" + }, + clock530: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd60", + fitzpatrick_scale: false, + category: "symbols" + }, + clock630: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd61", + fitzpatrick_scale: false, + category: "symbols" + }, + clock730: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd62", + fitzpatrick_scale: false, + category: "symbols" + }, + clock830: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd63", + fitzpatrick_scale: false, + category: "symbols" + }, + clock930: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd64", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1030: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd65", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1130: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd66", + fitzpatrick_scale: false, + category: "symbols" + }, + clock1230: { + keywords: [ "time", "late", "early", "schedule" ], + char: "\ud83d\udd67", + fitzpatrick_scale: false, + category: "symbols" + }, + afghanistan: { + keywords: [ "af", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + aland_islands: { + keywords: [ "\xc5land", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + albania: { + keywords: [ "al", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + algeria: { + keywords: [ "dz", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + american_samoa: { + keywords: [ "american", "ws", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + andorra: { + keywords: [ "ad", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + angola: { + keywords: [ "ao", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + anguilla: { + keywords: [ "ai", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + antarctica: { + keywords: [ "aq", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + antigua_barbuda: { + keywords: [ "antigua", "barbuda", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + argentina: { + keywords: [ "ar", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + armenia: { + keywords: [ "am", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + aruba: { + keywords: [ "aw", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + australia: { + keywords: [ "au", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + austria: { + keywords: [ "at", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + azerbaijan: { + keywords: [ "az", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + bahamas: { + keywords: [ "bs", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + bahrain: { + keywords: [ "bh", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + bangladesh: { + keywords: [ "bd", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + barbados: { + keywords: [ "bb", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + belarus: { + keywords: [ "by", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + belgium: { + keywords: [ "be", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + belize: { + keywords: [ "bz", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + benin: { + keywords: [ "bj", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + bermuda: { + keywords: [ "bm", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + bhutan: { + keywords: [ "bt", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + bolivia: { + keywords: [ "bo", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + caribbean_netherlands: { + keywords: [ "bonaire", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + bosnia_herzegovina: { + keywords: [ "bosnia", "herzegovina", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + botswana: { + keywords: [ "bw", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + brazil: { + keywords: [ "br", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + british_indian_ocean_territory: { + keywords: [ "british", "indian", "ocean", "territory", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + british_virgin_islands: { + keywords: [ "british", "virgin", "islands", "bvi", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + brunei: { + keywords: [ "bn", "darussalam", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + bulgaria: { + keywords: [ "bg", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + burkina_faso: { + keywords: [ "burkina", "faso", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + burundi: { + keywords: [ "bi", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + cape_verde: { + keywords: [ "cabo", "verde", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + cambodia: { + keywords: [ "kh", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + cameroon: { + keywords: [ "cm", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + canada: { + keywords: [ "ca", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + canary_islands: { + keywords: [ "canary", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + cayman_islands: { + keywords: [ "cayman", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + central_african_republic: { + keywords: [ "central", "african", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + chad: { + keywords: [ "td", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + chile: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + cn: { + keywords: [ "china", "chinese", "prc", "flag", "country", "nation", "banner" ], + char: "\ud83c\udde8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + christmas_island: { + keywords: [ "christmas", "island", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + cocos_islands: { + keywords: [ "cocos", "keeling", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + colombia: { + keywords: [ "co", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + comoros: { + keywords: [ "km", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + congo_brazzaville: { + keywords: [ "congo", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + congo_kinshasa: { + keywords: [ "congo", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + cook_islands: { + keywords: [ "cook", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + costa_rica: { + keywords: [ "costa", "rica", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + croatia: { + keywords: [ "hr", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + cuba: { + keywords: [ "cu", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + curacao: { + keywords: [ "cura\xe7ao", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + cyprus: { + keywords: [ "cy", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + czech_republic: { + keywords: [ "cz", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + denmark: { + keywords: [ "dk", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + djibouti: { + keywords: [ "dj", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + dominica: { + keywords: [ "dm", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + dominican_republic: { + keywords: [ "dominican", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ecuador: { + keywords: [ "ec", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + egypt: { + keywords: [ "eg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + el_salvador: { + keywords: [ "el", "salvador", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + equatorial_guinea: { + keywords: [ "equatorial", "gn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + eritrea: { + keywords: [ "er", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + estonia: { + keywords: [ "ee", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ethiopia: { + keywords: [ "et", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + eu: { + keywords: [ "european", "union", "flag", "banner" ], + char: "\ud83c\uddea\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + falkland_islands: { + keywords: [ "falkland", "islands", "malvinas", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + faroe_islands: { + keywords: [ "faroe", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + fiji: { + keywords: [ "fj", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + finland: { + keywords: [ "fi", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + fr: { + keywords: [ "banner", "flag", "nation", "france", "french", "country" ], + char: "\ud83c\uddeb\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + french_guiana: { + keywords: [ "french", "guiana", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_polynesia: { + keywords: [ "french", "polynesia", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + french_southern_territories: { + keywords: [ "french", "southern", "territories", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + gabon: { + keywords: [ "ga", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + gambia: { + keywords: [ "gm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + georgia: { + keywords: [ "ge", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + de: { + keywords: [ "german", "nation", "flag", "country", "banner" ], + char: "\ud83c\udde9\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + ghana: { + keywords: [ "gh", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + gibraltar: { + keywords: [ "gi", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + greece: { + keywords: [ "gr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + greenland: { + keywords: [ "gl", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + grenada: { + keywords: [ "gd", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + guadeloupe: { + keywords: [ "gp", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + guam: { + keywords: [ "gu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + guatemala: { + keywords: [ "gt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + guernsey: { + keywords: [ "gg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + guinea: { + keywords: [ "gn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + guinea_bissau: { + keywords: [ "gw", "bissau", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + guyana: { + keywords: [ "gy", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + haiti: { + keywords: [ "ht", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + honduras: { + keywords: [ "hn", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + hong_kong: { + keywords: [ "hong", "kong", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + hungary: { + keywords: [ "hu", "flag", "nation", "country", "banner" ], + char: "\ud83c\udded\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + iceland: { + keywords: [ "is", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + india: { + keywords: [ "in", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + indonesia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + iran: { + keywords: [ "iran,", "islamic", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + iraq: { + keywords: [ "iq", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + ireland: { + keywords: [ "ie", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + isle_of_man: { + keywords: [ "isle", "man", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + israel: { + keywords: [ "il", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + it: { + keywords: [ "italy", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddee\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + cote_divoire: { + keywords: [ "ivory", "coast", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + jamaica: { + keywords: [ "jm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + jp: { + keywords: [ "japanese", "nation", "flag", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + jersey: { + keywords: [ "je", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + jordan: { + keywords: [ "jo", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddef\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + kazakhstan: { + keywords: [ "kz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + kenya: { + keywords: [ "ke", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + kiribati: { + keywords: [ "ki", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + kosovo: { + keywords: [ "xk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfd\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + kuwait: { + keywords: [ "kw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + kyrgyzstan: { + keywords: [ "kg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + laos: { + keywords: [ "lao", "democratic", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + latvia: { + keywords: [ "lv", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + lebanon: { + keywords: [ "lb", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + lesotho: { + keywords: [ "ls", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + liberia: { + keywords: [ "lr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + libya: { + keywords: [ "ly", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + liechtenstein: { + keywords: [ "li", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + lithuania: { + keywords: [ "lt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + luxembourg: { + keywords: [ "lu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + macau: { + keywords: [ "macao", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + macedonia: { + keywords: [ "macedonia,", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + madagascar: { + keywords: [ "mg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + malawi: { + keywords: [ "mw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + malaysia: { + keywords: [ "my", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + maldives: { + keywords: [ "mv", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + mali: { + keywords: [ "ml", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + malta: { + keywords: [ "mt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + marshall_islands: { + keywords: [ "marshall", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + martinique: { + keywords: [ "mq", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf6", + fitzpatrick_scale: false, + category: "flags" + }, + mauritania: { + keywords: [ "mr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + mauritius: { + keywords: [ "mu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + mayotte: { + keywords: [ "yt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfe\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + mexico: { + keywords: [ "mx", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + micronesia: { + keywords: [ "micronesia,", "federated", "states", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddeb\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + moldova: { + keywords: [ "moldova,", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + monaco: { + keywords: [ "mc", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + mongolia: { + keywords: [ "mn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + montenegro: { + keywords: [ "me", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + montserrat: { + keywords: [ "ms", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + morocco: { + keywords: [ "ma", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + mozambique: { + keywords: [ "mz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + myanmar: { + keywords: [ "mm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + namibia: { + keywords: [ "na", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + nauru: { + keywords: [ "nr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + nepal: { + keywords: [ "np", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + netherlands: { + keywords: [ "nl", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + new_caledonia: { + keywords: [ "new", "caledonia", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + new_zealand: { + keywords: [ "new", "zealand", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + nicaragua: { + keywords: [ "ni", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + niger: { + keywords: [ "ne", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + nigeria: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + niue: { + keywords: [ "nu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + norfolk_island: { + keywords: [ "norfolk", "island", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + northern_mariana_islands: { + keywords: [ "northern", "mariana", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf2\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + north_korea: { + keywords: [ "north", "korea", "nation", "flag", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf5", + fitzpatrick_scale: false, + category: "flags" + }, + norway: { + keywords: [ "no", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf3\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + oman: { + keywords: [ "om_symbol", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf4\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + pakistan: { + keywords: [ "pk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + palau: { + keywords: [ "pw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + palestinian_territories: { + keywords: [ "palestine", "palestinian", "territories", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + panama: { + keywords: [ "pa", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + papua_new_guinea: { + keywords: [ "papua", "new", "guinea", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + paraguay: { + keywords: [ "py", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + peru: { + keywords: [ "pe", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + philippines: { + keywords: [ "ph", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + pitcairn_islands: { + keywords: [ "pitcairn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + poland: { + keywords: [ "pl", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + portugal: { + keywords: [ "pt", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + puerto_rico: { + keywords: [ "puerto", "rico", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + qatar: { + keywords: [ "qa", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf6\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + reunion: { + keywords: [ "r\xe9union", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + romania: { + keywords: [ "ro", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + ru: { + keywords: [ "russian", "federation", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + rwanda: { + keywords: [ "rw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + st_barthelemy: { + keywords: [ "saint", "barth\xe9lemy", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde7\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + st_helena: { + keywords: [ "saint", "helena", "ascension", "tristan", "cunha", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + st_kitts_nevis: { + keywords: [ "saint", "kitts", "nevis", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + st_lucia: { + keywords: [ "saint", "lucia", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + st_pierre_miquelon: { + keywords: [ "saint", "pierre", "miquelon", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf5\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + st_vincent_grenadines: { + keywords: [ "saint", "vincent", "grenadines", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + samoa: { + keywords: [ "ws", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfc\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + san_marino: { + keywords: [ "san", "marino", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + sao_tome_principe: { + keywords: [ "sao", "tome", "principe", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + saudi_arabia: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + senegal: { + keywords: [ "sn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + serbia: { + keywords: [ "rs", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf7\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + seychelles: { + keywords: [ "sc", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + sierra_leone: { + keywords: [ "sierra", "leone", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + singapore: { + keywords: [ "sg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + sint_maarten: { + keywords: [ "sint", "maarten", "dutch", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddfd", + fitzpatrick_scale: false, + category: "flags" + }, + slovakia: { + keywords: [ "sk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + slovenia: { + keywords: [ "si", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + solomon_islands: { + keywords: [ "solomon", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + somalia: { + keywords: [ "so", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + south_africa: { + keywords: [ "south", "africa", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddff\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + south_georgia_south_sandwich_islands: { + keywords: [ "south", "georgia", "sandwich", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddec\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + kr: { + keywords: [ "south", "korea", "nation", "flag", "country", "banner" ], + char: "\ud83c\uddf0\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + south_sudan: { + keywords: [ "south", "sd", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + es: { + keywords: [ "spain", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + sri_lanka: { + keywords: [ "sri", "lanka", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf1\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + sudan: { + keywords: [ "sd", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\udde9", + fitzpatrick_scale: false, + category: "flags" + }, + suriname: { + keywords: [ "sr", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + swaziland: { + keywords: [ "sz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + sweden: { + keywords: [ "se", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + switzerland: { + keywords: [ "ch", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde8\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + syria: { + keywords: [ "syrian", "arab", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf8\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + taiwan: { + keywords: [ "tw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + tajikistan: { + keywords: [ "tj", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddef", + fitzpatrick_scale: false, + category: "flags" + }, + tanzania: { + keywords: [ "tanzania,", "united", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + thailand: { + keywords: [ "th", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + timor_leste: { + keywords: [ "timor", "leste", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf1", + fitzpatrick_scale: false, + category: "flags" + }, + togo: { + keywords: [ "tg", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + tokelau: { + keywords: [ "tk", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf0", + fitzpatrick_scale: false, + category: "flags" + }, + tonga: { + keywords: [ "to", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf4", + fitzpatrick_scale: false, + category: "flags" + }, + trinidad_tobago: { + keywords: [ "trinidad", "tobago", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf9", + fitzpatrick_scale: false, + category: "flags" + }, + tunisia: { + keywords: [ "tn", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + tr: { + keywords: [ "turkey", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf7", + fitzpatrick_scale: false, + category: "flags" + }, + turkmenistan: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + turks_caicos_islands: { + keywords: [ "turks", "caicos", "islands", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\udde8", + fitzpatrick_scale: false, + category: "flags" + }, + tuvalu: { + keywords: [ "flag", "nation", "country", "banner" ], + char: "\ud83c\uddf9\ud83c\uddfb", + fitzpatrick_scale: false, + category: "flags" + }, + uganda: { + keywords: [ "ug", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddec", + fitzpatrick_scale: false, + category: "flags" + }, + ukraine: { + keywords: [ "ua", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + united_arab_emirates: { + keywords: [ "united", "arab", "emirates", "flag", "nation", "country", "banner" ], + char: "\ud83c\udde6\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + uk: { + keywords: [ "united", "kingdom", "great", "britain", "northern", "ireland", "flag", "nation", "country", "banner", "british", "UK", "english", "england", "union jack" ], + char: "\ud83c\uddec\ud83c\udde7", + fitzpatrick_scale: false, + category: "flags" + }, + england: { + keywords: [ "flag", "english" ], + char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + scotland: { + keywords: [ "flag", "scottish" ], + char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + wales: { + keywords: [ "flag", "welsh" ], + char: "\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f", + fitzpatrick_scale: false, + category: "flags" + }, + us: { + keywords: [ "united", "states", "america", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddf8", + fitzpatrick_scale: false, + category: "flags" + }, + us_virgin_islands: { + keywords: [ "virgin", "islands", "us", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddee", + fitzpatrick_scale: false, + category: "flags" + }, + uruguay: { + keywords: [ "uy", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddfe", + fitzpatrick_scale: false, + category: "flags" + }, + uzbekistan: { + keywords: [ "uz", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfa\ud83c\uddff", + fitzpatrick_scale: false, + category: "flags" + }, + vanuatu: { + keywords: [ "vu", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddfa", + fitzpatrick_scale: false, + category: "flags" + }, + vatican_city: { + keywords: [ "vatican", "city", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\udde6", + fitzpatrick_scale: false, + category: "flags" + }, + venezuela: { + keywords: [ "ve", "bolivarian", "republic", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + vietnam: { + keywords: [ "viet", "nam", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfb\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + wallis_futuna: { + keywords: [ "wallis", "futuna", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfc\ud83c\uddeb", + fitzpatrick_scale: false, + category: "flags" + }, + western_sahara: { + keywords: [ "western", "sahara", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddea\ud83c\udded", + fitzpatrick_scale: false, + category: "flags" + }, + yemen: { + keywords: [ "ye", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddfe\ud83c\uddea", + fitzpatrick_scale: false, + category: "flags" + }, + zambia: { + keywords: [ "zm", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddff\ud83c\uddf2", + fitzpatrick_scale: false, + category: "flags" + }, + zimbabwe: { + keywords: [ "zw", "flag", "nation", "country", "banner" ], + char: "\ud83c\uddff\ud83c\uddfc", + fitzpatrick_scale: false, + category: "flags" + }, + united_nations: { + keywords: [ "un", "flag", "banner" ], + char: "\ud83c\uddfa\ud83c\uddf3", + fitzpatrick_scale: false, + category: "flags" + }, + pirate_flag: { + keywords: [ "skull", "crossbones", "flag", "banner" ], + char: "\ud83c\udff4\u200d\u2620\ufe0f", + fitzpatrick_scale: false, + category: "flags" + } +}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.min.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.min.js new file mode 100644 index 0000000..42cea9a --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/js/emojis.min.js @@ -0,0 +1,2 @@ +// Source: npm package: emojilib, file:emojis.json +window.tinymce.Resource.add("tinymce.plugins.emoticons",{grinning:{keywords:["face","smile","happy","joy",":D","grin"],char:"\ud83d\ude00",fitzpatrick_scale:!1,category:"people"},grimacing:{keywords:["face","grimace","teeth"],char:"\ud83d\ude2c",fitzpatrick_scale:!1,category:"people"},grin:{keywords:["face","happy","smile","joy","kawaii"],char:"\ud83d\ude01",fitzpatrick_scale:!1,category:"people"},joy:{keywords:["face","cry","tears","weep","happy","happytears","haha"],char:"\ud83d\ude02",fitzpatrick_scale:!1,category:"people"},rofl:{keywords:["face","rolling","floor","laughing","lol","haha"],char:"\ud83e\udd23",fitzpatrick_scale:!1,category:"people"},partying:{keywords:["face","celebration","woohoo"],char:"\ud83e\udd73",fitzpatrick_scale:!1,category:"people"},smiley:{keywords:["face","happy","joy","haha",":D",":)","smile","funny"],char:"\ud83d\ude03",fitzpatrick_scale:!1,category:"people"},smile:{keywords:["face","happy","joy","funny","haha","laugh","like",":D",":)"],char:"\ud83d\ude04",fitzpatrick_scale:!1,category:"people"},sweat_smile:{keywords:["face","hot","happy","laugh","sweat","smile","relief"],char:"\ud83d\ude05",fitzpatrick_scale:!1,category:"people"},laughing:{keywords:["happy","joy","lol","satisfied","haha","face","glad","XD","laugh"],char:"\ud83d\ude06",fitzpatrick_scale:!1,category:"people"},innocent:{keywords:["face","angel","heaven","halo"],char:"\ud83d\ude07",fitzpatrick_scale:!1,category:"people"},wink:{keywords:["face","happy","mischievous","secret",";)","smile","eye"],char:"\ud83d\ude09",fitzpatrick_scale:!1,category:"people"},blush:{keywords:["face","smile","happy","flushed","crush","embarrassed","shy","joy"],char:"\ud83d\ude0a",fitzpatrick_scale:!1,category:"people"},slightly_smiling_face:{keywords:["face","smile"],char:"\ud83d\ude42",fitzpatrick_scale:!1,category:"people"},upside_down_face:{keywords:["face","flipped","silly","smile"],char:"\ud83d\ude43",fitzpatrick_scale:!1,category:"people"},relaxed:{keywords:["face","blush","massage","happiness"],char:"\u263a\ufe0f",fitzpatrick_scale:!1,category:"people"},yum:{keywords:["happy","joy","tongue","smile","face","silly","yummy","nom","delicious","savouring"],char:"\ud83d\ude0b",fitzpatrick_scale:!1,category:"people"},relieved:{keywords:["face","relaxed","phew","massage","happiness"],char:"\ud83d\ude0c",fitzpatrick_scale:!1,category:"people"},heart_eyes:{keywords:["face","love","like","affection","valentines","infatuation","crush","heart"],char:"\ud83d\ude0d",fitzpatrick_scale:!1,category:"people"},smiling_face_with_three_hearts:{keywords:["face","love","like","affection","valentines","infatuation","crush","hearts","adore"],char:"\ud83e\udd70",fitzpatrick_scale:!1,category:"people"},kissing_heart:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude18",fitzpatrick_scale:!1,category:"people"},kissing:{keywords:["love","like","face","3","valentines","infatuation","kiss"],char:"\ud83d\ude17",fitzpatrick_scale:!1,category:"people"},kissing_smiling_eyes:{keywords:["face","affection","valentines","infatuation","kiss"],char:"\ud83d\ude19",fitzpatrick_scale:!1,category:"people"},kissing_closed_eyes:{keywords:["face","love","like","affection","valentines","infatuation","kiss"],char:"\ud83d\ude1a",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_winking_eye:{keywords:["face","prank","childish","playful","mischievous","smile","wink","tongue"],char:"\ud83d\ude1c",fitzpatrick_scale:!1,category:"people"},zany:{keywords:["face","goofy","crazy"],char:"\ud83e\udd2a",fitzpatrick_scale:!1,category:"people"},raised_eyebrow:{keywords:["face","distrust","scepticism","disapproval","disbelief","surprise"],char:"\ud83e\udd28",fitzpatrick_scale:!1,category:"people"},monocle:{keywords:["face","stuffy","wealthy"],char:"\ud83e\uddd0",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue_closed_eyes:{keywords:["face","prank","playful","mischievous","smile","tongue"],char:"\ud83d\ude1d",fitzpatrick_scale:!1,category:"people"},stuck_out_tongue:{keywords:["face","prank","childish","playful","mischievous","smile","tongue"],char:"\ud83d\ude1b",fitzpatrick_scale:!1,category:"people"},money_mouth_face:{keywords:["face","rich","dollar","money"],char:"\ud83e\udd11",fitzpatrick_scale:!1,category:"people"},nerd_face:{keywords:["face","nerdy","geek","dork"],char:"\ud83e\udd13",fitzpatrick_scale:!1,category:"people"},sunglasses:{keywords:["face","cool","smile","summer","beach","sunglass"],char:"\ud83d\ude0e",fitzpatrick_scale:!1,category:"people"},star_struck:{keywords:["face","smile","starry","eyes","grinning"],char:"\ud83e\udd29",fitzpatrick_scale:!1,category:"people"},clown_face:{keywords:["face"],char:"\ud83e\udd21",fitzpatrick_scale:!1,category:"people"},cowboy_hat_face:{keywords:["face","cowgirl","hat"],char:"\ud83e\udd20",fitzpatrick_scale:!1,category:"people"},hugs:{keywords:["face","smile","hug"],char:"\ud83e\udd17",fitzpatrick_scale:!1,category:"people"},smirk:{keywords:["face","smile","mean","prank","smug","sarcasm"],char:"\ud83d\ude0f",fitzpatrick_scale:!1,category:"people"},no_mouth:{keywords:["face","hellokitty"],char:"\ud83d\ude36",fitzpatrick_scale:!1,category:"people"},neutral_face:{keywords:["indifference","meh",":|","neutral"],char:"\ud83d\ude10",fitzpatrick_scale:!1,category:"people"},expressionless:{keywords:["face","indifferent","-_-","meh","deadpan"],char:"\ud83d\ude11",fitzpatrick_scale:!1,category:"people"},unamused:{keywords:["indifference","bored","straight face","serious","sarcasm","unimpressed","skeptical","dubious","side_eye"],char:"\ud83d\ude12",fitzpatrick_scale:!1,category:"people"},roll_eyes:{keywords:["face","eyeroll","frustrated"],char:"\ud83d\ude44",fitzpatrick_scale:!1,category:"people"},thinking:{keywords:["face","hmmm","think","consider"],char:"\ud83e\udd14",fitzpatrick_scale:!1,category:"people"},lying_face:{keywords:["face","lie","pinocchio"],char:"\ud83e\udd25",fitzpatrick_scale:!1,category:"people"},hand_over_mouth:{keywords:["face","whoops","shock","surprise"],char:"\ud83e\udd2d",fitzpatrick_scale:!1,category:"people"},shushing:{keywords:["face","quiet","shhh"],char:"\ud83e\udd2b",fitzpatrick_scale:!1,category:"people"},symbols_over_mouth:{keywords:["face","swearing","cursing","cussing","profanity","expletive"],char:"\ud83e\udd2c",fitzpatrick_scale:!1,category:"people"},exploding_head:{keywords:["face","shocked","mind","blown"],char:"\ud83e\udd2f",fitzpatrick_scale:!1,category:"people"},flushed:{keywords:["face","blush","shy","flattered"],char:"\ud83d\ude33",fitzpatrick_scale:!1,category:"people"},disappointed:{keywords:["face","sad","upset","depressed",":("],char:"\ud83d\ude1e",fitzpatrick_scale:!1,category:"people"},worried:{keywords:["face","concern","nervous",":("],char:"\ud83d\ude1f",fitzpatrick_scale:!1,category:"people"},angry:{keywords:["mad","face","annoyed","frustrated"],char:"\ud83d\ude20",fitzpatrick_scale:!1,category:"people"},rage:{keywords:["angry","mad","hate","despise"],char:"\ud83d\ude21",fitzpatrick_scale:!1,category:"people"},pensive:{keywords:["face","sad","depressed","upset"],char:"\ud83d\ude14",fitzpatrick_scale:!1,category:"people"},confused:{keywords:["face","indifference","huh","weird","hmmm",":/"],char:"\ud83d\ude15",fitzpatrick_scale:!1,category:"people"},slightly_frowning_face:{keywords:["face","frowning","disappointed","sad","upset"],char:"\ud83d\ude41",fitzpatrick_scale:!1,category:"people"},frowning_face:{keywords:["face","sad","upset","frown"],char:"\u2639",fitzpatrick_scale:!1,category:"people"},persevere:{keywords:["face","sick","no","upset","oops"],char:"\ud83d\ude23",fitzpatrick_scale:!1,category:"people"},confounded:{keywords:["face","confused","sick","unwell","oops",":S"],char:"\ud83d\ude16",fitzpatrick_scale:!1,category:"people"},tired_face:{keywords:["sick","whine","upset","frustrated"],char:"\ud83d\ude2b",fitzpatrick_scale:!1,category:"people"},weary:{keywords:["face","tired","sleepy","sad","frustrated","upset"],char:"\ud83d\ude29",fitzpatrick_scale:!1,category:"people"},pleading:{keywords:["face","begging","mercy"],char:"\ud83e\udd7a",fitzpatrick_scale:!1,category:"people"},triumph:{keywords:["face","gas","phew","proud","pride"],char:"\ud83d\ude24",fitzpatrick_scale:!1,category:"people"},open_mouth:{keywords:["face","surprise","impressed","wow","whoa",":O"],char:"\ud83d\ude2e",fitzpatrick_scale:!1,category:"people"},scream:{keywords:["face","munch","scared","omg"],char:"\ud83d\ude31",fitzpatrick_scale:!1,category:"people"},fearful:{keywords:["face","scared","terrified","nervous","oops","huh"],char:"\ud83d\ude28",fitzpatrick_scale:!1,category:"people"},cold_sweat:{keywords:["face","nervous","sweat"],char:"\ud83d\ude30",fitzpatrick_scale:!1,category:"people"},hushed:{keywords:["face","woo","shh"],char:"\ud83d\ude2f",fitzpatrick_scale:!1,category:"people"},frowning:{keywords:["face","aw","what"],char:"\ud83d\ude26",fitzpatrick_scale:!1,category:"people"},anguished:{keywords:["face","stunned","nervous"],char:"\ud83d\ude27",fitzpatrick_scale:!1,category:"people"},cry:{keywords:["face","tears","sad","depressed","upset",":'("],char:"\ud83d\ude22",fitzpatrick_scale:!1,category:"people"},disappointed_relieved:{keywords:["face","phew","sweat","nervous"],char:"\ud83d\ude25",fitzpatrick_scale:!1,category:"people"},drooling_face:{keywords:["face"],char:"\ud83e\udd24",fitzpatrick_scale:!1,category:"people"},sleepy:{keywords:["face","tired","rest","nap"],char:"\ud83d\ude2a",fitzpatrick_scale:!1,category:"people"},sweat:{keywords:["face","hot","sad","tired","exercise"],char:"\ud83d\ude13",fitzpatrick_scale:!1,category:"people"},hot:{keywords:["face","feverish","heat","red","sweating"],char:"\ud83e\udd75",fitzpatrick_scale:!1,category:"people"},cold:{keywords:["face","blue","freezing","frozen","frostbite","icicles"],char:"\ud83e\udd76",fitzpatrick_scale:!1,category:"people"},sob:{keywords:["face","cry","tears","sad","upset","depressed"],char:"\ud83d\ude2d",fitzpatrick_scale:!1,category:"people"},dizzy_face:{keywords:["spent","unconscious","xox","dizzy"],char:"\ud83d\ude35",fitzpatrick_scale:!1,category:"people"},astonished:{keywords:["face","xox","surprised","poisoned"],char:"\ud83d\ude32",fitzpatrick_scale:!1,category:"people"},zipper_mouth_face:{keywords:["face","sealed","zipper","secret"],char:"\ud83e\udd10",fitzpatrick_scale:!1,category:"people"},nauseated_face:{keywords:["face","vomit","gross","green","sick","throw up","ill"],char:"\ud83e\udd22",fitzpatrick_scale:!1,category:"people"},sneezing_face:{keywords:["face","gesundheit","sneeze","sick","allergy"],char:"\ud83e\udd27",fitzpatrick_scale:!1,category:"people"},vomiting:{keywords:["face","sick"],char:"\ud83e\udd2e",fitzpatrick_scale:!1,category:"people"},mask:{keywords:["face","sick","ill","disease"],char:"\ud83d\ude37",fitzpatrick_scale:!1,category:"people"},face_with_thermometer:{keywords:["sick","temperature","thermometer","cold","fever"],char:"\ud83e\udd12",fitzpatrick_scale:!1,category:"people"},face_with_head_bandage:{keywords:["injured","clumsy","bandage","hurt"],char:"\ud83e\udd15",fitzpatrick_scale:!1,category:"people"},woozy:{keywords:["face","dizzy","intoxicated","tipsy","wavy"],char:"\ud83e\udd74",fitzpatrick_scale:!1,category:"people"},sleeping:{keywords:["face","tired","sleepy","night","zzz"],char:"\ud83d\ude34",fitzpatrick_scale:!1,category:"people"},zzz:{keywords:["sleepy","tired","dream"],char:"\ud83d\udca4",fitzpatrick_scale:!1,category:"people"},poop:{keywords:["hankey","shitface","fail","turd","shit"],char:"\ud83d\udca9",fitzpatrick_scale:!1,category:"people"},smiling_imp:{keywords:["devil","horns"],char:"\ud83d\ude08",fitzpatrick_scale:!1,category:"people"},imp:{keywords:["devil","angry","horns"],char:"\ud83d\udc7f",fitzpatrick_scale:!1,category:"people"},japanese_ogre:{keywords:["monster","red","mask","halloween","scary","creepy","devil","demon","japanese","ogre"],char:"\ud83d\udc79",fitzpatrick_scale:!1,category:"people"},japanese_goblin:{keywords:["red","evil","mask","monster","scary","creepy","japanese","goblin"],char:"\ud83d\udc7a",fitzpatrick_scale:!1,category:"people"},skull:{keywords:["dead","skeleton","creepy","death"],char:"\ud83d\udc80",fitzpatrick_scale:!1,category:"people"},ghost:{keywords:["halloween","spooky","scary"],char:"\ud83d\udc7b",fitzpatrick_scale:!1,category:"people"},alien:{keywords:["UFO","paul","weird","outer_space"],char:"\ud83d\udc7d",fitzpatrick_scale:!1,category:"people"},robot:{keywords:["computer","machine","bot"],char:"\ud83e\udd16",fitzpatrick_scale:!1,category:"people"},smiley_cat:{keywords:["animal","cats","happy","smile"],char:"\ud83d\ude3a",fitzpatrick_scale:!1,category:"people"},smile_cat:{keywords:["animal","cats","smile"],char:"\ud83d\ude38",fitzpatrick_scale:!1,category:"people"},joy_cat:{keywords:["animal","cats","haha","happy","tears"],char:"\ud83d\ude39",fitzpatrick_scale:!1,category:"people"},heart_eyes_cat:{keywords:["animal","love","like","affection","cats","valentines","heart"],char:"\ud83d\ude3b",fitzpatrick_scale:!1,category:"people"},smirk_cat:{keywords:["animal","cats","smirk"],char:"\ud83d\ude3c",fitzpatrick_scale:!1,category:"people"},kissing_cat:{keywords:["animal","cats","kiss"],char:"\ud83d\ude3d",fitzpatrick_scale:!1,category:"people"},scream_cat:{keywords:["animal","cats","munch","scared","scream"],char:"\ud83d\ude40",fitzpatrick_scale:!1,category:"people"},crying_cat_face:{keywords:["animal","tears","weep","sad","cats","upset","cry"],char:"\ud83d\ude3f",fitzpatrick_scale:!1,category:"people"},pouting_cat:{keywords:["animal","cats"],char:"\ud83d\ude3e",fitzpatrick_scale:!1,category:"people"},palms_up:{keywords:["hands","gesture","cupped","prayer"],char:"\ud83e\udd32",fitzpatrick_scale:!0,category:"people"},raised_hands:{keywords:["gesture","hooray","yea","celebration","hands"],char:"\ud83d\ude4c",fitzpatrick_scale:!0,category:"people"},clap:{keywords:["hands","praise","applause","congrats","yay"],char:"\ud83d\udc4f",fitzpatrick_scale:!0,category:"people"},wave:{keywords:["hands","gesture","goodbye","solong","farewell","hello","hi","palm"],char:"\ud83d\udc4b",fitzpatrick_scale:!0,category:"people"},call_me_hand:{keywords:["hands","gesture"],char:"\ud83e\udd19",fitzpatrick_scale:!0,category:"people"},"+1":{keywords:["thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],char:"\ud83d\udc4d",fitzpatrick_scale:!0,category:"people"},"-1":{keywords:["thumbsdown","no","dislike","hand"],char:"\ud83d\udc4e",fitzpatrick_scale:!0,category:"people"},facepunch:{keywords:["angry","violence","fist","hit","attack","hand"],char:"\ud83d\udc4a",fitzpatrick_scale:!0,category:"people"},fist:{keywords:["fingers","hand","grasp"],char:"\u270a",fitzpatrick_scale:!0,category:"people"},fist_left:{keywords:["hand","fistbump"],char:"\ud83e\udd1b",fitzpatrick_scale:!0,category:"people"},fist_right:{keywords:["hand","fistbump"],char:"\ud83e\udd1c",fitzpatrick_scale:!0,category:"people"},v:{keywords:["fingers","ohyeah","hand","peace","victory","two"],char:"\u270c",fitzpatrick_scale:!0,category:"people"},ok_hand:{keywords:["fingers","limbs","perfect","ok","okay"],char:"\ud83d\udc4c",fitzpatrick_scale:!0,category:"people"},raised_hand:{keywords:["fingers","stop","highfive","palm","ban"],char:"\u270b",fitzpatrick_scale:!0,category:"people"},raised_back_of_hand:{keywords:["fingers","raised","backhand"],char:"\ud83e\udd1a",fitzpatrick_scale:!0,category:"people"},open_hands:{keywords:["fingers","butterfly","hands","open"],char:"\ud83d\udc50",fitzpatrick_scale:!0,category:"people"},muscle:{keywords:["arm","flex","hand","summer","strong","biceps"],char:"\ud83d\udcaa",fitzpatrick_scale:!0,category:"people"},pray:{keywords:["please","hope","wish","namaste","highfive"],char:"\ud83d\ude4f",fitzpatrick_scale:!0,category:"people"},foot:{keywords:["kick","stomp"],char:"\ud83e\uddb6",fitzpatrick_scale:!0,category:"people"},leg:{keywords:["kick","limb"],char:"\ud83e\uddb5",fitzpatrick_scale:!0,category:"people"},handshake:{keywords:["agreement","shake"],char:"\ud83e\udd1d",fitzpatrick_scale:!1,category:"people"},point_up:{keywords:["hand","fingers","direction","up"],char:"\u261d",fitzpatrick_scale:!0,category:"people"},point_up_2:{keywords:["fingers","hand","direction","up"],char:"\ud83d\udc46",fitzpatrick_scale:!0,category:"people"},point_down:{keywords:["fingers","hand","direction","down"],char:"\ud83d\udc47",fitzpatrick_scale:!0,category:"people"},point_left:{keywords:["direction","fingers","hand","left"],char:"\ud83d\udc48",fitzpatrick_scale:!0,category:"people"},point_right:{keywords:["fingers","hand","direction","right"],char:"\ud83d\udc49",fitzpatrick_scale:!0,category:"people"},fu:{keywords:["hand","fingers","rude","middle","flipping"],char:"\ud83d\udd95",fitzpatrick_scale:!0,category:"people"},raised_hand_with_fingers_splayed:{keywords:["hand","fingers","palm"],char:"\ud83d\udd90",fitzpatrick_scale:!0,category:"people"},love_you:{keywords:["hand","fingers","gesture"],char:"\ud83e\udd1f",fitzpatrick_scale:!0,category:"people"},metal:{keywords:["hand","fingers","evil_eye","sign_of_horns","rock_on"],char:"\ud83e\udd18",fitzpatrick_scale:!0,category:"people"},crossed_fingers:{keywords:["good","lucky"],char:"\ud83e\udd1e",fitzpatrick_scale:!0,category:"people"},vulcan_salute:{keywords:["hand","fingers","spock","star trek"],char:"\ud83d\udd96",fitzpatrick_scale:!0,category:"people"},writing_hand:{keywords:["lower_left_ballpoint_pen","stationery","write","compose"],char:"\u270d",fitzpatrick_scale:!0,category:"people"},selfie:{keywords:["camera","phone"],char:"\ud83e\udd33",fitzpatrick_scale:!0,category:"people"},nail_care:{keywords:["beauty","manicure","finger","fashion","nail"],char:"\ud83d\udc85",fitzpatrick_scale:!0,category:"people"},lips:{keywords:["mouth","kiss"],char:"\ud83d\udc44",fitzpatrick_scale:!1,category:"people"},tooth:{keywords:["teeth","dentist"],char:"\ud83e\uddb7",fitzpatrick_scale:!1,category:"people"},tongue:{keywords:["mouth","playful"],char:"\ud83d\udc45",fitzpatrick_scale:!1,category:"people"},ear:{keywords:["face","hear","sound","listen"],char:"\ud83d\udc42",fitzpatrick_scale:!0,category:"people"},nose:{keywords:["smell","sniff"],char:"\ud83d\udc43",fitzpatrick_scale:!0,category:"people"},eye:{keywords:["face","look","see","watch","stare"],char:"\ud83d\udc41",fitzpatrick_scale:!1,category:"people"},eyes:{keywords:["look","watch","stalk","peek","see"],char:"\ud83d\udc40",fitzpatrick_scale:!1,category:"people"},brain:{keywords:["smart","intelligent"],char:"\ud83e\udde0",fitzpatrick_scale:!1,category:"people"},bust_in_silhouette:{keywords:["user","person","human"],char:"\ud83d\udc64",fitzpatrick_scale:!1,category:"people"},busts_in_silhouette:{keywords:["user","person","human","group","team"],char:"\ud83d\udc65",fitzpatrick_scale:!1,category:"people"},speaking_head:{keywords:["user","person","human","sing","say","talk"],char:"\ud83d\udde3",fitzpatrick_scale:!1,category:"people"},baby:{keywords:["child","boy","girl","toddler"],char:"\ud83d\udc76",fitzpatrick_scale:!0,category:"people"},child:{keywords:["gender-neutral","young"],char:"\ud83e\uddd2",fitzpatrick_scale:!0,category:"people"},boy:{keywords:["man","male","guy","teenager"],char:"\ud83d\udc66",fitzpatrick_scale:!0,category:"people"},girl:{keywords:["female","woman","teenager"],char:"\ud83d\udc67",fitzpatrick_scale:!0,category:"people"},adult:{keywords:["gender-neutral","person"],char:"\ud83e\uddd1",fitzpatrick_scale:!0,category:"people"},man:{keywords:["mustache","father","dad","guy","classy","sir","moustache"],char:"\ud83d\udc68",fitzpatrick_scale:!0,category:"people"},woman:{keywords:["female","girls","lady"],char:"\ud83d\udc69",fitzpatrick_scale:!0,category:"people"},blonde_woman:{keywords:["woman","female","girl","blonde","person"],char:"\ud83d\udc71\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},blonde_man:{keywords:["man","male","boy","blonde","guy","person"],char:"\ud83d\udc71",fitzpatrick_scale:!0,category:"people"},bearded_person:{keywords:["person","bewhiskered"],char:"\ud83e\uddd4",fitzpatrick_scale:!0,category:"people"},older_adult:{keywords:["human","elder","senior","gender-neutral"],char:"\ud83e\uddd3",fitzpatrick_scale:!0,category:"people"},older_man:{keywords:["human","male","men","old","elder","senior"],char:"\ud83d\udc74",fitzpatrick_scale:!0,category:"people"},older_woman:{keywords:["human","female","women","lady","old","elder","senior"],char:"\ud83d\udc75",fitzpatrick_scale:!0,category:"people"},man_with_gua_pi_mao:{keywords:["male","boy","chinese"],char:"\ud83d\udc72",fitzpatrick_scale:!0,category:"people"},woman_with_headscarf:{keywords:["female","hijab","mantilla","tichel"],char:"\ud83e\uddd5",fitzpatrick_scale:!0,category:"people"},woman_with_turban:{keywords:["female","indian","hinduism","arabs","woman"],char:"\ud83d\udc73\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_with_turban:{keywords:["male","indian","hinduism","arabs"],char:"\ud83d\udc73",fitzpatrick_scale:!0,category:"people"},policewoman:{keywords:["woman","police","law","legal","enforcement","arrest","911","female"],char:"\ud83d\udc6e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},policeman:{keywords:["man","police","law","legal","enforcement","arrest","911"],char:"\ud83d\udc6e",fitzpatrick_scale:!0,category:"people"},construction_worker_woman:{keywords:["female","human","wip","build","construction","worker","labor","woman"],char:"\ud83d\udc77\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},construction_worker_man:{keywords:["male","human","wip","guy","build","construction","worker","labor"],char:"\ud83d\udc77",fitzpatrick_scale:!0,category:"people"},guardswoman:{keywords:["uk","gb","british","female","royal","woman"],char:"\ud83d\udc82\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},guardsman:{keywords:["uk","gb","british","male","guy","royal"],char:"\ud83d\udc82",fitzpatrick_scale:!0,category:"people"},female_detective:{keywords:["human","spy","detective","female","woman"],char:"\ud83d\udd75\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},male_detective:{keywords:["human","spy","detective"],char:"\ud83d\udd75",fitzpatrick_scale:!0,category:"people"},woman_health_worker:{keywords:["doctor","nurse","therapist","healthcare","woman","human"],char:"\ud83d\udc69\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},man_health_worker:{keywords:["doctor","nurse","therapist","healthcare","man","human"],char:"\ud83d\udc68\u200d\u2695\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_farmer:{keywords:["rancher","gardener","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},man_farmer:{keywords:["rancher","gardener","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf3e",fitzpatrick_scale:!0,category:"people"},woman_cook:{keywords:["chef","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},man_cook:{keywords:["chef","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf73",fitzpatrick_scale:!0,category:"people"},woman_student:{keywords:["graduate","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},man_student:{keywords:["graduate","man","human"],char:"\ud83d\udc68\u200d\ud83c\udf93",fitzpatrick_scale:!0,category:"people"},woman_singer:{keywords:["rockstar","entertainer","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},man_singer:{keywords:["rockstar","entertainer","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa4",fitzpatrick_scale:!0,category:"people"},woman_teacher:{keywords:["instructor","professor","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},man_teacher:{keywords:["instructor","professor","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfeb",fitzpatrick_scale:!0,category:"people"},woman_factory_worker:{keywords:["assembly","industrial","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},man_factory_worker:{keywords:["assembly","industrial","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfed",fitzpatrick_scale:!0,category:"people"},woman_technologist:{keywords:["coder","developer","engineer","programmer","software","woman","human","laptop","computer"],char:"\ud83d\udc69\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},man_technologist:{keywords:["coder","developer","engineer","programmer","software","man","human","laptop","computer"],char:"\ud83d\udc68\u200d\ud83d\udcbb",fitzpatrick_scale:!0,category:"people"},woman_office_worker:{keywords:["business","manager","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},man_office_worker:{keywords:["business","manager","man","human"],char:"\ud83d\udc68\u200d\ud83d\udcbc",fitzpatrick_scale:!0,category:"people"},woman_mechanic:{keywords:["plumber","woman","human","wrench"],char:"\ud83d\udc69\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},man_mechanic:{keywords:["plumber","man","human","wrench"],char:"\ud83d\udc68\u200d\ud83d\udd27",fitzpatrick_scale:!0,category:"people"},woman_scientist:{keywords:["biologist","chemist","engineer","physicist","woman","human"],char:"\ud83d\udc69\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},man_scientist:{keywords:["biologist","chemist","engineer","physicist","man","human"],char:"\ud83d\udc68\u200d\ud83d\udd2c",fitzpatrick_scale:!0,category:"people"},woman_artist:{keywords:["painter","woman","human"],char:"\ud83d\udc69\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},man_artist:{keywords:["painter","man","human"],char:"\ud83d\udc68\u200d\ud83c\udfa8",fitzpatrick_scale:!0,category:"people"},woman_firefighter:{keywords:["fireman","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},man_firefighter:{keywords:["fireman","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude92",fitzpatrick_scale:!0,category:"people"},woman_pilot:{keywords:["aviator","plane","woman","human"],char:"\ud83d\udc69\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},man_pilot:{keywords:["aviator","plane","man","human"],char:"\ud83d\udc68\u200d\u2708\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_astronaut:{keywords:["space","rocket","woman","human"],char:"\ud83d\udc69\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},man_astronaut:{keywords:["space","rocket","man","human"],char:"\ud83d\udc68\u200d\ud83d\ude80",fitzpatrick_scale:!0,category:"people"},woman_judge:{keywords:["justice","court","woman","human"],char:"\ud83d\udc69\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},man_judge:{keywords:["justice","court","man","human"],char:"\ud83d\udc68\u200d\u2696\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_superhero:{keywords:["woman","female","good","heroine","superpowers"],char:"\ud83e\uddb8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_superhero:{keywords:["man","male","good","hero","superpowers"],char:"\ud83e\uddb8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_supervillain:{keywords:["woman","female","evil","bad","criminal","heroine","superpowers"],char:"\ud83e\uddb9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_supervillain:{keywords:["man","male","evil","bad","criminal","hero","superpowers"],char:"\ud83e\uddb9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},mrs_claus:{keywords:["woman","female","xmas","mother christmas"],char:"\ud83e\udd36",fitzpatrick_scale:!0,category:"people"},santa:{keywords:["festival","man","male","xmas","father christmas"],char:"\ud83c\udf85",fitzpatrick_scale:!0,category:"people"},sorceress:{keywords:["woman","female","mage","witch"],char:"\ud83e\uddd9\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},wizard:{keywords:["man","male","mage","sorcerer"],char:"\ud83e\uddd9\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_elf:{keywords:["woman","female"],char:"\ud83e\udddd\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_elf:{keywords:["man","male"],char:"\ud83e\udddd\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_vampire:{keywords:["woman","female"],char:"\ud83e\udddb\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_vampire:{keywords:["man","male","dracula"],char:"\ud83e\udddb\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_zombie:{keywords:["woman","female","undead","walking dead"],char:"\ud83e\udddf\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_zombie:{keywords:["man","male","dracula","undead","walking dead"],char:"\ud83e\udddf\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},woman_genie:{keywords:["woman","female"],char:"\ud83e\uddde\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"people"},man_genie:{keywords:["man","male"],char:"\ud83e\uddde\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},mermaid:{keywords:["woman","female","merwoman","ariel"],char:"\ud83e\udddc\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},merman:{keywords:["man","male","triton"],char:"\ud83e\udddc\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_fairy:{keywords:["woman","female"],char:"\ud83e\uddda\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_fairy:{keywords:["man","male"],char:"\ud83e\uddda\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},angel:{keywords:["heaven","wings","halo"],char:"\ud83d\udc7c",fitzpatrick_scale:!0,category:"people"},pregnant_woman:{keywords:["baby"],char:"\ud83e\udd30",fitzpatrick_scale:!0,category:"people"},breastfeeding:{keywords:["nursing","baby"],char:"\ud83e\udd31",fitzpatrick_scale:!0,category:"people"},princess:{keywords:["girl","woman","female","blond","crown","royal","queen"],char:"\ud83d\udc78",fitzpatrick_scale:!0,category:"people"},prince:{keywords:["boy","man","male","crown","royal","king"],char:"\ud83e\udd34",fitzpatrick_scale:!0,category:"people"},bride_with_veil:{keywords:["couple","marriage","wedding","woman","bride"],char:"\ud83d\udc70",fitzpatrick_scale:!0,category:"people"},man_in_tuxedo:{keywords:["couple","marriage","wedding","groom"],char:"\ud83e\udd35",fitzpatrick_scale:!0,category:"people"},running_woman:{keywords:["woman","walking","exercise","race","running","female"],char:"\ud83c\udfc3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},running_man:{keywords:["man","walking","exercise","race","running"],char:"\ud83c\udfc3",fitzpatrick_scale:!0,category:"people"},walking_woman:{keywords:["human","feet","steps","woman","female"],char:"\ud83d\udeb6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},walking_man:{keywords:["human","feet","steps"],char:"\ud83d\udeb6",fitzpatrick_scale:!0,category:"people"},dancer:{keywords:["female","girl","woman","fun"],char:"\ud83d\udc83",fitzpatrick_scale:!0,category:"people"},man_dancing:{keywords:["male","boy","fun","dancer"],char:"\ud83d\udd7a",fitzpatrick_scale:!0,category:"people"},dancing_women:{keywords:["female","bunny","women","girls"],char:"\ud83d\udc6f",fitzpatrick_scale:!1,category:"people"},dancing_men:{keywords:["male","bunny","men","boys"],char:"\ud83d\udc6f\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"people"},couple:{keywords:["pair","people","human","love","date","dating","like","affection","valentines","marriage"],char:"\ud83d\udc6b",fitzpatrick_scale:!1,category:"people"},two_men_holding_hands:{keywords:["pair","couple","love","like","bromance","friendship","people","human"],char:"\ud83d\udc6c",fitzpatrick_scale:!1,category:"people"},two_women_holding_hands:{keywords:["pair","friendship","couple","love","like","female","people","human"],char:"\ud83d\udc6d",fitzpatrick_scale:!1,category:"people"},bowing_woman:{keywords:["woman","female","girl"],char:"\ud83d\ude47\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},bowing_man:{keywords:["man","male","boy"],char:"\ud83d\ude47",fitzpatrick_scale:!0,category:"people"},man_facepalming:{keywords:["man","male","boy","disbelief"],char:"\ud83e\udd26\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_facepalming:{keywords:["woman","female","girl","disbelief"],char:"\ud83e\udd26\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_shrugging:{keywords:["woman","female","girl","confused","indifferent","doubt"],char:"\ud83e\udd37",fitzpatrick_scale:!0,category:"people"},man_shrugging:{keywords:["man","male","boy","confused","indifferent","doubt"],char:"\ud83e\udd37\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},tipping_hand_woman:{keywords:["female","girl","woman","human","information"],char:"\ud83d\udc81",fitzpatrick_scale:!0,category:"people"},tipping_hand_man:{keywords:["male","boy","man","human","information"],char:"\ud83d\udc81\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},no_good_woman:{keywords:["female","girl","woman","nope"],char:"\ud83d\ude45",fitzpatrick_scale:!0,category:"people"},no_good_man:{keywords:["male","boy","man","nope"],char:"\ud83d\ude45\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},ok_woman:{keywords:["women","girl","female","pink","human","woman"],char:"\ud83d\ude46",fitzpatrick_scale:!0,category:"people"},ok_man:{keywords:["men","boy","male","blue","human","man"],char:"\ud83d\ude46\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},raising_hand_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4b",fitzpatrick_scale:!0,category:"people"},raising_hand_man:{keywords:["male","boy","man"],char:"\ud83d\ude4b\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},pouting_woman:{keywords:["female","girl","woman"],char:"\ud83d\ude4e",fitzpatrick_scale:!0,category:"people"},pouting_man:{keywords:["male","boy","man"],char:"\ud83d\ude4e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},frowning_woman:{keywords:["female","girl","woman","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d",fitzpatrick_scale:!0,category:"people"},frowning_man:{keywords:["male","boy","man","sad","depressed","discouraged","unhappy"],char:"\ud83d\ude4d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},haircut_woman:{keywords:["female","girl","woman"],char:"\ud83d\udc87",fitzpatrick_scale:!0,category:"people"},haircut_man:{keywords:["male","boy","man"],char:"\ud83d\udc87\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},massage_woman:{keywords:["female","girl","woman","head"],char:"\ud83d\udc86",fitzpatrick_scale:!0,category:"people"},massage_man:{keywords:["male","boy","man","head"],char:"\ud83d\udc86\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},woman_in_steamy_room:{keywords:["female","woman","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"people"},man_in_steamy_room:{keywords:["male","man","spa","steamroom","sauna"],char:"\ud83e\uddd6\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"people"},couple_with_heart_woman_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc91",fitzpatrick_scale:!1,category:"people"},couple_with_heart_woman_woman:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couple_with_heart_man_man:{keywords:["pair","love","like","affection","human","dating","valentines","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},couplekiss_man_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc8f",fitzpatrick_scale:!1,category:"people"},couplekiss_woman_woman:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69",fitzpatrick_scale:!1,category:"people"},couplekiss_man_man:{keywords:["pair","valentines","love","like","dating","marriage"],char:"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy:{keywords:["home","parents","child","mom","dad","father","mother","people","human"],char:"\ud83d\udc6a",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl:{keywords:["home","parents","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_woman_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_boy_boy:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_man_girl_girl:{keywords:["home","parents","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc69\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_woman_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_woman_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_boy:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl:{keywords:["home","parent","people","human","child"],char:"\ud83d\udc68\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},family_man_girl_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_boy_boy:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66",fitzpatrick_scale:!1,category:"people"},family_man_girl_girl:{keywords:["home","parent","people","human","children"],char:"\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67",fitzpatrick_scale:!1,category:"people"},yarn:{keywords:["ball","crochet","knit"],char:"\ud83e\uddf6",fitzpatrick_scale:!1,category:"people"},thread:{keywords:["needle","sewing","spool","string"],char:"\ud83e\uddf5",fitzpatrick_scale:!1,category:"people"},coat:{keywords:["jacket"],char:"\ud83e\udde5",fitzpatrick_scale:!1,category:"people"},labcoat:{keywords:["doctor","experiment","scientist","chemist"],char:"\ud83e\udd7c",fitzpatrick_scale:!1,category:"people"},womans_clothes:{keywords:["fashion","shopping_bags","female"],char:"\ud83d\udc5a",fitzpatrick_scale:!1,category:"people"},tshirt:{keywords:["fashion","cloth","casual","shirt","tee"],char:"\ud83d\udc55",fitzpatrick_scale:!1,category:"people"},jeans:{keywords:["fashion","shopping"],char:"\ud83d\udc56",fitzpatrick_scale:!1,category:"people"},necktie:{keywords:["shirt","suitup","formal","fashion","cloth","business"],char:"\ud83d\udc54",fitzpatrick_scale:!1,category:"people"},dress:{keywords:["clothes","fashion","shopping"],char:"\ud83d\udc57",fitzpatrick_scale:!1,category:"people"},bikini:{keywords:["swimming","female","woman","girl","fashion","beach","summer"],char:"\ud83d\udc59",fitzpatrick_scale:!1,category:"people"},kimono:{keywords:["dress","fashion","women","female","japanese"],char:"\ud83d\udc58",fitzpatrick_scale:!1,category:"people"},lipstick:{keywords:["female","girl","fashion","woman"],char:"\ud83d\udc84",fitzpatrick_scale:!1,category:"people"},kiss:{keywords:["face","lips","love","like","affection","valentines"],char:"\ud83d\udc8b",fitzpatrick_scale:!1,category:"people"},footprints:{keywords:["feet","tracking","walking","beach"],char:"\ud83d\udc63",fitzpatrick_scale:!1,category:"people"},flat_shoe:{keywords:["ballet","slip-on","slipper"],char:"\ud83e\udd7f",fitzpatrick_scale:!1,category:"people"},high_heel:{keywords:["fashion","shoes","female","pumps","stiletto"],char:"\ud83d\udc60",fitzpatrick_scale:!1,category:"people"},sandal:{keywords:["shoes","fashion","flip flops"],char:"\ud83d\udc61",fitzpatrick_scale:!1,category:"people"},boot:{keywords:["shoes","fashion"],char:"\ud83d\udc62",fitzpatrick_scale:!1,category:"people"},mans_shoe:{keywords:["fashion","male"],char:"\ud83d\udc5e",fitzpatrick_scale:!1,category:"people"},athletic_shoe:{keywords:["shoes","sports","sneakers"],char:"\ud83d\udc5f",fitzpatrick_scale:!1,category:"people"},hiking_boot:{keywords:["backpacking","camping","hiking"],char:"\ud83e\udd7e",fitzpatrick_scale:!1,category:"people"},socks:{keywords:["stockings","clothes"],char:"\ud83e\udde6",fitzpatrick_scale:!1,category:"people"},gloves:{keywords:["hands","winter","clothes"],char:"\ud83e\udde4",fitzpatrick_scale:!1,category:"people"},scarf:{keywords:["neck","winter","clothes"],char:"\ud83e\udde3",fitzpatrick_scale:!1,category:"people"},womans_hat:{keywords:["fashion","accessories","female","lady","spring"],char:"\ud83d\udc52",fitzpatrick_scale:!1,category:"people"},tophat:{keywords:["magic","gentleman","classy","circus"],char:"\ud83c\udfa9",fitzpatrick_scale:!1,category:"people"},billed_hat:{keywords:["cap","baseball"],char:"\ud83e\udde2",fitzpatrick_scale:!1,category:"people"},rescue_worker_helmet:{keywords:["construction","build"],char:"\u26d1",fitzpatrick_scale:!1,category:"people"},mortar_board:{keywords:["school","college","degree","university","graduation","cap","hat","legal","learn","education"],char:"\ud83c\udf93",fitzpatrick_scale:!1,category:"people"},crown:{keywords:["king","kod","leader","royalty","lord"],char:"\ud83d\udc51",fitzpatrick_scale:!1,category:"people"},school_satchel:{keywords:["student","education","bag","backpack"],char:"\ud83c\udf92",fitzpatrick_scale:!1,category:"people"},luggage:{keywords:["packing","travel"],char:"\ud83e\uddf3",fitzpatrick_scale:!1,category:"people"},pouch:{keywords:["bag","accessories","shopping"],char:"\ud83d\udc5d",fitzpatrick_scale:!1,category:"people"},purse:{keywords:["fashion","accessories","money","sales","shopping"],char:"\ud83d\udc5b",fitzpatrick_scale:!1,category:"people"},handbag:{keywords:["fashion","accessory","accessories","shopping"],char:"\ud83d\udc5c",fitzpatrick_scale:!1,category:"people"},briefcase:{keywords:["business","documents","work","law","legal","job","career"],char:"\ud83d\udcbc",fitzpatrick_scale:!1,category:"people"},eyeglasses:{keywords:["fashion","accessories","eyesight","nerdy","dork","geek"],char:"\ud83d\udc53",fitzpatrick_scale:!1,category:"people"},dark_sunglasses:{keywords:["face","cool","accessories"],char:"\ud83d\udd76",fitzpatrick_scale:!1,category:"people"},goggles:{keywords:["eyes","protection","safety"],char:"\ud83e\udd7d",fitzpatrick_scale:!1,category:"people"},ring:{keywords:["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],char:"\ud83d\udc8d",fitzpatrick_scale:!1,category:"people"},closed_umbrella:{keywords:["weather","rain","drizzle"],char:"\ud83c\udf02",fitzpatrick_scale:!1,category:"people"},dog:{keywords:["animal","friend","nature","woof","puppy","pet","faithful"],char:"\ud83d\udc36",fitzpatrick_scale:!1,category:"animals_and_nature"},cat:{keywords:["animal","meow","nature","pet","kitten"],char:"\ud83d\udc31",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse:{keywords:["animal","nature","cheese_wedge","rodent"],char:"\ud83d\udc2d",fitzpatrick_scale:!1,category:"animals_and_nature"},hamster:{keywords:["animal","nature"],char:"\ud83d\udc39",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit:{keywords:["animal","nature","pet","spring","magic","bunny"],char:"\ud83d\udc30",fitzpatrick_scale:!1,category:"animals_and_nature"},fox_face:{keywords:["animal","nature","face"],char:"\ud83e\udd8a",fitzpatrick_scale:!1,category:"animals_and_nature"},bear:{keywords:["animal","nature","wild"],char:"\ud83d\udc3b",fitzpatrick_scale:!1,category:"animals_and_nature"},panda_face:{keywords:["animal","nature","panda"],char:"\ud83d\udc3c",fitzpatrick_scale:!1,category:"animals_and_nature"},koala:{keywords:["animal","nature"],char:"\ud83d\udc28",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger:{keywords:["animal","cat","danger","wild","nature","roar"],char:"\ud83d\udc2f",fitzpatrick_scale:!1,category:"animals_and_nature"},lion:{keywords:["animal","nature"],char:"\ud83e\udd81",fitzpatrick_scale:!1,category:"animals_and_nature"},cow:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc2e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig:{keywords:["animal","oink","nature"],char:"\ud83d\udc37",fitzpatrick_scale:!1,category:"animals_and_nature"},pig_nose:{keywords:["animal","oink"],char:"\ud83d\udc3d",fitzpatrick_scale:!1,category:"animals_and_nature"},frog:{keywords:["animal","nature","croak","toad"],char:"\ud83d\udc38",fitzpatrick_scale:!1,category:"animals_and_nature"},squid:{keywords:["animal","nature","ocean","sea"],char:"\ud83e\udd91",fitzpatrick_scale:!1,category:"animals_and_nature"},octopus:{keywords:["animal","creature","ocean","sea","nature","beach"],char:"\ud83d\udc19",fitzpatrick_scale:!1,category:"animals_and_nature"},shrimp:{keywords:["animal","ocean","nature","seafood"],char:"\ud83e\udd90",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey_face:{keywords:["animal","nature","circus"],char:"\ud83d\udc35",fitzpatrick_scale:!1,category:"animals_and_nature"},gorilla:{keywords:["animal","nature","circus"],char:"\ud83e\udd8d",fitzpatrick_scale:!1,category:"animals_and_nature"},see_no_evil:{keywords:["monkey","animal","nature","haha"],char:"\ud83d\ude48",fitzpatrick_scale:!1,category:"animals_and_nature"},hear_no_evil:{keywords:["animal","monkey","nature"],char:"\ud83d\ude49",fitzpatrick_scale:!1,category:"animals_and_nature"},speak_no_evil:{keywords:["monkey","animal","nature","omg"],char:"\ud83d\ude4a",fitzpatrick_scale:!1,category:"animals_and_nature"},monkey:{keywords:["animal","nature","banana","circus"],char:"\ud83d\udc12",fitzpatrick_scale:!1,category:"animals_and_nature"},chicken:{keywords:["animal","cluck","nature","bird"],char:"\ud83d\udc14",fitzpatrick_scale:!1,category:"animals_and_nature"},penguin:{keywords:["animal","nature"],char:"\ud83d\udc27",fitzpatrick_scale:!1,category:"animals_and_nature"},bird:{keywords:["animal","nature","fly","tweet","spring"],char:"\ud83d\udc26",fitzpatrick_scale:!1,category:"animals_and_nature"},baby_chick:{keywords:["animal","chicken","bird"],char:"\ud83d\udc24",fitzpatrick_scale:!1,category:"animals_and_nature"},hatching_chick:{keywords:["animal","chicken","egg","born","baby","bird"],char:"\ud83d\udc23",fitzpatrick_scale:!1,category:"animals_and_nature"},hatched_chick:{keywords:["animal","chicken","baby","bird"],char:"\ud83d\udc25",fitzpatrick_scale:!1,category:"animals_and_nature"},duck:{keywords:["animal","nature","bird","mallard"],char:"\ud83e\udd86",fitzpatrick_scale:!1,category:"animals_and_nature"},eagle:{keywords:["animal","nature","bird"],char:"\ud83e\udd85",fitzpatrick_scale:!1,category:"animals_and_nature"},owl:{keywords:["animal","nature","bird","hoot"],char:"\ud83e\udd89",fitzpatrick_scale:!1,category:"animals_and_nature"},bat:{keywords:["animal","nature","blind","vampire"],char:"\ud83e\udd87",fitzpatrick_scale:!1,category:"animals_and_nature"},wolf:{keywords:["animal","nature","wild"],char:"\ud83d\udc3a",fitzpatrick_scale:!1,category:"animals_and_nature"},boar:{keywords:["animal","nature"],char:"\ud83d\udc17",fitzpatrick_scale:!1,category:"animals_and_nature"},horse:{keywords:["animal","brown","nature"],char:"\ud83d\udc34",fitzpatrick_scale:!1,category:"animals_and_nature"},unicorn:{keywords:["animal","nature","mystical"],char:"\ud83e\udd84",fitzpatrick_scale:!1,category:"animals_and_nature"},honeybee:{keywords:["animal","insect","nature","bug","spring","honey"],char:"\ud83d\udc1d",fitzpatrick_scale:!1,category:"animals_and_nature"},bug:{keywords:["animal","insect","nature","worm"],char:"\ud83d\udc1b",fitzpatrick_scale:!1,category:"animals_and_nature"},butterfly:{keywords:["animal","insect","nature","caterpillar"],char:"\ud83e\udd8b",fitzpatrick_scale:!1,category:"animals_and_nature"},snail:{keywords:["slow","animal","shell"],char:"\ud83d\udc0c",fitzpatrick_scale:!1,category:"animals_and_nature"},beetle:{keywords:["animal","insect","nature","ladybug"],char:"\ud83d\udc1e",fitzpatrick_scale:!1,category:"animals_and_nature"},ant:{keywords:["animal","insect","nature","bug"],char:"\ud83d\udc1c",fitzpatrick_scale:!1,category:"animals_and_nature"},grasshopper:{keywords:["animal","cricket","chirp"],char:"\ud83e\udd97",fitzpatrick_scale:!1,category:"animals_and_nature"},spider:{keywords:["animal","arachnid"],char:"\ud83d\udd77",fitzpatrick_scale:!1,category:"animals_and_nature"},scorpion:{keywords:["animal","arachnid"],char:"\ud83e\udd82",fitzpatrick_scale:!1,category:"animals_and_nature"},crab:{keywords:["animal","crustacean"],char:"\ud83e\udd80",fitzpatrick_scale:!1,category:"animals_and_nature"},snake:{keywords:["animal","evil","nature","hiss","python"],char:"\ud83d\udc0d",fitzpatrick_scale:!1,category:"animals_and_nature"},lizard:{keywords:["animal","nature","reptile"],char:"\ud83e\udd8e",fitzpatrick_scale:!1,category:"animals_and_nature"},"t-rex":{keywords:["animal","nature","dinosaur","tyrannosaurus","extinct"],char:"\ud83e\udd96",fitzpatrick_scale:!1,category:"animals_and_nature"},sauropod:{keywords:["animal","nature","dinosaur","brachiosaurus","brontosaurus","diplodocus","extinct"],char:"\ud83e\udd95",fitzpatrick_scale:!1,category:"animals_and_nature"},turtle:{keywords:["animal","slow","nature","tortoise"],char:"\ud83d\udc22",fitzpatrick_scale:!1,category:"animals_and_nature"},tropical_fish:{keywords:["animal","swim","ocean","beach","nemo"],char:"\ud83d\udc20",fitzpatrick_scale:!1,category:"animals_and_nature"},fish:{keywords:["animal","food","nature"],char:"\ud83d\udc1f",fitzpatrick_scale:!1,category:"animals_and_nature"},blowfish:{keywords:["animal","nature","food","sea","ocean"],char:"\ud83d\udc21",fitzpatrick_scale:!1,category:"animals_and_nature"},dolphin:{keywords:["animal","nature","fish","sea","ocean","flipper","fins","beach"],char:"\ud83d\udc2c",fitzpatrick_scale:!1,category:"animals_and_nature"},shark:{keywords:["animal","nature","fish","sea","ocean","jaws","fins","beach"],char:"\ud83e\udd88",fitzpatrick_scale:!1,category:"animals_and_nature"},whale:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc33",fitzpatrick_scale:!1,category:"animals_and_nature"},whale2:{keywords:["animal","nature","sea","ocean"],char:"\ud83d\udc0b",fitzpatrick_scale:!1,category:"animals_and_nature"},crocodile:{keywords:["animal","nature","reptile","lizard","alligator"],char:"\ud83d\udc0a",fitzpatrick_scale:!1,category:"animals_and_nature"},leopard:{keywords:["animal","nature"],char:"\ud83d\udc06",fitzpatrick_scale:!1,category:"animals_and_nature"},zebra:{keywords:["animal","nature","stripes","safari"],char:"\ud83e\udd93",fitzpatrick_scale:!1,category:"animals_and_nature"},tiger2:{keywords:["animal","nature","roar"],char:"\ud83d\udc05",fitzpatrick_scale:!1,category:"animals_and_nature"},water_buffalo:{keywords:["animal","nature","ox","cow"],char:"\ud83d\udc03",fitzpatrick_scale:!1,category:"animals_and_nature"},ox:{keywords:["animal","cow","beef"],char:"\ud83d\udc02",fitzpatrick_scale:!1,category:"animals_and_nature"},cow2:{keywords:["beef","ox","animal","nature","moo","milk"],char:"\ud83d\udc04",fitzpatrick_scale:!1,category:"animals_and_nature"},deer:{keywords:["animal","nature","horns","venison"],char:"\ud83e\udd8c",fitzpatrick_scale:!1,category:"animals_and_nature"},dromedary_camel:{keywords:["animal","hot","desert","hump"],char:"\ud83d\udc2a",fitzpatrick_scale:!1,category:"animals_and_nature"},camel:{keywords:["animal","nature","hot","desert","hump"],char:"\ud83d\udc2b",fitzpatrick_scale:!1,category:"animals_and_nature"},giraffe:{keywords:["animal","nature","spots","safari"],char:"\ud83e\udd92",fitzpatrick_scale:!1,category:"animals_and_nature"},elephant:{keywords:["animal","nature","nose","th","circus"],char:"\ud83d\udc18",fitzpatrick_scale:!1,category:"animals_and_nature"},rhinoceros:{keywords:["animal","nature","horn"],char:"\ud83e\udd8f",fitzpatrick_scale:!1,category:"animals_and_nature"},goat:{keywords:["animal","nature"],char:"\ud83d\udc10",fitzpatrick_scale:!1,category:"animals_and_nature"},ram:{keywords:["animal","sheep","nature"],char:"\ud83d\udc0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sheep:{keywords:["animal","nature","wool","shipit"],char:"\ud83d\udc11",fitzpatrick_scale:!1,category:"animals_and_nature"},racehorse:{keywords:["animal","gamble","luck"],char:"\ud83d\udc0e",fitzpatrick_scale:!1,category:"animals_and_nature"},pig2:{keywords:["animal","nature"],char:"\ud83d\udc16",fitzpatrick_scale:!1,category:"animals_and_nature"},rat:{keywords:["animal","mouse","rodent"],char:"\ud83d\udc00",fitzpatrick_scale:!1,category:"animals_and_nature"},mouse2:{keywords:["animal","nature","rodent"],char:"\ud83d\udc01",fitzpatrick_scale:!1,category:"animals_and_nature"},rooster:{keywords:["animal","nature","chicken"],char:"\ud83d\udc13",fitzpatrick_scale:!1,category:"animals_and_nature"},turkey:{keywords:["animal","bird"],char:"\ud83e\udd83",fitzpatrick_scale:!1,category:"animals_and_nature"},dove:{keywords:["animal","bird"],char:"\ud83d\udd4a",fitzpatrick_scale:!1,category:"animals_and_nature"},dog2:{keywords:["animal","nature","friend","doge","pet","faithful"],char:"\ud83d\udc15",fitzpatrick_scale:!1,category:"animals_and_nature"},poodle:{keywords:["dog","animal","101","nature","pet"],char:"\ud83d\udc29",fitzpatrick_scale:!1,category:"animals_and_nature"},cat2:{keywords:["animal","meow","pet","cats"],char:"\ud83d\udc08",fitzpatrick_scale:!1,category:"animals_and_nature"},rabbit2:{keywords:["animal","nature","pet","magic","spring"],char:"\ud83d\udc07",fitzpatrick_scale:!1,category:"animals_and_nature"},chipmunk:{keywords:["animal","nature","rodent","squirrel"],char:"\ud83d\udc3f",fitzpatrick_scale:!1,category:"animals_and_nature"},hedgehog:{keywords:["animal","nature","spiny"],char:"\ud83e\udd94",fitzpatrick_scale:!1,category:"animals_and_nature"},raccoon:{keywords:["animal","nature"],char:"\ud83e\udd9d",fitzpatrick_scale:!1,category:"animals_and_nature"},llama:{keywords:["animal","nature","alpaca"],char:"\ud83e\udd99",fitzpatrick_scale:!1,category:"animals_and_nature"},hippopotamus:{keywords:["animal","nature"],char:"\ud83e\udd9b",fitzpatrick_scale:!1,category:"animals_and_nature"},kangaroo:{keywords:["animal","nature","australia","joey","hop","marsupial"],char:"\ud83e\udd98",fitzpatrick_scale:!1,category:"animals_and_nature"},badger:{keywords:["animal","nature","honey"],char:"\ud83e\udda1",fitzpatrick_scale:!1,category:"animals_and_nature"},swan:{keywords:["animal","nature","bird"],char:"\ud83e\udda2",fitzpatrick_scale:!1,category:"animals_and_nature"},peacock:{keywords:["animal","nature","peahen","bird"],char:"\ud83e\udd9a",fitzpatrick_scale:!1,category:"animals_and_nature"},parrot:{keywords:["animal","nature","bird","pirate","talk"],char:"\ud83e\udd9c",fitzpatrick_scale:!1,category:"animals_and_nature"},lobster:{keywords:["animal","nature","bisque","claws","seafood"],char:"\ud83e\udd9e",fitzpatrick_scale:!1,category:"animals_and_nature"},mosquito:{keywords:["animal","nature","insect","malaria"],char:"\ud83e\udd9f",fitzpatrick_scale:!1,category:"animals_and_nature"},paw_prints:{keywords:["animal","tracking","footprints","dog","cat","pet","feet"],char:"\ud83d\udc3e",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc09",fitzpatrick_scale:!1,category:"animals_and_nature"},dragon_face:{keywords:["animal","myth","nature","chinese","green"],char:"\ud83d\udc32",fitzpatrick_scale:!1,category:"animals_and_nature"},cactus:{keywords:["vegetable","plant","nature"],char:"\ud83c\udf35",fitzpatrick_scale:!1,category:"animals_and_nature"},christmas_tree:{keywords:["festival","vacation","december","xmas","celebration"],char:"\ud83c\udf84",fitzpatrick_scale:!1,category:"animals_and_nature"},evergreen_tree:{keywords:["plant","nature"],char:"\ud83c\udf32",fitzpatrick_scale:!1,category:"animals_and_nature"},deciduous_tree:{keywords:["plant","nature"],char:"\ud83c\udf33",fitzpatrick_scale:!1,category:"animals_and_nature"},palm_tree:{keywords:["plant","vegetable","nature","summer","beach","mojito","tropical"],char:"\ud83c\udf34",fitzpatrick_scale:!1,category:"animals_and_nature"},seedling:{keywords:["plant","nature","grass","lawn","spring"],char:"\ud83c\udf31",fitzpatrick_scale:!1,category:"animals_and_nature"},herb:{keywords:["vegetable","plant","medicine","weed","grass","lawn"],char:"\ud83c\udf3f",fitzpatrick_scale:!1,category:"animals_and_nature"},shamrock:{keywords:["vegetable","plant","nature","irish","clover"],char:"\u2618",fitzpatrick_scale:!1,category:"animals_and_nature"},four_leaf_clover:{keywords:["vegetable","plant","nature","lucky","irish"],char:"\ud83c\udf40",fitzpatrick_scale:!1,category:"animals_and_nature"},bamboo:{keywords:["plant","nature","vegetable","panda","pine_decoration"],char:"\ud83c\udf8d",fitzpatrick_scale:!1,category:"animals_and_nature"},tanabata_tree:{keywords:["plant","nature","branch","summer"],char:"\ud83c\udf8b",fitzpatrick_scale:!1,category:"animals_and_nature"},leaves:{keywords:["nature","plant","tree","vegetable","grass","lawn","spring"],char:"\ud83c\udf43",fitzpatrick_scale:!1,category:"animals_and_nature"},fallen_leaf:{keywords:["nature","plant","vegetable","leaves"],char:"\ud83c\udf42",fitzpatrick_scale:!1,category:"animals_and_nature"},maple_leaf:{keywords:["nature","plant","vegetable","ca","fall"],char:"\ud83c\udf41",fitzpatrick_scale:!1,category:"animals_and_nature"},ear_of_rice:{keywords:["nature","plant"],char:"\ud83c\udf3e",fitzpatrick_scale:!1,category:"animals_and_nature"},hibiscus:{keywords:["plant","vegetable","flowers","beach"],char:"\ud83c\udf3a",fitzpatrick_scale:!1,category:"animals_and_nature"},sunflower:{keywords:["nature","plant","fall"],char:"\ud83c\udf3b",fitzpatrick_scale:!1,category:"animals_and_nature"},rose:{keywords:["flowers","valentines","love","spring"],char:"\ud83c\udf39",fitzpatrick_scale:!1,category:"animals_and_nature"},wilted_flower:{keywords:["plant","nature","flower"],char:"\ud83e\udd40",fitzpatrick_scale:!1,category:"animals_and_nature"},tulip:{keywords:["flowers","plant","nature","summer","spring"],char:"\ud83c\udf37",fitzpatrick_scale:!1,category:"animals_and_nature"},blossom:{keywords:["nature","flowers","yellow"],char:"\ud83c\udf3c",fitzpatrick_scale:!1,category:"animals_and_nature"},cherry_blossom:{keywords:["nature","plant","spring","flower"],char:"\ud83c\udf38",fitzpatrick_scale:!1,category:"animals_and_nature"},bouquet:{keywords:["flowers","nature","spring"],char:"\ud83d\udc90",fitzpatrick_scale:!1,category:"animals_and_nature"},mushroom:{keywords:["plant","vegetable"],char:"\ud83c\udf44",fitzpatrick_scale:!1,category:"animals_and_nature"},chestnut:{keywords:["food","squirrel"],char:"\ud83c\udf30",fitzpatrick_scale:!1,category:"animals_and_nature"},jack_o_lantern:{keywords:["halloween","light","pumpkin","creepy","fall"],char:"\ud83c\udf83",fitzpatrick_scale:!1,category:"animals_and_nature"},shell:{keywords:["nature","sea","beach"],char:"\ud83d\udc1a",fitzpatrick_scale:!1,category:"animals_and_nature"},spider_web:{keywords:["animal","insect","arachnid","silk"],char:"\ud83d\udd78",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_americas:{keywords:["globe","world","USA","international"],char:"\ud83c\udf0e",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_africa:{keywords:["globe","world","international"],char:"\ud83c\udf0d",fitzpatrick_scale:!1,category:"animals_and_nature"},earth_asia:{keywords:["globe","world","east","international"],char:"\ud83c\udf0f",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon:{keywords:["nature","yellow","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf15",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_gibbous_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep","waxing_gibbous_moon"],char:"\ud83c\udf16",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf17",fitzpatrick_scale:!1,category:"animals_and_nature"},waning_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf18",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf11",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_crescent_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf12",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf13",fitzpatrick_scale:!1,category:"animals_and_nature"},waxing_gibbous_moon:{keywords:["nature","night","sky","gray","twilight","planet","space","evening","sleep"],char:"\ud83c\udf14",fitzpatrick_scale:!1,category:"animals_and_nature"},new_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1a",fitzpatrick_scale:!1,category:"animals_and_nature"},full_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1d",fitzpatrick_scale:!1,category:"animals_and_nature"},first_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1b",fitzpatrick_scale:!1,category:"animals_and_nature"},last_quarter_moon_with_face:{keywords:["nature","twilight","planet","space","night","evening","sleep"],char:"\ud83c\udf1c",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_with_face:{keywords:["nature","morning","sky"],char:"\ud83c\udf1e",fitzpatrick_scale:!1,category:"animals_and_nature"},crescent_moon:{keywords:["night","sleep","sky","evening","magic"],char:"\ud83c\udf19",fitzpatrick_scale:!1,category:"animals_and_nature"},star:{keywords:["night","yellow"],char:"\u2b50",fitzpatrick_scale:!1,category:"animals_and_nature"},star2:{keywords:["night","sparkle","awesome","good","magic"],char:"\ud83c\udf1f",fitzpatrick_scale:!1,category:"animals_and_nature"},dizzy:{keywords:["star","sparkle","shoot","magic"],char:"\ud83d\udcab",fitzpatrick_scale:!1,category:"animals_and_nature"},sparkles:{keywords:["stars","shine","shiny","cool","awesome","good","magic"],char:"\u2728",fitzpatrick_scale:!1,category:"animals_and_nature"},comet:{keywords:["space"],char:"\u2604",fitzpatrick_scale:!1,category:"animals_and_nature"},sunny:{keywords:["weather","nature","brightness","summer","beach","spring"],char:"\u2600\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_small_cloud:{keywords:["weather"],char:"\ud83c\udf24",fitzpatrick_scale:!1,category:"animals_and_nature"},partly_sunny:{keywords:["weather","nature","cloudy","morning","fall","spring"],char:"\u26c5",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_large_cloud:{keywords:["weather"],char:"\ud83c\udf25",fitzpatrick_scale:!1,category:"animals_and_nature"},sun_behind_rain_cloud:{keywords:["weather"],char:"\ud83c\udf26",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud:{keywords:["weather","sky"],char:"\u2601\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_rain:{keywords:["weather"],char:"\ud83c\udf27",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning_and_rain:{keywords:["weather","lightning"],char:"\u26c8",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_lightning:{keywords:["weather","thunder"],char:"\ud83c\udf29",fitzpatrick_scale:!1,category:"animals_and_nature"},zap:{keywords:["thunder","weather","lightning bolt","fast"],char:"\u26a1",fitzpatrick_scale:!1,category:"animals_and_nature"},fire:{keywords:["hot","cook","flame"],char:"\ud83d\udd25",fitzpatrick_scale:!1,category:"animals_and_nature"},boom:{keywords:["bomb","explode","explosion","collision","blown"],char:"\ud83d\udca5",fitzpatrick_scale:!1,category:"animals_and_nature"},snowflake:{keywords:["winter","season","cold","weather","christmas","xmas"],char:"\u2744\ufe0f",fitzpatrick_scale:!1,category:"animals_and_nature"},cloud_with_snow:{keywords:["weather"],char:"\ud83c\udf28",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman:{keywords:["winter","season","cold","weather","christmas","xmas","frozen","without_snow"],char:"\u26c4",fitzpatrick_scale:!1,category:"animals_and_nature"},snowman_with_snow:{keywords:["winter","season","cold","weather","christmas","xmas","frozen"],char:"\u2603",fitzpatrick_scale:!1,category:"animals_and_nature"},wind_face:{keywords:["gust","air"],char:"\ud83c\udf2c",fitzpatrick_scale:!1,category:"animals_and_nature"},dash:{keywords:["wind","air","fast","shoo","fart","smoke","puff"],char:"\ud83d\udca8",fitzpatrick_scale:!1,category:"animals_and_nature"},tornado:{keywords:["weather","cyclone","twister"],char:"\ud83c\udf2a",fitzpatrick_scale:!1,category:"animals_and_nature"},fog:{keywords:["weather"],char:"\ud83c\udf2b",fitzpatrick_scale:!1,category:"animals_and_nature"},open_umbrella:{keywords:["weather","spring"],char:"\u2602",fitzpatrick_scale:!1,category:"animals_and_nature"},umbrella:{keywords:["rainy","weather","spring"],char:"\u2614",fitzpatrick_scale:!1,category:"animals_and_nature"},droplet:{keywords:["water","drip","faucet","spring"],char:"\ud83d\udca7",fitzpatrick_scale:!1,category:"animals_and_nature"},sweat_drops:{keywords:["water","drip","oops"],char:"\ud83d\udca6",fitzpatrick_scale:!1,category:"animals_and_nature"},ocean:{keywords:["sea","water","wave","nature","tsunami","disaster"],char:"\ud83c\udf0a",fitzpatrick_scale:!1,category:"animals_and_nature"},green_apple:{keywords:["fruit","nature"],char:"\ud83c\udf4f",fitzpatrick_scale:!1,category:"food_and_drink"},apple:{keywords:["fruit","mac","school"],char:"\ud83c\udf4e",fitzpatrick_scale:!1,category:"food_and_drink"},pear:{keywords:["fruit","nature","food"],char:"\ud83c\udf50",fitzpatrick_scale:!1,category:"food_and_drink"},tangerine:{keywords:["food","fruit","nature","orange"],char:"\ud83c\udf4a",fitzpatrick_scale:!1,category:"food_and_drink"},lemon:{keywords:["fruit","nature"],char:"\ud83c\udf4b",fitzpatrick_scale:!1,category:"food_and_drink"},banana:{keywords:["fruit","food","monkey"],char:"\ud83c\udf4c",fitzpatrick_scale:!1,category:"food_and_drink"},watermelon:{keywords:["fruit","food","picnic","summer"],char:"\ud83c\udf49",fitzpatrick_scale:!1,category:"food_and_drink"},grapes:{keywords:["fruit","food","wine"],char:"\ud83c\udf47",fitzpatrick_scale:!1,category:"food_and_drink"},strawberry:{keywords:["fruit","food","nature"],char:"\ud83c\udf53",fitzpatrick_scale:!1,category:"food_and_drink"},melon:{keywords:["fruit","nature","food"],char:"\ud83c\udf48",fitzpatrick_scale:!1,category:"food_and_drink"},cherries:{keywords:["food","fruit"],char:"\ud83c\udf52",fitzpatrick_scale:!1,category:"food_and_drink"},peach:{keywords:["fruit","nature","food"],char:"\ud83c\udf51",fitzpatrick_scale:!1,category:"food_and_drink"},pineapple:{keywords:["fruit","nature","food"],char:"\ud83c\udf4d",fitzpatrick_scale:!1,category:"food_and_drink"},coconut:{keywords:["fruit","nature","food","palm"],char:"\ud83e\udd65",fitzpatrick_scale:!1,category:"food_and_drink"},kiwi_fruit:{keywords:["fruit","food"],char:"\ud83e\udd5d",fitzpatrick_scale:!1,category:"food_and_drink"},mango:{keywords:["fruit","food","tropical"],char:"\ud83e\udd6d",fitzpatrick_scale:!1,category:"food_and_drink"},avocado:{keywords:["fruit","food"],char:"\ud83e\udd51",fitzpatrick_scale:!1,category:"food_and_drink"},broccoli:{keywords:["fruit","food","vegetable"],char:"\ud83e\udd66",fitzpatrick_scale:!1,category:"food_and_drink"},tomato:{keywords:["fruit","vegetable","nature","food"],char:"\ud83c\udf45",fitzpatrick_scale:!1,category:"food_and_drink"},eggplant:{keywords:["vegetable","nature","food","aubergine"],char:"\ud83c\udf46",fitzpatrick_scale:!1,category:"food_and_drink"},cucumber:{keywords:["fruit","food","pickle"],char:"\ud83e\udd52",fitzpatrick_scale:!1,category:"food_and_drink"},carrot:{keywords:["vegetable","food","orange"],char:"\ud83e\udd55",fitzpatrick_scale:!1,category:"food_and_drink"},hot_pepper:{keywords:["food","spicy","chilli","chili"],char:"\ud83c\udf36",fitzpatrick_scale:!1,category:"food_and_drink"},potato:{keywords:["food","tuber","vegatable","starch"],char:"\ud83e\udd54",fitzpatrick_scale:!1,category:"food_and_drink"},corn:{keywords:["food","vegetable","plant"],char:"\ud83c\udf3d",fitzpatrick_scale:!1,category:"food_and_drink"},leafy_greens:{keywords:["food","vegetable","plant","bok choy","cabbage","kale","lettuce"],char:"\ud83e\udd6c",fitzpatrick_scale:!1,category:"food_and_drink"},sweet_potato:{keywords:["food","nature"],char:"\ud83c\udf60",fitzpatrick_scale:!1,category:"food_and_drink"},peanuts:{keywords:["food","nut"],char:"\ud83e\udd5c",fitzpatrick_scale:!1,category:"food_and_drink"},honey_pot:{keywords:["bees","sweet","kitchen"],char:"\ud83c\udf6f",fitzpatrick_scale:!1,category:"food_and_drink"},croissant:{keywords:["food","bread","french"],char:"\ud83e\udd50",fitzpatrick_scale:!1,category:"food_and_drink"},bread:{keywords:["food","wheat","breakfast","toast"],char:"\ud83c\udf5e",fitzpatrick_scale:!1,category:"food_and_drink"},baguette_bread:{keywords:["food","bread","french"],char:"\ud83e\udd56",fitzpatrick_scale:!1,category:"food_and_drink"},bagel:{keywords:["food","bread","bakery","schmear"],char:"\ud83e\udd6f",fitzpatrick_scale:!1,category:"food_and_drink"},pretzel:{keywords:["food","bread","twisted"],char:"\ud83e\udd68",fitzpatrick_scale:!1,category:"food_and_drink"},cheese:{keywords:["food","chadder"],char:"\ud83e\uddc0",fitzpatrick_scale:!1,category:"food_and_drink"},egg:{keywords:["food","chicken","breakfast"],char:"\ud83e\udd5a",fitzpatrick_scale:!1,category:"food_and_drink"},bacon:{keywords:["food","breakfast","pork","pig","meat"],char:"\ud83e\udd53",fitzpatrick_scale:!1,category:"food_and_drink"},steak:{keywords:["food","cow","meat","cut","chop","lambchop","porkchop"],char:"\ud83e\udd69",fitzpatrick_scale:!1,category:"food_and_drink"},pancakes:{keywords:["food","breakfast","flapjacks","hotcakes"],char:"\ud83e\udd5e",fitzpatrick_scale:!1,category:"food_and_drink"},poultry_leg:{keywords:["food","meat","drumstick","bird","chicken","turkey"],char:"\ud83c\udf57",fitzpatrick_scale:!1,category:"food_and_drink"},meat_on_bone:{keywords:["good","food","drumstick"],char:"\ud83c\udf56",fitzpatrick_scale:!1,category:"food_and_drink"},bone:{keywords:["skeleton"],char:"\ud83e\uddb4",fitzpatrick_scale:!1,category:"food_and_drink"},fried_shrimp:{keywords:["food","animal","appetizer","summer"],char:"\ud83c\udf64",fitzpatrick_scale:!1,category:"food_and_drink"},fried_egg:{keywords:["food","breakfast","kitchen","egg"],char:"\ud83c\udf73",fitzpatrick_scale:!1,category:"food_and_drink"},hamburger:{keywords:["meat","fast food","beef","cheeseburger","mcdonalds","burger king"],char:"\ud83c\udf54",fitzpatrick_scale:!1,category:"food_and_drink"},fries:{keywords:["chips","snack","fast food"],char:"\ud83c\udf5f",fitzpatrick_scale:!1,category:"food_and_drink"},stuffed_flatbread:{keywords:["food","flatbread","stuffed","gyro"],char:"\ud83e\udd59",fitzpatrick_scale:!1,category:"food_and_drink"},hotdog:{keywords:["food","frankfurter"],char:"\ud83c\udf2d",fitzpatrick_scale:!1,category:"food_and_drink"},pizza:{keywords:["food","party"],char:"\ud83c\udf55",fitzpatrick_scale:!1,category:"food_and_drink"},sandwich:{keywords:["food","lunch","bread"],char:"\ud83e\udd6a",fitzpatrick_scale:!1,category:"food_and_drink"},canned_food:{keywords:["food","soup"],char:"\ud83e\udd6b",fitzpatrick_scale:!1,category:"food_and_drink"},spaghetti:{keywords:["food","italian","noodle"],char:"\ud83c\udf5d",fitzpatrick_scale:!1,category:"food_and_drink"},taco:{keywords:["food","mexican"],char:"\ud83c\udf2e",fitzpatrick_scale:!1,category:"food_and_drink"},burrito:{keywords:["food","mexican"],char:"\ud83c\udf2f",fitzpatrick_scale:!1,category:"food_and_drink"},green_salad:{keywords:["food","healthy","lettuce"],char:"\ud83e\udd57",fitzpatrick_scale:!1,category:"food_and_drink"},shallow_pan_of_food:{keywords:["food","cooking","casserole","paella"],char:"\ud83e\udd58",fitzpatrick_scale:!1,category:"food_and_drink"},ramen:{keywords:["food","japanese","noodle","chopsticks"],char:"\ud83c\udf5c",fitzpatrick_scale:!1,category:"food_and_drink"},stew:{keywords:["food","meat","soup"],char:"\ud83c\udf72",fitzpatrick_scale:!1,category:"food_and_drink"},fish_cake:{keywords:["food","japan","sea","beach","narutomaki","pink","swirl","kamaboko","surimi","ramen"],char:"\ud83c\udf65",fitzpatrick_scale:!1,category:"food_and_drink"},fortune_cookie:{keywords:["food","prophecy"],char:"\ud83e\udd60",fitzpatrick_scale:!1,category:"food_and_drink"},sushi:{keywords:["food","fish","japanese","rice"],char:"\ud83c\udf63",fitzpatrick_scale:!1,category:"food_and_drink"},bento:{keywords:["food","japanese","box"],char:"\ud83c\udf71",fitzpatrick_scale:!1,category:"food_and_drink"},curry:{keywords:["food","spicy","hot","indian"],char:"\ud83c\udf5b",fitzpatrick_scale:!1,category:"food_and_drink"},rice_ball:{keywords:["food","japanese"],char:"\ud83c\udf59",fitzpatrick_scale:!1,category:"food_and_drink"},rice:{keywords:["food","china","asian"],char:"\ud83c\udf5a",fitzpatrick_scale:!1,category:"food_and_drink"},rice_cracker:{keywords:["food","japanese"],char:"\ud83c\udf58",fitzpatrick_scale:!1,category:"food_and_drink"},oden:{keywords:["food","japanese"],char:"\ud83c\udf62",fitzpatrick_scale:!1,category:"food_and_drink"},dango:{keywords:["food","dessert","sweet","japanese","barbecue","meat"],char:"\ud83c\udf61",fitzpatrick_scale:!1,category:"food_and_drink"},shaved_ice:{keywords:["hot","dessert","summer"],char:"\ud83c\udf67",fitzpatrick_scale:!1,category:"food_and_drink"},ice_cream:{keywords:["food","hot","dessert"],char:"\ud83c\udf68",fitzpatrick_scale:!1,category:"food_and_drink"},icecream:{keywords:["food","hot","dessert","summer"],char:"\ud83c\udf66",fitzpatrick_scale:!1,category:"food_and_drink"},pie:{keywords:["food","dessert","pastry"],char:"\ud83e\udd67",fitzpatrick_scale:!1,category:"food_and_drink"},cake:{keywords:["food","dessert"],char:"\ud83c\udf70",fitzpatrick_scale:!1,category:"food_and_drink"},cupcake:{keywords:["food","dessert","bakery","sweet"],char:"\ud83e\uddc1",fitzpatrick_scale:!1,category:"food_and_drink"},moon_cake:{keywords:["food","autumn"],char:"\ud83e\udd6e",fitzpatrick_scale:!1,category:"food_and_drink"},birthday:{keywords:["food","dessert","cake"],char:"\ud83c\udf82",fitzpatrick_scale:!1,category:"food_and_drink"},custard:{keywords:["dessert","food"],char:"\ud83c\udf6e",fitzpatrick_scale:!1,category:"food_and_drink"},candy:{keywords:["snack","dessert","sweet","lolly"],char:"\ud83c\udf6c",fitzpatrick_scale:!1,category:"food_and_drink"},lollipop:{keywords:["food","snack","candy","sweet"],char:"\ud83c\udf6d",fitzpatrick_scale:!1,category:"food_and_drink"},chocolate_bar:{keywords:["food","snack","dessert","sweet"],char:"\ud83c\udf6b",fitzpatrick_scale:!1,category:"food_and_drink"},popcorn:{keywords:["food","movie theater","films","snack"],char:"\ud83c\udf7f",fitzpatrick_scale:!1,category:"food_and_drink"},dumpling:{keywords:["food","empanada","pierogi","potsticker"],char:"\ud83e\udd5f",fitzpatrick_scale:!1,category:"food_and_drink"},doughnut:{keywords:["food","dessert","snack","sweet","donut"],char:"\ud83c\udf69",fitzpatrick_scale:!1,category:"food_and_drink"},cookie:{keywords:["food","snack","oreo","chocolate","sweet","dessert"],char:"\ud83c\udf6a",fitzpatrick_scale:!1,category:"food_and_drink"},milk_glass:{keywords:["beverage","drink","cow"],char:"\ud83e\udd5b",fitzpatrick_scale:!1,category:"food_and_drink"},beer:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7a",fitzpatrick_scale:!1,category:"food_and_drink"},beers:{keywords:["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],char:"\ud83c\udf7b",fitzpatrick_scale:!1,category:"food_and_drink"},clinking_glasses:{keywords:["beverage","drink","party","alcohol","celebrate","cheers","wine","champagne","toast"],char:"\ud83e\udd42",fitzpatrick_scale:!1,category:"food_and_drink"},wine_glass:{keywords:["drink","beverage","drunk","alcohol","booze"],char:"\ud83c\udf77",fitzpatrick_scale:!1,category:"food_and_drink"},tumbler_glass:{keywords:["drink","beverage","drunk","alcohol","liquor","booze","bourbon","scotch","whisky","glass","shot"],char:"\ud83e\udd43",fitzpatrick_scale:!1,category:"food_and_drink"},cocktail:{keywords:["drink","drunk","alcohol","beverage","booze","mojito"],char:"\ud83c\udf78",fitzpatrick_scale:!1,category:"food_and_drink"},tropical_drink:{keywords:["beverage","cocktail","summer","beach","alcohol","booze","mojito"],char:"\ud83c\udf79",fitzpatrick_scale:!1,category:"food_and_drink"},champagne:{keywords:["drink","wine","bottle","celebration"],char:"\ud83c\udf7e",fitzpatrick_scale:!1,category:"food_and_drink"},sake:{keywords:["wine","drink","drunk","beverage","japanese","alcohol","booze"],char:"\ud83c\udf76",fitzpatrick_scale:!1,category:"food_and_drink"},tea:{keywords:["drink","bowl","breakfast","green","british"],char:"\ud83c\udf75",fitzpatrick_scale:!1,category:"food_and_drink"},cup_with_straw:{keywords:["drink","soda"],char:"\ud83e\udd64",fitzpatrick_scale:!1,category:"food_and_drink"},coffee:{keywords:["beverage","caffeine","latte","espresso"],char:"\u2615",fitzpatrick_scale:!1,category:"food_and_drink"},baby_bottle:{keywords:["food","container","milk"],char:"\ud83c\udf7c",fitzpatrick_scale:!1,category:"food_and_drink"},salt:{keywords:["condiment","shaker"],char:"\ud83e\uddc2",fitzpatrick_scale:!1,category:"food_and_drink"},spoon:{keywords:["cutlery","kitchen","tableware"],char:"\ud83e\udd44",fitzpatrick_scale:!1,category:"food_and_drink"},fork_and_knife:{keywords:["cutlery","kitchen"],char:"\ud83c\udf74",fitzpatrick_scale:!1,category:"food_and_drink"},plate_with_cutlery:{keywords:["food","eat","meal","lunch","dinner","restaurant"],char:"\ud83c\udf7d",fitzpatrick_scale:!1,category:"food_and_drink"},bowl_with_spoon:{keywords:["food","breakfast","cereal","oatmeal","porridge"],char:"\ud83e\udd63",fitzpatrick_scale:!1,category:"food_and_drink"},takeout_box:{keywords:["food","leftovers"],char:"\ud83e\udd61",fitzpatrick_scale:!1,category:"food_and_drink"},chopsticks:{keywords:["food"],char:"\ud83e\udd62",fitzpatrick_scale:!1,category:"food_and_drink"},soccer:{keywords:["sports","football"],char:"\u26bd",fitzpatrick_scale:!1,category:"activity"},basketball:{keywords:["sports","balls","NBA"],char:"\ud83c\udfc0",fitzpatrick_scale:!1,category:"activity"},football:{keywords:["sports","balls","NFL"],char:"\ud83c\udfc8",fitzpatrick_scale:!1,category:"activity"},baseball:{keywords:["sports","balls"],char:"\u26be",fitzpatrick_scale:!1,category:"activity"},softball:{keywords:["sports","balls"],char:"\ud83e\udd4e",fitzpatrick_scale:!1,category:"activity"},tennis:{keywords:["sports","balls","green"],char:"\ud83c\udfbe",fitzpatrick_scale:!1,category:"activity"},volleyball:{keywords:["sports","balls"],char:"\ud83c\udfd0",fitzpatrick_scale:!1,category:"activity"},rugby_football:{keywords:["sports","team"],char:"\ud83c\udfc9",fitzpatrick_scale:!1,category:"activity"},flying_disc:{keywords:["sports","frisbee","ultimate"],char:"\ud83e\udd4f",fitzpatrick_scale:!1,category:"activity"},"8ball":{keywords:["pool","hobby","game","luck","magic"],char:"\ud83c\udfb1",fitzpatrick_scale:!1,category:"activity"},golf:{keywords:["sports","business","flag","hole","summer"],char:"\u26f3",fitzpatrick_scale:!1,category:"activity"},golfing_woman:{keywords:["sports","business","woman","female"],char:"\ud83c\udfcc\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},golfing_man:{keywords:["sports","business"],char:"\ud83c\udfcc",fitzpatrick_scale:!0,category:"activity"},ping_pong:{keywords:["sports","pingpong"],char:"\ud83c\udfd3",fitzpatrick_scale:!1,category:"activity"},badminton:{keywords:["sports"],char:"\ud83c\udff8",fitzpatrick_scale:!1,category:"activity"},goal_net:{keywords:["sports"],char:"\ud83e\udd45",fitzpatrick_scale:!1,category:"activity"},ice_hockey:{keywords:["sports"],char:"\ud83c\udfd2",fitzpatrick_scale:!1,category:"activity"},field_hockey:{keywords:["sports"],char:"\ud83c\udfd1",fitzpatrick_scale:!1,category:"activity"},lacrosse:{keywords:["sports","ball","stick"],char:"\ud83e\udd4d",fitzpatrick_scale:!1,category:"activity"},cricket:{keywords:["sports"],char:"\ud83c\udfcf",fitzpatrick_scale:!1,category:"activity"},ski:{keywords:["sports","winter","cold","snow"],char:"\ud83c\udfbf",fitzpatrick_scale:!1,category:"activity"},skier:{keywords:["sports","winter","snow"],char:"\u26f7",fitzpatrick_scale:!1,category:"activity"},snowboarder:{keywords:["sports","winter"],char:"\ud83c\udfc2",fitzpatrick_scale:!0,category:"activity"},person_fencing:{keywords:["sports","fencing","sword"],char:"\ud83e\udd3a",fitzpatrick_scale:!1,category:"activity"},women_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2640\ufe0f",fitzpatrick_scale:!1,category:"activity"},men_wrestling:{keywords:["sports","wrestlers"],char:"\ud83e\udd3c\u200d\u2642\ufe0f",fitzpatrick_scale:!1,category:"activity"},woman_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_cartwheeling:{keywords:["gymnastics"],char:"\ud83e\udd38\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_handball:{keywords:["sports"],char:"\ud83e\udd3e\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},ice_skate:{keywords:["sports"],char:"\u26f8",fitzpatrick_scale:!1,category:"activity"},curling_stone:{keywords:["sports"],char:"\ud83e\udd4c",fitzpatrick_scale:!1,category:"activity"},skateboard:{keywords:["board"],char:"\ud83d\udef9",fitzpatrick_scale:!1,category:"activity"},sled:{keywords:["sleigh","luge","toboggan"],char:"\ud83d\udef7",fitzpatrick_scale:!1,category:"activity"},bow_and_arrow:{keywords:["sports"],char:"\ud83c\udff9",fitzpatrick_scale:!1,category:"activity"},fishing_pole_and_fish:{keywords:["food","hobby","summer"],char:"\ud83c\udfa3",fitzpatrick_scale:!1,category:"activity"},boxing_glove:{keywords:["sports","fighting"],char:"\ud83e\udd4a",fitzpatrick_scale:!1,category:"activity"},martial_arts_uniform:{keywords:["judo","karate","taekwondo"],char:"\ud83e\udd4b",fitzpatrick_scale:!1,category:"activity"},rowing_woman:{keywords:["sports","hobby","water","ship","woman","female"],char:"\ud83d\udea3\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},rowing_man:{keywords:["sports","hobby","water","ship"],char:"\ud83d\udea3",fitzpatrick_scale:!0,category:"activity"},climbing_woman:{keywords:["sports","hobby","woman","female","rock"],char:"\ud83e\uddd7\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},climbing_man:{keywords:["sports","hobby","man","male","rock"],char:"\ud83e\uddd7\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_woman:{keywords:["sports","exercise","human","athlete","water","summer","woman","female"],char:"\ud83c\udfca\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},swimming_man:{keywords:["sports","exercise","human","athlete","water","summer"],char:"\ud83c\udfca",fitzpatrick_scale:!0,category:"activity"},woman_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_playing_water_polo:{keywords:["sports","pool"],char:"\ud83e\udd3d\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},woman_in_lotus_position:{keywords:["woman","female","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_in_lotus_position:{keywords:["man","male","meditation","yoga","serenity","zen","mindfulness"],char:"\ud83e\uddd8\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_woman:{keywords:["sports","ocean","sea","summer","beach","woman","female"],char:"\ud83c\udfc4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},surfing_man:{keywords:["sports","ocean","sea","summer","beach"],char:"\ud83c\udfc4",fitzpatrick_scale:!0,category:"activity"},bath:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec0",fitzpatrick_scale:!0,category:"activity"},basketball_woman:{keywords:["sports","human","woman","female"],char:"\u26f9\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},basketball_man:{keywords:["sports","human"],char:"\u26f9",fitzpatrick_scale:!0,category:"activity"},weight_lifting_woman:{keywords:["sports","training","exercise","woman","female"],char:"\ud83c\udfcb\ufe0f\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},weight_lifting_man:{keywords:["sports","training","exercise"],char:"\ud83c\udfcb",fitzpatrick_scale:!0,category:"activity"},biking_woman:{keywords:["sports","bike","exercise","hipster","woman","female"],char:"\ud83d\udeb4\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},biking_man:{keywords:["sports","bike","exercise","hipster"],char:"\ud83d\udeb4",fitzpatrick_scale:!0,category:"activity"},mountain_biking_woman:{keywords:["transportation","sports","human","race","bike","woman","female"],char:"\ud83d\udeb5\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},mountain_biking_man:{keywords:["transportation","sports","human","race","bike"],char:"\ud83d\udeb5",fitzpatrick_scale:!0,category:"activity"},horse_racing:{keywords:["animal","betting","competition","gambling","luck"],char:"\ud83c\udfc7",fitzpatrick_scale:!0,category:"activity"},business_suit_levitating:{keywords:["suit","business","levitate","hover","jump"],char:"\ud83d\udd74",fitzpatrick_scale:!0,category:"activity"},trophy:{keywords:["win","award","contest","place","ftw","ceremony"],char:"\ud83c\udfc6",fitzpatrick_scale:!1,category:"activity"},running_shirt_with_sash:{keywords:["play","pageant"],char:"\ud83c\udfbd",fitzpatrick_scale:!1,category:"activity"},medal_sports:{keywords:["award","winning"],char:"\ud83c\udfc5",fitzpatrick_scale:!1,category:"activity"},medal_military:{keywords:["award","winning","army"],char:"\ud83c\udf96",fitzpatrick_scale:!1,category:"activity"},"1st_place_medal":{keywords:["award","winning","first"],char:"\ud83e\udd47",fitzpatrick_scale:!1,category:"activity"},"2nd_place_medal":{keywords:["award","second"],char:"\ud83e\udd48",fitzpatrick_scale:!1,category:"activity"},"3rd_place_medal":{keywords:["award","third"],char:"\ud83e\udd49",fitzpatrick_scale:!1,category:"activity"},reminder_ribbon:{keywords:["sports","cause","support","awareness"],char:"\ud83c\udf97",fitzpatrick_scale:!1,category:"activity"},rosette:{keywords:["flower","decoration","military"],char:"\ud83c\udff5",fitzpatrick_scale:!1,category:"activity"},ticket:{keywords:["event","concert","pass"],char:"\ud83c\udfab",fitzpatrick_scale:!1,category:"activity"},tickets:{keywords:["sports","concert","entrance"],char:"\ud83c\udf9f",fitzpatrick_scale:!1,category:"activity"},performing_arts:{keywords:["acting","theater","drama"],char:"\ud83c\udfad",fitzpatrick_scale:!1,category:"activity"},art:{keywords:["design","paint","draw","colors"],char:"\ud83c\udfa8",fitzpatrick_scale:!1,category:"activity"},circus_tent:{keywords:["festival","carnival","party"],char:"\ud83c\udfaa",fitzpatrick_scale:!1,category:"activity"},woman_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2640\ufe0f",fitzpatrick_scale:!0,category:"activity"},man_juggling:{keywords:["juggle","balance","skill","multitask"],char:"\ud83e\udd39\u200d\u2642\ufe0f",fitzpatrick_scale:!0,category:"activity"},microphone:{keywords:["sound","music","PA","sing","talkshow"],char:"\ud83c\udfa4",fitzpatrick_scale:!1,category:"activity"},headphones:{keywords:["music","score","gadgets"],char:"\ud83c\udfa7",fitzpatrick_scale:!1,category:"activity"},musical_score:{keywords:["treble","clef","compose"],char:"\ud83c\udfbc",fitzpatrick_scale:!1,category:"activity"},musical_keyboard:{keywords:["piano","instrument","compose"],char:"\ud83c\udfb9",fitzpatrick_scale:!1,category:"activity"},drum:{keywords:["music","instrument","drumsticks","snare"],char:"\ud83e\udd41",fitzpatrick_scale:!1,category:"activity"},saxophone:{keywords:["music","instrument","jazz","blues"],char:"\ud83c\udfb7",fitzpatrick_scale:!1,category:"activity"},trumpet:{keywords:["music","brass"],char:"\ud83c\udfba",fitzpatrick_scale:!1,category:"activity"},guitar:{keywords:["music","instrument"],char:"\ud83c\udfb8",fitzpatrick_scale:!1,category:"activity"},violin:{keywords:["music","instrument","orchestra","symphony"],char:"\ud83c\udfbb",fitzpatrick_scale:!1,category:"activity"},clapper:{keywords:["movie","film","record"],char:"\ud83c\udfac",fitzpatrick_scale:!1,category:"activity"},video_game:{keywords:["play","console","PS4","controller"],char:"\ud83c\udfae",fitzpatrick_scale:!1,category:"activity"},space_invader:{keywords:["game","arcade","play"],char:"\ud83d\udc7e",fitzpatrick_scale:!1,category:"activity"},dart:{keywords:["game","play","bar","target","bullseye"],char:"\ud83c\udfaf",fitzpatrick_scale:!1,category:"activity"},game_die:{keywords:["dice","random","tabletop","play","luck"],char:"\ud83c\udfb2",fitzpatrick_scale:!1,category:"activity"},chess_pawn:{keywords:["expendable"],char:"\u265f",fitzpatrick_scale:!1,category:"activity"},slot_machine:{keywords:["bet","gamble","vegas","fruit machine","luck","casino"],char:"\ud83c\udfb0",fitzpatrick_scale:!1,category:"activity"},jigsaw:{keywords:["interlocking","puzzle","piece"],char:"\ud83e\udde9",fitzpatrick_scale:!1,category:"activity"},bowling:{keywords:["sports","fun","play"],char:"\ud83c\udfb3",fitzpatrick_scale:!1,category:"activity"},red_car:{keywords:["red","transportation","vehicle"],char:"\ud83d\ude97",fitzpatrick_scale:!1,category:"travel_and_places"},taxi:{keywords:["uber","vehicle","cars","transportation"],char:"\ud83d\ude95",fitzpatrick_scale:!1,category:"travel_and_places"},blue_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude99",fitzpatrick_scale:!1,category:"travel_and_places"},bus:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude8c",fitzpatrick_scale:!1,category:"travel_and_places"},trolleybus:{keywords:["bart","transportation","vehicle"],char:"\ud83d\ude8e",fitzpatrick_scale:!1,category:"travel_and_places"},racing_car:{keywords:["sports","race","fast","formula","f1"],char:"\ud83c\udfce",fitzpatrick_scale:!1,category:"travel_and_places"},police_car:{keywords:["vehicle","cars","transportation","law","legal","enforcement"],char:"\ud83d\ude93",fitzpatrick_scale:!1,category:"travel_and_places"},ambulance:{keywords:["health","911","hospital"],char:"\ud83d\ude91",fitzpatrick_scale:!1,category:"travel_and_places"},fire_engine:{keywords:["transportation","cars","vehicle"],char:"\ud83d\ude92",fitzpatrick_scale:!1,category:"travel_and_places"},minibus:{keywords:["vehicle","car","transportation"],char:"\ud83d\ude90",fitzpatrick_scale:!1,category:"travel_and_places"},truck:{keywords:["cars","transportation"],char:"\ud83d\ude9a",fitzpatrick_scale:!1,category:"travel_and_places"},articulated_lorry:{keywords:["vehicle","cars","transportation","express"],char:"\ud83d\ude9b",fitzpatrick_scale:!1,category:"travel_and_places"},tractor:{keywords:["vehicle","car","farming","agriculture"],char:"\ud83d\ude9c",fitzpatrick_scale:!1,category:"travel_and_places"},kick_scooter:{keywords:["vehicle","kick","razor"],char:"\ud83d\udef4",fitzpatrick_scale:!1,category:"travel_and_places"},motorcycle:{keywords:["race","sports","fast"],char:"\ud83c\udfcd",fitzpatrick_scale:!1,category:"travel_and_places"},bike:{keywords:["sports","bicycle","exercise","hipster"],char:"\ud83d\udeb2",fitzpatrick_scale:!1,category:"travel_and_places"},motor_scooter:{keywords:["vehicle","vespa","sasha"],char:"\ud83d\udef5",fitzpatrick_scale:!1,category:"travel_and_places"},rotating_light:{keywords:["police","ambulance","911","emergency","alert","error","pinged","law","legal"],char:"\ud83d\udea8",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_police_car:{keywords:["vehicle","law","legal","enforcement","911"],char:"\ud83d\ude94",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_bus:{keywords:["vehicle","transportation"],char:"\ud83d\ude8d",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_automobile:{keywords:["car","vehicle","transportation"],char:"\ud83d\ude98",fitzpatrick_scale:!1,category:"travel_and_places"},oncoming_taxi:{keywords:["vehicle","cars","uber"],char:"\ud83d\ude96",fitzpatrick_scale:!1,category:"travel_and_places"},aerial_tramway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea1",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_cableway:{keywords:["transportation","vehicle","ski"],char:"\ud83d\udea0",fitzpatrick_scale:!1,category:"travel_and_places"},suspension_railway:{keywords:["vehicle","transportation"],char:"\ud83d\ude9f",fitzpatrick_scale:!1,category:"travel_and_places"},railway_car:{keywords:["transportation","vehicle"],char:"\ud83d\ude83",fitzpatrick_scale:!1,category:"travel_and_places"},train:{keywords:["transportation","vehicle","carriage","public","travel"],char:"\ud83d\ude8b",fitzpatrick_scale:!1,category:"travel_and_places"},monorail:{keywords:["transportation","vehicle"],char:"\ud83d\ude9d",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_side:{keywords:["transportation","vehicle"],char:"\ud83d\ude84",fitzpatrick_scale:!1,category:"travel_and_places"},bullettrain_front:{keywords:["transportation","vehicle","speed","fast","public","travel"],char:"\ud83d\ude85",fitzpatrick_scale:!1,category:"travel_and_places"},light_rail:{keywords:["transportation","vehicle"],char:"\ud83d\ude88",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_railway:{keywords:["transportation","vehicle"],char:"\ud83d\ude9e",fitzpatrick_scale:!1,category:"travel_and_places"},steam_locomotive:{keywords:["transportation","vehicle","train"],char:"\ud83d\ude82",fitzpatrick_scale:!1,category:"travel_and_places"},train2:{keywords:["transportation","vehicle"],char:"\ud83d\ude86",fitzpatrick_scale:!1,category:"travel_and_places"},metro:{keywords:["transportation","blue-square","mrt","underground","tube"],char:"\ud83d\ude87",fitzpatrick_scale:!1,category:"travel_and_places"},tram:{keywords:["transportation","vehicle"],char:"\ud83d\ude8a",fitzpatrick_scale:!1,category:"travel_and_places"},station:{keywords:["transportation","vehicle","public"],char:"\ud83d\ude89",fitzpatrick_scale:!1,category:"travel_and_places"},flying_saucer:{keywords:["transportation","vehicle","ufo"],char:"\ud83d\udef8",fitzpatrick_scale:!1,category:"travel_and_places"},helicopter:{keywords:["transportation","vehicle","fly"],char:"\ud83d\ude81",fitzpatrick_scale:!1,category:"travel_and_places"},small_airplane:{keywords:["flight","transportation","fly","vehicle"],char:"\ud83d\udee9",fitzpatrick_scale:!1,category:"travel_and_places"},airplane:{keywords:["vehicle","transportation","flight","fly"],char:"\u2708\ufe0f",fitzpatrick_scale:!1,category:"travel_and_places"},flight_departure:{keywords:["airport","flight","landing"],char:"\ud83d\udeeb",fitzpatrick_scale:!1,category:"travel_and_places"},flight_arrival:{keywords:["airport","flight","boarding"],char:"\ud83d\udeec",fitzpatrick_scale:!1,category:"travel_and_places"},sailboat:{keywords:["ship","summer","transportation","water","sailing"],char:"\u26f5",fitzpatrick_scale:!1,category:"travel_and_places"},motor_boat:{keywords:["ship"],char:"\ud83d\udee5",fitzpatrick_scale:!1,category:"travel_and_places"},speedboat:{keywords:["ship","transportation","vehicle","summer"],char:"\ud83d\udea4",fitzpatrick_scale:!1,category:"travel_and_places"},ferry:{keywords:["boat","ship","yacht"],char:"\u26f4",fitzpatrick_scale:!1,category:"travel_and_places"},passenger_ship:{keywords:["yacht","cruise","ferry"],char:"\ud83d\udef3",fitzpatrick_scale:!1,category:"travel_and_places"},rocket:{keywords:["launch","ship","staffmode","NASA","outer space","outer_space","fly"],char:"\ud83d\ude80",fitzpatrick_scale:!1,category:"travel_and_places"},artificial_satellite:{keywords:["communication","gps","orbit","spaceflight","NASA","ISS"],char:"\ud83d\udef0",fitzpatrick_scale:!1,category:"travel_and_places"},seat:{keywords:["sit","airplane","transport","bus","flight","fly"],char:"\ud83d\udcba",fitzpatrick_scale:!1,category:"travel_and_places"},canoe:{keywords:["boat","paddle","water","ship"],char:"\ud83d\udef6",fitzpatrick_scale:!1,category:"travel_and_places"},anchor:{keywords:["ship","ferry","sea","boat"],char:"\u2693",fitzpatrick_scale:!1,category:"travel_and_places"},construction:{keywords:["wip","progress","caution","warning"],char:"\ud83d\udea7",fitzpatrick_scale:!1,category:"travel_and_places"},fuelpump:{keywords:["gas station","petroleum"],char:"\u26fd",fitzpatrick_scale:!1,category:"travel_and_places"},busstop:{keywords:["transportation","wait"],char:"\ud83d\ude8f",fitzpatrick_scale:!1,category:"travel_and_places"},vertical_traffic_light:{keywords:["transportation","driving"],char:"\ud83d\udea6",fitzpatrick_scale:!1,category:"travel_and_places"},traffic_light:{keywords:["transportation","signal"],char:"\ud83d\udea5",fitzpatrick_scale:!1,category:"travel_and_places"},checkered_flag:{keywords:["contest","finishline","race","gokart"],char:"\ud83c\udfc1",fitzpatrick_scale:!1,category:"travel_and_places"},ship:{keywords:["transportation","titanic","deploy"],char:"\ud83d\udea2",fitzpatrick_scale:!1,category:"travel_and_places"},ferris_wheel:{keywords:["photo","carnival","londoneye"],char:"\ud83c\udfa1",fitzpatrick_scale:!1,category:"travel_and_places"},roller_coaster:{keywords:["carnival","playground","photo","fun"],char:"\ud83c\udfa2",fitzpatrick_scale:!1,category:"travel_and_places"},carousel_horse:{keywords:["photo","carnival"],char:"\ud83c\udfa0",fitzpatrick_scale:!1,category:"travel_and_places"},building_construction:{keywords:["wip","working","progress"],char:"\ud83c\udfd7",fitzpatrick_scale:!1,category:"travel_and_places"},foggy:{keywords:["photo","mountain"],char:"\ud83c\udf01",fitzpatrick_scale:!1,category:"travel_and_places"},tokyo_tower:{keywords:["photo","japanese"],char:"\ud83d\uddfc",fitzpatrick_scale:!1,category:"travel_and_places"},factory:{keywords:["building","industry","pollution","smoke"],char:"\ud83c\udfed",fitzpatrick_scale:!1,category:"travel_and_places"},fountain:{keywords:["photo","summer","water","fresh"],char:"\u26f2",fitzpatrick_scale:!1,category:"travel_and_places"},rice_scene:{keywords:["photo","japan","asia","tsukimi"],char:"\ud83c\udf91",fitzpatrick_scale:!1,category:"travel_and_places"},mountain:{keywords:["photo","nature","environment"],char:"\u26f0",fitzpatrick_scale:!1,category:"travel_and_places"},mountain_snow:{keywords:["photo","nature","environment","winter","cold"],char:"\ud83c\udfd4",fitzpatrick_scale:!1,category:"travel_and_places"},mount_fuji:{keywords:["photo","mountain","nature","japanese"],char:"\ud83d\uddfb",fitzpatrick_scale:!1,category:"travel_and_places"},volcano:{keywords:["photo","nature","disaster"],char:"\ud83c\udf0b",fitzpatrick_scale:!1,category:"travel_and_places"},japan:{keywords:["nation","country","japanese","asia"],char:"\ud83d\uddfe",fitzpatrick_scale:!1,category:"travel_and_places"},camping:{keywords:["photo","outdoors","tent"],char:"\ud83c\udfd5",fitzpatrick_scale:!1,category:"travel_and_places"},tent:{keywords:["photo","camping","outdoors"],char:"\u26fa",fitzpatrick_scale:!1,category:"travel_and_places"},national_park:{keywords:["photo","environment","nature"],char:"\ud83c\udfde",fitzpatrick_scale:!1,category:"travel_and_places"},motorway:{keywords:["road","cupertino","interstate","highway"],char:"\ud83d\udee3",fitzpatrick_scale:!1,category:"travel_and_places"},railway_track:{keywords:["train","transportation"],char:"\ud83d\udee4",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise:{keywords:["morning","view","vacation","photo"],char:"\ud83c\udf05",fitzpatrick_scale:!1,category:"travel_and_places"},sunrise_over_mountains:{keywords:["view","vacation","photo"],char:"\ud83c\udf04",fitzpatrick_scale:!1,category:"travel_and_places"},desert:{keywords:["photo","warm","saharah"],char:"\ud83c\udfdc",fitzpatrick_scale:!1,category:"travel_and_places"},beach_umbrella:{keywords:["weather","summer","sunny","sand","mojito"],char:"\ud83c\udfd6",fitzpatrick_scale:!1,category:"travel_and_places"},desert_island:{keywords:["photo","tropical","mojito"],char:"\ud83c\udfdd",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunrise:{keywords:["photo","good morning","dawn"],char:"\ud83c\udf07",fitzpatrick_scale:!1,category:"travel_and_places"},city_sunset:{keywords:["photo","evening","sky","buildings"],char:"\ud83c\udf06",fitzpatrick_scale:!1,category:"travel_and_places"},cityscape:{keywords:["photo","night life","urban"],char:"\ud83c\udfd9",fitzpatrick_scale:!1,category:"travel_and_places"},night_with_stars:{keywords:["evening","city","downtown"],char:"\ud83c\udf03",fitzpatrick_scale:!1,category:"travel_and_places"},bridge_at_night:{keywords:["photo","sanfrancisco"],char:"\ud83c\udf09",fitzpatrick_scale:!1,category:"travel_and_places"},milky_way:{keywords:["photo","space","stars"],char:"\ud83c\udf0c",fitzpatrick_scale:!1,category:"travel_and_places"},stars:{keywords:["night","photo"],char:"\ud83c\udf20",fitzpatrick_scale:!1,category:"travel_and_places"},sparkler:{keywords:["stars","night","shine"],char:"\ud83c\udf87",fitzpatrick_scale:!1,category:"travel_and_places"},fireworks:{keywords:["photo","festival","carnival","congratulations"],char:"\ud83c\udf86",fitzpatrick_scale:!1,category:"travel_and_places"},rainbow:{keywords:["nature","happy","unicorn_face","photo","sky","spring"],char:"\ud83c\udf08",fitzpatrick_scale:!1,category:"travel_and_places"},houses:{keywords:["buildings","photo"],char:"\ud83c\udfd8",fitzpatrick_scale:!1,category:"travel_and_places"},european_castle:{keywords:["building","royalty","history"],char:"\ud83c\udff0",fitzpatrick_scale:!1,category:"travel_and_places"},japanese_castle:{keywords:["photo","building"],char:"\ud83c\udfef",fitzpatrick_scale:!1,category:"travel_and_places"},stadium:{keywords:["photo","place","sports","concert","venue"],char:"\ud83c\udfdf",fitzpatrick_scale:!1,category:"travel_and_places"},statue_of_liberty:{keywords:["american","newyork"],char:"\ud83d\uddfd",fitzpatrick_scale:!1,category:"travel_and_places"},house:{keywords:["building","home"],char:"\ud83c\udfe0",fitzpatrick_scale:!1,category:"travel_and_places"},house_with_garden:{keywords:["home","plant","nature"],char:"\ud83c\udfe1",fitzpatrick_scale:!1,category:"travel_and_places"},derelict_house:{keywords:["abandon","evict","broken","building"],char:"\ud83c\udfda",fitzpatrick_scale:!1,category:"travel_and_places"},office:{keywords:["building","bureau","work"],char:"\ud83c\udfe2",fitzpatrick_scale:!1,category:"travel_and_places"},department_store:{keywords:["building","shopping","mall"],char:"\ud83c\udfec",fitzpatrick_scale:!1,category:"travel_and_places"},post_office:{keywords:["building","envelope","communication"],char:"\ud83c\udfe3",fitzpatrick_scale:!1,category:"travel_and_places"},european_post_office:{keywords:["building","email"],char:"\ud83c\udfe4",fitzpatrick_scale:!1,category:"travel_and_places"},hospital:{keywords:["building","health","surgery","doctor"],char:"\ud83c\udfe5",fitzpatrick_scale:!1,category:"travel_and_places"},bank:{keywords:["building","money","sales","cash","business","enterprise"],char:"\ud83c\udfe6",fitzpatrick_scale:!1,category:"travel_and_places"},hotel:{keywords:["building","accomodation","checkin"],char:"\ud83c\udfe8",fitzpatrick_scale:!1,category:"travel_and_places"},convenience_store:{keywords:["building","shopping","groceries"],char:"\ud83c\udfea",fitzpatrick_scale:!1,category:"travel_and_places"},school:{keywords:["building","student","education","learn","teach"],char:"\ud83c\udfeb",fitzpatrick_scale:!1,category:"travel_and_places"},love_hotel:{keywords:["like","affection","dating"],char:"\ud83c\udfe9",fitzpatrick_scale:!1,category:"travel_and_places"},wedding:{keywords:["love","like","affection","couple","marriage","bride","groom"],char:"\ud83d\udc92",fitzpatrick_scale:!1,category:"travel_and_places"},classical_building:{keywords:["art","culture","history"],char:"\ud83c\udfdb",fitzpatrick_scale:!1,category:"travel_and_places"},church:{keywords:["building","religion","christ"],char:"\u26ea",fitzpatrick_scale:!1,category:"travel_and_places"},mosque:{keywords:["islam","worship","minaret"],char:"\ud83d\udd4c",fitzpatrick_scale:!1,category:"travel_and_places"},synagogue:{keywords:["judaism","worship","temple","jewish"],char:"\ud83d\udd4d",fitzpatrick_scale:!1,category:"travel_and_places"},kaaba:{keywords:["mecca","mosque","islam"],char:"\ud83d\udd4b",fitzpatrick_scale:!1,category:"travel_and_places"},shinto_shrine:{keywords:["temple","japan","kyoto"],char:"\u26e9",fitzpatrick_scale:!1,category:"travel_and_places"},watch:{keywords:["time","accessories"],char:"\u231a",fitzpatrick_scale:!1,category:"objects"},iphone:{keywords:["technology","apple","gadgets","dial"],char:"\ud83d\udcf1",fitzpatrick_scale:!1,category:"objects"},calling:{keywords:["iphone","incoming"],char:"\ud83d\udcf2",fitzpatrick_scale:!1,category:"objects"},computer:{keywords:["technology","laptop","screen","display","monitor"],char:"\ud83d\udcbb",fitzpatrick_scale:!1,category:"objects"},keyboard:{keywords:["technology","computer","type","input","text"],char:"\u2328",fitzpatrick_scale:!1,category:"objects"},desktop_computer:{keywords:["technology","computing","screen"],char:"\ud83d\udda5",fitzpatrick_scale:!1,category:"objects"},printer:{keywords:["paper","ink"],char:"\ud83d\udda8",fitzpatrick_scale:!1,category:"objects"},computer_mouse:{keywords:["click"],char:"\ud83d\uddb1",fitzpatrick_scale:!1,category:"objects"},trackball:{keywords:["technology","trackpad"],char:"\ud83d\uddb2",fitzpatrick_scale:!1,category:"objects"},joystick:{keywords:["game","play"],char:"\ud83d\udd79",fitzpatrick_scale:!1,category:"objects"},clamp:{keywords:["tool"],char:"\ud83d\udddc",fitzpatrick_scale:!1,category:"objects"},minidisc:{keywords:["technology","record","data","disk","90s"],char:"\ud83d\udcbd",fitzpatrick_scale:!1,category:"objects"},floppy_disk:{keywords:["oldschool","technology","save","90s","80s"],char:"\ud83d\udcbe",fitzpatrick_scale:!1,category:"objects"},cd:{keywords:["technology","dvd","disk","disc","90s"],char:"\ud83d\udcbf",fitzpatrick_scale:!1,category:"objects"},dvd:{keywords:["cd","disk","disc"],char:"\ud83d\udcc0",fitzpatrick_scale:!1,category:"objects"},vhs:{keywords:["record","video","oldschool","90s","80s"],char:"\ud83d\udcfc",fitzpatrick_scale:!1,category:"objects"},camera:{keywords:["gadgets","photography"],char:"\ud83d\udcf7",fitzpatrick_scale:!1,category:"objects"},camera_flash:{keywords:["photography","gadgets"],char:"\ud83d\udcf8",fitzpatrick_scale:!1,category:"objects"},video_camera:{keywords:["film","record"],char:"\ud83d\udcf9",fitzpatrick_scale:!1,category:"objects"},movie_camera:{keywords:["film","record"],char:"\ud83c\udfa5",fitzpatrick_scale:!1,category:"objects"},film_projector:{keywords:["video","tape","record","movie"],char:"\ud83d\udcfd",fitzpatrick_scale:!1,category:"objects"},film_strip:{keywords:["movie"],char:"\ud83c\udf9e",fitzpatrick_scale:!1,category:"objects"},telephone_receiver:{keywords:["technology","communication","dial"],char:"\ud83d\udcde",fitzpatrick_scale:!1,category:"objects"},phone:{keywords:["technology","communication","dial","telephone"],char:"\u260e\ufe0f",fitzpatrick_scale:!1,category:"objects"},pager:{keywords:["bbcall","oldschool","90s"],char:"\ud83d\udcdf",fitzpatrick_scale:!1,category:"objects"},fax:{keywords:["communication","technology"],char:"\ud83d\udce0",fitzpatrick_scale:!1,category:"objects"},tv:{keywords:["technology","program","oldschool","show","television"],char:"\ud83d\udcfa",fitzpatrick_scale:!1,category:"objects"},radio:{keywords:["communication","music","podcast","program"],char:"\ud83d\udcfb",fitzpatrick_scale:!1,category:"objects"},studio_microphone:{keywords:["sing","recording","artist","talkshow"],char:"\ud83c\udf99",fitzpatrick_scale:!1,category:"objects"},level_slider:{keywords:["scale"],char:"\ud83c\udf9a",fitzpatrick_scale:!1,category:"objects"},control_knobs:{keywords:["dial"],char:"\ud83c\udf9b",fitzpatrick_scale:!1,category:"objects"},compass:{keywords:["magnetic","navigation","orienteering"],char:"\ud83e\udded",fitzpatrick_scale:!1,category:"objects"},stopwatch:{keywords:["time","deadline"],char:"\u23f1",fitzpatrick_scale:!1,category:"objects"},timer_clock:{keywords:["alarm"],char:"\u23f2",fitzpatrick_scale:!1,category:"objects"},alarm_clock:{keywords:["time","wake"],char:"\u23f0",fitzpatrick_scale:!1,category:"objects"},mantelpiece_clock:{keywords:["time"],char:"\ud83d\udd70",fitzpatrick_scale:!1,category:"objects"},hourglass_flowing_sand:{keywords:["oldschool","time","countdown"],char:"\u23f3",fitzpatrick_scale:!1,category:"objects"},hourglass:{keywords:["time","clock","oldschool","limit","exam","quiz","test"],char:"\u231b",fitzpatrick_scale:!1,category:"objects"},satellite:{keywords:["communication","future","radio","space"],char:"\ud83d\udce1",fitzpatrick_scale:!1,category:"objects"},battery:{keywords:["power","energy","sustain"],char:"\ud83d\udd0b",fitzpatrick_scale:!1,category:"objects"},electric_plug:{keywords:["charger","power"],char:"\ud83d\udd0c",fitzpatrick_scale:!1,category:"objects"},bulb:{keywords:["light","electricity","idea"],char:"\ud83d\udca1",fitzpatrick_scale:!1,category:"objects"},flashlight:{keywords:["dark","camping","sight","night"],char:"\ud83d\udd26",fitzpatrick_scale:!1,category:"objects"},candle:{keywords:["fire","wax"],char:"\ud83d\udd6f",fitzpatrick_scale:!1,category:"objects"},fire_extinguisher:{keywords:["quench"],char:"\ud83e\uddef",fitzpatrick_scale:!1,category:"objects"},wastebasket:{keywords:["bin","trash","rubbish","garbage","toss"],char:"\ud83d\uddd1",fitzpatrick_scale:!1,category:"objects"},oil_drum:{keywords:["barrell"],char:"\ud83d\udee2",fitzpatrick_scale:!1,category:"objects"},money_with_wings:{keywords:["dollar","bills","payment","sale"],char:"\ud83d\udcb8",fitzpatrick_scale:!1,category:"objects"},dollar:{keywords:["money","sales","bill","currency"],char:"\ud83d\udcb5",fitzpatrick_scale:!1,category:"objects"},yen:{keywords:["money","sales","japanese","dollar","currency"],char:"\ud83d\udcb4",fitzpatrick_scale:!1,category:"objects"},euro:{keywords:["money","sales","dollar","currency"],char:"\ud83d\udcb6",fitzpatrick_scale:!1,category:"objects"},pound:{keywords:["british","sterling","money","sales","bills","uk","england","currency"],char:"\ud83d\udcb7",fitzpatrick_scale:!1,category:"objects"},moneybag:{keywords:["dollar","payment","coins","sale"],char:"\ud83d\udcb0",fitzpatrick_scale:!1,category:"objects"},credit_card:{keywords:["money","sales","dollar","bill","payment","shopping"],char:"\ud83d\udcb3",fitzpatrick_scale:!1,category:"objects"},gem:{keywords:["blue","ruby","diamond","jewelry"],char:"\ud83d\udc8e",fitzpatrick_scale:!1,category:"objects"},balance_scale:{keywords:["law","fairness","weight"],char:"\u2696",fitzpatrick_scale:!1,category:"objects"},toolbox:{keywords:["tools","diy","fix","maintainer","mechanic"],char:"\ud83e\uddf0",fitzpatrick_scale:!1,category:"objects"},wrench:{keywords:["tools","diy","ikea","fix","maintainer"],char:"\ud83d\udd27",fitzpatrick_scale:!1,category:"objects"},hammer:{keywords:["tools","build","create"],char:"\ud83d\udd28",fitzpatrick_scale:!1,category:"objects"},hammer_and_pick:{keywords:["tools","build","create"],char:"\u2692",fitzpatrick_scale:!1,category:"objects"},hammer_and_wrench:{keywords:["tools","build","create"],char:"\ud83d\udee0",fitzpatrick_scale:!1,category:"objects"},pick:{keywords:["tools","dig"],char:"\u26cf",fitzpatrick_scale:!1,category:"objects"},nut_and_bolt:{keywords:["handy","tools","fix"],char:"\ud83d\udd29",fitzpatrick_scale:!1,category:"objects"},gear:{keywords:["cog"],char:"\u2699",fitzpatrick_scale:!1,category:"objects"},brick:{keywords:["bricks"],char:"\ud83e\uddf1",fitzpatrick_scale:!1,category:"objects"},chains:{keywords:["lock","arrest"],char:"\u26d3",fitzpatrick_scale:!1,category:"objects"},magnet:{keywords:["attraction","magnetic"],char:"\ud83e\uddf2",fitzpatrick_scale:!1,category:"objects"},gun:{keywords:["violence","weapon","pistol","revolver"],char:"\ud83d\udd2b",fitzpatrick_scale:!1,category:"objects"},bomb:{keywords:["boom","explode","explosion","terrorism"],char:"\ud83d\udca3",fitzpatrick_scale:!1,category:"objects"},firecracker:{keywords:["dynamite","boom","explode","explosion","explosive"],char:"\ud83e\udde8",fitzpatrick_scale:!1,category:"objects"},hocho:{keywords:["knife","blade","cutlery","kitchen","weapon"],char:"\ud83d\udd2a",fitzpatrick_scale:!1,category:"objects"},dagger:{keywords:["weapon"],char:"\ud83d\udde1",fitzpatrick_scale:!1,category:"objects"},crossed_swords:{keywords:["weapon"],char:"\u2694",fitzpatrick_scale:!1,category:"objects"},shield:{keywords:["protection","security"],char:"\ud83d\udee1",fitzpatrick_scale:!1,category:"objects"},smoking:{keywords:["kills","tobacco","cigarette","joint","smoke"],char:"\ud83d\udeac",fitzpatrick_scale:!1,category:"objects"},skull_and_crossbones:{keywords:["poison","danger","deadly","scary","death","pirate","evil"],char:"\u2620",fitzpatrick_scale:!1,category:"objects"},coffin:{keywords:["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],char:"\u26b0",fitzpatrick_scale:!1,category:"objects"},funeral_urn:{keywords:["dead","die","death","rip","ashes"],char:"\u26b1",fitzpatrick_scale:!1,category:"objects"},amphora:{keywords:["vase","jar"],char:"\ud83c\udffa",fitzpatrick_scale:!1,category:"objects"},crystal_ball:{keywords:["disco","party","magic","circus","fortune_teller"],char:"\ud83d\udd2e",fitzpatrick_scale:!1,category:"objects"},prayer_beads:{keywords:["dhikr","religious"],char:"\ud83d\udcff",fitzpatrick_scale:!1,category:"objects"},nazar_amulet:{keywords:["bead","charm"],char:"\ud83e\uddff",fitzpatrick_scale:!1,category:"objects"},barber:{keywords:["hair","salon","style"],char:"\ud83d\udc88",fitzpatrick_scale:!1,category:"objects"},alembic:{keywords:["distilling","science","experiment","chemistry"],char:"\u2697",fitzpatrick_scale:!1,category:"objects"},telescope:{keywords:["stars","space","zoom","science","astronomy"],char:"\ud83d\udd2d",fitzpatrick_scale:!1,category:"objects"},microscope:{keywords:["laboratory","experiment","zoomin","science","study"],char:"\ud83d\udd2c",fitzpatrick_scale:!1,category:"objects"},hole:{keywords:["embarrassing"],char:"\ud83d\udd73",fitzpatrick_scale:!1,category:"objects"},pill:{keywords:["health","medicine","doctor","pharmacy","drug"],char:"\ud83d\udc8a",fitzpatrick_scale:!1,category:"objects"},syringe:{keywords:["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],char:"\ud83d\udc89",fitzpatrick_scale:!1,category:"objects"},dna:{keywords:["biologist","genetics","life"],char:"\ud83e\uddec",fitzpatrick_scale:!1,category:"objects"},microbe:{keywords:["amoeba","bacteria","germs"],char:"\ud83e\udda0",fitzpatrick_scale:!1,category:"objects"},petri_dish:{keywords:["bacteria","biology","culture","lab"],char:"\ud83e\uddeb",fitzpatrick_scale:!1,category:"objects"},test_tube:{keywords:["chemistry","experiment","lab","science"],char:"\ud83e\uddea",fitzpatrick_scale:!1,category:"objects"},thermometer:{keywords:["weather","temperature","hot","cold"],char:"\ud83c\udf21",fitzpatrick_scale:!1,category:"objects"},broom:{keywords:["cleaning","sweeping","witch"],char:"\ud83e\uddf9",fitzpatrick_scale:!1,category:"objects"},basket:{keywords:["laundry"],char:"\ud83e\uddfa",fitzpatrick_scale:!1,category:"objects"},toilet_paper:{keywords:["roll"],char:"\ud83e\uddfb",fitzpatrick_scale:!1,category:"objects"},label:{keywords:["sale","tag"],char:"\ud83c\udff7",fitzpatrick_scale:!1,category:"objects"},bookmark:{keywords:["favorite","label","save"],char:"\ud83d\udd16",fitzpatrick_scale:!1,category:"objects"},toilet:{keywords:["restroom","wc","washroom","bathroom","potty"],char:"\ud83d\udebd",fitzpatrick_scale:!1,category:"objects"},shower:{keywords:["clean","water","bathroom"],char:"\ud83d\udebf",fitzpatrick_scale:!1,category:"objects"},bathtub:{keywords:["clean","shower","bathroom"],char:"\ud83d\udec1",fitzpatrick_scale:!1,category:"objects"},soap:{keywords:["bar","bathing","cleaning","lather"],char:"\ud83e\uddfc",fitzpatrick_scale:!1,category:"objects"},sponge:{keywords:["absorbing","cleaning","porous"],char:"\ud83e\uddfd",fitzpatrick_scale:!1,category:"objects"},lotion_bottle:{keywords:["moisturizer","sunscreen"],char:"\ud83e\uddf4",fitzpatrick_scale:!1,category:"objects"},key:{keywords:["lock","door","password"],char:"\ud83d\udd11",fitzpatrick_scale:!1,category:"objects"},old_key:{keywords:["lock","door","password"],char:"\ud83d\udddd",fitzpatrick_scale:!1,category:"objects"},couch_and_lamp:{keywords:["read","chill"],char:"\ud83d\udecb",fitzpatrick_scale:!1,category:"objects"},sleeping_bed:{keywords:["bed","rest"],char:"\ud83d\udecc",fitzpatrick_scale:!0,category:"objects"},bed:{keywords:["sleep","rest"],char:"\ud83d\udecf",fitzpatrick_scale:!1,category:"objects"},door:{keywords:["house","entry","exit"],char:"\ud83d\udeaa",fitzpatrick_scale:!1,category:"objects"},bellhop_bell:{keywords:["service"],char:"\ud83d\udece",fitzpatrick_scale:!1,category:"objects"},teddy_bear:{keywords:["plush","stuffed"],char:"\ud83e\uddf8",fitzpatrick_scale:!1,category:"objects"},framed_picture:{keywords:["photography"],char:"\ud83d\uddbc",fitzpatrick_scale:!1,category:"objects"},world_map:{keywords:["location","direction"],char:"\ud83d\uddfa",fitzpatrick_scale:!1,category:"objects"},parasol_on_ground:{keywords:["weather","summer"],char:"\u26f1",fitzpatrick_scale:!1,category:"objects"},moyai:{keywords:["rock","easter island","moai"],char:"\ud83d\uddff",fitzpatrick_scale:!1,category:"objects"},shopping:{keywords:["mall","buy","purchase"],char:"\ud83d\udecd",fitzpatrick_scale:!1,category:"objects"},shopping_cart:{keywords:["trolley"],char:"\ud83d\uded2",fitzpatrick_scale:!1,category:"objects"},balloon:{keywords:["party","celebration","birthday","circus"],char:"\ud83c\udf88",fitzpatrick_scale:!1,category:"objects"},flags:{keywords:["fish","japanese","koinobori","carp","banner"],char:"\ud83c\udf8f",fitzpatrick_scale:!1,category:"objects"},ribbon:{keywords:["decoration","pink","girl","bowtie"],char:"\ud83c\udf80",fitzpatrick_scale:!1,category:"objects"},gift:{keywords:["present","birthday","christmas","xmas"],char:"\ud83c\udf81",fitzpatrick_scale:!1,category:"objects"},confetti_ball:{keywords:["festival","party","birthday","circus"],char:"\ud83c\udf8a",fitzpatrick_scale:!1,category:"objects"},tada:{keywords:["party","congratulations","birthday","magic","circus","celebration"],char:"\ud83c\udf89",fitzpatrick_scale:!1,category:"objects"},dolls:{keywords:["japanese","toy","kimono"],char:"\ud83c\udf8e",fitzpatrick_scale:!1,category:"objects"},wind_chime:{keywords:["nature","ding","spring","bell"],char:"\ud83c\udf90",fitzpatrick_scale:!1,category:"objects"},crossed_flags:{keywords:["japanese","nation","country","border"],char:"\ud83c\udf8c",fitzpatrick_scale:!1,category:"objects"},izakaya_lantern:{keywords:["light","paper","halloween","spooky"],char:"\ud83c\udfee",fitzpatrick_scale:!1,category:"objects"},red_envelope:{keywords:["gift"],char:"\ud83e\udde7",fitzpatrick_scale:!1,category:"objects"},email:{keywords:["letter","postal","inbox","communication"],char:"\u2709\ufe0f",fitzpatrick_scale:!1,category:"objects"},envelope_with_arrow:{keywords:["email","communication"],char:"\ud83d\udce9",fitzpatrick_scale:!1,category:"objects"},incoming_envelope:{keywords:["email","inbox"],char:"\ud83d\udce8",fitzpatrick_scale:!1,category:"objects"},"e-mail":{keywords:["communication","inbox"],char:"\ud83d\udce7",fitzpatrick_scale:!1,category:"objects"},love_letter:{keywords:["email","like","affection","envelope","valentines"],char:"\ud83d\udc8c",fitzpatrick_scale:!1,category:"objects"},postbox:{keywords:["email","letter","envelope"],char:"\ud83d\udcee",fitzpatrick_scale:!1,category:"objects"},mailbox_closed:{keywords:["email","communication","inbox"],char:"\ud83d\udcea",fitzpatrick_scale:!1,category:"objects"},mailbox:{keywords:["email","inbox","communication"],char:"\ud83d\udceb",fitzpatrick_scale:!1,category:"objects"},mailbox_with_mail:{keywords:["email","inbox","communication"],char:"\ud83d\udcec",fitzpatrick_scale:!1,category:"objects"},mailbox_with_no_mail:{keywords:["email","inbox"],char:"\ud83d\udced",fitzpatrick_scale:!1,category:"objects"},package:{keywords:["mail","gift","cardboard","box","moving"],char:"\ud83d\udce6",fitzpatrick_scale:!1,category:"objects"},postal_horn:{keywords:["instrument","music"],char:"\ud83d\udcef",fitzpatrick_scale:!1,category:"objects"},inbox_tray:{keywords:["email","documents"],char:"\ud83d\udce5",fitzpatrick_scale:!1,category:"objects"},outbox_tray:{keywords:["inbox","email"],char:"\ud83d\udce4",fitzpatrick_scale:!1,category:"objects"},scroll:{keywords:["documents","ancient","history","paper"],char:"\ud83d\udcdc",fitzpatrick_scale:!1,category:"objects"},page_with_curl:{keywords:["documents","office","paper"],char:"\ud83d\udcc3",fitzpatrick_scale:!1,category:"objects"},bookmark_tabs:{keywords:["favorite","save","order","tidy"],char:"\ud83d\udcd1",fitzpatrick_scale:!1,category:"objects"},receipt:{keywords:["accounting","expenses"],char:"\ud83e\uddfe",fitzpatrick_scale:!1,category:"objects"},bar_chart:{keywords:["graph","presentation","stats"],char:"\ud83d\udcca",fitzpatrick_scale:!1,category:"objects"},chart_with_upwards_trend:{keywords:["graph","presentation","stats","recovery","business","economics","money","sales","good","success"],char:"\ud83d\udcc8",fitzpatrick_scale:!1,category:"objects"},chart_with_downwards_trend:{keywords:["graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],char:"\ud83d\udcc9",fitzpatrick_scale:!1,category:"objects"},page_facing_up:{keywords:["documents","office","paper","information"],char:"\ud83d\udcc4",fitzpatrick_scale:!1,category:"objects"},date:{keywords:["calendar","schedule"],char:"\ud83d\udcc5",fitzpatrick_scale:!1,category:"objects"},calendar:{keywords:["schedule","date","planning"],char:"\ud83d\udcc6",fitzpatrick_scale:!1,category:"objects"},spiral_calendar:{keywords:["date","schedule","planning"],char:"\ud83d\uddd3",fitzpatrick_scale:!1,category:"objects"},card_index:{keywords:["business","stationery"],char:"\ud83d\udcc7",fitzpatrick_scale:!1,category:"objects"},card_file_box:{keywords:["business","stationery"],char:"\ud83d\uddc3",fitzpatrick_scale:!1,category:"objects"},ballot_box:{keywords:["election","vote"],char:"\ud83d\uddf3",fitzpatrick_scale:!1,category:"objects"},file_cabinet:{keywords:["filing","organizing"],char:"\ud83d\uddc4",fitzpatrick_scale:!1,category:"objects"},clipboard:{keywords:["stationery","documents"],char:"\ud83d\udccb",fitzpatrick_scale:!1,category:"objects"},spiral_notepad:{keywords:["memo","stationery"],char:"\ud83d\uddd2",fitzpatrick_scale:!1,category:"objects"},file_folder:{keywords:["documents","business","office"],char:"\ud83d\udcc1",fitzpatrick_scale:!1,category:"objects"},open_file_folder:{keywords:["documents","load"],char:"\ud83d\udcc2",fitzpatrick_scale:!1,category:"objects"},card_index_dividers:{keywords:["organizing","business","stationery"],char:"\ud83d\uddc2",fitzpatrick_scale:!1,category:"objects"},newspaper_roll:{keywords:["press","headline"],char:"\ud83d\uddde",fitzpatrick_scale:!1,category:"objects"},newspaper:{keywords:["press","headline"],char:"\ud83d\udcf0",fitzpatrick_scale:!1,category:"objects"},notebook:{keywords:["stationery","record","notes","paper","study"],char:"\ud83d\udcd3",fitzpatrick_scale:!1,category:"objects"},closed_book:{keywords:["read","library","knowledge","textbook","learn"],char:"\ud83d\udcd5",fitzpatrick_scale:!1,category:"objects"},green_book:{keywords:["read","library","knowledge","study"],char:"\ud83d\udcd7",fitzpatrick_scale:!1,category:"objects"},blue_book:{keywords:["read","library","knowledge","learn","study"],char:"\ud83d\udcd8",fitzpatrick_scale:!1,category:"objects"},orange_book:{keywords:["read","library","knowledge","textbook","study"],char:"\ud83d\udcd9",fitzpatrick_scale:!1,category:"objects"},notebook_with_decorative_cover:{keywords:["classroom","notes","record","paper","study"],char:"\ud83d\udcd4",fitzpatrick_scale:!1,category:"objects"},ledger:{keywords:["notes","paper"],char:"\ud83d\udcd2",fitzpatrick_scale:!1,category:"objects"},books:{keywords:["literature","library","study"],char:"\ud83d\udcda",fitzpatrick_scale:!1,category:"objects"},open_book:{keywords:["book","read","library","knowledge","literature","learn","study"],char:"\ud83d\udcd6",fitzpatrick_scale:!1,category:"objects"},safety_pin:{keywords:["diaper"],char:"\ud83e\uddf7",fitzpatrick_scale:!1,category:"objects"},link:{keywords:["rings","url"],char:"\ud83d\udd17",fitzpatrick_scale:!1,category:"objects"},paperclip:{keywords:["documents","stationery"],char:"\ud83d\udcce",fitzpatrick_scale:!1,category:"objects"},paperclips:{keywords:["documents","stationery"],char:"\ud83d\udd87",fitzpatrick_scale:!1,category:"objects"},scissors:{keywords:["stationery","cut"],char:"\u2702\ufe0f",fitzpatrick_scale:!1,category:"objects"},triangular_ruler:{keywords:["stationery","math","architect","sketch"],char:"\ud83d\udcd0",fitzpatrick_scale:!1,category:"objects"},straight_ruler:{keywords:["stationery","calculate","length","math","school","drawing","architect","sketch"],char:"\ud83d\udccf",fitzpatrick_scale:!1,category:"objects"},abacus:{keywords:["calculation"],char:"\ud83e\uddee",fitzpatrick_scale:!1,category:"objects"},pushpin:{keywords:["stationery","mark","here"],char:"\ud83d\udccc",fitzpatrick_scale:!1,category:"objects"},round_pushpin:{keywords:["stationery","location","map","here"],char:"\ud83d\udccd",fitzpatrick_scale:!1,category:"objects"},triangular_flag_on_post:{keywords:["mark","milestone","place"],char:"\ud83d\udea9",fitzpatrick_scale:!1,category:"objects"},white_flag:{keywords:["losing","loser","lost","surrender","give up","fail"],char:"\ud83c\udff3",fitzpatrick_scale:!1,category:"objects"},black_flag:{keywords:["pirate"],char:"\ud83c\udff4",fitzpatrick_scale:!1,category:"objects"},rainbow_flag:{keywords:["flag","rainbow","pride","gay","lgbt","glbt","queer","homosexual","lesbian","bisexual","transgender"],char:"\ud83c\udff3\ufe0f\u200d\ud83c\udf08",fitzpatrick_scale:!1,category:"objects"},closed_lock_with_key:{keywords:["security","privacy"],char:"\ud83d\udd10",fitzpatrick_scale:!1,category:"objects"},lock:{keywords:["security","password","padlock"],char:"\ud83d\udd12",fitzpatrick_scale:!1,category:"objects"},unlock:{keywords:["privacy","security"],char:"\ud83d\udd13",fitzpatrick_scale:!1,category:"objects"},lock_with_ink_pen:{keywords:["security","secret"],char:"\ud83d\udd0f",fitzpatrick_scale:!1,category:"objects"},pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8a",fitzpatrick_scale:!1,category:"objects"},fountain_pen:{keywords:["stationery","writing","write"],char:"\ud83d\udd8b",fitzpatrick_scale:!1,category:"objects"},black_nib:{keywords:["pen","stationery","writing","write"],char:"\u2712\ufe0f",fitzpatrick_scale:!1,category:"objects"},memo:{keywords:["write","documents","stationery","pencil","paper","writing","legal","exam","quiz","test","study","compose"],char:"\ud83d\udcdd",fitzpatrick_scale:!1,category:"objects"},pencil2:{keywords:["stationery","write","paper","writing","school","study"],char:"\u270f\ufe0f",fitzpatrick_scale:!1,category:"objects"},crayon:{keywords:["drawing","creativity"],char:"\ud83d\udd8d",fitzpatrick_scale:!1,category:"objects"},paintbrush:{keywords:["drawing","creativity","art"],char:"\ud83d\udd8c",fitzpatrick_scale:!1,category:"objects"},mag:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0d",fitzpatrick_scale:!1,category:"objects"},mag_right:{keywords:["search","zoom","find","detective"],char:"\ud83d\udd0e",fitzpatrick_scale:!1,category:"objects"},heart:{keywords:["love","like","valentines"],char:"\u2764\ufe0f",fitzpatrick_scale:!1,category:"symbols"},orange_heart:{keywords:["love","like","affection","valentines"],char:"\ud83e\udde1",fitzpatrick_scale:!1,category:"symbols"},yellow_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9b",fitzpatrick_scale:!1,category:"symbols"},green_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9a",fitzpatrick_scale:!1,category:"symbols"},blue_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc99",fitzpatrick_scale:!1,category:"symbols"},purple_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9c",fitzpatrick_scale:!1,category:"symbols"},black_heart:{keywords:["evil"],char:"\ud83d\udda4",fitzpatrick_scale:!1,category:"symbols"},broken_heart:{keywords:["sad","sorry","break","heart","heartbreak"],char:"\ud83d\udc94",fitzpatrick_scale:!1,category:"symbols"},heavy_heart_exclamation:{keywords:["decoration","love"],char:"\u2763",fitzpatrick_scale:!1,category:"symbols"},two_hearts:{keywords:["love","like","affection","valentines","heart"],char:"\ud83d\udc95",fitzpatrick_scale:!1,category:"symbols"},revolving_hearts:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc9e",fitzpatrick_scale:!1,category:"symbols"},heartbeat:{keywords:["love","like","affection","valentines","pink","heart"],char:"\ud83d\udc93",fitzpatrick_scale:!1,category:"symbols"},heartpulse:{keywords:["like","love","affection","valentines","pink"],char:"\ud83d\udc97",fitzpatrick_scale:!1,category:"symbols"},sparkling_heart:{keywords:["love","like","affection","valentines"],char:"\ud83d\udc96",fitzpatrick_scale:!1,category:"symbols"},cupid:{keywords:["love","like","heart","affection","valentines"],char:"\ud83d\udc98",fitzpatrick_scale:!1,category:"symbols"},gift_heart:{keywords:["love","valentines"],char:"\ud83d\udc9d",fitzpatrick_scale:!1,category:"symbols"},heart_decoration:{keywords:["purple-square","love","like"],char:"\ud83d\udc9f",fitzpatrick_scale:!1,category:"symbols"},peace_symbol:{keywords:["hippie"],char:"\u262e",fitzpatrick_scale:!1,category:"symbols"},latin_cross:{keywords:["christianity"],char:"\u271d",fitzpatrick_scale:!1,category:"symbols"},star_and_crescent:{keywords:["islam"],char:"\u262a",fitzpatrick_scale:!1,category:"symbols"},om:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\ud83d\udd49",fitzpatrick_scale:!1,category:"symbols"},wheel_of_dharma:{keywords:["hinduism","buddhism","sikhism","jainism"],char:"\u2638",fitzpatrick_scale:!1,category:"symbols"},star_of_david:{keywords:["judaism"],char:"\u2721",fitzpatrick_scale:!1,category:"symbols"},six_pointed_star:{keywords:["purple-square","religion","jewish","hexagram"],char:"\ud83d\udd2f",fitzpatrick_scale:!1,category:"symbols"},menorah:{keywords:["hanukkah","candles","jewish"],char:"\ud83d\udd4e",fitzpatrick_scale:!1,category:"symbols"},yin_yang:{keywords:["balance"],char:"\u262f",fitzpatrick_scale:!1,category:"symbols"},orthodox_cross:{keywords:["suppedaneum","religion"],char:"\u2626",fitzpatrick_scale:!1,category:"symbols"},place_of_worship:{keywords:["religion","church","temple","prayer"],char:"\ud83d\uded0",fitzpatrick_scale:!1,category:"symbols"},ophiuchus:{keywords:["sign","purple-square","constellation","astrology"],char:"\u26ce",fitzpatrick_scale:!1,category:"symbols"},aries:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2648",fitzpatrick_scale:!1,category:"symbols"},taurus:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2649",fitzpatrick_scale:!1,category:"symbols"},gemini:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264a",fitzpatrick_scale:!1,category:"symbols"},cancer:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264b",fitzpatrick_scale:!1,category:"symbols"},leo:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264c",fitzpatrick_scale:!1,category:"symbols"},virgo:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u264d",fitzpatrick_scale:!1,category:"symbols"},libra:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u264e",fitzpatrick_scale:!1,category:"symbols"},scorpius:{keywords:["sign","zodiac","purple-square","astrology","scorpio"],char:"\u264f",fitzpatrick_scale:!1,category:"symbols"},sagittarius:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2650",fitzpatrick_scale:!1,category:"symbols"},capricorn:{keywords:["sign","zodiac","purple-square","astrology"],char:"\u2651",fitzpatrick_scale:!1,category:"symbols"},aquarius:{keywords:["sign","purple-square","zodiac","astrology"],char:"\u2652",fitzpatrick_scale:!1,category:"symbols"},pisces:{keywords:["purple-square","sign","zodiac","astrology"],char:"\u2653",fitzpatrick_scale:!1,category:"symbols"},id:{keywords:["purple-square","words"],char:"\ud83c\udd94",fitzpatrick_scale:!1,category:"symbols"},atom_symbol:{keywords:["science","physics","chemistry"],char:"\u269b",fitzpatrick_scale:!1,category:"symbols"},u7a7a:{keywords:["kanji","japanese","chinese","empty","sky","blue-square"],char:"\ud83c\ude33",fitzpatrick_scale:!1,category:"symbols"},u5272:{keywords:["cut","divide","chinese","kanji","pink-square"],char:"\ud83c\ude39",fitzpatrick_scale:!1,category:"symbols"},radioactive:{keywords:["nuclear","danger"],char:"\u2622",fitzpatrick_scale:!1,category:"symbols"},biohazard:{keywords:["danger"],char:"\u2623",fitzpatrick_scale:!1,category:"symbols"},mobile_phone_off:{keywords:["mute","orange-square","silence","quiet"],char:"\ud83d\udcf4",fitzpatrick_scale:!1,category:"symbols"},vibration_mode:{keywords:["orange-square","phone"],char:"\ud83d\udcf3",fitzpatrick_scale:!1,category:"symbols"},u6709:{keywords:["orange-square","chinese","have","kanji"],char:"\ud83c\ude36",fitzpatrick_scale:!1,category:"symbols"},u7121:{keywords:["nothing","chinese","kanji","japanese","orange-square"],char:"\ud83c\ude1a",fitzpatrick_scale:!1,category:"symbols"},u7533:{keywords:["chinese","japanese","kanji","orange-square"],char:"\ud83c\ude38",fitzpatrick_scale:!1,category:"symbols"},u55b6:{keywords:["japanese","opening hours","orange-square"],char:"\ud83c\ude3a",fitzpatrick_scale:!1,category:"symbols"},u6708:{keywords:["chinese","month","moon","japanese","orange-square","kanji"],char:"\ud83c\ude37\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_pointed_black_star:{keywords:["orange-square","shape","polygon"],char:"\u2734\ufe0f",fitzpatrick_scale:!1,category:"symbols"},vs:{keywords:["words","orange-square"],char:"\ud83c\udd9a",fitzpatrick_scale:!1,category:"symbols"},accept:{keywords:["ok","good","chinese","kanji","agree","yes","orange-circle"],char:"\ud83c\ude51",fitzpatrick_scale:!1,category:"symbols"},white_flower:{keywords:["japanese","spring"],char:"\ud83d\udcae",fitzpatrick_scale:!1,category:"symbols"},ideograph_advantage:{keywords:["chinese","kanji","obtain","get","circle"],char:"\ud83c\ude50",fitzpatrick_scale:!1,category:"symbols"},secret:{keywords:["privacy","chinese","sshh","kanji","red-circle"],char:"\u3299\ufe0f",fitzpatrick_scale:!1,category:"symbols"},congratulations:{keywords:["chinese","kanji","japanese","red-circle"],char:"\u3297\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u5408:{keywords:["japanese","chinese","join","kanji","red-square"],char:"\ud83c\ude34",fitzpatrick_scale:!1,category:"symbols"},u6e80:{keywords:["full","chinese","japanese","red-square","kanji"],char:"\ud83c\ude35",fitzpatrick_scale:!1,category:"symbols"},u7981:{keywords:["kanji","japanese","chinese","forbidden","limit","restricted","red-square"],char:"\ud83c\ude32",fitzpatrick_scale:!1,category:"symbols"},a:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd70\ufe0f",fitzpatrick_scale:!1,category:"symbols"},b:{keywords:["red-square","alphabet","letter"],char:"\ud83c\udd71\ufe0f",fitzpatrick_scale:!1,category:"symbols"},ab:{keywords:["red-square","alphabet"],char:"\ud83c\udd8e",fitzpatrick_scale:!1,category:"symbols"},cl:{keywords:["alphabet","words","red-square"],char:"\ud83c\udd91",fitzpatrick_scale:!1,category:"symbols"},o2:{keywords:["alphabet","red-square","letter"],char:"\ud83c\udd7e\ufe0f",fitzpatrick_scale:!1,category:"symbols"},sos:{keywords:["help","red-square","words","emergency","911"],char:"\ud83c\udd98",fitzpatrick_scale:!1,category:"symbols"},no_entry:{keywords:["limit","security","privacy","bad","denied","stop","circle"],char:"\u26d4",fitzpatrick_scale:!1,category:"symbols"},name_badge:{keywords:["fire","forbid"],char:"\ud83d\udcdb",fitzpatrick_scale:!1,category:"symbols"},no_entry_sign:{keywords:["forbid","stop","limit","denied","disallow","circle"],char:"\ud83d\udeab",fitzpatrick_scale:!1,category:"symbols"},x:{keywords:["no","delete","remove","cancel","red"],char:"\u274c",fitzpatrick_scale:!1,category:"symbols"},o:{keywords:["circle","round"],char:"\u2b55",fitzpatrick_scale:!1,category:"symbols"},stop_sign:{keywords:["stop"],char:"\ud83d\uded1",fitzpatrick_scale:!1,category:"symbols"},anger:{keywords:["angry","mad"],char:"\ud83d\udca2",fitzpatrick_scale:!1,category:"symbols"},hotsprings:{keywords:["bath","warm","relax"],char:"\u2668\ufe0f",fitzpatrick_scale:!1,category:"symbols"},no_pedestrians:{keywords:["rules","crossing","walking","circle"],char:"\ud83d\udeb7",fitzpatrick_scale:!1,category:"symbols"},do_not_litter:{keywords:["trash","bin","garbage","circle"],char:"\ud83d\udeaf",fitzpatrick_scale:!1,category:"symbols"},no_bicycles:{keywords:["cyclist","prohibited","circle"],char:"\ud83d\udeb3",fitzpatrick_scale:!1,category:"symbols"},"non-potable_water":{keywords:["drink","faucet","tap","circle"],char:"\ud83d\udeb1",fitzpatrick_scale:!1,category:"symbols"},underage:{keywords:["18","drink","pub","night","minor","circle"],char:"\ud83d\udd1e",fitzpatrick_scale:!1,category:"symbols"},no_mobile_phones:{keywords:["iphone","mute","circle"],char:"\ud83d\udcf5",fitzpatrick_scale:!1,category:"symbols"},exclamation:{keywords:["heavy_exclamation_mark","danger","surprise","punctuation","wow","warning"],char:"\u2757",fitzpatrick_scale:!1,category:"symbols"},grey_exclamation:{keywords:["surprise","punctuation","gray","wow","warning"],char:"\u2755",fitzpatrick_scale:!1,category:"symbols"},question:{keywords:["doubt","confused"],char:"\u2753",fitzpatrick_scale:!1,category:"symbols"},grey_question:{keywords:["doubts","gray","huh","confused"],char:"\u2754",fitzpatrick_scale:!1,category:"symbols"},bangbang:{keywords:["exclamation","surprise"],char:"\u203c\ufe0f",fitzpatrick_scale:!1,category:"symbols"},interrobang:{keywords:["wat","punctuation","surprise"],char:"\u2049\ufe0f",fitzpatrick_scale:!1,category:"symbols"},100:{keywords:["score","perfect","numbers","century","exam","quiz","test","pass","hundred"],char:"\ud83d\udcaf",fitzpatrick_scale:!1,category:"symbols"},low_brightness:{keywords:["sun","afternoon","warm","summer"],char:"\ud83d\udd05",fitzpatrick_scale:!1,category:"symbols"},high_brightness:{keywords:["sun","light"],char:"\ud83d\udd06",fitzpatrick_scale:!1,category:"symbols"},trident:{keywords:["weapon","spear"],char:"\ud83d\udd31",fitzpatrick_scale:!1,category:"symbols"},fleur_de_lis:{keywords:["decorative","scout"],char:"\u269c",fitzpatrick_scale:!1,category:"symbols"},part_alternation_mark:{keywords:["graph","presentation","stats","business","economics","bad"],char:"\u303d\ufe0f",fitzpatrick_scale:!1,category:"symbols"},warning:{keywords:["exclamation","wip","alert","error","problem","issue"],char:"\u26a0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},children_crossing:{keywords:["school","warning","danger","sign","driving","yellow-diamond"],char:"\ud83d\udeb8",fitzpatrick_scale:!1,category:"symbols"},beginner:{keywords:["badge","shield"],char:"\ud83d\udd30",fitzpatrick_scale:!1,category:"symbols"},recycle:{keywords:["arrow","environment","garbage","trash"],char:"\u267b\ufe0f",fitzpatrick_scale:!1,category:"symbols"},u6307:{keywords:["chinese","point","green-square","kanji"],char:"\ud83c\ude2f",fitzpatrick_scale:!1,category:"symbols"},chart:{keywords:["green-square","graph","presentation","stats"],char:"\ud83d\udcb9",fitzpatrick_scale:!1,category:"symbols"},sparkle:{keywords:["stars","green-square","awesome","good","fireworks"],char:"\u2747\ufe0f",fitzpatrick_scale:!1,category:"symbols"},eight_spoked_asterisk:{keywords:["star","sparkle","green-square"],char:"\u2733\ufe0f",fitzpatrick_scale:!1,category:"symbols"},negative_squared_cross_mark:{keywords:["x","green-square","no","deny"],char:"\u274e",fitzpatrick_scale:!1,category:"symbols"},white_check_mark:{keywords:["green-square","ok","agree","vote","election","answer","tick"],char:"\u2705",fitzpatrick_scale:!1,category:"symbols"},diamond_shape_with_a_dot_inside:{keywords:["jewel","blue","gem","crystal","fancy"],char:"\ud83d\udca0",fitzpatrick_scale:!1,category:"symbols"},cyclone:{keywords:["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],char:"\ud83c\udf00",fitzpatrick_scale:!1,category:"symbols"},loop:{keywords:["tape","cassette"],char:"\u27bf",fitzpatrick_scale:!1,category:"symbols"},globe_with_meridians:{keywords:["earth","international","world","internet","interweb","i18n"],char:"\ud83c\udf10",fitzpatrick_scale:!1,category:"symbols"},m:{keywords:["alphabet","blue-circle","letter"],char:"\u24c2\ufe0f",fitzpatrick_scale:!1,category:"symbols"},atm:{keywords:["money","sales","cash","blue-square","payment","bank"],char:"\ud83c\udfe7",fitzpatrick_scale:!1,category:"symbols"},sa:{keywords:["japanese","blue-square","katakana"],char:"\ud83c\ude02\ufe0f",fitzpatrick_scale:!1,category:"symbols"},passport_control:{keywords:["custom","blue-square"],char:"\ud83d\udec2",fitzpatrick_scale:!1,category:"symbols"},customs:{keywords:["passport","border","blue-square"],char:"\ud83d\udec3",fitzpatrick_scale:!1,category:"symbols"},baggage_claim:{keywords:["blue-square","airport","transport"],char:"\ud83d\udec4",fitzpatrick_scale:!1,category:"symbols"},left_luggage:{keywords:["blue-square","travel"],char:"\ud83d\udec5",fitzpatrick_scale:!1,category:"symbols"},wheelchair:{keywords:["blue-square","disabled","a11y","accessibility"],char:"\u267f",fitzpatrick_scale:!1,category:"symbols"},no_smoking:{keywords:["cigarette","blue-square","smell","smoke"],char:"\ud83d\udead",fitzpatrick_scale:!1,category:"symbols"},wc:{keywords:["toilet","restroom","blue-square"],char:"\ud83d\udebe",fitzpatrick_scale:!1,category:"symbols"},parking:{keywords:["cars","blue-square","alphabet","letter"],char:"\ud83c\udd7f\ufe0f",fitzpatrick_scale:!1,category:"symbols"},potable_water:{keywords:["blue-square","liquid","restroom","cleaning","faucet"],char:"\ud83d\udeb0",fitzpatrick_scale:!1,category:"symbols"},mens:{keywords:["toilet","restroom","wc","blue-square","gender","male"],char:"\ud83d\udeb9",fitzpatrick_scale:!1,category:"symbols"},womens:{keywords:["purple-square","woman","female","toilet","loo","restroom","gender"],char:"\ud83d\udeba",fitzpatrick_scale:!1,category:"symbols"},baby_symbol:{keywords:["orange-square","child"],char:"\ud83d\udebc",fitzpatrick_scale:!1,category:"symbols"},restroom:{keywords:["blue-square","toilet","refresh","wc","gender"],char:"\ud83d\udebb",fitzpatrick_scale:!1,category:"symbols"},put_litter_in_its_place:{keywords:["blue-square","sign","human","info"],char:"\ud83d\udeae",fitzpatrick_scale:!1,category:"symbols"},cinema:{keywords:["blue-square","record","film","movie","curtain","stage","theater"],char:"\ud83c\udfa6",fitzpatrick_scale:!1,category:"symbols"},signal_strength:{keywords:["blue-square","reception","phone","internet","connection","wifi","bluetooth","bars"],char:"\ud83d\udcf6",fitzpatrick_scale:!1,category:"symbols"},koko:{keywords:["blue-square","here","katakana","japanese","destination"],char:"\ud83c\ude01",fitzpatrick_scale:!1,category:"symbols"},ng:{keywords:["blue-square","words","shape","icon"],char:"\ud83c\udd96",fitzpatrick_scale:!1,category:"symbols"},ok:{keywords:["good","agree","yes","blue-square"],char:"\ud83c\udd97",fitzpatrick_scale:!1,category:"symbols"},up:{keywords:["blue-square","above","high"],char:"\ud83c\udd99",fitzpatrick_scale:!1,category:"symbols"},cool:{keywords:["words","blue-square"],char:"\ud83c\udd92",fitzpatrick_scale:!1,category:"symbols"},new:{keywords:["blue-square","words","start"],char:"\ud83c\udd95",fitzpatrick_scale:!1,category:"symbols"},free:{keywords:["blue-square","words"],char:"\ud83c\udd93",fitzpatrick_scale:!1,category:"symbols"},zero:{keywords:["0","numbers","blue-square","null"],char:"0\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},one:{keywords:["blue-square","numbers","1"],char:"1\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},two:{keywords:["numbers","2","prime","blue-square"],char:"2\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},three:{keywords:["3","numbers","prime","blue-square"],char:"3\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},four:{keywords:["4","numbers","blue-square"],char:"4\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},five:{keywords:["5","numbers","blue-square","prime"],char:"5\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},six:{keywords:["6","numbers","blue-square"],char:"6\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},seven:{keywords:["7","numbers","blue-square","prime"],char:"7\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},eight:{keywords:["8","blue-square","numbers"],char:"8\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},nine:{keywords:["blue-square","numbers","9"],char:"9\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},keycap_ten:{keywords:["numbers","10","blue-square"],char:"\ud83d\udd1f",fitzpatrick_scale:!1,category:"symbols"},asterisk:{keywords:["star","keycap"],char:"*\u20e3",fitzpatrick_scale:!1,category:"symbols"},1234:{keywords:["numbers","blue-square"],char:"\ud83d\udd22",fitzpatrick_scale:!1,category:"symbols"},eject_button:{keywords:["blue-square"],char:"\u23cf\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_forward:{keywords:["blue-square","right","direction","play"],char:"\u25b6\ufe0f",fitzpatrick_scale:!1,category:"symbols"},pause_button:{keywords:["pause","blue-square"],char:"\u23f8",fitzpatrick_scale:!1,category:"symbols"},next_track_button:{keywords:["forward","next","blue-square"],char:"\u23ed",fitzpatrick_scale:!1,category:"symbols"},stop_button:{keywords:["blue-square"],char:"\u23f9",fitzpatrick_scale:!1,category:"symbols"},record_button:{keywords:["blue-square"],char:"\u23fa",fitzpatrick_scale:!1,category:"symbols"},play_or_pause_button:{keywords:["blue-square","play","pause"],char:"\u23ef",fitzpatrick_scale:!1,category:"symbols"},previous_track_button:{keywords:["backward"],char:"\u23ee",fitzpatrick_scale:!1,category:"symbols"},fast_forward:{keywords:["blue-square","play","speed","continue"],char:"\u23e9",fitzpatrick_scale:!1,category:"symbols"},rewind:{keywords:["play","blue-square"],char:"\u23ea",fitzpatrick_scale:!1,category:"symbols"},twisted_rightwards_arrows:{keywords:["blue-square","shuffle","music","random"],char:"\ud83d\udd00",fitzpatrick_scale:!1,category:"symbols"},repeat:{keywords:["loop","record"],char:"\ud83d\udd01",fitzpatrick_scale:!1,category:"symbols"},repeat_one:{keywords:["blue-square","loop"],char:"\ud83d\udd02",fitzpatrick_scale:!1,category:"symbols"},arrow_backward:{keywords:["blue-square","left","direction"],char:"\u25c0\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_small:{keywords:["blue-square","triangle","direction","point","forward","top"],char:"\ud83d\udd3c",fitzpatrick_scale:!1,category:"symbols"},arrow_down_small:{keywords:["blue-square","direction","bottom"],char:"\ud83d\udd3d",fitzpatrick_scale:!1,category:"symbols"},arrow_double_up:{keywords:["blue-square","direction","top"],char:"\u23eb",fitzpatrick_scale:!1,category:"symbols"},arrow_double_down:{keywords:["blue-square","direction","bottom"],char:"\u23ec",fitzpatrick_scale:!1,category:"symbols"},arrow_right:{keywords:["blue-square","next"],char:"\u27a1\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_left:{keywords:["blue-square","previous","back"],char:"\u2b05\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up:{keywords:["blue-square","continue","top","direction"],char:"\u2b06\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_down:{keywords:["blue-square","direction","bottom"],char:"\u2b07\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_right:{keywords:["blue-square","point","direction","diagonal","northeast"],char:"\u2197\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_right:{keywords:["blue-square","direction","diagonal","southeast"],char:"\u2198\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_lower_left:{keywords:["blue-square","direction","diagonal","southwest"],char:"\u2199\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_upper_left:{keywords:["blue-square","point","direction","diagonal","northwest"],char:"\u2196\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_up_down:{keywords:["blue-square","direction","way","vertical"],char:"\u2195\ufe0f",fitzpatrick_scale:!1,category:"symbols"},left_right_arrow:{keywords:["shape","direction","horizontal","sideways"],char:"\u2194\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_counterclockwise:{keywords:["blue-square","sync","cycle"],char:"\ud83d\udd04",fitzpatrick_scale:!1,category:"symbols"},arrow_right_hook:{keywords:["blue-square","return","rotate","direction"],char:"\u21aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},leftwards_arrow_with_hook:{keywords:["back","return","blue-square","undo","enter"],char:"\u21a9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_up:{keywords:["blue-square","direction","top"],char:"\u2934\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrow_heading_down:{keywords:["blue-square","direction","bottom"],char:"\u2935\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hash:{keywords:["symbol","blue-square","twitter"],char:"#\ufe0f\u20e3",fitzpatrick_scale:!1,category:"symbols"},information_source:{keywords:["blue-square","alphabet","letter"],char:"\u2139\ufe0f",fitzpatrick_scale:!1,category:"symbols"},abc:{keywords:["blue-square","alphabet"],char:"\ud83d\udd24",fitzpatrick_scale:!1,category:"symbols"},abcd:{keywords:["blue-square","alphabet"],char:"\ud83d\udd21",fitzpatrick_scale:!1,category:"symbols"},capital_abcd:{keywords:["alphabet","words","blue-square"],char:"\ud83d\udd20",fitzpatrick_scale:!1,category:"symbols"},symbols:{keywords:["blue-square","music","note","ampersand","percent","glyphs","characters"],char:"\ud83d\udd23",fitzpatrick_scale:!1,category:"symbols"},musical_note:{keywords:["score","tone","sound"],char:"\ud83c\udfb5",fitzpatrick_scale:!1,category:"symbols"},notes:{keywords:["music","score"],char:"\ud83c\udfb6",fitzpatrick_scale:!1,category:"symbols"},wavy_dash:{keywords:["draw","line","moustache","mustache","squiggle","scribble"],char:"\u3030\ufe0f",fitzpatrick_scale:!1,category:"symbols"},curly_loop:{keywords:["scribble","draw","shape","squiggle"],char:"\u27b0",fitzpatrick_scale:!1,category:"symbols"},heavy_check_mark:{keywords:["ok","nike","answer","yes","tick"],char:"\u2714\ufe0f",fitzpatrick_scale:!1,category:"symbols"},arrows_clockwise:{keywords:["sync","cycle","round","repeat"],char:"\ud83d\udd03",fitzpatrick_scale:!1,category:"symbols"},heavy_plus_sign:{keywords:["math","calculation","addition","more","increase"],char:"\u2795",fitzpatrick_scale:!1,category:"symbols"},heavy_minus_sign:{keywords:["math","calculation","subtract","less"],char:"\u2796",fitzpatrick_scale:!1,category:"symbols"},heavy_division_sign:{keywords:["divide","math","calculation"],char:"\u2797",fitzpatrick_scale:!1,category:"symbols"},heavy_multiplication_x:{keywords:["math","calculation"],char:"\u2716\ufe0f",fitzpatrick_scale:!1,category:"symbols"},infinity:{keywords:["forever"],char:"\u267e",fitzpatrick_scale:!1,category:"symbols"},heavy_dollar_sign:{keywords:["money","sales","payment","currency","buck"],char:"\ud83d\udcb2",fitzpatrick_scale:!1,category:"symbols"},currency_exchange:{keywords:["money","sales","dollar","travel"],char:"\ud83d\udcb1",fitzpatrick_scale:!1,category:"symbols"},copyright:{keywords:["ip","license","circle","law","legal"],char:"\xa9\ufe0f",fitzpatrick_scale:!1,category:"symbols"},registered:{keywords:["alphabet","circle"],char:"\xae\ufe0f",fitzpatrick_scale:!1,category:"symbols"},tm:{keywords:["trademark","brand","law","legal"],char:"\u2122\ufe0f",fitzpatrick_scale:!1,category:"symbols"},end:{keywords:["words","arrow"],char:"\ud83d\udd1a",fitzpatrick_scale:!1,category:"symbols"},back:{keywords:["arrow","words","return"],char:"\ud83d\udd19",fitzpatrick_scale:!1,category:"symbols"},on:{keywords:["arrow","words"],char:"\ud83d\udd1b",fitzpatrick_scale:!1,category:"symbols"},top:{keywords:["words","blue-square"],char:"\ud83d\udd1d",fitzpatrick_scale:!1,category:"symbols"},soon:{keywords:["arrow","words"],char:"\ud83d\udd1c",fitzpatrick_scale:!1,category:"symbols"},ballot_box_with_check:{keywords:["ok","agree","confirm","black-square","vote","election","yes","tick"],char:"\u2611\ufe0f",fitzpatrick_scale:!1,category:"symbols"},radio_button:{keywords:["input","old","music","circle"],char:"\ud83d\udd18",fitzpatrick_scale:!1,category:"symbols"},white_circle:{keywords:["shape","round"],char:"\u26aa",fitzpatrick_scale:!1,category:"symbols"},black_circle:{keywords:["shape","button","round"],char:"\u26ab",fitzpatrick_scale:!1,category:"symbols"},red_circle:{keywords:["shape","error","danger"],char:"\ud83d\udd34",fitzpatrick_scale:!1,category:"symbols"},large_blue_circle:{keywords:["shape","icon","button"],char:"\ud83d\udd35",fitzpatrick_scale:!1,category:"symbols"},small_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd38",fitzpatrick_scale:!1,category:"symbols"},small_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd39",fitzpatrick_scale:!1,category:"symbols"},large_orange_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd36",fitzpatrick_scale:!1,category:"symbols"},large_blue_diamond:{keywords:["shape","jewel","gem"],char:"\ud83d\udd37",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle:{keywords:["shape","direction","up","top"],char:"\ud83d\udd3a",fitzpatrick_scale:!1,category:"symbols"},black_small_square:{keywords:["shape","icon"],char:"\u25aa\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_small_square:{keywords:["shape","icon"],char:"\u25ab\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_large_square:{keywords:["shape","icon","button"],char:"\u2b1b",fitzpatrick_scale:!1,category:"symbols"},white_large_square:{keywords:["shape","icon","stone","button"],char:"\u2b1c",fitzpatrick_scale:!1,category:"symbols"},small_red_triangle_down:{keywords:["shape","direction","bottom"],char:"\ud83d\udd3b",fitzpatrick_scale:!1,category:"symbols"},black_medium_square:{keywords:["shape","button","icon"],char:"\u25fc\ufe0f",fitzpatrick_scale:!1,category:"symbols"},white_medium_square:{keywords:["shape","stone","icon"],char:"\u25fb\ufe0f",fitzpatrick_scale:!1,category:"symbols"},black_medium_small_square:{keywords:["icon","shape","button"],char:"\u25fe",fitzpatrick_scale:!1,category:"symbols"},white_medium_small_square:{keywords:["shape","stone","icon","button"],char:"\u25fd",fitzpatrick_scale:!1,category:"symbols"},black_square_button:{keywords:["shape","input","frame"],char:"\ud83d\udd32",fitzpatrick_scale:!1,category:"symbols"},white_square_button:{keywords:["shape","input"],char:"\ud83d\udd33",fitzpatrick_scale:!1,category:"symbols"},speaker:{keywords:["sound","volume","silence","broadcast"],char:"\ud83d\udd08",fitzpatrick_scale:!1,category:"symbols"},sound:{keywords:["volume","speaker","broadcast"],char:"\ud83d\udd09",fitzpatrick_scale:!1,category:"symbols"},loud_sound:{keywords:["volume","noise","noisy","speaker","broadcast"],char:"\ud83d\udd0a",fitzpatrick_scale:!1,category:"symbols"},mute:{keywords:["sound","volume","silence","quiet"],char:"\ud83d\udd07",fitzpatrick_scale:!1,category:"symbols"},mega:{keywords:["sound","speaker","volume"],char:"\ud83d\udce3",fitzpatrick_scale:!1,category:"symbols"},loudspeaker:{keywords:["volume","sound"],char:"\ud83d\udce2",fitzpatrick_scale:!1,category:"symbols"},bell:{keywords:["sound","notification","christmas","xmas","chime"],char:"\ud83d\udd14",fitzpatrick_scale:!1,category:"symbols"},no_bell:{keywords:["sound","volume","mute","quiet","silent"],char:"\ud83d\udd15",fitzpatrick_scale:!1,category:"symbols"},black_joker:{keywords:["poker","cards","game","play","magic"],char:"\ud83c\udccf",fitzpatrick_scale:!1,category:"symbols"},mahjong:{keywords:["game","play","chinese","kanji"],char:"\ud83c\udc04",fitzpatrick_scale:!1,category:"symbols"},spades:{keywords:["poker","cards","suits","magic"],char:"\u2660\ufe0f",fitzpatrick_scale:!1,category:"symbols"},clubs:{keywords:["poker","cards","magic","suits"],char:"\u2663\ufe0f",fitzpatrick_scale:!1,category:"symbols"},hearts:{keywords:["poker","cards","magic","suits"],char:"\u2665\ufe0f",fitzpatrick_scale:!1,category:"symbols"},diamonds:{keywords:["poker","cards","magic","suits"],char:"\u2666\ufe0f",fitzpatrick_scale:!1,category:"symbols"},flower_playing_cards:{keywords:["game","sunset","red"],char:"\ud83c\udfb4",fitzpatrick_scale:!1,category:"symbols"},thought_balloon:{keywords:["bubble","cloud","speech","thinking","dream"],char:"\ud83d\udcad",fitzpatrick_scale:!1,category:"symbols"},right_anger_bubble:{keywords:["caption","speech","thinking","mad"],char:"\ud83d\uddef",fitzpatrick_scale:!1,category:"symbols"},speech_balloon:{keywords:["bubble","words","message","talk","chatting"],char:"\ud83d\udcac",fitzpatrick_scale:!1,category:"symbols"},left_speech_bubble:{keywords:["words","message","talk","chatting"],char:"\ud83d\udde8",fitzpatrick_scale:!1,category:"symbols"},clock1:{keywords:["time","late","early","schedule"],char:"\ud83d\udd50",fitzpatrick_scale:!1,category:"symbols"},clock2:{keywords:["time","late","early","schedule"],char:"\ud83d\udd51",fitzpatrick_scale:!1,category:"symbols"},clock3:{keywords:["time","late","early","schedule"],char:"\ud83d\udd52",fitzpatrick_scale:!1,category:"symbols"},clock4:{keywords:["time","late","early","schedule"],char:"\ud83d\udd53",fitzpatrick_scale:!1,category:"symbols"},clock5:{keywords:["time","late","early","schedule"],char:"\ud83d\udd54",fitzpatrick_scale:!1,category:"symbols"},clock6:{keywords:["time","late","early","schedule","dawn","dusk"],char:"\ud83d\udd55",fitzpatrick_scale:!1,category:"symbols"},clock7:{keywords:["time","late","early","schedule"],char:"\ud83d\udd56",fitzpatrick_scale:!1,category:"symbols"},clock8:{keywords:["time","late","early","schedule"],char:"\ud83d\udd57",fitzpatrick_scale:!1,category:"symbols"},clock9:{keywords:["time","late","early","schedule"],char:"\ud83d\udd58",fitzpatrick_scale:!1,category:"symbols"},clock10:{keywords:["time","late","early","schedule"],char:"\ud83d\udd59",fitzpatrick_scale:!1,category:"symbols"},clock11:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5a",fitzpatrick_scale:!1,category:"symbols"},clock12:{keywords:["time","noon","midnight","midday","late","early","schedule"],char:"\ud83d\udd5b",fitzpatrick_scale:!1,category:"symbols"},clock130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5c",fitzpatrick_scale:!1,category:"symbols"},clock230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5d",fitzpatrick_scale:!1,category:"symbols"},clock330:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5e",fitzpatrick_scale:!1,category:"symbols"},clock430:{keywords:["time","late","early","schedule"],char:"\ud83d\udd5f",fitzpatrick_scale:!1,category:"symbols"},clock530:{keywords:["time","late","early","schedule"],char:"\ud83d\udd60",fitzpatrick_scale:!1,category:"symbols"},clock630:{keywords:["time","late","early","schedule"],char:"\ud83d\udd61",fitzpatrick_scale:!1,category:"symbols"},clock730:{keywords:["time","late","early","schedule"],char:"\ud83d\udd62",fitzpatrick_scale:!1,category:"symbols"},clock830:{keywords:["time","late","early","schedule"],char:"\ud83d\udd63",fitzpatrick_scale:!1,category:"symbols"},clock930:{keywords:["time","late","early","schedule"],char:"\ud83d\udd64",fitzpatrick_scale:!1,category:"symbols"},clock1030:{keywords:["time","late","early","schedule"],char:"\ud83d\udd65",fitzpatrick_scale:!1,category:"symbols"},clock1130:{keywords:["time","late","early","schedule"],char:"\ud83d\udd66",fitzpatrick_scale:!1,category:"symbols"},clock1230:{keywords:["time","late","early","schedule"],char:"\ud83d\udd67",fitzpatrick_scale:!1,category:"symbols"},afghanistan:{keywords:["af","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},aland_islands:{keywords:["\xc5land","islands","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},albania:{keywords:["al","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},algeria:{keywords:["dz","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},american_samoa:{keywords:["american","ws","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},andorra:{keywords:["ad","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},angola:{keywords:["ao","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},anguilla:{keywords:["ai","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},antarctica:{keywords:["aq","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},antigua_barbuda:{keywords:["antigua","barbuda","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},argentina:{keywords:["ar","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},armenia:{keywords:["am","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},aruba:{keywords:["aw","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},australia:{keywords:["au","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},austria:{keywords:["at","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},azerbaijan:{keywords:["az","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},bahamas:{keywords:["bs","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},bahrain:{keywords:["bh","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},bangladesh:{keywords:["bd","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},barbados:{keywords:["bb","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},belarus:{keywords:["by","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},belgium:{keywords:["be","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},belize:{keywords:["bz","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},benin:{keywords:["bj","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},bermuda:{keywords:["bm","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},bhutan:{keywords:["bt","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},bolivia:{keywords:["bo","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},caribbean_netherlands:{keywords:["bonaire","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},bosnia_herzegovina:{keywords:["bosnia","herzegovina","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},botswana:{keywords:["bw","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},brazil:{keywords:["br","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},british_indian_ocean_territory:{keywords:["british","indian","ocean","territory","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},british_virgin_islands:{keywords:["british","virgin","islands","bvi","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},brunei:{keywords:["bn","darussalam","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},bulgaria:{keywords:["bg","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},burkina_faso:{keywords:["burkina","faso","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},burundi:{keywords:["bi","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},cape_verde:{keywords:["cabo","verde","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},cambodia:{keywords:["kh","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},cameroon:{keywords:["cm","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},canada:{keywords:["ca","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},canary_islands:{keywords:["canary","islands","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},cayman_islands:{keywords:["cayman","islands","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},central_african_republic:{keywords:["central","african","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},chad:{keywords:["td","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},chile:{keywords:["flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},cn:{keywords:["china","chinese","prc","flag","country","nation","banner"],char:"\ud83c\udde8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},christmas_island:{keywords:["christmas","island","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},cocos_islands:{keywords:["cocos","keeling","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},colombia:{keywords:["co","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},comoros:{keywords:["km","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},congo_brazzaville:{keywords:["congo","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},congo_kinshasa:{keywords:["congo","democratic","republic","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},cook_islands:{keywords:["cook","islands","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},costa_rica:{keywords:["costa","rica","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},croatia:{keywords:["hr","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},cuba:{keywords:["cu","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},curacao:{keywords:["cura\xe7ao","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},cyprus:{keywords:["cy","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},czech_republic:{keywords:["cz","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},denmark:{keywords:["dk","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},djibouti:{keywords:["dj","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},dominica:{keywords:["dm","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},dominican_republic:{keywords:["dominican","republic","flag","nation","country","banner"],char:"\ud83c\udde9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ecuador:{keywords:["ec","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},egypt:{keywords:["eg","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},el_salvador:{keywords:["el","salvador","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},equatorial_guinea:{keywords:["equatorial","gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},eritrea:{keywords:["er","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},estonia:{keywords:["ee","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ethiopia:{keywords:["et","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},eu:{keywords:["european","union","flag","banner"],char:"\ud83c\uddea\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},falkland_islands:{keywords:["falkland","islands","malvinas","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},faroe_islands:{keywords:["faroe","islands","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},fiji:{keywords:["fj","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},finland:{keywords:["fi","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},fr:{keywords:["banner","flag","nation","france","french","country"],char:"\ud83c\uddeb\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},french_guiana:{keywords:["french","guiana","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_polynesia:{keywords:["french","polynesia","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},french_southern_territories:{keywords:["french","southern","territories","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},gabon:{keywords:["ga","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},gambia:{keywords:["gm","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},georgia:{keywords:["ge","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},de:{keywords:["german","nation","flag","country","banner"],char:"\ud83c\udde9\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},ghana:{keywords:["gh","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},gibraltar:{keywords:["gi","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},greece:{keywords:["gr","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},greenland:{keywords:["gl","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},grenada:{keywords:["gd","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},guadeloupe:{keywords:["gp","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},guam:{keywords:["gu","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},guatemala:{keywords:["gt","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},guernsey:{keywords:["gg","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},guinea:{keywords:["gn","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},guinea_bissau:{keywords:["gw","bissau","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},guyana:{keywords:["gy","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},haiti:{keywords:["ht","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},honduras:{keywords:["hn","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},hong_kong:{keywords:["hong","kong","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},hungary:{keywords:["hu","flag","nation","country","banner"],char:"\ud83c\udded\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},iceland:{keywords:["is","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},india:{keywords:["in","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},indonesia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},iran:{keywords:["iran,","islamic","republic","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},iraq:{keywords:["iq","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},ireland:{keywords:["ie","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},isle_of_man:{keywords:["isle","man","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},israel:{keywords:["il","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},it:{keywords:["italy","flag","nation","country","banner"],char:"\ud83c\uddee\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},cote_divoire:{keywords:["ivory","coast","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},jamaica:{keywords:["jm","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},jp:{keywords:["japanese","nation","flag","country","banner"],char:"\ud83c\uddef\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},jersey:{keywords:["je","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},jordan:{keywords:["jo","flag","nation","country","banner"],char:"\ud83c\uddef\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},kazakhstan:{keywords:["kz","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},kenya:{keywords:["ke","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},kiribati:{keywords:["ki","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},kosovo:{keywords:["xk","flag","nation","country","banner"],char:"\ud83c\uddfd\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},kuwait:{keywords:["kw","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},kyrgyzstan:{keywords:["kg","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},laos:{keywords:["lao","democratic","republic","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},latvia:{keywords:["lv","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},lebanon:{keywords:["lb","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},lesotho:{keywords:["ls","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},liberia:{keywords:["lr","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},libya:{keywords:["ly","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},liechtenstein:{keywords:["li","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},lithuania:{keywords:["lt","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},luxembourg:{keywords:["lu","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},macau:{keywords:["macao","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},macedonia:{keywords:["macedonia,","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},madagascar:{keywords:["mg","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},malawi:{keywords:["mw","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},malaysia:{keywords:["my","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},maldives:{keywords:["mv","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},mali:{keywords:["ml","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},malta:{keywords:["mt","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},marshall_islands:{keywords:["marshall","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},martinique:{keywords:["mq","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf6",fitzpatrick_scale:!1,category:"flags"},mauritania:{keywords:["mr","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},mauritius:{keywords:["mu","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},mayotte:{keywords:["yt","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},mexico:{keywords:["mx","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},micronesia:{keywords:["micronesia,","federated","states","flag","nation","country","banner"],char:"\ud83c\uddeb\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},moldova:{keywords:["moldova,","republic","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},monaco:{keywords:["mc","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},mongolia:{keywords:["mn","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},montenegro:{keywords:["me","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},montserrat:{keywords:["ms","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},morocco:{keywords:["ma","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},mozambique:{keywords:["mz","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},myanmar:{keywords:["mm","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},namibia:{keywords:["na","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},nauru:{keywords:["nr","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},nepal:{keywords:["np","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},netherlands:{keywords:["nl","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},new_caledonia:{keywords:["new","caledonia","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},new_zealand:{keywords:["new","zealand","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},nicaragua:{keywords:["ni","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},niger:{keywords:["ne","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},nigeria:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},niue:{keywords:["nu","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},norfolk_island:{keywords:["norfolk","island","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},northern_mariana_islands:{keywords:["northern","mariana","islands","flag","nation","country","banner"],char:"\ud83c\uddf2\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},north_korea:{keywords:["north","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf5",fitzpatrick_scale:!1,category:"flags"},norway:{keywords:["no","flag","nation","country","banner"],char:"\ud83c\uddf3\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},oman:{keywords:["om_symbol","flag","nation","country","banner"],char:"\ud83c\uddf4\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},pakistan:{keywords:["pk","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},palau:{keywords:["pw","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},palestinian_territories:{keywords:["palestine","palestinian","territories","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},panama:{keywords:["pa","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},papua_new_guinea:{keywords:["papua","new","guinea","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},paraguay:{keywords:["py","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},peru:{keywords:["pe","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},philippines:{keywords:["ph","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},pitcairn_islands:{keywords:["pitcairn","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},poland:{keywords:["pl","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},portugal:{keywords:["pt","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},puerto_rico:{keywords:["puerto","rico","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},qatar:{keywords:["qa","flag","nation","country","banner"],char:"\ud83c\uddf6\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},reunion:{keywords:["r\xe9union","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},romania:{keywords:["ro","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},ru:{keywords:["russian","federation","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},rwanda:{keywords:["rw","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},st_barthelemy:{keywords:["saint","barth\xe9lemy","flag","nation","country","banner"],char:"\ud83c\udde7\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},st_helena:{keywords:["saint","helena","ascension","tristan","cunha","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},st_kitts_nevis:{keywords:["saint","kitts","nevis","flag","nation","country","banner"],char:"\ud83c\uddf0\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},st_lucia:{keywords:["saint","lucia","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},st_pierre_miquelon:{keywords:["saint","pierre","miquelon","flag","nation","country","banner"],char:"\ud83c\uddf5\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},st_vincent_grenadines:{keywords:["saint","vincent","grenadines","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},samoa:{keywords:["ws","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},san_marino:{keywords:["san","marino","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},sao_tome_principe:{keywords:["sao","tome","principe","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},saudi_arabia:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},senegal:{keywords:["sn","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},serbia:{keywords:["rs","flag","nation","country","banner"],char:"\ud83c\uddf7\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},seychelles:{keywords:["sc","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},sierra_leone:{keywords:["sierra","leone","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},singapore:{keywords:["sg","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},sint_maarten:{keywords:["sint","maarten","dutch","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfd",fitzpatrick_scale:!1,category:"flags"},slovakia:{keywords:["sk","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},slovenia:{keywords:["si","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},solomon_islands:{keywords:["solomon","islands","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},somalia:{keywords:["so","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},south_africa:{keywords:["south","africa","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},south_georgia_south_sandwich_islands:{keywords:["south","georgia","sandwich","islands","flag","nation","country","banner"],char:"\ud83c\uddec\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},kr:{keywords:["south","korea","nation","flag","country","banner"],char:"\ud83c\uddf0\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},south_sudan:{keywords:["south","sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},es:{keywords:["spain","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},sri_lanka:{keywords:["sri","lanka","flag","nation","country","banner"],char:"\ud83c\uddf1\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},sudan:{keywords:["sd","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\udde9",fitzpatrick_scale:!1,category:"flags"},suriname:{keywords:["sr","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},swaziland:{keywords:["sz","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},sweden:{keywords:["se","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},switzerland:{keywords:["ch","flag","nation","country","banner"],char:"\ud83c\udde8\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},syria:{keywords:["syrian","arab","republic","flag","nation","country","banner"],char:"\ud83c\uddf8\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},taiwan:{keywords:["tw","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},tajikistan:{keywords:["tj","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddef",fitzpatrick_scale:!1,category:"flags"},tanzania:{keywords:["tanzania,","united","republic","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},thailand:{keywords:["th","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},timor_leste:{keywords:["timor","leste","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf1",fitzpatrick_scale:!1,category:"flags"},togo:{keywords:["tg","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},tokelau:{keywords:["tk","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf0",fitzpatrick_scale:!1,category:"flags"},tonga:{keywords:["to","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf4",fitzpatrick_scale:!1,category:"flags"},trinidad_tobago:{keywords:["trinidad","tobago","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf9",fitzpatrick_scale:!1,category:"flags"},tunisia:{keywords:["tn","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},tr:{keywords:["turkey","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf7",fitzpatrick_scale:!1,category:"flags"},turkmenistan:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},turks_caicos_islands:{keywords:["turks","caicos","islands","flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\udde8",fitzpatrick_scale:!1,category:"flags"},tuvalu:{keywords:["flag","nation","country","banner"],char:"\ud83c\uddf9\ud83c\uddfb",fitzpatrick_scale:!1,category:"flags"},uganda:{keywords:["ug","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddec",fitzpatrick_scale:!1,category:"flags"},ukraine:{keywords:["ua","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},united_arab_emirates:{keywords:["united","arab","emirates","flag","nation","country","banner"],char:"\ud83c\udde6\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},uk:{keywords:["united","kingdom","great","britain","northern","ireland","flag","nation","country","banner","british","UK","english","england","union jack"],char:"\ud83c\uddec\ud83c\udde7",fitzpatrick_scale:!1,category:"flags"},england:{keywords:["flag","english"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},scotland:{keywords:["flag","scottish"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},wales:{keywords:["flag","welsh"],char:"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f",fitzpatrick_scale:!1,category:"flags"},us:{keywords:["united","states","america","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddf8",fitzpatrick_scale:!1,category:"flags"},us_virgin_islands:{keywords:["virgin","islands","us","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddee",fitzpatrick_scale:!1,category:"flags"},uruguay:{keywords:["uy","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddfe",fitzpatrick_scale:!1,category:"flags"},uzbekistan:{keywords:["uz","flag","nation","country","banner"],char:"\ud83c\uddfa\ud83c\uddff",fitzpatrick_scale:!1,category:"flags"},vanuatu:{keywords:["vu","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddfa",fitzpatrick_scale:!1,category:"flags"},vatican_city:{keywords:["vatican","city","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\udde6",fitzpatrick_scale:!1,category:"flags"},venezuela:{keywords:["ve","bolivarian","republic","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},vietnam:{keywords:["viet","nam","flag","nation","country","banner"],char:"\ud83c\uddfb\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},wallis_futuna:{keywords:["wallis","futuna","flag","nation","country","banner"],char:"\ud83c\uddfc\ud83c\uddeb",fitzpatrick_scale:!1,category:"flags"},western_sahara:{keywords:["western","sahara","flag","nation","country","banner"],char:"\ud83c\uddea\ud83c\udded",fitzpatrick_scale:!1,category:"flags"},yemen:{keywords:["ye","flag","nation","country","banner"],char:"\ud83c\uddfe\ud83c\uddea",fitzpatrick_scale:!1,category:"flags"},zambia:{keywords:["zm","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddf2",fitzpatrick_scale:!1,category:"flags"},zimbabwe:{keywords:["zw","flag","nation","country","banner"],char:"\ud83c\uddff\ud83c\uddfc",fitzpatrick_scale:!1,category:"flags"},united_nations:{keywords:["un","flag","banner"],char:"\ud83c\uddfa\ud83c\uddf3",fitzpatrick_scale:!1,category:"flags"},pirate_flag:{keywords:["skull","crossbones","flag","banner"],char:"\ud83c\udff4\u200d\u2620\ufe0f",fitzpatrick_scale:!1,category:"flags"}}); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/emoticons/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/emoticons/plugin.min.js new file mode 100644 index 0000000..fbff571 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/emoticons/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function r(){}function i(t){return function(){return t}}function t(t){return t}function n(){return c}var m,e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=i(!1),a=i(!(m=null)),c={fold:function(t,n){return t()},isSome:l,isNone:a,getOr:t,getOrThunk:o,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:t,orThunk:o,map:n,each:r,bind:n,exists:l,forall:a,filter:function(){return c},toArray:function(){return[]},toString:i("none()")};function o(t){return t()}function g(t){var n=t;return{get:function(){return n},set:function(t){n=t}}}function d(t,n){for(var e=k(t),o=0,r=e.length;o=(a="Could not load emoticons

              "}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(S),f.unblock()}))}function b(t){t.on("PreInit",function(){t.parser.addAttributeFilter("data-emoticon",function(t){!function(t){for(var n,e=0,o=t.length;e"),(r=c.getAll("title")[0])&&r.firstChild&&(s.title=r.firstChild.value),w.each(c.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?s[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(s.docencoding=t[1])}),(r=c.getAll("html")[0])&&(s.langcode=d(r,"lang")||d(r,"xml:lang")),s.stylesheets=[],w.each(c.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&s.stylesheets.push(e.attr("href"))}),(r=c.getAll("body")[0])&&(s.langdir=d(r,"dir"),s.style=d(r,"style"),s.visited_color=d(r,"vlink"),s.link_color=d(r,"link"),s.active_color=d(r,"alink")),o=s,e=g(g({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),o),l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:e,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){function n(e,t,n){e.attr(t,n||void 0)}function r(e){s.firstChild?s.insert(e,s.firstChild):s.append(e)}var a,l,i=e.dom,c=C(e,t),s=c.getAll("head")[0];s||(a=c.getAll("html")[0],s=new f("head",1),a.firstChild?a.insert(s,a.firstChild,!0):a.append(s)),a=c.firstChild,o.xml_pi?(l='version="1.0"',o.docencoding&&(l+=' encoding="'+o.docencoding+'"'),7!==a.type&&(a=new f("xml",7),c.insert(a,c.firstChild,!0)),a.value=l):a&&7===a.type&&a.remove(),a=c.getAll("#doctype")[0],o.doctype?(a||(a=new f("#doctype",10),o.xml_pi?c.insert(a,c.firstChild):r(a)),a.value=o.doctype.substring(9,o.doctype.length-1)):a&&a.remove(),a=null,w.each(c.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(a=e)}),o.docencoding?(a||((a=new f("meta",1)).attr("http-equiv","Content-Type"),a.shortEnded=!0,r(a)),a.attr("content","text/html; charset="+o.docencoding)):a&&a.remove(),a=c.getAll("title")[0],o.title?(a?a.empty():r(a=new f("title",1)),a.append(new f("#text",3)).value=o.title):a&&a.remove(),w.each("keywords,description,author,copyright,robots".split(","),function(e){for(var t,n=c.getAll("meta"),l=o[e],i=0;i"))}(l,w.extend(o,t),i.get());i.set(n),e.close()}})})}function A(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})}function s(e,t,n,l){var i,o,r,a,c,s,d,u,m,g,f,p,h,y="",v=e.dom;l.selection||(a=e.getParam("protect"),c=l.content,w.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=c,"raw"===l.format&&t.get()||l.source_view&&_(e)||(-1!==(i=(r=(r=0!==r.length||l.source_view?r:w.trim(t.get())+"\n"+w.trim(r)+"\n"+w.trim(n.get())).replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(A(r.substring(0,i+1))),-1===(o=r.indexOf("\n'),p+=g.getParam("fullpage_default_doctype",""),p+="\n\n\n",(f=g.getParam("fullpage_default_title"))&&(p+=""+f+"\n"),(f=b(g))&&(p+='\n'),(f=x(g))&&(h+="font-family: "+f+";"),(f=k(g))&&(h+="font-size: "+f+";"),(f=g.getParam("fullpage_default_text_color"))&&(h+="color: "+f+";"),p+="\n\n")),n.set("\n\n")),s=C(e,t.get()),P(s.getAll("style"),function(e){e.firstChild&&(y+=e.firstChild.value)}),(d=s.getAll("body")[0])&&v.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),v.remove("fullpage_styles"),u=e.getDoc().getElementsByTagName("head")[0],y&&v.add(u,"style",{id:"fullpage_styles"}).appendChild(document.createTextNode(y)),m={},w.each(u.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),w.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||v.add(u,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),w.each(m,function(e){e.parentNode.removeChild(e)})))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),g=function(){return(g=Object.assign||function(e){for(var t,n=1,l=arguments.length;n/g,function(e,t){return unescape(t)}))})})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/fullscreen/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/fullscreen/plugin.min.js new file mode 100644 index 0000000..3cf2ac8 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/fullscreen/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function a(e){var n=e;return{get:function(){return n},set:function(e){n=e}}}function e(t){return function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}}function n(n){return function(e){return typeof e===n}}function c(e){return!(null==e)}function s(){}function y(e){return function(){return e}}function r(e){return e}var t=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=e("string"),d=e("array"),o=n("boolean"),h=n("function"),i=n("number");function u(){return m}var v=y(!1),f=y(!0),m={fold:function(e,n){return e()},isSome:v,isNone:f,getOr:r,getOrThunk:g,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:y(null),getOrUndefined:y(void 0),or:r,orThunk:g,map:u,each:s,bind:u,exists:v,forall:f,filter:function(){return m},toArray:function(){return[]},toString:y("none()")};function g(e){return e()}function p(e){function n(){return r.get().each(e)}var r=a(A.none());return{clear:function(){n(),r.set(A.none())},isSet:function(){return r.get().isSome()},get:function(){return r.get()},set:function(e){n(),r.set(A.some(e))}}}function w(){return p(function(e){return e.unbind()})}function C(e,n){for(var r=e.length,t=new Array(r),o=0;o'+e.name+""}var t,o,n,i,r,s,l,c;return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==e?"":'
              '+(s=b((i=w((n=o=e).plugins),void 0===(r=n.getParam("forced_plugins"))?i:m(i,function(e){return!(-1"+(t=o,n=e,function(e,t,n){for(var a=0,o=e.length;a";var t,n}),l=s.length,c=s.join(""),"

              "+T.translate(["Plugins installed ({0}):",l])+"

                "+c+"
              ")+"
              ",(t=b(m(d,function(e){var t=e.key,n=e.type;return"autocorrect"!==t&&"premium"===n}),function(e){return"
            • "+T.translate(e.name)+"
            • "}).join(""),'

              '+T.translate("Premium plugins:")+"

              ")].join("")}]}}function l(d,y){return function(){var e,t,n,a,o,i,r,s,l,c,u,m=(e=d,t=y,r={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:b(x,function(e){var t=b(e.shortcuts,f).join(" or ");return[e.action,t]})}]},s={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

              Editor UI keyboard navigation

              \n\n

              Activating keyboard navigation

              \n\n

              The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

              \n
                \n
              • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
              • \n
              • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
              • \n
              • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
              • \n
              \n\n

              Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

              \n\n

              Moving between UI sections

              \n\n

              When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

              \n
                \n
              • the menubar
              • \n
              • each group of the toolbar
              • \n
              • the sidebar
              • \n
              • the element path in the footer
              • \n
              • the wordcount toggle button in the footer
              • \n
              • the branding link in the footer
              • \n
              • the editor resize handle in the footer
              • \n
              \n\n

              Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

              \n\n

              Moving within UI sections

              \n\n

              Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

              \n
                \n
              • moving between menus in the menubar
              • \n
              • moving between buttons in a toolbar group
              • \n
              • moving between items in the element path
              • \n
              \n\n

              In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

              \n\n

              Executing buttons

              \n\n

              To execute a button, navigate the selection to the desired button and hit space or enter.

              \n\n

              Opening, navigating and closing menus

              \n\n

              When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

              \n\n

              To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

              \n\n

              Context toolbars and menus

              \n\n

              To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

              \n\n

              Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

              \n\n

              Dialog navigation

              \n\n

              There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

              \n\n

              When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

              \n\n

              When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

              "}]},l=k(e),a=C.majorVersion,o=C.minorVersion,i=0===a.indexOf("@")?"X.X.X":a+"."+o,c={name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

              "+T.translate(["You are using {0}",'TinyMCE '+i+""])+"

              ",presets:"document"}]},u=g(((n={})[r.name]=r,n[s.name]=s,n[l.name]=l,n[c.name]=c,n),t.get()),v.from(e.getParam("help_tabs")).fold(function(){return-1!==(n=(t=w(e=u)).indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=u,n={},a=b(e,function(e){return"string"==typeof e?(A(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})),h=m.tabs,p=function(e){for(var t=[],n=function(e){t.push(e)},a=0;a")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:e}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:e})})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/image/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/image/plugin.min.js new file mode 100644 index 0000000..c9307a2 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/image/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function D(e){return!(null==e)}function l(){}function a(e){return function(){return e}}function n(e){return e}function r(){return g}var i,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),v=function(){return(v=Object.assign||function(e){for(var t,n=1,r=arguments.length;n'+n+"")):e.insertContent(d(e,t))}var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),a="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),i="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),o="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),u="January February March April May June July August September October November December".split(" "),g=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("insertdatetime",function(e){var n,r,t,a,i,o,u,c;function m(e){return r.execCommand("mceInsertDate",!1,e)}(n=e).addCommand("mceInsertDate",function(e,t){p(n,null!=t?t:n.getParam("insertdatetime_dateformat",n.translate("%Y-%m-%d")))}),n.addCommand("mceInsertTime",function(e,t){p(n,null!=t?t:l(n))}),u=s(r=e),t=0<(o=s(i=r)).length?o[0]:l(i),a=t,c={get:function(){return a},set:function(e){a=e}},r.ui.registry.addSplitButton("insertdatetime",{icon:"insert-time",tooltip:"Insert date/time",select:function(e){return e===c.get()},fetch:function(e){e(g.map(u,function(e){return{type:"choiceitem",text:d(r,e),value:e}}))},onAction:function(e){m(c.get())},onItemAction:function(e,t){c.set(t),m(t)}}),r.ui.registry.addNestedMenuItem("insertdatetime",{icon:"insert-time",text:"Date/time",getSubmenuItems:function(){return g.map(u,function(e){return{type:"menuitem",text:d(r,e),onAction:(t=e,function(){c.set(t),m(t)})};var t})}})})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/legacyoutput/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/legacyoutput/plugin.min.js new file mode 100644 index 0000000..bfab85e --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/legacyoutput/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),l=tinymce.util.Tools.resolve("tinymce.util.Tools");e.add("legacyoutput",function(e){var s,t;(t=s=e).settings.inline_styles=!1,t.getParam("fontsize_formats")||(t.settings.fontsize_formats="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7"),t.getParam("font_formats")||(t.settings.font_formats="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats"),s.on("PreInit",function(){var e=s,t="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table",i=l.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),a=e.schema;e.formatter.register({alignleft:{selector:t,attributes:{align:"left"}},aligncenter:{selector:t,attributes:{align:"center"}},alignright:{selector:t,attributes:{align:"right"}},alignjustify:{selector:t,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all",preserve_attributes:["class","style"]},{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all",preserve_attributes:["class","style"]},{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",toggle:!1,attributes:{face:"%value"}},fontsize:{inline:"font",toggle:!1,attributes:{size:function(e){return String(l.inArray(i,e.value)+1)}}},forecolor:{inline:"font",attributes:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0}}),l.each("b,i,u,strike".split(","),function(e){a.addValidElements(e+"[*]")}),a.getElementRule("font")||a.addValidElements("font[face|size|color|style]"),l.each(t.split(","),function(e){var t=a.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})})})}(); \ No newline at end of file diff --git a/public/static/assets/gougu/module/tinymce/plugins/link/plugin.min.js b/public/static/assets/gougu/module/tinymce/plugins/link/plugin.min.js new file mode 100644 index 0000000..024c635 --- /dev/null +++ b/public/static/assets/gougu/module/tinymce/plugins/link/plugin.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.0 (2021-10-11) + */ +!function(){"use strict";function t(r){return function(t){return e=typeof(n=t),(null===n?"null":"object"==e&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==e&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":e)===r;var n,e}}function n(n){return function(t){return typeof t===n}}function h(){}function i(t){return function(){return t}}function e(t){return t}function r(t,n){return t===n}function o(){return v}var u,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.VK"),l=t("string"),d=t("array"),p=function(t){return u===t},f=n("boolean"),s=n("function"),m=i(!1),g=i(!(u=null)),v={fold:function(t,n){return t()},isSome:m,isNone:g,getOr:e,getOrThunk:y,getOrDie:function(t){throw new Error(t||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:y,map:o,each:h,bind:o,exists:m,forall:g,filter:function(){return v},toArray:function(){return[]},toString:i("none()")};function y(t){return t()}function k(t,o,i){return function(t){for(var n,e=0,r=t.length;e=e.childNodes.length?n.data.length:0}:n.previousSibling&&Me(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&Me(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}}function We(e){var t=e.cloneRange(),n=Ve(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);var r=Ve(e.endContainer,e.endOffset);return t.setEnd(r.container,r.offset),t}function Qe(e,t){var n=t||e.selection.getStart(!0);return e.dom.getParent(n,"OL,UL,DL",qt(e,n))}function Xe(e){var t,n,r=e.selection.getSelectedBlocks();return L((t=e,n=Mt.map(r,function(e){return t.dom.getParent(e,"li,dd,dt",qt(t,e))||e}),Xt.unique(n)),Ft)}function qe(e,t){return w(e.dom.getParents(t,"ol,ul",qt(e,t)))}function ze(e,t,n){return void 0===n&&(n=r),e.exists(function(e){return n(e,t)})}function Ye(e,t,n){return e.isSome()&&t.isSome()?E.some(n(e.getOrDie(),t.getOrDie())):E.none()}function Ze(e,t,n){return e.fire("ListMutation",{action:t,element:n})}function Ge(e,t){we(e.item,t.list)}function Je(e,t){for(var n=0;ne.length?tt:et)(r,e,t)},[])).map(function(e){return e.list}).toArray()}function ft(e,t){b(L(e,it),function(e){return function(e){switch(t){case"Indent":e.depth++;break;case"Outdent":e.depth--;break;case"Flatten":e.depth=0}e.dirty=!0}(e),0})}function dt(e,t){var n,r,o,i,a,s,u,c,f,d,l,m,p,g=C((i=qe(o=r=e,o.selection.getStart()),a=L(o.selection.getSelectedBlocks(),_t),s=i.toArray().concat(a),zt(r,s)),me.fromDom),v=C(L(Xe(e),Ht),me.fromDom),h=!1;return(g.length||v.length)&&(n=e.selection.getBookmark(),c=t,b((f=g,p=C(Xe(u=e),me.fromDom),d=Ye(N(p,y(rt)),N(D(p),y(rt)),function(e,t){return{start:e,end:t}}),l=!1,m={get:function(){return l},set:function(e){l=e}},C(f,function(e){return{sourceList:e,entries:Yt(0,d,m,e)}})),function(e){ft(e.entries,c);var t,n,r=(t=u,T(function(e,t){if(0===e.length)return[];for(var n=t(e[0]),r=[],o=[],i=0,a=e.length;i"):"application/x-shockwave-flash"===n.sourcemime?(u='',n.poster&&(u+=''),u+""):-1!==n.sourcemime.indexOf("audio")?(s=n,m?m(s):'"):"script"===n.type?' + + + +
              +
              +
              +
                +
                +

                font-class 引用

                +
                +

                使用步骤如下:

                +

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

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

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

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

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

                +
                +
                +
                + +
                +
                + + + + diff --git a/public/static/assets/layui/css/layui.css b/public/static/assets/layui/css/layui.css new file mode 100644 index 0000000..883a2a5 --- /dev/null +++ b/public/static/assets/layui/css/layui.css @@ -0,0 +1 @@ +blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none;vertical-align:middle}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3,h4,h5,h6{font-weight:700}h5,h6{font-size:100%}button,input,select,textarea{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font-size:14px;font-family:-apple-system,Roboto,'PingFang SC','Helvetica Neue',Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji'}hr{height:0;line-height:0;margin:10px 0;padding:0;border:none;border-bottom:1px solid #eee;clear:both;overflow:hidden;background:0 0}a{color:#333;text-decoration:none}a cite{font-style:normal}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both}.layui-clear:after{content:'\20';clear:both;display:block;height:0}.layui-clear-space{word-spacing:-5px}.layui-inline{position:relative;display:inline-block;vertical-align:middle}.layui-edge{position:relative;display:inline-block;vertical-align:middle;width:0;height:0;border-width:6px;border-style:dashed;border-color:transparent;overflow:hidden}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip,.layui-ellip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-icon,.layui-unselect{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=293);src:url(../font/iconfont.eot?v=293#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=293) format('woff2'),url(../font/iconfont.woff?v=293) format('woff'),url(../font/iconfont.ttf?v=293) format('truetype'),url(../font/iconfont.svg?v=293#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-sound:before{content:'\e69d'}.layui-icon-bot:before{content:'\e7d6'}.layui-icon-leaf:before{content:'\e701'}.layui-icon-folder:before{content:'\eabe'}.layui-icon-folder-open:before{content:'\eac1'}.layui-icon-gitee:before{content:'\e69b'}.layui-icon-github:before{content:'\e6a7'}.layui-icon-disabled:before{content:'\e6cc'}.layui-icon-moon:before{content:'\e6c2'}.layui-icon-error:before{content:'\e693'}.layui-icon-success:before{content:'\e697'}.layui-icon-question:before{content:'\e699'}.layui-icon-lock:before{content:'\e69a'}.layui-icon-eye:before{content:'\e695'}.layui-icon-eye-invisible:before{content:'\e696'}.layui-icon-backspace:before{content:'\e694'}.layui-icon-tips-fill:before{content:'\eb2e'}.layui-icon-test:before{content:'\e692'}.layui-icon-clear:before{content:'\e788'}.layui-icon-heart-fill:before{content:'\e68f'}.layui-icon-light:before{content:'\e748'}.layui-icon-music:before{content:'\e690'}.layui-icon-time:before{content:'\e68d'}.layui-icon-ie:before{content:'\e7bb'}.layui-icon-firefox:before{content:'\e686'}.layui-icon-at:before{content:'\e687'}.layui-icon-bluetooth:before{content:'\e689'}.layui-icon-chrome:before{content:'\e68a'}.layui-icon-edge:before{content:'\e68b'}.layui-icon-heart:before{content:'\e68c'}.layui-icon-key:before{content:'\e683'}.layui-icon-android:before{content:'\e684'}.layui-icon-mike:before{content:'\e6dc'}.layui-icon-mute:before{content:'\e685'}.layui-icon-gift:before{content:'\e627'}.layui-icon-windows:before{content:'\e67f'}.layui-icon-ios:before{content:'\e680'}.layui-icon-logout:before{content:'\e682'}.layui-icon-wifi:before{content:'\e7e0'}.layui-icon-rss:before{content:'\e808'}.layui-icon-email:before{content:'\e618'}.layui-icon-reduce-circle:before{content:'\e616'}.layui-icon-transfer:before{content:'\e691'}.layui-icon-service:before{content:'\e626'}.layui-icon-addition:before{content:'\e624'}.layui-icon-subtraction:before{content:'\e67e'}.layui-icon-slider:before{content:'\e714'}.layui-icon-print:before{content:'\e66d'}.layui-icon-export:before{content:'\e67d'}.layui-icon-cols:before{content:'\e610'}.layui-icon-screen-full:before{content:'\e622'}.layui-icon-screen-restore:before{content:'\e758'}.layui-icon-rate-half:before{content:'\e6c9'}.layui-icon-rate-solid:before{content:'\e67a'}.layui-icon-rate:before{content:'\e67b'}.layui-icon-cellphone:before{content:'\e678'}.layui-icon-vercode:before{content:'\e679'}.layui-icon-login-weibo:before{content:'\e675'}.layui-icon-login-qq:before{content:'\e676'}.layui-icon-login-wechat:before{content:'\e677'}.layui-icon-username:before{content:'\e66f'}.layui-icon-password:before{content:'\e673'}.layui-icon-refresh-3:before{content:'\e9aa'}.layui-icon-auz:before{content:'\e672'}.layui-icon-shrink-right:before{content:'\e668'}.layui-icon-spread-left:before{content:'\e66b'}.layui-icon-snowflake:before{content:'\e6b1'}.layui-icon-tips:before{content:'\e702'}.layui-icon-note:before{content:'\e66e'}.layui-icon-senior:before{content:'\e674'}.layui-icon-refresh-1:before{content:'\e666'}.layui-icon-refresh:before{content:'\e669'}.layui-icon-flag:before{content:'\e66c'}.layui-icon-theme:before{content:'\e66a'}.layui-icon-notice:before{content:'\e667'}.layui-icon-console:before{content:'\e665'}.layui-icon-website:before{content:'\e7ae'}.layui-icon-face-surprised:before{content:'\e664'}.layui-icon-set:before{content:'\e716'}.layui-icon-template:before{content:'\e663'}.layui-icon-app:before{content:'\e653'}.layui-icon-template-1:before{content:'\e656'}.layui-icon-home:before{content:'\e68e'}.layui-icon-female:before{content:'\e661'}.layui-icon-male:before{content:'\e662'}.layui-icon-tread:before{content:'\e6c5'}.layui-icon-praise:before{content:'\e6c6'}.layui-icon-rmb:before{content:'\e65e'}.layui-icon-more:before{content:'\e65f'}.layui-icon-camera:before{content:'\e660'}.layui-icon-cart-simple:before{content:'\e698'}.layui-icon-face-cry:before{content:'\e69c'}.layui-icon-face-smile:before{content:'\e6af'}.layui-icon-survey:before{content:'\e6b2'}.layui-icon-read:before{content:'\e705'}.layui-icon-location:before{content:'\e715'}.layui-icon-dollar:before{content:'\e659'}.layui-icon-diamond:before{content:'\e735'}.layui-icon-return:before{content:'\e65c'}.layui-icon-camera-fill:before{content:'\e65d'}.layui-icon-fire:before{content:'\e756'}.layui-icon-more-vertical:before{content:'\e671'}.layui-icon-cart:before{content:'\e657'}.layui-icon-star-fill:before{content:'\e658'}.layui-icon-prev:before{content:'\e65a'}.layui-icon-next:before{content:'\e65b'}.layui-icon-upload:before{content:'\e67c'}.layui-icon-upload-drag:before{content:'\e681'}.layui-icon-user:before{content:'\e770'}.layui-icon-file-b:before{content:'\e655'}.layui-icon-component:before{content:'\e857'}.layui-icon-find-fill:before{content:'\e670'}.layui-icon-loading:before{content:'\e63d'}.layui-icon-loading-1:before{content:'\e63e'}.layui-icon-add-1:before{content:'\e654'}.layui-icon-pause:before{content:'\e651'}.layui-icon-play:before{content:'\e652'}.layui-icon-video:before{content:'\e6ed'}.layui-icon-headset:before{content:'\e6fc'}.layui-icon-voice:before{content:'\e688'}.layui-icon-speaker:before{content:'\e645'}.layui-icon-fonts-del:before{content:'\e64f'}.layui-icon-fonts-html:before{content:'\e64b'}.layui-icon-fonts-code:before{content:'\e64e'}.layui-icon-fonts-strong:before{content:'\e62b'}.layui-icon-unlink:before{content:'\e64d'}.layui-icon-picture:before{content:'\e64a'}.layui-icon-link:before{content:'\e64c'}.layui-icon-face-smile-b:before{content:'\e650'}.layui-icon-align-center:before{content:'\e647'}.layui-icon-align-right:before{content:'\e648'}.layui-icon-align-left:before{content:'\e649'}.layui-icon-fonts-u:before{content:'\e646'}.layui-icon-fonts-i:before{content:'\e644'}.layui-icon-tabs:before{content:'\e62a'}.layui-icon-circle:before{content:'\e63f'}.layui-icon-radio:before{content:'\e643'}.layui-icon-share:before{content:'\e641'}.layui-icon-edit:before{content:'\e642'}.layui-icon-delete:before{content:'\e640'}.layui-icon-engine:before{content:'\e628'}.layui-icon-chart-screen:before{content:'\e629'}.layui-icon-chart:before{content:'\e62c'}.layui-icon-table:before{content:'\e62d'}.layui-icon-tree:before{content:'\e62e'}.layui-icon-upload-circle:before{content:'\e62f'}.layui-icon-templeate-1:before{content:'\e630'}.layui-icon-util:before{content:'\e631'}.layui-icon-layouts:before{content:'\e632'}.layui-icon-prev-circle:before{content:'\e633'}.layui-icon-carousel:before{content:'\e634'}.layui-icon-code-circle:before{content:'\e635'}.layui-icon-water:before{content:'\e636'}.layui-icon-date:before{content:'\e637'}.layui-icon-layer:before{content:'\e638'}.layui-icon-fonts-clear:before{content:'\e639'}.layui-icon-dialogue:before{content:'\e63a'}.layui-icon-cellphone-fine:before{content:'\e63b'}.layui-icon-form:before{content:'\e63c'}.layui-icon-file:before{content:'\e621'}.layui-icon-triangle-r:before{content:'\e623'}.layui-icon-triangle-d:before{content:'\e625'}.layui-icon-set-sm:before{content:'\e620'}.layui-icon-add-circle:before{content:'\e61f'}.layui-icon-layim-download:before{content:'\e61e'}.layui-icon-layim-uploadfile:before{content:'\e61d'}.layui-icon-404:before{content:'\e61c'}.layui-icon-about:before{content:'\e60b'}.layui-icon-layim-theme:before{content:'\e61b'}.layui-icon-down:before{content:'\e61a'}.layui-icon-up:before{content:'\e619'}.layui-icon-circle-dot:before{content:'\e617'}.layui-icon-set-fill:before{content:'\e614'}.layui-icon-search:before{content:'\e615'}.layui-icon-friends:before{content:'\e612'}.layui-icon-group:before{content:'\e613'}.layui-icon-reply-fill:before{content:'\e611'}.layui-icon-menu-fill:before{content:'\e60f'}.layui-icon-face-smile-fine:before{content:'\e60c'}.layui-icon-picture-fine:before{content:'\e60d'}.layui-icon-log:before{content:'\e60e'}.layui-icon-list:before{content:'\e60a'}.layui-icon-release:before{content:'\e609'}.layui-icon-add-circle-fine:before{content:'\e608'}.layui-icon-ok:before{content:'\e605'}.layui-icon-help:before{content:'\e607'}.layui-icon-chat:before{content:'\e606'}.layui-icon-top:before{content:'\e604'}.layui-icon-right:before{content:'\e602'}.layui-icon-left:before{content:'\e603'}.layui-icon-star:before{content:'\e600'}.layui-icon-download-circle:before{content:'\e601'}.layui-icon-close:before{content:'\1006'}.layui-icon-close-fill:before{content:'\1007'}.layui-icon-ok-circle:before{content:'\1005'}.layui-main{position:relative;width:1160px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{-webkit-transition:all .5s;transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{position:relative;width:220px;height:100%;overflow-x:hidden}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;width:auto;box-sizing:border-box}.layui-layout-body{overflow-x:hidden}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23292e}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#fafafa}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#16baaa;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:'';display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:767.98px){.layui-container{padding:0 15px}.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:720px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:960px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1150px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}@media screen and (min-width:1400px){.layui-container{width:1330px}.layui-hide-xl{display:none!important}.layui-show-xl-block{display:block!important}.layui-show-xl-inline{display:inline!important}.layui-show-xl-inline-block{display:inline-block!important}.layui-col-xl1,.layui-col-xl10,.layui-col-xl11,.layui-col-xl12,.layui-col-xl2,.layui-col-xl3,.layui-col-xl4,.layui-col-xl5,.layui-col-xl6,.layui-col-xl7,.layui-col-xl8,.layui-col-xl9{float:left}.layui-col-xl1{width:8.33333333%}.layui-col-xl2{width:16.66666667%}.layui-col-xl3{width:25%}.layui-col-xl4{width:33.33333333%}.layui-col-xl5{width:41.66666667%}.layui-col-xl6{width:50%}.layui-col-xl7{width:58.33333333%}.layui-col-xl8{width:66.66666667%}.layui-col-xl9{width:75%}.layui-col-xl10{width:83.33333333%}.layui-col-xl11{width:91.66666667%}.layui-col-xl12{width:100%}.layui-col-xl-offset1{margin-left:8.33333333%}.layui-col-xl-offset2{margin-left:16.66666667%}.layui-col-xl-offset3{margin-left:25%}.layui-col-xl-offset4{margin-left:33.33333333%}.layui-col-xl-offset5{margin-left:41.66666667%}.layui-col-xl-offset6{margin-left:50%}.layui-col-xl-offset7{margin-left:58.33333333%}.layui-col-xl-offset8{margin-left:66.66666667%}.layui-col-xl-offset9{margin-left:75%}.layui-col-xl-offset10{margin-left:83.33333333%}.layui-col-xl-offset11{margin-left:91.66666667%}.layui-col-xl-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-col-space32{margin:-16px}.layui-col-space32>*{padding:16px}.layui-padding-1{padding:4px!important}.layui-padding-2{padding:8px!important}.layui-padding-3{padding:16px!important}.layui-padding-4{padding:32px!important}.layui-padding-5{padding:48px!important}.layui-margin-1{margin:4px!important}.layui-margin-2{margin:8px!important}.layui-margin-3{margin:16px!important}.layui-margin-4{margin:32px!important}.layui-margin-5{margin:48px!important}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-transition:all .3s;transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.8;border-left:5px solid #16b777;border-radius:0 2px 2px 0;background-color:#fafafa}.layui-quote-nm{border-style:solid;border-width:1px;border-left-width:5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px}.layui-field-title{margin:16px 0;border-width:0;border-top-width:1px}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#16b777;-webkit-transition:all .3s;transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#5f5f5f}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#fafafa;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#5f5f5f}.layui-colla-icon{position:absolute;left:15px;top:50%;margin-top:-7px;font-size:14px;line-height:normal;transition:all .2s}.layui-colla-item.layui-show>.layui-colla-title .layui-colla-icon{transform:rotate(90deg)}.layui-colla-item.layui-show>.layui-colla-content{display:block}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-card:last-child{margin-bottom:0}.layui-card-body,.layui-card-header{position:relative;padding:10px 15px}.layui-card-header{border-bottom:1px solid #f8f8f8;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{position:relative;border-width:1px;border-style:solid;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);background-color:#fff;color:#5f5f5f}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-scrollbar-hide{overflow:hidden!important}.layui-bg-red{background-color:#ff5722!important;color:#fff!important}.layui-bg-orange{background-color:#ffb800!important;color:#fff!important}.layui-bg-green{background-color:#16baaa!important;color:#fff!important}.layui-bg-cyan{background-color:#2f4056!important;color:#fff!important}.layui-bg-blue{background-color:#1e9fff!important;color:#fff!important}.layui-bg-purple{background-color:#a233c6!important;color:#fff!important}.layui-bg-black{background-color:#2f363c!important;color:#fff!important}.layui-bg-gray{background-color:#fafafa!important;color:#5f5f5f!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-input-split,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{border-width:1px;border-style:solid;color:#5f5f5f!important}.layui-border-red{border-width:1px;border-style:solid;border-color:#ff5722!important;color:#ff5722!important}.layui-border-orange{border-width:1px;border-style:solid;border-color:#ffb800!important;color:#ffb800!important}.layui-border-green{border-width:1px;border-style:solid;border-color:#16baaa!important;color:#16baaa!important}.layui-border-cyan{border-width:1px;border-style:solid;border-color:#2f4056!important;color:#2f4056!important}.layui-border-blue{border-width:1px;border-style:solid;border-color:#1e9fff!important;color:#1e9fff!important}.layui-border-purple{border-width:1px;border-style:solid;border-color:#a233c6!important;color:#a233c6!important}.layui-border-black{border-width:1px;border-style:solid;border-color:#2f363c!important;color:#2f363c!important}hr.layui-border-black,hr.layui-border-blue,hr.layui-border-cyan,hr.layui-border-green,hr.layui-border-orange,hr.layui-border-purple,hr.layui-border-red{border-width:0 0 1px}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.8;font-size:14px}.layui-text h1{margin:32px 0;font-size:32px}.layui-text h2{margin:24px 0;font-size:24px}.layui-text h3{margin:16px 0;font-size:18px}.layui-text h4{margin:11px 0;font-size:16px}.layui-text h5{margin:11px 0;font-size:14px}.layui-text h6{margin:11px 0;font-size:13px}.layui-text p{margin:15px 0}.layui-text p:first-child{margin-top:0}.layui-text p:last-child{margin-bottom:0}.layui-text hr{margin:15px 0}.layui-text ol,.layui-text ul{padding-left:15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text ol li{margin-top:5px;list-style-type:decimal}.layui-text ol ul>li,.layui-text ul ul>li{list-style-type:disc}.layui-text ol li>p:first-child,.layui-text ul li>p:first-child{margin-top:0;margin-bottom:0}.layui-text :where(a:not(.layui-btn)){color:#01aaed}.layui-text :where(a:not(.layui-btn):hover){text-decoration:underline}.layui-text blockquote:not(.layui-elem-quote){margin:15px 0;padding:5px 15px;border-left:5px solid #eee}.layui-text pre>code:not(.layui-code){display:block;padding:15px;font-family:'Courier New',Consolas,'Lucida Console',monospace}.layui-text-em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-font-12{font-size:12px!important}.layui-font-13{font-size:13px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-22{font-size:22px!important}.layui-font-24{font-size:24px!important}.layui-font-26{font-size:26px!important}.layui-font-28{font-size:28px!important}.layui-font-30{font-size:30px!important}.layui-font-32{font-size:32px!important}.layui-font-red{color:#ff5722!important}.layui-font-orange{color:#ffb800!important}.layui-font-green{color:#16baaa!important}.layui-font-cyan{color:#2f4056!important}.layui-font-blue{color:#01aaed!important}.layui-font-purple{color:#a233c6!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{display:inline-block;vertical-align:middle;height:38px;line-height:36px;border:1px solid transparent;padding:0 18px;background-color:#16baaa;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{word-spacing:-5px}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px;word-spacing:normal}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\0;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#5f5f5f}.layui-btn-primary:hover{border-color:#16baaa;color:#333}.layui-btn-normal{background-color:#1e9fff}.layui-btn-warm{background-color:#ffb800}.layui-btn-danger{background-color:#ff5722}.layui-btn-checked{background-color:#16b777}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#fbfbfb!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:42px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:28px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:20px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#16baaa}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#d2d2d2!important}.layui-input:focus,.layui-textarea:focus{border-color:#16b777!important;box-shadow:0 0 0 3px rgba(22,183,119,.08)}.layui-textarea{position:relative;min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-input[disabled],.layui-textarea[disabled]{background-color:#fafafa}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{position:relative;margin-bottom:15px;clear:both}.layui-form-item:after{content:'\20';clear:both;display:block;height:0}.layui-form-label{position:relative;float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{position:relative;float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#ff5722!important;box-shadow:0 0 0 3px rgba(255,87,34,.08)}.layui-input-prefix,.layui-input-split,.layui-input-suffix,.layui-input-suffix .layui-input-affix{position:absolute;right:0;top:0;padding:0 10px;width:35px;height:100%;text-align:center;transition:all .3s;box-sizing:border-box}.layui-input-prefix{left:0;border-radius:2px 0 0 2px}.layui-input-suffix{right:0;border-radius:0 2px 2px 0}.layui-input-split{border-width:1px;border-style:solid}.layui-input-prefix .layui-icon,.layui-input-split .layui-icon,.layui-input-suffix .layui-icon{position:relative;font-size:16px;color:#5f5f5f;transition:all .3s}.layui-input-group{position:relative;display:table;box-sizing:border-box}.layui-input-group>*{display:table-cell;vertical-align:middle;position:relative}.layui-input-group .layui-input{padding-right:15px}.layui-input-group>.layui-input-prefix{width:auto;border-right:0}.layui-input-group>.layui-input-suffix{width:auto;border-left:0}.layui-input-group .layui-input-split{white-space:nowrap}.layui-input-wrap{position:relative;line-height:38px}.layui-input-wrap .layui-input{padding-right:35px}.layui-input-wrap .layui-input::-ms-clear,.layui-input-wrap .layui-input::-ms-reveal{display:none}.layui-input-wrap .layui-input-prefix+.layui-input,.layui-input-wrap .layui-input-prefix~* .layui-input{padding-left:35px}.layui-input-wrap .layui-input-split+.layui-input,.layui-input-wrap .layui-input-split~* .layui-input{padding-left:45px}.layui-input-wrap .layui-input-prefix~.layui-form-select{position:static}.layui-input-wrap .layui-input-prefix,.layui-input-wrap .layui-input-split,.layui-input-wrap .layui-input-suffix{pointer-events:none}.layui-input-wrap .layui-input:hover+.layui-input-split{border-color:#d2d2d2}.layui-input-wrap .layui-input:focus+.layui-input-split{border-color:#16b777}.layui-input-wrap .layui-input.layui-form-danger:focus+.layui-input-split{border-color:#ff5722}.layui-input-wrap .layui-input-prefix.layui-input-split{border-width:0;border-right-width:1px}.layui-input-wrap .layui-input-suffix.layui-input-split{border-width:0;border-left-width:1px}.layui-input-affix{line-height:38px}.layui-input-suffix .layui-input-affix{right:auto;left:-35px}.layui-input-affix .layui-icon{color:rgba(0,0,0,.8);pointer-events:auto!important;cursor:pointer}.layui-input-affix .layui-icon-clear{color:rgba(0,0,0,.3)}.layui-input-affix .layui-icon:hover{color:rgba(0,0,0,.6)}.layui-input-wrap .layui-input-number{width:24px;padding:0}.layui-input-wrap .layui-input-number .layui-icon{position:absolute;right:0;width:100%;height:50%;line-height:normal;font-size:12px}.layui-input-wrap .layui-input-number .layui-icon:before{position:absolute;left:50%;top:50%;margin-top:-6px;margin-left:-6px}.layui-input-wrap .layui-input-number .layui-icon-up{top:0;border-bottom:1px solid #eee}.layui-input-wrap .layui-input-number .layui-icon-down{bottom:0}.layui-input-wrap .layui-input-number .layui-icon:hover{font-weight:700}.layui-input-wrap .layui-input[type=number]::-webkit-inner-spin-button,.layui-input-wrap .layui-input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none!important}.layui-input-wrap .layui-input[type=number]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}.layui-input-wrap .layui-input.layui-input-number-invalid,.layui-input-wrap .layui-input.layui-input-number-out-of-range{color:#ff5722}.layui-form-select{position:relative;color:#5f5f5f}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;-webkit-transition:all .3s;transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:1px 1px 4px rgb(0 0 0 / 8%);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f8f8f8;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#f8f8f8;color:#16b777;font-weight:700}.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.layui-form-selected .layui-edge{margin-top:-3px\0}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-panel-wrap{position:absolute;z-index:99999999}.layui-select-panel-wrap dl{position:relative;display:block;top:0}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox>*{display:inline-block;vertical-align:middle}.layui-form-checkbox>div{padding:0 11px;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox>div>.layui-icon{line-height:normal}.layui-form-checkbox:hover>div{background-color:#c2c2c2}.layui-form-checkbox>i{position:absolute;right:0;top:0;width:30px;height:100%;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;color:rgba(255,255,255,0);font-size:20px;text-align:center;box-sizing:border-box}.layui-form-checkbox:hover>i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#16b777}.layui-form-checked:hover>div,.layui-form-checked>div{background-color:#16b777}.layui-form-checked:hover>i,.layui-form-checked>i{color:#16b777}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox.layui-checkbox-disabled>div{background-color:#eee!important}.layui-form [lay-checkbox]{display:none}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:24px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary]>div{margin-top:-1px;padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#5f5f5f}.layui-form-checkbox[lay-skin=primary]>i{right:auto;left:0;width:16px;height:16px;line-height:14px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover>i{border-color:#16b777;color:#fff}.layui-form-checked[lay-skin=primary]>i{border-color:#16b777!important;background-color:#16b777;color:#fff}.layui-checkbox-disabled[lay-skin=primary]>div{background:0 0!important}.layui-form-checked.layui-checkbox-disabled[lay-skin=primary]>i{background:#eee!important;border-color:#eee!important}.layui-checkbox-disabled[lay-skin=primary]:hover>i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate{border-color:#16b777;background-color:#fff}.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate:before{content:'';display:inline-block;vertical-align:middle;position:relative;width:50%;height:1px;margin:-1px auto 0;background-color:#16b777}.layui-form-switch{position:relative;display:inline-block;vertical-align:middle;height:24px;line-height:22px;min-width:44px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;box-sizing:border-box;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch>div{position:relative;top:0;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#16b777;background-color:#16b777}.layui-form-onswitch>i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch>div{margin-left:0;margin-right:21px;color:#fff!important}.layui-form-checkbox[lay-skin=none] *,.layui-form-radio[lay-skin=none] *{box-sizing:border-box}.layui-form-checkbox[lay-skin=none],.layui-form-radio[lay-skin=none]{position:relative;min-height:20px;margin:0;padding:0;height:auto;line-height:normal}.layui-form-checkbox[lay-skin=none]>div,.layui-form-radio[lay-skin=none]>div{position:relative;top:0;left:0;cursor:pointer;z-index:10;color:inherit;background-color:inherit}.layui-form-checkbox[lay-skin=none]>i,.layui-form-radio[lay-skin=none]>i{display:none}.layui-form-checkbox[lay-skin=none].layui-checkbox-disabled>div,.layui-form-radio[lay-skin=none].layui-radio-disabled>div{cursor:not-allowed}.layui-checkbox-disabled{border-color:#eee!important}.layui-checkbox-disabled>div{color:#c2c2c2!important}.layui-checkbox-disabled>i{border-color:#eee!important}.layui-checkbox-disabled:hover>i{color:#fff!important}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled>i{color:#c2c2c2}.layui-form-checkbox[lay-skin=tag].layui-form-checked.layui-checkbox-disabled:hover>i{color:#c2c2c2!important}.layui-form-radio{display:inline-block;vertical-align:middle;line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio>*{display:inline-block;vertical-align:middle;font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover>*,.layui-form-radioed,.layui-form-radioed>i{color:#16b777}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled>*{color:#c2c2c2!important}.layui-form [lay-radio]{display:none}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#fafafa;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0;border-right-width:1px}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-laypage{display:inline-block;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage a[data-page]{color:#333}.layui-laypage a{text-decoration:none!important;cursor:pointer}.layui-laypage a:hover{color:#16baaa}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#16baaa}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{display:inline-block;width:40px;margin:0 10px;padding:0 3px;text-align:center;transition:none}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#16baaa!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px;clear:both}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;margin:10px 0;background-color:#fff;color:#5f5f5f}.layui-table tr{-webkit-transition:all .3s;transition:all .3s}.layui-table th{text-align:left;font-weight:600}.layui-table-mend{background-color:#fff}.layui-table-click,.layui-table-hover,.layui-table[lay-even] tbody tr:nth-child(even){background-color:#f8f8f8}.layui-table-checked{background-color:#dbfbf0}.layui-table-checked.layui-table-click,.layui-table-checked.layui-table-hover,.layui-table[lay-even] tbody tr:nth-child(even).layui-table-checked{background-color:#abf8dd}.layui-table-disabled-transition *,.layui-table-disabled-transition :after,.layui-table-disabled-transition :before{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-mend,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0;border-bottom-width:1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0;border-right-width:1px}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding-top:15px;padding-right:30px;padding-bottom:15px;padding-left:30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:50px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{padding-top:5px;padding-right:10px;padding-bottom:5px;padding-left:10px;font-size:12px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:30px;line-height:20px;padding-top:5px;padding-left:11px;padding-right:11px}.layui-table[lay-data],.layui-table[lay-options]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view{clear:both;position:relative;border-right:none}.layui-table-view:after{content:'';position:absolute;top:0;right:0;width:1px;height:100%;background-color:#eee;z-index:101}.layui-table-view .layui-table{position:relative;width:auto;margin:0;border:0;border-collapse:separate}.layui-table-view .layui-table[lay-skin=line]{border-width:0;border-right-width:1px}.layui-table-view .layui-table[lay-skin=row]{border-width:0;border-bottom-width:1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:0;border-top:none;border-left:none}.layui-table-view .layui-table th [lay-event],.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td,.layui-table-view .layui-table th span{cursor:default}.layui-table-view .layui-table td[data-edit]{cursor:text}.layui-table-view .layui-table td[data-edit]:hover:after{position:absolute;left:0;top:0;width:100%;height:100%;box-sizing:border-box;border:1px solid #16b777;pointer-events:none;content:''}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px;line-height:16px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;right:0;bottom:0;margin:0;z-index:199;transition:opacity .1s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.layui-table-loading-icon{position:absolute;width:100%\0;left:50%;left:auto\0;top:50%;margin-top:-15px\0;transform:translate(-50%,-50%);transform:none\0;text-align:center}.layui-table-loading-icon .layui-icon{font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0;border-bottom-width:1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-column{position:relative;width:100%;min-height:41px;padding:8px 16px;border-width:0;border-bottom-width:1px}.layui-table-column .layui-btn-container{margin-bottom:-8px}.layui-table-column .layui-btn-container .layui-btn{margin-right:8px;margin-bottom:8px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;z-index:399;padding:5px 0!important;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-tool-panel li{padding:0 10px;margin:0!important;line-height:30px;list-style-type:none!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%}.layui-table-tool-panel li:hover{background-color:#f8f8f8}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{padding-left:28px}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0;border-left-width:1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#5f5f5f}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#5f5f5f}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:38px;line-height:28px;padding:6px 15px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-form-checkbox[lay-skin=primary]>div{padding-left:24px}.layui-table-cell .layui-table-link{color:#01aaed}.layui-table-cell .layui-btn{vertical-align:inherit}.layui-table-cell[align=center]{-webkit-box-pack:center}.layui-table-cell[align=right]{-webkit-box-pack:end}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{text-align:center;-webkit-box-pack:center}.layui-table-body{position:relative;overflow:auto;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:0;border-width:0;border-left-width:1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px;border-width:0;border-left-width:1px}.layui-table-tool{position:relative;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0;border-bottom-width:1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-total{margin-bottom:-1px;border-width:0;border-top-width:1px;overflow:hidden}.layui-table-page{border-width:0;border-top-width:1px;margin-bottom:-1px;white-space:nowrap;overflow:hidden}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-11px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-pagebar{float:right;line-height:23px}.layui-table-pagebar .layui-btn-sm{margin-top:-1px}.layui-table-pagebar .layui-btn-xs{margin-top:2px}.layui-table-view select[lay-ignore]{display:inline-block}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;z-index:189;min-width:100%;min-height:100%;padding:5px 14px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15);background-color:#fff}.layui-table-edit:focus{border-color:#16b777!important}input.layui-input.layui-table-edit{height:100%}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:24px;height:100%;padding:5px 0;border-width:0;border-left-width:1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px;font-size:14px}.layui-table-grid-down:hover{background-color:#fbfbfb}.layui-table-expanded{height:95px}.layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=lg] .layui-table-expanded .layui-table-cell,.layui-table-view .layui-table[lay-size=sm] .layui-table-expanded .layui-table-cell{height:auto;max-height:94px;white-space:normal;text-overflow:clip}.layui-table-cell-c{position:absolute;bottom:-10px;right:50%;margin-right:-9px;width:20px;height:20px;line-height:18px;cursor:pointer;text-align:center;background-color:#fff;border:1px solid #eee;border-radius:50%;z-index:1000;transition:.3s all;font-size:14px}.layui-table-cell-c:hover{border-color:#16b777}.layui-table-expanded td:hover .layui-table-cell{overflow:auto}.layui-table-main>.layui-table>tbody>tr:last-child>td>.layui-table-cell-c{bottom:0}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-49px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#5f5f5f}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#5f5f5f;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-table-tree-nodeIcon{max-width:20px}.layui-table-tree-nodeIcon>*{width:100%}.layui-table-tree-flexIcon,.layui-table-tree-nodeIcon{margin-right:2px}.layui-table-tree-flexIcon{cursor:pointer}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-list{margin:11px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;display:inline-block;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#16baaa}.layui-upload-drag[lay-over]{border-color:#16baaa}.layui-upload-form{display:inline-block}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;display:inline-block;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff;box-sizing:border-box}.layui-menu *{box-sizing:border-box}.layui-menu li,.layui-menu-body-title,.layui-menu-body-title a{padding:5px 15px;color:initial}.layui-menu li{position:relative;margin:0 0 1px;line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer;transition:all .3s}.layui-menu li:hover{background-color:#f8f8f8}.layui-menu li.layui-disabled,.layui-menu li.layui-disabled *{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group>.layui-menu-body-title,.layui-menu-item-parent>.layui-menu-body-title{padding-right:38px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default}.layui-menu .layui-menu-item-none{text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down>.layui-menu-body-title>.layui-icon-down{transform:rotate(180deg)}.layui-menu .layui-menu-item-up>.layui-menu-body-title>.layui-icon-up{transform:rotate(-180deg)}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:#000}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#f8f8f8!important;color:#16b777}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#16b777}.layui-menu .layui-menu-item-checked:after{position:absolute;right:-1px;top:0;bottom:0;border-right:3px solid #16b777;content:''}.layui-menu-body-title{position:relative;margin:-5px -15px;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;overflow:hidden;text-overflow:ellipsis;color:rgba(0,0,0,.8)}.layui-menu-body-title a:hover{transition:all .3s}.layui-menu-body-title>.layui-icon{position:absolute;right:15px;top:50%;margin-top:-6px;line-height:normal;font-size:14px;-webkit-transition:all .2s;transition:all .2s}.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-menu-body-title>.layui-icon-right{right:14px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:'';position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px 0}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#16b777}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px 0}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:77777777;margin:5px 0;min-width:100px}.layui-dropdown:before{content:'';position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-dropdown-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}.layui-tabs{position:relative}.layui-tabs.layui-hide-v{overflow:hidden}.layui-tabs-header{position:relative;left:0;height:40px;padding:0!important;white-space:nowrap;font-size:0;-webkit-transition:all .16s;transition:all .16s}.layui-tabs-header:after,.layui-tabs-scroll:after{content:'';position:absolute;left:0;bottom:0;z-index:0;width:100%;border-bottom:1px solid #eee}.layui-tabs-header li{position:relative;display:inline-block;vertical-align:middle;line-height:40px;margin:0!important;padding:0 16px;text-align:center;cursor:pointer;font-size:14px;-webkit-transition:all .16s;transition:all .16s}.layui-tabs-header li:first-child{margin-left:0}.layui-tabs-header li a{display:block;padding:0 16px;margin:0 -16px;color:inherit}.layui-tabs-header li a:hover{text-decoration:none}.layui-tabs-header .layui-this,.layui-tabs-header li:hover{color:#16baaa}.layui-tabs-header .layui-this:after{content:'';position:absolute;left:0;top:0;z-index:1;width:100%;height:100%;border-bottom:3px solid #16baaa;box-sizing:border-box;pointer-events:none}.layui-tabs-header .layui-badge,.layui-tabs-header .layui-badge-dot{left:5px;top:-1px}.layui-tabs-scroll{position:relative;overflow:hidden;padding:0 40px}.layui-tabs-scroll .layui-tabs-header:after{display:none;content:none;border:0}.layui-tabs-bar .layui-icon{position:absolute;left:0;top:0;z-index:3;width:40px;height:100%;line-height:40px;border:1px solid #eee;text-align:center;cursor:pointer;box-sizing:border-box;background-color:#fff;box-shadow:2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-bar .layui-icon-next{left:auto;right:0;box-shadow:-2px 0 5px 0 rgb(0 0 0 / 6%)}.layui-tabs-header li .layui-tabs-close{position:relative;display:inline-block;width:16px;height:16px;line-height:18px;margin-left:8px;top:0;text-align:center;font-size:12px;color:#959595;border-radius:50%;font-weight:700;-webkit-transition:all .16s;transition:all .16s}.layui-tabs-header li .layui-tabs-close:hover{background-color:#ff5722;color:#fff}.layui-tabs-header li[lay-closable=false] .layui-tabs-close{display:none}.layui-tabs-body{padding:16px 0}.layui-tabs-item{display:none}.layui-tabs-card>.layui-tabs-header .layui-this{background-color:#fff}.layui-tabs-card>.layui-tabs-header .layui-this:after{border:1px solid #eee;border-bottom-color:#fff;border-radius:2px 2px 0 0}.layui-tabs-card>.layui-tabs-header li:first-child.layui-this:after{margin-left:-1px}.layui-tabs-card>.layui-tabs-header li:last-child.layui-this:after{margin-right:-1px}.layui-tabs-card.layui-panel>.layui-tabs-header .layui-this:after{border-top:0;border-radius:0}.layui-tabs-card.layui-panel>.layui-tabs-body{padding:16px}.layui-nav{position:relative;padding:0 15px;background-color:#2f363c;color:#fff;border-radius:2px;font-size:0;box-sizing:border-box}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;margin-top:0;list-style:none;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);-webkit-transition:all .3s;transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:'';position:absolute;left:0;top:0;width:0;height:3px;background-color:#16b777;-webkit-transition:all .2s;transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff;text-decoration:none}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;-webkit-transition:all .2s;transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap;box-sizing:border-box}.layui-nav .layui-nav-child a{color:#5f5f5f;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#f8f8f8;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#f8f8f8;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#16baaa;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-bar{background-color:#16baaa}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;background:0 0;background-color:rgba(0,0,0,.3);box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child,.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-nav-tree.layui-bg-gray a,.layui-nav.layui-bg-gray .layui-nav-item a{color:#373737;color:rgba(0,0,0,.8)}.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color:#000!important}.layui-nav.layui-bg-gray .layui-this a{color:#16b777}.layui-nav-tree.layui-bg-gray .layui-nav-child{padding-left:11px;background:0 0}.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this a,.layui-nav-tree.layui-bg-gray .layui-this,.layui-nav-tree.layui-bg-gray .layui-this>a{background:0 0!important;color:#16b777!important;font-weight:700}.layui-nav-tree.layui-bg-gray .layui-nav-bar{background-color:#16b777}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#16b777!important}.layui-breadcrumb a cite{color:#5f5f5f;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab .layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;-webkit-transition:all .2s;transition:all .2s}.layui-tab .layui-tab-title:after{content:'';border-bottom-color:#eee;border-bottom-width:1px;border-style:none none solid;bottom:0;left:0;right:auto;top:auto;pointer-events:none;position:absolute;width:100%;z-index:8}.layui-tab .layui-tab-title li{display:inline-block;vertical-align:middle;font-size:14px;-webkit-transition:all .2s;transition:all .2s}.layui-tab .layui-tab-title li{position:relative;line-height:40px;min-width:65px;margin:0;padding:0 15px;text-align:center;cursor:pointer}.layui-tab .layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:40px;border-width:1px;border-bottom-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none;z-index:9}.layui-tab-bar{box-sizing:border-box;position:absolute;right:0;top:0;z-index:10;width:30px;height:40px;line-height:40px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;-webkit-transition:all .3s;transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\0;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;-webkit-transition:all .2s;transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#ff5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#16baaa}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #16b777}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#fafafa}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#16b777}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#16b777;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#ff5722}.layui-timeline-item:before{content:'';position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#ff5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#5f5f5f}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\0;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:none 0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\0;opacity:1;left:20px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind ul li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind ul li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-carousel-next{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateX(0);transform:translateX(0)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{-webkit-transform:translateY(0);transform:translateY(0)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{-webkit-transform:translateY(-100%);transform:translateY(-100%)}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{-webkit-transform:translateY(100%);transform:translateY(100%)}.layui-carousel[lay-anim=fade]>[carousel-item]>*{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:16px;bottom:16px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9f9f9f;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#5f5f5f;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #d9d9d9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{display:block;position:relative;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333;font-family:'Courier New',Consolas,'Lucida Console',monospace;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;display:inline-block;vertical-align:middle;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 11px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:11px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;line-height:normal;margin-top:-8px;color:#5f5f5f}.layui-transfer-active{margin:0 15px;display:inline-block;vertical-align:middle}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#16b777;border-color:#16b777;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#fbfbfb;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;margin-top:0!important;padding:0 11px;list-style-type:none!important}.layui-transfer-data li:hover{background-color:#f8f8f8;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 11px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:11px 6px 11px 0;font-size:0}.layui-rate li{margin-top:0!important}.layui-rate li i.layui-icon{font-size:20px;color:#ffb800}.layui-rate li i.layui-icon{margin-right:5px;-webkit-transition:all .3s;transition:all .3s}.layui-rate li i:hover,.layui-rate-hover{cursor:pointer;-webkit-transform:scale(1.12);transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:38px;height:38px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;-webkit-transition:all .3s;transition:all .3s;box-sizing:border-box}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:44px;height:44px;line-height:30px}.layui-colorpicker.layui-colorpicker-sm{width:30px;height:30px;line-height:20px;padding:3px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:16px;padding:1px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#fff;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:77777777;width:280px;margin:5px 0;padding:7px;background:#fff;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative;overflow:hidden}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #fff;border-radius:50%;position:absolute;top:0;right:100%;cursor:pointer;transform:translate(-50%,-50%)}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;box-sizing:border-box;background:#fff;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:168px;height:30px;color:#5f5f5f;padding-left:5px}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#fff;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#fff;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:'';height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:77777777;white-space:nowrap;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#fff;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:'';position:absolute;bottom:-11px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px;box-sizing:border-box}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none;padding-right:21px}.layui-slider-input-btn i:hover{color:#16baaa}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:'';position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:26px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{display:inline-block;vertical-align:middle;cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:'';position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{display:inline-block;vertical-align:middle;position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:14px;line-height:12px;width:14px;margin:0 11px;text-align:center;border:1px solid #c0c4cc}.layui-tree-icon .layui-icon{font-size:12px;color:#5f5f5f}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:'';position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-spread>.layui-tree-entry .layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#5f5f5f}.layui-tree-btnGroup{visibility:hidden;display:inline-block;vertical-align:middle;position:relative}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{position:relative;display:inline-block;vertical-align:middle;height:20px;line-height:20px;padding:0;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{-webkit-transition:all .2s;transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout}html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-wrap{font-size:13px;font-family:'Courier New',Consolas,'Lucida Console',monospace}.layui-code-view{display:block;position:relative;padding:0!important;border:1px solid #eee;border-left-width:6px;background-color:#fff;color:#333}.layui-code-view pre{margin:0!important}.layui-code-header{position:relative;z-index:3;padding:0 11px;height:40px;line-height:40px;border-bottom:1px solid #eee;background-color:#fafafa;font-size:12px}.layui-code-header>.layui-code-header-about{position:absolute;right:11px;top:0;color:#b7b7b7}.layui-code-header-about>a{padding-left:10px}.layui-code-wrap{position:relative;display:block;z-index:1;margin:0!important;padding:11px 0!important;overflow-x:hidden;overflow-y:auto}.layui-code-line{position:relative;line-height:19px;margin:0!important}.layui-code-line-number{position:absolute;left:0;top:0;padding:0 8px;min-width:45px;height:100%;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;overflow:hidden}.layui-code-line-content{padding:0 11px;word-wrap:break-word;white-space:pre-wrap}.layui-code-ln-mode>.layui-code-wrap>.layui-code-line{padding-left:45px}.layui-code-ln-side{position:absolute;left:0;top:0;bottom:0;z-index:0;width:45px;border-right:1px solid #eee;border-color:rgb(126 122 122 / 15%);background-color:#fafafa;pointer-events:none}.layui-code-nowrap>.layui-code-wrap{overflow:auto}.layui-code-nowrap>.layui-code-wrap>.layui-code-line>.layui-code-line-content{white-space:pre;word-wrap:normal}.layui-code-nowrap>.layui-code-ln-side{border-right-width:0!important;background:0 0!important}.layui-code-fixbar{position:absolute;top:8px;right:11px;padding-right:45px;z-index:5}.layui-code-fixbar>span{position:absolute;right:0;top:0;padding:0 8px;color:#777;transition:all .3s}.layui-code-fixbar>span:hover{color:#16b777}.layui-code-copy{display:none;cursor:pointer}.layui-code-preview>.layui-code-view>.layui-code-fixbar .layui-code-copy{display:none!important}.layui-code-view:hover>.layui-code-fixbar .layui-code-copy{display:block}.layui-code-view:hover>.layui-code-fixbar .layui-code-lang-marker{display:none}.layui-code-theme-dark,.layui-code-theme-dark>.layui-code-header{border-color:rgb(126 122 122 / 15%);background-color:#1f1f1f}.layui-code-theme-dark{border-width:1px;color:#ccc}.layui-code-theme-dark>.layui-code-ln-side{border-right-color:#2a2a2a;background:0 0;color:#6e7681}.layui-code textarea{display:none}.layui-code-preview>.layui-code,.layui-code-preview>.layui-code-view{margin:0}.layui-code-preview>.layui-tab{position:relative;z-index:1;margin-bottom:0}.layui-code-preview .layui-code-item{display:none;border-top-width:0}.layui-code-item-preview{position:relative;padding:16px}.layui-code-item-preview>iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:none}.layui-code-tools{position:absolute;right:11px;top:8px;line-height:normal}.layui-code-tools>i{display:inline-block;margin-left:6px;padding:3px;cursor:pointer}.layui-code-tools>i.layui-icon-file-b{color:#999}.layui-code-tools>i:hover{color:#16b777}.layui-code-full{position:fixed;left:0;top:0;z-index:1111111;width:100%;height:100%;background-color:#fff}.layui-code-full .layui-code-item{width:100%!important;border-width:0!important}.layui-code-full .layui-code-item,.layui-code-full .layui-code-view,.layui-code-full .layui-code-wrap{height:calc(100vh - 51px)!important;box-sizing:border-box}.layui-code-full .layui-code-item-preview{overflow:auto}.layui-code-view.layui-code-hl{line-height:20px!important;border-left-width:1px}.layui-code-view.layui-code-hl>.layui-code-ln-side{background-color:transparent}.layui-code-theme-dark.layui-code-hl,.layui-code-theme-dark.layui-code-hl>.layui-code-ln-side{border-color:rgb(126 122 122 / 15%)}.layui-code-line-highlighted{background-color:rgba(142,150,170,.14)}.layui-code-line-diff-add{background-color:rgba(16,185,129,.14)}.layui-code-line-diff-remove{background-color:rgba(244,63,94,.14)}.layui-code-line-diff-add:before{position:absolute;content:'+';color:#18794e}.layui-code-line-diff-remove:before{position:absolute;content:'-';color:#b8272c}.layui-code-has-focused-lines .layui-code-line:not(.layui-code-line-has-focus){filter:blur(.095rem);opacity:.7;-webkit-transition:filter .35s,opacity .35s;transition:filter .35s,opacity .35s}.layui-code-has-focused-lines:hover .layui-code-line:not(.layui-code-line-has-focus){filter:blur();opacity:1}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:99999999;margin:5px 0;border-radius:2px;font-size:14px;line-height:normal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{-webkit-transition-duration:.3s;transition-duration:.3s}.layui-laydate-shade{top:0;left:0;width:100%;height:100%;position:fixed;pointer-events:auto}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-time-show .layui-laydate-header{padding-left:10px;padding-right:10px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:0;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=workdays]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#16b777}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#777}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px;border-radius:0}.laydate-footer-btns span:first-child{border-radius:2px 0 0 2px}.laydate-footer-btns span:last-child{border-radius:0 2px 2px 0}.layui-laydate-shortcut{width:80px;padding:6px 0;display:inline-block;vertical-align:top;overflow:auto;max-height:276px;text-align:center}.layui-laydate-shortcut+.layui-laydate-main{display:inline-block;border-left:1px solid #e2e2e2}.layui-laydate-shortcut>li{padding:5px 8px;cursor:pointer;line-height:18px}.layui-laydate .layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate .layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer;list-style:none}.layui-laydate .laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list{display:table}.layui-laydate .laydate-time-list>li{display:table-cell;height:100%;margin:0;line-height:normal;cursor:default}.layui-laydate .laydate-time-list p{position:relative;top:-4px;margin:0;line-height:29px}.layui-laydate .laydate-time-list ol{height:181px;overflow:hidden}.layui-laydate .laydate-time-list>li:hover ol{overflow-y:auto}.layui-laydate .laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate .laydate-time-list-hide-1 ol li{padding-left:53px}.layui-laydate .laydate-time-list-hide-2 ol li{padding-left:117px}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722;white-space:pre-line}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle;max-width:50%}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-0 .laydate-next-y,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-m,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .laydate-prev-y{display:none}.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range.layui-laydate-linkage .laydate-main-list-1 .layui-laydate-header{border-left-style:dashed}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#777}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#16b777}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#777}.layui-laydate-content td.laydate-day-now{color:#16b777}.layui-laydate-content td.laydate-day-now:after{content:'';position:absolute;width:100%;height:30px;left:0;top:0;border:1px solid #16b777;box-sizing:border-box}.layui-laydate-linkage .layui-laydate-content td.laydate-selected>div{background-color:#cffae9;transition:all .3s}.layui-laydate-linkage .laydate-selected:hover>div{background-color:#cffae9!important}.layui-laydate-content td.laydate-selected:after,.layui-laydate-content td:hover:after{content:none}.layui-laydate-content td>div:hover,.layui-laydate-list li:hover,.layui-laydate-shortcut>li:hover{background-color:#eee;color:#333;transition:all .3s}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.layui-laydate-linkage .laydate-selected.laydate-day-next>div,.layui-laydate-linkage .laydate-selected.laydate-day-prev>div{background:0 0!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#16b777}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#16b777}.layui-laydate .layui-this,.layui-laydate .layui-this>div{background-color:#16b777!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-laydate .layui-this.laydate-disabled,.layui-laydate .layui-this.laydate-disabled>div{background-color:#eee!important}.layui-laydate-content td>div{padding:7px 0;height:100%}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#16baaa}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-this,.laydate-theme-molv .layui-this>div{background-color:#16baaa!important}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.layui-laydate-linkage.laydate-theme-grid .laydate-selected,.layui-laydate-linkage.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#16baaa!important}.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-next,.layui-laydate-linkage.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px}.laydate-theme-grid .layui-laydate-content td>div{height:29px;margin-top:-1px}.laydate-theme-circle .layui-laydate-content td.layui-this>div,.laydate-theme-circle .layui-laydate-content td>div{width:28px;height:28px;line-height:28px;border-radius:14px;margin:0 4px;padding:0}.layui-laydate.laydate-theme-circle .layui-laydate-content table td.layui-this{background-color:transparent!important}.laydate-theme-grid.laydate-theme-circle .layui-laydate-content td>div{margin:0 3.5px}.laydate-theme-fullpanel .layui-laydate-main{width:526px}.laydate-theme-fullpanel .layui-laydate-list{width:252px;left:272px}.laydate-theme-fullpanel .laydate-set-ym span{display:none}.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-theme-fullpanel .laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-theme-fullpanel .laydate-time-show .layui-laydate-header .layui-icon{display:inline-block!important}.laydate-theme-fullpanel .laydate-btns-time{display:none}.laydate-theme-fullpanel .laydate-time-list-hide-1 ol li{padding-left:49px}.laydate-theme-fullpanel .laydate-time-list-hide-2 ol li{padding-left:107px}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{opacity:0;transition:opacity .35s cubic-bezier(.34,.69,.1,1);top:0;left:0;width:100%;height:100%}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(data:image/gif;base64,R0lGODlhJQAlAJECAL3L2AYrTv///wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgACACwAAAAAJQAlAAACi5SPqcvtDyGYIFpF690i8xUw3qJBwUlSadmcLqYmGQu6KDIeM13beGzYWWy3DlB4IYaMk+Dso2RWkFCfLPcRvFbZxFLUDTt21BW56TyjRep1e20+i+eYMR145W2eefj+6VFmgTQi+ECVY8iGxcg35phGo/iDFwlTyXWphwlm1imGRdcnuqhHeop6UAAAIfkEBQoAAgAsEAACAAQACwAAAgWMj6nLXAAh+QQFCgACACwVAAUACgALAAACFZQvgRi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwXABEADAADAAACBYyPqcsFACH5BAUKAAIALBUAFQAKAAsAAAITlGKZwWoMHYxqtmplxlNT7ixGAQAh+QQFCgACACwQABgABAALAAACBYyPqctcACH5BAUKAAIALAUAFQAKAAsAAAIVlC+BGL3Z3IlxUmUuhtR2LzHhsiEFACH5BAUKAAIALAEAEQAMAAMAAAIFjI+pywUAIfkEBQoAAgAsBQAFAAoACwAAAhOUYJnAagwdjGq2amXGU1PuLEYBACH5BAUKAAIALBAAAgAEAAsAAAIFhI+py1wAIfkEBQoAAgAsFQAFAAoACwAAAhWUL4AIvdnciXFSZS6G1HYvMeGyIQUAIfkEBQoAAgAsFwARAAwAAwAAAgWEj6nLBQAh+QQFCgACACwVABUACgALAAACE5RgmcBqDB2MarZqZcZTU+4sRgEAIfkEBQoAAgAsEAAYAAQACwAAAgWEj6nLXAAh+QQFCgACACwFABUACgALAAACFZQvgAi92dyJcVJlLobUdi8x4bIhBQAh+QQFCgACACwBABEADAADAAACBYSPqcsFADs=) #fff center center no-repeat}.layui-layer-btn a,.layui-layer-setwin span{display:inline-block;vertical-align:middle}.layui-layer-move{display:none;position:fixed;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@-webkit-keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@keyframes layer-slide-down{from{transform:translate3d(0,-100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-down-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,-100%,0)}}.layer-anim-slide-down{animation-name:layer-slide-down}.layer-anim-slide-down-out{animation-name:layer-slide-down-out}@keyframes layer-slide-left{from{transform:translate3d(100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-left-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(100%,0,0)}}.layer-anim-slide-left{animation-name:layer-slide-left}.layer-anim-slide-left-out{animation-name:layer-slide-left-out}@keyframes layer-slide-up{from{transform:translate3d(0,100%,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-up-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(0,100%,0)}}.layer-anim-slide-up{animation-name:layer-slide-up}.layer-anim-slide-up-out{animation-name:layer-slide-up-out}@keyframes layer-slide-right{from{transform:translate3d(-100%,0,0)}to{transform:translate3d(0,0,0)}}@keyframes layer-slide-right-out{from{transform:translate3d(0,0,0)}to{transform:translate3d(-100%,0,0)}}.layer-anim-slide-right{animation-name:layer-slide-right}.layer-anim-slide-right-out{animation-name:layer-slide-right-out}.layui-layer-title{padding:0 81px 0 16px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;top:16px;font-size:0;line-height:initial}.layui-layer-setwin span{position:relative;width:16px;height:16px;line-height:18px;margin-left:10px;text-align:center;font-size:16px;cursor:pointer;color:#000;_overflow:hidden;box-sizing:border-box}.layui-layer-setwin .layui-layer-min:before{content:'';position:absolute;width:12px;border-bottom:1px solid #2e2d3c;left:50%;top:50%;margin:-.5px 0 0 -6px;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max:after,.layui-layer-setwin .layui-layer-max:before{content:'';position:absolute;left:50%;top:50%;z-index:1;width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid #2e2d3c}.layui-layer-setwin .layui-layer-max:hover:after,.layui-layer-setwin .layui-layer-max:hover:before{border-color:#2d93ca}.layui-layer-setwin .layui-layer-min:hover:before{background-color:#2d93ca}.layui-layer-setwin .layui-layer-maxmin:after,.layui-layer-setwin .layui-layer-maxmin:before{width:7px;height:7px;margin:-3px 0 0 -3px;background-color:#fff}.layui-layer-setwin .layui-layer-maxmin:after{z-index:0;margin:-5px 0 0 -1px}.layui-layer-setwin .layui-layer-close{cursor:pointer}.layui-layer-setwin .layui-layer-close:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;color:#fff;background-color:#787878;padding:3px;border:3px solid;width:28px;height:28px;font-size:16px;font-weight:bolder;border-radius:50%;margin-left:0}.layui-layer-setwin .layui-layer-close2:hover{opacity:unset;background-color:#3888f6}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.layui-layer-btn a{height:30px;line-height:30px;margin:5px 5px 0;padding:0 16px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none;box-sizing:border-box}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:transparent;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-btn-is-loading{opacity:.5!important;cursor:not-allowed!important;cursor:wait!important;overflow:hidden;white-space:nowrap;-webkit-user-select:none;-ms-user-select:none;user-select:none}.layui-layer-btn-is-loading .layui-layer-btn-loading-icon{margin-right:8px;font-size:14px}.layui-layer-dialog{min-width:240px}.layui-layer-dialog .layui-layer-content{position:relative;padding:16px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-face{position:absolute;top:18px;left:16px;color:#959595;font-size:32px;_left:-40px}.layui-layer-dialog .layui-layer-content .layui-icon-tips{color:#f39b12}.layui-layer-dialog .layui-layer-content .layui-icon-success{color:#16b777}.layui-layer-dialog .layui-layer-content .layui-icon-error{top:19px;color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-question{color:#ffb800}.layui-layer-dialog .layui-layer-content .layui-icon-lock{color:#787878}.layui-layer-dialog .layui-layer-content .layui-icon-face-cry{color:#ff5722}.layui-layer-dialog .layui-layer-content .layui-icon-face-smile{color:#16b777}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-close{color:#fff}.layui-layer-hui .layui-layer-content{padding:11px 24px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:18px 24px 18px 58px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:76px;height:38px;line-height:38px;text-align:center}.layui-layer-loading-icon{font-size:38px;color:#959595}.layui-layer-loading2{text-align:center}.layui-layer-loading-2{position:relative;height:38px}.layui-layer-loading-2:after,.layui-layer-loading-2:before{content:'';position:absolute;left:50%;top:50%;width:38px;height:38px;margin:-19px 0 0 -19px;border-radius:50%;border:3px solid #d2d2d2;box-sizing:border-box}.layui-layer-loading-2:after{border-color:transparent;border-left-color:#1e9fff}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-lan .layui-layer-setwin .layui-icon,.layui-layer-molv .layui-layer-setwin .layui-icon{color:#fff}.layui-layer-win10{border:1px solid #aaa;box-shadow:1px 1px 6px rgba(0,0,0,.3);border-radius:none}.layui-layer-win10 .layui-layer-title{height:32px;line-height:32px;padding-left:8px;border-bottom:none;font-size:12px}.layui-layer-win10 .layui-layer-setwin{right:0;top:0}.layui-layer-win10 .layui-layer-setwin span{margin-left:0;width:32px;height:32px;padding:8px}.layui-layer-win10.layui-layer-page .layui-layer-setwin span{width:38px}.layui-layer-win10 .layui-layer-setwin span:hover{background-color:#e5e5e5}.layui-layer-win10 .layui-layer-setwin span.layui-icon-close:hover{background-color:#e81123;color:#fff}.layui-layer-win10.layui-layer-dialog .layui-layer-content{padding:8px 16px 32px;color:#0033bc}.layui-layer-win10.layui-layer-dialog .layui-layer-padding{padding-top:18px;padding-left:58px}.layui-layer-win10 .layui-layer-btn{padding:5px 5px 10px;border-top:1px solid #dfdfdf;background-color:#f0f0f0}.layui-layer-win10 .layui-layer-btn a{height:20px;line-height:18px;background-color:#e1e1e1;border-color:#adadad;color:#000;font-size:12px;transition:all .3s}.layui-layer-win10 .layui-layer-btn a:hover{border-color:#2a8edd;background-color:#e5f1fb}.layui-layer-win10 .layui-layer-btn .layui-layer-btn0{border-color:#0078d7}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:16px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;display:inline-block;vertical-align:top;border-left:1px solid transparent;border-right:1px solid transparent;min-width:80px;max-width:300px;padding:0 16px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left-color:#eee;border-right-color:#eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left-color:transparent}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:visible;text-align:center}.layui-layer-photos .layer-layer-photos-main img{position:relative;width:100%;display:inline-block;vertical-align:top}.layui-layer-photos-next,.layui-layer-photos-prev{position:fixed;top:50%;width:52px;height:52px;line-height:52px;margin-top:-26px;cursor:pointer;font-size:52px;color:#717171}.layui-layer-photos-prev{left:32px}.layui-layer-photos-next{right:32px}.layui-layer-photos-next:hover,.layui-layer-photos-prev:hover{color:#959595}.layui-layer-photos-toolbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:52px;line-height:52px;background-color:rgba(0,0,0,.32);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-photos-toolbar>*{display:inline-block;vertical-align:top;padding:0 16px;font-size:12px;color:#fff}.layui-layer-photos-toolbar *{font-size:12px}.layui-layer-photos-header{top:0;bottom:auto}.layui-layer-photos-header>span{cursor:pointer}.layui-layer-photos-header>span:hover{background-color:rgba(51,51,51,.32)}.layui-layer-photos-header .layui-icon{font-size:18px}.layui-layer-photos-footer>h3{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-layer-photos-footer a:hover{text-decoration:underline}.layui-layer-photos-footer em{font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s} \ No newline at end of file diff --git a/public/static/assets/layui/css/modules/code.css b/public/static/assets/layui/css/modules/code.css new file mode 100644 index 0000000..a2ff92a --- /dev/null +++ b/public/static/assets/layui/css/modules/code.css @@ -0,0 +1 @@ +html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-view{display:block;position:relative;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:13px}.layui-code-title{position:relative;padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee;font-size:12px}.layui-code-title>.layui-code-about{position:absolute;right:10px;top:0;color:#b7b7b7}.layui-code-about>a{padding-left:10px}.layui-code-view>.layui-code-ol,.layui-code-view>.layui-code-ul{position:relative;overflow:auto}.layui-code-view>.layui-code-ol>li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view>.layui-code-ol>li:first-child,.layui-code-view>.layui-code-ul>li:first-child{padding-top:10px}.layui-code-view>.layui-code-ol>li:last-child,.layui-code-view>.layui-code-ul>li:last-child{padding-bottom:10px}.layui-code-view>.layui-code-ul>li{position:relative;line-height:20px;padding:0 10px;list-style-type:none;*list-style-type:none;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-dark{border:1px solid #0c0c0c;border-left-color:#3f3f3f;background-color:#0c0c0c;color:#c2be9e}.layui-code-dark>.layui-code-title{border-bottom:none}.layui-code-dark>.layui-code-ol>li,.layui-code-dark>.layui-code-ul>li{background-color:#3f3f3f;border-left:none}.layui-code-dark>.layui-code-ul>li{margin-left:6px}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none} \ No newline at end of file diff --git a/public/static/assets/layui/css/modules/laydate/default/laydate.css b/public/static/assets/layui/css/modules/laydate/default/laydate.css new file mode 100644 index 0000000..549ccb8 --- /dev/null +++ b/public/static/assets/layui/css/modules/laydate/default/laydate.css @@ -0,0 +1 @@ +html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate,.layui-laydate *{box-sizing:border-box}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate{animation-name:laydate-downbit}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content th{font-weight:400}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.laydate-day-holidays:before{position:absolute;left:0;top:0;font-size:12px;transform:scale(.7)}.laydate-day-holidays:before{content:'\4F11';color:#ff5722}.laydate-day-holidays[type=work]:before{content:'\73ED';color:inherit}.layui-laydate .layui-this .laydate-day-holidays:before{color:#fff}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #c9c9c9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-footer span:hover{color:#5fb878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;box-sizing:border-box;background-color:#fff}.layui-laydate-list>li{position:relative;display:inline-block;width:33.3%;height:36px;line-height:36px;margin:3px 0;vertical-align:middle;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px;color:#ff5722}.layui-laydate-range{width:546px}.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5fb878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#b5fff8}.laydate-selected:hover{background-color:#00f7de!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#ff5722}.laydate-day-mark::after{background-color:#5fb878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5fb878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} \ No newline at end of file diff --git a/public/static/assets/layui/css/modules/layer/default/icon-ext.png b/public/static/assets/layui/css/modules/layer/default/icon-ext.png new file mode 100644 index 0000000..bbbb669 Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/icon-ext.png differ diff --git a/public/static/assets/layui/css/modules/layer/default/icon.png b/public/static/assets/layui/css/modules/layer/default/icon.png new file mode 100644 index 0000000..3e17da8 Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/icon.png differ diff --git a/public/static/assets/layui/css/modules/layer/default/layer.css b/public/static/assets/layui/css/modules/layer/default/layer.css new file mode 100644 index 0000000..d5122e3 --- /dev/null +++ b/public/static/assets/layui/css/modules/layer/default/layer.css @@ -0,0 +1 @@ +html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch}.layui-layer{top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #b2b2b2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) #eee center center no-repeat}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #f0f0f0;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2e2d3c;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2d93ca}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1e9fff;background-color:#1e9fff;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8d8d8d;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #d3d4d3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476a7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #e9e7e7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#e9e7e7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#c9c5c5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92b8b1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;cursor:default;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/public/static/assets/layui/css/modules/layer/default/loading-0.gif b/public/static/assets/layui/css/modules/layer/default/loading-0.gif new file mode 100644 index 0000000..6f3c953 Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/loading-0.gif differ diff --git a/public/static/assets/layui/css/modules/layer/default/loading-1.gif b/public/static/assets/layui/css/modules/layer/default/loading-1.gif new file mode 100644 index 0000000..db3a483 Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/loading-1.gif differ diff --git a/public/static/assets/layui/css/modules/layer/default/loading-2.gif b/public/static/assets/layui/css/modules/layer/default/loading-2.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/public/static/assets/layui/css/modules/layer/default/loading-2.gif differ diff --git a/public/static/assets/layui/font/iconfont.eot b/public/static/assets/layui/font/iconfont.eot new file mode 100644 index 0000000..3164c9f Binary files /dev/null and b/public/static/assets/layui/font/iconfont.eot differ diff --git a/public/static/assets/layui/font/iconfont.svg b/public/static/assets/layui/font/iconfont.svg new file mode 100644 index 0000000..67e85a7 --- /dev/null +++ b/public/static/assets/layui/font/iconfont.svg @@ -0,0 +1,409 @@ + + + + Created by iconfont + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/static/assets/layui/font/iconfont.ttf b/public/static/assets/layui/font/iconfont.ttf new file mode 100644 index 0000000..8f49efb Binary files /dev/null and b/public/static/assets/layui/font/iconfont.ttf differ diff --git a/public/static/assets/layui/font/iconfont.woff b/public/static/assets/layui/font/iconfont.woff new file mode 100644 index 0000000..62d3491 Binary files /dev/null and b/public/static/assets/layui/font/iconfont.woff differ diff --git a/public/static/assets/layui/font/iconfont.woff2 b/public/static/assets/layui/font/iconfont.woff2 new file mode 100644 index 0000000..a3d8774 Binary files /dev/null and b/public/static/assets/layui/font/iconfont.woff2 differ diff --git a/public/static/assets/layui/layui.js b/public/static/assets/layui/layui.js new file mode 100644 index 0000000..c38be7b --- /dev/null +++ b/public/static/assets/layui/layui.js @@ -0,0 +1 @@ +/** v2.13.5 | MIT Licensed */;!function(h){"use strict";var e,d=h.document,v=h.location,m={timeout:10,debug:!1,version:!1},g={modules:{},status:{},event:{},callback:{}},r=function(){this.v="2.13.5"},t=h.LAYUI_GLOBAL||{},b=(e=d.currentScript&&"SCRIPT"===d.currentScript.tagName.toUpperCase()?d.currentScript.src:function(){for(var e,t=d.getElementsByTagName("script"),n=t.length-1,r=n;01e3*m.timeout/5?j(o+" is not a valid module","error"):void((i?layui[o]=h[a.api]:g.status[o])?u():setTimeout(t,5))}()},0===n.length||layui["layui.all"]&&w[o]?u():(p=i?a.src:a,y=(w[o]?y+"modules/":p?"":m.base)+(p=(p=p||o).replace(/\s/g,"").replace(/\.js[^/.]*$/,""))+".js",!g.modules[o]&&layui[o]&&(g.modules[o]=y),g.modules[o]?c():(l=d.getElementsByTagName("head")[0],(s=d.createElement("script"))["async"]=!0,s.charset="utf-8",s.src=y+((p=!0===m.version?m.v||(new Date).getTime():m.version||"")?"?v="+p:""),l.appendChild(s),E(s,function(){l.removeChild(s),c()},function(){l.removeChild(s)}),g.modules[o]=y))),f},r.prototype.modules=Object.assign({},w),r.prototype.extend=function(e){var t,n,r=m.base||"",o=/^\{\/\}/;for(t in e=e||{})this[t]||this.modules[t]?j("the "+t+" module already exists, extend failure"):("string"==typeof(n=e[t])&&(n=((r=o.test(n)?"":r)+n).replace(o,"")),this.modules[t]=n);return this},r.prototype.disuse=function(e){var n=this;return e=n.isArray(e)?e:[e],n.each(e,function(e,t){delete n[t],delete w[t],delete n.modules[t],delete g.status[t],delete g.modules[t]}),n},r.prototype.getStyle=function(e,t){e=e.currentStyle||h.getComputedStyle(e,null);return e.getPropertyValue?e.getPropertyValue(t):e.getAttribute(t.replace(/-(\w)/g,function(e,t){return t?t.toUpperCase():""}))},r.prototype.link=function(n,r,o){var a,i=this,e=d.getElementsByTagName("head")[0],t="function"==typeof r;if("string"==typeof r&&(o=r),"object"==typeof n)return a="array"===i.type(o),i.each(n,function(e,t){i.link(t,e===n.length-1&&r,a&&o[e])});o="layuicss-"+(o=o||n.replace(/^(#|(http(s?)):\/\/|\/\/)|\.|\/|\?.+/g,""));var u=d.getElementById(o);return u||((u=d.createElement("link")).href=n+(m.debug?"?v="+(new Date).getTime():""),u.rel="stylesheet",u.id=o,e.appendChild(u)),"complete"===u.__lay_readyState__?t&&r(u):E(u,function(){u.__lay_readyState__="complete",t&&r(u)},function(){j(n+" load error","error"),e.removeChild(u)}),i},r.prototype.addcss=function(e,t,n){return layui.link(m.dir+"css/"+e,t,n)},r.prototype.factory=function(e){if(layui[e])return"function"==typeof m.callback[e]?m.callback[e]:null},r.prototype.img=function(e,t,n){var r=new Image;if(r.src=e,r.complete)return t(r);r.onload=function(){r.onload=null,"function"==typeof t&&t(r)},r.onerror=function(e){r.onerror=null,"function"==typeof n&&n(e)}},r.prototype.router=r.prototype.hash=function(e){var n={path:[],pathname:[],search:{},hash:((e=e||v.hash).match(/[^#](#.*$)/)||[])[1]||"",href:""};return/^#/.test(e)&&(e=e.replace(/^#/,""),e=(n.href=e).replace(/([^#])(#.*$)/,"$1").split("/")||[],this.each(e,function(e,t){/^\w+=/.test(t)?(t=t.split("="),n.search[t[0]]=t[1]):n.path.push(t)}),n.pathname=n.path),n},r.prototype.url=function(e){var o,t,n=this;return{pathname:(e?((e.match(/\.[^.]+?\/.+/)||[])[0]||"").replace(/^[^/]+/,"").replace(/\?.+/,""):v.pathname).replace(/^\//,"").split("/"),search:(o={},t=(e?((e.match(/\?.+/)||[])[0]||"").replace(/#.+/,""):v.search).replace(/^\?+/,"").split("&"),n.each(t,function(e,t){var n=t.indexOf("="),r=n<0?t.substr(0,t.length):0!==n&&t.substr(0,n);r&&(o[r]=0(d.innerHeight||p.documentElement.clientHeight)},h.getStyleRules=function(e,n){if(e)return e=(e=e.sheet||e.styleSheet||{}).cssRules||e.rules,"function"==typeof n&&layui.each(e,function(e,t){if(n(t,e))return!0}),e},h.style=function(e){e=e||{};var t=h.elem("style"),n=e.text||"",r=e.target;if(n)return"styleSheet"in t?(t.setAttribute("type","text/css"),t.styleSheet.cssText=n):t.innerHTML=n,t.id="LAY-STYLE-"+(e.id||(n=h.style.index||0,h.style.index++,"DF-"+n)),r&&((e=h(r).find("#"+t.id))[0]&&e.remove(),h(r).append(t)),t},h.position=function(e,t,n){var r,i,o,c,a,u,s,l,f;t&&(n=n||{},e!==p&&e!==h("body")[0]||(n.clickType="right"),r="right"===n.clickType?{left:(r=n.e||d.event||{}).clientX,top:r.clientY,right:r.clientX,bottom:r.clientY}:e.getBoundingClientRect(),a=t.offsetWidth,u=t.offsetHeight,i=function(e){return p.body[e=e?"scrollLeft":"scrollTop"]|p.documentElement[e]},o=function(e){return p.documentElement[e?"clientWidth":"clientHeight"]},c="margin"in n?n.margin:5,f=r.left,"center"===n.align?f-=(a-e.offsetWidth)/2:"right"===n.align&&(f=f-a+e.offsetWidth),(f=f+a+c>o("width")?o("width")-a-c:f)o()&&(r.top>u+c&&r.top<=o()?a=r.top-u-2*c:n.allowBottomOut||(a=o()-u-2*c)<0&&(a=0)),(u=n.position)&&(t.style.position=u),s=n.offset?n.offset[0]:0,l=n.offset?n.offset[1]:0,t.style.left=f+("fixed"===u?0:i(1))+s+"px",t.style.top=a+("fixed"===u?0:i())+l+"px",h.hasScrollbar()||(f=t.getBoundingClientRect(),!n.SYSTEM_RELOAD&&f.bottom+c>o()&&(n.SYSTEM_RELOAD=!0,setTimeout(function(){h.position(e,t,n)},50))))},h.options=function(e,t){if(t="object"==typeof t?t:{attr:t},e===p)return{};var e=h(e),n=t.attr||"lay-options",e=e.attr(n);try{return new Function("return "+(e||"{}"))()}catch(r){return layui.hint().error(t.errorText||[n+'="'+e+'"',"\n parseerror: "+r].join("\n"),"error"),{}}},h.isTopElem=function(n){var e=[p,h("body")[0]],r=!1;return h.each(e,function(e,t){if(t===n)return r=!0}),r},h.clipboard={writeText:function(n){var r=String(n.text);function e(){var e=p.createElement("textarea");e.value=r,e.style.position="fixed",e.style.opacity="0",e.style.top="0px",e.style.left="0px",p.body.appendChild(e),e.select();try{p.execCommand("copy"),"function"==typeof n.done&&n.done()}catch(t){"function"==typeof n.error&&n.error(t)}finally{e.remove?e.remove():p.body.removeChild(e)}}navigator&&"clipboard"in navigator?navigator.clipboard.writeText(r).then(n.done,function(){e()}):e()}},h.passiveSupported=function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){return e=!0}});d.addEventListener("test",null,t),d.removeEventListener("test",null,t)}catch(n){}return e}(),h.touchEventsSupported=function(){return"ontouchstart"in d},h.touchSwipe=function(e,t){var n,r,i,o,c=t,a=h(e)[0],u=!("preventDefault"in c)||c.preventDefault;a&&h.touchEventsSupported()&&(n={pointerStart:{x:0,y:0},pointerEnd:{x:0,y:0},distanceX:0,distanceY:0,direction:"none",timeStart:null},t=function(e){1===e.touches.length&&(a.addEventListener("touchmove",r,!!h.passiveSupported&&{passive:!1}),a.addEventListener("touchend",i),a.addEventListener("touchcancel",i),n.timeStart=Date.now(),n.pointerStart.x=n.pointerEnd.x=e.touches[0].clientX,n.pointerStart.y=n.pointerEnd.y=e.touches[0].clientY,n.distanceX=n.distanceY=0,n.direction="none",c.onTouchStart)&&c.onTouchStart(e,n)},r=function(e){u&&e.preventDefault(),n.pointerEnd.x=e.touches[0].clientX,n.pointerEnd.y=e.touches[0].clientY,n.distanceX=n.pointerStart.x-n.pointerEnd.x,n.distanceY=n.pointerStart.y-n.pointerEnd.y,Math.abs(n.distanceX)>Math.abs(n.distanceY)?n.direction=0]|&(?=#?[a-zA-Z0-9]+)/g.test(e+="")?e.replace(/&(?=#?[a-zA-Z0-9]+;?)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,"""):e},h.unescape=function(e){return e===undefined||null===e?"":String(e).replace(/"/g,'"').replace(/'/g,"'").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&")},n=0,r=null,function(e){e=e||"id";var t=(new Date).getTime();return t===r?n++:(n=0,r=t),e+"-"+t+"-"+Math.floor(1e4*Math.random())+"-"+n});h.createSharedResizeObserver=function(r){var i,o,c;return"undefined"==typeof d.ResizeObserver?(d.console&&console.warn("ResizeObserver is not supported in this browser."),null):(i="lay-"+(r=r||"")+"-resizeobserver-key",o={},c=new ResizeObserver(function(e){for(var t=0;t]|&(?=#?[a-zA-Z0-9]+)/g;return e===undefined||null===e?"":r.test(e+="")?e.replace(r,function(e){return"&#"+e.charCodeAt(0)+";"}):e}},m=function(e,r){return new RegExp(e,r||"g")},g=function(e,r,t){r=r||{};var e="Laytpl "+((r=Object.assign({errorContext:""},r)).type||"")+"Error: "+e,n=r.errorContext;return delete r.errorContext,"object"==typeof console&&console.error(e,"\n",n,"\n",r),"function"==typeof t&&t(r),e},o={open:"{{",close:"}}",cache:!0,condense:!0,tagStyle:""},t=function(e,r){var t=this;r=t.config=Object.assign({template:e},o,r),t.vars=Object.assign({include:function(e,r){e=document.getElementById(e),e=e?e.innerHTML:"";return e?t.render(e,r):""}},n),t.compile(r.template)},r=(t.prototype.render=function(r,t){var n=this,o=n.config,c=r?n.compile(r):n.compilerCache||n.compile(o.template),e=function(){t=t||o.data||{};try{return c(t)}catch(e){return r=r||o.template,g(e,{errorContext:n.extractErrorContext(r,t),template:r,type:"Render"},o.error)}}();return o.cache&&!r&&(n.compilerCache=c),e},t.prototype.compile=function(e){var t=this,o=t.config,c=o.open,a=o.close,i=o.condense,u=m,l="\u2028";if("string"!=typeof e||!e)return function(){return""};var p=function(e,r){e=["(?:"+c+(e[0]||"")+"\\s*)","("+(e[1]||"[\\s\\S]")+"*?)","(?:\\s*"+(e[2]||"")+a+")"];return(r=r||{}).before&&e.unshift(r.before),r.after&&e.push(r.after),u(e.join(""))},r=i?["",""]:["(?:(?:\\n)*\\s*)","(?:\\s*?)"],f={before:r[0],after:r[1]},s=function(e,r){return e=(e=i?e:e.replace(u(l),r?"":"\n")).replace(/\\(\\|")/g,"$1")},n=t.parse=function(e){var n,r,t;return(e=e||"")&&(e=(e=(e=i?e.replace(/\t/g," ").replace(/\s+/g," "):e).replace(u("([}\\]])"+a),"$1 "+a).replace(/(?=\\|")/g,"\\").replace(/\r?\n/g,i?"":l)).replace(p(["!","","!"],f),function(e,r){return r=r.replace(u(c+"|"+a),function(e){return e.replace(/(?=.)/g,"\\")})}),n=function(e){return['";',e,'__laytpl__+="'].join("\n")},r=function(e,r,t){return t&&(r="-"===r?"":"_escape",t=s(t,!0))?n("__laytpl__+="+r+"("+t+");"):""},t=function(e,r){return r?(r=s(r),n(r)):""},e="modern"===o.tagStyle?(e=(e=e.replace(p(["#"],f),"")).replace(p(["(=|-)"]),r)).replace(p([],f),t):(e=e.replace(p(["#"],f),t)).replace(p(["(=|-)*"]),r),i||(e=e.replace(u(l),"\\n"))),e},r=t.createCompiler=function(e,r){return r=r||d(e),new Function("laytpl","return "+r)(t.vars)},d=t.createBuilder=function(e,r){return r=r||["function(d){",'"use strict";','var __laytpl__="",'+function(){var e,r=[];for(e in t.vars)r.push(("escape"===e?"_":"")+e+"=laytpl."+e);return r.join(",")}()+";",'__laytpl__="'+n(e)+'";',"return __laytpl__;","};"].join("\n")};try{return r(e)}catch(y){return delete t.compilerCache,function(){return g(y,{errorContext:t.extractErrorContext(e),template:e,type:"Compile"},o.error)}}},t.prototype.extractErrorContext=function(e,r){var t=1,o=e.split(/\r?\n/g),n=(e=e.replace(/(?=^)/gm,function(){return"/*LINE:"+t+++"*/"}),this.createBuilder(e)),c=n.split(/\r?\n/),a="laytpl.builder.map";try{n+="\n//# sourceURL="+a;var i=this.createCompiler(e,n);r&&i(r)}catch(l){var e=m(a.replace(/\./g,"\\.")+":(\\d+)","i"),n=(l.stack.match(e)||[])[1]||0,u=function(e,r){var r=r?/\/\*LINE:(\d+)\*\/[^*]*$/:/\/\*LINE:(\d+)\*\//;return!(r=(String(c[e-1]).match(r)||[])[1])&&0n.pages?n.curr=n.pages:n.curr<1&&(n.curr=1),l<0?l=1:l>n.pages&&(l=n.pages),n.prev="prev"in n?n.prev:p.$t("laypage.prev"),n.next="next"in n?n.next:p.$t("laypage.next"),n.pages>l?Math.ceil((n.curr+(1',n.prev,""].join(""):"",page:function(){var e=[];if(n.count<1)return"";1'+(n.first||1)+"");var a=Math.floor((l-1)/2),t=1n.pages?n.pages:a:l;for(i-t...
                ');t<=i;t++)t===n.curr?e.push('"+t+""):e.push(''+t+"");return n.pages>l&&n.pages>i&&!1!==n.last&&(i+1...
                '),0!==l)&&e.push(''+(n.last||n.pages)+""),e.join("")}(),next:n.next?['',n.next,""].join(""):"",count:''+("object"==typeof n.countText?n.countText[0]+n.count+n.countText[1]:p.$t("laypage.total",{total:n.count}))+"",limit:(i=['"),refresh:['','',""].join(""),skip:[''+(e="object"==typeof n.skipText?n.skipText:[p.$t("laypage.goto"),p.$t("laypage.page"),p.$t("laypage.confirm")])[0],'',e[1]+'",""].join("")};return['
                ',(t=[],layui.each(n.layout,function(e,a){u[a]&&t.push(u[a])}),t.join("")),"
                "].join("")},t.prototype.jump=function(e,a){if(e){var t=this,i=t.config,n=e.children,l=e[o]("button")[0],r=e[o]("input")[0],e=e[o]("select")[0],u=function(){var e=Number(r.value.replace(/\s|\D/g,""));e&&(i.curr=e,t.render())};if(a)return u();for(var p=0,s=n.length;pi.pages||(i.curr=e,t.render())});e&&c.on(e,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),l&&c.on(l,"click",function(){u()})}},t.prototype.skip=function(t){var i,e;t&&(i=this,e=t[o]("input")[0])&&c.on(e,"keyup",function(e){var a=this.value,e=e.keyCode;/^(37|38|39|40)$/.test(e)||(/\D/.test(a)&&(this.value=a.replace(/\D/,"")),13===e&&i.jump(t,!0))})},t.prototype.render=function(e){var a=this,t=a.config,i=a.type(),n=a.view(),i=(2===i?t.elem&&(t.elem.innerHTML=n):3===i?t.elem.html(n):l[r](t.elem)&&(l[r](t.elem).innerHTML=n),t.jump&&t.jump(t,e),l[r]("layui-laypage-"+a.index));a.jump(i),t.hash&&!e&&(location.hash="!"+t.hash+"="+t.curr),a.skip(i)},{render:function(e){return new t(e).index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(a,e,t){return a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1),this}});e("laypage",c)});layui.define(["lay","i18n"],function(e){"use strict";var M=layui.lay,a=layui.i18n,n="laydate",s="lay-"+n+"-id",r="zh-CN",o=["eu-ES","ja-JP","km-KH","ko-KR","pt-BR","si-LK","ms-MY","ug-CN","zh-CN","zh-HK","zh-TW"];function h(e){if("string"!=typeof e||e.length<=1)return e;for(var t="",a=0;a'+s.selectTime+"
                "),(l.range||"datetime"!==l.type||l.fullPanel)&&p.push(''),M.each(l.btns,function(e,t){var a=s.tools[t]||"btn";l.range&&"now"===t||(d&&"clear"===t&&(a=s.tools.reset),n.push(''+a+""))}),p.push('"),p.join(""))),l.shortcuts&&(m.appendChild(t),M(t).html((i=[],M.each(l.shortcuts,function(e,t){i.push('
              • '+t.text+"
              • ")}),i.join(""))).find("li").on("click",function(e){var t=l.shortcuts[this.dataset.index]||{},t=("function"==typeof t.value?t.value():t.value)||[],n=(layui.isArray(t)||(t=[t]),l.type),t=(M.each(t,function(e,t){var a=[l.dateTime,o.endDate][e];"time"===n&&"date"!==layui.type(t)?o.EXP_IF.test(t)&&(t=(t.match(o.EXP_SPLIT)||[]).slice(1),M.extend(a,{hours:0|t[0],minutes:0|t[2],seconds:0|t[4]})):M.extend(a,o.systemDate("date"===layui.type(t)?t:new Date(t))),"time"!==n&&"datetime"!==n||(o[["startTime","endTime"][e]]={hours:a.hours,minutes:a.minutes,seconds:a.seconds}),0===e?o.startDate=M.extend({},a):o.endState=!0,"year"===n||"month"===n||"time"===n?o.listYM[e]=[a.year,a.month+1]:e&&o.autoCalendarModel.auto&&o.autoCalendarModel()}),o.checkDate("limit").calendar(null,null,"init"),M(o.footer).find("."+S).removeClass(C));t&&"date"===t.attr("lay-type")&&t[0].click(),o.done(null,"change"),M(this).addClass(k),"static"!==l.position&&o.setValue(o.parse()).done().remove()})),M.each(u,function(e,t){m.appendChild(t)}),l.showBottom&&m.appendChild(e),M.elem("style")),f=[],g=!0,t=(M.each(l.theme,function(e,t){g&&/^#/.test(t)?(g=!(r=!0),f.push(["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} li.layui-this,#{{id}} td.layui-this>div{background-color:{{theme}} !important;}",-1!==l.theme.indexOf("circle")?"":"#{{id}} .layui-this{background-color:{{theme}} !important;}","#{{id}} .laydate-day-now{color:{{theme}} !important;}","#{{id}} .laydate-day-now:after{border-color:{{theme}} !important;}","#{{id}} .laydate-day-mark::after{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,o.elemID).replace(/{{theme}}/g,t))):!g&&/^#/.test(t)&&f.push(["#{{id}} .laydate-selected>div{background-color:{{theme}} !important;}","#{{id}} .laydate-selected:hover>div{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,o.elemID).replace(/{{theme}}/g,t))}),l.shortcuts&&l.range&&f.push("#{{id}}.layui-laydate-range{width: 628px;}".replace(/{{id}}/g,o.elemID)),f.length&&(f=f.join(""),"styleSheet"in p?(p.setAttribute("type","text/css"),p.styleSheet.cssText=f):p.innerHTML=f,r&&M(m).addClass("laydate-theme-molv"),m.appendChild(p)),o.remove(w.thisElemDate),D.thisId=l.id,d?l.elem.append(m):(document.body.appendChild(m),o.position()),l.shade?'
                ':"");m.insertAdjacentHTML("beforebegin",t),o.checkDate().calendar(null,0,"init"),o.changeEvent(),w.thisElemDate=o.elemID,o.renderAdditional(),"function"==typeof l.ready&&l.ready(M.extend({},l.dateTime,{month:l.dateTime.month+1})),o.preview()},w.prototype.remove=function(e){var t=this,a=t.config,n=M("#"+(e||t.elemID));return n[0]&&(n.hasClass(v)||t.checkDate(function(){n.remove(),delete t.startDate,delete t.endDate,delete t.endState,delete t.startTime,delete t.endTime,delete D.thisId,"function"==typeof a.close&&a.close(t)}),M("."+x).remove()),t},w.prototype.position=function(){var e=this.config;return M.position(e.elem[0],this.elem,{position:e.position}),this},w.prototype.hint=function(e){var t=this,a=M.elem("div",{"class":i});t.elem&&(a.innerHTML=(e="object"==typeof e?e||{}:{content:e}).content||"",M(t.elem).find("."+i).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){M(t.elem).find("."+i).remove()},"ms"in e?e.ms:3e3))},w.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),11p[1]&&(e.year=p[1],l=!0),11t)&&(e.date=t,l=!0)},c=function(n,i,r){var o=["startTime","endTime"];i=(i.match(s.EXP_SPLIT)||[]).slice(1),r=r||0,d.range&&(s[o[r]]=s[o[r]]||{}),M.each(s.format,function(e,t){var a=parseFloat(i[e]);i[e].lengths.getDateTime(d.max)?(o=d.dateTime=M.extend({},d.max),i=!0):s.getDateTime(o)s.getDateTime(d.max))&&(s.endDate=M.extend({},d.max),i=!0),s.startTime={hours:d.dateTime.hours,minutes:d.dateTime.minutes,seconds:d.dateTime.seconds},s.endTime={hours:s.endDate.hours,minutes:s.endDate.minutes,seconds:s.endDate.seconds},"month"===d.type)&&(d.dateTime.date=1,s.endDate.date=1),i&&u&&(s.setValue(s.parse()),s.hint("value "+r.invalidDatePrompt+r.autoResetPrompt)),s.startDate=s.startDate||u&&M.extend({},d.dateTime),s.autoCalendarModel.auto&&s.autoCalendarModel(),s.endState=!d.range||!s.rangeLinked||!(!s.startDate||!s.endDate),e&&e()),s},w.prototype.markRender=function(e,a,t){var n;"object"==typeof t?M.each(t||{},function(e,t){e=e.split("-");e[0]!=a[0]&&0!=e[0]||e[1]!=a[1]&&0!=e[1]||e[2]!=a[2]||(n=t||a[2])}):"string"==typeof t&&(n=t||a[2]),n&&e.find("div").html(''+n+"")},w.prototype.mark=function(t,a){var n=this,e=n.config,i=function(e){n.markRender(t,a,e)};return e.calendar&&e.lang===r&&i(n.markerOfChineseFestivals),"function"==typeof e.mark?e.mark({year:a[0],month:a[1],date:a[2]},i):"object"==typeof e.mark&&i(e.mark),n},w.prototype.holidaysRender=function(o,l,e){var s=["holidays","workdays"],d=function(e,t,a){e.find("div").html(["",a,"
                "].join(""))};"array"===layui.type(e)?M.each(e,function(r,e){M.each(e,function(e,t){var a,n,i;t=t,a=o.attr("lay-ymd"),n=t.split("-"),i=a.split("-"),M.each(n,function(e,t){n[e]=parseInt(t,10)}),M.each(i,function(e,t){i[e]=parseInt(t,10)}),n.join("-")===i.join("-")&&d(o,s[r],l[2])})}):"string"==typeof e&&-1!==s.indexOf(e)&&d(o,e,l[2])},w.prototype.holidays=function(t,a){var n=this,e=n.config,i=function(e){n.holidaysRender(t,a,e)};return"function"==typeof e.holidays?e.holidays({year:a[0],month:a[1],date:a[2]},i):"array"===layui.type(e.holidays)&&i(e.holidays),n},w.prototype.cellRender=function(t,e,a){var n=this.config;return"function"==typeof n.cellRender&&n.cellRender(e,function(e){"string"==typeof e?M(t).html(e):"object"==typeof e&&M(t).html("").append(M(e)[0])},{originElem:t,type:a}),this},w.prototype.startOfYear=function(e){e=new Date(e);return e.setFullYear(e.getFullYear(),0,1),e.setHours(0,0,0,0),e},w.prototype.endOfYear=function(e){var e=new Date(e),t=e.getFullYear();return e.setFullYear(t+1,0,0),e.setHours(23,59,59,999),e},w.prototype.startOfMonth=function(e){e=new Date(e);return e.setDate(1),e.setHours(0,0,0,0),e},w.prototype.endOfMonth=function(e){var e=new Date(e),t=e.getMonth();return e.setFullYear(e.getFullYear(),t+1,0),e.setHours(23,59,59,999),e},w.prototype.addDays=function(e,t){e=new Date(e);return t&&e.setDate(e.getDate()+t),e},w.prototype.isDisabledYearOrMonth=function(e,t,a){for(var n=this,i=n.config,r="year"===t?n.startOfYear(e):n.startOfMonth(e),t="year"===t?n.endOfYear(e):n.endOfMonth(e),o=Math.floor((t.getTime()-r.getTime())/864e5)+1,l=0,s=0;s(t.time?0:41)?i.endDate:e.dateTime;return M.each({now:M.extend({},a,t.date||{}),min:e.min,max:e.max},function(e,a){var n;r[e]=i.newDate(M.extend({year:a.year,month:"year"===t.type?0:a.month,date:"year"===t.type||"month"===t.type?1:a.date},(n={},M.each(t.time,function(e,t){n[t]=a[t]}),n))).getTime()}),a=r.nowp[1]&&(d.year=p[1],s.hint(m.invalidDatePrompt)),s.firstDate||(s.firstDate=M.extend({},d)),n.setFullYear(d.year,d.month,1),r=(n.getDay()+(7-a.weekStart))%7,o=D.getEndDate(d.month||12,d.year),l=D.getEndDate(d.month+1,d.year),M.each(y,function(e,t){var a,n=[d.year,d.month];(t=M(t)).removeAttr("class"),e"+n[2]+"
                "),s.mark(t,n).holidays(t,n).limit({elem:t,date:{year:n[0],month:n[1]-1,date:n[2]},index:e,rangeType:i,disabledType:"date"}),s.cellRender(t,{year:n[0],month:n[1],date:n[2]},"date")}),M(c[0]).attr("lay-ym",d.year+"-"+(d.month+1)),M(c[1]).attr("lay-ym",d.year+"-"+(d.month+1)),s.panelYM||(s.panelYM={}),s.panelYM[i]={year:d.year,month:d.month},h(d.year+m.literal.year)),y=h(m.months[d.month]);return m.monthBeforeYear?(M(c[0]).attr("lay-type","month").html(y),M(c[1]).attr("lay-type","year").html(n)):(M(c[0]).attr("lay-type","year").html(n),M(c[1]).attr("lay-type","month").html(y)),u&&(a.range?!e&&"init"===t||(s.listYM=[[(s.startDate||a.dateTime).year,(s.startDate||a.dateTime).month+1],[s.endDate.year,s.endDate.month+1]],s.list(a.type,0).list(a.type,1),"time"===a.type?s.setBtnStatus(!0,M.extend({},s.systemDate(),s.startTime),M.extend({},s.systemDate(),s.endTime)):s.setBtnStatus(!0)):(s.listYM=[[d.year,d.month+1]],s.list(a.type,0))),a.range&&"init"===t&&(s.rangeLinked?(m=s.getAsYM(d.year,d.month,i?"sub":null),s.calendar(M.extend({},d,{year:m[0],month:m[1]}),1-i)):s.calendar(null,1-i)),a.range||(n=["hours","minutes","seconds"],s.limit({elem:M(s.footer).find(".laydate-btns-now"),date:s.systemDate(/^(datetime|time)$/.test(a.type)?new Date:null),index:0,time:n,disabledType:"datetime"}),s.limit({elem:M(s.footer).find(I),index:0,time:n,disabledType:"datetime"})),s.setBtnStatus(),M(s.shortcut).find("li."+k).removeClass(k),a.range&&!u&&"init"!==t&&s.stampRange(),s},w.prototype.list=function(n,i){var r,o,e,a,l,s,d=this,m=d.config,u=d.rangeLinked?m.dateTime:[m.dateTime,d.endDate][i],y=d.i18nMessages,c=m.range&&"date"!==m.type&&"datetime"!==m.type,h=M.elem("ul",{"class":b+" "+{year:"laydate-year-list",month:"laydate-month-list",time:"laydate-time-list"}[n]}),t=d.elemHeader[i],p=M(t[2]).find("span"),f=d.elemCont[i||0],g=M(f).find("."+b)[0],D=y.monthBeforeYear,v=y.literal.year,T=d.listYM[i]||{},x=["hours","minutes","seconds"],w=["startTime","endTime"][i];return T[0]<1&&(T[0]=1),"year"===n?(e=r=T[0]-7,r<1&&(e=r=1),M.each(new Array(15),function(e){var t=M.elem("li",{"lay-ym":r}),a={year:r,month:0,date:1};r==T[0]&&M(t).addClass(k),t.innerHTML=r+v,h.appendChild(t),d.limit({elem:M(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),d.cellRender(t,{year:r,month:1,date:1},"year"),r++}),M(p[D?1:0]).attr("lay-ym",r-8+"-"+T[1]).html(e+v+" - "+(r-1+v))):"month"===n?(M.each(new Array(12),function(e){var t=M.elem("li",{"lay-ym":e}),a={year:T[0],month:e,date:1};e+1==T[1]&&M(t).addClass(k),t.innerHTML=y.months[e],h.appendChild(t),d.limit({elem:M(t),date:a,index:i,type:n,rangeType:i,disabledType:"date"}),d.cellRender(t,{year:T[0],month:e+1,date:1},"month")}),M(p[D?1:0]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+v)):"time"===n&&(o=function(){M(h).find("ol").each(function(a,e){M(e).find("li").each(function(e,t){d.limit({elem:M(t),date:[{hours:e},{hours:d[w].hours,minutes:e},{hours:d[w].hours,minutes:d[w].minutes,seconds:e}][a],index:i,rangeType:i,disabledType:"time",time:[["hours"],["hours","minutes"],["hours","minutes","seconds"]][a]})})}),m.range||d.limit({elem:M(d.footer).find(I),date:d[w],index:0,time:["hours","minutes","seconds"],disabledType:"datetime"})},m.range?d[w]||(d[w]="startTime"===w?u:d.endDate):d[w]=u,M.each([24,60,60],function(t,e){var a=M.elem("li"),n=["

                "+y.time[t]+"

                  "];M.each(new Array(e),function(e){n.push(""+M.digit(e,2)+"")}),a.innerHTML=n.join("")+"
                ",h.appendChild(a)}),o(),e=-1!==m.format.indexOf("H"),D=-1!==m.format.indexOf("m"),p=-1!==m.format.indexOf("s"),a=h.children,l=0,M.each([e,D,p],function(e,t){t||(a[e].className+=" layui-hide",l++)}),h.className+=" laydate-time-list-hide-"+l),g&&f.removeChild(g),f.appendChild(h),"year"===n||"month"===n?(M(d.elemMain[i]).addClass("laydate-ym-show"),M(h).find("li").on("click",function(){var e,t,a=0|M(this).attr("lay-ym");M(this).hasClass(C)||(d.rangeLinked?M.extend(u,{year:"year"===n?a:T[0],month:"year"===n?T[1]-1:a}):u[n]=a,e=-1!==["year","month"].indexOf(m.type),t="year"===n&&-1!==["date","datetime"].indexOf(m.type),e||t?(M(h).find("."+k).removeClass(k),M(this).addClass(k),("month"===m.type&&"year"===n||t)&&(d.listYM[i][0]=a,c&&((i?d.endDate:u).year=a),d.list("month",i))):(d.checkDate("limit").calendar(u,i,"init"),d.closeList()),m.range||d.limit({type:n,elem:M(d.footer).find(I),date:u,disabledType:"datetime"}),d.setBtnStatus(),!m.range&&m.autoConfirm&&("month"===m.type&&"month"===n||"year"===m.type&&"year"===n)&&d.setValue(d.parse()).done().remove(),d.autoCalendarModel.auto&&!d.rangeLinked?d.choose(M(f).find("td.layui-this"),i):d.endState&&d.done(null,"change"),M(d.footer).find("."+S).removeClass(C))})):(D=M.elem("span",{"class":E}),s=function(){M(h).find("ol").each(function(e){var a=this,t=M(a).find("li");a.scrollTop=30*(d[w][x[e]]-2),a.scrollTop<=0&&t.each(function(e,t){if(!M(this).hasClass(C))return a.scrollTop=30*(e-2),!0})})},p=M(t[2]).find("."+E),s(),D.innerHTML=m.range?[y.startTime,y.endTime][i]:y.selectTime,M(d.elemMain[i]).addClass("laydate-time-show"),p[0]&&p.remove(),t[2].appendChild(D),(g=M(h).find("ol")).each(function(t){var a=this;M(a).find("li").on("click",function(){var e=0|this.innerHTML;M(this).hasClass(C)||(m.range?d[w][x[t]]=e:u[x[t]]=e,M(a).find("."+k).removeClass(k),M(this).addClass(k),o(),s(),!d.endDate&&"time"!==m.type&&"datetime"!==m.type||d.done(null,"change"),d.setBtnStatus())})}),layui.device().mobile&&g.css({overflowY:"auto",touchAction:"pan-y"})),d},w.prototype.listYM=[],w.prototype.closeList=function(){var a=this;M.each(a.elemCont,function(e,t){M(this).find("."+b).remove(),M(a.elemMain[e]).removeClass("laydate-ym-show laydate-time-show")}),M(a.elem).find("."+E).remove()},w.prototype.setBtnStatus=function(e,t,a){var n=this,i=n.config,r=n.i18nMessages,o=M(n.footer).find(I),l="datetime"===i.type||"time"===i.type?["hours","minutes","seconds"]:undefined;i.range&&(t=t||(n.rangeLinked?n.startDate:i.dateTime),a=a||n.endDate,i=!n.endState||n.newDate(t).getTime()>n.newDate(a).getTime(),n.limit({date:t,disabledType:"datetime",time:l,rangeType:0})||n.limit({date:a,disabledType:"datetime",time:l,rangeType:1})?o.addClass(C):o[i?"addClass":"removeClass"](C),e)&&i&&n.hint(r.rangeOrderPrompt)},w.prototype.parse=function(e,t){var a=this,n=a.config,i=a.rangeLinked?a.startDate:n.dateTime,t=t||("end"==e?M.extend({},a.endDate,a.endTime):n.range?M.extend({},i||n.dateTime,a.startTime):n.dateTime),i=D.parse(t,a.format,1);return n.range&&e===undefined?i+" "+a.rangeStr+" "+a.parse("end"):i},w.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},w.prototype.getDateTime=function(e){return this.newDate(e).getTime()},w.prototype.formatToDisplay=function(e,t){var a=this,n=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value");Object.defineProperty(e,"value",M.extend({},n,{get:function(){return this.getAttribute("lay-date")},set:function(e){n.set.call(this,t.call(a,e)),this.setAttribute("lay-date",e)}}))},w.prototype.setValue=function(e){var t,a=this,n=a.config,i=n.elem[0];return"static"!==n.position&&(e=e||"",a.isInput(i)?M(i).val(e):(t=a.rangeElem)?("array"!==layui.type(e)&&(e=e.split(" "+a.rangeStr+" ")),t[0].val(e[0]||""),t[1].val(e[1]||"")):(0===M(i).find("*").length&&(t="function"==typeof n.formatToDisplay?n.formatToDisplay(e):e,M(i).html(t)),M(i).attr("lay-date",e))),a},w.prototype.preview=function(){var e,t=this,a=t.config;a.isPreview&&(e=M(t.elem).find("."+T),t=!a.range||(t.rangeLinked?t.endState:t.endDate)?t.parse():"",e.html(t),e.html())&&(t="array"===layui.type(a.theme)?a.theme[0]:a.theme,e.css({color:/^#/.test(String(t))?t:"#16b777"}),setTimeout(function(){e.css({color:"#777"})},300))},w.prototype.renderAdditional=function(){this.config.fullPanel&&this.list("time",0)},w.prototype.stampRange=function(){var n,i=this,r=i.config,o=i.rangeLinked?i.startDate:r.dateTime,e=M(i.elem).find("td");r.range&&!i.endState&&M(i.footer).find(I).addClass(C),o=o&&i.newDate({year:o.year,month:o.month,date:o.date}).getTime(),n=i.endState&&i.endDate&&i.newDate({year:i.endDate.year,month:i.endDate.month,date:i.endDate.date}).getTime(),M.each(e,function(e,t){var a=M(t).attr("lay-ymd").split("-"),a=i.newDate({year:a[0],month:a[1]-1,date:a[2]}).getTime();r.rangeLinked&&!i.startDate&&a===i.newDate(i.systemDate()).getTime()&&M(t).addClass(M(t).hasClass(y)||M(t).hasClass(c)?"":"laydate-day-now"),M(t).removeClass(u+" "+k),a!==o&&a!==n||(i.rangeLinked||!i.rangeLinked&&(e<42?a===o:a===n))&&M(t).addClass(M(t).hasClass(y)||M(t).hasClass(c)?u:k),on.getDateTime(i.max)&&(n[t]={hours:i.max.hours,minutes:i.max.minutes,seconds:i.max.seconds},M.extend(r,n[t])))}),a||(n.startDate=M.extend({},r)),n.endState&&!n.limit({date:n.rangeLinked?n.startDate:n.thisDateTime(1-a),disabledType:"date"})&&(((o=n.endState&&n.autoCalendarModel.auto?n.autoCalendarModel():o)||n.rangeLinked&&n.endState)&&n.newDate(n.startDate)>n.newDate(n.endDate)&&(n.startDate.year===n.endDate.year&&n.startDate.month===n.endDate.month&&n.startDate.date===n.endDate.date&&(l=n.startTime,n.startTime=n.endTime,n.endTime=l),l=n.startDate,n.startDate=M.extend({},n.endDate,n.startTime),i.dateTime=M.extend({},n.startDate),n.endDate=M.extend({},l,n.endTime)),o)&&(i.dateTime=M.extend({},n.startDate)),n.rangeLinked?(e=n.checkPanelDate(r,t),l=M.extend({},r),s=o||e&&e.needFullRender?"init":null,e=e?e.index:t,n.calendar(l,e,s)):n.calendar(null,a,o?"init":null),n.endState&&n.done(null,"change")):"static"===i.position?n.calendar().done().done(null,"change"):"date"===i.type?i.autoConfirm?n.setValue(n.parse()).done().remove():n.calendar().done(null,"change"):"datetime"===i.type&&n.calendar().done(null,"change"))},w.prototype.tool=function(t,e){var a=this,n=a.config,i=a.i18nMessages,r=n.dateTime,o="static"===n.position,l={datetime:function(){M(t).hasClass(C)||(a.list("time",0),n.range&&a.list("time",1),M(t).attr("lay-type","date").html(a.i18nMessages.selectDate))},date:function(){a.closeList(),M(t).attr("lay-type","datetime").html(a.i18nMessages.selectTime)},clear:function(){o&&(M.extend(r,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue(""),a.done(null,"onClear").done(["",{},{}]).remove()},now:function(){var e=new Date;if(M(t).hasClass(C))return a.hint(i.tools.now+", "+i.invalidDatePrompt);M.extend(r,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()),o&&a.calendar(),a.done(null,"onNow").done().remove()},confirm:function(){var e;if(n.range){if(M(t).hasClass(C))return e="time"===n.type?a.startTime&&a.endTime&&a.newDate(a.startTime)>a.newDate(a.endTime):a.startDate&&a.endDate&&a.newDate(M.extend({},a.startDate,a.startTime||{}))>a.newDate(M.extend({},a.endDate,a.endTime||{})),a.hint(e?i.rangeOrderPrompt:i.invalidDatePrompt)}else if(M(t).hasClass(C))return a.hint(i.invalidDatePrompt);a.setValue(a.parse()),a.done(null,"onConfirm").done().remove()}};l[e]&&l[e]()},w.prototype.change=function(n){var i=this,r=i.config,o=i.thisDateTime(n),l=r.range&&("year"===r.type||"month"===r.type),s=i.elemCont[n||0],d=i.listYM[n],e=function(e){var t=M(s).find(".laydate-year-list")[0],a=M(s).find(".laydate-month-list")[0];return t&&(d[0]=e?d[0]-15:d[0]+15,i.list("year",n)),a&&(e?d[0]--:d[0]++,i.list("month",n)),(t||a)&&(M.extend(o,{year:d[0]}),l&&(o.year=d[0]),r.range||i.done(null,"change"),r.range||i.limit({elem:M(i.footer).find(I),date:{year:d[0],month:t?0:d[1]-1},disabledType:"datetime"})),i.setBtnStatus(),t||a};return{prevYear:function(){e("sub")||(i.rangeLinked?(r.dateTime.year--,i.checkDate("limit").calendar(null,null,"init")):(o.year--,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(M(s).find("td.layui-this"),n):i.done(null,"change")))},prevMonth:function(){var e,t;i.rangeLinked?(e=i.panelYM[0],e=i.getAsYM(e.year,e.month,"sub"),t=M.extend({},r.dateTime,i.panelYM[0],{year:e[0],month:e[1]}),i.checkDate("limit").calendar(t,null,"init")):(e=i.getAsYM(o.year,o.month,"sub"),M.extend(o,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(M(s).find("td.layui-this"),n):i.done(null,"change"))},nextMonth:function(){var e,t;i.rangeLinked?(e=i.panelYM[0],e=i.getAsYM(e.year,e.month),t=M.extend({},r.dateTime,i.panelYM[0],{year:e[0],month:e[1]}),i.checkDate("limit").calendar(t,null,"init")):(e=i.getAsYM(o.year,o.month),M.extend(o,{year:e[0],month:e[1]}),i.checkDate("limit").calendar(null,null,"init"),i.autoCalendarModel.auto?i.choose(M(s).find("td.layui-this"),n):i.done(null,"change"))},nextYear:function(){e()||(i.rangeLinked?(r.dateTime.year++,i.checkDate("limit").calendar(null,0,"init")):(o.year++,i.checkDate("limit").calendar(null,n),i.autoCalendarModel.auto?i.choose(M(s).find("td.layui-this"),n):i.done(null,"change")))}}},w.prototype.changeEvent=function(){var i=this;M(i.elem).on("click",function(e){M.stope(e)}).on("mousedown",function(e){M.stope(e)}),M.each(i.elemHeader,function(n,e){M(e[0]).on("click",function(e){i.change(n).prevYear()}),M(e[1]).on("click",function(e){i.change(n).prevMonth()}),M(e[2]).find("span").on("click",function(e){var t=M(this),a=t.attr("lay-ym"),t=t.attr("lay-type");a&&(a=a.split("-"),i.listYM[n]=[0|a[0],0|a[1]],i.list(t,n),M(i.footer).find("."+S).addClass(C))}),M(e[3]).on("click",function(e){i.change(n).nextMonth()}),M(e[4]).on("click",function(e){i.change(n).nextYear()})}),M.each(i.table,function(e,t){M(t).find("td").on("click",function(){i.choose(M(this),e)})}),M(i.footer).find("span").on("click",function(){var e=M(this).attr("lay-type");i.tool(this,e)})},w.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())||/INPUT|TEXTAREA/.test(e.tagName)},w.prototype.events=function(){var e,t=this,a=t.config;a.elem[0]&&!a.elem[0].eventHandler&&(a.elem.on(a.trigger,e=function(){D.thisId!==a.id&&t.render()}),a.elem[0].eventHandler=!0,a.eventElem.on(a.trigger,e),t.unbind=function(){t.remove(),a.elem.off(a.trigger,e),a.elem.removeAttr("lay-key"),a.elem.removeAttr(s),a.elem[0].eventHandler=!1,a.eventElem.off(a.trigger,e),a.eventElem.removeAttr("lay-key"),delete m.that[a.id]})},M(document).on("mousedown",function(e){var t,a;D.thisId&&(t=m.getThis(D.thisId))&&(a=t.config,e.target===a.elem[0]||e.target===a.eventElem[0]||e.target===M(a.closeStop)[0]||a.elem[0]&&a.elem[0].contains(e.target)||t.remove())}).on("keydown",function(e){var t;D.thisId&&(t=m.getThis(D.thisId))&&"static"!==t.config.position&&13===e.keyCode&&M("#"+t.elemID)[0]&&t.elemID===w.thisElemDate&&(e.preventDefault(),M(t.footer).find(I)[0].click())}),M(window).on("resize",function(){if(D.thisId){var e=m.getThis(D.thisId);if(e)return!(!e.elem||!M(".layui-laydate")[0])&&void e.position()}}),m.that={},m.getThis=function(e){var t=m.that[e];return t||layui.hint().error(e?n+" instance with ID '"+e+"' not found":"ID argument required"),t},D.render=function(e){e=new w(e);return m.call(e)},D.reload=function(e,t){e=m.getThis(e);if(e)return e.reload(t)},D.getInst=function(e){e=m.getThis(e);if(e)return e.inst},D.hint=function(e,t){e=m.getThis(e);if(e)return e.hint(t)},D.unbind=function(e){e=m.getThis(e);if(e)return e.unbind()},D.close=function(e){e=m.getThis(e||D.thisId);if(e)return e.remove()},D.parse=function(a,n,i){return a=a||{},n=((n="string"==typeof n?m.formatArr(n):n)||[]).concat(),M.each(n,function(e,t){/yyyy|y/.test(t)?n[e]=M.digit(a.year,t.length):/MM|M/.test(t)?n[e]=M.digit(a.month+(i||0),t.length):/dd|d/.test(t)?n[e]=M.digit(a.date,t.length):/HH|H/.test(t)?n[e]=M.digit(a.hours,t.length):/mm|m/.test(t)?n[e]=M.digit(a.minutes,t.length):/ss|s/.test(t)&&(n[e]=M.digit(a.seconds,t.length))}),n.join("")},D.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},e(n,D)});!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e):function(e){if(e.document)return t(e);throw new Error("jQuery requires a window with a document")}:t(e)}("undefined"!=typeof window?window:this,function(T,M){"use strict";var t=[],R=Object.getPrototypeOf,a=t.slice,I=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},W=t.push,b=t.indexOf,F={},$=F.toString,B=F.hasOwnProperty,_=B.toString,z=_.call(Object),g={},v=function v(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},X=function X(e){return null!=e&&e===e.window},C=T.document,U={type:!0,src:!0,nonce:!0,noModule:!0};function V(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in U)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function G(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?F[$.call(e)]||"object":typeof e}var e="3.7.1",Y=/HTML$/i,S=function(e,t){return new S.fn.init(e,t)};function J(e){var t=!!e&&"length"in e&&e.length,n=G(e);return!v(e)&&!X(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+n+")"+n+"*"),xe=new RegExp(n+"|>"),be=new RegExp(s),we=new RegExp("^"+e+"$"),Te={ID:new RegExp("^#("+e+")"),CLASS:new RegExp("^\\.("+e+")"),TAG:new RegExp("^("+e+"|[*])"),ATTR:new RegExp("^"+o),PSEUDO:new RegExp("^"+s),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+n+"*(even|odd|(([+-]|)(\\d*)n|)"+n+"*(?:([+-]|)"+n+"*(\\d+)|))"+n+"*\\)|)","i"),bool:new RegExp("^(?:"+ge+")$","i"),needsContext:new RegExp("^"+n+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+n+"*((?:-\\d)?\\d*)"+n+"*\\)|)(?=[^-]|$)","i")},Ce=/^(?:input|select|textarea|button)$/i,Se=/^h\d$/i,Ee=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ke=/[+~]/,f=new RegExp("\\\\[\\da-fA-F]{1,6}"+n+"?|\\\\([^\\r\\n\\f])","g"),d=function(e,t){e="0x"+e.slice(1)-65536;return t||(e<0?String.fromCharCode(65536+e):String.fromCharCode(e>>10|55296,1023&e|56320))},je=function(){Oe()},Ae=Ie(function(e){return!0===e.disabled&&x(e,"fieldset")},{dir:"parentNode",next:"legend"});try{j.apply(t=a.call(i.childNodes),i.childNodes),t[i.childNodes.length].nodeType}catch(sr){j={apply:function(e,t){ue.apply(e,a.call(t))},call:function(e){ue.apply(e,a.call(arguments,1))}}}function N(e,t,n,r){var i,o,s,a,u,l,c=t&&t.ownerDocument,f=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==f&&9!==f&&11!==f)return n;if(!r&&(Oe(t),t=t||E,k)){if(11!==f&&(a=Ee.exec(e)))if(i=a[1]){if(9===f){if(!(l=t.getElementById(i)))return n;if(l.id===i)return j.call(n,l),n}else if(c&&(l=c.getElementById(i))&&N.contains(t,l)&&l.id===i)return j.call(n,l),n}else{if(a[2])return j.apply(n,t.getElementsByTagName(e)),n;if((i=a[3])&&t.getElementsByClassName)return j.apply(n,t.getElementsByClassName(i)),n}if(!(pe[e+" "]||p&&p.test(e))){if(l=e,c=t,1===f&&(xe.test(e)||ve.test(e))){for((c=ke.test(e)&&He(t.parentNode)||t)==t&&g.scope||((s=t.getAttribute("id"))?s=S.escapeSelector(s):t.setAttribute("id",s=A)),o=(u=Me(e)).length;o--;)u[o]=(s?"#"+s:":scope")+" "+Re(u[o]);l=u.join(",")}try{return j.apply(n,c.querySelectorAll(l)),n}catch(d){pe(e,!0)}finally{s===A&&t.removeAttribute("id")}}}return _e(e.replace(ee,"$1"),t,n,r)}function De(){var n=[];function r(e,t){return n.push(e+" ")>w.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function u(e){return e[A]=!0,e}function Ne(e){var t=E.createElement("fieldset");try{return!!e(t)}catch(sr){return!1}finally{t.parentNode&&t.parentNode.removeChild(t)}}function qe(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function Le(s){return u(function(o){return o=+o,u(function(e,t){for(var n,r=s([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function He(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function Oe(e){var e=e?e.ownerDocument||e:i;return e!=E&&9===e.nodeType&&e.documentElement&&(r=(E=e).documentElement,k=!S.isXMLDoc(E),ae=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&i!=E&&(e=E.defaultView)&&e.top!==e&&e.addEventListener("unload",je),g.getById=Ne(function(e){return r.appendChild(e).id=S.expando,!E.getElementsByName||!E.getElementsByName(S.expando).length}),g.disconnectedMatch=Ne(function(e){return ae.call(e,"*")}),g.scope=Ne(function(){return E.querySelectorAll(":scope")}),g.cssHas=Ne(function(){try{E.querySelector(":has(*,:jqfake)")}catch(sr){return 1}}),g.getById?(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){return e.getAttribute("id")===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k)return(e=t.getElementById(e))?[e]:[]}):(w.filter.ID=function(e){var t=e.replace(f,d);return function(e){e="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return e&&e.value===t}},w.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&k){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),w.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},w.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&k)return t.getElementsByClassName(e)},p=[],Ne(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+n+"*(?:value|"+ge+")"),e.querySelectorAll("[id~="+A+"-]").length||p.push("~="),e.querySelectorAll("a#"+A+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=E.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=E.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+n+"*name"+n+"*="+n+"*(?:''|\"\")")}),g.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),he=function(e,t){var n;return e===t?(se=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!g.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument==i&&N.contains(i,e)?-1:t===E||t.ownerDocument==i&&N.contains(i,t)?1:oe?b.call(oe,e)-b.call(oe,t):0:4&n?-1:1)}),E}for(re in N.matches=function(e,t){return N(e,null,null,t)},N.matchesSelector=function(e,t){if(Oe(e),k&&!pe[t+" "]&&(!p||!p.test(t)))try{var n=ae.call(e,t);if(n||g.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(sr){pe(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(f,d),e[3]=(e[3]||e[4]||e[5]||"").replace(f,d),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||N.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&N.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Te.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&be.test(n)&&(t=(t=Me(n,!0))&&n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(f,d).toLowerCase();return"*"===e?function(){return!0}:function(e){return x(e,t)}},CLASS:function(e){var t=ce[e+" "];return t||(t=new RegExp("(^|"+n+")"+e+"("+n+"|$)"))&&ce(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(e){e=N.attr(e,t);return null==e?"!="===n:!n||(e+="","="===n?e===r:"!="===n?e!==r:"^="===n?r&&0===e.indexOf(r):"*="===n?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function Ge(e,n,r){return v(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/,Ke=((S.fn.init=function(e,t,n){if(e){if(n=n||Ye,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):v(e)?n.ready!==undefined?n.ready(e):e(S):S.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Je.exec(e))||!r[1]&&t)return(!t||t.jquery?t||n:this.constructor(t)).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),Ve.test(r[1])&&S.isPlainObject(t))for(var r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r])}else(n=C.getElementById(r[2]))&&(this[0]=n,this.length=1)}return this}).prototype=S.fn,Ye=S(C),/^(?:parents|prev(?:Until|All))/),Qe={children:!0,contents:!0,next:!0,prev:!0};function Ze(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Et=/^$|^module$|\/(?:java|ecma)script/i,h=(o=C.createDocumentFragment().appendChild(C.createElement("div")),(s=C.createElement("input")).setAttribute("type","radio"),s.setAttribute("checked","checked"),s.setAttribute("name","t"),o.appendChild(s),g.checkClone=o.cloneNode(!0).cloneNode(!0).lastChild.checked,o.innerHTML="",g.noCloneChecked=!!o.cloneNode(!0).lastChild.defaultValue,o.innerHTML="",g.option=!!o.lastChild,{thead:[1,"","
                "],col:[2,"","
                "],tr:[2,"","
                "],td:[3,"","
                "],_default:[0,"",""]});function y(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x(e,t)?S.merge([e],n):n}function kt(e,t){for(var n=0,r=e.length;n",""]);var jt=/<|&#?\w+;/;function At(e,t,n,r,i){for(var o,s,a,u,l,c=t.createDocumentFragment(),f=[],d=0,p=e.length;d\s*$/g;function Rt(e,t){return x(e,"table")&&x(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function It(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Wt(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ft(e,t){var n,r,i,o;if(1===t.nodeType){if(m.hasData(e)&&(o=m.get(e).events))for(i in m.remove(t,"handle events"),o)for(n=0,r=o[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}}),[]),ir=/(=)\?(?=&|$)|\?\?/,or=(S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=rr.pop()||S.expando+"_"+Hn.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,s=!1!==e.jsonp&&(ir.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&ir.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(ir,"$1"+r):!1!==e.jsonp&&(e.url+=(On.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){i===undefined?S(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,rr.push(r)),o&&v(i)&&i(o[0]),o=i=undefined}),"script"}),g.createHTMLDocument=((e=C.implementation.createHTMLDocument("").body).innerHTML="
                ",2===e.childNodes.length),S.parseHTML=function(e,t,n){var r;return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(g.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),r=!n&&[],(n=Ve.exec(e))?[t.createElement(n[1])]:(n=At([e],t,r),r&&r.length&&S(r).remove(),S.merge([],n.childNodes)))},S.fn.load=function(e,t,n){var r,i,o,s=this,a=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){s.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,s,a=S.css(e,"position"),u=S(e),l={};"static"===a&&(e.style.position="relative"),o=u.offset(),r=S.css(e,"top"),s=S.css(e,"left"),a=("absolute"===a||"fixed"===a)&&-1<(r+s).indexOf("auto")?(i=(a=u.position()).top,a.left):(i=parseFloat(r)||0,parseFloat(s)||0),null!=(t=v(t)?t.call(e,n,S.extend({},o)):t).top&&(l.top=t.top-o.top+i),null!=t.left&&(l.left=t.left-o.left+a),"using"in t?t.using.call(e,l):u.css(l)}},S.fn.extend({offset:function(t){var e,n;return arguments.length?t===undefined?this:this.each(function(e){S.offset.setOffset(this,t,e)}):(n=this[0])?n.getClientRects().length?(e=n.getBoundingClientRect(),n=n.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===S.css(e,"position");)e=e.offsetParent;return e||yt})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return c(this,function(e,t,n){var r;if(X(e)?r=e:9===e.nodeType&&(r=e.defaultView),n===undefined)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=on(g.pixelPosition,function(e,t){if(t)return t=rn(e,n),Jt.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(s,a){S.each({padding:"inner"+s,content:a,"":"outer"+s},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return c(this,function(e,t,n){var r;return X(e)?0===o.indexOf("outer")?e["inner"+s]:e.document.documentElement["client"+s]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+s],r["scroll"+s],e.body["offset"+s],r["offset"+s],r["client"+s])):n===undefined?S.css(e,t,i):S.style(e,t,n,i)},a,n?e:undefined,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0'+(s?a.title[0]:a.title)+"
                ":"";return a.zIndex=o,t([a.shade?'
                ':"",'
                '+(e&&2!=a.type?"":s)+"'+(n=["layui-icon-tips","layui-icon-success","layui-icon-error","layui-icon-question","layui-icon-lock","layui-icon-face-cry","layui-icon-face-smile"],o="layui-anim layui-anim-rotate layui-anim-loop",0==a.type&&-1!==a.icon?'':3==a.type?(i=["layui-icon-loading","layui-icon-loading-1"],2==a.icon?'
                ':''):"")+((1!=a.type||!e)&&a.content||"")+'
                '+(n=[],r&&(n.push(''),n.push('')),a.closeBtn&&n.push(''),n.join(""))+"
                "+(a.btn?function(){var e="";"string"==typeof a.btn&&(a.btn=[a.btn]);for(var t,i=0,n=a.btn.length;i'+a.btn[i]+"";return'
                '+e+"
                "}():"")+(a.resize?'':"")+"
                "],s,m('
                ')),this},i.pt.creat=function(){var e,t,i,n,a=this,o=a.config,s=a.index,r=o.content,l="object"==typeof r,c=m("body"),f=function(e){var t;o.shift&&(o.anim=o.shift),u.anim[o.anim]&&(t="layer-anim "+u.anim[o.anim],e.addClass(t).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){m(this).removeClass(t)}))};if(o.id&&m("."+u[0]).find("#"+o.id)[0])e=m("#"+o.id).closest("."+u[0]),t=e.attr("times"),i=e.data("config"),n=m("#"+u.SHADE+t),"min"===(e.data("maxminStatus")||{})?x.restore(t):i.hideOnClose&&(n.show(),e.show(),f(e),setTimeout(function(){n.css({opacity:n.data(y)})},10));else{switch(o.removeFocus&&document.activeElement&&document.activeElement.blur(),"string"==typeof o.area&&(o.area="auto"===o.area?["",""]:[o.area,""]),6==x.ie&&(o.fixed=!1),o.type){case 0:o.btn="btn"in o?o.btn:v.$t("layer.confirm"),x.closeAll("dialog");break;case 2:r=o.content=l?o.content:[o.content||"","auto"],o.content='';break;case 3:delete o.title,delete o.closeBtn,-1===o.icon&&o.icon,x.closeAll("loading");break;case 4:l||(o.content=[o.content,"body"]),o.follow=o.content[1],o.content=o.content[0]+'',delete o.title,o.tips="object"==typeof o.tips?o.tips:[o.tips,!0],o.tipsMore||x.closeAll("tips")}a.vessel(l,function(e,t,i){c.append(e[0]),l?2==o.type||4==o.type?m("body").append(e[1]):r.parents("."+u[0])[0]||(r.data("display",r.css("display")).show().addClass("layui-layer-wrap").wrap(e[1]),m("#"+u[0]+s).find("."+u[5]).before(t)):c.append(e[1]),m("#"+u.MOVE)[0]||c.append(d.moveElem=i),a.layero=m("#"+u[0]+s),a.shadeo=m("#"+u.SHADE+s),o.scrollbar||d.setScrollbar(s)}).auto(s),a.shadeo.css({"background-color":o.shade[1]||"#000",opacity:o.shade[0]||o.shade,transition:o.shade[2]||""}),a.shadeo.data(y,o.shade[0]||o.shade),2==o.type&&6==x.ie&&a.layero.find("iframe").attr("src",r[0]),4==o.type?a.tips():(a.offset(),parseInt(d.getStyle(document.getElementById(u.MOVE),"z-index"))||(a.layero.css("visibility","hidden"),x.ready(function(){a.offset(),a.layero.css("visibility","visible")}))),!o.fixed||d.events.resize[a.index]||(d.events.resize[a.index]=function(){a.resize()},h.on("resize",d.events.resize[a.index])),a.layero.data("config",o),o.time<=0||setTimeout(function(){x.close(a.index)},o.time),a.move().callback(),f(a.layero)}},i.pt.resize=function(){var e=this,t=e.config;e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(e.index),4==t.type&&e.tips()},i.pt.auto=function(e){var t=this.config,i=m("#"+u[0]+e),n=((""===t.area[0]||"auto"===t.area[0])&&0t.maxWidth)&&i.width(t.maxWidth),[i.innerWidth(),i.innerHeight()]),a=i.find(u[1]).outerHeight()||0,o=i.find("."+u[6]).outerHeight()||0,e=function(e){(e=i.find(e)).height(n[1]-a-o-2*(0|parseFloat(e.css("padding-top"))))};return 2===t.type?e("iframe"):""===t.area[1]||"auto"===t.area[1]?0t.maxHeight?(n[1]=t.maxHeight,e("."+u[5])):t.fixed&&n[1]>=h.height()&&(n[1]=h.height(),e("."+u[5])):e("."+u[5]),this},i.pt.offset=function(){var e=this.config,t=this.layero,t=d.updatePosition(t,e);this.offsetTop=t.offsetTop,this.offsetLeft=t.offsetLeft},i.pt.tips=function(){var e=this.config,t=this.layero,i=[t.outerWidth(),t.outerHeight()],n=m(e.follow),a={width:(n=n[0]?n:m("body")).outerWidth(),height:n.outerHeight(),top:n.offset().top,left:n.offset().left},o=t.find(".layui-layer-TipsG"),n=e.tips[0];e.tips[1]||o.remove(),a.autoLeft=function(){0'):e.removeClass("layui-layer-btn-is-loading").removeAttr("disabled").find(".layui-layer-btn-loading-icon").remove()},i.pt.callback=function(){var n=this,a=n.layero,o=n.config;n.openLayer(),o.success&&(2==o.type?a.find("iframe").on("load",function(){o.success(a,n.index,n)}):o.success(a,n.index,n)),6==x.ie&&n.IE6(a),a.find("."+u[6]).children("a").on("click",function(){var e,t=m(this),i=t.index();t.attr("disabled")||(o.btnAsync?(e=0===i?o.yes||o.btn1:o["btn"+(i+1)],n.loading=function(e){n.btnLoading(t,e)},e?d.promiseLikeResolve(e.call(o,n.index,a,n)).then(function(e){!1!==e&&x.close(n.index)},function(e){e!==undefined&&p.console&&p.console.error("layer error hint: "+e)}):x.close(n.index)):0===i?o.yes?o.yes(n.index,a,n):o.btn1?o.btn1(n.index,a,n):x.close(n.index):!1!==(o["btn"+(i+1)]&&o["btn"+(i+1)](n.index,a,n))&&x.close(n.index))}),a.find("."+u[7]).on("click",function(){!1!==(o.cancel&&o.cancel(n.index,a,n))&&x.close(n.index)}),o.shadeClose&&n.shadeo.on("click",function(){x.close(n.index)}),a.find(".layui-layer-min").on("click",function(){!1!==(o.min&&o.min(a,n.index,n))&&x.min(n.index,o)}),a.find(".layui-layer-max").on("click",function(){m(this).hasClass("layui-layer-maxmin")?(x.restore(n.index),o.restore&&o.restore(a,n.index,n)):(x.full(n.index,o),setTimeout(function(){o.full&&o.full(a,n.index,n)},100))}),o.end&&(d.end[n.index]=o.end),o.beforeEnd&&(d.beforeEnd[n.index]=m.proxy(o.beforeEnd,o,a,n.index,n))},d.reselect=function(){m.each(m("select"),function(e,t){var i=m(this);i.parents("."+u[0])[0]||1==i.attr("layer")&&m("."+u[0]).length<1&&i.removeAttr("layer").show()})},i.pt.IE6=function(e){m("select").each(function(e,t){var i=m(this);i.parents("."+u[0])[0]||"none"!==i.css("display")&&i.attr({layer:"1"}).hide()})},i.pt.openLayer=function(){x.zIndex=this.config.zIndex,x.setTop=function(e){return x.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",function(){x.zIndex++,e.css("z-index",x.zIndex+1)}),x.zIndex}},d.record=function(e){if(!e[0])return p.console&&console.error("index error");var t=e.attr("type"),i=e.find(".layui-layer-content"),t=t===d.type[2]?i.children("iframe"):i,n=[e[0].style.width||d.getStyle(e[0],"width"),e[0].style.height||d.getStyle(e[0],"height"),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:n}),i.data(l,d.getStyle(t[0],"height"))},d.setScrollbar=function(e){u.html.css("overflow","hidden")},d.restScrollbar=function(t){u.html.css("overflow")&&0===m("."+u[0]).filter(function(){var e=m(this);return!1===(e.data("config")||{}).scrollbar&&"min"!==e.data("maxminStatus")&&e.attr("times")!==String(t)}).length&&u.html.css("overflow","")},d.promiseLikeResolve=function(e){var t=m.Deferred();return e&&"function"==typeof e.then?e.then(t.resolve,t.reject):t.resolve(e),t.promise()},d.updatePosition=function(e,t){var i=[e.outerWidth(),e.outerHeight()],n={offsetTop:(h.height()-i[1])/2,offsetLeft:(h.width()-i[0])/2};return"object"==typeof t.offset?(n.offsetTop=t.offset[0],n.offsetLeft=t.offset[1]||n.offsetLeft):"auto"!==t.offset&&("t"===t.offset?n.offsetTop=0:"r"===t.offset?n.offsetLeft=h.width()-i[0]:"b"===t.offset?n.offsetTop=h.height()-i[1]:"l"===t.offset?n.offsetLeft=0:"lt"===t.offset?(n.offsetTop=0,n.offsetLeft=0):"lb"===t.offset?(n.offsetTop=h.height()-i[1],n.offsetLeft=0):"rt"===t.offset?(n.offsetTop=0,n.offsetLeft=h.width()-i[0]):"rb"===t.offset?(n.offsetTop=h.height()-i[1],n.offsetLeft=h.width()-i[0]):n.offsetTop=t.offset),t.fixed||(n.offsetTop=/%$/.test(n.offsetTop)?h.height()*parseFloat(n.offsetTop)/100:parseFloat(n.offsetTop),n.offsetLeft=/%$/.test(n.offsetLeft)?h.width()*parseFloat(n.offsetLeft)/100:parseFloat(n.offsetLeft),n.offsetTop+=h.scrollTop(),n.offsetLeft+=h.scrollLeft()),"min"===e.data("maxminStatus")&&(n.offsetTop=h.height()-(e.find(u[1]).outerHeight()||0),n.offsetLeft=e.css("left")),e.css({top:n.offsetTop,left:n.offsetLeft}),n},(p.layer=x).getChildFrame=function(e,t){return t=t||m("."+u[4]).attr("times"),m("#"+u[0]+t).find("iframe").contents().find(e)},x.getFrameIndex=function(e){if(e)return m("#"+e).parents("."+u[4]).attr("times")},x.iframeAuto=function(e){var t,i,n,a,o;e&&(i=(t=m("#"+u[0]+e)).data("config"),e=x.getChildFrame("html",e).outerHeight(),n=t.find(u[1]).outerHeight()||0,a=t.find("."+u[6]).outerHeight()||0,(o="maxHeight"in i?i.maxHeight:h.height())&&(e=Math.min(e,o-n-a)),t.css({height:e+n+a}),t.find("iframe").css({height:e}),d.updatePosition(t,i))},x.iframeSrc=function(e,t){m("#"+u[0]+e).find("iframe").attr("src",t)},x.style=function(e,t,i){var e=m("#"+u[0]+e),n=e.find(".layui-layer-content"),a=e.attr("type"),o=e.find(u[1]).outerHeight()||0,s=e.find("."+u[6]).outerHeight()||0;a!==d.type[3]&&a!==d.type[4]&&(i||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-o-s<=64&&(t.height=64+o+s)),e.css(t),s=e.find("."+u[6]).outerHeight()||0,a===d.type[2]?e.find("iframe").css({height:("number"==typeof t.height?t.height:e.height())-o-s}):n.css({height:("number"==typeof t.height?t.height:e.height())-o-s-parseFloat(n.css("padding-top"))-parseFloat(n.css("padding-bottom"))}))},x.min=function(e,t){var i,n,a,o,s,r,l=m("#"+u[0]+e),c=l.data("maxminStatus");"min"!==c&&("max"===c&&x.restore(e),l.data("maxminStatus","min"),t=t||l.data("config")||{},c=m("#"+u.SHADE+e),i=l.find(".layui-layer-min"),n=l.find(u[1]).outerHeight()||0,o=(a="string"==typeof(o=l.attr("minLeft")))?o:181*d.minStackIndex+"px",s=l.css("position"),r={width:180,height:n,position:"fixed",overflow:"hidden"},d.record(l),0h.width()&&(o=h.width()-180-(d.minStackArr.edgeIndex=d.minStackArr.edgeIndex||0,d.minStackArr.edgeIndex+=3))<0&&(o=0),t.minStack&&(r.left=o,r.top=h.height()-n,a||d.minStackIndex++,l.attr("minLeft",o)),l.attr("position",s),x.style(e,r,!0),i.hide(),"page"===l.attr("type")&&l.find(u[4]).hide(),d.restScrollbar(e),c.hide())},x.restore=function(e){var t=m("#"+u[0]+e),i=m("#"+u.SHADE+e),n=t.find(".layui-layer-content"),a=t.attr("area").split(","),o=t.attr("type"),s=t.data("config")||{},r=n.data(l);t.removeData("maxminStatus"),x.style(e,{width:a[0],height:a[1],top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===o&&t.find(u[4]).show(),s.scrollbar?d.restScrollbar(e):d.setScrollbar(e),r!==undefined&&(n.removeData(l),(o===d.type[2]?n.children("iframe"):n).css({height:r})),i.show()},x.full=function(t){var i=m("#"+u[0]+t),e=i.data("maxminStatus");"max"!==e&&("min"===e&&x.restore(t),i.data("maxminStatus","max"),d.record(i),d.setScrollbar(t),setTimeout(function(){var e="fixed"===i.css("position");x.style(t,{top:e?0:h.scrollTop(),left:e?0:h.scrollLeft(),width:"100%",height:"100%"},!0),i.find(".layui-layer-min").hide()},100))},x.title=function(e,t){m("#"+u[0]+(t||x.index)).find(u[1]).html(e)},x.close=function(s,r){var e,t,l=(e=m("."+u[0]).children("#"+s).closest("."+u[0]))[0]?(s=e.attr("times"),e):m("#"+u[0]+s),c=l.attr("type"),i=l.data("config")||{},f=i.id&&i.hideOnClose;l[0]&&(t=function(){var o={slideDown:"layer-anim-slide-down-out",slideLeft:"layer-anim-slide-left-out",slideUp:"layer-anim-slide-up-out",slideRight:"layer-anim-slide-right-out"}[i.anim]||"layer-anim-close",e=function(){var e="layui-layer-wrap";if(f)return l.removeClass("layer-anim "+o),l.hide();if(c===d.type[1]&&"object"===l.attr("conType")){l.children(":not(."+u[5]+")").remove();for(var t=l.find("."+e),i=0;i<2;i++)t.unwrap();t.css("display",t.data("display")).removeClass(e)}else{if(c===d.type[2])try{var n=m("#"+u[4]+s)[0];n.contentWindow.document.write(""),n.contentWindow.close(),l.find("."+u[5])[0].removeChild(n)}catch(a){}l[0].innerHTML="",l.remove()}"function"==typeof d.end[s]&&d.end[s](),delete d.end[s],"function"==typeof r&&r(),d.events.resize[s]&&(h.off("resize",d.events.resize[s]),delete d.events.resize[s])},t=m("#"+u.SHADE+s);x.ie&&x.ie<10||!i.isOutAnim?t[f?"hide":"remove"]():(t.css({opacity:0}),setTimeout(function(){t[f?"hide":"remove"]()},350)),i.isOutAnim&&l.addClass("layer-anim "+o),6==x.ie&&d.reselect(),d.restScrollbar(s),"string"==typeof l.attr("minLeft")&&(d.minStackIndex--,d.minStackArr.push(l.attr("minLeft"))),x.ie&&x.ie<10||!i.isOutAnim?e():setTimeout(function(){e()},200)},f||"function"!=typeof d.beforeEnd[s]?(delete d.beforeEnd[s],t()):d.promiseLikeResolve(d.beforeEnd[s]()).then(function(e){!1!==e&&(delete d.beforeEnd[s],t())},function(e){e!==undefined&&p.console&&p.console.error("layer error hint: "+e)}))},x.closeAll=function(n,a){"function"==typeof n&&(a=n,n=null);var o=m("."+u[0]);m.each(o,function(e){var t=m(this),i=n?t.attr("type")===n:1;i&&x.close(t.attr("times"),e===o.length-1?a:null)}),0===o.length&&"function"==typeof a&&a()},x.closeLast=function(i,e){var t,n=[],a=m.isArray(i);m("string"==typeof i?".layui-layer-"+i:".layui-layer").each(function(e,t){t=m(t);if(a&&-1===i.indexOf(t.attr("type"))||"none"===t.css("display"))return!0;n.push(Number(t.attr("times")))}),0":'"),s=i.success;return delete i.success,x.open(m.extend({type:1,btn:[v.$t("layer.confirm"),v.$t("layer.cancel")],content:o,skin:"layui-layer-prompt"+b("prompt"),maxWidth:h.width(),success:function(e){(a=e.find(".layui-layer-input")).val(i.value||"").focus(),"function"==typeof s&&s(e)},resize:!1,yes:function(e){var t=a.val();t.length>(i.maxlength||500)?x.tips(v.$t("layer.prompt.inputLengthPrompt",{length:i.maxlength||500}),a,{tips:1}):n&&n(t,e,a)}},i))},x.tab=function(n){var a=(n=n||{}).tab||{},o="layui-this",s=n.success;return delete n.success,x.open(m.extend({type:1,skin:"layui-layer-tab"+b("tab"),resize:!1,title:function(){var e=a.length,t=1,i="";if(0'+a[0].title+"";t"+a[t].title+"";return i}(),content:'
                  '+function(){var e=a.length,t=1,i="";if(0'+(a[0].content||"no content")+"";t'+(a[t].content||"no content")+"";return i}()+"
                ",success:function(e){var t=e.find(".layui-layer-title").children(),i=e.find(".layui-layer-tabmain").children();t.on("mousedown",function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0;var e=m(this),t=e.index();e.addClass(o).siblings().removeClass(o),i.eq(t).show().siblings().hide(),"function"==typeof n.change&&n.change(t)}),"function"==typeof s&&s(e)}},n))},x.photos=function(n,e,a){var s={};if((n=m.extend(!0,{toolbar:!0,footer:!0},n)).photos){var t=!("string"==typeof n.photos||n.photos instanceof m),i=t?n.photos:{},o=i.data||[],r=i.start||0,l=n.success;if(s.imgIndex=1+(0|r),n.img=n.img||"img",delete n.success,t){if(0===o.length)return x.msg(v.$t("layer.photos.noData"))}else{var c=m(n.photos),f=function(){o=[],c.find(n.img).each(function(e){var t=m(this);t.attr("layer-index",e),o.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("lay-src")||t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(f(),e||c.on("click",n.img,function(){f();var e=m(this).attr("layer-index");x.photos(m.extend(n,{photos:{start:e,data:o,tab:n.tab},full:n.full}),!0)}),!e)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=o.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>o.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){var t;s.end||(t=e.keyCode,e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&x.close(s.index))},s.tabimg=function(e){if(!(o.length<=1))return i.start=s.imgIndex-1,x.close(s.index),x.photos(n,!0,e)},s.isNumber=function(e){return"number"==typeof e&&!isNaN(e)},s.image={},s.getTransform=function(e){var t=[],i=e.rotate,n=e.scaleX,e=e.scale;return s.isNumber(i)&&0!==i&&t.push("rotate("+i+"deg)"),s.isNumber(n)&&1!==n&&t.push("scaleX("+n+")"),s.isNumber(e)&&t.push("scale("+e+")"),t.length?t.join(" "):"none"},s.event=function(e,i,n){var a,o;s.main.find(".layui-layer-photos-prev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.main.find(".layui-layer-photos-next").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),m(document).on("keyup",s.keyup),e.off("click").on("click","*[toolbar-event]",function(){var e=m(this);switch(e.attr("toolbar-event")){case"rotate":s.image.rotate=((s.image.rotate||0)+Number(e.attr("data-option")))%360,s.imgElem.css({transform:s.getTransform(s.image)});break;case"scalex":s.image.scaleX=-1===s.image.scaleX?1:-1,s.imgElem.css({transform:s.getTransform(s.image)});break;case"zoom":var t=Number(e.attr("data-option"));s.image.scale=(s.image.scale||1)+t,t<0&&s.image.scale<0-t&&(s.image.scale=0-t),s.imgElem.css({transform:s.getTransform(s.image)});break;case"reset":s.image.scaleX=1,s.image.scale=1,s.image.rotate=0,s.imgElem.css({transform:"none"});break;case"close":x.close(i)}n.offset(),n.auto(i)}),s.main.on("mousewheel DOMMouseScroll",function(e){var t=e.originalEvent.wheelDelta||-e.originalEvent.detail,i=s.main.find('[toolbar-event="zoom"]');(0n)&&("left"===t.direction?s.imgnext(!0):"right"===t.direction&&s.imgprev(!0))},m.each([n.shadeo,s.main],function(e,t){a.touchSwipe(t,{onTouchEnd:o})}))},s.loadi=x.load(1,{shade:!("shade"in n)&&[.9,undefined,"unset"],scrollbar:!1});var t=o[r].src,d=function(e){x.close(s.loadi);var t,i=o[r].alt||"";a&&(n.anim=-1),s.index=x.open(m.extend({type:1,id:"layui-layer-photos",area:(e=[e.width,e.height],t=[m(p).width()-100,m(p).height()-100],!n.full&&(t[0]'+i+''+(t=['
                '],1','','',"
                "].join("")),n.toolbar&&t.push(['
                ','','','','','','',"
                "].join("")),n.footer&&t.push(['"].join("")),t.push(""),t.join(""))+"",success:function(e,t,i){s.main=e.find(".layer-layer-photos-main"),s.footer=e.find(".layui-layer-photos-footer"),s.imgElem=s.main.children("img"),s.event(e,t,i),n.tab&&n.tab(o[r],e),"function"==typeof l&&l(e)},end:function(){s.end=!0,m(document).off("keyup",s.keyup)}},n))},u=function(){x.close(s.loadi),x.msg(''+v.$t("layer.photos.urlError.prompt")+"",{time:3e4,btn:[v.$t("layer.photos.urlError.confirm"),v.$t("layer.photos.urlError.cancel")],yes:function(){1").addClass(r));layui.each(i.bars,function(t,e){var n=s('
              • ');n.addClass(e.icon).attr({"lay-type":e.type,style:e.style||(i.bgcolor?"background-color: "+i.bgcolor:"")}).html(e.content),n.on("click",function(){var t=s(this).attr("lay-type");"top"===t&&("body"===i.target?s("html,body"):c).animate({scrollTop:0},i.duration),"function"==typeof i.click&&i.click.call(this,t)}),"object"===layui.type(i.on)&&layui.each(i.on,function(t,e){n.on(t,function(){var t=s(this).attr("lay-type");"function"==typeof e&&e.call(this,t)})}),"top"===e.type&&(n.addClass("layui-fixbar-top"),o=n),l.append(n)}),u.find("."+r).remove(),"object"==typeof i.css&&l.css(i.css),u.append(l),o&&(e=function e(){return c.scrollTop()>=i.margin?t||(o.show(),t=1):t&&(o.hide(),t=0),e}()),c.on("scroll",function(){e&&(clearTimeout(n),n=setTimeout(function(){e()},100))})},countdown:function(i){i=s.extend(!0,{date:new Date,now:new Date},i);var o=arguments,r=(1r-t.margin||u."+w,O=function(e){var i=this;i.index=++a.index,i.config=c.extend({},i.config,a.config,e),i.stopClickOutsideEvent=c.noop,i.stopResizeEvent=c.noop,i.init()};O.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:[200,300],shade:0,accordion:!1,closeOnClick:!0},O.prototype.reload=function(e,i){var t=this;t.config=c.extend({},t.config,e),t.init(!0,i)},O.prototype.init=function(e,i){var t=this,n=t.config,o=c(n.elem);return 1",(t="href"in i?''+a+"":a,n?'
                '+t+("parent"===l?'':"group"===l&&s.isAllowSpread?'':"")+"
                ":'
                '+t+"
                "),"
              • "].join(""))).data("item",i),n&&(o=c('
                '),t=c("
                  "),"parent"===l?(o.append(u(t,i[d.children])),a.append(o)):a.append(u(t,i[d.children]))),r.append(a))}),r},t=['
                  ',"
                  "].join(""),n=s.content||(n=c('
                    '),0'+r.$t("dropdown.noData")+""),n),o=v.findMainElem(s.id);"reloadData"===e&&o.length?(i=a.mainElem=o).html(n):((i=a.mainElem=c(t)).append(n),i.addClass(s.className),i.attr("style",s.style),a.remove(s.id),s.target.append(i),s.elem.data(y,!0),e=s.shade?'
                    ':"",o=c(e),"touchstart"==f&&o.on(f,function(e){e.preventDefault()}),i.before(o),"mouseenter"===s.trigger&&i.on("mouseenter",function(){clearTimeout(a.timer)}).on("mouseleave",function(){a.delayRemove()})),a.position(),i.find(".layui-menu").on(f,function(e){layui.stope(e)}),i.find(".layui-menu li").on("click",function(e){var i=c(this),t=i.data("item")||{},n=t[d.children]&&0n.width()&&(t.addClass(b),(i=t[0].getBoundingClientRect()).left<0)&&t.removeClass(b),i.bottom>n.height())&&t.eq(0).css("margin-top",-(i.bottom-n.height()+5))}).on("mouseleave",t,function(e){var i=c(this).children("."+o);i.removeClass(b),i.css("margin-top",0)}),a.close=function(e){e=v.getThis(e);return e?(e.remove(),v.call(e)):this},a.open=function(e){e=v.getThis(e);return e?(e.render(),v.call(e)):this},a.reload=function(e,i,t){e=v.getThis(e);return e?(e.reload(i,t),v.call(e)):this},a.reloadData=function(){var t=c.extend([],arguments),n=(t[2]="reloadData",new RegExp("^("+["data","templet","content"].join("|")+")$"));return layui.each(t[1],function(e,i){n.test(e)||delete t[1][e]}),a.reload.apply(null,t)},a.render=function(e){e=new O(e);return v.call(e)},e(s,a)});layui.define("component",function(e){"use strict";var E=layui.$,I=layui.lay,t=layui.component({name:"slider",config:{type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,tipsAlways:!1,input:!1,range:!1,height:200,disabled:!1,theme:"#16baaa"},CONST:{ELEM_VIEW:"layui-slider",SLIDER_BAR:"layui-slider-bar",SLIDER_WRAP:"layui-slider-wrap",SLIDER_WRAP_BTN:"layui-slider-wrap-btn",SLIDER_TIPS:"layui-slider-tips",SLIDER_INPUT:"layui-slider-input",SLIDER_INPUT_TXT:"layui-slider-input-txt",SLIDER_INPUT_BTN:"layui-slider-input-btn",ELEM_HOVER:"layui-slider-hover"},render:function(e){var t,a=this,n=a.config,i=(n.step<=0&&(n.step=1),n.maxn.max&&(n.value=n.max),s=(n.value-n.min)/(n.max-n.min)*100+"%"),n.disabled?"#c2c2c2":n.theme),l='
                    '+(n.tips?'
                    ":"")+'
                    '+(n.range?'
                    ':"")+"
                    ",s=E(n.elem),o=s.next("."+S.ELEM_VIEW);if(o[0]&&o.remove(),a.elemTemp=E(l),n.range?(a.elemTemp.find("."+S.SLIDER_WRAP).eq(0).data("value",n.value[0]),a.elemTemp.find("."+S.SLIDER_WRAP).eq(1).data("value",n.value[1])):a.elemTemp.find("."+S.SLIDER_WRAP).data("value",n.value),s.html(a.elemTemp),"vertical"===n.type&&a.elemTemp.height(n.height+"px"),n.showstep){for(var r=(n.max-n.min)/n.step,u="",c=1;c<1+r;c++){var d=100*c/r;d<100&&(u+='
                    ')}a.elemTemp.append(u)}function p(e){e=e.parent().data("value"),e=n.setTips?n.setTips(e):e;a.elemTemp.find("."+S.SLIDER_TIPS).html(e)}function m(e){var t="vertical"===n.type?n.height:a.elemTemp[0].offsetWidth,i=a.elemTemp.find("."+S.SLIDER_WRAP);return("vertical"===n.type?t-e.parent()[0].offsetTop-i.height():e.parent()[0].offsetLeft)/t*100}function v(e){"vertical"===n.type?a.elemTemp.find("."+S.SLIDER_TIPS).css({bottom:e+"%","margin-bottom":"20px",display:"inline-block"}):a.elemTemp.find("."+S.SLIDER_TIPS).css({left:e+"%",display:"inline-block"})}n.input&&!n.range&&(i=E('
                    '),s.css("position","relative"),s.append(i),s.find("."+S.SLIDER_INPUT_TXT).children("input").val(n.value),"vertical"===n.type?i.css({left:0,top:-48}):a.elemTemp.css("margin-right",i.outerWidth()+15)),n.disabled?(a.elemTemp.addClass(S.CLASS_DISABLED),a.elemTemp.find("."+S.SLIDER_WRAP_BTN).addClass(S.CLASS_DISABLED)):a.slide(),n.tips&&(n.tipsAlways?(p(o=a.elemTemp.find("."+S.SLIDER_WRAP_BTN)),v(m(o))):a.elemTemp.find("."+S.SLIDER_WRAP_BTN).on("mouseover",function(){p(E(this));var e=m(E(this));clearTimeout(t),t=setTimeout(function(){v(e)},300)}).on("mouseout",function(){clearTimeout(t),n.tipsAlways||a.elemTemp.find("."+S.SLIDER_TIPS).css("display","none")}))},extendsInstance:function(){var i=this,a=i.config;return{setValue:function(e,t){return e=(e=e>a.max?a.max:e)a[1]&&a.reverse(),u.value=c.range?a:l,c.change&&c.change(u.value),"done"===i&&c.done&&c.done(u.value)},y=function(e){var t=e/p()*100/v,i=Math.round(t)*v;return i=e==p()?Math.ceil(t)*v:i},T=E(['
                    p()?p():t)/p()*100/v;h(t,o),r.addClass(S.ELEM_HOVER),d.find("."+S.SLIDER_TIPS).show(),e.preventDefault()},a=function(e){r.removeClass(S.ELEM_HOVER),c.tipsAlways||setTimeout(function(){d.find("."+S.SLIDER_TIPS).hide()},e)},n=function(){a&&a(I.touchEventsSupported()?1e3:0),T.remove(),c.done&&c.done(u.value),I.touchEventsSupported()&&(t[0].removeEventListener("touchmove",i,!!I.passiveSupported&&{passive:!1}),t[0].removeEventListener("touchend",n),t[0].removeEventListener("touchcancel",n))},E("#LAY-slider-moving")[0]||E("body").append(T),T.on("mousemove",i),T.on("mouseup",n).on("mouseleave",n),I.touchEventsSupported()&&(t[0].addEventListener("touchmove",i,!!I.passiveSupported&&{passive:!1}),t[0].addEventListener("touchend",n),t[0].addEventListener("touchcancel",n))})}),d.on("click",function(e){var t=E("."+S.SLIDER_WRAP_BTN),i=E(this);!t.is(e.target)&&0===t.has(e.target).length&&t.length&&(i=(t=(t=(t="vertical"===c.type?p()-e.clientY+i.offset().top-E(window).scrollTop():e.clientX-i.offset().left-E(window).scrollLeft())<0?0:t)>p()?p():t)/p()*100/v,t=c.range?"vertical"===c.type?Math.abs(t-parseInt(E(m[0]).css("bottom")))>Math.abs(t-parseInt(E(m[1]).css("bottom")))?1:0:Math.abs(t-m[0].offsetLeft)>Math.abs(t-m[1].offsetLeft)?1:0:0,h(i,t,"done"),e.preventDefault())}),o.children("."+S.SLIDER_INPUT_BTN).children("i").each(function(t){E(this).on("click",function(){r=o.children("."+S.SLIDER_INPUT_TXT).children("input").val();var e=((r=1==t?r-c.stepc.max?c.max:Number(r)+c.step)-c.min)/(c.max-c.min)*100/v;h(e,0,"done")})});var a=function(){var e=this.value,e=(e=(e=(e=isNaN(e)?0:e)c.max?c.max:e,((this.value=e)-c.min)/(c.max-c.min)*100/v);h(e,0,"done")};o.children("."+S.SLIDER_INPUT_TXT).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),a.call(this))}).on("change",a)},e(S.MOD_NAME,t)});layui.define(["i18n","component"],function(e){"use strict";var P=layui.$,I=layui.lay,t=layui.i18n,i=layui.device().mobile?"click":"mousedown",o=layui.component({name:"colorpicker",config:{color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#16baaa","#16b777","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","#393D49","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},CONST:{ELEM:"layui-colorpicker",ELEM_MAIN:".layui-colorpicker-main",ICON_PICKER_DOWN:"layui-icon-down",ICON_PICKER_CLOSE:"layui-icon-close",PICKER_TRIG_SPAN:"layui-colorpicker-trigger-span",PICKER_TRIG_I:"layui-colorpicker-trigger-i",PICKER_SIDE:"layui-colorpicker-side",PICKER_SIDE_SLIDER:"layui-colorpicker-side-slider",PICKER_BASIS:"layui-colorpicker-basis",PICKER_ALPHA_BG:"layui-colorpicker-alpha-bgcolor",PICKER_ALPHA_SLIDER:"layui-colorpicker-alpha-slider",PICKER_BASIS_CUR:"layui-colorpicker-basis-cursor",PICKER_INPUT:"layui-colorpicker-main-input"},beforeInit:function(){this.stopClickOutsideEvent=P.noop,this.stopResizeEvent=P.noop,S.PICKER_OPENED=S.MOD_ID+"-opened"},beforeRender:function(){this.config.target=P("body")},render:function(){var e=this,i=e.config,o=P(e.buildColorBoxTemplate(i)),t=i.elem;i.size&&o.addClass("layui-colorpicker-"+i.size),t.addClass("layui-inline").html(e.elemColorBox=o),e.color=e.elemColorBox.find("."+S.PICKER_TRIG_SPAN)[0].style.background}}),k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),t=Math.max(e.r,e.g,e.b),r=t-o;return i.b=t,i.s=0!==t?255*r/t:0,0!==i.s?e.r==t?i.h=(e.g-e.b)/r:e.g==t?i.h=2+(e.b-e.r)/r:i.h=4+(e.r-e.g)/r:i.h=-1,t===o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},E=function(e){var i,o={},t=e.h,r=255*e.s/100,e=255*e.b/100;return 0==r?o.r=o.g=o.b=e:(e=t%60*((i=e)-(r=(255-r)*e/255))/60,(t=360===t?0:t)<60?(o.r=i,o.b=r,o.g=r+e):t<120?(o.g=i,o.b=r,o.r=i-e):t<180?(o.g=i,o.r=r,o.b=r+e):t<240?(o.b=i,o.r=r,o.g=i-e):t<300?(o.b=i,o.g=r,o.r=r+e):t<360?(o.r=i,o.g=r,o.b=i-e):(o.r=0,o.g=0,o.b=0)),{r:Math.round(o.r),g:Math.round(o.g),b:Math.round(o.b)}},_=function(e){var e=E(e),o=[e.r.toString(16),e.g.toString(16),e.b.toString(16)];return P.each(o,function(e,i){1===i.length&&(o[e]="0"+i)}),o.join("")},R=function(e){e=e.match(/[0-9]{1,3}/g)||[];return{r:e[0],g:e[1],b:e[2]}},K=P(window),S=o.CONST,r=o.Class;r.prototype.buildColorBoxTemplate=function(e){var i;return['
                    '," ",' ',' '," "," ","
                    "].join("")},r.prototype.buildColorPickerTemplate=function(e,i){var o;return['
                    ','
                    ','
                    ','
                    ','
                    ','
                    ',"
                    ",'
                    ','
                    ',"
                    ","
                    ",'
                    ','
                    ','
                    ',"
                    ","
                    ",e.predefine?(o=['
                    '],layui.each(e.colors,function(e,i){o.push(['
                    ','
                    ',"
                    "].join(""))}),o.push("
                    "),o.join("")):"",'
                    ','
                    ',' ',"
                    ",'
                    ',' ",' ","
                    ","
                    ","
                    "].join("")},r.prototype.renderPicker=function(){var e=this,i=e.config,o=e.elemPicker=P(e.buildColorPickerTemplate(i,e));e.removePicker(i.id),i.target.append(o),i.elem.data(S.PICKER_OPENED,!0),e.position(),e.pickerEvents(),e.onClickOutside(),e.autoUpdatePosition()},r.prototype.removePicker=function(e){var i=this,o=i.config,e=P("#layui-colorpicker"+(e||i.index));return i.stopClickOutsideEvent(),i.stopResizeEvent(),e[0]&&(e.remove(),o.elem.removeData(S.PICKER_OPENED),"function"==typeof o.close)&&o.close(i.color),i},r.prototype.position=function(){var e=this,i=e.config;return I.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},r.prototype.val=function(){var e,i=this,o=i.elemColorBox.find("."+S.PICKER_TRIG_SPAN),t=i.elemPicker.find("."+S.PICKER_INPUT),r=o[0].style.backgroundColor;r?(e=k(R(r)),o=o.attr("lay-type"),i.select(e.h,e.s,e.b),"torgb"===o?t.find("input").val(r):"rgba"===o?(o=R(r),3===(r.match(/[0-9]{1,3}/g)||[]).length?(t.find("input").val("rgba("+o.r+", "+o.g+", "+o.b+", 1)"),i.elemPicker.find("."+S.PICKER_ALPHA_SLIDER).css("left",280)):(t.find("input").val(r),r=280*r.slice(r.lastIndexOf(",")+1,r.length-1),i.elemPicker.find("."+S.PICKER_ALPHA_SLIDER).css("left",r)),i.elemPicker.find("."+S.PICKER_ALPHA_BG)[0].style.background="linear-gradient(to right, rgba("+o.r+", "+o.g+", "+o.b+", 0), rgb("+o.r+", "+o.g+", "+o.b+"))"):t.find("input").val("#"+_(e))):(i.select(0,100,100),t.find("input").val(""),i.elemPicker.find("."+S.PICKER_ALPHA_BG)[0].style.background="",i.elemPicker.find("."+S.PICKER_ALPHA_SLIDER).css("left",280))},r.prototype.side=function(){var n=this,l=n.config,c=n.elemColorBox.find("."+S.PICKER_TRIG_SPAN),a=c.attr("lay-type"),s=n.elemPicker.find("."+S.PICKER_SIDE),o=n.elemPicker.find("."+S.PICKER_SIDE_SLIDER),u=n.elemPicker.find("."+S.PICKER_BASIS),t=n.elemPicker.find("."+S.PICKER_BASIS_CUR),d=n.elemPicker.find("."+S.PICKER_ALPHA_BG),f=n.elemPicker.find("."+S.PICKER_ALPHA_SLIDER),p=o[0].offsetTop/180*360,g=100-t[0].offsetTop/180*100,v=t[0].offsetLeft/260*100,h=Math.round(f[0].offsetLeft/280*100)/100,m=n.elemColorBox.find("."+S.PICKER_TRIG_I),e=n.elemPicker.find(".layui-colorpicker-pre").children("div"),b=function(e,i,o,t){n.select(e,i,o);var r=E({h:e,s:i,b:o}),e=_({h:e,s:i,b:o}),i=n.elemPicker.find("."+S.PICKER_INPUT).find("input");m.addClass(S.ICON_PICKER_DOWN).removeClass(S.ICON_PICKER_CLOSE),c[0].style.background="rgb("+r.r+", "+r.g+", "+r.b+")","torgb"===a?i.val("rgb("+r.r+", "+r.g+", "+r.b+")"):"rgba"===a?(f.css("left",280*t),i.val("rgba("+r.r+", "+r.g+", "+r.b+", "+t+")"),c[0].style.background="rgba("+r.r+", "+r.g+", "+r.b+", "+t+")",d[0].style.background="linear-gradient(to right, rgba("+r.r+", "+r.g+", "+r.b+", 0), rgb("+r.r+", "+r.g+", "+r.b+"))"):i.val("#"+e),l.change&&l.change(P.trim(n.elemPicker.find("."+S.PICKER_INPUT).find("input").val()))},i=P('
                    '),y=function(e){P("#LAY-colorpicker-moving")[0]||P("body").append(i),i.on("mousemove",e),i.on("mouseup",function(){i.remove()}).on("mouseleave",function(){i.remove()})},r=!0,C=!0;o.on("mousedown",function(e,i){var t=this.offsetTop,r=(e.clientY===undefined?i:e).clientY;C&&layui.stope(e),y(function(e){var i=t+(e.clientY-r),o=s[0].offsetHeight,o=(i=o<(i=i<0?0:i)?o:i)/180*360;b(p=o,v,g,h),e.preventDefault()}),e.preventDefault()}),s.on("mousedown",function(e){var i=e.clientY-P(this).offset().top+K.scrollTop(),i=(i=(i=i<0?0:i)>this.offsetHeight?this.offsetHeight:i)/180*360;b(p=i,v,g,h),e.preventDefault(),r&&o.trigger("mousedown",e)}),t.on("mousedown",function(e,i){var n=this.offsetTop,l=this.offsetLeft,c=(e.clientY===undefined?i:e).clientY,a=(e.clientX===undefined?i:e).clientX;C&&layui.stope(e),y(function(e){var i=n+(e.clientY-c),o=l+(e.clientX-a),t=u[0].offsetHeight,r=u[0].offsetWidth,r=(o=r<(o=o<0?0:o)?r:o)/260*100,o=100-(i=t<(i=i<0?0:i)?t:i)/180*100;b(p,v=r,g=o,h),e.preventDefault()}),e.preventDefault()}),u.on("mousedown",function(e){var i=e.clientY-P(this).offset().top+K.scrollTop(),o=e.clientX-P(this).offset().left+K.scrollLeft(),o=((i=i<0?0:i)>this.offsetHeight&&(i=this.offsetHeight),(o=(o=o<0?0:o)>this.offsetWidth?this.offsetWidth:o)/260*100),i=100-i/180*100;b(p,v=o,g=i,h),layui.stope(e),e.preventDefault(),r&&t.trigger("mousedown",e)}),f.on("mousedown",function(e,i){var t=this.offsetLeft,r=(e.clientX===undefined?i:e).clientX;C&&layui.stope(e),y(function(e){var i=t+(e.clientX-r),o=d[0].offsetWidth,o=(o<(i=i<0?0:i)&&(i=o),Math.round(i/280*100)/100);b(p,v,g,h=o),e.preventDefault()}),e.preventDefault()}),d.on("mousedown",function(e){var i=e.clientX-P(this).offset().left,i=((i=i<0?0:i)>this.offsetWidth&&(i=this.offsetWidth),Math.round(i/280*100)/100);b(p,v,g,h=i),e.preventDefault(),r&&f.trigger("mousedown",e)}),e.each(function(){P(this).on("click",function(){P(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e=this.style.backgroundColor,i=k(R(e)),o=e.slice(e.lastIndexOf(",")+1,e.length-1);p=i.h,v=i.s,g=i.b,3===(e.match(/[0-9]{1,3}/g)||[]).length&&(o=1),h=o,b(i.h,i.s,i.b,o)})}),I.touchEventsSupported()&&layui.each([{elem:s,eventType:"mousedown"},{elem:d,eventType:"mousedown"},{elem:u,eventType:"mousedown"}],function(e,t){I.touchSwipe(t.elem,{onTouchStart:function(){C=r=!1},onTouchMove:function(e){var i,o;e=e,i=t.eventType,e=e.touches[0],(o=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,e.screenX,e.screenY,e.clientX,e.clientY,!1,!1,!1,!1,0,null),e.target.dispatchEvent(o)},onTouchEnd:function(){i.remove(),C=r=!0}})})},r.prototype.select=function(e,i,o,t){var r=_({h:e,s:100,b:100}),e=e/360*180,o=180-o/100*180,i=i/100*260,n=this.elemPicker.find("."+S.PICKER_BASIS)[0];this.elemPicker.find("."+S.PICKER_SIDE_SLIDER).css("top",e),n.style.background="#"+r,this.elemPicker.find("."+S.PICKER_BASIS_CUR).css({top:o/n.offsetHeight*100+"%",left:i/n.offsetWidth*100+"%"})},r.prototype.pickerEvents=function(){var c=this,a=c.config,s=c.elemColorBox.find("."+S.PICKER_TRIG_SPAN),u=c.elemPicker.find("."+S.PICKER_INPUT+" input"),o={clear:function(e){s[0].style.background="",c.elemColorBox.find("."+S.PICKER_TRIG_I).removeClass(S.ICON_PICKER_DOWN).addClass(S.ICON_PICKER_CLOSE),c.color="",a.done&&a.done(""),c.removePicker()},confirm:function(e,i){var o,t,r,n,l=P.trim(u.val());-1>16,g:(65280&r)>>8,b:255&r},t=k(n),s[0].style.background=o="#"+_(t),c.elemColorBox.find("."+S.PICKER_TRIG_I).removeClass(S.ICON_PICKER_CLOSE).addClass(S.ICON_PICKER_DOWN)),"change"===i?(c.select(t.h,t.s,t.b,i),a.change&&a.change(o)):(c.color=l,a.done&&a.done(l),c.removePicker())}};c.elemPicker.on("click","*[colorpicker-events]",function(){var e=P(this),i=e.attr("colorpicker-events");o[i]&&o[i].call(this,e)}),u.on("keyup",function(e){var i=P(this);o.confirm.call(this,i,13===e.keyCode?null:"change")})},r.prototype.events=function(){var e=this,i=e.config;e.elemColorBox.on("click",function(){i.elem.data(S.PICKER_OPENED)?e.removePicker():(e.renderPicker(),e.val(),e.side())})},r.prototype.onClickOutside=function(){var t=this,r=t.config,e=(t.stopClickOutsideEvent(),I.onClickOutside(t.elemPicker[0],function(e){var i,o=t.elemColorBox.find("."+S.PICKER_TRIG_SPAN);t.color?(i=k(R(t.color)),t.select(i.h,i.s,i.b)):t.elemColorBox.find("."+S.PICKER_TRIG_I).removeClass(S.ICON_PICKER_DOWN).addClass(S.ICON_PICKER_CLOSE),o[0].style.background=t.color||"","function"==typeof r.cancel&&r.cancel(t.color),t.removePicker()},{ignore:[r.elem[0]],event:i,capture:!1}));t.stopClickOutsideEvent=function(){e(),t.stopClickOutsideEvent=P.noop}},r.prototype.autoUpdatePosition=function(){var e=this,i="resize.lay_colorpicker_resize",o=(e.stopResizeEvent(),function(){e.position()});K.on(i,o),e.stopResizeEvent=function(){K.off(i,o),e.stopResizeEvent=P.noop}},e(S.MOD_NAME,o)});layui.define("component",function(e){"use strict";var d=layui.$,s="element",t=layui.component({name:"tab",config:{elem:".layui-tab"},CONST:{ELEM:"layui-tab",HEADER:"layui-tab-title",CLOSE:"layui-tab-close",MORE:"layui-tab-more",BAR:"layui-tab-bar"},render:function(){var e=this.config;o.tabAuto(null,e.elem)}}),u=t.CONST,a=d(window),i=d(document),o={tabClick:function(e){var t=(e=e||{}).options||{},a=e.liElem||d(this),i=t.headerElem?a.parent():a.parents(".layui-tab").eq(0),t=t.bodyElem?d(t.bodyElem):i.children(".layui-tab-content").children(".layui-tab-item"),l=a.find("a"),l="javascript:;"!==l.attr("href")&&"_blank"===l.attr("target"),n="string"==typeof a.attr("lay-unselect"),r=i.attr("lay-filter"),c=a.attr("lay-id"),o="index"in e?e.index:a.parent().children("li").index(a);if(!e.force){var e=a.siblings("."+u.CLASS_THIS);if(!1===layui.event.call(this,s,"tabBeforeChange("+r+")",{elem:i,from:{index:a.parent().children("li").index(e),id:e.attr("lay-id")},to:{index:o,id:c}}))return}l||n||(a.addClass(u.CLASS_THIS).siblings().removeClass(u.CLASS_THIS),(c?e=(e=t.filter('[lay-id="'+c+'"]')).length?e:t.eq(o):t.eq(o)).addClass(u.CLASS_SHOW).siblings().removeClass(u.CLASS_SHOW)),layui.event.call(this,s,"tab("+r+")",{elem:i,index:o,id:c})},tabDelete:function(e){var t=(e=e||{}).liElem||d(this).parent(),a=t.parent().children("li").index(t),i=t.closest(".layui-tab"),l=i.children(".layui-tab-content").children(".layui-tab-item"),n=i.attr("lay-filter"),r=t.attr("lay-id");if(!e.force&&!1===layui.event.call(t[0],s,"tabBeforeDelete("+n+")",{elem:i,index:a,id:r}))return;t.hasClass(u.CLASS_THIS)&&(t.next()[0]&&t.next().is("li")?o.tabClick.call(t.next()[0],{index:a+1}):t.prev()[0]&&t.prev().is("li")&&o.tabClick.call(t.prev()[0],null,a-1)),t.remove(),(r?e=(e=l.filter('[lay-id="'+r+'"]')).length?e:l.eq(a):l.eq(a)).remove(),setTimeout(function(){o.tabAuto(null,i)},50),layui.event.call(this,s,"tabDelete("+n+")",{elem:i,index:a,id:r})},tabAuto:function(l,e){(e||d(".layui-tab")).each(function(){var e=d(this),a=e.children("."+u.HEADER),t='lay-stope="tabmore"',t=d(''),i=e.attr("lay-allowclose");i&&"false"!==i&&a.find("li").each(function(){var e,t=d(this);t.find("."+u.CLOSE)[0]||"false"===t.attr("lay-allowclose")||((e=d('')).on("click",function(e){o.tabDelete.call(this,{e:e})}),t.append(e))}),"string"!=typeof e.attr("lay-unauto")&&(a.prop("scrollWidth")>a.outerWidth()+1||a.find("li").length&&a.height()>(i=a.find("li").eq(0).height())+i/2?("change"===l&&a.data("LAY_TAB_CHANGE")&&a.addClass(u.MORE),a.find("."+u.BAR)[0]||(a.append(t),e.attr("overflow",""),t.on("click",function(e){var t=a.hasClass(u.MORE);a[t?"removeClass":"addClass"](u.MORE)}))):(a.find("."+u.BAR).remove(),e.removeAttr("overflow")))})},hideTabMore:function(e){var t=d("."+u.HEADER);!0!==e&&"tabmore"===d(e.target).attr("lay-stope")||(t.removeClass(u.MORE),t.find("."+u.BAR).attr("title",""))}};d.extend(t,{tabAdd:function(e,t){var a,i=d(".layui-tab[lay-filter="+e+"]"),l=i.children("."+u.HEADER),n=l.children("."+u.BAR),r=i.children(".layui-tab-content"),c=""+(t.title||"unnaming")+"";return n[0]?n.before(c):l.append(c),r.append('
                    "+(t.content||"")+"
                    "),t.change&&this.tabChange(e,t.id),l.data("LAY_TAB_CHANGE",t.change),o.tabAuto(t.change?"change":null,i),this},tabDelete:function(e,t,a){e=d(".layui-tab[lay-filter="+e+"]").children("."+u.HEADER).find('>li[lay-id="'+t+'"]');return o.tabDelete.call(e[0],{liElem:e,force:a}),this},tabChange:function(e,t,a){e=d(".layui-tab[lay-filter="+e+"]").children("."+u.HEADER).find('>li[lay-id="'+t+'"]');return o.tabClick.call(e[0],{liElem:e,force:a}),this},tab:function(a){a=a||{},i.on("click",a.headerElem,function(e){var t=d(a.headerElem).index(d(this));o.tabClick.call(this,{index:t,options:a})})}}),i.on("click","."+u.HEADER+" li",o.tabClick),a.on("resize.lay_tab_auto_resize",o.tabAuto),e(u.MOD_NAME,t)});layui.define("component",function(i){"use strict";var _=layui.$,f=layui.device(),a=layui.component({name:"nav",config:{elem:".layui-nav"},CONST:{NAV_ELEM:".layui-nav",NAV_ITEM:"layui-nav-item",NAV_BAR:"layui-nav-bar",NAV_TREE:"layui-nav-tree",NAV_CHILD:"layui-nav-child",NAV_CHILD_C:"layui-nav-child-c",NAV_MORE:"layui-nav-more",NAV_DOWN:"layui-icon-down",NAV_ANIM:"layui-anim layui-anim-upbit"},render:function(){var i=this.config,l={},o={},c={};i.elem.each(function(i){var a=_(this),s=_(''),e=a.find("."+r.NAV_ITEM),t=a.find("."+r.NAV_BAR);t[0]&&t.remove(),a.append(s),(a.hasClass(r.NAV_TREE)?e.find("dd,>."+r.NAV_TITLE):e).off("mouseenter.lay_nav").on("mouseenter.lay_nav",function(){!function(i,a,s){var e,t=_(this),n=t.find("."+r.NAV_CHILD);a.hasClass(r.NAV_TREE)?n[0]||(e=t.children(".layui-nav-title"),i.css({top:t.offset().top-a.offset().top+a.scrollTop(),height:(e[0]?e:t).outerHeight(),opacity:1})):(n.addClass(r.NAV_ANIM),n.hasClass(r.NAV_CHILD_C)&&n.css({left:-(n.outerWidth()-t.width())/2}),n[0]?i.css({left:i.position().left+i.width()/2,width:0,opacity:0}):i.css({left:t.position().left+parseFloat(t.css("marginLeft")),top:t.position().top+t.height()-i.height()}),l[s]=setTimeout(function(){i.css({width:n[0]?0:t.width(),opacity:n[0]?0:1})},f.ie&&f.ie<10?0:200),clearTimeout(c[s]),"block"===n.css("display")&&clearTimeout(o[s]),o[s]=setTimeout(function(){n.addClass(r.CLASS_SHOW),t.find("."+r.NAV_MORE).addClass(r.NAV_MORE+"d")},300))}.call(this,s,a,i)}).off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){a.hasClass(r.NAV_TREE)?s.css({height:0,opacity:0}):(clearTimeout(o[i]),o[i]=setTimeout(function(){a.find("."+r.NAV_CHILD).removeClass(r.CLASS_SHOW),a.find("."+r.NAV_MORE).removeClass(r.NAV_MORE+"d")},300))}),a.off("mouseleave.lay_nav").on("mouseleave.lay_nav",function(){clearTimeout(l[i]),c[i]=setTimeout(function(){a.hasClass(r.NAV_TREE)||s.css({width:0,left:s.position().left+s.width()/2,opacity:0})},200)}),e.find("a").each(function(){var i=_(this),a="click.lay_nav_click";i.siblings("."+r.NAV_CHILD)[0]&&!i.children("."+r.NAV_MORE)[0]&&i.append(''),i.off(a,n.clickThis).on(a,n.clickThis)})})}}),n={clickThis:function(){var i=_(this),a=i.closest(r.NAV_ELEM),s=a.attr("lay-filter"),e=i.parent(),t=i.siblings("."+r.NAV_CHILD),n="string"==typeof e.attr("lay-unselect");if("javascript:;"!==i.attr("href")&&"_blank"===i.attr("target")||n||t[0]||(a.find("."+r.CLASS_THIS).removeClass(r.CLASS_THIS),e.addClass(r.CLASS_THIS)),a.hasClass(r.NAV_TREE)){var n=r.NAV_ITEM+"ed",l=!e.hasClass(n),o=function(){_(this).css({display:""}),a.children("."+r.NAV_BAR).css({opacity:0})};if(t.is(":animated"))return;t.removeClass(r.NAV_ANIM),t[0]&&(l?(t.slideDown(200,o),e.addClass(n)):(e.removeClass(n),t.show().slideUp(200,o)),"string"!=typeof a.attr("lay-accordion")&&"all"!==a.attr("lay-shrink")||((l=e.siblings("."+n)).removeClass(n),l.children("."+r.NAV_CHILD).show().stop().slideUp(200,o)))}layui.event.call(this,"element","nav("+s+")",i)}},r=a.CONST;i(r.MOD_NAME,a)});layui.define("component",function(n){"use strict";var t=layui.$,i=layui.component({name:"breadcrumb",config:{elem:".layui-breadcrumb"},render:function(){this.config.elem.each(function(){var n=t(this),i="lay-separator",e=n.attr(i)||"/",a=n.find("a");a.next("span["+i+"]")[0]||(a.each(function(n){n!==a.length-1&&t(this).after(""+e+"")}),n.css("visibility","visible"))})}});n(i.CONST.MOD_NAME,i)});layui.define("component",function(t){"use strict";var r=layui.$,e=layui.component({name:"progress",config:{elem:".layui-progress"},CONST:{ELEM:"layui-progress"},render:function(){this.config.elem.each(function(){var t=r(this),e=t.find(".layui-progress-bar"),n=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(n)?100*new Function("return "+n)()+"%":n}),t.attr("lay-showpercent")&&setTimeout(function(){e.html(''+n+"")},350)})}}),i=e.CONST;r.extend(e,{setValue:function(t,e){var n="layui-progress",t=r("."+n+"[lay-filter="+t+"]").find("."+n+"-bar"),n=t.find("."+n+"-text");return t.css("width",function(){return/^.+\/.+$/.test(e)?100*new Function("return "+e)()+"%":e}).attr("lay-percent",e),n.text(e),this}}),t(i.MOD_NAME,e)});layui.define("component",function(l){"use strict";var t=layui.$,i=layui.component({name:"collapse",config:{elem:".layui-collapse"},render:function(){this.config.elem.each(function(){t(this).find(".layui-colla-item").each(function(){var l=t(this),i=l.find(".layui-colla-title"),a=l.find(".layui-colla-content"),e="none"===a.css("display"),s="click.lay_collapse_click";i.find(".layui-colla-icon").remove(),i.append(''),l[e?"removeClass":"addClass"](u.CLASS_SHOW),a.hasClass(u.CLASS_SHOW)&&a.removeClass(u.CLASS_SHOW),i.off(s,n.titleClick).on(s,n.titleClick)})})}}),n={titleClick:function(){var l=t(this),i=l.closest(".layui-collapse"),a=i.attr("lay-filter"),e=".layui-colla-content",s=l.parent(".layui-colla-item"),n=l.siblings(e),c="none"===n.css("display"),i="string"==typeof i.attr("lay-accordion"),o=function(){t(this).css("display","")};n.is(":animated")||(c?(n.slideDown(200,o),s.addClass(u.CLASS_SHOW)):(s.removeClass(u.CLASS_SHOW),n.show().slideUp(200,o)),i&&((i=s.siblings("."+u.CLASS_SHOW)).removeClass(u.CLASS_SHOW),i.children(e).show().slideUp(200,o)),layui.event.call(this,"element","collapse("+a+")",{title:l,content:n,show:c}))}},u=i.CONST;l(u.MOD_NAME,i)});layui.define(["component","tab","nav","breadcrumb","progress","collapse"],function(e){"use strict";var n=layui.$,a=layui.tab,r=layui.progress,t=layui.component({name:"element",CONST:{MOD_NAME:"element"}}),l=t.CONST;n.extend(t,{render:function(e,a){var r="string"==typeof a&&a?'[lay-filter="'+a+'"]':"",t={tab:".layui-tab"+r,nav:".layui-nav"+r,breadcrumb:".layui-breadcrumb"+r,progress:".layui-progress"+r,collapse:".layui-collapse"+r};if(!e||t[e])return e&&"object"==typeof a&&a instanceof n?layui[e].render({elem:a}):t[e]?layui[e].render({elem:t[e]}):layui.each(t,function(e){layui[e].render({elem:t[e]})})},tabAdd:a.tabAdd,tabDelete:a.tabDelete,tabChange:a.tabChange,tab:a.tab,progress:r.setValue}),t.init=t.render,n(function(){t.render()}),e(l.MOD_NAME,t)});layui.define(["lay","i18n","layer"],function(e){"use strict";var F=layui.$,a=layui.lay,i=layui.layer,R=layui.i18n,T=layui.device(),w=layui.hint(),t="upload",f="layui_"+t+"_index",L={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var i=this;return i.config=F.extend({},i.config,e),i},on:function(e,i){return layui.onevent.call(this,t,e,i)}},o=function(){var i=this,e=i.config.id;return{upload:function(e){i.upload.call(i,e)},reload:function(e){i.reload.call(i,e)},config:(o.that[e]=i).config}},l="layui-upload-file",r="layui-upload-form",E="layui-upload-iframe",O="layui-upload-choose",D="UPLOADING",M=function(e){var i=this;i.index=++L.index,i.config=F.extend({},i.config,L.config,e),i.render()};M.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",force:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1,text:{"cross-domain":"Cross-domain requests are not supported","data-format-error":"Please return JSON data format","check-error":"",error:"","limit-number":null,"limit-size":null}},M.prototype.reload=function(e){var i=this;i.config=F.extend({},i.config,e),i.render(!0)},M.prototype.render=function(e){var i=this,t=i.config,n=F(t.elem);return 1"].join("")),n=i.elem.next();(n.hasClass(l)||n.hasClass(r))&&n.remove(),T.ie&&T.ie<10&&i.elem.wrap('
                    '),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(t),T.ie&&T.ie<10&&e.initIE()},M.prototype.initIE=function(){var t,e=this.config,i=F(''),n=F(['
                    ',"
                    "].join(""));F("#"+E)[0]||F("body").append(i),e.elem.next().hasClass(r)||(this.elemFile.wrap(n),e.elem.next("."+r).append((t=[],layui.each(e.data,function(e,i){i="function"==typeof i?i():i,t.push('')}),t.join(""))))},M.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},M.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},M.prototype.preview=function(n){window.FileReader&&layui.each(this.chooseFiles,function(e,i){var t=new FileReader;t.readAsDataURL(i),t.onload=function(){n&&n(e,i,this.result)}})},M.prototype.upload=function(e,i){var t,n,a,o,l,u=this,s=u.config,f=s.text||{},r=u.elemFile[0],c=function(){return e||u.files||u.chooseFiles||r.files},d=function(){var a=0,o=0,l=c(),r=function(){s.multiple&&a+o===u.fileLength&&"function"==typeof s.allDone&&s.allDone({total:u.fileLength,successful:a,failed:o})},t=function(t){var n=new FormData,i=function(e){t.unified?layui.each(l,function(e,i){delete i[D]}):delete e[D]};if(layui.each(s.data,function(e,i){i="function"==typeof i?t.unified?i():i(t.index,t.file):i,n.append(e,i)}),t.unified)layui.each(l,function(e,i){i[D]||(i[D]=!0,n.append(s.field,i))});else{if(t.file[D])return;n.append(s.field,t.file),t.file[D]=!0}var e={url:s.url,type:"post",data:n,dataType:s.dataType||"json",contentType:!1,processData:!1,headers:s.headers||{},success:function(e){s.unified?a+=u.fileLength:a++,m(t.index,e),r(t.index),i(t.file)},error:function(e){s.unified?o+=u.fileLength:o++,u.msg(f.error||["Upload failed, please try again.","status: "+(e.status||"")+" - "+(e.statusText||"error")].join("
                    ")),g(t.index,e.responseText,e),r(t.index),i(t.file)}};"function"==typeof s.progress&&(e.xhr=function(){var e=F.ajaxSettings.xhr();return e.upload.addEventListener("progress",function(e){var i;e.lengthComputable&&(i=Math.floor(e.loaded/e.total*100),s.progress(i,(s.item||s.elem)[0],e,t.index))}),e}),F.ajax(e)};s.unified?t({unified:!0,index:0}):layui.each(l,function(e,i){t({index:e,file:i})})},p=function(){var n=F("#"+E);u.elemFile.parent().submit(),clearInterval(M.timer),M.timer=setInterval(function(){var e,i=n.contents().find("body");try{e=i.text()}catch(t){u.msg(f["cross-domain"]),clearInterval(M.timer),g()}e&&(clearInterval(M.timer),i.html(""),m(0,e))},30)},h=function(e){if("json"===s.force&&"object"!=typeof e)try{return{status:"CONVERTED",data:JSON.parse(e)}}catch(i){return u.msg(f["data-format-error"]),{status:"FORMAT_ERROR",data:{}}}return{status:"DO_NOTHING",data:{}}},m=function(e,i){u.elemFile.next("."+O).remove(),r.value="";var t=h(i);switch(t.status){case"CONVERTED":i=t.data;break;case"FORMAT_ERROR":return}"function"==typeof s.done&&s.done(i,e||0,function(e){u.upload(e)})},g=function(e,i,t){s.auto&&(r.value="");var n=h(i);switch(n.status){case"CONVERTED":i=n.data;break;case"FORMAT_ERROR":return}"function"==typeof s.error&&s.error(e||0,function(e){u.upload(e)},i,t)},v=s.exts,y=(n=[],layui.each(e||u.chooseFiles,function(e,i){n.push(i.name)}),n),x={preview:function(e){u.preview(e)},upload:function(e,i){var t={};t[e]=i,u.upload(t)},pushFile:function(){return u.files=u.files||{},layui.each(u.chooseFiles,function(e,i){u.files[e]=i}),u.files},resetFile:function(e,i,t){i=new File([i],t);u.files=u.files||{},u.files[e]=i},getChooseFiles:function(){return u.chooseFiles}},b={file:R.$t("upload.fileType.file"),images:R.$t("upload.fileType.image"),video:R.$t("upload.fileType.video"),audio:R.$t("upload.fileType.audio")}[s.accept]||R.$t("upload.fileType.file"),y=0===y.length?r.value.match(/[^/\\]+\..+/g)||[]:y;if(0!==y.length){switch(s.accept){case"file":layui.each(y,function(e,i){if(v&&!RegExp(".\\.("+v+")$","i").test(escape(i)))return t=!0});break;case"video":layui.each(y,function(e,i){if(!RegExp(".\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(i)))return t=!0});break;case"audio":layui.each(y,function(e,i){if(!RegExp(".\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(i)))return t=!0});break;default:layui.each(y,function(e,i){if(!RegExp(".\\.("+(v||"jpg|png|gif|bmp|jpeg|svg|webp")+")$","i").test(escape(i)))return t=!0})}if(t)return u.msg(f["check-error"]||R.$t("upload.validateMessages.fileExtensionError",{fileType:b})),r.value="";if("choose"!==i&&!s.auto||(s.choose&&s.choose(x),"choose"!==i)){if(u.fileLength=(a=0,b=c(),layui.each(b,function(){a++}),a),s.number&&u.fileLength>s.number)return u.msg("function"==typeof f["limit-number"]?f["limit-number"](s,u.fileLength):R.$t("upload.validateMessages.filesOverLengthLimit",{length:s.number})+"
                    "+R.$t("upload.validateMessages.currentFilesLength",{length:u.fileLength}));if(01024*s.size&&(i=1<=(i=s.size/1024)?i.toFixed(2)+"MB":s.size+"KB",r.value="",o=i)}),o)return u.msg("function"==typeof f["limit-size"]?f["limit-size"](s,o):R.$t("upload.validateMessages.fileOverSizeLimit",{size:o}));l=function(){if(T.ie)return(9'+e+"")},r=function(t){var n=!0;return layui.each(a.files,function(e,i){if(!(n=!(i.name===t.name)))return!0}),n},u=function(e){var t=function(e){e.ext=e.name.substr(e.name.lastIndexOf(".")+1).toLowerCase(),e.sizes=L.util.parseSize(e.size)};return e instanceof FileList?layui.each(e,function(e,i){t(i)}):t(e),e},s=function(e){var t;return(e=e||[]).length?a.files?(t=[],layui.each(e,function(e,i){r(i)&&t.push(u(i))}),t):u(e):[]};n.elem.off("upload.start").on("upload.start",function(){var e=F(this);a.config.item=e,a.elemFile[0].click()}),T.ie&&T.ie<10||n.elem.off("upload.over").on("upload.over",function(){F(this).attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){F(this).removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(e,i){var t=F(this),i=s(i.originalEvent.dataTransfer.files);t.removeAttr("lay-over"),o(i),n.auto?a.upload():l(i)}),a.elemFile.on("change",function(){var e=s(this.files);0!==e.length&&(o(e),n.auto?a.upload():l(e))}),n.bindAction.off("upload.action").on("upload.action",function(){a.upload()}),n.elem.data(f)||(n.elem.on("click",function(){a.isFile()||F(this).trigger("upload.start")}),n.drag&&n.elem.on("dragover",function(e){e.preventDefault(),F(this).trigger("upload.over")}).on("dragleave",function(e){F(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),F(this).trigger("upload.drop",e)}),n.bindAction.on("click",function(){F(this).trigger("upload.action")}),n.elem.data(f,n.id))},L.util={parseSize:function(e,i){var t,n;return i=i||2,null!=e&&e?(t="string"==typeof e?parseFloat(e):e,n=Math.floor(Math.log(t)/Math.log(1024)),(e=(e=t/Math.pow(1024,n))%1==0?e:parseFloat(e.toFixed(i)))+["Bytes","Kb","Mb","Gb","Tb","Pb","Eb","Zb","Yb"][n]):"0"},promiseLikeResolve:function(e){var i=F.Deferred();return e&&"function"==typeof e.then?e.then(i.resolve,i.reject):i.resolve(e),i.promise()}},o.that={},o.getThis=function(e){var i=o.that[e];return i||w.error(e?t+" instance with ID '"+e+"' not found":"ID argument required"),i},L.render=function(e){e=new M(e);return o.call(e)},e(t,L)});layui.define(["lay","i18n","layer","util"],function(e){"use strict";var _=layui.$,h=layui.layer,p=layui.util,O=layui.lay,l=layui.hint(),$=layui.i18n,T="form",f=".layui-form",M="layui-this",E="layui-hide",A="layui-disabled",y="layui-input-number-invalid",I=O.createSharedResizeObserver(T),v=O.ie&&8===parseFloat(O.ie)||void 0===Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"checked"),t=function(){this.config={verify:{required:function(e){if(!/[\S]+/.test(e)||e===undefined||null===e)return $.$t("form.validateMessages.required")},phone:function(e){if(e&&!/^1\d{10}$/.test(e))return $.$t("form.validateMessages.phone")},email:function(e){if(e&&!/^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(e))return $.$t("form.validateMessages.email")},url:function(e){if(e&&!/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/.test(e))return $.$t("form.validateMessages.url")},number:function(e){if(e&&isNaN(e))return $.$t("form.validateMessages.number")},date:function(e){if(e&&!/^(\d{4})[-/](\d{1}|0\d{1}|1[0-2])([-/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/.test(e))return $.$t("form.validateMessages.date")},identity:function(e){if(e&&!/(^\d{15}$)|(^\d{17}(x|X|\d)$)/.test(e))return $.$t("form.validateMessages.identity")}},autocomplete:null}},i=(t.prototype.set=function(e){return _.extend(!0,this.config,e),this},t.prototype.verify=function(e){return _.extend(!0,this.config.verify,e),this},t.prototype.getFormElem=function(e){return _(f+(e?'[lay-filter="'+e+'"]':""))},t.prototype.on=function(e,t){return layui.onevent.call(this,T,e,t)},t.prototype.val=function(e,o){return this.getFormElem(e).each(function(e,t){var i,a,n,l,r=_(this);for(i in o)O.hasOwn(o,i)&&(n=o[i],(l=r.find('[name="'+i+'"]'))[0])&&("checkbox"===(a=l[0].type)?l[0].checked=n:"radio"===a?l.each(function(){this.checked=this.value==n+""}):l.val(n))}),r.render(null,e),this.getValue(e)},t.prototype.getValue=function(e,t){t=t||this.getFormElem(e);var n={},l={},e=t.find("input,select,textarea");return layui.each(e,function(e,t){var i,a=_(this);t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name&&(/^.*\[\]$/.test(t.name)&&(i=t.name.match(/^(.*)\[\]$/g)[0],n[i]=0|n[i],i=t.name.replace(/^(.*)\[\]$/,"$1["+n[i]+++"]")),/^(checkbox|radio)$/.test(t.type)&&!t.checked||(l[i||t.name]="SELECT"===this.tagName&&"string"==typeof this.getAttribute("multiple")?a.val()||[]:this.value))}),l},t.prototype.render=function(e,t){var d=this,i=d.config,a=_(f+(t?'[lay-filter="'+t+'"]':"")),n={input:function(e){var e=e||a.find("input,textarea"),h=(i.autocomplete&&e.attr("autocomplete",i.autocomplete),function(e,t){var i=e.val(),a=Number(i),n=Number(e.attr("step"))||1,l=Number(e.attr("min")),r=Number(e.attr("max")),o=Number(e.attr("lay-precision")),s="click"!==t&&""===i,c="init"===t,u=isNaN(a),d="string"==typeof e.attr("lay-step-strictly");if(e.toggleClass(y,u),!u){if("click"===t){if("text"===e[0].type&&"string"==typeof e.attr("readonly"))return;a=!!_(this).index()?a-n:a+n}u=function(e){return((e.toString().match(/\.(\d+$)/)||[])[1]||"").length},o=0<=o?o:Math.max(u(n),u(i));s||(c||r<=(a=(a=d?Math.round(a/n)*n:a)<=l?l:a)&&(a=r),0===o?a=parseInt(a):0'),e=layui.isArray(i.value)?i.value:[i.value],e=_((a=[],layui.each(e,function(e,t){a.push('')}),a.join(""))),n=(t.append(e),i.split&&t.addClass("layui-input-split"),i.className&&t.addClass(i.className),r.next("."+u)),l=(n[0]&&n.remove(),r.parent().hasClass(s)||r.wrap('
                    '),r.next("."+c));l[0]?((n=l.find("."+u))[0]&&n.remove(),l.prepend(t),r.css("padding-right",function(){return(r.closest(".layui-input-group")[0]?0:l.outerWidth())+t.outerWidth()})):(t.addClass(c),r.after(t)),"auto"===i.show&&d(t,r.val()),"function"==typeof i.init&&i.init.call(this,r,i),r.on("input propertychange",function(){var e=this.value;"auto"===i.show&&d(t,e)}),r.on("blur",function(){"function"==typeof i.blur&&i.blur.call(this,r,i)}),e.on("click",function(){var e=r.attr("lay-filter");_(this).hasClass(A)||("function"==typeof i.click&&i.click.call(this,r,i),layui.event.call(this,T,"input-affix("+e+")",{elem:r[0],affix:o,options:i}))})},p={eye:{value:"eye-invisible",click:function(e,t){var i="LAY_FORM_INPUT_AFFIX_SHOW",a=e.data(i);e.attr("type",a?"password":"text").data(i,!a),n({value:a?"eye-invisible":"eye"})}},clear:{value:"clear",click:function(e){e.val("").focus(),d(_(this).parent(),null)},show:"auto",disabled:e},number:{value:["up","down"],split:!0,className:"layui-input-number",disabled:r.is("[disabled]"),init:function(a){var e,n,l,t,i,r;"text"!==a.attr("type")&&"text"!==a[0].type||(l=n=!(e=".lay_input_number"),t="string"==typeof a.attr("readonly"),i="string"==typeof a.attr("lay-wheel"),r=a.next(".layui-input-number").children("i"),a.attr("lay-input-mirror",a.val()),a.off(e),a.on("keydown"+e,function(e){n=!1,8!==e.keyCode&&46!==e.keyCode||(n=!0),t||2!==r.length||38!==e.keyCode&&40!==e.keyCode||(e.preventDefault(),r.eq(38===e.keyCode?0:1).click())}),a.on("input"+e+" propertychange"+e,function(e){var t,i;l||"propertychange"===e.type&&"value"!==e.originalEvent.propertyName||(n||""===(e=this.value)||"00"!==e.slice(0,2)&&!e.match(/\s/g)&&!((t=e.match(/\./g))&&1=Math.abs(e.deltaY)?e.deltaX:e.deltaY):"mousewheel"===e.type?t=-e.originalEvent.wheelDelta:"DOMMouseScroll"===e.type&&(t=e.originalEvent.detail),r.eq(0S.height()&&t<=e&&l.addClass(x+"up"),h(),s&&g.off("mousedown.lay_select_ieph").on("mousedown.lay_select_ieph",function(){m[0].__ieph=!0,setTimeout(function(){m[0].__ieph=!1},60)}),n=O.onClickOutside((a?l:g)[0],function(){p(),k&&m.val(k)},{ignore:v,detectIframe:!0,capture:!1})},p=function(e){v.parent().removeClass(x+"ed "+x+"up"),m.blur(),u&&g.children("."+N).remove(),"function"==typeof n&&(n(),n=null),a&&(l.detach(),_(window).off("resize.lay_select_resize"),I)&&I.unobserve(l[0]),e||f(m.val(),function(e){var t=y[0].selectedIndex;e&&(k=_(y[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),m.val(k||""))})},h=function(){var e,t,i=g.children("dd."+M);i[0]&&(e=i.position().top,t=g.height(),i=i.height(),t").addClass(N).attr("lay-value",n).text(n),a=(i=g.children().eq(0)).hasClass("layui-select-tips"),i[a?"after":"before"](t)):e?g.find("."+w)[0]||g.append('

                    '+$.$t("form.select.noMatch")+"

                    "):g.find("."+w).remove()},"keyup"),""===n&&(y.val(""),g.find("."+M).removeClass(M),(y[0].options[0]||{}).value||g.children("dd:eq(0)").addClass(M),g.find("."+w).remove(),u)&&g.children("."+N).remove(),void h()))},50)).on("blur",function(e){var t=y[0].selectedIndex;k=_(y[0].options[t]).prop("text"),0===t&&k===m.attr("placeholder")&&(k=""),setTimeout(function(){f(m.val(),function(e){k||m.val("")},"blur")},200)}),g.on("click","dd",function(){var e,t,i=_(this),a=i.attr("lay-value"),n=y.attr("lay-filter");return i.hasClass(A)||(u&&i.hasClass(N)&&(t=(e=_("
                    "].join(""));i.after(l),function(i,a){var n=_(this),e=n.attr("lay-skin")||"primary",t="switch"===e,e="primary"===e;n.off(u).on(u,function(e){var t=n.attr("lay-filter");n[0].disabled||(n[0].indeterminate=!!n[0].indeterminate,n[0].checked=!!n[0].checked,layui.event.call(n[0],T,a[2]+"("+t+")",{elem:n[0],value:n[0].value,othis:i}))}),i.on("click",function(){n.closest("label").length||n.trigger("click")}),d.syncAppearanceOnPropChanged(this,"checked",function(){var e;t&&(e=(i.next("*[lay-checkbox]")[0]?i.next().html():n.attr("title")||"").split("|"),i.children("div").html(!this.checked&&e[1]||e[0])),i.toggleClass(a[1],this.checked)}),e&&d.syncAppearanceOnPropChanged(this,"indeterminate",function(){this.indeterminate?i.children("."+c.ICON).removeClass(c.ICON_OK).addClass(c.SUBTRA):i.children("."+c.ICON).removeClass(c.SUBTRA).addClass(c.ICON_OK)})}.call(this,l,r)})},radio:function(e){var s="layui-form-radio",c=["layui-icon-radio","layui-icon-circle"],e=e||a.find("input[type=radio]"),u="click.lay_radio_click";e.each(function(e,t){var i=_(this),a=i.next("."+s),n=this.disabled,l=i.attr("lay-skin");if(i.closest("[lay-ignore]").length)return i.show();v&&m.call(t,"lay-form-sync-checked",t.checked),a[0]&&a.remove();var a=p.escape(t.title||""),r=[],o=(i.next("[lay-radio]")[0]&&(a=(o=i.next()).html()||"",1",'',"
                    "+a+"
                    ",""].join("")));i.after(o),function(i){var a=_(this),n="layui-anim-scaleSpring";a.off(u).on(u,function(){var e=a.attr("lay-filter");a[0].disabled||(a[0].checked=!0,layui.event.call(a[0],T,"radio("+e+")",{elem:a[0],value:a[0].value,othis:i}))}),i.on("click",function(){a.closest("label").length||a.trigger("click")}),d.syncAppearanceOnPropChanged(this,"checked",function(){var e,t=this;t.checked?(i.addClass(s+"ed"),i.children(".layui-icon").addClass(n+" "+c[0]),e=a.parents(f).find("input[name="+t.name.replace(/(\.|#|\[|\])/g,"\\$1")+"]"),layui.each(e,function(){t!==this&&(this.checked=!1)})):(i.removeClass(s+"ed"),i.children(".layui-icon").removeClass(n+" "+c[0]).addClass(c[1]))})}.call(this,o)})}},t=function(){layui.each(n,function(e,t){t()})};return"object"===layui.type(e)?_(e).is(f)?(a=_(e),t()):e.each(function(e,t){var i=_(t);i.closest(f).length&&("SELECT"===t.tagName?n.select(i):"INPUT"===t.tagName&&("checkbox"===(t=t.type)||"radio"===t?n[t](i):n.input(i)))}):e?n[e]?n[e]():l.error('[form] "'+e+'" is an unsupported form element type'):t(),d},t.prototype.syncAppearanceOnPropChanged=v?function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,O.extend({},a,{get:function(){return"string"==typeof this.getAttribute("lay-form-sync-"+t)},set:function(e){m.call(this,"lay-form-sync-"+t,e),i.call(this)}}))}:function(e,t,i){var a=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,t);Object.defineProperty(e,t,O.extend({},a,{get:function(){return a.get.call(this)},set:function(e){a.set.call(this,e),i.call(this)}}))},t.prototype.validate=function(e){var u,d=this.config.verify,p="layui-form-danger";return!(e=_(e))[0]||(e.attr("lay-verify")!==undefined||!1!==this.validate(e.find("*[lay-verify]")))&&(layui.each(e,function(e,r){var o=_(this),t=(o.attr("lay-verify")||"").split("|"),s=o.attr("lay-vertype"),c="string"==typeof(c=o.val())?_.trim(c):c;if(o.removeClass(p),layui.each(t,function(e,t){var i="",a=d[t];if(a){var n="function"==typeof a?i=a(c,r):!a[0].test(c),l="select"===r.tagName.toLowerCase()||/^(checkbox|radio)$/.test(r.type),i=i||a[1];if("required"===t&&(i=o.attr("lay-reqtext")||i),n)return"tips"===s?h.tips(i,!o.closest("[lay-ignore]").length&&l?o.next():o,{tips:1}):"alert"===s?h.alert(i,{title:$.$t("form.verifyErrorPromptTitle"),shadeClose:!0}):/\b(string|number)\b/.test(typeof i)&&h.msg(i,{icon:5,shift:6}),setTimeout(function(){(l?o.next().find("input"):r).focus()},7),o.addClass(p),u=!0}}),u)return u}),!u)},t.prototype.submit=function(e,t){var i={},a=_(this),e="string"==typeof e?e:a.attr("lay-filter"),n=this.getFormElem?this.getFormElem(e):a.parents(f).eq(0),l=n.find("*[lay-verify]");return!!r.validate(l)&&(i=r.getValue(null,n),l={elem:this.getFormElem?window.event&&window.event.target:this,form:(this.getFormElem?n:a.parents("form"))[0],field:i},"function"==typeof t&&t(l),layui.event.call(this,T,"submit("+e+")",l))});function m(e,t){var i=!!t,t=2===arguments.length&&!t;return null!==this.getAttribute(e)?i||(this.removeAttribute(e),!1):!t&&(this.setAttribute(e,""),!0)}var g=["-",".","e","E","+"];var r=new t,t=_(document),S=_(window);_(function(){r.render()}),t.on("reset",f,function(){var e=_(this).attr("lay-filter");setTimeout(function(){r.render(null,e)},50)}),t.on("submit",f,i).on("click","*[lay-submit]",i),e(T,r)});layui.define(["lay","i18n","laytpl","laypage","form","util"],function(c){"use strict";var f=layui.$,d=layui.lay,m=layui.laytpl,p=layui.laypage,g=layui.layer,i=layui.form,v=layui.util,b=layui.hint(),x=layui.device(),s=layui.i18n,w={config:{checkName:"LAY_CHECKED",indexName:"LAY_INDEX",initIndexName:"LAY_INDEX_INIT",numbersName:"LAY_NUM",disabledName:"LAY_DISABLED"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){return this.config=f.extend({},this.config,e),this},on:function(e,t){return layui.onevent.call(this,R,e,t)}},k=function(){var a=this,e=a.config,i=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){w.reloadData(i,e,t)},setColsWidth:function(){a.setColsWidth.call(a)},resize:function(){a.resize.call(a)}}},C=function(e){var t=k.that[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},l=function(e){var t=k.config[e];return t||b.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},T=function(e){var t=this.config||{},a=(e=e||{}).item3,i=e.content;"numbers"===a.type&&(i=e.tplData[w.config.numbersName]);("escape"in a?a:t).escape&&(i=v.escape(i));t=e.text&&a.exportTemplet||a.templet||a.toolbar;return t&&(i="function"==typeof t?t.call(a,e.tplData,e.obj):m(function(e){try{return d(e).html()}catch(t){return e}}(t)||String(i)).render(f.extend({LAY_COL:a},e.tplData))),e.text?f("
                    "+i+"
                    ").text():i},R="table",_="lay-"+R+"-id",u=".layui-table",N="layui-hide",h="layui-hide-v",y="layui-none",F="layui-table-view",P=".layui-table-header",W=".layui-table-body",I=".layui-table-fixed",O=".layui-table-fixed-r",B=".layui-table-pageview",D=".layui-table-sort",S="layui-table-checked",H="layui-table-edit",E="layui-table-hover",K="laytable-cell-group",L="layui-table-col-special",M="layui-table-tool-panel",A="layui-table-expanded",G="layui-table-disabled-transition",r="layui-table-fixed-height-patch",z="LAY_TABLE_MOVE_DICT",n=d.createSharedResizeObserver(R),e=function(e){var t=["{{# var colspan = layui.type(item2.colspan2) === 'number' ? item2.colspan2 : item2.colspan; }}",'{{# if(colspan){ }} colspan="{{=colspan}}"{{# } }}','{{# if(item2.rowspan){ }} rowspan="{{=item2.rowspan}}"{{# } }}'].join("");return['"," "," {{# layui.each(d.data.cols, function(i1, item1){ }}"," "," {{# layui.each(item1, function(i2, item2){ }}",' {{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}',' {{# if(item2.fixed === "right"){ right = true; } }}',(e=e||{}).fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""," {{# var isSort = !(item2.colGroup) && item2.sort; }}",' ",e.fixed?" {{# } }}":""," {{# }); }}"," "," {{# }); }}"," ","
                    ' + item2.title + '').text() }}\"{{# } }}>",'
                    ',' {{# if(item2.type === "checkbox"){ }}',' "," {{# } else { }}",' {{- item2.title || "" }}'," {{# if(isSort){ }}",' ',' ',' '," "," {{# } }}"," {{# } }}","
                    ","
                    "].join("\n")},t=['"," ","
                    "].join("\n"),Y=["{{# if(d.data.toolbar){ }}",'
                    ','
                    ','
                    ',"
                    ","{{# } }}","",'
                    '," {{# if(d.data.loading){ }}",'
                    ','
                    ',' {{# if(typeof d.data.loading === "string"){ }}'," {{- d.data.loading }}"," {{# } else { }}",' '," {{# } }}","
                    ","
                    "," {{# } }}",""," {{# var left, right; }}",""," \x3c!-- \u8868\u5934\u533a\u57df --\x3e",'
                    ',e(),"
                    ",""," \x3c!-- \u8868\u4f53\u533a\u57df --\x3e",'
                    ',t,"
                    ",""," {{# if(left){ }}"," \x3c!-- \u5de6\u56fa\u5b9a\u5217 --\x3e",'
                    ','
                    ',e({fixed:!0}),"
                    ",'
                    ',t,"
                    ","
                    "," {{# } }}",""," {{# if(right){ }}"," \x3c!-- \u53f3\u56fa\u5b9a\u5217 --\x3e",'
                    ','
                    ',e({fixed:"right"}),'
                    ',"
                    ",'
                    ',t,"
                    ","
                    "," {{# } }}","","
                    ","","{{# if(d.data.totalRow){ }}",'
                    ',' "," "," "," "," "," ","
                    ",' ',"
                    ","
                    ","{{# } }}","",'
                    ','
                    ',"
                    "].join("\n"),o=f(window),j=f(document),a=function(e){var t=this;t.index=++w.index,t.config=f.extend({},t.config,w.config,e),t.unobserveResize=f.noop,t.render()},$=(a.prototype.config={limit:10,loading:!0,escape:!0,cellMinWidth:60,cellMaxWidth:Number.MAX_VALUE,editTrigger:"click",defaultToolbar:["filter","exports","print"],defaultContextmenu:!0,autoSort:!0,cols:[]},a.prototype.render=function(e){var t=this,a=t.config,i=(a.elem=f(a.elem),a.where=a.where||{},a.id="id"in a?a.id:a.elem.attr("id")||t.index);if(k.that[i]&&k.that[i]!==t&&k.that[i].dispose(),k.that[i]=t,(k.config[i]=a).request=f.extend({pageName:"page",limitName:"limit"},a.request),a.response=f.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),null!==a.page&&"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,t.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),a.text=f.extend(!0,{none:s.$t("table.noData")},a.text),!a.elem[0])return t;if(a.elem.attr("lay-filter")||a.elem.attr("lay-filter",a.id),"reloadData"===e)return t.pullData(t.page,{type:"reloadData"});a.index=t.index,t.key=a.id||a.index,t.setInit(),a.height&&/^full-.+$/.test(a.height)?(t.fullHeightGap=a.height.split("-")[1],a.height=o.height()-(parseFloat(t.fullHeightGap)||0)):a.height&&/^#\w+\S*-.+$/.test(a.height)?(i=a.height.split("-"),t.parentHeightGap=i.pop(),t.parentDiv=i.join("-"),a.height=f(t.parentDiv).height()-(parseFloat(t.parentHeightGap)||0)):"function"==typeof a.height&&(t.customHeightFunc=a.height,a.height=t.customHeightFunc());var l,e=a.elem,i=e.next("."+F),n=t.elem=f("
                    ");n.addClass((l=[F,F+"-"+t.index,"layui-form","layui-border-box"],a.className&&l.push(a.className),l.join(" "))).attr(((l={"lay-filter":"LAY-TABLE-FORM-DF-"+t.index,style:(l=[],a.width&&l.push("width:"+a.width+"px;"),l.join(""))})[_]=a.id,l)).html(m(Y,{open:"{{",close:"}}",tagStyle:"legacy"}).render({data:a,index:t.index,i18nMessages:{table_sort_asc:s.$t("table.sort.asc"),table_sort_desc:s.$t("table.sort.desc")}})),t.renderStyle(),i[0]&&i.remove(),e.after(n),t.layTool=n.find(".layui-table-tool"),t.layBox=n.find(".layui-table-box"),t.layHeader=n.find(P),t.layMain=n.find(".layui-table-main"),t.layBody=n.find(W),t.layFixed=n.find(I),t.layFixLeft=n.find(".layui-table-fixed-l"),t.layFixRight=n.find(O),t.layTotal=n.find(".layui-table-total"),t.layPage=n.find(".layui-table-page"),t.renderToolbar(),t.renderPagebar(),t.fullSize(),t.setColsWidth({isInit:!0}),t.pullData(t.page,{done:function(){t.observeResize()}}),t.events()},a.prototype.initOpts=function(e){e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||{checkbox:50,radio:50,space:30,numbers:60}[e.type])},a.prototype.setInit=function(e){var n,a,r=this,d=r.config;if(d.clientWidth=d.width||(n=function(e){var t,a;e=e||d.elem.parent(),t=r.getContentWidth(e);try{a="none"===e.css("display")}catch(l){}var i=e.parent();return e[0]&&i&&i[0]&&(!t||a)?n(i):t})(),"width"===e)return d.clientWidth;d.height=d.maxHeight||d.height,d.css&&-1===d.css.indexOf(F)&&(a=d.css.split("}"),layui.each(a,function(e,t){t&&(a[e]="."+F+"-"+r.index+" "+t)}),d.css=a.join("}"));var c=function(a,e,i,l){var n,o;l?(l.key=[d.index,a,i].join("-"),l.colspan=l.colspan||0,l.rowspan=l.rowspan||0,r.initOpts(l),(n=a+(parseInt(l.rowspan)||1)) td:hover > .layui-table-cell{overflow: auto;}"].concat(x.ie?[".layui-table-edit{height: "+i+";}","td[data-edit]:hover:after{height: "+i+";}"]:[]),function(e,t){t&&o.push(a+" "+t)})),l.css&&o.push(l.css),o.push("."+r+"{height:auto;}"),d.style({target:this.elem[0],text:o.join(""),id:"DF-table-"+n})},a.prototype.renderToolbar=function(){var l,o=this,e=o.config,r=e.elem.attr("lay-filter"),t=['
                    ','
                    ','
                    '].join(""),a=o.layTool.find(".layui-table-tool-temp"),n=("default"===e.toolbar?a.html(t):"string"==typeof e.toolbar&&(t=f(e.toolbar).html()||"")&&a.html(m(t).render(e)),{filter:{title:s.$t("table.tools.filter.title"),layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols",onClick:function(e){var a,n=e.config;(0,e.openPanel)({list:(a=[],o.eachCols(function(e,t){t.field&&"normal"==t.type&&a.push('
                  • "+(t.fieldTitle||t.title||t.field)+"").text())+'" lay-filter="LAY_TABLE_TOOL_COLS">
                  • ')}),a.join("")),done:function(){i.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var e=f(e.elem),t=this.checked,a=e.data("key"),i=o.col(a),l=i.hide,e=e.data("parentkey");i.key&&(i.hide=!t,o.elem.find('*[data-key="'+a+'"]')[t?"removeClass":"addClass"](N),l!=i.hide&&o.setParentCol(!t,e),o.resize(),layui.event.call(this,R,"colToggled("+r+")",{col:i,config:n}))})}})}},exports:{title:s.$t("table.tools.export.title"),layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export",onClick:function(e){var t=e.data,a=e.config,i=e.openPanel,e=e.elem;if(!t.length)return g.tips(s.$t("table.tools.export.noDataPrompt"),e,{tips:3});x.ie?g.tips(s.$t("table.tools.export.compatPrompt"),e,{tips:3}):i({list:['
                  • '+s.$t("table.tools.export.csvText")+"
                  • "].join(""),done:function(e,t){t.on("click",function(){var e=f(this).data("type");w.exportFile.call(o,a.id,null,e)})}})}},print:{title:s.$t("table.tools.print.title"),layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print",onClick:function(e){var t=e.data,e=e.elem;if(!t.length)return g.tips(s.$t("table.tools.print.noDataPrompt"),e,{tips:3});var t=window.open("about:blank","_blank"),e=[""].join(""),a=f(o.layHeader.html());a.append(o.layMain.find("table").html()),a.append(o.layTotal.find("table").html()),a.find("th.layui-table-patch").remove(),a.find("thead>tr>th."+L).filter(function(e,t){return!f(t).children("."+K).length}).remove(),a.find("tbody>tr>td."+L).remove(),t.document.write(e+a.prop("outerHTML")),t.document.close(),layui.device("edg").edg?(t.onafterprint=t.close,t.print()):(t.print(),t.close())}}});"object"==typeof e.defaultToolbar&&(l=[],e.defaultToolbar=f.map(e.defaultToolbar,function(e,t){var a="string"==typeof e,i=a?n[e]:e;return i&&(!(i=i.name&&n[i.name]?f.extend({},n[i.name],i):i).name&&a&&(i.name=e),l.push('
                    ')),i}),o.layTool.find(".layui-table-tool-self").html(l.join("")))},a.prototype.renderPagebar=function(){var e,t=this.config,a=this.layPagebar=f('
                    ');t.pagebar&&((e=f(t.pagebar).html()||"")&&a.append(m(e).render(t)),this.layPage.append(a))},a.prototype.setParentCol=function(e,t){var a=this.config,i=this.layHeader.find('th[data-key="'+t+'"]'),l=parseInt(i.attr("colspan"))||0;i[0]&&(t=t.split("-"),t=a.cols[t[1]][t[2]],e?l--:l++,i.attr("colspan",l),i[l?"removeClass":"addClass"](N),t.colspan2=l,t.hide=l<1,a=i.data("parentkey"))&&this.setParentCol(e,a)},a.prototype.setColsPatch=function(){var a=this,e=a.config;layui.each(e.cols,function(e,t){layui.each(t,function(e,t){t.hide&&a.setParentCol(t.hide,t.parentKey)})})},a.prototype.setGroupWidth=function(i){var e,l=this;l.config.cols.length<=1||((e=l.layHeader.find((i?"th[data-key="+i.data("parentkey")+"]>":"")+"."+K)).css("width",0),layui.each(e.get().reverse(),function(){var e=f(this),t=e.parent().data("key"),a=0;l.layHeader.eq(0).find("th[data-parentkey="+t+"]").width(function(e,t){f(this).hasClass(N)||0o.layMain.prop("clientHeight")&&(e.style.width=parseFloat(e.style.width)-i+"px")}),!p&&y?h.width(o.getContentWidth(l)):h.width("auto"),o.setGroupWidth()},a.prototype.resize=function(e){var t=this;if(e){if(0===e.contentRect.height&&0===e.contentRect.width)return;if(e.target._lay_lastSize&&Math.abs(e.target._lay_lastSize.height-e.contentRect.height)<2&&Math.abs(e.target._lay_lastSize.width-e.contentRect.width)<2)return;e.target._lay_lastSize={height:e.contentRect.height,width:e.contentRect.width}}t.layMain&&("isConnected"in t.layMain[0]?t.layMain[0].isConnected:f.contains(document.body,t.layMain[0]))&&(t.fullSize(),t.setColsWidth(),t.scrollPatch())},a.prototype.reload=function(e,t,a){var i=this;e=e||{},delete i.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete i.config[e]}),i.config=f.extend(t,{},i.config,e),"reloadData"!==a&&(layui.each(i.config.cols,function(e,t){layui.each(t,function(e,t){delete t.colspan2})}),delete i.config.HAS_SET_COLS_PATCH),i.render(a)},a.prototype.errorView=function(e){var t=this,a=t.layMain.find("."+y),e=f('
                    '+(e||"Error")+"
                    ");a[0]&&(t.layNone.remove(),a.remove()),t.layFixed.addClass(N),t.layMain.find("tbody").html(""),t.layMain.append(t.layNone=e),t.layTotal.addClass(h),t.layPage.find(B).addClass(h),w.cache[t.key]=[],t.syncCheckAll(),t.renderForm(),t.setColsWidth(),t.loading(!1)},a.prototype.page=1,a.prototype.pullData=function(i,l){var e,t,n=this,o=n.config,a=(o.HAS_SET_COLS_PATCH||n.setColsPatch(),o.HAS_SET_COLS_PATCH=!0,o.request),r=o.response,d=function(){"object"==typeof o.initSort&&n.sort({field:o.initSort.field,type:o.initSort.type,reloadType:l.type})},c=function(e,t){n.setColsWidth(),n.loading(!1),"function"==typeof o.done&&o.done(e,i,e[r.countName],t),"function"==typeof l.done&&l.done()};l=l||{},"function"==typeof o.before&&o.before(o),n.startTime=(new Date).getTime(),l.renderData?((e={})[r.dataName]=w.cache[n.key],e[r.countName]=o.url?"object"===layui.type(o.page)?o.page.count:e[r.dataName].length:o.data.length,"object"==typeof o.totalRow&&(e[r.totalRowName]=f.extend({},n.totalRow)),n.renderData({res:e,curr:i,count:e[r.countName],type:l.type,sort:!0}),c(e,"renderData")):o.url?(t={},o.page&&(t[a.pageName]=i,t[a.limitName]=o.limit),a=f.extend(t,o.where),o.contentType&&0==o.contentType.indexOf("application/json")&&(a=JSON.stringify(a)),n.loading(!0),t={type:o.method||"get",url:o.url,contentType:o.contentType,data:a,dataType:o.dataType||"json",jsonpCallback:o.jsonpCallback,headers:o.headers||{},complete:"function"==typeof o.complete?o.complete:undefined,success:function(e){var t,a;(e="function"==typeof o.parseData?o.parseData(e)||e:e)[r.statusName]!=r.statusCode?n.errorView(e[r.msgName]||s.$t("table.dataFormatError",{statusName:r.statusName,statusCode:r.statusCode})):(t=e[r.countName],(a=Math.ceil(t/o.limit)||1)','
                    "+function(){var e,t=f.extend(!0,{LAY_COL:l},o),a=w.config.checkName,i=w.config.disabledName;switch(l.type){case"checkbox":return'';case"radio":return'';case"numbers":return c}return l.toolbar?m(f(l.toolbar).html()||"").render(t):T.call(s,{item3:l,content:n,tplData:t})}(),"
                    "].join(""),i.push(e),l.fixed&&"right"!==l.fixed&&r.push(e),"right"===l.fixed&&d.push(e))}),e=['data-index="'+e+'"'],o[w.config.checkName]&&e.push('class="'+S+'"'),e=e.join(" "),h.push(""+i.join("")+""),y.push(""+r.join("")+""),p.push(""+d.join("")+""))}),{trs:h,trs_fixed:y,trs_fixed_r:p}},w.getTrHtml=function(e,t){e=C(e);return e.getTrHtml(t,null,e.page)},a.prototype.renderData=function(e){var a=this,i=a.config,t=e.res,l=e.curr,n=a.count=e.count,o=e.sort,r=t[i.response.dataName]||[],t=t[i.response.totalRowName],d=[],c=[],s=[],u=function(){if(!o&&a.sortKey)return a.sort({field:a.sortKey.field,type:a.sortKey.sort,pull:!0,reloadType:e.type});a.getTrHtml(r,o,l,{trs:d,trs_fixed:c,trs_fixed_r:s}),"fixed"===i.scrollPos&&"reloadData"===e.type||a.layBody.scrollTop(0),"reset"===i.scrollPos&&a.layBody.scrollLeft(0),a.layMain.find("."+y).remove(),a.layMain.find("tbody").html(d.join("")),a.layFixLeft.find("tbody").html(c.join("")),a.layFixRight.find("tbody").html(s.join("")),a.syncCheckAll(),a.renderForm(),a.fullSize(),a.haveInit?a.scrollPatch():setTimeout(function(){a.scrollPatch()},50),a.haveInit=!0,a.needSyncFixedRowHeight&&a.calcFixedRowHeight(),g.close(a.tipsIndex)};return w.cache[a.key]=r,a.layTotal[0==r.length?"addClass":"removeClass"](h),a.layPage[i.page||i.pagebar?"removeClass":"addClass"](N),a.layPage.find(B)[!i.page||0==n||0===r.length&&1==l?"addClass":"removeClass"](h),0===r.length?a.errorView(i.text.none):(a.layFixLeft.removeClass(N),o?u():(u(),a.renderTotal(r,t),a.layTotal&&a.layTotal.removeClass(N),void(i.page&&(i.page=f.extend({elem:"layui-table-page"+i.index,count:n,limit:i.limit,limits:i.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(a.page=e.curr,i.limit=e.limit,a.pullData(e.curr))}},i.page),i.page.count=n,p.render(i.page)))))},w.renderData=function(e){e=C(e);e&&e.pullData(e.page,{renderData:!0,type:"reloadData"})},a.prototype.renderTotal=function(e,o){var r,d=this,c=d.config,s={};c.totalRow&&(layui.each(e,function(e,i){"array"===layui.type(i)&&0===i.length||d.eachCols(function(e,t){var e=t.field||e,a=i[e];t.totalRow&&(s[e]=(s[e]||0)+(parseFloat(a)||0))})}),d.dataTotal=[],r=[],d.eachCols(function(e,t){var e=t.field||e,a=o&&o[t.field],i="totalRowDecimals"in t?t.totalRowDecimals:2,i=s[e]?parseFloat(s[e]||0).toFixed(i):"",i=(n=t.totalRowText||"",(l={LAY_COL:t})[e]=i,l=t.totalRow&&T.call(d,{item3:t,content:i,tplData:l})||n,a||l),l="string"==typeof(n=t.totalRow||c.totalRow)?m(n).render(f.extend({TOTAL_NUMS:a||s[e],TOTAL_ROW:o||{},LAY_COL:t},t)):i,n=(t.field&&d.dataTotal.push({field:t.field,total:f("
                    "+l+"
                    ").text()}),['','
                    "+l,"
                    "].join(""));r.push(n)}),e=d.layTotal.find(".layui-table-patch"),d.layTotal.find("tbody").html(""+r.join("")+(e.length?e.get(0).outerHTML:"")+""))},a.prototype.getColElem=function(e,t){return e.eq(0).find(".laytable-cell-"+t+":eq(0)")},a.prototype.renderForm=function(e){var t=this.elem.attr("lay-filter");i.render(e,t)},a.prototype.renderFormByElem=function(a){layui.each(["input","select"],function(e,t){i.render(a.find(t))})},a.prototype.syncCheckAll=function(){var a,e=this,i=e.config,t=e.layHeader.find('input[name="layTableCheckbox"]'),l=w.checkStatus(e.key);t[0]&&(a=l.isAll,e.eachCols(function(e,t){"checkbox"===t.type&&(t[i.checkName]=a)}),t.prop({checked:l.isAll,indeterminate:!l.isAll&&l.data.length}))},a.prototype.setRowActive=function(e,t,a){e=this.layBody.find('tr[data-index="'+e+'"]');if(t=t||"layui-table-click",a)return e.removeClass(t);e.addClass(t),e.siblings("tr").removeClass(t)},a.prototype.setRowChecked=function(i){var a,e,l,t,n,o,r,d=this,c=d.config,s="all"===i.index,u="array"===layui.type(i.index),h=s||u;c.tree&&c.tree.view||h&&(d.layBox.addClass(G),"radio"===i.type)||(u&&(a={},layui.each(i.index,function(e,t){a[t]=!0}),i.index=a),e=d.layBody.children(".layui-table").children("tbody"),r=h?"tr":'tr[data-index="'+i.index+'"]',r=e.children(r),e=s?r:r.filter(u?function(){var e=f(this).data("index");return i.index[e]}:'[data-index="'+i.index+'"]'),i=f.extend({type:"checkbox"},i),l=w.cache[d.key],t="checked"in i,n=function(e){return"radio"===i.type||(t?i.checked:!e)},e.each(function(){var e=f(this),t=e.attr("data-index"),a=l[t];t&&"array"!==layui.type(a)&&!a[c.disabledName]&&(a=a[c.checkName]=n(e.hasClass(S)),e.toggleClass(S,!!a),"radio"===i.type)&&(o=t,e.siblings().removeClass(S))}),o&&layui.each(l,function(e,t){Number(o)!==Number(e)&&delete t[c.checkName]}),r=(u=(s=e.children("td").children(".layui-table-cell").children('input[lay-type="'+({radio:"layTableRadio",checkbox:"layTableCheckbox"}[i.type]||"checkbox")+'"]:not(:disabled)')).last()).closest(O),("radio"===i.type&&r.hasClass(N)?s.first():s).prop("checked",n(u.prop("checked"))),d.syncCheckAll(),h&&setTimeout(function(){d.layBox.removeClass(G)},100))},a.prototype.sort=function(l){var e,t=this,a={},i=t.config,n=i.elem.attr("lay-filter"),o=w.cache[t.key];"string"==typeof(l=l||{}).field&&(r=l.field,t.layHeader.find("th").each(function(e,t){var a=f(this),i=a.data("field");if(i===l.field)return l.field=a,r=i,!1}));try{var r=r||l.field.data("field"),d=l.field.data("key");if(t.sortKey&&!l.pull&&r===t.sortKey.field&&l.type===t.sortKey.sort)return;var c=t.layHeader.find("th .laytable-cell-"+d).find(D);t.layHeader.find("th").find(D).removeAttr("lay-sort"),c.attr("lay-sort",l.type||null),t.layFixed.find("th")}catch(s){b.error("Table modules: sort field '"+r+"' not matched")}t.sortKey={field:r,sort:l.type},i.autoSort&&("asc"===l.type?e=layui.sort(o,r,null,!0):"desc"===l.type?e=layui.sort(o,r,!0,!0):(e=layui.sort(o,w.config.initIndexName,null,!0),delete t.sortKey,delete i.initSort)),a[i.response.dataName]=e||o,t.renderData({res:a,curr:t.page,count:t.count,sort:!0,type:l.reloadType}),l.fromEvent&&(i.initSort={field:r,type:l.type},layui.event.call(l.field,R,"sort("+n+")",f.extend({config:i},i.initSort)))},a.prototype.loading=function(e){this.config.loading&&this.layBox.find(".layui-table-init").toggleClass(N,!e)},a.prototype.cssRules=function(t,a){var e=this.elem.children("style")[0];d.getStyleRules(e,function(e){if(e.selectorText===".laytable-cell-"+t)return a(e),!0})},a.prototype.fullSize=function(){var e,a,i=this,t=i.config,l=t.height;i.fullHeightGap?(l=o.height()-i.fullHeightGap)<135&&(l=135):i.parentDiv&&i.parentHeightGap?(l=f(i.parentDiv).height()-i.parentHeightGap)<135&&(l=135):i.customHeightFunc&&(l=i.customHeightFunc())<135&&(l=135),1
                    ')).find("div").css({width:a}),e.find("tr").append(t)):e.find(".layui-table-patch").remove()};n(e.layHeader),n(e.layTotal);n=e.layMain.height()-i;e.layFixed.find(W).css("height",t.height()>=n?n:"auto").scrollTop(e.layMain.scrollTop()),e.layFixRight[w.cache[e.key]&&w.cache[e.key].length&&0');a.html(t),s.height&&a.css("max-height",s.height-(c.layTool.outerHeight()||50)),i.find("."+M)[0]||i.append(a),c.renderForm(),a.on("click",function(e){layui.stope(e)}),e.done&&e.done(a,t)};layui.stope(e),j.trigger("table.tool.panel.remove"),g.close(c.tipsIndex),layui.each(s.defaultToolbar,function(e,t){if(t.layEvent===a)return"function"==typeof t.onClick&&t.onClick({data:l,config:s,openPanel:n,elem:i}),!0}),layui.event.call(this,R,"toolbar("+o+")",f.extend({event:a,config:s},{}))}),c.layHeader.on("click","*[lay-event]",function(e){var t=f(this),a=t.attr("lay-event"),t=t.closest("th").data("key"),t=c.col(t);layui.event.call(this,R,"colTool("+o+")",f.extend({event:a,config:s,col:t},{}))}),c.layPagebar.on("click","*[lay-event]",function(e){var t=f(this).attr("lay-event");layui.event.call(this,R,"pagebar("+o+")",f.extend({event:t,config:s},{}))}),e.on("mousemove",function(e){var t=f(this),a=t.offset().left,e=e.clientX-a;t.data("unresize")||k.eventMoveElem||(d.allowResize=t.width()-e<=10,r.css("cursor",d.allowResize?"col-resize":""))}).on("mouseleave",function(){k.eventMoveElem||(d.allowResize=!1,r.css("cursor",""))}).on("mousedown",function(e){var t,a=f(this);d.allowResize&&(t=a.data("key"),e.preventDefault(),d.offset=[e.clientX,e.clientY],c.cssRules(t,function(e){var t=e.style.width||a.outerWidth();d.rule=e,d.ruleWidth=parseFloat(t),d.minWidth=a.data("minwidth")||s.cellMinWidth,d.maxWidth=a.data("maxwidth")||s.cellMaxWidth}),a.data(z,d),k.eventMoveElem=a)}),k.docEvent||j.on("mousemove",function(e){var t,a;k.eventMoveElem&&(t=k.eventMoveElem.data(z)||{},k.eventMoveElem.data("resizing",1),e.preventDefault(),t.rule)&&(e=t.ruleWidth+e.clientX-t.offset[0],a=k.eventMoveElem.closest("."+F).attr(_),a=C(a))&&((e=et.maxWidth&&(e=t.maxWidth),t.rule.style.width=e+"px",a.setGroupWidth(k.eventMoveElem),g.close(c.tipsIndex))}).on("mouseup",function(e){var t,a,i,l,n;k.eventMoveElem&&(i=(t=k.eventMoveElem).closest("."+F).attr(_),a=C(i))&&(i=t.data("key"),l=a.col(i),n=a.config.elem.attr("lay-filter"),d={},r.css("cursor",""),a.scrollPatch(),t.removeData(z),delete k.eventMoveElem,a.cssRules(i,function(e){l.width=parseFloat(e.style.width),layui.event.call(t[0],R,"colResized("+n+")",{col:l,config:a.config})}))}),k.docEvent=!0,e.on("click",function(e){var t=f(this),a=t.find(D),i=a.attr("lay-sort");if(!f(e.target).closest("[lay-event]")[0]){if(!a[0]||1===t.data("resizing"))return t.removeData("resizing");c.sort({field:t,type:"asc"===i?"desc":"desc"===i?null:"asc",fromEvent:!0})}}).find(D+" .layui-edge ").on("click",function(e){var t=f(this),a=t.index(),t=t.parents("th").eq(0).data("field");layui.stope(e),0===a?c.sort({field:t,type:"asc",fromEvent:!0}):c.sort({field:t,type:"desc",fromEvent:!0})}),c.commonMember=function(e){var a=f(this).parents("tr").eq(0).data("index"),t=c.layBody.find('tr[data-index="'+a+'"]'),i=(w.cache[c.key]||[])[a]||{},l={tr:t,config:s,data:w.clearCacheKey(i),dataCache:i,index:a,del:function(){w.cache[c.key][a]=[],t.remove(),c.scrollPatch()},update:function(e,t){c.updateRow({index:a,data:e=e||{},related:t},function(e,t){l.data[e]=t})},setRowChecked:function(e){c.setRowChecked(f.extend({index:a},e))}};return f.extend(l,e)}),t=(c.elem.on("click",'input[name="layTableCheckbox"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t.parents("tr").eq(0).data("index"),l=t[0].checked,n="layTableAllChoose"===t.attr("lay-filter");t[0].disabled||(n?c.setRowChecked({index:"all",checked:l}):c.setRowChecked({index:i,checked:l}),layui.stope(e),layui.event.call(t[0],R,"checkbox("+o+")",h.call(t[0],{checked:l,type:n?"all":"one",getCol:function(){return c.col(a.data("key"))}})))}),c.elem.on("click",'input[lay-type="layTableRadio"]+',function(e){var t=f(this),a=t.closest("td"),t=t.prev(),i=t[0].checked,l=t.parents("tr").eq(0).data("index");if(layui.stope(e),t[0].disabled)return!1;c.setRowChecked({type:"radio",index:l}),layui.event.call(t[0],R,"radio("+o+")",h.call(t[0],{checked:i,getCol:function(){return c.col(a.data("key"))}}))}),c.layBody.on("mouseenter","tr",function(){var e=f(this),t=e.index();e.data("off")||((e=c.layBody.find("tr:eq("+t+")")).addClass(E),c.needSyncFixedRowHeight&&c.fixedRowHeightPatchOnHover(this,e,!0))}).on("mouseleave","tr",function(){var e=f(this),t=e.index();e.data("off")||((e=c.layBody.find("tr:eq("+t+")")).removeClass(E),c.needSyncFixedRowHeight&&c.fixedRowHeightPatchOnHover(this,e,!1))}).on("click","tr",function(e){t.call(this,"row",e)}).on("dblclick","tr",function(e){t.call(this,"rowDouble",e)}).on("contextmenu","tr",function(e){s.defaultContextmenu||e.preventDefault(),t.call(this,"rowContextmenu",e)}),function(e,t){var a=f(this);if(!a.data("off")){if("rowContextmenu"!==e){var i=[".layui-form-checkbox",".layui-form-switch",".layui-form-radio","[lay-unrow]",'[lay-type="layTableCheckbox"]','[lay-type="layTableRadio"]'].join(",");if(f(t.target).is(i)||f(t.target).closest(i)[0])return}layui.event.call(this,R,e+"("+o+")",h.call(a.children("td")[0],{e:t}))}}),n=function(e,t){var a,i,l;(e=f(e)).data("off")||(l=e.data("field"),i=e.data("key"),i=c.col(i),a=e.closest("tr").data("index"),a=w.cache[c.key][a],(i="function"==typeof i.edit?i.edit(a):i.edit)&&((i=f("textarea"===i?'':''))[0].value=(l=e.data("content")||a[l])===undefined||null===l?"":l,e.find("."+H)[0]||e.append(i),i.focus(),t)&&layui.stope(t))},i=(c.layBody.on("change","."+H,function(){var e=f(this),t=e.parent(),a=this.value,i=e.parent().data("field"),e=e.closest("tr").data("index"),e=w.cache[c.key][e],l=h.call(t[0],{value:a,field:i,oldValue:e[i],td:t,reedit:function(){setTimeout(function(){n(l.td);var e={};e[i]=l.oldValue,l.update(e)})},getCol:function(){return c.col(t.data("key"))}}),e={};e[i]=a,l.update(e),layui.event.call(t[0],R,"edit("+o+")",l)}).on("blur","."+H,function(){f(this).remove()}),c.layBody.on(s.editTrigger,"td",function(e){n(this,e)}).on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),c.layTotal.on("mouseenter","td",function(){a.call(this)}).on("mouseleave","td",function(){a.call(this,"hide")}),"layui-table-grid-down"),a=function(e){var t=f(this),a=t.children(u);t.data("off")||t.parent().hasClass(A)||(e?t.find(".layui-table-grid-down").remove():!(a.prop("scrollWidth")>a.prop("clientWidth")||0'))},l=function(e,t){var a=f(this),i=a.parent(),l=i.data("key"),n=c.col(l),o=i.parent().data("index"),r=i.children(u),i="layui-table-cell-c",d=f('');"tips"===(t=t||n.expandedMode||s.cellExpandedMode)?c.tipsIndex=g.tips(['
                    ',r.html(),"
                    ",''].join(""),r[0],{tips:[3,""],time:-1,anim:-1,maxWidth:x.ios||x.android?300:c.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){g.close(t)})}}):(c.elem.find("."+i).trigger("click"),c.cssRules(l,function(e){var t=e.style.width,a=n.expandedWidth||s.cellExpandedWidth;a.layui-table-body>table>tbody>tr"),i=e.layFixRight.find(">.layui-table-body>table>tbody>tr"),t=t.find(">tbody>tr"),l=[];t.each(function(){l.push(e.getElementSize(this).height)}),a.length&&a.each(function(e){l[e]&&(this.style.height=l[e]+"px")}),i.length&&i.each(function(e){l[e]&&(this.style.height=l[e]+"px")})},a.prototype.fixedRowHeightPatchOnHover=function(t,e,a){var i,l=this,n=l.elem.children("style")[0],o="."+r;e.toggleClass(r,a),a?d.getStyleRules(n,function(e){e.selectorText===o&&e.style.setProperty("height",l.getElementSize(t).height+"px","important")}):(d.getStyleRules(n,function(e){e.selectorText===o&&e.style.setProperty("height","auto")}),(e=e.filter(function(){var e=f(this),t=0tr").each(function(i){n.cols[i]=[],f(this).children().each(function(e){var t=f(this),a=t.attr("lay-data"),a=d.options(this,{attr:a?"lay-data":null,errorText:r+(a||t.attr("lay-options"))}),t=f.extend({title:t.text(),colspan:parseInt(t.attr("colspan"))||1,rowspan:parseInt(t.attr("rowspan"))||1},a);n.cols[i].push(t)})}),e.find("tbody>tr")),t=w.render(n);!a.length||o.data||t.config.url||(l=0,w.eachCols(t.config.id,function(e,i){a.each(function(e){n.data[e]=n.data[e]||{};var t=f(this),a=i.field;n.data[e][a]=t.children("td").eq(l).html()}),l++}),t.reloadData({data:n.data}))}),this},k.that={},k.config={},function(a,i,e,l){var n,o;l.colGroup&&(n=0,a++,l.CHILD_COLS=[],o=e+(parseInt(l.rowspan)||1),layui.each(i[o],function(e,t){t.parentKey?t.parentKey===l.key&&(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),$(a,i,o,t)):t.PARENT_COL_INDEX||1<=n&&n==(l.colspan||1)||(t.PARENT_COL_INDEX=a,l.CHILD_COLS.push(t),n+=parseInt(1td').filter('[data-field="'+e+'"]')}}})).replace(/"/g,'""'),n.push(a='"'+a+'"')):t.field&&"normal"!==t.type&&0==i&&(u[t.field]=!0)}),c.push(n.join(","))}),o&&layui.each(o.dataTotal,function(e,t){u[t.field]||s.push('"'+(t.total||"")+'"')}),d.join(",")+"\r\n"+c.join("\r\n")+"\r\n"+s.join(","))),r.download=(a.title||l.title||"table_"+(l.index||""))+"."+i,document.body.appendChild(r),r.click(),document.body.removeChild(r)},w.getOptions=l,w.hideCol=function(e,l){var n=C(e);n&&("boolean"===layui.type(l)?n.eachCols(function(e,t){var a=t.key,i=n.col(a),t=t.parentKey;i.hide!=l&&(i=i.hide=l,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](N),n.setParentCol(i,t))}):(l=layui.isArray(l)?l:[l],layui.each(l,function(e,l){n.eachCols(function(e,t){var a,i;l.field===t.field&&(a=t.key,i=n.col(a),t=t.parentKey,"hide"in l)&&i.hide!=l.hide&&(i=i.hide=!!l.hide,n.elem.find('*[data-key="'+a+'"]')[i?"addClass":"removeClass"](N),n.setParentCol(i,t))})})),f("."+M).remove(),n.resize())},w.reload=function(e,t,a,i){if(l(e))return(e=C(e)).reload(t,a,i),k.call(e)},w.reloadData=function(){var a=f.extend([],arguments),i=(a[3]="reloadData",new RegExp("^("+["elem","id","cols","width","height","maxHeight","toolbar","defaultToolbar","className","css","pagebar"].join("|")+")$"));return layui.each(a[1],function(e,t){i.test(e)&&delete a[1][e]}),w.reload.apply(null,a)},w.render=function(e){e=new a(e);return k.call(e)},w.clearCacheKey=function(e){return delete(e=f.extend({},e))[w.config.checkName],delete e[w.config.indexName],delete e[w.config.initIndexName],delete e[w.config.numbersName],delete e[w.config.disabledName],e},f(function(){w.init()}),c(R,w)});layui.define(["table"],function(e){"use strict";var P=layui.$,h=layui.form,B=layui.table,y=layui.hint(),j={config:{},on:B.on,eachCols:B.eachCols,index:B.index,set:function(e){var t=this;return t.config=P.extend({},t.config,e),t},resize:B.resize,getOptions:B.getOptions,hideCol:B.hideCol,renderData:B.renderData},i=function(){var a=this,e=a.config,n=e.id||e.index;return{config:e,reload:function(e,t){a.reload.call(a,e,t)},reloadData:function(e,t){j.reloadData(n,e,t)}}},F=function(e){var t=i.that[e];return t||y.error(e?"The treeTable instance with ID '"+e+"' not found":"ID argument required"),t||null},L="lay-table-id",q="layui-hide",s=".layui-table-body",R=".layui-table-main",Y=".layui-table-fixed-l",z=".layui-table-fixed-r",n="layui-table-checked",m="layui-table-tree",H="LAY_DATA_INDEX",b="LAY_DATA_INDEX_HISTORY",f="LAY_PARENT_INDEX",g="LAY_CHECKBOX_HALF",X="LAY_EXPAND",V="LAY_HAS_EXPANDED",U="LAY_ASYNC_STATUS",l=["all","parent","children","none"],t=/<[^>]+?>/,p=["flexIconClose","flexIconOpen","iconClose","iconOpen","iconLeaf","icon"],a=function(e){var t=this;t.index=++j.index,t.config=P.extend(!0,{},t.config,j.config,e),t.init(),t.render()},x=function(n,i,e){var l=B.cache[n];layui.each(e||l,function(e,t){var a=t[H]||"";-1!==a.indexOf("-")&&(l[a]=t),t[i]&&x(n,i,t[i])})},d=function(d,a,e){var r=F(d),o=("reloadData"!==e&&(r.status={expand:{}}),P.extend(!0,{},r.getOptions(),a)),n=o.tree,c=n.customName.children,i=n.customName.id,l=(delete a.hasNumberCol,delete a.hasChecboxCol,delete a.hasRadioCol,B.eachCols(null,function(e,t){"numbers"===t.type?a.hasNumberCol=!0:"checkbox"===t.type?a.hasChecboxCol=!0:"radio"===t.type&&(a.hasRadioCol=!0)},o.cols),a.parseData),u=a.done;"reloadData"===e&&"fixed"===o.scrollPos&&(r.scrollTopCache=r.config.elem.next().find(s).scrollTop()),o.url?e&&(!l||l.mod)||(a.parseData=function(){var e=this,t=arguments,a=t[0],t=("function"===layui.type(l)&&(a=l.apply(e,t)||t[0]),e.response.dataName);return n.data.isSimpleData&&!n["async"].enable&&(a[t]=r.flatToTree(a[t])),N(a[t],function(e){e[X]=X in e?e[X]:e[i]!==undefined&&r.status.expand[e[i]]},c),e.autoSort&&e.initSort&&e.initSort.type&&layui.sort(a[t],e.initSort.field,"desc"===e.initSort.type,!0),r.initData(a[t]),a},a.parseData.mod=!0):a.data!==undefined&&(a.data=a.data||[],n.data.isSimpleData&&(a.data=r.flatToTree(a.data)),r.initData(a.data)),e&&(!u||u.mod)||(a.done=function(){var e,t=arguments,a=t[3],n="renderData"===a,i=(n||delete r.isExpandAll,this.elem.next()),l=(r.updateStatus(null,{LAY_HAS_EXPANDED:!1}),x(d,c),i.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]'));if(l.length&&(e=j.checkStatus(d),l.prop({checked:e.isAll&&e.data.length,indeterminate:!e.isAll&&e.data.length})),!n&&o.autoSort&&o.initSort&&o.initSort.type&&j.sort(d),r.renderTreeTable(i),"reloadData"===a&&"fixed"===this.scrollPos&&i.find(s).scrollTop(r.scrollTopCache),"function"===layui.type(u))return u.apply(this,t)},a.done.mod=!0),a&&a.tree&&a.tree.view&&layui.each(p,function(e,t){a.tree.view[t]!==undefined&&(a.tree.view[t]=r.normalizedIcon(a.tree.view[t]))})};a.prototype.init=function(){var e=this.config,t=e.tree.data.cascade,t=(-1===l.indexOf(t)&&(e.tree.data.cascade="all"),B.render(P.extend({},e,{data:[],url:"",done:null}))),a=t.config.id;(i.that[a]=this).tableIns=t,d(a,e)},a.prototype.config={tree:{customName:{children:"children",isParent:"isParent",name:"name",id:"id",pid:"parentId",icon:"icon"},view:{indent:14,flexIconClose:'',flexIconOpen:'',showIcon:!0,icon:"",iconClose:'',iconOpen:'',iconLeaf:'',showFlexIconIfNotParent:!1,dblClickExpand:!0,expandAllDefault:!1},data:{isSimpleData:!1,rootPid:null,cascade:"all"},"async":{enable:!1,url:"",type:null,contentType:null,headers:null,where:null,autoParam:[]},callback:{beforeExpand:null,onExpand:null}}},a.prototype.normalizedIcon=function(e){return e?t.test(e)?e:'':""},a.prototype.getOptions=function(){return this.tableIns?B.getOptions(this.tableIns.config.id):this.config},a.prototype.flatToTree=function(e){var n,i,l,d,r,o,c,u,t=this.getOptions(),a=t.tree,s=a.customName;return e=e||B.cache[t.id],t=e,n=s.id,i=s.pid,l=s.children,d=a.data.rootPid,n=n||"id",i=i||"parentId",l=l||"children",c={},u=[],layui.each(t,function(e,t){r=n+t[n],o=n+t[i],c[r]||(c[r]={},c[r][l]=[]);var a={};a[l]=c[r][l],c[r]=P.extend({},t,a),((d?c[r][i]===d:!c[r][i])?u:(c[o]||(c[o]={},c[o][l]=[]),c[o][l])).push(c[r])}),u},a.prototype.treeToFlat=function(e,n,i){var l=this,d=l.getOptions().tree.customName,r=d.children,o=d.pid,c=[];return layui.each(e,function(e,t){var e=(i?i+"-":"")+e,a=P.extend({},t);a[o]="undefined"!=typeof t[o]?t[o]:n,c.push(a),c=c.concat(l.treeToFlat(t[r],t[d.id],e))}),c},a.prototype.getTreeNode=function(e){var t=this;return e?{data:e,dataIndex:e[H],getParentNode:function(){return t.getNodeByIndex(e[f])}}:y.error("Node data not found")},a.prototype.getNodeByIndex=function(t){var a,e,n=this,i=n.getNodeDataByIndex(t);return i?(a=n.getOptions().id,(e={data:i,dataIndex:i[H],getParentNode:function(){return n.getNodeByIndex(i[f])},update:function(e){return j.updateNode(a,t,e)},remove:function(){return j.removeNode(a,t)},expand:function(e){return j.expandNode(a,P.extend({},e,{index:t}))},setChecked:function(e){return j.setRowChecked(a,P.extend({},e,{index:t}))}}).dataIndex=t,e):y.error("Node data not found by index: "+t)},a.prototype.getNodeById=function(a){var e=this.getOptions(),n=e.tree.customName.id,i="",e=j.getData(e.id,!0);if(layui.each(e,function(e,t){if(t[n]===a)return i=t[H],!0}),i)return this.getNodeByIndex(i)},a.prototype.getNodeDataByIndex=function(e,t,a){var n=this.getOptions(),i=n.tree,n=B.cache[n.id],l=n[e];if("delete"!==a&&l)return P.extend(l,a),t?P.extend({},l):l;for(var d=n,r=String(e).split("-"),o=0,c=i.customName.children;o
                    '),I=function(e){p[U]="success",p[f.children]=e,u.initData(p[f.children],p[H]),K(t,!0,!x&&n,i,l,d)},D=b.format,"function"===layui.type(D)?D(p,c,I):(C=P.extend({},b.where||c.where),D=b.autoParam,layui.each(D,function(e,t){t=t.split("=");C[t[0].trim()]=p[(t[1]||t[0]).trim()]}),(D=b.contentType||c.contentType)&&0==D.indexOf("application/json")&&(C=JSON.stringify(C)),S=b.method||c.method,T=b.dataType||c.dataType,_=b.jsonpCallback||c.jsonpCallback,k=b.headers||c.headers,w=b.parseData||c.parseData,O=b.response||c.response,b={type:S||"get",url:g,contentType:D,data:C,dataType:T||"json",jsonpCallback:_,headers:k||{},success:function(e){(e="function"==typeof w?w.call(c,e)||e:e)[O.statusName]!=O.statusCode?(p[U]="error",p[X]=!1,v.html('')):I(e[O.dataName])},error:function(e,t){p[U]="error",p[X]=!1,"function"==typeof c.error&&c.error(e,t)}},c.ajax?c.ajax(b,"treeNodes"):P.ajax(b)),m;p[V]=!0,N.length&&(!c.initSort||c.url&&!c.autoSort||((S=c.initSort).type?layui.sort(N,S.field,"desc"===S.type,!0):layui.sort(N,B.config.indexName,null,!0)),u.initData(p[f.children],p[H]),g=B.getTrHtml(o,N,null,null,e),E={trs:P(g.trs.join("")),trs_fixed:P(g.trs_fixed.join("")),trs_fixed_r:P(g.trs_fixed_r.join(""))},A=(e.split("-").length-1||0)+1,layui.each(N,function(e,t){E.trs.eq(e).attr({"data-index":t[H],"lay-data-index":t[H],"data-level":A}).data("index",t[H]),E.trs_fixed.eq(e).attr({"data-index":t[H],"lay-data-index":t[H],"data-level":A}).data("index",t[H]),E.trs_fixed_r.eq(e).attr({"data-index":t[H],"lay-data-index":t[H],"data-level":A}).data("index",t[H])}),r.find(R).find('tbody tr[lay-data-index="'+e+'"]').after(E.trs),r.find(Y).find('tbody tr[lay-data-index="'+e+'"]').after(E.trs_fixed),r.find(z).find('tbody tr[lay-data-index="'+e+'"]').after(E.trs_fixed_r),u.renderTreeTable(E.trs,A),n)&&!x&&layui.each(N,function(e,t){K({dataIndex:t[H],trElem:r.find('tr[lay-data-index="'+t[H]+'"]').first(),tableViewElem:r,tableId:o,options:c},a,n,i,l,d)})}else u.isExpandAll=!1,(n&&!x?(layui.each(N,function(e,t){K({dataIndex:t[H],trElem:r.find('tr[lay-data-index="'+t[H]+'"]').first(),tableViewElem:r,tableId:o,options:c},a,n,i,l,d)}),r.find(N.map(function(e,t,a){return'tr[lay-data-index="'+e[H]+'"]'}).join(","))):(D=u.treeToFlat(N,p[f.id],e),r.find(D.map(function(e,t,a){return'tr[lay-data-index="'+e[H]+'"]'}).join(",")))).addClass(q);J("resize-"+o,function(){j.resize(o)},0)(),l&&"loading"!==p[U]&&(T=s.callback.onExpand,"function"===layui.type(T))&&T(o,p,h),"function"===layui.type(d)&&"loading"!==p[U]&&d(o,p,h)}return m},v=(j.expandNode=function(e,t){var a,n,i,l,e=F(e);if(e)return a=(t=t||{}).index,n=t.expandFlag,i=t.inherit,l=t.callbackFlag,e=e.getOptions().elem.next(),K({trElem:e.find('tr[lay-data-index="'+a+'"]').first()},n,i,null,l,t.done)},j.expandAll=function(a,e){if("boolean"!==layui.type(e))return y.error('treeTable.expandAll param "expandFlag" must be a boolean value.');var t=F(a);if(t){t.isExpandAll=e;var n=t.getOptions(),i=n.tree,l=n.elem.next(),d=i.customName.isParent,r=i.customName.id,o=i.view.showFlexIconIfNotParent;if(e){e=j.getData(a,!0);if(i["async"].enable){var c=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[U])return!(c=!1)}),!c)return void layui.each(j.getData(a),function(e,t){j.expandNode(a,{index:t[H],expandFlag:!0,inherit:!0})})}var u=!0;if(layui.each(e,function(e,t){if(t[d]&&!t[V])return!(u=!1)}),u)t.updateStatus(null,function(e){(e[d]||o)&&(e[X]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),l.find('tbody tr[data-level!="0"]').removeClass(q),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconOpen),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconOpen);else{if(t.updateStatus(null,function(e){(e[d]||o)&&(e[X]=!0,e[V]=!0,e[r]!==undefined)&&(t.status.expand[e[r]]=!0)}),n.initSort&&n.initSort.type&&n.autoSort)return j.sort(a);var s,n=B.getTrHtml(a,e),f={trs:P(n.trs.join("")),trs_fixed:P(n.trs_fixed.join("")),trs_fixed_r:P(n.trs_fixed_r.join(""))};layui.each(e,function(e,t){var a=t[H].split("-").length-1;s={"data-index":t[H],"lay-data-index":t[H],"data-level":a},f.trs.eq(e).attr(s).data("index",t[H]),f.trs_fixed.eq(e).attr(s).data("index",t[H]),f.trs_fixed_r.eq(e).attr(s).data("index",t[H])}),layui.each(["main","fixed-l","fixed-r"],function(e,t){l.find(".layui-table-"+t+" tbody").html(f[["trs","trs_fixed","trs_fixed_r"][e]])}),t.renderTreeTable(l,0,!1)}}else t.updateStatus(null,function(e){(e[d]||o)&&(e[X]=!1,e[r]!==undefined)&&(t.status.expand[e[r]]=!1)}),l.find('.layui-table-box tbody tr[data-level!="0"]').addClass(q),l.find(".layui-table-tree-flexIcon").html(i.view.flexIconClose),i.view.showIcon&&l.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom,.layui-table-tree-iconLeaf)").html(i.view.iconClose);j.resize(a)}},a.prototype.updateNodeIcon=function(e){var t=this.getOptions().tree||{},a=e.scopeEl,n=e.isExpand,e=e.isParent;a.find(".layui-table-tree-flexIcon").css("visibility",e||t.view.showFlexIconIfNotParent?"visible":"hidden").html(n?t.view.flexIconOpen:t.view.flexIconClose),t.view.showIcon&&(a=a.find(".layui-table-tree-nodeIcon:not(.layui-table-tree-iconCustom)"),n=e?n?t.view.iconOpen:t.view.iconClose:t.view.iconLeaf,a.toggleClass("layui-table-tree-iconLeaf",!e).html(n))},a.prototype.renderTreeTable=function(e,t,a){var l=this,n=l.getOptions(),d=n.elem.next(),i=(d.hasClass(m)||d.addClass(m),n.id),r=n.tree||{},o=r.view||{},c=r.customName||{},u=c.isParent,s=l,f=n.data.length,y=((t=t||0)||(d.find(".layui-table-body tr:not([data-level])").attr("data-level",t),layui.each(B.cache[i],function(e,t){f&&(t[H]=String(e));t=t[H];d.find('.layui-table-main tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-l tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t),d.find('.layui-table-fixed-r tbody tr[data-level="0"]:eq('+e+")").attr("lay-data-index",t)})),null),p=c.name,x=o.indent||14;if(layui.each(e.find('td[data-field="'+p+'"]'),function(e,t){var a,n,i=(t=P(t)).closest("tr"),t=t.children(".layui-table-cell");t.hasClass("layui-table-tree-item")||(n=i.attr("lay-data-index"))&&(i=d.find('tr[lay-data-index="'+n+'"]'),(a=s.getNodeDataByIndex(n))[X]&&a[u]&&((y=y||{})[n]=!0),a[g]&&i.find('input[type="checkbox"][name="layTableCheckbox"]').prop("indeterminate",!0),n=t.html(),(t=i.find('td[data-field="'+p+'"]>div.layui-table-cell')).addClass("layui-table-tree-item"),t.html(['
                    ',a[X]?o.flexIconOpen:o.flexIconClose,"
                    ",o.showIcon?'
                    '+(l.normalizedIcon(a[c.icon])||o.icon||(a[u]?a[X]?o.iconOpen:o.iconClose:o.iconLeaf)||"")+"
                    ":"",n].join("")).find(".layui-table-tree-flexIcon").on("click",function(e){layui.stope(e),K({trElem:i},null,null,null,!0)}))}),!t&&r.view.expandAllDefault&&l.isExpandAll===undefined)return j.expandAll(i,!0);(!1!==a&&y?(layui.each(y,function(e,t){e=d.find('tr[lay-data-index="'+e+'"]');e.find(".layui-table-tree-flexIcon").html(o.flexIconOpen),K({trElem:e.first()},!0)}),J("renderTreeTable2-"+i,function(){h.render(P(".layui-table-tree["+L+'="'+i+'"]'))},0)):J("renderTreeTable-"+i,function(){n.hasNumberCol&&v(l),h.render(P(".layui-table-tree["+L+'="'+i+'"]'))},0))()},function(a){var e=a.getOptions(),t=e.elem.next(),n=0,i=t.find(".layui-table-main tbody tr"),l=t.find(".layui-table-fixed-l tbody tr"),d=t.find(".layui-table-fixed-r tbody tr");layui.each(a.treeToFlat(B.cache[e.id]),function(e,t){t.LAY_HIDE||(a.getNodeDataByIndex(t[H]).LAY_NUM=++n,i.eq(e).find(".laytable-cell-numbers").html(n),l.eq(e).find(".laytable-cell-numbers").html(n),d.eq(e).find(".laytable-cell-numbers").html(n))})}),N=(a.prototype.render=function(e){var t=this;t.tableIns=B["reloadData"===e?"reloadData":"reload"](t.tableIns.config.id,P.extend(!0,{},t.config)),t.config=t.tableIns.config},a.prototype.reload=function(e,t,a){var n=this;e=e||{},delete n.haveInit,layui.each(e,function(e,t){"array"===layui.type(t)&&delete n.config[e]}),d(n.getOptions().id,e,a||!0),n.config=P.extend(t,{},n.config,e),n.render(a)},j.reloadData=function(){var e=P.extend(!0,[],arguments);return e[3]="reloadData",j.reload.apply(null,e)},function(e,a,n,i){var l=[];return layui.each(e,function(e,t){"function"===layui.type(a)?a(t):P.extend(t,a),l.push(P.extend({},t)),i||(l=l.concat(N(t[n],a,n,i)))}),l}),o=(a.prototype.updateStatus=function(e,t,a){var n=this.getOptions(),i=n.tree;return e=e||B.cache[n.id],N(e,t,i.customName.children,a)},a.prototype.getTableData=function(){var e=this.getOptions();return B.cache[e.id]},j.updateStatus=function(e,t,a){var e=F(e),n=e.getOptions();return a=a||(n.url?B.cache[n.id]:n.data),e.updateStatus(a,t)},j.sort=function(e){var t,a,i,l,n,d=F(e);d&&(n=(t=d.getOptions()).tree,a=j.getData(e),i=n.customName.children,l=function(e,a,n){layui.sort(e,a,n,!0),layui.each(e,function(e,t){l(t[i]||[],a,n)})},t.autoSort)&&((n=t.initSort).type?l(a,n.field,"desc"===n.type):l(a,B.config.indexName,null),B.cache[e]=a,d.initData(a),j.renderData(e))},function(n){var t=n.config.id,i=F(t),a=n.data=j.getNodeDataByIndex(t,n.index),l=a[H],d=(n.dataIndex=l,n.update);n.update=function(){var e=arguments,t=(P.extend(i.getNodeDataByIndex(l),e[0]),d.apply(this,e)),a=n.config.tree.customName.name;return a in e[0]&&n.tr.find('td[data-field="'+a+'"]').children("div.layui-table-cell").removeClass("layui-table-tree-item"),i.renderTreeTable(n.tr,n.tr.attr("data-level"),!1),t},n.del=function(){j.removeNode(t,a)},n.setRowChecked=function(e){j.setRowChecked(t,{index:a,checked:e})}}),u=(j.updateNode=function(e,a,t){var n,i,l,d,r,o=F(e);o&&(d=(n=o.getOptions().elem.next()).find('tr[lay-data-index="'+a+'"]'),i=d.attr("data-index"),l=d.attr("data-level"),t)&&(d=o.getNodeDataByIndex(a,!1,t),r=B.getTrHtml(e,[d]),layui.each(["main","fixed-l","fixed-r"],function(e,t){n.find(".layui-table-"+t+' tbody tr[lay-data-index="'+a+'"]').replaceWith(P(r[["trs","trs_fixed","trs_fixed_r"][e]].join("")).attr({"data-index":i,"lay-data-index":a,"data-level":l}).data("index",i))}),o.renderTreeTable(n.find('tr[lay-data-index="'+a+'"]'),l))},j.removeNode=function(e,t,a){var n,i,l,d,r,o,c,u,s=F(e);s&&(i=(u=(n=s.getOptions()).tree).customName.isParent,l=u.customName.children,d=n.elem.next(),r=[],o=B.cache[e],t=s.getNodeDataByIndex("string"===layui.type(t)?t:t[H],!1,"delete"),c=s.getNodeDataByIndex(t[f]),s.updateCheckStatus(c),u=s.treeToFlat([t],t[u.customName.pid],t[f]),layui.each(u,function(e,t){t=t[H];r.push('tr[lay-data-index="'+t+'"]'),-1!==t.indexOf("-")&&delete o[t]}),d.find(r.join(",")).remove(),t=s.initData(),function(){for(var e in o)-1!==e.indexOf("-")&&e!==o[e][H]&&delete o[e]}(),layui.each(s.treeToFlat(t),function(e,t){t[b]&&t[b]!==t[H]&&d.find('tr[lay-data-index="'+t[b]+'"]').attr({"data-index":t[H],"lay-data-index":t[H]}).data("index",t[H])}),layui.each(o,function(e,t){d.find('tr[data-level="0"][lay-data-index="'+t[H]+'"]').attr("data-index",e).data("index",e)}),n.hasNumberCol&&v(s),c&&(u=d.find('tr[lay-data-index="'+c[H]+'"]'),a||(c[i]=!(!c[l]||!c[l].length)),s.updateNodeIcon({scopeEl:u,isExpand:c[X],isParent:c[i]})),j.resize(e))},j.addNodes=function(e,t){var a=F(e);if(a){var n=a.getOptions(),i=n.tree,l=n.elem.next(),d=B.config.checkName,r=(t=t||{}).parentIndex,o=t.index,c=t.data,t=t.focus,u=(r="number"===layui.type(r)?r.toString():r)?a.getNodeDataByIndex(r):null,o="number"===layui.type(o)?o:-1,c=P.extend(!0,[],layui.isArray(c)?c:[c]);if(layui.each(c,function(e,t){d in t||!u||(t[d]=u[d])}),u){var s=i.customName.isParent,f=i.customName.children;u[s]=!0;var y=(y=u[f])?(p=y.splice(-1===o?y.length:o),u[f]=y.concat(c,p)):u[f]=c,f=(a.updateStatus(y,function(e){(e[s]||i.view.showFlexIconIfNotParent)&&(e[V]=!1)}),a.treeToFlat(y));l.find(f.map(function(e){return'tr[lay-data-index="'+e[H]+'"]'}).join(",")).remove(),u[V]=!1,u[U]="local",K({trElem:l.find('tr[lay-data-index="'+r+'"]')},!0)}else{var p=B.cache[e].splice(-1===o?B.cache[e].length:o);if(B.cache[e]=B.cache[e].concat(c,p),n.url||(n.page?(y=n.page,n.data.splice.apply(n.data,[y.limit*(y.curr-1),y.limit].concat(B.cache[e]))):n.data=B.cache[e]),l.find(".layui-none").length)return B.renderData(e),c;var x,f=B.getTrHtml(e,c),h={trs:P(f.trs.join("")),trs_fixed:P(f.trs_fixed.join("")),trs_fixed_r:P(f.trs_fixed_r.join(""))},r=(layui.each(c,function(e,t){x={"data-index":t[H],"lay-data-index":t[H],"data-level":"0"},h.trs.eq(e).attr(x).data("index",t[H]),h.trs_fixed.eq(e).attr(x).data("index",t[H]),h.trs_fixed_r.eq(e).attr(x).data("index",t[H])}),parseInt(c[0][H])-1),y=l.find(R),n=l.find(Y),f=l.find(z);-1==r?y.find('tr[data-level="0"][data-index="0"]')[0]?(y.find('tr[data-level="0"][data-index="0"]').before(h.trs),n.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="0"]').before(h.trs_fixed_r)):(y.find("tbody").prepend(h.trs),n.find("tbody").prepend(h.trs_fixed),f.find("tbody").prepend(h.trs_fixed_r)):-1===o?(y.find("tbody").append(h.trs),n.find("tbody").append(h.trs_fixed),f.find("tbody").append(h.trs_fixed_r)):(r=p[0][b],y.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs),n.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed),f.find('tr[data-level="0"][data-index="'+r+'"]').before(h.trs_fixed_r)),layui.each(B.cache[e],function(e,t){l.find('tr[data-level="0"][lay-data-index="'+t[H]+'"]').attr("data-index",e).data("index",e)}),a.renderTreeTable(l.find(c.map(function(e,t,a){return'tr[lay-data-index="'+e[H]+'"]'}).join(",")))}return a.updateCheckStatus(u),u&&(o=l.find('tr[lay-data-index="'+u[H]+'"]'),a.updateNodeIcon({scopeEl:o,isExpand:u[X],isParent:u[s]})),j.resize(e),t&&l.find(R).find('tr[lay-data-index="'+c[0][H]+'"]').get(0).scrollIntoViewIfNeeded(),c}},j.checkStatus=function(e,n){var i,t,a,l=F(e);if(l)return l=l.getOptions().tree,i=B.config.checkName,t=j.getData(e,!0).filter(function(e,t,a){return e[i]||n&&e[g]}),a=!0,layui.each("all"===l.data.cascade?B.cache[e]:j.getData(e,!0),function(e,t){if(!t[i])return!(a=!1)}),{data:t,isAll:a}},j.on("sort",function(e){var e=e.config,t=e.elem.next(),e=e.id;t.hasClass(m)&&j.sort(e)}),j.on("row",function(e){e.config.elem.next().hasClass(m)&&o(e)}),j.on("rowDouble",function(e){var t=e.config;t.elem.next().hasClass(m)&&(o(e),(t.tree||{}).view.dblClickExpand)&&K({trElem:e.tr.first()},null,null,null,!0)}),j.on("rowContextmenu",function(e){e.config.elem.next().hasClass(m)&&o(e)}),j.on("tool",function(e){e.config.elem.next().hasClass(m)&&o(e)}),j.on("edit",function(e){var t=e.config;t.elem.next().hasClass(m)&&(o(e),e.field===t.tree.customName.name)&&((t={})[e.field]=e.value,e.update(t))}),j.on("radio",function(e){var t=e.config,a=t.elem.next(),t=t.id;a.hasClass(m)&&(a=F(t),o(e),u.call(a,e.tr,e.checked))}),a.prototype.setRowCheckedClass=function(e,t){var a=this.getOptions().elem.next();e[t?"addClass":"removeClass"](n),e.each(function(){var e=P(this).data("index");a.find('.layui-table-fixed-r tbody tr[data-index="'+e+'"]')[t?"addClass":"removeClass"](n)})},a.prototype.updateCheckStatus=function(e,t){var a,n,i,l,d,r,o,c=this,u=c.getOptions();return!!u.hasChecboxCol&&(a=u.tree,n=u.id,i=u.elem.next(),l=B.config.checkName,"all"!==(d=a.data.cascade)&&"parent"!==d||!e||(d=c.updateParentCheckStatus(e,"boolean"===layui.type(t)?t:null),layui.each(d,function(e,t){var a=i.find('tr[lay-data-index="'+t[H]+'"] input[name="layTableCheckbox"]:not(:disabled)'),n=t[l];c.setRowCheckedClass(a.closest("tr"),n),a.prop({checked:n,indeterminate:t[g]})})),o=!(r=!0),0<(e=(e="all"===a.data.cascade?B.cache[n]:j.getData(n,!0)).filter(function(e){return!e[u.disabledName]})).length?layui.each(e,function(e,t){if((t[l]||t[g])&&(o=!0),t[l]||(r=!1),o&&!r)return!0}):r=!1,o=o&&!r,i.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({checked:r,indeterminate:o}),r)},a.prototype.updateParentCheckStatus=function(a,n){var i,e=this.getOptions(),t=e.tree,e=e.id,l=B.config.checkName,t=t.customName.children,d=[];return!(a[g]=!1)===n?a[t].length?layui.each(a[t],function(e,t){if(!t[l])return n=!1,a[g]=!0}):n=!1:!1===n?layui.each(a[t],function(e,t){if(t[l]||t[g])return a[g]=!0}):(n=!1,i=0,layui.each(a[t],function(e,t){t[l]&&i++}),n=a[t].length?a[t].length===i:a[l],a[g]=!n&&0li"],n.bodyElem=["."+C.CONST.BODY+":eq(0)",">."+C.CONST.ITEM],n.getContainer=function(){var e=n.documentElem||t.elem;return{header:{elem:e.find(n.headerElem[0]),items:e.find(n.headerElem.join(""))},body:{elem:e.find(n.bodyElem[0]),items:e.find(n.bodyElem.join(""))}}},"array"===layui.type(t.header)?"string"==typeof t.header[0]?(n.headerElem=t.header.concat(),n.documentElem=p(document)):(n.elemView=p('
                    '),t.className&&n.elemView.addClass(t.className),a=p('
                      '),i=p('
                      '),layui.each(t.header,function(e,t){t=n.renderHeaderItem(t);a.append(t)}),layui.each(t.body,function(e,t){t=n.renderBodyItem(t);i.append(t)}),n.elemView.append(a).append(i),t.elem.html(n.elemView)):n.renderClose(),"array"===layui.type(t.body)&&"string"==typeof t.body[0]&&(n.documentElem=p(document),n.bodyElem=t.body.concat()),n.data());"index"in t&&e.index!=t.index?n.change(n.findHeaderItem(t.index),!0):-1===e.index&&n.change(n.findHeaderItem(0),!0),n.roll("auto"),t.elem.hasClass(C.CONST.CLASS_HIDEV)&&t.elem.removeClass(C.CONST.CLASS_HIDEV),"function"==typeof t.afterRender&&t.afterRender(e),layui.event.call(t.elem[0],C.CONST.MOD_NAME,"afterRender("+t.id+")",e)},events:function(){var e,t=this,a=t.config,i=t.getContainer(),n=C.CONST.MOD_NAME,i=(t.documentElem?i.header:a).elem,a=a.trigger+(".lay_"+n+"_trigger"),n=t.documentElem?t.headerElem[1]:t.headerElem.join("");i.off(a).on(a,n,function(){t.change(p(this))}),r.onresize||(p(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){layui.each(C.cache.id,function(e){e=C.getInst(e);e&&e.roll("init")})},50)}),r.onresize=!0)}}),r={},t=C.Class;t.prototype.add=function(e){var t,a,i=this,n=i.getContainer(),r=i.renderHeaderItem(e),d=i.renderBodyItem(e),l=i.data();e=p.extend({active:!0},e),/(before|after)/.test(e.mode)?(a=(t=Object.prototype.hasOwnProperty.call(e,"index"))?i.findHeaderItem(e.index):l.thisHeaderItem,t=t?i.findBodyItem(e.index):l.thisHeaderItem,a[e.mode](r),t[e.mode](d)):(a={prepend:"prepend",append:"append"}[e.mode||"append"]||"append",n.header.elem[a](r),n.body.elem[a](d)),e.active?i.change(r,!0):i.roll("auto"),"function"==typeof e.done&&e.done(p.extend(l,{headerItem:r,bodyItem:d}))},t.prototype.close=function(e,t){if(e&&e[0]){var a=this,i=a.config,n=e.attr("lay-id"),r=e.index();if("false"!==e.attr("lay-closable")){var d=a.data();if(!t)if(!1===layui.event.call(e[0],C.CONST.MOD_NAME,"beforeClose("+i.id+")",p.extend(d,{index:r})))return;e.hasClass(C.CONST.CLASS_THIS)&&(e.next()[0]?a.change(e.next(),!0):e.prev()[0]&&a.change(e.prev(),!0)),a.findBodyItem(n||r).remove(),e.remove(),a.roll("auto",r),d=a.data(),layui.event.call(d.thisHeaderItem[0],C.CONST.MOD_NAME,"afterClose("+i.id+")",d)}}},t.prototype.closeMult=function(i,e){var n=this,t=n.config,a=n.getContainer(),r=n.data(),a=a.header.items,d='[lay-closable="false"]',l=(e=e===undefined?r.index:e,n.findHeaderItem(e)),o=l.index();"false"!==r.thisHeaderItem.attr("lay-closable")&&("all"!==i&&i?e!==r.index&&n.change(l,!0):(e=a.filter(":gt("+r.index+")"+d).eq(0),l=p(a.filter(":lt("+r.index+")"+d).get().reverse()).eq(0),e[0]?n.change(e,!0):l[0]&&n.change(l,!0))),a.each(function(e){var t=p(this),a=t.attr("lay-id"),a=n.findBodyItem(a||e);"false"!==t.attr("lay-closable")&&("other"===i&&e!==o||"right"===i&&o");return t.html(e.title||"New Tab").attr("lay-id",e.id),this.appendClose(t,e),t},t.prototype.renderBodyItem=function(e){var t=this.config,t=p(e.bodyItem||t.bodyItem||'
                      ');return t.html(e.content||"").attr("lay-id",e.id),t},t.prototype.appendClose=function(e,t){var a=this;a.config.closable&&(0==(t=t||{}).closable&&e.attr("lay-closable","false"),"false"===e.attr("lay-closable")||e.find("."+C.CONST.CLOSE)[0]||((t=p('')).on("click",function(){return a.close(p(this).parent()),!1}),e.append(t)))},t.prototype.renderClose=function(){var t=this,a=t.config;t.getContainer().header.items.each(function(){var e=p(this);a.closable?t.appendClose(e):e.find("."+C.CONST.CLOSE).remove()})},t.prototype.roll=function(e,i){var n=this,t=n.config,a=n.getContainer(),r=a.header.elem,d=a.header.items,a=r.prop("scrollWidth"),l=Math.ceil(r.outerWidth()),o=r.data("left")||0,s="scroll"===t.headerMode,c="layui-tabs-scroll",f="layui-tabs-bar",u=["layui-icon-prev","layui-icon-next"],m={elem:p('
                      '),bar:p(['
                      ','','',"
                      "].join(""))};if("normal"!==t.headerMode){var h,y=r.parent("."+c);if(s||!s&&l=l-o)return r.css("left",-a).data("left",-a),!1}),o=r.data("left")||0,y.find("."+u[0])[o<0?"removeClass":"addClass"](C.CONST.CLASS_DISABLED),y.find("."+u[1])[0')),n=(e.tree(a),i.elem);if(n[0]){if(e.elem=a,e.elemNone=L('
                      '+i.text.none+"
                      "),n.html(e.elem),0==e.elem.find("."+C.ELEM_SET).length)return e.elem.append(e.elemNone);i.showCheckbox&&e.renderForm("checkbox"),e.elem.find("."+C.ELEM_SET).each(function(){var e=L(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(C.ELEM_LINE_SHORT),e.next()[0]||e.parents("."+C.ELEM_SET).eq(0).next()[0]||e.addClass(C.ELEM_LINE_SHORT)})}},extendsInstance:function(){var i=this;return{getChecked:function(){return i.getChecked.call(i)},setChecked:function(e){return i.setChecked.call(i,e)}}}}),C=a.CONST,n=a.Class;n.prototype.reload=function(e,i){var a=this;layui.each(e,function(e,i){"array"===layui.type(i)&&delete a.config[e]}),a.config=L.extend(!0,{},a.config,e),a.init(!0,i)},n.prototype.renderForm=function(e){i.render(e,"LAY-tree-"+this.index)},n.prototype.tree=function(d,e){var r=this,E=r.config,s=E.customName,e=e||E.data;layui.each(e,function(e,i){var a,n,t=i[s.children]&&0"),c=L(['
                      ','
                      ','
                      ',E.showLine?t?'':'':'',E.showCheckbox?'':"",E.isJump&&i.href?''+(i[s.title]||i.label||E.text.defaultNodeName)+"":''+(i[s.title]||i.label||E.text.defaultNodeName)+"","
                      ",E.edit?(a={add:'',update:'',del:''},n=['
                      '],!0===E.edit&&(E.edit=["update","del"]),"object"==typeof E.edit?(layui.each(E.edit,function(e,i){n.push(a[i]||"")}),n.join("")+"
                      "):void 0):"","
                      ","
                      "].join(""));t&&(c.append(l),r.tree(l,i[s.children])),d.append(c),c.prev("."+C.ELEM_SET)[0]&&c.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),t||c.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),r.spread(c,i),E.showCheckbox&&(i.checked&&r.checkids.push(i[s.id]),r.checkClick(c,i)),E.edit&&r.operate(c,i)})},n.prototype.spread=function(n,t){var l=this,c=l.config,e=n.children("."+C.ELEM_ENTRY),i=e.children("."+C.ELEM_MAIN),a=i.find('input[same="layuiTreeCheck"]'),d=e.find("."+C.ICON_CLICK),e=e.find("."+C.ELEM_TEXT),r=c.onlyIconControl?d:i,E="";r.on("click",function(e){var i=n.children("."+C.ELEM_PACK),a=(r.children(".layui-icon")[0]?r:r.find(".layui-tree-icon")).children(".layui-icon");i[0]?n.hasClass(C.ELEM_SPREAD)?(n.removeClass(C.ELEM_SPREAD),i.slideUp(200),a.removeClass(C.ICON_SUB).addClass(C.ICON_ADD),l.updateFieldValue(t,"spread",!1)):(n.addClass(C.ELEM_SPREAD),i.slideDown(200),a.addClass(C.ICON_SUB).removeClass(C.ICON_ADD),l.updateFieldValue(t,"spread",!0),c.accordion&&((i=n.siblings("."+C.ELEM_SET)).removeClass(C.ELEM_SPREAD),i.children("."+C.ELEM_PACK).slideUp(200),i.find(".layui-tree-icon").children(".layui-icon").removeClass(C.ICON_SUB).addClass(C.ICON_ADD))):E="normal"}),e.on("click",function(){L(this).hasClass(C.CLASS_DISABLED)||(E=n.hasClass(C.ELEM_SPREAD)?c.onlyIconControl?"open":"close":c.onlyIconControl?"close":"open",a[0]&&l.updateFieldValue(t,"checked",a.prop("checked")),c.click&&c.click({elem:n,state:E,data:t}))})},n.prototype.updateFieldValue=function(e,i,a){i in e&&(e[i]=a)},n.prototype.syncCheckedState=function(e,i,l){var c,t,d=this,r=d.config.customName,E=e.prop("checked"),a=e.closest("."+C.ELEM_SET);e.prop("disabled")||(t=function(e){var i,a,n;e.parents("."+C.ELEM_SET)[0]&&(a=(e=e.parent("."+C.ELEM_PACK)).parent(),(n=e.prev().find('input[same="layuiTreeCheck"]')).prop("disabled")||(E?n.prop("checked",E):(e.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||n.prop("checked",!1)),t(a)))},(c=function(e,i){var n,t=i[r.children];t&&0!==t.length&&(n=e.children("."+C.ELEM_PACK).children("."+C.ELEM_SET)).children("."+C.ELEM_ENTRY).find('input[same="layuiTreeCheck"]').each(function(e){var i,a;this.disabled||(i=t[e],a=!l&&"checked"in i?i.checked:E,this.checked=a,d.updateFieldValue(i,"checked",a),i[r.children]&&c(n.eq(e),i))})})(a,i),t(a),d.renderForm("checkbox"))},n.prototype.checkClick=function(a,n){var t=this,l=t.config,e=a.children("."+C.ELEM_ENTRY).children("."+C.ELEM_MAIN);e.on("click",'input[same="layuiTreeCheck"]',layui.stope),e.on("click",'input[same="layuiTreeCheck"]+',function(e){layui.stope(e);var e=L(this).prev(),i=e.prop("checked");e.prop("disabled")||(t.syncCheckedState(e,n,"manual"),t.updateFieldValue(n,"checked",i),l.oncheck&&l.oncheck({elem:a,checked:i,data:n}))})},n.prototype.operate=function(r,l){var E=this,s=E.config,o=s.customName,e=r.children("."+C.ELEM_ENTRY),h=e.children("."+C.ELEM_MAIN);e.children(".layui-tree-btnGroup").on("click",".layui-icon",function(e){layui.stope(e);var a,i,n,t,e=L(this).data("type"),c=r.children("."+C.ELEM_PACK),d={data:l,type:e,elem:r};"add"==e?(c[0]||(s.showLine?(h.find("."+C.ICON_CLICK).addClass("layui-tree-icon"),h.find("."+C.ICON_CLICK).children(".layui-icon").addClass(C.ICON_ADD).removeClass("layui-icon-leaf")):h.find(".layui-tree-iconArrow").removeClass(C.CLASS_HIDE),r.append('
                      ')),i=s.operate&&s.operate(d),(t={})[o.title]=s.text.defaultNodeName,t[o.id]=i,E.tree(r.children("."+C.ELEM_PACK),[t]),s.showLine&&(c[0]?(c.hasClass(C.ELEM_EXTEND)||c.addClass(C.ELEM_EXTEND),r.find("."+C.ELEM_PACK).each(function(){L(this).children("."+C.ELEM_SET).last().addClass(C.ELEM_LINE_SHORT)}),(c.children("."+C.ELEM_SET).last().prev().hasClass(C.ELEM_LINE_SHORT)?c.children("."+C.ELEM_SET).last().prev():c.children("."+C.ELEM_SET).last()).removeClass(C.ELEM_LINE_SHORT),!r.parent("."+C.ELEM_PACK)[0]&&r.next()[0]&&c.children("."+C.ELEM_SET).last().removeClass(C.ELEM_LINE_SHORT)):(i=r.siblings("."+C.ELEM_SET),a=1,t=r.parent("."+C.ELEM_PACK),layui.each(i,function(e,i){L(i).children("."+C.ELEM_PACK)[0]||(a=0)}),(1==a?(i.children("."+C.ELEM_PACK).addClass(C.ELEM_SHOW),i.children("."+C.ELEM_PACK).children("."+C.ELEM_SET).removeClass(C.ELEM_LINE_SHORT),r.children("."+C.ELEM_PACK).addClass(C.ELEM_SHOW),t.removeClass(C.ELEM_EXTEND),t.children("."+C.ELEM_SET).last().children("."+C.ELEM_PACK).children("."+C.ELEM_SET).last()):r.children("."+C.ELEM_PACK).children("."+C.ELEM_SET)).addClass(C.ELEM_LINE_SHORT))),s.showCheckbox&&(h.find('input[same="layuiTreeCheck"]')[0].checked&&(r.children("."+C.ELEM_PACK).children("."+C.ELEM_SET).last().find('input[same="layuiTreeCheck"]')[0].checked=!0),E.renderForm("checkbox"))):"update"==e?(i=h.children("."+C.ELEM_TEXT).html(),h.children("."+C.ELEM_TEXT).html(""),h.append(''),h.children(".layui-tree-editInput").val(u.unescape(i)).focus(),n=function(e){var i=u.escape(e.val().trim())||s.text.defaultNodeName;e.remove(),h.children("."+C.ELEM_TEXT).html(i),d.data[o.title]=i,s.operate&&s.operate(d)},h.children(".layui-tree-editInput").blur(function(){n(L(this))}),h.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),n(L(this)))})):(t=p.$t("tree.deleteNodePrompt",{name:l[o.title]||""}),_.confirm(t,function(e){var l,a,i;s.operate&&s.operate(d),d.status="remove",_.close(e),r.prev("."+C.ELEM_SET)[0]||r.next("."+C.ELEM_SET)[0]||r.parent("."+C.ELEM_PACK)[0]?(r.siblings("."+C.ELEM_SET).children("."+C.ELEM_ENTRY)[0]?(s.showCheckbox&&(l=function(e){var i,a,n,t;e.parents("."+C.ELEM_SET)[0]&&(i=e.siblings("."+C.ELEM_SET).children("."+C.ELEM_ENTRY),a=(e=e.parent("."+C.ELEM_PACK).prev()).find('input[same="layuiTreeCheck"]')[0],n=1,(t=0)==a.checked)&&(i.each(function(e,i){i=L(i).find('input[same="layuiTreeCheck"]')[0];0!=i.checked||i.disabled||(n=0),i.disabled||(t=1)}),1==n)&&1==t&&(a.checked=!0,E.renderForm("checkbox"),l(e.parent("."+C.ELEM_SET)))})(r),s.showLine&&(e=r.siblings("."+C.ELEM_SET),a=1,i=r.parent("."+C.ELEM_PACK),layui.each(e,function(e,i){L(i).children("."+C.ELEM_PACK)[0]||(a=0)}),1==a?(c[0]||(i.removeClass(C.ELEM_EXTEND),e.children("."+C.ELEM_PACK).addClass(C.ELEM_SHOW),e.children("."+C.ELEM_PACK).children("."+C.ELEM_SET).removeClass(C.ELEM_LINE_SHORT)),(r.next()[0]?i.children("."+C.ELEM_SET).last():r.prev()).children("."+C.ELEM_PACK).children("."+C.ELEM_SET).last().addClass(C.ELEM_LINE_SHORT),r.next()[0]||r.parents("."+C.ELEM_SET)[1]||r.parents("."+C.ELEM_SET).eq(0).next()[0]||r.prev("."+C.ELEM_SET).addClass(C.ELEM_LINE_SHORT)):!r.next()[0]&&r.hasClass(C.ELEM_LINE_SHORT)&&r.prev().addClass(C.ELEM_LINE_SHORT))):(e=r.parent("."+C.ELEM_PACK).prev(),s.showLine?(e.find("."+C.ICON_CLICK).removeClass("layui-tree-icon"),e.find("."+C.ICON_CLICK).children(".layui-icon").removeClass(C.ICON_SUB).addClass("layui-icon-leaf"),(i=e.parents("."+C.ELEM_PACK).eq(0)).addClass(C.ELEM_EXTEND),i.children("."+C.ELEM_SET).each(function(){L(this).children("."+C.ELEM_PACK).children("."+C.ELEM_SET).last().addClass(C.ELEM_LINE_SHORT)})):e.find(".layui-tree-iconArrow").addClass(C.CLASS_HIDE),r.parents("."+C.ELEM_SET).eq(0).removeClass(C.ELEM_SPREAD),r.parent("."+C.ELEM_PACK).remove()),r.remove()):(r.remove(),E.elem.append(E.elemNone))}))})},n.prototype.events=function(){var i=this,t=i.config;i.setChecked(i.checkids),i.elem.find(".layui-tree-search").on("keyup",function(){var e=L(this),a=e.val(),e=e.nextAll(),n=[];e.find("."+C.ELEM_TEXT).each(function(){var i,e=L(this).parents("."+C.ELEM_ENTRY);-1!=L(this).html().indexOf(a)&&(n.push(L(this).parent()),(i=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+C.ELEM_PACK)[0]&&i(e.parent("."+C.ELEM_PACK).parent("."+C.ELEM_SET))})(e.parent("."+C.ELEM_SET)))}),e.find("."+C.ELEM_ENTRY).each(function(){var e=L(this).parent("."+C.ELEM_SET);e.hasClass("layui-tree-searchShow")||e.addClass(C.CLASS_HIDE)}),0==e.find(".layui-tree-searchShow").length&&i.elem.append(i.elemNone),t.onsearch&&t.onsearch({elem:n})}),i.elem.find(".layui-tree-search").on("keydown",function(){L(this).nextAll().find("."+C.ELEM_ENTRY).each(function(){L(this).parent("."+C.ELEM_SET).removeClass("layui-tree-searchShow "+C.CLASS_HIDE)}),L(".layui-tree-emptyText")[0]&&L(".layui-tree-emptyText").remove()})},n.prototype.getChecked=function(){var t=this,e=t.config,l=e.customName,i=[],a=[],c=(t.elem.find(".layui-form-checked").each(function(){i.push(L(this).prev()[0].value)}),function(e,n){layui.each(e,function(e,a){layui.each(i,function(e,i){if(a[l.id]==i)return t.updateFieldValue(a,"checked",!0),delete(i=L.extend({},a))[l.children],n.push(i),a[l.children]&&(i[l.children]=[],c(a[l.children],i[l.children])),!0})})});return c(L.extend({},e.data),a),a},n.prototype.setChecked=function(e){var c=this,d=c.config.flatData;"object"!=typeof e&&(e=[e]),c.elem.find("."+C.ELEM_SET).each(function(a){var n=L(this).data("id"),t=L(this).children("."+C.ELEM_ENTRY).find('input[same="layuiTreeCheck"]'),l=t.prop("checked");layui.each(e,function(e,i){return n!=i||t.prop("disabled")||l?void 0:(t.prop("checked",!0),c.syncCheckedState(t,d[a]),!0)})})},L.extend(a,{getChecked:function(e){e=a.getInst(e);if(e)return e.getChecked()},setChecked:function(e,i){e=a.getInst(e);if(e)return e.setChecked(i)}}),e(C.MOD_NAME,a)});layui.define(["i18n","laytpl","component","form"],function(e){"use strict";var i=layui.i18n,l=layui.laytpl,o=layui.$,a=layui.form,t=layui.component({name:"transfer",config:{width:200,height:360,data:[],value:[],showSearch:!1,id:""},CONST:{ELEM:"layui-transfer",ELEM_BOX:"layui-transfer-box",ELEM_HEADER:"layui-transfer-header",ELEM_SEARCH:"layui-transfer-search",ELEM_ACTIVE:"layui-transfer-active",ELEM_DATA:"layui-transfer-data",BTN_DISABLED:"layui-btn-disabled"},beforeRender:function(e){this.config=o.extend({title:i.$t("transfer.title"),text:{none:i.$t("transfer.noData"),searchNone:i.$t("transfer.noMatch")}},this.config,e)},render:function(){var e=this,a=e.config,t=function(e){return['
                      ','
                      ',' ","
                      ",""," {{ if(d.data.showSearch){ }}",' "," {{ } }}","",'
                        ',"","
                        "].join("\n")},t=['
                        ',""," \x3c!-- \u5de6\u4fa7\u7a7f\u68ad\u6846 --\x3e",t({index:0,checkAllName:"layTransferLeftCheckAll"}),""," \x3c!-- \u4e2d\u95f4\u64cd\u4f5c\u6309\u94ae --\x3e",'
                        '," \x3c!-- \u5411\u53f3\u7a7f\u68ad\u6309\u94ae --\x3e",' ",""," \x3c!-- \u5411\u5de6\u7a7f\u68ad\u6309\u94ae --\x3e",' ","
                        ",""," \x3c!-- \u53f3\u4fa7\u7a7f\u68ad\u6846 --\x3e",t({index:1,checkAllName:"layTransferRightCheckAll"}),"","
                        "].join("\n"),t=e.elem=o(l(t,{open:"{{",close:"}}",tagStyle:"modern"}).render({data:a,index:e.index})),n=a.elem;n[0]&&(a.data=a.data||[],a.value=a.value||[],n.html(e.elem),e.layBox=e.elem.find("."+d.ELEM_BOX),e.layHeader=e.elem.find("."+d.ELEM_HEADER),e.laySearch=e.elem.find("."+d.ELEM_SEARCH),e.layData=t.find("."+d.ELEM_DATA),e.layBtn=t.find("."+d.ELEM_ACTIVE+" .layui-btn"),e.layBox.css({width:a.width,height:a.height}),e.layData.css({height:(n=a.height-e.layHeader.outerHeight(),a.showSearch&&(n-=e.laySearch.outerHeight()),n-2)}),e.renderData(),e.events())},extendsInstance:function(){var e=this;return{getData:function(){return e.getData.call(e)}}}}),d=t.CONST,n=t.Class;n.prototype.renderData=function(){var e=this,a=e.config,l=[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}];e.parseData(function(t){var n=t.selected?1:0,i=["
                      • ",'',"
                      • "].join("");n?layui.each(a.value,function(e,a){a==t.value&&t.selected&&(l[n].views[e]=i)}):l[n].views.push(i),delete t.selected}),e.layData.eq(0).html(l[0].views.join("")),e.layData.eq(1).html(l[1].views.join("")),e.renderCheckBtn()},n.prototype.renderForm=function(e){a.render(e,"LAY-transfer-"+this.index)},n.prototype.renderCheckBtn=function(c){var r=this,s=r.config;c=c||{},r.layBox.each(function(e){var a=o(this),t=a.find("."+d.ELEM_DATA),a=a.find("."+d.ELEM_HEADER).find('input[type="checkbox"]'),n=t.find('input[type="checkbox"]'),i=0,l=!1;n.each(function(){var e=o(this).data("hide");(this.checked||this.disabled||e)&&i++,this.checked&&!e&&(l=!0)}),a.prop("checked",l&&i===n.length),r.layBtn.eq(e)[l?"removeClass":"addClass"](d.BTN_DISABLED),c.stopNone||(n=t.children("li:not(."+d.CLASS_HIDE+")").length,r.noneView(t,n?"":s.text.none))}),r.renderForm("checkbox")},n.prototype.noneView=function(e,a){var t=o('

                        '+(a||"")+"

                        ");e.find("."+d.CLASS_NONE)[0]&&e.find("."+d.CLASS_NONE).remove(),a.replace(/\s/g,"")&&e.append(t)},n.prototype.setValue=function(){var e=this,a=e.config,t=[];return e.layBox.eq(1).find("."+d.ELEM_DATA+' input[type="checkbox"]').each(function(){o(this).data("hide")||t.push(this.value)}),a.value=t,e},n.prototype.parseData=function(a){var n=this.config,i=[];return layui.each(n.data,function(e,t){t=("function"==typeof n.parseData?n.parseData(t):t)||t,i.push(t=o.extend({},t)),layui.each(n.value,function(e,a){a==t.value&&(t.selected=!0)}),a&&a(t)}),n.data=i,this},n.prototype.getData=function(e){var a=this.config,n=[];return this.setValue(),layui.each(e||a.value,function(e,t){layui.each(a.data,function(e,a){delete a.selected,t==a.value&&n.push(a)})}),n},n.prototype.transfer=function(e,a){var t,n=this,i=n.config,l=n.layBox.eq(e),c=[],a=(a?((t=(a=a).find('input[type="checkbox"]'))[0].checked=!1,l.siblings("."+d.ELEM_BOX).find("."+d.ELEM_DATA).append(a.clone()),a.remove(),c.push(t[0].value),n.setValue()):l.each(function(e){o(this).find("."+d.ELEM_DATA).children("li").each(function(){var e=o(this),a=e.find('input[type="checkbox"]'),t=a.data("hide");a[0].checked&&!t&&(a[0].checked=!1,l.siblings("."+d.ELEM_BOX).find("."+d.ELEM_DATA).append(e.clone()),e.remove(),c.push(a[0].value)),n.setValue()})}),n.renderCheckBtn(),l.siblings("."+d.ELEM_BOX).find("."+d.ELEM_SEARCH+" input"));""!==a.val()&&a.trigger("keyup"),i.onchange&&i.onchange(n.getData(c),e)},n.prototype.events=function(){var i=this,l=i.config;i.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var e=o(this).prev(),a=e[0].checked,t=e.parents("."+d.ELEM_BOX).eq(0).find("."+d.ELEM_DATA);e[0].disabled||("all"===e.attr("lay-type")&&t.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=a)}),setTimeout(function(){i.renderCheckBtn({stopNone:!0})},0))}),i.elem.on("dblclick","."+d.ELEM_DATA+">li",function(e){var a=o(this),t=a.children('input[type="checkbox"]'),n=a.parent().parent().data("index");t[0].disabled||!1!==("function"==typeof l.dblclick?l.dblclick({elem:a,data:i.getData([t[0].value])[0],index:n}):null)&&i.transfer(n,a)}),i.layBtn.on("click",function(){var e=o(this),a=e.data("index");e.hasClass(d.BTN_DISABLED)||i.transfer(a)}),i.laySearch.find("input").on("keyup",function(){var n=this.value,e=o(this).parents("."+d.ELEM_SEARCH).eq(0).siblings("."+d.ELEM_DATA),a=e.children("li"),a=(a.each(function(){var e=o(this),a=e.find('input[type="checkbox"]'),t=a[0].title,t=("cs"!==l.showSearch&&(t=t.toLowerCase(),n=n.toLowerCase()),-1!==t.indexOf(n));e[t?"removeClass":"addClass"](d.CLASS_HIDE),a.data("hide",!t)}),i.renderCheckBtn(),a.length===e.children("li."+d.CLASS_HIDE).length);i.noneView(e,a?l.text.searchNone:"")})},o.extend(t,{getData:function(e){e=t.getInst(e);if(e)return e.getData()}}),e(d.MOD_NAME,t)});layui.define("component",function(e){"use strict";var o=layui.$,i=layui.lay,t=layui.component({name:"carousel",config:{width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},CONST:{ELEM:"layui-carousel",ELEM_ITEM:">*[carousel-item]>*",ELEM_LEFT:"layui-carousel-left",ELEM_RIGHT:"layui-carousel-right",ELEM_PREV:"layui-carousel-prev",ELEM_NEXT:"layui-carousel-next",ELEM_ARROW:"layui-carousel-arrow",ELEM_IND:"layui-carousel-ind"},render:function(){var e=this,i=e.config;e.elemItem=i.elem.find(s.ELEM_ITEM),i.index<0&&(i.index=0),i.index>=e.elemItem.length&&(i.index=e.elemItem.length-1),i.interval<800&&(i.interval=800),i.full?i.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):i.elem.css({width:i.width,height:i.height}),i.elem.attr("lay-anim",i.anim),e.elemItem.eq(i.index).addClass(s.CLASS_THIS),e.indicator(),e.arrow(),e.autoplay()},extendsInstance:function(){var i=this;return{elemInd:i.elemInd,elemItem:i.elemItem,timer:i.timer,"goto":function(e){i["goto"](e)}}}}),s=t.CONST,n=t.Class;n.prototype.prevIndex=function(){var e=this.config.index-1;return e=e<0?this.elemItem.length-1:e},n.prototype.nextIndex=function(){var e=this.config.index+1;return e=e>=this.elemItem.length?0:e},n.prototype.addIndex=function(e){var i=this.config;i.index=i.index+(e=e||1),i.index>=this.elemItem.length&&(i.index=0)},n.prototype.subIndex=function(e){var i=this.config;i.index=i.index-(e=e||1),i.index<0&&(i.index=this.elemItem.length-1)},n.prototype.autoplay=function(){var e=this,i=e.config,t=e.elemItem.length;i.autoplay&&(clearInterval(e.timer),1',''].join(""));e.elem.attr("lay-arrow",e.arrow),e.elem.find("."+s.ELEM_ARROW)[0]&&e.elem.find("."+s.ELEM_ARROW).remove(),1t.index?i.slide("add",e-t.index):e
                          ',(i=[],layui.each(e.elemItem,function(e){i.push("")}),i.join("")),"
                        "].join(""));t.elem.attr("lay-indicator",t.indicator),t.elem.find("."+s.ELEM_IND)[0]&&t.elem.find("."+s.ELEM_IND).remove(),1n[a?"height":"width"]()/3)&&o.slide(0"),i=1;i<=a.length;i++){var n='
                      • ";a.half&&parseInt(a.value)!==a.value&&i==Math.ceil(a.value)?t=t+'
                      • ":t+=n}t+="",a.text&&(t+=''+a.value+"");var s=a.elem,o=s.next("."+c.ELEM);o[0]&&o.remove(),e.elemTemplate=u(t),a.span=e.elemTemplate.next("span"),a.setText&&a.setText(a.value),s.html(e.elemTemplate),s.addClass("layui-inline"),a.readonly||e.action()},extendsInstance:function(){var a=this,l=a.config;return{setvalue:function(e){l.value=e,a.render()}}}}),c=l.CONST;l.Class.prototype.action=function(){var n=this.config,t=this.elemTemplate,i=t.find("i").width(),l=t.children("li");l.each(function(e){var a=e+1,l=u(this);l.on("click",function(e){n.value=a,n.half&&e.pageX-u(this).offset().left<=i/2&&(n.value=n.value-.5),n.text&&t.next("span").text(n.value),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value)}),l.on("mousemove",function(e){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+a+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&e.pageX-u(this).offset().left<=i/2&&l.children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)}),l.on("mouseleave",function(){t.find("i").each(function(){u(this).addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF)}),t.find("i:lt("+Math.floor(n.value)+")").each(function(){u(this).addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE)}),n.half&&parseInt(n.value)!==n.value&&t.children("li:eq("+Math.floor(n.value)+")").children("i").addClass(c.ICON_RATE_HALF).removeClass(c.ICON_SOLID_RATE)})}),a.touchSwipe(t,{onTouchMove:function(e,a){var i;Date.now()-a.timeStart<=200||(a=e.touches[0].pageX,e=t.width()/n.length,a=(a-t.offset().left)/e,(i=(i=(e=a%1)<=.5&&n.half?.5+(a-e):Math.ceil(a))>n.length?n.length:i)<0&&(i=0),l.each(function(e){var a=u(this).children("i"),l=Math.ceil(i)-e==1,t=Math.ceil(i)>e,e=i-e==.5;t?(a.addClass(c.ICON_RATE_SOLID).removeClass(c.ICON_HALF_RATE),n.half&&e&&a.addClass(c.ICON_RATE_HALF).removeClass(c.ICON_RATE_SOLID)):a.addClass(c.ICON_RATE).removeClass(c.ICON_SOLID_HALF),a.toggleClass("layui-rate-hover",l)}),n.value=i,n.text&&t.next("span").text(n.value),n.setText&&n.setText(n.value))},onTouchEnd:function(e,a){Date.now()-a.timeStart<=200||(t.find("i").removeClass("layui-rate-hover"),n.choose&&n.choose(n.value),n.setText&&n.setText(n.value))}})},e(c.MOD_NAME,l)});layui.define(["i18n","component"],function(o){"use strict";var L=layui.$,g=layui.i18n,v=layui.component({name:"flow",CONST:{ELEM_LOAD:'',ELEM_MORE:"layui-flow-more",FLOW_SCROLL_EVENTS:"scroll.lay_flow_scroll",LAZYIMG_SCROLL_EVENTS:"scroll.lay_flow_lazyimg_scroll"},render:function(){var i,n,r=this.config,c=0,o=r.elem;if(o[0]){var e,a=L(r.scrollElem||document),m="mb"in r?r.mb:50,l=!("isAuto"in r)||r.isAuto,t=r.moreText||g.$t("flow.loadMore"),f=r.end||g.$t("flow.noMore"),s="top"===(r.direction||"bottom"),u=r.scrollElem&&r.scrollElem!==document,d=""+t+"",E=L('"),p=(o.find("."+T.ELEM_MORE).remove(),o[s?"prepend":"append"](E),function(o,e){var l=u?a.prop("scrollHeight"):document.documentElement.scrollHeight,t=a.scrollTop();E[s?"after":"before"](o),(e=0==e||null)?E.html(f):y.html(d),n=e,i=null,r.isLazyimg&&v.lazyimg({elem:r.elem.find("img[lay-src]"),scrollElem:r.scrollElem,direction:r.direction,id:r.id}),s&&(o=u?a.prop("scrollHeight"):document.documentElement.scrollHeight,1===c?a.scrollTop(o):1=i&&o<=n&&e.attr("lay-src")&&(l=e.attr("lay-src"),layui.img(l,function(){var o=t.eq(u);e.attr("src",l).removeAttr("lay-src"),o[0]&&E(o),u++},function(){e.removeAttr("lay-src")}))};if(o)l(o);else for(var r=0;r"),preview:"Preview"},wordWrap:!0,lang:"text",highlighter:!1,langMarker:!1,highlightLine:{focus:{range:"",comment:!1,classActiveLine:"layui-code-line-has-focus",classActivePre:"layui-code-has-focused-lines"},hl:{comment:!1,classActiveLine:"layui-code-line-highlighted"},"++":{comment:!1,classActiveLine:"layui-code-line-diff-add"},"--":{comment:!1,classActiveLine:"layui-code-line-diff-remove"}}},O=layui.code?layui.code.index+1e4:0,P=function(e){return String(e).replace(/\s+$/,"").replace(/^\n|\n$/,"")},R=function(e){return"string"!=typeof e?[]:A.map(e.split(","),function(e){var e=e.split("-"),i=parseInt(e[0],10),e=parseInt(e[1],10);return i&&e?A.map(new Array(e-i+1),function(e,t){return i+t}):i||undefined})},H=/(?:\/\/|\/\*{1,2}||-->)?/;e("code",function(r,e){var u,a,t,i,l,n,o,c,s,d,y,p,E,h,f,v,m,L,g,M,_,C={config:r=A.extend(!0,{},j,r),reload:function(e){layui.code(this.updateOptions(e))},updateOptions:function(e){return delete(e=e||{}).elem,A.extend(!0,r,e)},reloadCode:function(e){layui.code(this.updateOptions(e),"reloadCode")}},w=A(r.elem);return 1',r.ln?['
                        ',x.digit(t+1)+".","
                        "].join(""):"",'
                        ',(d.needParseComment?e.replace(H,""):e)||" ","
                        ",""].join("")}),d.preClass&&u.addClass(d.preClass),{lines:s,html:e}},i=r.code,l=function(e){return"function"==typeof r.codeParse?r.codeParse(e,r):e},"reloadCode"===e?u.children(".layui-code-wrap").html(w(l(i)).html):(n=layui.code.index=++O,u.attr("lay-code-index",n),(M=T.CDDE_DATA_CLASS in u.data())&&u.attr("class",u.data(T.CDDE_DATA_CLASS)||""),M||u.data(T.CDDE_DATA_CLASS,u.attr("class")),o={copy:{className:"file-b",title:[W.$t("code.copy")],event:function(e){var t=x.unescape(l(r.code)),i="function"==typeof r.onCopy;lay.clipboard.writeText({text:t,done:function(){if(i&&!1===r.onCopy(t,!0))return;N.msg(W.$t("code.copied"),{icon:1})},error:function(){if(i&&!1===r.onCopy(t,!1))return;N.msg(W.$t("code.copyError"),{icon:2})}})}}},function b(){var e=u.parent("."+T.ELEM_PREVIEW),t=e.children("."+T.ELEM_TAB),i=e.children("."+T.ELEM_ITEM+"-preview");return t.remove(),i.remove(),e[0]&&u.unwrap(),b}(),r.preview&&(M="LAY-CODE-DF-"+n,h=r.layout||["code","preview"],c="iframe"===r.preview,E=A('
                        '),_=A('
                        '),s=A('
                        '),g=A('
                        '),d=A('
                        '),r.id&&E.attr("id",r.id),E.addClass(r.className),_.attr("lay-filter",M),layui.each(h,function(e,t){var i=A('
                      • ');0===e&&i.addClass("layui-this"),i.html(r.text[t]),s.append(i)}),A.extend(o,{full:{className:"screen-full",title:[W.$t("code.maximize"),W.$t("code.restore")],event:function(e){var e=e.elem,t=e.closest("."+T.ELEM_PREVIEW),i="layui-icon-"+this.className,a="layui-icon-screen-restore",l=this.title,n=A("html,body"),o="layui-scrollbar-hide";e.hasClass(i)?(t.addClass(T.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[1]),n.addClass(o)):(t.removeClass(T.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[0]),n.removeClass(o))}},window:{className:"release",title:[W.$t("code.preview")],event:function(e){x.openWin({content:l(r.code)})}}}),r.copy&&("array"===layui.type(r.tools)?-1===r.tools.indexOf("copy")&&r.tools.unshift("copy"):r.tools=["copy"]),d.on("click",">i",function(){var e=A(this),t=e.data("type"),e={elem:e,type:t,options:r,rawCode:r.code,finalCode:x.unescape(l(r.code))};o[t]&&"function"==typeof o[t].event&&o[t].event(e),"function"==typeof r.toolsEvent&&r.toolsEvent(e)}),r.addTools&&r.tools&&(r.tools=[].concat(r.tools,r.addTools)),layui.each(r.tools,function(e,t){var i="object"==typeof t,a=i?t:o[t]||{className:t,title:[t]},l=a.className||a.type,n=a.title||[""],i=i?a.type||l:t;i&&(o[i]||((t={})[i]=a,A.extend(o,t)),d.append(''))}),u.addClass(T.ELEM_ITEM).wrap(E),_.append(s),r.tools&&_.append(d),u.before(_),c&&g.html(''),y=function(e){var t=e.children("iframe")[0];c&&t?t.srcdoc=l(r.code):e.html(r.code),setTimeout(function(){"function"==typeof r.done&&r.done({container:e,options:r,render:function(){S.render(e.find(".layui-form")),I.render(),D.render({elem:["."+T.ELEM_PREVIEW,".layui-tabs"].join(" ")})}})},3)},"preview"===h[0]?(g.addClass(T.ELEM_SHOW),u.before(g),y(g)):u.addClass(T.ELEM_SHOW).after(g),r.previewStyle=[r.style,r.previewStyle].join(""),g.attr("style",r.previewStyle),I.on("tab("+M+")",function(e){var t=A(this),i=A(e.elem).closest("."+T.ELEM_PREVIEW).find("."+T.ELEM_ITEM),e=i.eq(e.index);i.removeClass(T.ELEM_SHOW),e.addClass(T.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=A(''),u.addClass((E=["layui-code-view layui-border-box"],r.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(_=r.theme||r.skin)&&(u.removeClass("layui-code-theme-dark layui-code-theme-light"),u.addClass("layui-code-theme-"+_)),r.highlighter&&u.addClass([r.highlighter,"language-"+r.lang,"layui-code-hl"].join(" ")),h=w(r.encode?x.escape(l(i)):i),f=h.lines,u.html(p.html(h.html)),r.ln&&u.append('
                        '),r.height&&p.css("max-height",r.height),r.codeStyle=[r.style,r.codeStyle].join(""),r.codeStyle&&p.attr("style",function(e,t){return(t||"")+r.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:u[0],id:"DF-code-"+n,text:A.map(A.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+n+'"]',e].join(" ")}).join("")}),L=function b(){var e,a;return r.ln&&(e=Math.floor(f.length/100),a=p.children("."+T.ELEM_LINE).last().children("."+T.ELEM_LINE_NUM).outerWidth(),u.addClass(T.ELEM_LN_MODE),e)&&a>T.LINE_RAW_WIDTH&&lay.getStyleRules(m,function(e,t){try{v[t].setValue(e,a)}catch(i){}}),b}(),r.header&&((g=A('
                        ')).html(r.title||r.text.code),u.prepend(g)),M=A('
                        '),r.copy&&!r.preview&&((_=A(['','',""].join(""))).on("click",function(){o.copy.event()}),M.append(_)),r.langMarker&&M.append(''+r.lang+""),r.about&&M.append(r.about),u.append(M),r.preview||setTimeout(function(){"function"==typeof r.done&&r.done({})},3),r.elem.length===1+n&&"function"==typeof r.allDone&&r.allDone())),C})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss"); \ No newline at end of file diff --git a/public/static/assets/mbui/css/mbui.css b/public/static/assets/mbui/css/mbui.css new file mode 100644 index 0000000..5e8c00b --- /dev/null +++ b/public/static/assets/mbui/css/mbui.css @@ -0,0 +1,1976 @@ +@import url("../../icon/iconfont.css"); +:root { + --color-gray-50: #f8fafc; + --color-gray-100: #f0f1f0; + --color-gray-200: #eeeeee; + --color-gray-300: #cccccc; + --color-gray-400: #9B9B9B; + --color-gray-500: #666666; + --color-gray-600: #475569; + --color-gray-700: #334155; + --color-gray-800: #1e293b; + --color-gray-900: #0f172a; + --color-gray-950: #020617; + + --color-blue-50: #eff6ff; + --color-blue-100: #dbeafe; + --color-blue-200: #bfdbfe; + --color-blue-300: #93c5fd; + --color-blue-400: #60a5fa; + --color-blue-500: #3b82f6; + --color-blue-600: #2563eb; + --color-blue-700: #1d4ed8; + --color-blue-800: #1e40af; + --color-blue-900: #1e3a8a; + --color-blue-950: #172554; + + --color-cyan-50: #ecfeff; + --color-cyan-100: #cffafe; + --color-cyan-200: #a5f3fc; + --color-cyan-300: #67e8f9; + --color-cyan-400: #22d3ee; + --color-cyan-500: #06b6d4; + --color-cyan-600: #0891b2; + --color-cyan-700: #0e7490; + --color-cyan-800: #155e75; + --color-cyan-900: #164e63; + --color-cyan-950: #083344; + + --color-green-50: #f0fdf4; + --color-green-100: #dcfce7; + --color-green-200: #bbf7d0; + --color-green-300: #86efac; + --color-green-400: #4ade80; + --color-green-500: #22c55e; + --color-green-600: #16a34a; + --color-green-700: #15803d; + --color-green-800: #166534; + --color-green-900: #14532d; + --color-green-950: #052e16; + + --color-lime-50: #f7fee7; + --color-lime-100: #ecfccb; + --color-lime-200: #d9f99d; + --color-lime-300: #bef264; + --color-lime-400: #a3e635; + --color-lime-500: #84cc16; + --color-lime-600: #65a30d; + --color-lime-700: #4d7c0f; + --color-lime-800: #3f6212; + --color-lime-900: #365314; + --color-lime-950: #1a2e05; + + --color-yellow-50: #fffbeb; + --color-yellow-100: #fef3c7; + --color-yellow-200: #fde68a; + --color-yellow-300: #fcd34d; + --color-yellow-400: #fbbf24; + --color-yellow-500: #f59e0b; + --color-yellow-600: #d97706; + --color-yellow-700: #b45309; + --color-yellow-800: #92400e; + --color-yellow-900: #78350f; + --color-yellow-950: #451a03; + + --color-orange-50: #fff7ed; + --color-orange-100: #ffedd5; + --color-orange-200: #fed7aa; + --color-orange-300: #fdba74; + --color-orange-400: #fb923c; + --color-orange-500: #f97316; + --color-orange-600: #ea580c; + --color-orange-700: #c2410c; + --color-orange-800: #9a3412; + --color-orange-900: #7c2d12; + --color-orange-950: #431407; + + --color-red-50: #fef2f2; + --color-red-100: #fee2e2; + --color-red-200: #fecaca; + --color-red-300: #fca5a5; + --color-red-400: #f87171; + --color-red-500: #ef4444; + --color-red-600: #dc2626; + --color-red-700: #b91c1c; + --color-red-800: #991b1b; + --color-red-900: #7f1d1d; + --color-red-950: #450a0a; + + --color-pink-50: #fdf2f8; + --color-pink-100: #fce7f3; + --color-pink-200: #fbcfe8; + --color-pink-300: #f9a8d4; + --color-pink-400: #f472b6; + --color-pink-500: #ec4899; + --color-pink-600: #db2777; + --color-pink-700: #be185d; + --color-pink-800: #9d174d; + --color-pink-900: #831843; + --color-pink-950: #500724; + + --color-purple-50: #faf5ff; + --color-purple-100: #f3e8ff; + --color-purple-200: #e9d5ff; + --color-purple-300: #d8b4fe; + --color-purple-400: #c084fc; + --color-purple-500: #a855f7; + --color-purple-600: #9333ea; + --color-purple-700: #7e22ce; + --color-purple-800: #6b21a8; + --color-purple-900: #581c87; + --color-purple-950: #3b0764; + + --color-black: #000; + --color-white: #fff; + --color-body: #F2F3F5; + --black-shadow: rgba(0,0,0,.72); + --white-shadow: rgba(255,255,255,.72); + + --xs: 2px; + --sm: 4px; + --md: 6px; + --lg: 8px; + --xl: 10px; + --2xl: 12px; + --3xl: 16px; + --4xl: 20px; + --5xl: 24px; + --6xl: 30px; + + --shadow: 0 1px 4px 0 rgba(0, 0, 0, .15), 0 1px 2px -1px rgba(0, 0, 0, .1); + --shadow-md: 0 2px 6px -1px rgba(0, 0, 0, .2), 0 1px 4px -2px rgba(0, 0, 0, .15); + --shadow-lg: 0 4px 12px -4px rgba(0, 0, 0, .2), 0 4px 12px -4px rgba(0, 0, 0, .15); + --shadow-xl: 0 6px 20px -6px rgba(0, 0, 0, .2), 0 8px 20px -6px rgba(0, 0, 0, .15); + --shadow-2xl: 0 10px 30px -10px rgba(0, 0, 0, .4), 0 8px 20px -10px rgba(0, 0, 0, .3); +} +/*light dark*/ +@media (prefers-color-scheme:dark) { +:root { + --color-gray-50: #020617; + --color-gray-100: #0f172a; + --color-gray-200: #1e293b; + --color-gray-300: #334155; + --color-gray-400: #475569; + --color-gray-500: #888888; + --color-gray-600: #9B9B9B; + --color-gray-700: #aaaaaa; + --color-gray-800: #dddddd; + --color-gray-900: #cccccc; + --color-gray-950: #f0f0f0; + + --color-blue-50: #172554; + --color-blue-100: #1e3a8a; + --color-blue-200: #1e40af; + --color-blue-300: #1d4ed8; + --color-blue-400: #2563eb; + --color-blue-500: #3b82f6; + --color-blue-600: #60a5fa; + --color-blue-700: #93c5fd; + --color-blue-800: #bfdbfe; + --color-blue-900: #dbeafe; + --color-blue-950: #eff6ff; + + --color-cyan-950: #ecfeff; + --color-cyan-900: #cffafe; + --color-cyan-800: #a5f3fc; + --color-cyan-700: #67e8f9; + --color-cyan-600: #22d3ee; + --color-cyan-500: #06b6d4; + --color-cyan-400: #0891b2; + --color-cyan-300: #0e7490; + --color-cyan-200: #155e75; + --color-cyan-100: #164e63; + --color-cyan-50: #083344; + + --color-green-50: #052e16; + --color-green-100: #14532d; + --color-green-200: #166534; + --color-green-300: #15803d; + --color-green-400: #16a34a; + --color-green-500: #22c55e; + --color-green-600: #4ade80; + --color-green-700: #86efac; + --color-green-800: #bbf7d0; + --color-green-900: #dcfce7; + --color-green-950: #f0fdf4; + + --color-lime-950: #f7fee7; + --color-lime-900: #ecfccb; + --color-lime-800: #d9f99d; + --color-lime-700: #bef264; + --color-lime-600: #a3e635; + --color-lime-500: #84cc16; + --color-lime-400: #65a30d; + --color-lime-300: #4d7c0f; + --color-lime-200: #3f6212; + --color-lime-100: #365314; + --color-lime-50: #1a2e05; + + --color-yellow-50: #451a03; + --color-yellow-100: #78350f; + --color-yellow-200: #92400e; + --color-yellow-300: #b45309; + --color-yellow-400: #d97706; + --color-yellow-500: #f59e0b; + --color-yellow-600: #fbbf24; + --color-yellow-700: #fcd34d; + --color-yellow-800: #fde68a; + --color-yellow-900: #fef3c7; + --color-yellow-950: #fffbeb; + + --color-orange-950: #fff7ed; + --color-orange-900: #ffedd5; + --color-orange-800: #fed7aa; + --color-orange-700: #fdba74; + --color-orange-600: #fb923c; + --color-orange-500: #f97316; + --color-orange-400: #ea580c; + --color-orange-300: #c2410c; + --color-orange-200: #9a3412; + --color-orange-100: #7c2d12; + --color-orange-50: #431407; + + --color-red-50: #450a0a; + --color-red-100: #7f1d1d; + --color-red-200: #991b1b; + --color-red-300: #b91c1c; + --color-red-400: #dc2626; + --color-red-500: #ef4444; + --color-red-600: #f87171; + --color-red-700: #fca5a5; + --color-red-800: #fecaca; + --color-red-900: #fee2e2; + --color-red-950: #fef2f2; + + --color-pink-50: #500724; + --color-pink-100: #831843; + --color-pink-200: #9d174d; + --color-pink-300: #be185d; + --color-pink-400: #db2777; + --color-pink-500: #ec4899; + --color-pink-600: #f472b6; + --color-pink-700: #f9a8d4; + --color-pink-800: #fbcfe8; + --color-pink-900: #fce7f3; + --color-pink-950: #fdf2f8; + + --color-purple-50: #3b0764; + --color-purple-100: #581c87; + --color-purple-200: #6b21a8; + --color-purple-300: #7e22ce; + --color-purple-400: #9333ea; + --color-purple-500: #a855f7; + --color-purple-600: #c084fc; + --color-purple-700: #d8b4fe; + --color-purple-800: #e9d5ff; + --color-purple-900: #f3e8ff; + --color-purple-950: #faf5ff; + + --color-black: #ffffff; + --color-white: #181818; + --color-body: #111111; + --black-shadow: rgba(255,255,255,.72); + --white-shadow: rgba(0,0,0,.72); + } +} + +html,body {background: var(--color-body);margin:0; padding:0;height: 100%; width: 100%; background-origin: border-box;box-sizing: border-box; + -webkit-overflow-scrolling: touch; + -webkit-touch-callout: none; +} +html {-webkit-text-size-adjust: 100%;} +body {font-size:16px; line-height: 1.5; color:var(--color-gray-900); font-family: -apple-system-font, Helvetica Neue, sans-serif; min-height: 100vh; overflow: auto;} +#root {-webkit-tap-highlight-color: transparent; width:100%;} +#app {max-width: 640px; min-width: 320px; margin-left: auto; margin-right: auto; min-height: 100vh; position: relative;} + +div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,select,textarea,blockquote,p{padding:0; margin:0; user-select: none; box-sizing: border-box;} +table,td,tr,th{font-size:14px;} +img{vertical-align:top;border:0;} +ol,ul{list-style:none;} +li{list-style-type:none;} +h1,h2,h3,h4,h5,h6 {font-size:20px;} +address,code,em,th,s,i{font-weight:normal; font-style:normal;} +:before,:after{box-sizing: border-box;} + +/*float*/ +.l,.left{float:left;} +.r,.right{float:right;} +.clearfix {display: block;} +.clearfix:after {clear: both;content: "";display: block} + +.flex{display:flex;} +.justify-between{-ms-flex-align: center;-ms-flex-pack: justify; -webkit-align-items: center; -webkit-justify-content: space-between; align-items: center; display: -ms-flexbox; display: -webkit-flex; justify-content: space-between;} +.text-content{word-wrap: break-word;} +.center{text-align:center;} +/*display*/ +.hide{display:none;} +.block{display:block;} + +/*margin*/ +.margin-2{margin: var(--xs);} +.margin-4{margin: var(--sm);} +.margin-6{margin: var(--md);} +.margin-8{margin: var(--lg);} +.margin-10{margin: var(--xl);} +.margin-12{margin: var(--2xl);} +.margin-16{margin: var(--3xl);} +.margin-20{margin: var(--4xl);} +.margin-24{margin: var(--5xl);} +.margin-30{margin: var(--6xl);} + +.margin-2-t{margin-top: var(--xs);} +.margin-4-t{margin-top: var(--sm);} +.margin-6-t{margin-top: var(--md);} +.margin-8-t{margin-top: var(--lg);} +.margin-10-t{margin-top: var(--xl);} +.margin-12-t{margin-top: var(--2xl);} +.margin-16-t{margin-top: var(--3xl);} +.margin-20-t{margin-top: var(--4xl);} +.margin-24-t{margin-top: var(--5xl);} +.margin-30-t{margin-top: var(--6xl);} + +.margin-2-r{margin-right: var(--xs);} +.margin-4-r{margin-right: var(--sm);} +.margin-6-r{margin-right: var(--md);} +.margin-8-r{margin-right: var(--lg);} +.margin-10-r{margin-right: var(--xl);} +.margin-12-r{margin-right: var(--2xl);} +.margin-16-r{margin-right: var(--3xl);} +.margin-20-r{margin-right: var(--4xl);} +.margin-24-r{margin-right: var(--5xl);} +.margin-30-r{margin-right: var(--6xl);} + +.margin-2-b{margin-bottom: var(--xs);} +.margin-4-b{margin-bottom: var(--sm);} +.margin-6-b{margin-bottom: var(--md);} +.margin-8-b{margin-bottom: var(--lg);} +.margin-10-b{margin-bottom: var(--xl);} +.margin-12-b{margin-bottom: var(--2xl);} +.margin-16-b{margin-bottom: var(--3xl);} +.margin-20-b{margin-bottom: var(--4xl)} +.margin-24-b{margin-bottom: var(--5xl)} +.margin-30-b{margin-bottom: var(--6xl)} + +.margin-2-l{margin-left: var(--xs);} +.margin-4-l{margin-left: var(--sm);} +.margin-6-l{margin-left: var(--md);} +.margin-8-l{margin-left: var(--lg);} +.margin-10-l{margin-left: var(--xl);} +.margin-12-l{margin-left: var(--2xl);} +.margin-16-l{margin-left: var(--3xl);} +.margin-20-l{margin-left: var(--4xl);} +.margin-24-l{margin-left: var(--5xl);} +.margin-30-l{margin-left: var(--6xl);} + +.margin-2-lr{margin: 0 var(--xs);} +.margin-4-lr{margin: 0 var(--sm);} +.margin-6-lr{margin: 0 var(--md);} +.margin-8-lr{margin: 0 var(--lg);} +.margin-10-lr{margin: 0 var(--xl);} +.margin-12-lr{margin: 0 var(--2xl);} +.margin-16-lr{margin: 0 var(--3xl);} +.margin-20-lr{margin: 0 var(--4xl);} +.margin-24-lr{margin: 0 var(--5xl);} +.margin-30-lr{margin: 0 var(--6xl);} + +.margin-2-tb{margin: var(--xs) 0;} +.margin-4-tb{margin: var(--sm) 0;} +.margin-6-tb{margin: var(--md) 0;} +.margin-8-tb{margin: var(--lg) 0;} +.margin-10-tb{margin: var(--xl) 0;} +.margin-12-tb{margin: var(--2xl) 0;} +.margin-16-tb{margin: var(--3xl) 0;} +.margin-20-tb{margin: var(--4xl) 0;} +.margin-24-tb{margin: var(--5xl) 0;} +.margin-30-tb{margin: var(--6xl) 0;} + +/*padding*/ +.padding-2{padding: var(--xs);} +.padding-4{padding: var(--sm);} +.padding-6{padding: var(--md);} +.padding-8{padding: var(--lg);} +.padding-10{padding: var(--xl);} +.padding-12{padding: var(--2xl);} +.padding-16{padding: var(--3xl);} +.padding-20{padding: var(--4xl);} +.padding-24{padding: var(--5xl);} +.padding-30{padding: var(--6xl);} + +.padding-2-t{padding-top: var(--xs);} +.padding-4-t{padding-top: var(--sm);} +.padding-6-t{padding-top: var(--md);} +.padding-8-t{padding-top: var(--lg);} +.padding-10-t{padding-top: var(--xl);} +.padding-12-t{padding-top: var(--2xl);} +.padding-16-t{padding-top: var(--3xl);} +.padding-20-t{padding-top: var(--4xl);} +.padding-24-t{padding-top: var(--5xl);} +.padding-30-t{padding-top: var(--6xl);} + +.padding-2-r{padding-right: var(--xs);} +.padding-4-r{padding-right: var(--sm);} +.padding-6-r{padding-right: var(--md);} +.padding-8-r{padding-right: var(--lg);} +.padding-10-r{padding-right: var(--xl);} +.padding-12-r{padding-right: var(--2xl);} +.padding-16-r{padding-right: var(--3xl);} +.padding-20-r{padding-right: var(--4xl);} +.padding-24-r{padding-right: var(--5xl);} +.padding-30-r{padding-right: var(--6xl);} + +.padding-2-b{padding-bottom: var(--xs);} +.padding-4-b{padding-bottom: var(--sm);} +.padding-6-b{padding-bottom: var(--md);} +.padding-8-b{padding-bottom: var(--lg);} +.padding-10-b{padding-bottom: var(--xl);} +.padding-12-b{padding-bottom: var(--2xl);} +.padding-16-b{padding-bottom: var(--3xl);} +.padding-20-b{padding-bottom: var(--4xl)} +.padding-24-b{padding-bottom: var(--5xl)} +.padding-30-b{padding-bottom: var(--6xl)} + +.padding-2-l{padding-left: var(--xs);} +.padding-4-l{padding-left: var(--sm);} +.padding-6-l{padding-left: var(--md);} +.padding-8-l{padding-left: var(--lg);} +.padding-10-l{padding-left: var(--xl);} +.padding-12-l{padding-left: var(--2xl);} +.padding-16-l{padding-left: var(--3xl);} +.padding-20-l{padding-left: var(--4xl);} +.padding-24-l{padding-left: var(--5xl);} +.padding-30-l{padding-left: var(--6xl);} + +.padding-2-lr{padding: 0 var(--xs);} +.padding-4-lr{padding: 0 var(--sm);} +.padding-6-lr{padding: 0 var(--md);} +.padding-8-lr{padding: 0 var(--lg);} +.padding-10-lr{padding: 0 var(--xl);} +.padding-12-lr{padding: 0 var(--2xl);} +.padding-16-lr{padding: 0 var(--3xl);} +.padding-20-lr{padding: 0 var(--4xl);} +.padding-24-lr{padding: 0 var(--5xl);} +.padding-30-lr{padding: 0 var(--6xl);} + +.padding-2-tb{padding: var(--xs) 0;} +.padding-4-tb{padding: var(--sm) 0;} +.padding-6-tb{padding: var(--md) 0;} +.padding-8-tb{padding: var(--lg) 0;} +.padding-10-tb{padding: var(--xl) 0;} +.padding-12-tb{padding: var(--2xl) 0;} +.padding-16-tb{padding: var(--3xl) 0;} +.padding-20-tb{padding: var(--4xl) 0;} +.padding-24-tb{padding: var(--5xl) 0;} +.padding-30-tb{padding: var(--6xl) 0;} + +/*radius*/ +.radius{border-radius: 50%} +.radius-2{border-radius: var(--xs)} +.radius-4{border-radius: var(--sm)} +.radius-6{border-radius: var(--md)} +.radius-8{border-radius: var(--lg)} +.radius-10{border-radius: var(--xl)} +.radius-12{border-radius: var(--2xl)} +.radius-16{border-radius: var(--3xl)} +.radius-20{border-radius: var(--4xl)} +.radius-24{border-radius: var(--5xl)} +.radius-30{border-radius: var(--6xl)} + +/* 边框 */ +.border{border-width: 1px; border-style: solid; border-color: var(--color-gray-300); color: var(--color-gray-500);} +.border-red{border-width: 1px; border-style: solid; border-color: var(--color-red-500)!important; color: var(--color-red-500)!important;} +.border-orange{border-width: 1px; border-style: solid; border-color: var(--color-orange-500)!important; color: var(--color-orange-500)!important;} +.border-yellow{border-width: 1px; border-style: solid; border-color: var(--color-yellow-500)!important; color: var(--color-yellow-500)!important;} +.border-green{border-width: 1px; border-style: solid; border-color: var(--color-green-500)!important; color:var(--color-green-500)!important;} +.border-lime{border-width: 1px; border-style: solid; border-color: var(--color-lime-500)!important; color:var(--color-lime-500)!important;} +.border-cyan{border-width: 1px; border-style: solid; border-color: var(--color-cyan-500)!important; color: var(--color-cyan-500)!important;} +.border-blue{border-width: 1px; border-style: solid; border-color: var(--color-blue-500)!important; color: var(--color-blue-500)!important;} +.border-purple{border-width: 1px; border-style: solid; border-color: var(--color-purple-500)!important; color: var(--color-purple-500)!important;} +.border-black{border-width: 1px; border-style: solid; border-color: var(--color-black-900)!important; color: var(--color-black-900)!important;} +.border-gray{border-width: 1px; border-style: solid; border-color:var(--color-gray-300)!important; color: var(--color-gray-400)!important;} + +/* 背景颜色 */ +.bg-red{background-color: var(--color-red-500)!important; color: var(--color-white)!important;} +.bg-orange{background-color: var(--color-orange-500)!important; color: var(--color-white)!important;} +.bg-yellow{background-color: var(--color-yellow-500)!important; color: var(--color-white)!important;} +.bg-green{background-color: var(--color-green-500)!important; color: var(--color-white)!important;} +.bg-lime{background-color: var(--color-lime-500)!important; color:var(--color-white)!important} +.bg-cyan{background-color: var(--color-cyan-500)!important; color: var(--color-white)!important;} +.bg-blue{background-color: var(--color-blue-500)!important; color: var(--color-white)!important;} +.bg-pink{background-color: var(--color-pink-500)!important; color: var(--color-white)!important;} +.bg-purple{background-color: var(--color-purple-500)!important; color: var(--color-white)!important;} +.bg-black{background-color: var(--color-black-500)!important; color: var(--color-white)!important;} +.bg-white{background-color: var(--color-white)!important; color: var(--color-gray-900)!important;} +.bg-gray{background-color: var(--color-gray-100)!important; color: var(--color-gray-500)!important;} + +/* 文本颜色 */ +.text-red{color: var(--color-red-500)!important;} +.text-orange{color: var(--color-orange-500)!important;} +.text-yellow{color: var(--color-yellow-500)!important;} +.text-green{color: var(--color-green-500)!important;} +.text-lime{color: var(--color-lime-500)!important;} +.text-cyan{color: var(--color-cyan-500)!important;} +.text-blue{color: var(--color-blue-500)!important;} +.text-pink{color: var(--color-pink-500)!important;} +.text-purple{color: var(--color-purple-500)!important;} +.text-black{color: var(--color-gray-900)!important;} +.text-white{color: var(--color-white)!important;} +.text-gray{color: var(--color-gray-400)!important;} +.text-grey{color: var(--color-gray-200)!important;} + +/* 审核状态颜色 */ +.check-status-color-0{color: var(--color-gray-600)!important;} +.check-status-color-1{color: var(--color-blue-500)!important;} +.check-status-color-2{color: var(--color-green-500)!important;} +.check-status-color-3{color: var(--color-red-500)!important;} +.check-status-color-4{color: var(--color-gray-400)!important;} +.check-status-color-5{color: var(--color-lime-500)!important;} +.check-status-color-6{color: var(--color-orange-500)!important;} +.check-status-color-7{color: var(--color-yellow-500)!important;} +.check-status-color-8{color: var(--color-purple-500)!important;} + +/*font-size*/ +.fn{font-weight:normal!important;} +.fb{font-weight:bold!important;} +.fs{font-style:normal!important;} +.f10{font-size:10px!important;} +.f12{font-size:12px!important;} +.f13{font-size:13px!important;} +.f14{font-size:14px!important;} +.f15{font-size:15px!important;} +.f16{font-size:16px!important;} +.f18{font-size:18px!important;} +.f20{font-size:20px!important;} +.f24{font-size:24px!important;} +.f28{font-size:28px!important;} + +/*a*/ +a{text-decoration:none;color: var(--color-gray-900)} +/*ellipsis*/ +.line-limit-1,.line-limit-2,.line-limit-3,.line-limit-4,.line-limit-5{letter-spacing: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: -webkit-box !important; -webkit-box-orient: vertical; -webkit-line-clamp: 1;} +.line-limit-2{-webkit-line-clamp: 2;} +.line-limit-3{-webkit-line-clamp: 3;} +.line-limit-4{-webkit-line-clamp: 4;} +.line-limit-5{-webkit-line-clamp: 5;} + +/*border-1-px*/ +.border-top,.border-bottom,.border-left,.border-right{position:relative;} +.border-top:before,.border-left:before,.border-bottom:after,.border-right:after{content: " ";position: absolute; width: 200%; height: 0;pointer-events: none; transform: scale(0.5); transform-origin: 0 0;} +.border-top:before{border-top:1px solid var(--color-gray-300);top: 0; left: 0;} +.border-right:after{border-right:1px solid var(--color-gray-300);top: 0; right: 0;} +.border-bottom:after{border-bottom:1px solid var(--color-gray-300); bottom: 0; left: 0;} +.border-left:before{border-left:1px solid var(--color-gray-300);top: 0; left: 0;} + +/*avatar*/ +.avatar{align-items: center; aspect-ratio: 1/1; border-radius:4px; display: inline-flex; justify-content: center; overflow: hidden; width: 48px;height:48px;} +.avatar>img {margin: 0; -o-object-fit: cover; object-fit: cover; width: 100%; height: 100%;} +.avatar.sm{width: 36px;height:36px;} +.avatar.xs{width: 24px;height:24px;} +.avatar.lg{width: 60px;height:60px;} +.avatar.radius{border-radius:50%;} + +/*mbui-btn*/ +.mbui-btn{display: inline-block; vertical-align: middle; height: 42px; line-height: 42px; border: 1px solid transparent; padding: 0 16px;background-color: var(--color-blue-500); color: #f1f1f1; white-space: nowrap; text-align: center; font-size: 16px; border-radius: 4px; cursor: pointer; user-select: none;} +.mbui-btn:hover{opacity: 0.8; filter:alpha(opacity=80);} +.mbui-btn:active{opacity: 1; filter:alpha(opacity=100);} +.mbui-btn+.mbui-btn{margin-left: 10px;} +.mbui-btn-100{width:100%;} + +/* 原始 */ +.mbui-btn-primary{border-color: var(--color-gray-300); background: var(--color-gray-50); color: var(--color-gray-500);} +.mbui-btn-primary:hover{border-color: var(--color-gray-400); color: var(--color-gray-900);} +/* 百搭 */.mbui-btn-normal{background-color: var(--color-blue-500);} +/* 暖色 */.mbui-btn-warm{background-color: var(--color-yellow-500);} +/* 警告 */.mbui-btn-danger{background-color: var(--color-red-500);} +/* 常规 */.mbui-btn-green{background-color: var(--color-green-500);} +/* 选中 */.mbui-btn-checked{background-color: var(--color-lime-500);} +/* 禁用 */.mbui-btn-disabled, .mbui-btn-disabled:hover, .mbui-btn-disabled:active{border-color: var(--color-gray-300)!important; background-color:var(--color-gray-100)!important; color:var(--color-gray-300)!important; cursor: not-allowed !important; opacity: 1;} + +/* 大型 */.mbui-btn.lg{height: 48px; line-height: 48px; padding: 0 20px; font-size: 18px;} +/* 中型 */.mbui-btn.md{height: 42px; line-height: 42px; padding: 0 16px; font-size: 16px;} +/* 小型 */.mbui-btn.sm{height: 32px; line-height: 32px; padding: 0 12px; font-size: 14px;} +/* 超小 */.mbui-btn.xs{height: 24px; line-height: 24px; padding: 0 6px; font-size: 12px;} + + +/* 圆角 */ +.mbui-btn-radius{border-radius: 100px;} +.mbui-btn .mbui-icon{padding: 0 2px; vertical-align: middle\0; vertical-align: bottom;} + +/* 按钮组 */ +.mbui-btn-group{display: inline-block; vertical-align: middle; font-size: 0;} +.mbui-btn-group .mbui-btn{margin-left: 0!important; margin-right: 0!important; border-left: 1px solid rgba(255,255,255,.5); border-radius: 0;} +.mbui-btn-group .mbui-btn-primary{border-left: none;} +.mbui-btn-group .mbui-btn-primary:hover{border-color:var(--color-gray-300); color: var(--color-gray-500);} +.mbui-btn-group .mbui-btn:first-child{border-left: none; border-radius: 2px 0 0 2px;} +.mbui-btn-group .mbui-btn-primary:first-child{border-left: 1px solid var(--color-gray-300);} +.mbui-btn-group .mbui-btn:last-child{border-radius: 0 2px 2px 0;} +.mbui-btn-group .mbui-btn+.mbui-btn{margin-left: 0;} +.mbui-btn-group+.mbui-btn-group{margin-left: 10px;} + +/*mbui-list*/ +.mbui-list{padding: 10px 12px; vertical-align: middle; position: relative; align-items: center; background: var(--color-white); font-size: 16px; + display: -webkit-box; + display: -webkit-flex; + display: flex; +} +.mbui-list:before{content: " "; position: absolute; top: 0;left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-300); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + pointer-events: none; +} +.mbui-group .mbui-list:first-child:before {display:none} +.mbui-list-bd{display: block; color:var(--color-gray-400); width:120px; height: 24px; text-overflow: ellipsis; white-space: nowrap; flex: 1;} +.mbui-list-hd{width: 20px; height: 20px; margin-right: 14px; display: block;} +.mbui-list-ft{text-align: right; padding-left: 10px;} +.mbui-list-ft .mbui-badge{position: relative;top: -1px;} +.mbui-list-ft small{font-size: 16px; color: var(--color-gray-400);} +.mbui-list-ft-arrow{display: inline-block; width: 8px;height: 8px;margin-right: 2px; vertical-align:middle; + border-bottom: solid 2px var(--color-gray-300); + border-right: solid 2px var(--color-gray-300); + -webkit-transform: rotate(315deg); + -ms-transform: rotate(315deg); + transform: rotate(315deg); +} +.mbui-list-ft-arrow-up{display: inline-block; width: 8px;height: 8px; margin-right: 2px; vertical-align:middle; + border-top: solid 2px var(--color-gray-400); + border-right: solid 2px var(--color-gray-400); + -webkit-transform: rotate(315deg); + -ms-transform: rotate(315deg); + transform: rotate(315deg); +} +.mbui-list-ft-arrow-down{display: inline-block; width: 8px;height: 8px; margin-right: 2px; vertical-align:middle; + border-bottom: solid 2px var(--color-gray-400); + border-right: solid 2px var(--color-gray-400); + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} +a.mbui-list:active{background:var(--color-gray-100);} +a.mbui-list:active{background:var(--color-gray-100);} + +/*tabbar*/ +.tabbar-fixed{width: 100%; max-width: 480px; position: fixed; left: 50%; bottom: 0; z-index: 999;transform: translateX(-50%);} +.tabbar{display:flex;position:relative;z-index:500;background-color:var(--color-gray-100);} +.tabbar:before{content:" ";position:absolute;left:0;top:0;right:0;height:1px;border-top:1px solid var(--color-gray-100);color:var(--color-gray-100);-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.5);transform:scaleY(.5)} +.tabbar-item{display:block;flex:1;padding:3px 0 6px;padding-bottom:calc(6px + constant(safe-area-inset-bottom));padding-bottom:calc(6px + env(safe-area-inset-bottom));font-size:0;color:var(--color-gray-500);text-align:center;-webkit-tap-highlight-color:var(--color-black)} +.tabbar-item:first-child{padding-left:constant(safe-area-inset-left);padding-left:env(safe-area-inset-left)} +.tabbar-item:last-child{padding-right:constant(safe-area-inset-right);padding-right:env(safe-area-inset-right)} +.tabbar-icon{display:inline-block;width:28px;height:28px;margin-bottom:8px} +.tabbar-icon img{width:100%;height:100%} +.tabbar-icon>i.iconfont{font-size:24px;color:var(--color-gray-900);} +.tabbar-label{color:var(--color-gray-900); font-size:10px; line-height:1.4} +.bar-item-on .tabbar-label,.bar-item-on .tabbar-icon>i{color:var(--color-gray-700);} + +/*tab*/ +.mbui-tab {position: relative;width: 100%; display: block; line-height:24px;} +.mbui-tab .mbui-tab-title { padding: 0; margin: 0;list-style: none; position: relative; background: var(--color-white);} +.mbui-tab .mbui-tab-title:after{content: " ";position: absolute; width: 200%; height: 0;pointer-events: none; transform: scale(0.5); transform-origin: 0 0; border-bottom:1px solid var(--color-gray-300); bottom: 0; left: 0;} +.mbui-tab .mbui-tab-title a { display: inline-block;padding: 9px 0 11px; color: var(--color-gray-500); font-size: 16px; text-align: center;} +.mbui-tab .mbui-tab-title .active { position: relative; bottom: 0;} +.mbui-tab .mbui-tab-title .active a {border-bottom: 2px solid var(--color-blue-600); padding: 9px 0; color: var(--color-blue-600); position: relative; font-weight: 600;} +.mbui-tab .mbui-tab-title li { display: table-cell; width: 1%; text-align: center; position: relative;} +.mbui-tab .mbui-tab-title li .badge { padding: 0 4px; position: relative; top: -1px; margin-left: 2px;} +.mbui-tab .mbui-tab-title li small { color: var(--color-gray-500);} +.mbui-tab.tab-fixed {position: fixed !important; right: 0; left: 0; z-index: 10;} +.mbui-tab-item{ display: none;} +.mbui-tab-item.mbui-tab-show{ display: block;} + +.mbui-new-add{width:44px;height:44px; border-radius:50%; position:fixed;right:10px;bottom:48px; background-color:var(--color-blue-600);} +.mbui-new-add a{width:44px;height:44px;color:var(--color-white); font-size:24px;display: flex; justify-content: center;align-items: center;} +.mbui-new-add a i{font-size:24px;} + +/*bar*/ +.mbui-bar {backface-visibility: hidden; background-color: var(--white-shadow); backdrop-filter: blur(8px); width: 100%; display: block; position: relative; z-index: 10;} +.mbui-bar.bar-fixed { position: fixed !important; right: 0; left: 0; z-index: 10;} +header.mbui-bar.bar-fixed { top: 0;} +header.mbui-bar:before {content: " ";transform: scale(0.5); transform-origin: 0 0; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; bottom: 0; height: 200%; border-bottom: 1px solid rgba(0, 0, 0, 0.1); top: auto; bottom: -1px;} +header.mbui-bar:before, +header.mbui-bar:after { content: "";display: table;} +header.mbui-bar:after {clear: both;} +header.mbui-bar .mbui-bar-title {display: block; font-size: 18px;font-weight: bold; width: 100%; position: absolute; text-align: center; line-height: 46px; margin: 0; padding: 0; white-space: nowrap;} +header.mbui-bar .mbui-bar-title a {color: inherit;} +header.mbui-bar .mbui-bar-item { padding: 0 12px; font-size: 16px; line-height: 46px; position: relative;z-index: 10;color: var(--color-gray-900);} +header.mbui-bar .mbui-bar-item .mbui-bar-arrow-left { display: inline-block; width: 10px; height: 10px; border-bottom: solid 2px var(--color-gray-900); border-right: solid 2px var(--color-gray-900); margin-left: 2px; transform: rotate(135deg);} +header.mbui-bar.bar-primary{ border: none; background: var(--color-gray-900); color: var(--color-white);} +header.mbui-bar.bar-green { border: none; background: var(--color-green-500); color: var(--color-white);} +header.mbui-bar.bar-primary:before, +header.mbui-bar.bar-green:before { display: none;} +header.mbui-bar.bar-primary .mbui-bar-item, +header.mbui-bar.bar-green .mbui-bar-item { color: var(--color-white);} +header.mbui-bar.bar-primary .mbui-bar-item .mbui-bar-arrow-left, +header.mbui-bar.bar-green .mbui-bar-item .mbui-bar-arrow-left { border-bottom: solid 2px var(--color-white); border-right: solid 2px var(--color-white);} +footer.mbui-bar {height: 60px; display: table; position: relative;} +footer.mbui-bar.bar-fixed {bottom: 0;} +footer.mbui-bar:before { content: " ";transform: scale(0.5); transform-origin: 0 0; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100);} +footer.mbui-bar .mbui-bar-item {display: table-cell; text-align: center; vertical-align: middle; height: inherit; font-size: 12px;color:var(--color-gray-500)} +footer.mbui-bar .mbui-bar-item .mbui-bar-icon {width: 30px; height: 30px; line-height:24px; display: inline-block; position: relative;} +footer.mbui-bar .mbui-bar-item .mbui-bar-icon i{font-size:24px;} +footer.mbui-bar.tool-bar .mbui-bar-item .mbui-bar-icon i{font-weight:600;color: var(--color-gray-700);} +footer.mbui-bar .mbui-bar-item .mbui-bar-icon .mbui-badge {position: absolute; top: -2px; right: -10px;} +footer.mbui-bar .mbui-bar-item .mbui-bar-icon .mbui-badge.mbui-badge-dot { top: 0px; right: -4px;} +footer.mbui-bar .mbui-bar-item span { display: block;line-height: 1;} +footer.mbui-bar .mbui-bar-item.active {color: var(--color-blue-600);} + +.mbui-badge{ display: inline-block; padding: 2px 5px; z-index: 2; background: var(--color-red-500); font-weight: 400; border-radius: 50%; -webkit-border-radius: 50px; color: var(--color-white) !important; font-size: 12px !important; line-height: 1 !important; text-align: center; white-space: nowrap; font-style: normal;} +.mbui-badge-dot{ width: 9px; height: 9px; padding: 0; min-width: 0;} + +/*grid-9*/ +.mbui-grid{ background: var(--color-white); border-radius:6px;} +.mbui-grid .mbui-grid-title{padding:12px 12px 0; color:var(--color-gray-400);font-size:14px;} +.mbui-grid-box{padding:8px 0} +.mbui-grid .mbui-grid-item {width: 33.3333%; box-sizing: border-box; display: block; text-align: center; float: left; padding: 8px 8px 12px; line-height:1.32; color: var(--color-gray-500);font-size: 14px; position: relative;} +.mbui-grid.grid-4 .mbui-grid-item {width: 25%;} +.mbui-grid.border .mbui-grid-item:after { content: " "; pointer-events: none; position: absolute; top: 0; left: -1px; width: 200%; height: 200%; border-right: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-grid.border .mbui-grid-item:before { content: " "; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-grid .mbui-grid-item .mbui-grid-item-icon {width: 36px; height: 36px; display: block; margin: 8px auto; line-height:36px;} +.mbui-grid .mbui-grid-item .mbui-grid-item-icon i{font-size:32px; color:var(--color-blue-500)} +.mbui-grid .mbui-grid-item:nth-child(3n):after {border-right: none;} +.mbui-grid.border .mbui-grid-item:nth-last-child(-n+3):before {content: " "; position: absolute; top: 0; left: 0; width: 200%; bottom: 0; height: 200%; border-bottom: 1px solid var(--color-gray-100); transform: scale(0.5); transform-origin: 0 0; pointer-events: none;} +.mbui-grid .mbui-grid-item .mbui-grid-item-mun {height: 32px; font-size:24px; color:var(--color-blue-600); display: block; margin: 8px auto; line-height:32px;} +.mbui-grid.mbui-grid-bg .mbui-grid-item-icon{background-color:var(--color-blue-600); width: 36px; height: 36px; padding:6px; border-radius:6px;} +.mbui-grid.mbui-grid-bg .mbui-grid-item-icon i{font-size:26px; color:#f1f1f1} + +/* 用户面板 */ +.mbui-user-panel{padding:12px; background-color:var(--color-white); display: flex;} +.mbui-user-panel .avatar{margin-right:12px;} + +/* 面板 */ +.mbui-panel{position: relative; border-width: 1px; border-style: solid; border-radius: 2px; background-color: var(--color-white); color: var(--color-gray-500); box-shadow: 0 4px 8px -4px rgba(0,0,0,.13),0 6px 16px 0 rgba(0,0,0,.08),0 12px 24px 16px rgba(0,0,0,.04);} +.mbui-table{padding:0; margin:1px; background-color:var(--color-white); border:1px solid var(--color-gray-200);border-collapse: collapse; border-spacing: 0;} +.mbui-table th,.mbui-table td{padding:8px 4px; border:1px solid var(--color-gray-200); text-align:center; font-size:14px;} +.mbui-table th{background-color:var(--color-gray-50); color:var(--color-gray-500)} + +/*表单*/ +input, textarea {user-select: auto;} +input,button, textarea ,select{border: none; outline: none; + -webkit-appearance: none; + -webkit-user-select : text; + user-select: text; +} +input[disabled] {background: var(--color-gray-100);} +input::placeholder,textarea::placeholder {color: var(--color-gray-300);} +label input{vertical-align:middle; margin-right:3px;} +:focus {outline: 0;} +select{padding:4px 5px;border:1px solid var(--color-gray-300); border-radius:2px; margin-right:3px;} +input[type="file"] {display: block;} + +.mbui-input,.mbui-textarea{box-sizing: border-box;} + +.mbui-input, .mbui-textarea, +.mbui-form-pane .mbui-form-label, +.mbui-form-pane .mbui-form-item[pane]{border-color: var(--color-gray-300); font-size:16px;} +.mbui-form-label >i{color:var(--color-orange-600);} + +.mbui-input, .mbui-textarea{height: 44px; line-height: 1.3; border-width: 1px; border-style: solid; background-color: var(--color-white); color: var(--color-black); border-radius: 2px;} +.mbui-input::-webkit-input-placeholder, +.mbui-textarea::-webkit-input-placeholder{line-height: 1.3; color:var(--color-gray-400);} +.mbui-input, .mbui-textarea{display: block; width: 100%; padding-left: 10px;} +.mbui-input:focus, .mbui-textarea:focus{border-color: var(--color-blue-600) !important; box-shadow: 0 0 0 3px rgba(22,183,119,0.08);} +.mbui-textarea{position: relative; min-height: 100px; height: auto; line-height: 20px; padding: 6px 10px; resize: vertical;} +.mbui-input[disabled], .mbui-textarea[disabled]{background-color: var(--color-gray-100);} + +.mbui-form-item{position: relative; margin-bottom: 15px; clear: both; *zoom: 1;} +.mbui-form-item:after{content:'\20'; clear: both; *zoom: 1; display: block; height:0;} +.mbui-input-block, .mbui-input-inline{position: relative;} +.mbui-input-block{margin-left: 110px; min-height: 36px;} +.mbui-input-inline{display: inline-block; vertical-align: middle;} +.mbui-form-item .mbui-input-inline{float: left; width: 190px; margin-right: 10px;} +.mbui-form-text .mbui-input-inline{width: auto;} + +/*mbui-form-inline*/ +.mbui-group+.mbui-group{margin-top:var(--3xl);} +.mbui-group-title{padding:var(--3xl) var(--xl) var(--md) var(--2xl); font-size: 14px; color: var(--color-gray-400);font-weight: 400;display: flex;justify-content: space-between;} +.mbui-form-line{position: relative;background:var(--color-white);} +.mbui-form-line:before {content: " "; position: absolute; top: 0;left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-300); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + pointer-events: none; +} +.mbui-group .mbui-form-line:first-child:before{display:none} +/*input*/ +.mbui-form-label {width: 122px; padding: 14px 6px 14px 12px; color: var(--color-gray-400); line-height: 1; font-size: 16px; font-weight: 400; margin: 0; position: absolute;letter-spacing: 0; overflow: hidden; text-overflow: ellipsis; word-break: keep-all; display: -webkit-box !important; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1;} +.mbui-form-input { width: 100%; border: 0; outline: 0; font-size: 16px; box-shadow: none; appearance: none; -webkit-appearance: none; -moz-appearance:button; border-radius: 0; color: var(--color-gray-900); line-height:28px; padding: 8px 14px 8px 122px; background: var(--color-white);} +.mbui-form-suffix .mbui-form-input{width:calc(100% - 36px)} +.mbui-form-suffix .iconfont{font-size:20px; vertical-align:middle;} +/*radio*/ +.mbui-form-radio{ width: 100%; border: 0; font-size: 16px; color: var(--color-gray-900); padding: 3px 12px 3px 122px; background: var(--color-white); line-height:44px} +.mbui-form-radio .mbui-input-radio{width: 19px; height: 19px; appearance: none; position: relative;} +.mbui-form-radio .mbui-input-radio:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 50%; vertical-align: bottom;} +.mbui-form-radio .mbui-input-radio:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 50%; vertical-align: bottom;} +.mbui-form-radio .mbui-input-radio:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: bottom; transform: rotate(-45deg);} +.mbui-form-radio .mbui-input-radio + label{line-height: 19px; display: inline-block; margin-left: 3px; margin-right:16px;} + +/*checkbox*/ +.mbui-form-checkbox{ width: 100%; border: 0; font-size: 16px; color: var(--color-gray-900); padding: 14px 12px 14px 122px; background: var(--color-white); line-height:1.5} +.mbui-form-checkbox .mbui-input-checkbox{width: 19px; height: 19px; appearance: none; position: relative;} +.mbui-form-checkbox .mbui-input-checkbox:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 3px; vertical-align: bottom;} +.mbui-form-checkbox .mbui-input-checkbox:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 3px; vertical-align: bottom;} +.mbui-form-checkbox .mbui-input-checkbox:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: middle; transform: rotate(-45deg);} +.mbui-form-checkbox .mbui-input-checkbox + label{line-height: 19px; display: inline-block; margin-left: 3px; margin-right:16px;} + +/*select*/ +.mbui-form-select{position: static; width: 100%;} +.mbui-form-select > select {border-radius: 0;border: 0; width: 100%; padding-left: 122px; min-height: 44px; font-size: 16px; margin: 2px 0; background: var(--color-white); color: var(--color-gray-900);} +.mbui-form-select > select > option {padding: 6px; background-color: var(--color-gray-100); color: var(--color-gray-500);} +.mbui-form-select:after {content: ""; top: 20px; right: 16px; position: absolute; display: inline-block;font-size: 0; width: 8px; height: 8px; background-color: transparent; border-top: 2px solid var(--color-gray-400); border-left: 2px solid var(--color-gray-400);-webkit-transform: rotate(225deg); text-align:center;} + +.mbui-form-select.date-select:after{content: '📅'; font-size: 14px; width: 16px; height: 16px; top:12px; right: 12px; background-color: transparent; border:none;-webkit-transform: rotate(0);} +.mbui-form-select.admin-select:after{content: '👤'; font-size: 14px; width: 16px; height: 16px; top:12px; right: 12px; background-color: transparent; border:none;-webkit-transform: rotate(0);} + +.mbui-form-text{position: static; width: 100%; min-height: 44px; padding: 10px 14px 10px 122px;} + +.mbui-form-min .mbui-form-label{padding: 13px 6px 13px 12px; font-size:14px;} +.mbui-form-min .mbui-form-input{padding: 6px 14px 6px 122px;font-size:14px;} +.mbui-form-min .mbui-form-select > select {min-height: 40px; font-size: 14px;} +.mbui-form-min .mbui-form-text{position: static; width: 100%; padding: 6px 14px 6px 122px;font-size:14px;} + +/*uploader*/ +.mbui-form-uploader {width: 100%;border: 0;outline: 0;font-size: 16px; box-shadow: none; appearance: none;border-radius: 0; color: var(--color-gray-900); padding: 1px 12px 0 122px; background: var(--color-white); + -webkit-appearance: none; + -moz-appearance:button; +} +.mbui-form-uploader .mbui-uploader-btn-border { width: 100%; height: 44px; background: var(--color-white); border-radius: 0;display: block; text-align:right; position: relative;color:var(--color-gray-500);line-height:44px;} +.mbui-form-uploader .mbui-uploader-btn-border i{font-size:20px; font-weight:600} +.mbui-form-uploader input { opacity: 0; position: absolute;top: 0;left: 0;width: 100%; height: 100%;} + +.mbui-form-phone .mbui-form-input{padding: 16px 120px;} +.mbui-input-cell {float: none; width: 100%; padding: 14px 20px; position: static;} +.mbui-input-cell small {color: var(--color-gray-400);} +.mbui-form-static {font-size: 16px;width: 100%; padding: 14px 20px 14px 122px; margin-bottom: 0;} + +/*list-radio*/ +.mbui-radio-checkbox{position: relative; background:var(--color-white); width: 100%; font-size: 16px; color: var(--color-gray-900); padding:15px 14px;} +.mbui-radio-checkbox:before {content: " ";pointer-events: none;position: absolute; top: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-group .mbui-radio-checkbox:last-child:after {content: " ";pointer-events: none;position: absolute; bottom: 0; left: 0; width: 200%; height: 0; border-bottom: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-radio-checkbox label{width: 100%; position:relative; line-height:1.36; display:flex;justify-content:space-between;} + +.mbui-radio-checkbox .mbui-radio{width: 21px; height: 21px; appearance: none; position: relative;} +.mbui-radio-checkbox .mbui-radio:before{content: ''; width: 21px; height: 21px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 50%; vertical-align: middle;} +.mbui-radio-checkbox .mbui-radio:checked:before{border: 1px solid var(--color-blue-600); background:var(--color-blue-600); } +.mbui-radio-checkbox .mbui-radio:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 7px; left:5px; vertical-align: bottom; transform: rotate(-45deg);} + +.mbui-radio-checkbox .mbui-checkbox{width: 21px; height: 21px; appearance: none; position: relative;} +.mbui-radio-checkbox .mbui-checkbox:before{content: ''; width: 21px; height: 21px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 3px; vertical-align: middle;} +.mbui-radio-checkbox .mbui-checkbox:checked:before{border: 1px solid var(--color-blue-600); background:var(--color-blue-600);} +.mbui-radio-checkbox .mbui-checkbox:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 7px; left:5px; vertical-align: middle; transform: rotate(-45deg);} + +/*switch*/ +.mbui-switch { + padding: 14px 20px; +} +.mbui-switch .mbui-switch-text { + padding: 4px 0; + margin: 0; + font-size: 16px; + text-indent: 0 !important; +} +.mbui-switch .mbui-switch-text small { + color: var(--color-gray-400); +} +.mbui-switch > input[type="checkbox"] { + display: none; +} +.mbui-switch > label { + margin-bottom: 0; +} +.mbui-switch .mbui-switch_radius { + position: relative; + display: inline-block; + color: var(--color-gray-200); + width: 50px; + height: 32px; + background: var(--color-gray-200); + border-radius: 100px; + cursor: pointer; + transition: all 0.4s cubic-bezier(0.17, 0.67, 0.43, 0.98); + -webkit-transition: all 0.4s cubic-bezier(0.17, 0.67, 0.43, 0.98); + float: right; +} +.mbui-switch .mbui-switch_radius:active { + box-shadow: inset 0 0 0 1.2em var(--color-gray-300); + -webkit-box-shadow: inset 0 0 0 1.2em var(--color-gray-300); +} +.mbui-switch .mbui-switch_radius:before { + width: 30px; + height: 30px; + border-radius: 100px; + transition: margin-left 0.2s ease 0s; + -webkit-transition: margin-left 0.2s ease 0s; + margin: 1px; + background: var(--color-white); + box-shadow: inset 0 0 0 0.03em rgba(0, 0, 0, 0.1), 0 0 0.05em rgba(0, 0, 0, 0.05), 0 0.1em 0.2em rgba(0, 0, 0, 0.2); + -webkit-box-shadow: inset 0 0 0 0.03em rgba(0, 0, 0, 0.1), 0 0 0.05em rgba(0, 0, 0, 0.05), 0 0.1em 0.2em rgba(0, 0, 0, 0.2); +} +.mbui-switch .mbui-switch_radius:before, +.mbui-switch .mbui-switch_radius:after { + position: absolute; + content: ""; +} +.mbui-switch > input:checked + label { + background: var(--color-gray-900); + transition: all 0.15s ease-out; + -webkit-transition: all 0.15s ease-out; + box-shadow: inset 0 0 0 1.2em var(--color-gray-900); + -webkit-box-shadow: inset 0 0 0 1.2em var(--color-gray-900); +} +.mbui-switch > input:checked + label:active { + box-shadow: inset 0 0 0 1.2em var(--color-gray-900); + -webkit-box-shadow: inset 0 0 0 1.2em var(--color-gray-900); +} +.mbui-switch > input:checked + label:before { + margin-left: 19px; +} + +.mbui-checkbox_hd, +.mbui-radio_hd { + display: block; + margin-right: 14px; + line-height: 0; +} +.mbui-checkbox_bd, +.mbui-radio_bd { + width: 100%; + font-size: 16px; + display: block; + position: relative; + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; +} +.mbui-checkbox_bd small, +.mbui-radio_bd small { + color: var(--color-gray-400); +} +.mbui-radio .btn .mbui-radio_ft, +.mbui-checkbox .btn .mbui-checkbox_ft {width: 22px; height: 22px;display: inline-block;} +.mbui-checkbox .btn .mbui-checkbox_ft:after, +.mbui-checkbox .btn .mbui-checkbox_ft:before { + position: absolute; + display: block; + content: ""; + height: 1px; +} +.mbui-radio .btn .mbui-radio_ft:after, +.mbui-radio .btn .mbui-radio_ft:before { + position: absolute; + display: block; + content: ""; + height: 2px; +} +.mbui-radio .btn.active .mbui-radio_ft:after {margin-top: 19px; margin-left: -2px; width: 18px; background: var(--color-blue-600); + -webkit-transform: rotate(-45deg) translate3d(10px, 0, 0); + -moz-transform: rotate(-45deg) translate3d(10px, 0, 0); + transform: rotate(-45deg) translate3d(10px, 0, 0); + +} +.mbui-radio .btn.active .mbui-radio_ft:before { margin-top: 4px;margin-left: -2px; width: 8px; background: var(--color-blue-600); + -webkit-transform: rotate(45deg) translate3d(10px, 5px, 0); + -moz-transform: rotate(45deg) translate3d(10px, 5px, 0); + transform: rotate(45deg) translate3d(10px, 5px, 0); +} +.mbui-checkbox .btn .mbui-checkbox_ft { + border-radius: 100%; + -webkit-border-radius: 100%; + background: var(--color-white); + border: 1px solid var(--color-gray-300); +} +.mbui-checkbox .btn.active .mbui-checkbox_ft {background: var(--color-blue-600); border-color: var(--color-blue-600);} +.mbui-checkbox .btn.active .mbui-checkbox_ft:after { + -webkit-transform: rotate(-45deg) translate3d(10px, 0, 0); + -moz-transform: rotate(-45deg) translate3d(10px, 0, 0); + transform: rotate(-45deg) translate3d(10px, 0, 0); + margin-top: 17px; + margin-left: -1px; + width: 10px; + background: var(--color-white); +} +.mbui-checkbox .btn.active .mbui-checkbox_ft:before { + -webkit-transform: rotate(45deg) translate3d(11px, 4px, 0); + -moz-transform: rotate(45deg) translate3d(11px, 4px, 0); + transform: rotate(45deg) translate3d(11px, 4px, 0); + margin-top: 1px; + margin-left: -1px; + width: 5px; + background: var(--color-white); +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"] { + clip: rect(0, 0, 0, 0); + pointer-events: none; + position: absolute; + width: auto; + height: 100%; +} +.mbui-uploader { + background: var(--color-white); + position: relative; + padding: 0 20px; +} +.mbui-uploader:before { + content: " "; + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + pointer-events: none; + position: absolute; + top: 0; + left: 0; + width: 200%; + height: 0; + border-top: 1px solid var(--color-gray-100); +} +.mbui-uploader:after { + content: " "; + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + pointer-events: none; + position: absolute; + top: 0; + left: 0; + width: 200%; + bottom: 0; + height: 200%; + border-bottom: 1px solid var(--color-gray-100); +} +.mbui-uploader_title { + padding: 20px 0; + line-height: 1.1333; + font-size: 16px; + font-weight: 400; + margin: 0; + color: var(--color-gray-900); +} +.mbui-uploader_files { + list-style: none; + padding: 0; + margin: 0; +} +.mbui-uploader_files .mbui-uploader_files_item { + width: 90px; + height: 90px; + float: left; + margin-right: 10px; + margin-bottom: 20px; +} + +.mbui-uploader_files .mbui-uploader_files_item a, +.mbui-uploader_files .mbui-uploader_files_item img { + display: block; +} +.mbui-uploader_btn { + float: left; + position: relative; + width: 90px; + height: 90px; + margin-bottom: 20px; +} +.mbui-uploader_btn .mbui-uploader_btn_border { + float: left; + width: 100%; + height: 100%; + background: var(--color-white); + border: 1px dashed var(--color-gray-300); + border-radius: 6px; + display: block; + position: relative; + text-align: center; +} +.mbui-uploader_btn .mbui-uploader_btn_border:before, +.mbui-uploader_btn .mbui-uploader_btn_border:after { + content: " "; + position: absolute; + background: var(--color-gray-300); + display: block; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} +.mbui-uploader_btn .mbui-uploader_btn_border:after { + width: 2px; + height: 26px; +} +.mbui-uploader_btn .mbui-uploader_btn_border:before { + width: 26px; + height: 2px; +} +.mbui-uploader_btn input { + opacity: 0; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; +} + +/*steps*/ +.mbui-steps .mbui-steps-item { position: relative; padding-left: 25px; padding-bottom: 12px; font-size: 14px; color: var(--color-gray-600); font-weight: 600;} +.mbui-steps .mbui-steps-item small {padding-top:2px; display: block; font-size: 14px;color: var(--color-gray-400); font-weight: 400;} +.mbui-steps .mbui-steps-item:last-child:after {display: none;} +.mbui-steps .mbui-steps-item:before {position: absolute; content: " ";top: 5px; left: 3px; display: block; width: 13px; height: 13px; background: var(--color-gray-300); border-radius: 50%; z-index: 2;} +.mbui-steps .mbui-steps-item:after {position: absolute; content: " "; top: 5px; left: 9px; display: block; width: 1px; height: 100%; background: var(--color-gray-300);} +.mbui-steps .mbui-steps-item.success {color: var(--color-gray-900);} +.mbui-steps .mbui-steps-item.success:after, +.mbui-steps .mbui-steps-item.success:before {background: var(--color-gray-900);} +.mbui-steps .mbui-steps-item.active {color: var(--color-gray-900);font-weight: 600;} +.mbui-steps .mbui-steps-item.active small {font-weight: 400;} +.mbui-steps .mbui-steps-item.success:before, +.mbui-steps .mbui-steps-item.active:before {top: 3px; left: 6px; width: 12px;height: 12px;background: var(--color-gray-900);border: 4px solid var(--color-white);} + +/*layer - modal*/ +.mbui-layer {position: relative; z-index: 88;} +.mbui-layer *{box-sizing: border-box;} +.mbui-layershade {background-color:var(--black-shadow);pointer-events: auto;} +.mbui-layermain,.mbui-layershade { position: fixed; left: 0;top: 0; width: 100%; height: 100%;} +.mbui-layermain{display: table;} + +.mbui-layer .modal-dialog { width: 100%; margin: 0;padding: 0; display: table-cell; vertical-align: middle; text-align: center;} +.mbui-layer .modal-content {position: relative; background-clip: padding-box; background: var(--color-white); border-radius: 12px; max-width: 320px; margin-left: auto; margin-right: auto;animation: bounce-in 300ms 0ms ease both;} +@-webkit-keyframes bounce-in { + 0% { + opacity: 0; + -webkit-transform: scale(0.5); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + } +} + +.mbui-layer .modal-header {padding:12px 16px; font-size: 18px; text-align: center;font-weight: 600;} +.mbui-layer .modal-body { position: relative; padding: 0 16px 16px; font-size: 16px; color: var(--color-gray-500);text-align: center;} +.mbui-layer .modal-footer {padding: 0; position: relative;} + +.mbui-layer .modal-content .btn-default {background-color: var(--color-white);} +.mbui-layer .modal-content .btn-lg {font-size: 17px; padding: 12px 16px; border-radius: 0; border: none;} +.mbui-layer .modal-content .btn-lg:before {display: none;} + +.mbui-layer .modal-footer:before {content: " "; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-layer .modal-footer .btn { margin: 0; border: none; background: none; padding: 14px; width: 50%; text-align: center; float: left; color: var(--color-gray-900); font-size: 16px; border-bottom-left-radius: 4px; border-bottom-right-radius: 0; border-top-left-radius: 0; border-top-right-radius: 0; box-shadow: none; position: relative; box-sizing: border-box;} +.mbui-layer .modal-footer .btn:before {display: none;} +.mbui-layer .modal-footer .btn.active { color: var(--color-gray-900); font-weight: 600;} +.mbui-layer .modal-footer .btn:active { background: rgba(0, 0, 0, 0.05);} +.mbui-layer .modal-footer .btn + .btn { margin-left: 0; border-bottom-left-radius: 0; border-bottom-right-radius: 4px; border-top-left-radius: 0;border-top-right-radius: 0;} +.mbui-layer .modal-footer .btn + .btn:after { content: " ";pointer-events: none; position: absolute;top: 0; left: 0; width: 200%; height: 200%;border-left: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-layer .modal-footer .btn-block { width: 100%; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px;} +.mbui-layer .mbui-form-input { height: 40px; padding: 10px;} +.form-hairlines {position: relative;} +.form-hairlines:before {content: " "; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; height: 200%; border: 1px solid var(--color-gray-300); border-radius: 8px; + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-border-radius: 8px; +} +.form-hairlines input,.form-hairlines textarea { border: none; border-radius: 3px;} + +.mbui-layer .modal-content.modal-actionsheet{max-width: 100%;width: 100%;position: fixed; margin: 0;left: 0; bottom: 0;background:#EDEDED;} +.mbui-layer .modal-long .modal-body {padding: 0 16px; max-height: 320px; overflow-y: auto; text-align: left;} + +.mbui-layer .modal-content.modal-actionsheet.bottom{ + -webkit-animation: fade-in-up 300ms 0ms ease-in-out both; + animation: fade-in-up 300ms 0ms ease-in-out both; +} +@-webkit-keyframes fade-in-up { + 0% { + -webkit-transform: translateY(200px); + transform: translateY(200px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +.mbui-layer .modal-actionsheet .modal-body{padding:0;width:100%; text-align: left;} +.mbui-layer .modal-actionsheet .modal-body .actionsheet-btn {width: 100%; background: var(--color-white); position: relative; border-radius: 0; padding: 14px 20px; max-width: 100%; display: inline-block; font-size: 16px; font-weight: 600; margin-bottom: 0; line-height: 1.42857143; border: 0; text-align: center; white-space: nowrap; vertical-align: middle;touch-action: manipulation; cursor: pointer; + -webkit-user-select: none; + user-select: none; + background-image: none; + -webkit-appearance: none; +} +.mbui-layer .modal-actionsheet .modal-body .actionsheet-btn:after {content: " "; position: absolute; top: 0; left: 0;width: 200%; bottom: 0; height: 200%; border-bottom: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + pointer-events: none; +} +.mbui-layer .modal-actionsheet .modal-body .actionsheet-btn:first-child { border-top-left-radius: 12px; border-top-right-radius: 12px;} +.mbui-layer .modal-actionsheet .modal-footer { margin-top: 10px;} +.mbui-layer .modal-actionsheet .modal-footer .btn { background: var(--color-white); border-radius: 0; padding: 14px 16px; max-width: 100%;} + +.mbui-layer .modal-content.modal-view{max-width: 100%;width: 100%;position: fixed; margin: 0;left: 0; top: 0;border-radius: 0 0 12px 12px;} +.mbui-layer .modal-content.modal-view.top{ + -webkit-animation: fade-in-down 300ms 0ms ease-in-out both; + animation: fade-in-down 300ms 0ms ease-in-out both; +} +.mbui-layer .modal-view .modal-body{padding:0;width:100%; text-align: left;} + +/*layer - toast*/ +.mbui-toptips {font-size: 14px; width: 100%;z-index: 18888; padding: 10px; + -webkit-animation: fade-in-down 500ms 0ms ease both; + animation: fade-in-down 500ms 0ms ease both; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +@-webkit-keyframes fade-in-down { + 0% { + -webkit-transform: translateY(-40px); + } + 100% { + -webkit-transform: translateY(0); + } +} +.mbui-toptips:before {content: " "; pointer-events: none; position: absolute; top: 0; left: 0; width: 200%; bottom: 0; height: 200%; border-bottom: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + +} +.mbui-toptips i {width: 16px; height: 16px; min-width: 16px; display: inline-block; margin-right: 7px;overflow: hidden; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAABsCAMAAAAbkME5AAAA5FBMVEUAAAD/llrtUVXmoSbtUVbmoCbtUVXmoSbmoSXloSbtUFXmoSbuUVXmoSb/WVn/sjvmoSbooifvUlbyUljnpSbvU1bloSbtUVXtUFXmoCbmoCbtUVXtUVbmoSbtUVbnoiXlpCfwX1/wrS/tUVXsUVXsUFXtUFbmoSXsUFXloSXmoCXsUFbuUlXnoSbtUFbmoCXuUlbmoibsUFXloSbuUVbnoibsUVfnoCbuUVfooibwU1jmoiftUlvtpC71UlzroynsUFbsUlbtUFbuUVXloyntUFXloSbtUFXmoCbmoCXsUFXloCUgjMVLAAAASnRSTlMAA/r6xMS4rvblyMhkZAgIeUw7KChN7ezNzbeuoKBSUjsQEOT29fHx29u6r5OTj4+Ghmxsa2teXlhYNDQcHBkZ5Xp4RkWoqJmZPuxJ55cAAANkSURBVFjD7VbXcuowEJUhMZCAMb33hBZ6TSgJkG79///cXXsmLpKCPMzcp5w3r/bsaqtMGGiZkdrNBQK5rjrKaOQMGqvSveHAfWnVIGJop7bBoH0SuVGiB0slX57MqtXZpJy3vltRhaf/fIOHAXWxs2W7hRpA6c0zq79p4clDyitPPZhONl754x0aShIOkuj67tGjj2YGiiC4AZ66GBuwH4gSIaIB8LFxxHsA/VfyC16B0fqJXMFLuu1nVDXj9oEhKo6PgVvfALhdDmyj2sEkO1FCQsklwmscrJof4dCTzyskXHmyC6Kj2W9tqBc5TyBQwTZ24goylJIhpCBTK+u+KpEhENWMS4P+X8gRFjAfmpnBnRxhB8IMGUH/EzkCgfkY4cXKsoQyhts1jIksYWIYXZIzjJksYWYYOQLJrcoSqlAy3wTfV+IH/Y6Ed27Q/LQmkZDkppVXOGSUy0nCLZzdGiy4rWE3Hwtu87HtLQa2t2CASOp0Qhk7QIIRrcJZoMobUf4SUHIGIKcwqT4J1kzKMJHyrpmWJlhkDYvQYBaZcFV+ov4nuyqFy1g55vNHhVnG/te9/wfF/5Ml/yj6fnYvf9gR2pH363DULvo5Ofv784c//D/EE+NiLxsMZnvFcSJ+Tru5DoWpA+HQuvmbcb1DGXR0kRslFrFUCpXpvFabTysF6zsS447oyy0eBvvLvS3bL/tBlN6+sPpb03wo7ZWnQ6aTrVf+FEZDdcJBHV2Hnzz6FDAUrcohnroYW7AfjBEhYkHwsXXEGwH9N/IL3oAR+YlcwUu67SeKxYTbB4aoOD6Gbn0KcDOGttF4xCQ7ETJT7BLhNSJWzXU49OTzGgnXnuyCSDf7rYPGzhPQbQc7cQ0ZSssQ0pCptUXsExkC6ZtXiUPNlnKEJVQvbmZwL0fYm7keQ/8TOQKB+RiTIqUVWUKF0iLpUTqVJUwp7ZEspXNZwpzSLIHk1mQJNSiZb4LvK/GD/kDCBzdoflq/kfDNTSu/cKReqdQJt3B2a7DgtobdfCy4zce2txjY3oIBImldRxk7QIIRrcFZsMYbUf4SULIUkFXYJSBYM2lqIs2uGcEia1qEJrPIhKvyC/W/2FUpXMaKXijoCrOM/a97/w+K/ydL/lG89NmVf9jlfx3kf04u/P35BwHDLihDV8YIAAAAAElFTkSuQmCC") no-repeat; + background-size: 16px; +} +.mbui-toptips i.mbui-toptips-error-icon {background-position: 0 0;} +.mbui-toptips i.mbui-toptips-warning-icon {background-position: 0 -20px;} +.mbui-toptips.mbui-toptips-warning { background: var(--color-yellow-100); color: var(--color-yellow-600);} +.mbui-toptips.mbui-toptips-warning > a {color: var(--color-yellow-600);} +.mbui-toptips.mbui-toptips-error { background: var(--color-red-100); color: var(--color-red-600);} +.mbui-toptips.mbui-toptips-error > a { color: var(--color-red-600);} +.mbui-toptips.fixed{position: fixed !important;right: 0; left: 0; top: 0;z-index: 10;} +.mbui-toast{position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 888; overflow: hidden; outline: 0; text-align: center; background-color:var(--black-shadow)); + -webkit-overflow-scrolling: touch; +} +.mbui-toast-dialog { width: 100%; height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + -webkit-animation: fade-in-up 100ms 0ms ease-in-out both; + animation: fade-in-up 100ms 0ms ease-in-out both; +} +.mbui-toast-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1020;} +.mbui-toast-content { position: relative; min-width: 126px; display: inline-block; background: var(--black-shadow); text-align: center; border-radius: 6px; margin-top:-20%; color: var(--color-white); font-size: 16px;} +.mbui-toast-content > span {padding:12px 16px;display: block;} +.mbui-toast-success .mbui-toast-content {min-height: 120px;} +.mbui-toast-success .mbui-toast-content .mbui-toast-success-icon {width: 44px; height: 44px; display: block; margin: 6px auto 10px; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAMAAADQmBKKAAAAnFBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+TINBkAAAAM3RSTlMA/PL47DQCCINDKgTalRXjil5wTx7VeA7f0MS2s6Q6JBIM5smvwVdqP7uckWJLMBoZzHzNBA+9AAADrElEQVR42u3ciXLaMBSF4eMdsFlCIOw7JGRrSM/7v1vbDJ0GZNkhN+RqpnxPoIll/bIcg4uLi//H82gLhyzqpD+HM6YZf7uBI9KKxz8yuKE24F4EB8TtgH9VoK+z4T9rqLvy+c4YyhYTHniErijjgU0CVe2AB1YLaJqPeWgwh6Ztk4e6DSiKf3o8lO2g6GXDI/0OFFWXPLKcQdGNxyNhDXp6ax4Lf0BPLeMxP4KeW98czxRq0kcavGeo2Q1peoKaaEnTT6i5CmiqQ0vcYo51DCW9EXMMEyiZdZmjO4eSasgczQ6U3L3Fy5mAxXXmCbbQsRgz1y107F6Z6wY6an3mmkBH1SddWoCeAubqN6Ciwnx+DRrSB/7hzA4oGdOiDQ3zIS0eoOGlS4v7FApmfVpkcyiIQlr4Myio+rS5hoLrgDYVKLj1aDOK8f2e7OPpa0zoO1oFGmcKN7S7goA0p448E7ZoN1RYoYvGs9yhzLeOx5tCQDQeZ/b0heMZ4TN622lynvEsG/iEO59sPsvvd5NXxenSunGxBeuhPKm9e+5NEpyszSKbWHZ+s9pJ+mUKX3CybXgwBSOc5IqFnuXHkcEtTnDtsUgLJ2uJpmE1YJFVihMt1syxXuBjIp8G0ab+5ZW5Bh18RC1koTucKH6lRThFuU6ThcY4VUSr4All5hkLhQ3JgEyPMQolQxqkT2HxqjDScxSI1yz2AIN0FmQz2NVZrL+AQXyfhNXioJ66SZSvJF4b+W5ZogIL6Vr7kCLHNGCxQQoLcY02DRhmIYt5P2Aj73W/hiO9ruCCyXdY9I8WlHjEEt1E/Axc7MayPxDeYYJFZZIYV7hAC3ITFlu9YC8KWCJLIJeOacrb2Tb6LLPFV0g2NJk72/ieZer4Gr0BS7QSJBOWaS7wRRoZS4Qrn6WuIWCkX24NCTP9Un4HImb6hdoQMtMvMoghZaZfwIvw5a4oUMcZtPlpyx4szpl+hcP6Oj9niHOZODOj99IRS8kfDOXpFzzJnzf98qMXefrLdVNYKKW/Cgul9I9hoZR+r4azM9Ov/wLzw+n3Gzg3M/1uvKD7WPqbCc7OTL8rr+TrLNWN8Y3iCfdc+Sec0vSv8M2SoUI0BOm/h8A50h9BSp5+B74Ftaf/B8Tk6Xfi691q4NQf6C397swge/qn0NR2Yg16r6K/SBen/xXa4okTX4vY0t+Poe99+ttwwb/0+ws4oZE58osGx+kPZnBF7W1EP+GOxmN39YSLi4uLiwt9vwAkwFFwKPIJrgAAAABJRU5ErkJggg==") no-repeat; + background-size: 44px; +} +.mbui-toast-loading .mbui-toast-content {min-height: 126px;} +.mbui-toast-loading_icon {position: relative; width: 44px; height: 44px; display: block; margin: 4px auto 16px;} +.loading-icon-leaf {position: absolute; opacity: 0.25; left: 21px; top: 21px;} +.loading-icon-leaf:before {content: " "; position: absolute; width: 8.14px; height: 3.08px; background: var(--color-gray-300); box-shadow: rgba(0, 0, 0, 0.0980392) 0px 0px 1px; border-radius: 1px; transform-origin: left 50% 0px;} +.loading-icon-leaf_0 { + -webkit-animation: opacity-60-25-0-12 1.25s linear infinite; + animation: opacity-60-25-0-12 1.25s linear infinite; +} +.loading-icon-leaf_0:before { + -webkit-transform: rotate(0deg) translate(7.92px, 0px); + transform: rotate(0deg) translate(7.92px, 0px); +} +.loading-icon-leaf_1 { + -webkit-animation: opacity-60-25-1-12 1.25s linear infinite; + animation: opacity-60-25-1-12 1.25s linear infinite; +} +.loading-icon-leaf_1:before { + -webkit-transform: rotate(30deg) translate(7.92px, 0px); + transform: rotate(30deg) translate(7.92px, 0px); +} +.loading-icon-leaf_2 { + -webkit-animation: opacity-60-25-2-12 1.25s linear infinite; + animation: opacity-60-25-2-12 1.25s linear infinite; +} +.loading-icon-leaf_2:before { + -webkit-transform: rotate(60deg) translate(7.92px, 0px); + transform: rotate(60deg) translate(7.92px, 0px); +} +.loading-icon-leaf_3 { + -webkit-animation: opacity-60-25-3-12 1.25s linear infinite; + animation: opacity-60-25-3-12 1.25s linear infinite; +} +.loading-icon-leaf_3:before { + -webkit-transform: rotate(90deg) translate(7.92px, 0px); + transform: rotate(90deg) translate(7.92px, 0px); +} +.loading-icon-leaf_4 { + -webkit-animation: opacity-60-25-4-12 1.25s linear infinite; + animation: opacity-60-25-4-12 1.25s linear infinite; +} +.loading-icon-leaf_4:before { + -webkit-transform: rotate(120deg) translate(7.92px, 0px); + transform: rotate(120deg) translate(7.92px, 0px); +} +.loading-icon-leaf_5 { + -webkit-animation: opacity-60-25-5-12 1.25s linear infinite; + animation: opacity-60-25-5-12 1.25s linear infinite; +} +.loading-icon-leaf_5:before { + -webkit-transform: rotate(150deg) translate(7.92px, 0px); + transform: rotate(150deg) translate(7.92px, 0px); +} +.loading-icon-leaf_6 { + -webkit-animation: opacity-60-25-6-12 1.25s linear infinite; + animation: opacity-60-25-6-12 1.25s linear infinite; +} +.loading-icon-leaf_6:before { + -webkit-transform: rotate(180deg) translate(7.92px, 0px); + transform: rotate(180deg) translate(7.92px, 0px); +} +.loading-icon-leaf_7 { + -webkit-animation: opacity-60-25-7-12 1.25s linear infinite; + animation: opacity-60-25-7-12 1.25s linear infinite; +} +.loading-icon-leaf_7:before { + -webkit-transform: rotate(210deg) translate(7.92px, 0px); + transform: rotate(210deg) translate(7.92px, 0px); +} +.loading-icon-leaf_8 { + -webkit-animation: opacity-60-25-8-12 1.25s linear infinite; + animation: opacity-60-25-8-12 1.25s linear infinite; +} +.loading-icon-leaf_8:before { + -webkit-transform: rotate(240deg) translate(7.92px, 0px); + transform: rotate(240deg) translate(7.92px, 0px); +} +.loading-icon-leaf_9 { + -webkit-animation: opacity-60-25-9-12 1.25s linear infinite; + animation: opacity-60-25-9-12 1.25s linear infinite; +} +.loading-icon-leaf_9:before { + -webkit-transform: rotate(270deg) translate(7.92px, 0px); + transform: rotate(270deg) translate(7.92px, 0px); +} +.loading-icon-leaf_10 { + -webkit-animation: opacity-60-25-10-12 1.25s linear infinite; + animation: opacity-60-25-10-12 1.25s linear infinite; +} +.loading-icon-leaf_10:before { + -webkit-transform: rotate(300deg) translate(7.92px, 0px); + transform: rotate(300deg) translate(7.92px, 0px); +} +.loading-icon-leaf_11 { + -webkit-animation: opacity-60-25-11-12 1.25s linear infinite; + animation: opacity-60-25-11-12 1.25s linear infinite; +} +.loading-icon-leaf_11:before { + -webkit-transform: rotate(330deg) translate(7.92px, 0px); + transform: rotate(330deg) translate(7.92px, 0px); +} +@-webkit-keyframes opacity-60-25-0-12 { + 0% { + opacity: 0.25; + } + 0.01% { + opacity: 0.25; + } + 0.02% { + opacity: 1; + } + 60.01% { + opacity: 0.25; + } + 100% { + opacity: 0.25; + } +} +@-webkit-keyframes opacity-60-25-1-12 { + 0% { + opacity: 0.25; + } + 8.34333% { + opacity: 0.25; + } + 8.35333% { + opacity: 1; + } + 68.3433% { + opacity: 0.25; + } + 100% { + opacity: 0.25; + } +} +@-webkit-keyframes opacity-60-25-2-12 { + 0% { + opacity: 0.25; + } + 16.6767% { + opacity: 0.25; + } + 16.6867% { + opacity: 1; + } + 76.6767% { + opacity: 0.25; + } + 100% { + opacity: 0.25; + } +} +@-webkit-keyframes opacity-60-25-3-12 { + 0% { + opacity: 0.25; + } + 25.01% { + opacity: 0.25; + } + 25.02% { + opacity: 1; + } + 85.01% { + opacity: 0.25; + } + 100% { + opacity: 0.25; + } +} +@-webkit-keyframes opacity-60-25-4-12 { + 0% { + opacity: 0.25; + } + 33.3433% { + opacity: 0.25; + } + 33.3533% { + opacity: 1; + } + 93.3433% { + opacity: 0.25; + } + 100% { + opacity: 0.25; + } +} +@-webkit-keyframes opacity-60-25-5-12 { + 0% { + opacity: 0.270958333333333; + } + 41.6767% { + opacity: 0.25; + } + 41.6867% { + opacity: 1; + } + 1.67667% { + opacity: 0.25; + } + 100% { + opacity: 0.270958333333333; + } +} +@-webkit-keyframes opacity-60-25-6-12 { + 0% { + opacity: 0.375125; + } + 50.01% { + opacity: 0.25; + } + 50.02% { + opacity: 1; + } + 10.01% { + opacity: 0.25; + } + 100% { + opacity: 0.375125; + } +} +@-webkit-keyframes opacity-60-25-7-12 { + 0% { + opacity: 0.479291666666667; + } + 58.3433% { + opacity: 0.25; + } + 58.3533% { + opacity: 1; + } + 18.3433% { + opacity: 0.25; + } + 100% { + opacity: 0.479291666666667; + } +} +@-webkit-keyframes opacity-60-25-8-12 { + 0% { + opacity: 0.583458333333333; + } + 66.6767% { + opacity: 0.25; + } + 66.6867% { + opacity: 1; + } + 26.6767% { + opacity: 0.25; + } + 100% { + opacity: 0.583458333333333; + } +} +@-webkit-keyframes opacity-60-25-9-12 { + 0% { + opacity: 0.687625; + } + 75.01% { + opacity: 0.25; + } + 75.02% { + opacity: 1; + } + 35.01% { + opacity: 0.25; + } + 100% { + opacity: 0.687625; + } +} +@-webkit-keyframes opacity-60-25-10-12 { + 0% { + opacity: 0.791791666666667; + } + 83.3433% { + opacity: 0.25; + } + 83.3533% { + opacity: 1; + } + 43.3433% { + opacity: 0.25; + } + 100% { + opacity: 0.791791666666667; + } +} +@-webkit-keyframes opacity-60-25-11-12 { + 0% { + opacity: 0.895958333333333; + } + 91.6767% { + opacity: 0.25; + } + 91.6867% { + opacity: 1; + } + 51.6767% { + opacity: 0.25; + } + 100% { + opacity: 0.895958333333333; + } +} +/*layer-photo*/ +.layer-image-photo {display: none; position: fixed;top: 0;left: 0; width: 100%; height: 100%; background-color: var(--black-shadow);z-index: 9999; display: flex;align-items: center; justify-content: center;} +.layer-image-photo img { max-width: 96%; max-height: 96%; margin-top:-2%;display: block;} + +/*flex-panel*/ +.mbui-flex-panel{display:flex;flex:1;align-items:flex-start;font-size:0} +.mbui-flex-avatar{margin-right:12px} +.mbui-flex-avatar-img{width: 72px; height:72px;} +.mbui-flex-avatar-img img{width: 100%; height:100%; border-radius: 4px;} +.mbui-flex-content{color: var(--color-gray-900);} +.mbui-flex-title{font-weight:600;font-size:16px;} +.mbui-flex-description{font-size:14px; line-height:1.5} +.mbui-section-title{padding:12px; position: relative; line-height:1.36; font-size:14px; display: flex;align-items: center; justify-content:space-between} +/*文件上传*/ +.mbui-file-list .mbui-file-div{display: flex; align-items: center; padding: 4px 32px 4px 4px; background-color:var(--color-gray-100); border-radius:4px; line-height:1.8; position:relative; margin-bottom:8px;} +.mbui-file-div .mbui-file-icon{width:45px;height:45px; line-height:45px; margin-right:8px; overflow:hidden} +.mbui-file-div .mbui-file-icon.file-img{width:80px;} +.mbui-file-div .mbui-file-icon img{width:100%;height:100%;border-radius:3px;object-fit: cover;} +.mbui-file-div .mbui-file-icon i{font-size:40px;} +.mbui-file-div .mbui-file-info {width:calc(100% - 50px)} +.mbui-file-div .mbui-file-name {font-size:15px;} +.mbui-file-div .mbui-file-size {font-size: 12px;color: var(--color-gray-400);} +.mbui-file-div .mbui-file-del{ width: 30px; height: 30px;position:absolute;top:14px; right:2px; font-size:20px;line-height:28px; text-align:center; color:var(--color-gray-500);} + +/*人员选择*/ +.mbui-picker-search{margin: 0;padding:6px 12px;position: relative;} +.mbui-picker-search:after{ content: " ";pointer-events: none; position: absolute; bottom: 0; left: 0; width: 200%; height: 0; border-bottom: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-picker-search .search-input {width: 100%; padding: 10px; border: none; background: #f5f7fa; border-radius: 4px; font-size: 16px; color: #333;} +.mbui-picker-tags{padding:3px 12px; font-size:14px;} +.mbui-picker-tags .tags-search{display: inline-block; line-height: 1.40625; padding: 6px 12px; margin:3px 6px 3px 0;border-radius:1rem; background-color:#fff;} +.mbui-picker-tags .tags-search.active{background-color:#333333; color:#ffffff} + +.mbui-picker-selector {background-color:var(--color-white);width:100%;height:100vh;position:fixed;top:0;left:0;z-index:99;} +.mbui-picker-selector .mbui-bar:before { content: " ";pointer-events: none; position: absolute; bottom: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.mbui-picker-item{margin: 0;padding: 10px; color: var(--color-gray-900); text-align: left; background: var(--color-white); position: relative; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.mbui-picker-item:before{ content: " ";pointer-events: none; position: absolute; bottom: 0; left: 0; width: 200%; height: 0; border-top: 1px solid var(--color-gray-100); + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +.mbui-picker-selector .letters {display: flex; flex-direction: column; align-items: center; position: fixed; top: 50%; right: 0; z-index:100; width:36px; text-align:center; transform: translateY(-50%);} +.mbui-picker-selector .letters a { margin: 2px; text-decoration: none; font-size:12px; color: var(--color-gray-900);} +.mbui-picker-selector .contacts{ padding: 0 0 48px; margin:0; height:100vh; overflow-y:auto;} +.mbui-picker-selector .contacts .mbui-contacts-title{padding:8px 16px; background-color:var(--color-gray-50); font-size:12px; color:var(--color-gray-400);} +.mbui-picker-selector .lists{padding: 0; margin:0; height:calc(100vh - 46px); overflow-y:auto;} +.mbui-picker-selector .data-lists{height:calc(100vh - 96px);} +/*picker-radio*/ +.mbui-picker-item .mbui-input-radio{width: 19px; height: 19px; margin-left:4px; appearance: none; position: relative;} +.mbui-picker-item .mbui-input-radio:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 50%; vertical-align: bottom;} +.mbui-picker-item .mbui-input-radio:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 50%; vertical-align: bottom;} +.mbui-picker-item .mbui-input-radio:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: bottom; transform: rotate(-45deg);} + +/*picker-checkbox*/ +.mbui-picker-item .mbui-input-checkbox{width: 19px; height: 19px; margin-left:4px; appearance: none; position: relative;} +.mbui-picker-item .mbui-input-checkbox:before{content: ''; width: 19px; height: 19px; border: 1px solid var(--color-gray-400); display: inline-block; border-radius: 3px; vertical-align: bottom;} +.mbui-picker-item .mbui-input-checkbox:checked:before{ content: ''; width: 19px; height: 19px; border: 1px solid var(--color-blue-600); background:var(--color-blue-600); display: inline-block; border-radius: 3px; vertical-align: bottom;} +.mbui-picker-item .mbui-input-checkbox:checked:after{ content: ''; width: 10px; height:5px;border: 2px solid var(--color-white); border-top: transparent; border-right: transparent;text-align: center; display: block; position: absolute; top: 6px; left:5px; vertical-align: middle; transform: rotate(-45deg);} + +.mbui-picker-item .mbui-picker-avatar{margin-left:12px; margin-right:8px;} + +/*comment*/ +.mbui-comment-box{display: flex; align-items:flex-start; background-color:var(--color-white); padding:12px;} +.mbui-comment-box .comment-avatar{width: 32px;} +.mbui-comment-box .comment-image{width:32px; height:32px; border-radius:50%} + +.mbui-comment-box .comment-body{font-size:16px; margin-left:12px; line-height:1.5; width:100%;} +.mbui-comment-box .comment-meta span{margin-right:12px; font-size:12px; color:var(--color-gray-400);} +.mbui-comment-box .comment-content{padding:4px 0;} +.mbui-comment-box .comment-actions a{color:var(--color-blue-400); cursor:pointer; font-size:12px;} +.mbui-comment-box .comment-actions a:hover{color:var(--color-blue-600);} +.mbui-comment-box fieldset{border:1px solid var(--color-gray-300); border-radius:3px; background-color:var(--color-gray-100); color:var(--color-gray-500); font-size:14px; padding:8px;} +.mbui-comment-box .comment-btn{margin:4px 0;} + +/*img*/ +.mbui-img-cover{width:100%; position:relative; padding-top: 100%; border-radius: 3px; overflow: hidden; background-color: var(--color-gray-100);} +.mbui-img-cover.img3-2{padding-top: 66.666666%;} +.mbui-img-cover.img4-3{padding-top: 75%;} +.mbui-img-cover.img16-9{padding-top: 56.25%;} +.mbui-img-cover.img16-10{padding-top: 62.5%;} +.mbui-img-cover img{width: 100%; height: 100%; object-fit: cover; position: absolute; top: 0; left:0; border-radius:3px;} + +/*pagebox*/ +.mbui-pagebox{width:100%; text-align:center; font-size:14px;} +.mbui-pagebox a,.mbui-pagebox span{min-width:16px; height:33px; line-height:33px; margin:0 4px; padding:0 10px; color:var(--color-gray-700); border-radius:1px; text-align:center; border:1px solid var(--color-gray-300); background-color:var(--color-white); display:inline-block;} +.mbui-pagebox span{background-color:var(--color-blue-600); color:var(--color-white); border:1px solid var(--color-blue-600);} +.mbui-data-none{padding:30px 0; text-align: center; color:var(--color-gray-400);} +.mbui-data-none img{width:200px} + +/*bar*/ +.mobile-bar{padding: 12px; position: relative; align-items: center; line-height: 1.41176471; font-size: 16px; color: var(--color-gray-900); + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + justify-content: space-between; +} +.mobile-bar::after{content: " ";position: absolute; left: 0;bottom: 0; right: 0; height: 1px; border-top: 1px solid var(--color-gray-100); color: var(--color-gray-100); z-index: 2; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: scaleY(0.5); + transform: scaleY(0.5); +} +.mobile-bar-title{font-size:16px; font-weight:800;} +.tabbar-space{width: 100%; height:60px;} + + +/*calendar*/ +.calendar {background-color:var(--color-white); font-size: 14px; color: var(--color-black);} +.calendar-header{background-color: #3875C5;padding: 12px 16px;text-align: center; position:relative;} +.calendar-select {line-height: 1.5;color: var(--color-gray-500);margin: 0;padding: 0;list-style: none;display: inline-block;position: relative;outline: 0;box-sizing: border-box;} +.calendar-column-header,.calendar-cell {width: 14%} +.calendar-column-header{font-weight: 400;text-align: center; line-height:2;} +.calendar-header i {position: absolute;top: 50%; width: 30px; height: 30px; margin-top: -15px; font-size: 16px;line-height: 30px;text-align: center; cursor: pointer;} +.calendar-header i.calendar-next {right: 12px;} +.calendar-header i.calendar-pre{left:12px;} +.calendar-header i:after {position: absolute; top: 50%;left: 50%; content: ''; width: 14px; height: 14px; margin-top: -7px; margin-left: -5px; border-top:2px solid var(--color-white); border-left: 2px solid var(--color-white);} +.calendar-pre:after {transform: rotateZ(-45deg);} +.calendar-next:after {transform: rotateZ(135deg);} + +.calendar-table{width:100%;table-layout: fixed;} +.calendar-cell{font-size: 12px;color: var(--color-gray-500);} +.calendar-cell.calendar-last-month-cell,.calendar-cell.calendar-next-month-cell {color:var(--color-gray-300);} +.calendar-date {margin: 0 4px;} +.calendar-cell.calendar-thisMonth .calendar-date,.calendar-cell.calendar-today .calendar-date {background-color: var(--color-blue-50);border-radius:4px;color:var(--color-blue-600)} +.calendar-cell.calendar-today .calendar-date {background-color:var(--color-blue-600);border-radius:4px;color:var(--color-white)} +.calendar-date:hover{background: var(--color-blue-100);border-radius:4px;} +.calendar-value {text-align: center;height: 44px;line-height:44px;position: relative;font-size:16px;width: 100%;} +.calendar-event {position:absolute;width:6px;height:6px;border-radius:50%;background-color:var(--color-red-600);top:6px;right:6px;} +.calendar-select {font-size: 18px;vertical-align: middle;color: var(--color-white)} +.calendar-year-text,.calendar-month-text {line-height: 30px;padding:0 10px;} +/*calendar-dropdown*/ +ul.dropdown-month,.dropdown-month li,ul.dropdown-year, .dropdown-year li {list-style: none;text-align: center;padding: 0;margin: 0;} +.dropdown-month.open,.dropdown-year.open {display: inline-block;margin-top: 1px;width: 100%;} +.dropdown-month, .dropdown-year {height: 240px;overflow-y: auto;overflow-x: hidden;display: none;position: absolute;left: 0;top: 100%;background: var(--color-white);width: 50px;border: 1px solid #eee;z-index:1;box-shadow: 0px 6px 12px rgba(0,0,0,0.175);-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175)} +.dropdown-month .month-item,.dropdown-year .year-item {font-size: 14px;position: relative;display: block;padding: 6px 3px;line-height: 22px;font-weight: normal;color:var(--color-gray-500);white-space: nowrap;overflow: hidden;text-overflow: ellipsis;-webkit-transition: background 0.3s ease;transition: background 0.3s ease;} +.month-item:hover,.year-item:hover{background: var(--color-blue-50);} +.year-item.active {background-color: var(--color-gray-100);font-weight: 600;color: rgba(0, 0, 0, 0.65);} + +/*loadData*/ +.mbui-search{width:100%; box-shadow: 0 -1px 0 0 rgba(0,0,0,0.2); background-color:var(--color-white); position:fixed;left:0;top:0;z-index:9} +.mbui-search-div{padding:6px; display: flex; align-items: center;} +.mbui-search-icon{padding:0 6px; width:30px; height:32px; line-height:32px; border: none; background: var(--color-gray-100); border-radius: 5px 0 0 5px; font-size: 14px; color: var(--color-gray-300);} +.mbui-search-box{width:100%; height:32px; flex-grow: 1; vertical-align: middle; background: var(--color-gray-100); border-radius:0 5px 5px 0;} +.mbui-search-input{padding:8px 2px 5px; width:100%; border: none; background: var(--color-gray-100); border-radius: 5px; font-size: 14px; color: var(--color-gray-700);} +.mbui-search-reset{background-color:var(--color-white); border-color:var(--color-white); height:32px; margin-left:3px;} +.mbui-search-menu{width:44px; height:32px; display: flex; font-size: 24px; padding-left:10px; align-items: center; vertical-align: middle;overflow: hidden;color: var(--color-gray-500);} +.mbui-search-menu i{font-size: 24px;} + +.mbui-search + .load-data-list{padding-top:54px;} +.mbui-search.mbui-search-tab + .load-data-list{padding-top:98px;} +.load-data-list{width:100%; box-sizing:border-box;} +.load-data-list a{width:100%; display:block; box-sizing: border-box;} +.load-data-list dl{background-color:var(--color-white); padding:12px;} +.load-data-list dt{margin-bottom:6px;} +.load-data-list dd{line-height:24px;} +.load-data-span i{color:var(--color-gray-400);} +.load-data-span + .load-data-span{margin-left: 16px;} +.load-data-none{padding-top:50px; padding-bottom:20px; color:var(--color-gray-400); text-align:center; display:none;} +.load-data-none.load-data-0{display:block;} +.load-data-none i{font-size:24px;} +.load-data-loading {padding:12px 0;text-align:center;} +.load-data-loading span{white-space: nowrap; display: inline-block; padding-right:20px; height: 24px; line-height:24px; position: relative; color:var(--color-gray-400)} +.load-data-loading span:after {content: '.'; color: var(--color-blue-600); animation: loading-dots 1.2s infinite; font-size: 26px; position: absolute; bottom: 8px; left: 88%;} +@keyframes loading-dots { + 0%,100% { + content: '.'; + color:var(--color-green-600); + } + 25% { + content: '..'; + color:var(--color-blue-600); + } + 50% { + content: '...'; + color:var(--color-orange-600); + } + 75% { + content: ''; + color:var(--color-yellow-600); + } +} +.load-data-end{text-align:center; color:var(--color-gray-300); padding:8px 0; font-size:12px;} + +/*flow-check*/ +.flow-flex-row {box-direction: row;box-orient: horizontal; + -webkit-box-orient: horizontal; + -ms-flex-direction: row; + flex-direction: row; +} +.flow-flexbox { width: 100%;text-align: left;display: flex;box-align: center;align-items: center;flex-wrap: wrap; line-height:1.2;} +.check-item{width: auto; -ms-flex-negative: 0; flex-shrink: 0; padding:4px 0} +.check-item i{margin-right:3px; color:var(--color-gray-500);} +.check-item span{color:var(--color-gray-400);margin:0 3px;} +.check-item .iconfont {font-size:18px;} +.check-item .iconfont.icon-arrow{font-size:12px;} +.iconfont[data-ok]{color:var(--color-green-600)} +.iconfont[data-no]{color:var(--color-red-600);} +.check-item-status{color:var(--color-gray-400); font-size:12px; margin-left:3px;} + +/*fixed-bar*/ +.mbui-fixed-bar {position: fixed; bottom:160px; height:44px; left:8px;z-index: 8;} +.fixed-bar-box {padding:4px;z-index: 8;border-radius:50%; position: relative; background-color:var(--color-blue-500);} + +.fixed-bar-btn {position: relative; border: none; background: var(--color-white); width: 36px; height: 36px; border-radius: 50%; line-height: 36px; display: flex; flex-direction: column; justify-content: center; align-items: center; cursor: pointer; z-index: 9;} +.fixed-bar-btn:focus {border: none;} + +.fixed-bar-btn.active .menutoggle:before, +.fixed-bar-btn.active .menutoggle:after, +.fixed-bar-btn.active .menutoggle span {animation: none;} +.fixed-bar-btn.active .menutoggle span { opacity: 0;} + +.fixed-bar-btn.active .menutoggle:before { + transform: translateY(7px) rotate(135deg); +} + +.fixed-bar-btn.active .menutoggle:after { + transform: translateY(-7px) rotate(-135deg); +} + +span.menutoggle {width: 24px; height: 24px; position: relative;cursor: pointer; display: block;} +span.menutoggle:before, +span.menutoggle:after, +span.menutoggle span { background: var(--color-blue-600); content: ""; display: block; height: 3px; border-radius: 8px; margin: 4px 0; transition: 0.5s;} + +.fixed-bar-item {position: relative; width: 44px; height: 44px; border-radius: 50%; transform: translatey(-100%); opacity: 0; visibility: hidden;} +.fixed-bar-item.open {opacity: 1; visibility: visible;} +.fixed-bar-item a {width: 44px; height: 44px; border-radius: 50%; background-color: var(--color-gray-200); font-size: 12px; text-align: center; position: absolute; right: -24px; top: 0; bottom: 0; color: #ffffff; transition-duration: 0.3s; display: flex; flex-direction: column; justify-content: center; align-items: center; cursor: pointer; line-height:1.32;} +.fixed-bar-item.open a:nth-of-type(1) { + transform: rotate(-90deg) translateX(80px) rotate(90deg); + transition-delay: 0s; + background: var(--color-purple-600); +} + +.fixed-bar-item.open a:nth-of-type(2) { + transform: rotate(-45deg) translateX(80px) rotate(45deg); + transition-delay: 0.1s; + background: var(--color-orange-600); +} + +.fixed-bar-item.open a:nth-of-type(3) { + transform: rotate(0deg) translateX(80px) rotate(0deg); + transition-delay: 0.2s; + background: var(--color-blue-600); +} + +.fixed-bar-item.open a:nth-of-type(4) { + transform: rotate(45deg) translateX(80px) rotate(-45deg); + transition-delay: 0.3s; + background: var(--color-cyan-600); + +} + +.fixed-bar-item.open a:nth-of-type(5) { + transform: rotate(90deg) translateX(80px) rotate(-90deg); + transition-delay: 0.4s; + background: var(--color-green-600); +} + + +/*picker*/ +.lay-picker {position: fixed;left: 0;top: 0;width: 100%;height: 100%;z-index: 99999;display: none;overflow: hidden;} +.lay-picker-shade {position: absolute;left: 0;top: 0;width: 100%;height: 100%;background: var(--black-shadow);z-index: 9;} +.lay-picker-container {position: absolute;left: 0;bottom: 0;z-index: 99;width: 100%;background: var(--color-white);color: var(--color-gray-900);font-size: 16px; + -webkit-transition: transform .25s; + -webkit-transform: translate3d(0, 100%, 0); + transition: transform .25s; + transform: translate3d(0, 100%, 0); +} + +.lay-picker-header {height: 50px;line-height: 50px;border-bottom: 1px solid #f3f3f3;margin-bottom: 1px;margin: 0px 12px;} +.lay-picker-title {text-align: center;position: absolute;top: 0;left: 0;z-index: 9;width: 100%;color: var(--color-gray-900);} +.lay-picker-search{margin: 0 12px; text-align: center; padding: 5px 0;} +.lay-picker-search input{text-align: center; height: 40px; line-height: 40px; border: none; border-bottom: 1px solid var(--color-gray-300);font-size: 14px; + transition: all .2s; + -webkit-transition: all .2s; + box-shadow: none!important; +} +.lay-picker-search input:hover,.lay-picker-search input:focus{ border: none!important; border-bottom: 1px solid var(--color-gray-300)!important;} +.lay-picker-btn {position: relative;z-index: 99;} +.lay-picker-cancel {color: var(--color-gray-500);} +.lay-picker-clear {margin-left:12px;color: var(--color-orange-600);} +.lay-picker-confirm {float: right;color: var(--color-blue-600);} + +.lay-picker-shadowup,.lay-picker-shadowdown {height: 120px;width: 100%;position: absolute;left: 0;z-index: 50;} +.lay-picker-shadowup {height: 115px;top: -1px; + background: -webkit-linear-gradient(to bottom, var(--color-white), rgba(255, 255, 255, .6)); + background: linear-gradient(to bottom, var(--color-white), rgba(255, 255, 255, .6)); + pointer-events: none; + border-bottom: 1px solid var(--color-gray-300); +} + +.lay-picker-shadowdown {height: 130px;bottom: 0; + background: -webkit-linear-gradient(to top, var(--color-white), rgba(255, 255, 255, .6)); + background: linear-gradient(to top, var(--color-white), rgba(255, 255, 255, .6)); + pointer-events: none; + border-top: 1px solid var(--color-gray-300); +} + +.lay-picker-content {position: relative;height: 300px;margin: 15px;overflow: hidden;} +.lay-picker-box {overflow: hidden;} +.lay-picker-box:after {display: table;height: 0;clear: both;content: '';} +.lay-picker-list-wrap {float: left;height: 300px;overflow: hidden; + -webkit-transition: width .2s; + transition: width .2s; +} +.lay-picker-list-wrap ul {position: relative;padding: 100px 0;margin-top: 16px; + -webkit-transition: transform .1s ease-out; + transition: transform .1s ease-out; +} +.lay-picker-list-wrap ul:after {position: absolute;top: 0;left: 0;right: 0;bottom: 0;z-index: 55;content: '';} +.lay-picker-list-wrap li {line-height: 50px;height: 50px;text-align: center;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;} + +/** picker wechat skin*/ +.lay-picker-bottom {text-align: center;margin-top: 10px;margin-bottom: 30px;font-size: 16px;} +.lay-picker-bottom-btn {border-radius: 6px;display: inline-block;width: 30%;height: 40px;line-height: 40px;} +.lay-picker-bottom-btn-cancel {color: var(--color-gray-500);background: var(--color-gray-200);margin-right: 3%;} +.lay-picker-bottom-btn-clear {color: var(--color-white);background: var(--color-orange-600);margin-right: 3%;} +.lay-picker-bottom-btn-confirm {color: var(--color-white);background: var(--color-blue-600);} + +/** skeleton*/ +.skeleton-container {position: absolute;top: 0;left: 0; width: 100%; height: 100%; padding: 15px; background: #ffffff; z-index: 1000; display: flex; flex-direction: column;gap: 20px;} +.skeleton-item {background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%); background-size: 200% 100%; border-radius: 6px; animation: skeleton-loading 2s infinite;} +.skeleton-header {height: 30px; width: 60%;margin-bottom: 15px;} +.skeleton-avatar {width: 60px; height: 60px; border-radius: 50%;} +.skeleton-line {height: 15px; width: 100%;} +.skeleton-line.short {width: 80%;} +.skeleton-line.medium { width: 90%;} +.skeleton-card {height: 100px;border-radius: 8px;} +@keyframes skeleton-loading { + 0% { + background-position: 200% 0; + } + 100% { + background-position: -200% 0; + } +} +.item-key{position: absolute;top: 0; left: 0; z-index:9; width: 22px;height: 22px; line-height:20px; background-color:#ffb800; border-radius:0 0 5px 0; text-align:center; font-size:12px; color:#fff;} +.item-up{position: absolute;top: 24px; left: 0; z-index:9; padding:2px 0; width: 22px;height: 40px; line-height:16px; background-color:#1e9fff; border-radius:0 5px 0 0; text-align:center; font-size:11px; color:#fff;} +.item-down{position: absolute;top: 64px; left: 0; z-index:9; padding:2px 0; width: 22px;height: 40px; line-height:16px; background-color:#16b777; border-radius:0 0 5px 0; text-align:center; font-size:12px; color:#fff;} +.item-close{position: absolute;top: -26px; right: -26px; z-index:9; width: 52px;height: 52px; cursor: pointer; background-color:#ff5722; border-radius: 50%; overflow: hidden;} +.item-close::before {font-size: 0px; line-height: 0; display: block; width: 20px; height: 20px; color: transparent;position: absolute; bottom: 4px;left: 6px;content: "Close"; background-position: -260px 0px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARgAAAAUCAYAAABWOyJDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAQPSURBVHic7Zs/iFxVFMa/0U2UaJGksUgnIVhYxVhpjDbZCBmLdAYECxsRFBTUamcXUiSNncgKQbSxsxH8gzAP3FU2jY0kKKJNiiiIghFlccnP4p3nPCdv3p9778vsLOcHB2bfveeb7955c3jvvNkBIMdxnD64a94GHMfZu3iBcRynN7zAOI7TG15gHCeeNUkr8zaxG2lbYDYsdgMbktBsP03jdQwljSXdtBhLOmtjowC9Mg9L+knSlcD8TNKpSA9lBpK2JF2VdDSR5n5J64m0qli399hNFMUlpshQii5jbXTbHGviB0nLNeNDSd9VO4A2UdB2fp+x0eCnaXxWXGA2X0au/3HgN9P4LFCjIANOJdrLr0zzZ+BEpNYDwKbpnQMeAw4m8HjQtM6Z9qa917zPQwFr3M5KgA6J5rTJCdFZJj9/lyvGhsDvwFNVuV2MhhjrK6b9bFiE+j1r87eBl4HDwCF7/U/k+ofAX5b/EXBv5JoLMuILzf3Ap6Z3EzgdqHMCuF7hcQf4HDgeoHnccncqdK/TvSDWffFXI/exICY/xZyqc6XLWF1UFZna4gJ7q8BsRvgd2/xXpo6P+D9dfT7PpECtA3cnWPM0GXGFZh/wgWltA+cDNC7X+AP4GzjZQe+k5dRxuYPeiuXU7e1qwLpDz7dFjXKRaSwuMLvAlG8zZlG+YmiK1HoFqT7wP2z+4Q45TfEGcMt01xLoNZEBTwRqD4BLpnMLeC1A41UmVxsXgXeBayV/Wx20rpTyrpnWRft7p6O/FdqzGrDukPNtkaMoMo3FBdBSQMOnYBCReyf05s126fU9ytfX98+mY54Kxnp7S9K3kj6U9KYdG0h6UdLbkh7poFXMfUnSOyVvL0h6VtIXHbS6nOP+s/Zm9mvyXW1uuC9ohZ72E9uDmXWLJOB1GxsH+DxPftsB8B6wlGDN02TAkxG6+4D3TWsbeC5CS8CDFce+AW500LhhOW2020TRjK3b21HEmgti9m0RonxbdMZeVzV+/4tF3cBpP7E9mKHNL5q8h5g0eYsCMQz0epq8gQrwMXAgcs0FGXGFRcB9wCemF9PkbYqM/Bas7fxLwNeJPdTdpo4itQti8lPMqTpXuozVRVXPpbHI3KkNTB1NfkL81j2mvhDp91HgV9MKuRIqrykj3WPq4rHyL+axj8/qGPmTqi6F9YDlHOvJU6oYcTsh/TYSzWmTE6JT19CtLTJt32D6CmHe0eQn1O8z5AXgT4sx4Vcu0/EQecMydB8z0hUWkTd2t4CrwNEePqMBcAR4mrBbwyXLPWJa8zrXmmLEhNBmfpkuY2102xxrih+pb+ieAb6vGhuA97UcJ5KR8gZ77K+99xxeYBzH6Q3/Z0fHcXrDC4zjOL3hBcZxnN74F+zlvXFWXF9PAAAAAElFTkSuQmCC); + background-repeat: no-repeat; +} \ No newline at end of file diff --git a/public/static/assets/mbui/mbui.js b/public/static/assets/mbui/mbui.js new file mode 100644 index 0000000..b832032 --- /dev/null +++ b/public/static/assets/mbui/mbui.js @@ -0,0 +1,29 @@ +;!function(win){"use strict";var doc=win.document;var config={modules:{},status:{},timeout:10,event:{}};var Mbui=function(){this.v='1.0.1'};var GLOBAL=win.GLOBAL||{};var getPath=function(){var jsPath=doc.currentScript?doc.currentScript.src:function(){var js=doc.scripts;var last=js.length-1;var src;for(var i=last;i>0;i--){if(js[i].readyState==='interactive'){src=js[i].src;break}}return src||js[last].src}();return config.dir=GLOBAL.dir||jsPath.substring(0,jsPath.lastIndexOf('/')+1)}();var error=function(msg,type){type=type||'log';win.console&&console[type]&&console[type]('mbui error hint: '+msg)};var isOpera=typeof opera!=='undefined'&&opera.toString()==='[object Opera]';var modules={};Mbui.prototype.cache=config;Mbui.prototype.define=function(deps,factory){var that=this;var type=typeof deps==='function';var callback=function(){var setApp=function(app,exports){mbui[app]=exports;config.status[app]=true};typeof factory==='function'&&factory(function(app,exports){setApp(app,exports);config.callback[app]=function(){factory(setApp)}});return this};type&&(factory=deps,deps=[]);that.use(deps,callback,null,'define');return that};Mbui.prototype.use=function(apps,callback,exports,from){var that=this;var dir=config.dir=config.dir?config.dir:getPath;var head=doc.getElementsByTagName('head')[0];apps=function(){if(typeof apps==='string'){return[apps]}else if(typeof apps==='function'){callback=apps;return['all']}return apps}();var item=apps[0];var timeout=0;exports=exports||[];config.host=config.host||(dir.match(/\/\/([\s\S]+?)\//)||['//'+location.host+'/'])[0];function onScriptLoad(e,url){var readyRegExp=navigator.platform==='PLaySTATION 3'?/^complete$/:/^(complete|loaded)$/;if(e.type==='load'||(readyRegExp.test((e.currentTarget||e.srcElement).readyState))){config.modules[item]=url;head.removeChild(node);(function poll(){if(++timeout>config.timeout*1000/4){return error(item+' is not a valid module','error')}config.status[item]?onCallback():setTimeout(poll,4)}())}}function onCallback(){exports.push(mbui[item]);apps.length>1?that.use(apps.slice(1),callback,exports,from):(typeof callback==='function'&&function(){callback.apply(mbui,exports)}())}if(apps.length===0||(modules[item])){return onCallback(),that}var url=(modules[item]?(dir+'modules/'):(/^\{\/\}/.test(that.modules[item])?'':(config.base||'')))+(that.modules[item]||item)+'.js';url=url.replace(/^\{\/\}/,'');if(!config.modules[item]&&mbui[item]){config.modules[item]=url}if(!config.modules[item]){var node=doc.createElement('script');node.async=true;node.charset='utf-8';node.src=url+function(){var version=config.version===true?(config.v||(new Date()).getTime()):(config.version||'');return version?('?v='+version):''}();head.appendChild(node);if(node.attachEvent&&!(node.attachEvent.toString&&node.attachEvent.toString().indexOf('[native code')<0)&&!isOpera){node.attachEvent('onreadystatechange',function(e){onScriptLoad(e,url)})}else{node.addEventListener('load',function(e){onScriptLoad(e,url)},false)}config.modules[item]=url}else{(function poll(){if(++timeout>config.timeout*1000/4){return error(item+' is not a valid module','error')}(typeof config.modules[item]==='string'&&config.status[item])?onCallback():setTimeout(poll,4)}())}return that};Mbui.prototype.disuse=function(apps){var that=this;apps=that.isArray(apps)?apps:[apps];that.each(apps,function(index,item){if(!config.status[item]){}delete that[item];delete modules[item];delete that.modules[item];delete config.status[item];delete config.modules[item]});return that};Mbui.prototype.getStyle=function(node,name){var style=node.currentStyle?node.currentStyle:win.getComputedStyle(node,null);return style[style.getPropertyValue?'getPropertyValue':'getAttribute'](name)};Mbui.prototype.link=function(href,fn,cssname){var that=this;var head=doc.getElementsByTagName('head')[0];var link=doc.createElement('link');if(typeof fn==='string')cssname=fn;var app=(cssname||href).replace(/\.|\//g,'');var id='mbuicss-'+app;var STAUTS_NAME='creating';var timeout=0;link.href=href+(config.debug?'?v='+new Date().getTime():'');link.rel='stylesheet';link.id=id;link.media='all';if(!doc.getElementById(id)){head.appendChild(link)}if(typeof fn!=='function')return that;(function poll(status){var delay=100;var getLinkElem=doc.getElementById(id);if(++timeout>config.timeout*1000/delay){return error(href+' timeout')}if(parseInt(that.getStyle(getLinkElem,'width'))===1989){if(status===STAUTS_NAME)getLinkElem.removeAttribute('load-status');getLinkElem.getAttribute('load-status')===STAUTS_NAME?setTimeout(poll,delay):fn()}else{getLinkElem.setAttribute('load-status',STAUTS_NAME);setTimeout(function(){poll(STAUTS_NAME)},delay)}}());return that};Mbui.prototype.addcss=function(firename,fn,cssname){return mbui.link(config.dir+'css/'+firename,fn,cssname)};config.callback={};Mbui.prototype.factory=function(modName){if(mbui[modName]){return typeof config.callback[modName]==='function'?config.callback[modName]:null}};Mbui.prototype.config=function(options){options=options||{};for(var key in options){config[key]=options[key]}return this};Mbui.prototype.modules=function(){var clone={};for(var o in modules){clone[o]=modules[o]}return clone}();Mbui.prototype.extend=function(options){var that=this;options=options||{};for(var o in options){if(that[o]||that.modules[o]){error(o+' Module already exists','error')}else{that.modules[o]=options[o]}}return that};Mbui.prototype.router=Mbui.prototype.hash=function(hash){var that=this;var hash=hash||location.hash;var data={path:[],search:{},hash:(hash.match(/[^#](#.*$)/)||[])[1]||''};if(!/^#\//.test(hash))return data;hash=hash.replace(/^#\//,'');data.href='/'+hash;hash=hash.replace(/([^#])(#.*$)/,'$1').split('/')||[];that.each(hash,function(index,item){/^\w+=/.test(item)?function(){item=item.split('=');data.search[item[0]]=item[1]}():data.path.push(item)});return data};Mbui.prototype.url=function(href){var that=this;var data={pathname:function(){var pathname=href?function(){var str=(href.match(/\.[^.]+?\/.+/)||[])[0]||'';return str.replace(/^[^\/]+/,'').replace(/\?.+/,'')}():location.pathname;return pathname.replace(/^\//,'').split('/')}(),search:function(){var obj={};var search=(href?function(){var str=(href.match(/\?.+/)||[])[0]||'';return str.replace(/\#.+/,'')}():location.search).replace(/^\?+/,'').split('&');that.each(search,function(index,item){var _index=item.indexOf('='),key=function(){if(_index<0){return item.substr(0,item.length)}else if(_index===0){return false}else{return item.substr(0,_index)}}();if(key){obj[key]=_index>0?item.substr(_index+1):null}});return obj}(),hash:that.router(function(){return href?((href.match(/#.+/)||[])[0]||'/'):location.hash}())};return data};Mbui.prototype.each=function(obj,fn){var key;var that=this;var callFn=function(key,obj){return fn.call(obj[key],key,obj[key])};if(typeof fn!=='function')return that;obj=obj||[];if(that.isArray(obj)){for(key=0;key0){setTimeout(function(){location.reload()},delay)}else{location.reload()}},replace:function(url,delay){if(delay&&delay>0){setTimeout(function(){window.location.replace(url)},delay)}else{window.location.replace(url)}},renderSize:function(val){if(null==val||val==''){return"0 Bytes"}var unitArr=new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB");var index=0;var srcsize=parseFloat(val);index=Math.floor(Math.log(srcsize)/Math.log(1024));var size=srcsize/Math.pow(1024,index);size=size.toFixed(2);return size+unitArr[index]},file_item:function(file,view=''){let image=['jpg','jpeg','png','gif'];let fileshow='
                        ';if(file['fileext']=='pdf'){}if(image.includes(file['fileext'])){fileshow='
                        '+file['name']+'
                        '}let file_del='';if(view==''){file_del='
                        '}let filesize=this.renderSize(file['filesize']);let filedate=this.formatDate(file['create_time']);let item='
                        '+fileshow+'
                        '+file['name']+'
                        '+filesize+','+filedate+'
                        '+file_del+'
                        ';return item},countdown:function(options){var that=this;options=$.extend(true,{date:new Date(),now:new Date()},options);var args=arguments;if(args.length>1){options.date=new Date(args[0]);options.now=new Date(args[1]);options.clock=args[2]}var inst={options:options,clear:function(){clearTimeout(inst.timer)},reload:function(opts){this.clear();$.extend(true,this.options,{now:new Date()},opts);count()}};typeof options.ready==='function'&&options.ready();var count=(function fn(){var date=new Date(options.date);var now=new Date(options.now);var countTime=function(time){return time>0?time:0}(date.getTime()-now.getTime());var result={d:Math.floor(countTime/(1000*60*60*24)),h:Math.floor(countTime/(1000*60*60))%24,m:Math.floor(countTime/(1000*60))%60,s:Math.floor(countTime/1000)%60};var next=function(){now.setTime(now.getTime()+1000);options.now=now;count()};inst.timer=setTimeout(next,1000);typeof options.clock==='function'&&options.clock(result,inst);if(countTime<=0){clearTimeout(inst.timer);typeof options.done==='function'&&options.done(result,inst)}return fn})();return inst},timeAgo:function(time,onlyDate){var that=this;var arr=[[],[]];var stamp=new Date().getTime()-new Date(time).getTime();if(stamp>1000*60*60*24*31){stamp=new Date(time);arr[0][0]=that.digit(stamp.getFullYear(),4);arr[0][1]=that.digit(stamp.getMonth()+1);arr[0][2]=that.digit(stamp.getDate());if(!onlyDate){arr[1][0]=that.digit(stamp.getHours());arr[1][1]=that.digit(stamp.getMinutes());arr[1][2]=that.digit(stamp.getSeconds())}return arr[0].join('-')+' '+arr[1].join(':')}if(stamp>=1000*60*60*24){return((stamp/1000/60/60/24)|0)+' 天前'}else if(stamp>=1000*60*60){return((stamp/1000/60/60)|0)+' 小时前'}else if(stamp>=1000*60*3){return((stamp/1000/60)|0)+' 分钟前'}else if(stamp<0){return'未来'}else{return'刚刚'}},formatDate:function(timestamp,formatStr='YYYY-MM-DD HH:mm:ss'){const date=new Date(timestamp);if(timestamp.toString().length===10){date.setTime(timestamp*1000)}const padZero=(num)=>String(num).padStart(2,'0');const replacements={YYYY:date.getFullYear(),MM:padZero(date.getMonth()+1),DD:padZero(date.getDate()),HH:padZero(date.getHours()),mm:padZero(date.getMinutes()),ss:padZero(date.getSeconds())};return Object.entries(replacements).reduce((str,[key,value])=>{return str.replace(key,value)},formatStr)},time:function(){return Math.floor((new Date).getTime()/1e3)},date:function(n,t){var e,r,u=["Sun","Mon","Tues","Wednes","Thurs","Fri","Satur","January","February","March","April","May","June","July","August","September","October","November","December"],o=/\\?(.?)/gi,i=function(n,t){return r[n]?r[n]():t},c=function(n,t){for(n=String(n);n.length9?-1:0)},Y:function(){return e.getFullYear()},y:function(){return r.Y().toString().slice(-2)},a:function(){return e.getHours()>11?"pm":"am"},A:function(){return r.a().toUpperCase()},B:function(){var n=3600*e.getUTCHours(),t=60*e.getUTCMinutes(),r=e.getUTCSeconds();return c(Math.floor((n+t+r+3600)/86.4)%1e3,3)},g:function(){return r.G()%12||12},G:function(){return e.getHours()},h:function(){return c(r.g(),2)},H:function(){return c(r.G(),2)},i:function(){return c(e.getMinutes(),2)},s:function(){return c(e.getSeconds(),2)},u:function(){return c(1e3*e.getMilliseconds(),6)},e:function(){throw new Error("Not supported (see source code of date() for timezone on how to add support)")},I:function(){return new Date(r.Y(),0)-Date.UTC(r.Y(),0)!=new Date(r.Y(),6)-Date.UTC(r.Y(),6)?1:0},O:function(){var n=e.getTimezoneOffset(),t=Math.abs(n);return(n>0?"-":"+")+c(100*Math.floor(t/60)+t%60,4)},P:function(){var n=r.O();return n.substr(0,3)+":"+n.substr(3,2)},T:function(){return"UTC"},Z:function(){return 60*-e.getTimezoneOffset()},c:function(){return"Y-m-d\\TH:i:sP".replace(o,i)},r:function(){return"D, d M Y H:i:s O".replace(o,i)},U:function(){return e/1e3|0}};return function(n,t){return e=void 0===t?new Date:t instanceof Date?new Date(t):new Date(1e3*t),n.replace(o,i)}(n,t)},strtotime:function(text,now){var parsed,match,today,year,date,days,ranges,len,times,regex,i,fail=false;if(!text){return fail}text=text.replace(/^\s+|\s+$/g,"").replace(/\s{2,}/g," ").replace(/[\t\r\n]/g,"").toLowerCase();match=text.match(/^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/);if(match&&match[2]===match[4]){if(match[1]>1901){switch(match[2]){case"-":if(match[3]>12||match[5]>31){return fail}return new Date(match[1],parseInt(match[3],10)-1,match[5],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000;case".":return fail;case"/":if(match[3]>12||match[5]>31){return fail}return new Date(match[1],parseInt(match[3],10)-1,match[5],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000}}else{if(match[5]>1901){switch(match[2]){case"-":if(match[3]>12||match[1]>31){return fail}return new Date(match[5],parseInt(match[3],10)-1,match[1],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000;case".":if(match[3]>12||match[1]>31){return fail}return new Date(match[5],parseInt(match[3],10)-1,match[1],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000;case"/":if(match[1]>12||match[3]>31){return fail}return new Date(match[5],parseInt(match[1],10)-1,match[3],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000}}else{switch(match[2]){case"-":if(match[3]>12||match[5]>31||(match[1]<70&&match[1]>38)){return fail}year=match[1]>=0&&match[1]<=38?+match[1]+2000:match[1];return new Date(year,parseInt(match[3],10)-1,match[5],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000;case".":if(match[5]>=70){if(match[3]>12||match[1]>31){return fail}return new Date(match[5],parseInt(match[3],10)-1,match[1],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000}if(match[5]<60&&!match[6]){if(match[1]>23||match[3]>59){return fail}today=new Date();return new Date(today.getFullYear(),today.getMonth(),today.getDate(),match[1]||0,match[3]||0,match[5]||0,match[9]||0)/1000}return fail;case"/":if(match[1]>12||match[3]>31||(match[5]<70&&match[5]>38)){return fail}year=match[5]>=0&&match[5]<=38?+match[5]+2000:match[5];return new Date(year,parseInt(match[1],10)-1,match[3],match[6]||0,match[7]||0,match[8]||0,match[9]||0)/1000;case":":if(match[1]>23||match[3]>59||match[5]>59){return fail}today=new Date();return new Date(today.getFullYear(),today.getMonth(),today.getDate(),match[1]||0,match[3]||0,match[5]||0)/1000}}}}if(text==="now"){return now===null||isNaN(now)?new Date().getTime()/1000|0:now|0}if(!isNaN(parsed=Date.parse(text))){return parsed/1000|0}date=now?new Date(now*1000):new Date();days={"sun":0,"mon":1,"tue":2,"wed":3,"thu":4,"fri":5,"sat":6};ranges={"yea":"FullYear","mon":"Month","day":"Date","hou":"Hours","min":"Minutes","sec":"Seconds"};function lastNext(type,range,modifier){var diff,day=days[range];if(typeof day!=="undefined"){diff=day-date.getDay();if(diff===0){diff=7*modifier}else{if(diff>0&&type==="last"){diff-=7}else{if(diff<0&&type==="next"){diff+=7}}}date.setDate(date.getDate()+diff)}}function process(val){var splt=val.split(" "),type=splt[0],range=splt[1].substring(0,3),typeIsNumber=/\d+/.test(type),ago=splt[2]==="ago",num=(type==="last"?-1:1)*(ago?-1:1);if(typeIsNumber){num*=parseInt(type,10)}if(ranges.hasOwnProperty(range)&&!splt[1].match(/^mon(day|\.)?$/i)){return date["set"+ranges[range]](date["get"+ranges[range]]()+num)}if(range==="wee"){return date.setDate(date.getDate()+(num*7))}if(type==="next"||type==="last"){lastNext(type,range,num)}else{if(!typeIsNumber){return false}}return true}times="(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)";regex="([+-]?\\d+\\s"+times+"|(last|next)\\s"+times+")(\\sago)?";match=text.match(new RegExp(regex,"gi"));if(!match){return fail}for(i=0,len=match.length;i=0){return true}else{return false}},timeline:function(tt){var today=new Date();var d=new Date(tt*1000);var m=today.getTime()-d.getTime();if(m<=0){m=1000}if(m<60*1000){return Math.floor(m/1000)+"秒前"}else{if(m<60*60*1000){return Math.floor(m/(1000*60))+"分钟前"}else{if(m<60*60*1000*24){return Math.floor(m/(1000*60*60))+"小时前"}else{if(m<60*60*1000*24*7){return Math.floor(m/(1000*60*60*24))+"天前"}else{if(m<60*60*1000*24*7*56){return Math.floor(m/(1000*60*60*24*7))+"周前"}else{return Math.floor(m/(1000*60*60*24*7*52))+"年前"}}}}}},getFirstNowLastDay:function(nowDate){var now=nowDate?new Date(nowDate):new Date();var strLink="-";var year=now.getFullYear();var month=now.getMonth()+1;var day=now.getDate();if(month>=1&&month<=9){month="0"+month}if(day>=1&&day<=9){day="0"+day}var yearMonth=year+strLink+month;var firstDate=year+strLink+month+strLink+'01';var sysDate=year+strLink+month+strLink+day;var lastDay=this.getLastDay(year,month);var lastDate=year+strLink+month+strLink+lastDay;return[firstDate,sysDate,lastDate,yearMonth]},getLastDay:function(year,month){var new_year=year;var new_month=month++;if(month>12){new_month-=12;new_year++}return new Date(new_year,new_month,0).getDate()},array_keys:function(r,n,a){var e=void 0!==n,o=[],t=!!a,i=!0,y="";for(y in r)r.hasOwnProperty(y)&&(i=!0,e&&(t&&r[y]!==n?i=!1:r[y]!==n&&(i=!1)),i&&(o[o.length]=y));return o},array_values:function(r){var n=[],a="";for(a in r)n[n.length]=r[a];return n},array_unique:function(r){var n="",t={},u="";for(n in r)r.hasOwnProperty(n)&&(u=r[n],!1===function(r,n){var t="";for(t in n)if(n.hasOwnProperty(t)&&n[t]+""==r+"")return t;return!1}(u,t)&&(t[n]=u));return t},array_slice:function(r,i,e,t){var o="";if("[object Array]"!==Object.prototype.toString.call(r)||t&&0!==i){var a=0,c={};for(o in r)a+=1,c[o]=r[o];r=c,i=i<0?a+i:i,e=void 0===e?a:e<0?a+e-i:e;var n={},l=!1,f=-1,s=0,v=0;for(o in r){if(++f,s>=e)break;f===i&&(l=!0),l&&(++s,is_int(o)&&!t?n[v++]=r[o]:n[o]=r[o])}return n}return void 0===e?r.slice(i):e>=0?r.slice(i,i+e):r.slice(i,e)},array_search:function(r,e,t){var n=!!t,i="";if("object"==typeof r&&r.exec){if(!n){var o="i"+(r.global?"g":"")+(r.multiline?"m":"")+(r.sticky?"y":"");r=new RegExp(r.source,o)}for(i in e)if(e.hasOwnProperty(i)&&r.test(e[i]))return i;return!1}for(i in e)if(e.hasOwnProperty(i)&&(n&&e[i]===r||!n&&e[i]==r))return i;return!1},is_array:function(t){if(!t||"object"!=typeof t)return!1;if(function(t){if(!t||"object"!=typeof t||"number"!=typeof t.length)return!1;var e=t.length;return t[t.length]="bogus",e!==t.length?(t.length-=1,!0):(delete t[t.length],!1)}(t))return!0;var e=Object.prototype.toString.call(t),n=function(t){var e=/\W*function\s+([\w$]+)\s*\(/.exec(t);return e?e[1]:"(Anonymous)"}(t.constructor);return"[object Object]"===e&&"Object"===n},in_array:function(r,n,i){var f="";if(!i){for(f in n)if(n[f]==r)return!0}else for(f in n)if(n[f]===r)return!0;return!1},sort:function(inputArr,sort_flags,strictForIn=true){var valArr=[],keyArr=[],k='',i=0,sorter=false,populateArr=[];switch(sort_flags){case'SORT_STRING':sorter=function(a,b){return strnatcmp(a,b)};break;case'SORT_NUMERIC':sorter=function(a,b){return(a-b)};break;default:sorter=function(a,b){var aFloat=parseFloat(a),bFloat=parseFloat(b),aNumeric=aFloat+''===a,bNumeric=bFloat+''===b;if(aNumeric&&bNumeric){return aFloat>bFloat?1:aFloatb?1:ar.length&&error("Error","Invalid"),t.push(i),i=r.slice(e+(a-1),e+a),a+=1;return[t.length,t.join("")]},read_chrs=function(r,e,a){var t,i,u;for(u=[],t=0;tn.length?Array(e-n.length+1).join("0")+n:n},o="undefined"!=typeof window?window:global;o.$locutus=o.$locutus||{};var d=o.$locutus;return d.php=d.php||{},d.php.uniqidSeed||(d.php.uniqidSeed=Math.floor(123456789*Math.random())),d.php.uniqidSeed++,t=n,t+=i(parseInt((new Date).getTime()/1e3,10),8),t+=i(d.php.uniqidSeed,5),e&&(t+=(10*Math.random()).toFixed(8).toString()),t},intval:function(i,t){var n,a,e=typeof i;return"boolean"===e?+i:"string"===e?(0===t&&(a=i.match(/^\s*0(x?)/i),t=a?a[1]?16:8:10),n=parseInt(i,t||10),isNaN(n)||!isFinite(n)?0:n):"number"===e&&isFinite(i)?i<0?Math.ceil(i):Math.floor(i):0},floatval:function(a){return parseFloat(a)||0},log:function(arr){console.log(arr)},trim:function(r,n){var t=[" ","\n","\r","\t","\f","\v"," "," "," "," "," "," "," "," "," "," "," "," ","​","\u2028","\u2029"," "].join(""),e=0,i=0;for(r+="",n&&(t=(n+"").replace(/([[\]().?\/*{}+$^:])/g,"$1")),e=r.length,i=0;i=0;i--)if(-1===t.indexOf(r.charAt(i))){r=r.substring(0,i+1);break}return-1===t.indexOf(r.charAt(0))?r:""},rtrim:function(e,r){return r=r?(r+"").replace(/([[\]().?\/*{}+$^:])/g,"\\$1"):" \\s ",(e+"").replace(new RegExp("["+r+"]+$","g"),"")},ltrim:function(e,r){return r=r?(r+"").replace(/([[\]().?\/*{}+$^:])/g,"$1"):" \\s ",(e+"").replace(new RegExp("^["+r+"]+","g"),"")},strtrim:function(a){return a.replace(/\s+/g," ")},str_replace:function(t,o,e,c){var r=0,l=0,n="",a="",i=0,p=0,u=[].concat(t),f=[].concat(o),g=e,y="[object Array]"===Object.prototype.toString.call(f),b="[object Array]"===Object.prototype.toString.call(g);g=[].concat(g);var j="undefined"!=typeof window?window:global;j.$locutus=j.$locutus||{};var v=j.$locutus;if(v.php=v.php||{},"object"==typeof t&&"string"==typeof o){for(n=o,o=[],r=0;r/g)||[]).join("");var tags=/<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,commentsAndPhpTags=/|<\?(?:php)?[\s\S]*?\?>/gi;return input.replace(commentsAndPhpTags,"").replace(tags,function($0,$1){return allowed.indexOf("<"+$1.toLowerCase()+">")>-1?$0:""})},ucfirst:function(t){return t+="",t.charAt(0).toUpperCase()+t.substr(1)},htmlencode:function(sStr){var htmlspecialchars=function(e,E,T,_){var r=0,t=0,a=!1;("undefined"==typeof E||null===E)&&(E=2),e=e.toString(),_!==!1&&(e=e.replace(/&/g,"&")),e=e.replace(//g,">");var N={ENT_NOQUOTES:0,ENT_HTML_QUOTE_SINGLE:1,ENT_HTML_QUOTE_DOUBLE:2,ENT_COMPAT:2,ENT_QUOTES:3,ENT_IGNORE:4};if(0===E&&(a=!0),"number"!=typeof E){for(E=[].concat(E),t=0;t");var t={ENT_NOQUOTES:0,ENT_HTML_QUOTE_SINGLE:1,ENT_HTML_QUOTE_DOUBLE:2,ENT_COMPAT:2,ENT_QUOTES:3,ENT_IGNORE:4};if(0===E&&(r=!0),"number"!=typeof E){for(E=[].concat(E),_=0;_]|&(?=#[a-zA-Z0-9]+)/g;if(html===undefined||html===null)return'';html+='';if(!exp.test(html))return html;return html.replace(/&(?!#?[a-zA-Z0-9]+;)/g,'&').replace(//g,'>').replace(/'/g,''').replace(/"/g,'"')},unescape:function(html){if(html===undefined||html===null)html='';html+='';return html.replace(/\&/g,'&').replace(/\</g,'<').replace(/\>/g,'>').replace(/\'/g,'\'').replace(/\"/g,'"')},base64_decode:function(n){var r=function(n){return decodeURIComponent(n.split("").map(function(n){return"%"+("00"+n.charCodeAt(0).toString(16)).slice(-2)}).join(""))};if("undefined"==typeof window)return new Buffer(n,"base64").toString("utf-8");if(void 0!==window.atob)return r(window.atob(n));var e,t,o,i,d,f,a,c,u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",h=0,w=0,C="",g=[];if(!n)return n;n+="";do{i=u.indexOf(n.charAt(h++)),d=u.indexOf(n.charAt(h++)),f=u.indexOf(n.charAt(h++)),a=u.indexOf(n.charAt(h++)),c=i<<18|d<<12|f<<6|a,e=c>>16&255,t=c>>8&255,o=255&c,g[w++]=64===f?String.fromCharCode(e):64===a?String.fromCharCode(e,t):String.fromCharCode(e,t,o)}while(h>18&63,a=f>>12&63,c=f>>6&63,d=63&f,l[w++]=h.charAt(i)+h.charAt(a)+h.charAt(c)+h.charAt(d)}while(u1&&void 0!==arguments[1]&&arguments[1])){for(var r=[],t=0;t255){++bytes}}sSuffix=sSuffix||"";return(bytes-iMaxBytes==1?str.substr(0,i-1):str.substr(0,i))+sSuffix},strfind:function(string,find){return!(string.indexOf(find)===-1)},is_num:function(num){var reg=new RegExp("^[0-9]*$");return reg.test(num)},is_mobile:function(num){var reg=/^1\d{10}$/;return reg.test(num)},is_qq:function(num){var reg=/^[1-utf8_decode]{1}\d{4,11}$/;return reg.test(num)},is_email:function(str){var reg=/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;return reg.test(str)},is_chinese:function(num){var reg=/[\u4e00-\u9fa5]/g;return reg.test(num)},is_reg:function(num){var reg=/^([a-zA-z_]{1})([\w]*)$/g;return reg.test(num)},is_tel:function(str){var reg=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;return reg.test(str)},is_ip:function(strIP){if(isNull(strIP)){return false}var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g;if(re.test(strIP)){if(RegExp.$1<256&&RegExp.$2<256&&RegExp.$3<256&&RegExp.$4<256){return true}}return false},is_zipcode:function(str){var reg=/^(\d){6}$/;return reg.test(str)},is_english:function(str){var reg=/^[A-Za-z]+$/;return reg.test(str)},is_url:function(url){var strRegex=/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;var re=new RegExp(strRegex);return re.test(url)},is_http:function(url){if(url.indexOf("http://")===-1&&url.indexOf("https://")===-1){return false}return true},is_money:function(n){return!!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(n)},is_CardNumber:function(num){return num.toString().replace(/\s/g,'').replace(/(.{4})/g,"$1 ")},is_IDCard:function(idcode){var weight_factor=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];var check_code=['1','0','X','9','8','7','6','5','4','3','2','x'];var code=idcode+"";var last=idcode[17];var seventeen=code.substring(0,17);var arr=seventeen.split("");var len=arr.length;var num=0;for(var i=0;iparseInt(iMax)){return false}return true},in_float:function(n,fMin,fMax){if(!isFinite(n)){return false}if(fMin!=undefined&&parseFloat(n)parseFloat(fMax)){return false}return true},number_format:function(e,n,t,i){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var r=isFinite(+e)?+e:0,o=isFinite(+n)?Math.abs(n):0,a=void 0===i?",":i,d=void 0===t?".":t,u="";return u=(o?function(e,n){if(-1===(""+e).indexOf("e"))return+(Math.round(e+"e+"+n)+"e-"+n);var t=(""+e).split("e"),i="";return+t[1]+n>0&&(i="+"),(+(Math.round(+t[0]+"e"+i+(+t[1]+n))+"e-"+n)).toFixed(n)}(r,o).toString():""+Math.round(r)).split("."),u[0].length>3&&(u[0]=u[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,a)),(u[1]||"").length0;i++){var p='';for(var j=0;j0;j++){p=digit[num%10]+unit[1][j]+p;num=Math.floor(num/10)}s=p.replace(/(零.)*零$/,'').replace(/^$/,'零')+unit[0][i]+s}if(is_head==true){return head+s.replace(/(零.)*零元/,'元').replace(/(零.)+/g,'零').replace(/^整$/,'零元整')}else{return s.replace(/(零.)*零元/,'元').replace(/(零.)+/g,'零').replace(/^整$/,'零元整')}},hidebank:function(s="6217995510035399947"){return s.replace(/^(\d{8})\d+(\d{4})$/,"$1*******$2")},hidemobile:function(s="18291447788"){return s.replace(/^(\d{3})\d+(\d{4})$/,"$1****$2")},addcss:function(e){var t=document.createElement("style"),d=document.head||document.getElementsByTagName("head")[0];if(t.type="text/css",t.styleSheet){var a=function(){try{t.styleSheet.cssText=e}catch(e){}};t.styleSheet.disabled?setTimeout(a,10):a()}else{var s=document.createTextNode(e);t.appendChild(s)}d.appendChild(t)},addjs:function(t){var e=document.createElement("script");e.type="text/javascript";try{e.appendChild(document.createTextNode(t))}catch(d){e.text=t}document.head.appendChild(e)},loadjs:function(e,a){var t=document.createElement("script");t.src=e,t.onload=function(){var e=t.readyState&&"complete"!=t.readyState&&"loaded"!=t.readyState;a&&a(!e)},document.head.appendChild(t)},loadcss:function(e,n){var t=document.createElement("link");t.rel="stylesheet",t.type="text/css",t.onerror=function(){n(!1)},t.onload=function(){n(!0)},t.href=e,document.head.appendChild(t)},gethost:function(){return window.location.protocol+"//"+window.location.host},distance:function(latlngFirst,latlngLast){var La1=latlngFirst.lat*Math.PI/180.0;var La2=latlngLast.lat*Math.PI/180.0;var La3=La1-La2;var Lb3=latlngFirst.lng*Math.PI/180.0-latlngLast.lng*Math.PI/180.0;var dis=2*Math.asin(Math.sqrt(Math.pow(Math.sin(La3/2),2)+Math.cos(La1)*Math.cos(La2)*Math.pow(Math.sin(Lb3/2),2)));dis=dis*6378.137;dis=Math.round(dis*10000)/10000;return dis.toFixed(2)},setCookie:function(name,value,iDay){var oDate=new Date();oDate.setDate(oDate.getDate()+iDay);document.cookie=name+'='+value+';expires='+oDate},getCookie:function(name){var arr=document.cookie.split('; ');for(var i=0;i' + s += '' + s += '
                      • ' + } + me.el.find(".dropdown-year").html(s); + }) + + //上一月 + el.on("click", ".calendar-pre", function (e) { + e.stopPropagation(); + var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1; + month--; + if (month < 1) { + year = year - 1; + month = 12; + } + opts.newDate.setFullYear(year); + var beforeDate = opts.newDate.getDate(); + opts.newDate.setMonth(month - 1); + var afterDate = opts.newDate.getDate(); + + //处理日期30号,切换到2月不存在30号 + if (beforeDate != afterDate) { + opts.newDate.setDate(opts.newDate.getDate() - 1); + } + opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate); + $(".calendar-month-text").text(month + "月"); + $(".calendar-year-text").text(year + "年"); + }) + + //下一月 + el.on("click", ".calendar-next", function (e) { + e.stopPropagation(); + var year = opts.newDate.getFullYear(), month = opts.newDate.getMonth() + 1; + month++; + if (month > 12) { + year = year + 1; + month = 1; + } + opts.newDate.setFullYear(year); + var beforeDate = opts.newDate.getDate(); + opts.newDate.setMonth(month - 1); + var afterDate = opts.newDate.getDate(); + + //处理日期30号,切换到2月不存在30号 + if (beforeDate != afterDate) { + opts.newDate.setDate(opts.newDate.getDate() - 1); + } + opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate); + $(".calendar-month-text").text(month + "月"); + $(".calendar-year-text").text(year + "年"); + }) + + //年份改变 + el.on("click", ".year-item", function (e) { + e.stopPropagation(); + $(".dropdown-year").removeClass("open"); + var yearText = $(this).text(); + var yearNum = yearText.split("年")[0]; + if (yearNum == opts.newDate.getFullYear()) return; + opts.newDate.setFullYear(yearNum); + opts.mode == "month" ? me._refreshCalendar(opts.newDate) : me._refreshYearCalendar(opts.newDate); + $(".calendar-year-text").text(yearText); + }) + + //月份下拉 + el.on("click", ".calendar-month-select", function (e) { + e.stopPropagation(); + $(".dropdown-year").removeClass("open"); + $(".dropdown-month").toggleClass("open"); + }) + + //月份改变 + el.on("click", ".month-item", function (e) { + e.stopPropagation(); + $(".dropdown-month").removeClass("open"); + var monthText = $(this).text(); + var monthNum = monthText.split("月")[0]; + if (monthNum == (opts.newDate.getMonth() + 1)) return; + + var beforeDate = opts.newDate.getDate(); + opts.newDate.setMonth(monthNum - 1); + var afterDate = opts.newDate.getDate(); + + //处理日期30号,切换到2月不存在30号 + if (beforeDate != afterDate) { + opts.newDate.setDate(opts.newDate.getDate() - 1); + } + me._refreshCalendar(opts.newDate); + $(".calendar-month-text").text(monthText); + }) + + $(document.body).on("click", function (e) { + $(".dropdown-month").removeClass("open"); + $(".dropdown-year").removeClass("open"); + }) + }, + //公开方法 + changeMode: function (mode) { + var me = this; + if (mode == me.options.mode) return; + me.options.mode = mode; + me._createCalendar(); + }, + getViewDate: function (viewDate) { + var me = this, opts = me.options, mode = opts.mode, data = opts.data; + if (!data || data.length == 0) return []; + var viewData = {}, modeYear = viewDate.getFullYear(), modeMonth = null; + if (mode == "month") { modeMonth = viewDate.getMonth() }; + + //筛选视图数据并转化未对象 要不要转化为属性 + for (var i = 0; i < data.length; i++) { + var item = data[i]; + var start = me._getDateByString(item.startDate); + var year = start.getFullYear(); + var month = start.getMonth(); + var date = start.getDate(); + if (modeMonth && year == modeYear && modeMonth == month) { + if (!viewData[date]) viewData[date] = []; + viewData[date].push(item); + } + else if (!modeMonth && year == modeYear) { + if (!viewData[month]) viewData[month] = []; + viewData[month].push(item); + } + } + return viewData; + + }, + _getDateByString: function (stringDate) { + var me = this; + var year = stringDate.split("-")[0]; + var month = parseInt(stringDate.split("-")[1]) - 1; + var date = stringDate.split("-")[2]; + return new Date(year, month, date); + }, + //私有方法 + _createCalendar: function () { + var me = this; + var dateMode = me.options.mode; + me._createView(); + }, + _createView: function () { + var me = this, el = me.el, opts = me.options, mode = opts.mode, newDate = opts.newDate, html = ''; + html += me._createToolbar(); + html += '
                        '; + html += '' + if (mode == "month") { + html += me._createHeader(); + } + html += me._createBody(); + html += '
                        ' + html += '
                        ' + el.html(html); + + if (mode == "month") { + me._refreshCalendar(newDate); + } + else { + me._refreshYearCalendar(newDate); + } + if (me.options.success) me.options.success(newDate); + }, + _createToolbar: function () { + var me = this, newDare = me.options.newDate, mode = me.options.mode, showModeBtn = me.options.showModeBtn, s = ''; + var year = newDare.getFullYear(); + var month = newDare.getMonth() + 1; + s += '
                        ' + s += '
                        ' + s += ' ' + year + '年' + s += '' + s += '
                        ' + + if (mode == "month") { + s += '
                        ' + s += ' ' + month + '月' + //创建月份下拉 + s += '' + s += '
                        ' + } + if (showModeBtn) { + s += '
                        ' + s += '
                        ' + if (mode == "month") { + s += '' + s += '' + } + else { + s += '' + s += '' + } + s += '
                        ' + s += '
                        ' + } + s += '' + s += '
                        ' + return s; + }, + _createHeader: function () { + var me = this, opts = me.options, weekMode = opts.weekMode; + var s = '' + weekMode.forEach(function (item) { + s += ' ' + item + '' + }) + s += '' + return s; + }, + _createBody: function () { + var me = this; + var s = ' ' + s += '' + return s; + }, + _refreshYearCalendar: function (newDate) { + var me = this, showEvent = me.options.showEvent, s = ''; + //每次都重新获取会不会影响性能 + me.viewData = viewData = me.getViewDate(newDate); + var year = newDate.getFullYear(), month = newDate.getMonth(); + //四行三列 + for (var i = 0; i < 4; i++) { + s += '' + for (var l = 0; l < 3; l++) { + renderMonth = i * 3 + l; + if (month == renderMonth) { + s += ''; + } + else { + s += ''; + } + s += '
                        '; + s += '
                        ' + (renderMonth + 1) + '月'; + if (showEvent && viewData[renderMonth]) { + if (viewData[renderMonth].length > 0) { + s += '
                        '; + } + } + s += '
                        '; + s += '
                        '; + } + s += '' + } + me.el.find(".calendar-tbody").html(s); + }, + _refreshCalendar: function (newDate) { + var me = this, showEvent = me.options.showEvent, s = ''; + me.viewData = viewData = me.getViewDate(newDate); + var _newDate = me._cloneDate(newDate); + //当前date + var nowNum = _newDate.getDate(); + //第一天周几 + _newDate.setDate(1); + var weekDay = _newDate.getDay() == 0 ? 7 : _newDate.getDay(); + //视图第一天 + var viewDate = me._cloneDate(_newDate); + viewDate.setDate(viewDate.getDate() - weekDay + 1); + //当前第几周/行 (暂不处理) + var spileDate = (newDate.getTime() - viewDate.getTime()) / (1000 * 60 * 60 * 24); + renderDate = me._cloneDate(viewDate); + var start_date, end_date; + //固定六行 + for (var i = 0; i < 6; i++) { + s += '' + for (var l = 0; l < 7; l++) { + var year = renderDate.getFullYear(); + var month = renderDate.getMonth() + 1; + var date = renderDate.getDate(); + if (i == 0 && l == 0) { + start_date = year + '-' + month + '-' + date; + } + end_date = year + '-' + month + '-' + date; + if (renderDate.getMonth() < newDate.getMonth()) { + s += ''; + } + else if (renderDate.getMonth() > newDate.getMonth()) { + s += ''; + } + else if (date == nowNum) { + s += ''; + } + else { + s += ''; + } + s += '
                        '; + s += '
                        ' + date; + if (showEvent && viewData[date] && renderDate.getMonth() == newDate.getMonth()) { + if (viewData[date].length > 0) { + s += '
                        '; + } + } + s += '
                        '; + s += '
                        '; + renderDate.setDate(renderDate.getDate() + 1); + } + s += '' + } + me.el.find(".calendar-tbody").html(s); + if (me.options.mark) me.options.mark(start_date, end_date); + }, + _cloneDate: function (date) { + return new Date(date.getFullYear(), date.getMonth(), date.getDate()); + } + } + var calendar = function (element, options) { + Calendar.el = $('#' + element); + Calendar.options = $.extend(true, {}, settings, options); + Calendar.init(); + } + // 输出接口 + exports('calendar', calendar); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/dataPicker.js b/public/static/assets/mbui/module/dataPicker.js new file mode 100644 index 0000000..9e74f36 --- /dev/null +++ b/public/static/assets/mbui/module/dataPicker.js @@ -0,0 +1,393 @@ +mbui.define(['tool','layer'], function (exports) { + const tool = mbui.tool,layer = mbui.layer; + let searchTimer; + const dataTypes = { + 'property':{ + title:'选择固定资产', + url:'/adm/api/get_property', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'car':{ + title:'选择车辆信息', + url:'/adm/api/get_car', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'room':{ + title:'选择会议室', + url:'/adm/api/get_meeting_room', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'loan':{ + title:'选择抵消借支', + url:'/finance/api/get_loan', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'customer':{ + title:'选择客户', + url:'/customer/api/get_customer', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'supplier':{ + title:'选择供应商', + url:'/contract/api/get_supplier', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'contract':{ + title:'选择销售合同', + url:'/contract/api/get_contract', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'product':{ + title:'选择产品', + url:'/contract/api/get_product', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'purchase':{ + title:'选择采购合同', + url:'/contract/api/get_purchase', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'purchased':{ + title:'选择采购物品', + url:'/contract/api/get_purchased', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'project':{ + title:'选择项目', + url:'/project/api/get_project', + searchbar:'', + template:function (item,types){ + return '' + } + }, + 'task':{ + title:'选择任务', + url:'/project/api/get_task', + searchbar:'', + template:function (item,types){ + return '' + } + } + }; + //html转义,防止XSS + function escapeHtml(text) { + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + return text.replace(/[&<>"']/g, function(m) { return map[m]; }); + } + + var LoadData= function () { + this.config = { + title: "请选择内容", + url: "", + searchbar:"", + type: "radio", + where: {}, + limit: 20, + data:[], + selectData:[], + template: function (data) { + return JSON.parse(data); + }, + callback: function(){} + }; + this.index = 0; + this.loaded = 0; + this.page = 1; + this.count = 0; + this.total = 0; + }; + // 初始化 + LoadData.prototype.init = function (options,types) { + var that = this; + let opts={}; + if (types != "undefined") { + opts = dataTypes[types]; + } + $.extend(true,that.config,opts,options); + //console.log(that.config); + that.index = new Date().getTime(); + var $container = $('
                        关闭确认

                        '+that.config.title+'

                        '); + $container.append(that.config.searchbar); + $container.append('

                        暂无数据
                        努力加载中
                        —— ● ——
                        '); + $('body').append($container); + $('#root').hide(); + + $container.find('.left').click(function () { + $container.fadeOut(function () { + $container.remove(); + $('#root').show(); + }); + }); + + $container.on('input','.search-input',function() { + const key = $(this).val().trim(); + // 清除上一次的定时器 + clearTimeout(searchTimer); + // 设置新的延迟请求 + searchTimer = setTimeout(() => { + that.config.where['keywords']=key; + that.page=1; + that.ajax(); + }, 400); + }); + + $container.on('click','.tags-search',function() { + const key = $(this).data('key'); + const val = $(this).data('val'); + $(this).addClass('active').siblings().removeClass('active'); + // 清除上一次的定时器 + clearTimeout(searchTimer); + // 设置新的延迟请求 + searchTimer = setTimeout(() => { + that.config.where[key]=val; + that.page=1; + that.ajax(); + }, 400); + }); + + $container.find('.right').click(function () { + let selected = $container.find('input:checked'); + if (selected.length == 0) { + layer.msg('请选择数据'); + return false; + } + that.config.selectData.length=0; + let ids=[]; + for (var m = 0; m < selected.length; m++) { + let selected_item = $(selected[m]).parent(); + let id=selected_item.data('id'); + ids.push(id); + } + that.config.selectData = that.config.data.filter(item => ids.includes(item.id)); + that.config.callback(that.config.selectData); + $container.fadeOut(function () { + $container.remove(); + $('#root').show(); + }); + }); + + $('#lists_'+that.index).scroll(function(){ + if ($(this).scrollTop() + $('body').height() >= $('#container_'+that.index).height()-60) { + console.log($(this).scrollTop()); + console.log('
                        '); + console.log($('body').height()); + console.log('
                        '); + console.log($('#container_'+that.index).height()); + // 滚动到页面底部时加载更多数据 + if (that.total < that.count && that.loaded == 0){ + that.ajax(); + } + } + }); + that.ajax(); + }; + + LoadData.prototype.ajax = function () { + var that = this; + var elem = $('#container_'+that.index); + var container = elem.parent(); + //console.log(container.html()); + // 发送请求获取数据 + $.ajax({ + url: that.config.url + '?page=' + that.page + '&limit=' + that.config.limit, + type: 'GET', + data: that.config.where, + beforeSend: function () { + // 显示加载按钮 + that.loaded = 1; + container.find('.load-data-loading').show(); + container.find('.load-data-end').hide(); + }, + success: function (res) { + that.count=res.count; + that.total+=res.data.length; + container.find('.load-data-none').attr('class','load-data-none load-data-'+that.count); + if(that.page==1){ + that.config.data.length=0; + elem.html(''); + } + if (res.count > 0) { + that.page++; + that.config.data.push(...res.data); + $.each(res.data, function (index, item) { + // 转义JSON对象中的字符串值,防止XSS + for (var key in item) { + if (typeof item[key] === 'string') { + item[key] = escapeHtml(item[key]); + } + } + // 创建列表项并添加到列表中 + var listItem = that.config.template(item,that.config.type); + elem.append(listItem); + }); + container.find('.load-data-end').show(); + } + else{ + that.config.data.length=0; + that.page=1; + } + }, + complete: function () { + that.loaded = 0; + container.find('.load-data-loading').hide(); + container.find('.load-data-end').show(); + } + }); + } + + //选择员工弹窗 + $('body').on('click','.picker-data',function () { + let that = $(this); + let types = that.data('types'); + let type = that.data('type'); + let where = that.data('where'); + if (typeof(type) == "undefined" || type == '') { + type = 1; + } + type = type == 2 ? 'checkbox' : 'radio'; + + if (typeof(types) == "undefined" || types == '') { + layer.msg('请设置【picker】的类型'); + return false; + } + + if (typeof(where) == "undefined" || where == '') { + map = {}; + } + else{ + map = JSON.parse(where); + } + let picker = new LoadData(); + picker.init({ + type:type, + where: map, + callback:function(selectData){ + let ids=[],titles=[]; + for ( var i = 0; i
                        '; + if(exts.includes(data.fileext)){ + fileshow='
                        '+data.name+'
                        '; + } + return `
                        + ${fileshow} +
                        +
                        ${data.name}
                        +
                        ${filesize},刚刚
                        +
                        +
                        +
                        `; + }, + ajaxUpload:null, + loaded:0 + }; + // 初始化 + var fileUpload = function (options) { + var timestamp = generateUniqueID(10); + var settings = $.extend({}, config, options); + //$.extend(true, that.config, options); + if(settings.onlyImage){ + settings.accept = "image/jpeg,image/png,image/bmp"; + } + var uploadBtn = $('#'+settings.uploadBtn),uploadBox = $('#'+settings.uploadBox),fileInput = 'fileInput_'+timestamp; + uploadBox.append(''); + + //点击上传 + uploadBtn.click(function() { + let newtimestamp = Date.now(); + $('#'+fileInput).replaceWith($('')); + if(settings.loaded == 0){ + $('#'+fileInput).click(); + } + }); + + //赋值到form表单 + function fileValue(){ + let file_array = []; + uploadBox.find('.mbui-file-div').each(function () { + let $id = $(this).data('id'); + file_array.push($id); + }); + uploadBox.find('[data-type="file"]').val(file_array.join(',')); + } + + //删除已上传 + uploadBox.on('click','.mbui-file-del',function() { + $(this).parent().remove(); + fileValue(); + }); + + //附件上传 + uploadBox.on('change','#'+fileInput,function() { + var fileInput = $(this)[0]; + var files = fileInput.files; + console.log(files); + //return false; + if (files) { + // 将文件列表转为数组 + const filesArray = Array.from(files); + // 使用递归方式逐个上传到服务器 + function uploadNextFile(index) { + if (index >= filesArray.length) { + settings.loaded = 0; + layer.closeAll(); + return; + } + const file = filesArray[index]; + const formData = new FormData(); + formData.append('file', file); + $.ajax({ + url: settings.url, + type: 'POST', + data: formData, + processData: false, + contentType: false, + beforeSend: function () { + // 显示加载按钮 + settings.loaded = 1; + layer.loading('文件上传中...'); + }, + complete:function(){ + uploadNextFile(index + 1); // 成功后上传下一个 + }, + success: function(res) { + if(res.code==0){ + if(typeof(settings.ajaxUpload) == "undefined" || settings.ajaxUpload==null){ + var listItem = settings.template(res.data); + console.log(index); + if(settings.more==false){ + uploadBox.find('.mbui-file-div').remove(); + } + uploadBox.append(listItem); + } + else{ + settings.ajaxUpload(res); + } + fileValue(); + } + }, + error: function(xhr, status, error) { + console.log('文件上传失败'); + console.log('错误信息:', error); + } + }); + } + // 开始上传第一个文件 + uploadNextFile(0); + } else { + console.log('请选择要上传的文件'); + } + }); + }; + + function copyCtrl(content) { + var save = function(e){ + e.clipboardData.setData('text/plain', content); + e.preventDefault(); + } + document.addEventListener('copy', save); + document.execCommand('copy'); + document.removeEventListener('copy',save); + if (content != '') { + layer.msg('复制成功'); + } + } + + function downloadFile(url, fileName) { + let link = document.createElement("a"); + link.href = url; + link.download = fileName; + link.click(); + layer.loading('文件下载中...'); + } + + function isWeChat() { + return /micromessenger/i.test(navigator.userAgent); + } + + //查看图片 + $('body').on('click','.mbui-file-icon',function(e) { + e.preventDefault(); + let img = $(this).find('img'); + let href = img.attr('src'); + if (href!=undefined && href!='') { + layer.photo(href); + } + else { + let url=window.location.origin + $(this).data('url'); + let name=$(this).data('name'); + if(isWeChat()){ + layer.open({ + type: 1, + title: '温馨提示', + content: '微信或企业微信不支持下载文件附件
                        请复制链接到手机浏览器下载查看', + btn: ['复制链接'], + yes:function(index){ + copyCtrl(url); + layer.close(index); + } + }); + } + else{ + downloadFile(url,name); + } + } + }); + // 导出fileUpload模块 + exports('fileupload', function (options) { + return new fileUpload(options); + }); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/fixedbar.js b/public/static/assets/mbui/module/fixedbar.js new file mode 100644 index 0000000..e22aabf --- /dev/null +++ b/public/static/assets/mbui/module/fixedbar.js @@ -0,0 +1,56 @@ +mbui.define([], function (exports) { + $('body').append('
                        \ +
                        \ + \ +
                        \ + \ +
                        '); + $('.fixed-bar-btn').click(function () { + $(this).toggleClass('active'); + return $('.fixed-bar-item').toggleClass('open'); + }); + $('.fixed-bar-item').on('click','a',function(e){ + e.preventDefault(); + let href=$(this).attr('href'); + location.replace(href); + }) + + var startX, startY, moveX, moveY; + var browserWidth = $(window).width(); + var browserHeight = $(window).height(); + var $button = $('.mbui-fixed-bar'); + + $button.on('touchstart', function(e){ + startX = e.touches[0].pageX - parseInt($button.css('left')); + startY = e.touches[0].pageY - parseInt($button.css('top')); + $button.on('touchmove', function(e){ + e.preventDefault(); + moveX = e.touches[0].pageX - startX; + moveY = e.touches[0].pageY - startY; + if(moveY>100 && moveY8 && moveX')); + } + } else { + $this.removeClass(settings.errorClass).addClass(settings.successClass); + } + }); + //校验radio是否选中 + formBox.find('[data-verify="radio"]').each(function () { + if (isValid == false) { + return false; + } + var $this = $(this),errMsg = '至少要有一个单选按钮被选中'; + if ($this.find('[type="radio"]').is(':checked')) { + console.log(errMsg); + } else { + errMsg = $this.data('errortips') || errMsg; + isValid = false; + } + if (!isValid) { + layer.error(errMsg); + } + }); + formBox.find('[data-verify="checkbox"]').each(function () { + if (isValid == false) { + return false; + } + var $this = $(this),errMsg = '至少要有一个多选按钮被选中'; + if ($this.find('[type="checkbox"]').is(':checked')) { + console.log(errMsg); + } else { + errMsg = $this.data('errortips') || errMsg; + isValid = false; + } + if (!isValid) { + layer.error(errMsg); + } + }); + if (isValid) { + // 如果所有验证都通过,则提交表单 + settings.submit(form.getValue(settings.target)); + } + }); + }; + + // 取值 + form.getValue = function (itemForm) { + var nameIndex = {} // 数组 name 索引 + , field = {} + , fieldElem = $(itemForm).find('input,select,textarea') // 获取所有表单域 + + $.each(fieldElem, function (_, item) { + var othis = $(this), init_name; // 初始 name + + item.name = (item.name || '').replace(/^\s*|\s*&/, ''); + if (!item.name) return; + + // 用于支持数组 name + if (/^.*\[\]$/.test(item.name)) { + var key = item.name.match(/^(.*)\[\]$/g)[0]; + nameIndex[key] = nameIndex[key] | 0; + init_name = item.name.replace(/^(.*)\[\]$/, '$1[' + (nameIndex[key]++) + ']'); + } + // 复选框和单选框未选中,不记录字段 + if (/^(checkbox|radio)$/.test(item.type) && !item.checked) return; + field[init_name || item.name] = item.value; + }); + return field; + }; + // 输出接口 + exports('form', form); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/layer.js b/public/static/assets/mbui/module/layer.js new file mode 100644 index 0000000..c6842c2 --- /dev/null +++ b/public/static/assets/mbui/module/layer.js @@ -0,0 +1,331 @@ +mbui.define([], function (exports) { + var doc = document, query = 'querySelectorAll', claname = 'getElementsByClassName', S = function (s) { + return doc[query](s); + }; + + var template = { + warning: function (text) { + //警告提示 + return `
                        + ${text} +
                        `; + }, + error: function (text) { + //失败提示 + return `
                        + ${text} +
                        `; + }, + toast: function (text) { + //轻提示 + return `
                        +
                        +
                        +
                        + ${text} +
                        +
                        +
                        `; + }, + loading: function (text) { + //轻提示 + return `
                        +
                        +
                        +
                        + +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                        +
                        + ${text} +
                        +
                        +
                        +
                        `; + }, + success: function (text) { + //轻提示 + return `
                        +
                        +
                        +
                        + ${text} +
                        +
                        +
                        `; + } + } + + //默认配置 + var config = { + type: 1, + shade: true, + shadeClose: false, + fixed: true + }; + + var ready = { + extend: function (obj) { + var newobj = JSON.parse(JSON.stringify(config)); + for (var i in obj) { + newobj[i] = obj[i]; + } + return newobj; + }, + timer: {}, end: {} + }; + + //点触事件 + ready.touch = function (elem, fn) { + elem.addEventListener('click', function (e) { + fn.call(this, e); + }, false); + }; + + var index = 0, classs = ['mbui-layer'], Layer = function (options) { + var that = this; + that.config = ready.extend(options); + that.view(); + }; + + Layer.prototype.view = function () { + var that = this, config = that.config, layerbox = doc.createElement('div'); + + that.id = layerbox.id = classs[0] + index; + layerbox.setAttribute('class', classs[0] + ' ' + classs[0] + (config.type || 0)); + layerbox.setAttribute('index', index); + + //标题区域 + var title = (function () { + var titype = typeof config.title === 'object'; + return config.title + ? '' : ''; + }()); + + //按钮区域 + var button = (function () { + typeof config.btn === 'string' && (config.btn = [config.btn]); + var btns = (config.btn || []).length, btndom; + if (btns === 0 || !config.btn) { + return ''; + } + btndom = '' + if (btns === 2) { + btndom = '' + config.btn[1] + ''; + } + return ''; + }()); + + if (!config.fixed) { + config.top = config.hasOwnProperty('top') ? config.top : 100; + config.style = config.style || ''; + config.style += ' top:' + (doc.body.scrollTop + config.top) + 'px'; + } + + if (config.type === 0) { + config.shade = false; + let content = template[config.template]; + layerbox.innerHTML = content(config.content); + } + + if (config.type === 2) { + config.content = '
                        '; + } + + if (config.type === 3) { + config.className = 'modal-view top'; + config.content = '
                        '; + } + + if (config.type === 4) { + config.className = 'modal-actionsheet bottom'; + } + + if (config.type === 5) { + config.className = 'modal-view top'; + } + + if (config.type > 0) { + layerbox.innerHTML = (config.shade ? '
                        ' : '') + + '
                        ' + + '' + + '
                        '; + } + + document.body.appendChild(layerbox); + var elem = that.elem = S('#' + that.id)[0]; + config.success && config.success(elem,index); + that.index = index++; + that.action(config, elem); + }; + + Layer.prototype.action = function (config, elem) { + var that = this; + //自动关闭 + if (config.time && config.time > 0) { + ready.timer[that.index] = setTimeout(function () { + layer.close(that.index); + }, config.time * 1000); + } + + //确认取消 + var btn = function () { + var type = this.getAttribute('types'); + if (type == 0) { + config.no && config.no(); + layer.close(that.index); + } else { + config.yes ? config.yes(that.index) : layer.close(that.index); + } + }; + + if (config.btn) { + var btns = elem[claname]('modal-footer')[0].children, btnlen = btns.length; + for (var ii = 0; ii < btnlen; ii++) { + ready.touch(btns[ii], btn); + } + } + + //点遮罩关闭 + if (config.shade && config.shadeClose) { + var shade = elem[claname]('mbui-layershade')[0]; + ready.touch(shade, function () { + layer.close(that.index, config.end); + }); + } + config.end && (ready.end[that.index] = config.end); + }; + + var layer = { + v: '1.0', + index: index, + //核心方法 + open: function (options) { + var o = new Layer(options || {}); + return o.index; + }, + alert: function (txt) { + layer.open({ + type: 1, + title: '提示', + content: txt, + btn: ['确定'] + }); + }, + confirm: function (txt, fun) { + layer.open({ + type: 1, + title: '温馨提示', + content: txt, + btn: ['确定', '取消'], + yes: function (index) { + fun ? fun(index) : layer.close(index); + } + }); + }, + prompt: function (title,fun,txt) { + layer.open({ + type: 2, + title: title, + content: txt, + btn: ['确定', '取消'], + yes: function (index) { + let val = $('#prompt' + index).val(); + fun ? fun(val,index) : layer.close(index); + } + }); + }, + textarea: function (title,fun,txt) { + layer.open({ + type: 3, + title: title, + content: txt, + btn: ['确定', '取消'], + yes: function (index) { + let val = $('#textarea' + index).val(); + fun ? fun(val,index) : layer.close(index); + } + }); + }, + msg: function (txt = '', time = 3, template = 'toast') { + let msg = layer.open({ + type: 0, + content: txt, + template: template, + time: time + }); + return msg; + }, + success: function (txt) { + layer.msg(txt, 3, 'success'); + }, + warning: function (txt) { + layer.msg(txt, 3, 'warning'); + }, + error: function (txt) { + layer.msg(txt, 3, 'error'); + }, + loading: function (txt) { + let loading = layer.msg(txt, 3, 'loading'); + return loading; + }, + photo: function (url) { + var $image = $('
                        '); + $('body').append($image); + $image.fadeIn(); + $image.click(function () { + $(this).fadeOut(function () { + $(this).remove(); + }); + }); + }, + close: function (index) { + var ibox = S('#' + classs[0] + index)[0]; + if (!ibox) return; + ibox.innerHTML = ''; + doc.body.removeChild(ibox); + clearTimeout(ready.timer[index]); + delete ready.timer[index]; + typeof ready.end[index] === 'function' && ready.end[index](); + delete ready.end[index]; + }, + //关闭所有layer层 + closeAll: function () { + var boxs = doc[claname](classs[0]); + for (var i = 0, len = boxs.length; i < len; i++) { + layer.close((boxs[0].getAttribute('index') | 0)); + } + }, + copy:function(content) { + var save = function(e){ + e.clipboardData.setData('text/plain', content); + e.preventDefault(); + } + document.addEventListener('copy', save); + document.execCommand('copy'); + document.removeEventListener('copy',save); + if (content != '') { + layer.msg('复制成功'); + } + } + }; + // 输出接口 + exports('layer', layer); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/loadData.js b/public/static/assets/mbui/module/loadData.js new file mode 100644 index 0000000..bf270fb --- /dev/null +++ b/public/static/assets/mbui/module/loadData.js @@ -0,0 +1,161 @@ +mbui.define(['tool'], function (exports) { + let tool = mbui.tool; + //html转义,防止XSS + function escapeHtml(text) { + var map = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + return text.replace(/[&<>"']/g, function(m) { return map[m]; }); + } + + var LoadData = function () { + this.config = { + elem: "#listBox", + seachBar: "#listSearch", + url: "", + where: {}, + limit: 10, + scroll: 1, + template: function (data) { + return JSON.parse(data); + } + }; + this.loaded = 0; + this.page = 1; + this.count = 0; + this.total = 0; + }; + // 初始化 + LoadData.prototype.init = function (options) { + var that = this; + $.extend(true, that.config, options); + var elem = $(that.config.elem); + elem.html('

                        暂无数据
                        努力加载中
                        —————— 底 ● 线 ——————
                        '); + + if(that.config.scroll==2){ + //容器监听滚动事件 + $('#root').scroll(function(){ + if ($(this).scrollTop() + $('#root').height() >= $('#app').height()-10) { + // 滚动到页面底部时加载更多数据 + if (that.total < that.count && that.loaded == 0){ + that.ajax(); + } + } + }); + } + else{ + // 页面监听滚动事件 + $(window).scroll(function () { + if ($(window).scrollTop() + $(window).height() >= $(document).height()-10) { + // 滚动到页面底部时加载更多数据 + if (that.total < that.count && that.loaded == 0){ + that.ajax(); + } + } + }); + } + //回车搜索 + $(that.config.seachBar).on('keyup','[type="search"]',function(event){ + if (event.keyCode === 13) { + $(this).blur(); + that.page=1; + that.ajax(); + } + }) + //清空时 + $(that.config.seachBar).on('input','[type="search"]', function() { + var val = $(this).val(); + // 如果值为空,说明可能点击了 X 或者手动删除了 + if (val === '') { + $(this).blur(); + that.page=1; + that.ajax(); + } + }); + //点击搜索重置按钮 + $(that.config.seachBar).on('click','.search-reset',function(){ + $(that.config.seachBar).find('input').val(''); + that.page=1; + that.ajax(); + }) + that.ajax(); + }; + + LoadData.prototype.reload = function () { + var that = this; + that.page=1; + that.ajax(); + }; + + LoadData.prototype.ajax = function () { + var that = this; + var elem = $(that.config.elem),seachBar = $(that.config.seachBar),map = {page:that.page,limit:that.config.limit}; + var keys = seachBar.find('.search-key'); + keys.each(function(){ + let key=$(this).attr('name'); + let val=$(this).val(); + if(val!=''){ + map[key]=val; + } + }); + var maps = $.extend({}, that.config.where, map); + // 发送请求获取数据 + $.ajax({ + url: that.config.url, + type: 'GET', + data: maps, + beforeSend: function () { + // 显示加载按钮 + that.loaded = 1; + elem.find('.load-data-loading').show(); + elem.find('.load-data-end').hide(); + }, + success: function (res) { + if(res.count === 'undefined'){ + that.count=res.data.length; + that.total=res.data.length; + } + else{ + that.count=res.count; + that.total+=res.data.length; + } + if(that.page==1){ + elem.find('.load-data-container').html(''); + } + if(that.count>=that.total && that.count>0){ + elem.find('.load-data-end').show(); + } + elem.find('.load-data-none').addClass('load-data-'+that.count); + if (res.data.length > 0) { + that.page++; + $.each(res.data, function (index, item) { + // 转义JSON对象中的字符串值,防止XSS + for (var key in item) { + if (typeof item[key] === 'string') { + item[key] = escapeHtml(item[key]); + } + } + // 创建列表项并添加到列表中 + var listItem = that.config.template(item); + elem.find('.load-data-container').append(listItem); + }); + } + }, + complete: function () { + that.loaded = 0; + elem.find('.load-data-loading').hide(); + } + }); + } + + // 导出loadData模块 + exports('loadData', function (options) { + var loadData = new LoadData(); + loadData.init(options); + return loadData; + }); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/oaCheck.js b/public/static/assets/mbui/module/oaCheck.js new file mode 100644 index 0000000..2f42284 --- /dev/null +++ b/public/static/assets/mbui/module/oaCheck.js @@ -0,0 +1,655 @@ +mbui.define(['form','layer','userPicker','fileupload'], function (exports) { + const layer = mbui.layer; + const form = mbui.form; + const tool = mbui.tool; + const fileupload = mbui.fileupload; + const opts={ + "checkBox":"checkBox",//审核容器id + "check_name": "",//审核类型标识 + "check_btn":1,//是否显示提交审核按钮 + "checking_btn":'',//待审核状态下添加的按钮 + "checked_btn":'',//审核通过后添加的按钮 + "check_ok":function(){ + //审核通过的执行函数 + }, + "check_no":function(){ + //审核拒绝的执行函数 + }, + "check_back":function(){ + //撤回的执行函数 + }, + "check_reversed":function(){ + //反确认的执行函数 + } + }; + const obj = { + loading:false, + checkStatus: function (status) { + statusArray = ['待提交审批','审批中','审批通过','审批不通过','已撤回']; + return ''+statusArray[status]+''; + }, + statusTemplate: function (status) { + let me = this; + let tem =` +
                        +
                        审批状态
                        +
                        + ${me.checkStatus(status)} +
                        +
                        + `; + return tem; + }, + uidsTemplate: function () { + let tem =` +
                        + + +
                        + `; + return tem; + }, + flowTemplate: function (data) { + let flowtype=''; + if(data && data.length>0){ + for(let i=0;i'+data[i].title+''; + } + } + let tem =` +
                        + +
                        + +
                        +
                        + `; + return tem; + }, + copyTemplate: function (detail) { + let me = this; + let tem =` +
                        + + + +
                        + `; + return tem; + }, + btnTemplate: function () { + let me = this; + let tem =` +
                        + + + ${me.sets.checking_btn} +
                        + `; + if(me.sets.check_btn == 1){ + return tem; + }else{ + return ''; + } + }, + recordTemplate: function (record) { + let me = this; + let tem =''; + if(record.length>0){ + tem+='
                        '; + tem+='
                        审批记录
                        '; + tem+='
                        '; + for(let l=0;l。'; + } + tem+='
                        '+record[l].check_time_str+''+record[l].name+'『'+record[l].status_str+'』了此申请。'+check_content+''; + + let file_array= record[l].file_array; + if(file_array.length>0){ + tem+='
                        审批附件
                        '; + for(let f=0;f +
                        审批操作
                        +
                        + ${me.flowTemplate(flow)} +
                        ${me.uidsTemplate()}
                        + ${me.copyTemplate(flow[0])} +
                        + + `; + return checkHtml; + }, + //审批待提交模版 + initTemplate: function (detail) { + let me = this; + let checkHtml = ` +
                        +
                        审批操作
                        +
                        + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} + ${me.flowTemplate(detail.flow)} +
                        ${me.uidsTemplate()}
                        + ${me.copyTemplate(detail)} +
                        + ${me.btnTemplate()} +
                        + `; + let viewHtml = ` +
                        +
                        审批操作
                        +
                        + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} +
                        +
                        + `; + if(detail.is_creater==1){ + return checkHtml; + } + else{ + return viewHtml; + } + }, + //审批中模版 + checkTemplate: function (detail) { + let me = this,flowHtml='',list = detail.nodes; + for(var f=0;f1){ + check_types= ' 会签'; + if(list[f].check_types==2){ + check_types= ' 或签'; + } + } + } + if(list[f].check_role == 0 || list[f].check_role == 5){ + checkUser=list[f].check_uids_info[0].name; + } + if(list[f].check_role == 1 || list[f].check_role == 2 || list[f].check_role == 3 || list[f].check_role == 4){ + checkUser=list[f].flow_name; + } + if(list[f].check_list.length>0){ + let one=0,two=0,three=0; + for(var m=0;m 0){ + iconStatus =''; + strStatus ='
                        拒绝
                        '; + } + else{ + if(one > 0){ + iconStatus =''; + strStatus ='
                        待审批
                        '; + } + else{ + iconStatus =''; + strStatus ='
                        通过
                        '; + } + } + } + //或签 + if(list[f].check_types==2){ + if(two > 0){ + iconStatus =''; + strStatus ='
                        通过
                        '; + } + else{ + iconStatus =''; + strStatus ='
                        拒绝
                        '; + } + } + } + flowHtml+= '
                        '+iconStatus+'
                        '+check_types+checkUser+'
                        '+strStatus+iconRight+'
                        '; + } + + let checkCopy=`
                        +
                        抄 送 人
                        +
                        + ${detail.copy_unames} +
                        +
                        + `; + + let checkNode = ` +
                        + +
                        + + +
                        +
                        + + `; + + let checkContent = ` +
                        + + +
                        +
                        + +
                        +
                        +
                        +
                        + +
                        +
                        + `; + + let btnCheck=' 通过 拒绝'; + + if(detail.step.check_role==5){ + btnCheck=' 通过 退回'; + } + + let btnBack=' 撤回'; + let btnCheckBack='反确认审核'; + + let checkHtml = ` +
                        +
                        审批操作
                        +
                        +
                        审批状态
                        +
                        + ${me.checkStatus(detail.check_status)} +
                        +
                        +
                        +
                        当前审批人
                        +
                        + ${detail.check_unames} +
                        +
                        + ${checkCopy} +
                        +
                        + 审批流 +
                        +
                        +
                        +
                        + +
                        ${detail.admin_name}
                        +
                        创建
                        + +
                        + ${flowHtml} +
                        +
                        + ${me.recordTemplate(detail.check_record)} + ${detail.is_checker==1 && detail.step.check_role==0?checkNode:''} + ${detail.is_checker==1?checkContent:''} +
                        +
                        + + ${detail.is_checker==1?btnCheck:''} + ${detail.is_creater==1 && detail.is_back==1 && (detail.check_status==1 || detail.check_status==3)?btnBack:''} + ${detail.is_reversed == 1 && typeof me.sets.check_reversed ==='function' && detail.check_status==2?btnCheckBack:''} + ${detail.check_status==2?me.sets.checked_btn:''} +
                        +
                        + `; + return checkHtml; + }, + //审批撤回模版 + backTemplate: function (detail) { + let me = this; + let btnHtml =''; + if(me.sets.check_btn == 1){ + btnHtml ='
                        '; + } + let checkHtml = ` +
                        +
                        审批操作
                        +
                        + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} + ${me.flowTemplate(detail.flow)} +
                        ${me.uidsTemplate()}
                        + ${me.copyTemplate(detail)} +
                        + ${me.btnTemplate()} +
                        + `; + let viewHtml = ` +
                        +
                        审批操作
                        +
                        + ${me.statusTemplate(detail.check_status)} + ${me.recordTemplate(detail.check_record)} +
                        +
                        + `; + if(detail.is_creater==1){ + return checkHtml; + } + else{ + return viewHtml; + } + }, + submit:function(data,callback){ + tool.post("/api/check/submit_check", data, callback); + }, + init: function (options) { + this.sets = $.extend({}, opts, options); + let me = this; + let checkBox = $('#'+me.sets.checkBox); + let action_id = checkBox.data('id'); + let check_status = checkBox.data('status'); + let check_flow_id = checkBox.data('checkflowid'); + if(action_id === undefined || check_status === undefined || check_flow_id === undefined){ + return false; + } + //获取审批信息 + $.ajax({ + url: "/api/check/get_flow_nodes", + type:'get', + data:{check_name:me.sets.check_name,action_id:action_id,flow_id:check_flow_id}, + success: function (e) { + if (e.code == 0) { + if(check_status==0){ + if(action_id==0){ + if(e.data.length>0){ + checkBox.append(me.createTemplate(e.data)); + } + else{ + let none = '
                        审批操作
                        \ + \ + \ +
                        '; + checkBox.append(none); + } + } + else{ + checkBox.append(me.initTemplate(e.data)); + } + } + else if(check_status==4){ + checkBox.append(me.backTemplate(e.data)); + } + else{ + checkBox.append(me.checkTemplate(e.data)); + //附件上传 + fileupload({ + uploadBtn: "uploadBtnCheck", + uploadBox: "uploadBoxCheck" + }); + } + //提交审批 + form({ + target: '#formCheckBox', + submit:function(data){ + let callback = function (e) { + layer.msg(e.msg); + if (e.code == 0) { + tool.reload(2000); + } + } + data.action_id = action_id; + data.check_name = me.sets.check_name; + tool.post("/api/check/submit_check", data, callback); + return false; + } + }); + } + } + }) + + $('body').on('change','input[name="check_node"]',function() { + var val = this.value; + if(val==2){ + $('.next-admin').show(); + } + else{ + $('.next-admin').hide(); + } + }); + //选择审批流 + $('body').on('change','select[name="flow_id"]', function(data){ + var check_type = $('select[name="flow_id"] option:selected').attr('title'); + var selectedValue = $(this).val(); + if(selectedValue==''){ + $('#checkTR').html(me.uidsTemplate()); + checkBox.find('[name="check_copy_unames"]').val(''); + checkBox.find('[name="check_copy_uids"]').val(''); + return false; + } + if(check_type == 1){ + $('#checkTR').html(me.uidsTemplate()); + checkBox.find('[name="check_uames"]').addClass('picker-admin'); + checkBox.find('[name="check_copy_unames"]').addClass('picker-admin'); + } + $.ajax({ + url: "/api/check/get_flow_users", + type:'get', + data:{id:selectedValue}, + success: function (e) { + if (e.code == 0) { + var flow_li='',flow_idx=0; + var flow_data = e.data.flow_data; + checkBox.find('[name="check_copy_unames"]').addClass('picker-admin'); + if(e.data.copy_uids && e.data.copy_uids !=''){ + checkBox.find('[name="check_copy_unames"]').val(e.data.copy_unames); + checkBox.find('[name="check_copy_uids"]').val(e.data.copy_uids.split(',')); + } + if(check_type == 2 || check_type == 3){ + for(var a=0;a0){ + flow_idx++; + for(var b=0;b'+check_uids_info[b].name+''; + } + flow_li+='
                        第'+flow_idx+'级审批『'+check_role+'』'+check_types+''+user_li+'
                        '; + } + } + if(flow_li==''){ + flow_li='审批流程错误,请联系管理员设置'; + } + formHtml = '
                        \ + \ +
                          '+flow_li+'
                        \ +
                        '; + $('#checkTR').html(formHtml); + } + } + } + }) + }); + + //审批操作按钮 + checkBox.on('click','.btn-check', function(data){ + let content=checkBox.find('[name="content"]').val(); + let check_status=$(this).data('status'); + let check_role = checkBox.find('input[name="check_role"]').val(); + + let check_node=0,check_uids='',check_files=''; + if(check_role == 0 && check_status==1){ + check_node = checkBox.find('input[name="check_node"]:checked').val(); + check_uids = checkBox.find('input[name="check_uids"]').val(); + if(!check_node){ + layer.msg('请选择下一审批节点'); + return false; + } + if(check_node == 2 && check_uids==''){ + layer.msg('请选择下一审批人'); + return false; + } + } + if(check_status ==1 || check_status==2){ + check_files = checkBox.find('input[name="check_files"]').val(); + let confirmTips='确定通过该审批?'; + if(check_status==2){ + confirmTips='确定拒绝该审批?'; + if(content==''){ + layer.msg('请输入审批意见'); + return false; + } + } + layer.confirm(confirmTips, function(index){ + $.ajax({ + url: "/api/check/flow_check", + type:'post', + data:{ + action_id:action_id, + check_name:me.sets.check_name, + check_flow_id:check_flow_id, + check_node:check_node, + check_uids:check_uids, + check:check_status, + check_files:check_files, + content:content + }, + success: function (e) { + layer.msg(e.msg); + if (e.code == 0) { + if(e.data.check_status==2 && typeof me.sets.check_ok ==='function'){ + me.sets.check_ok(e); + } + if(e.data.check_status==3 && typeof me.sets.check_no ==='function'){ + me.sets.check_no(e); + } + tool.reload(1000); + } + } + }) + layer.close(index); + }); + } + else if(check_status ==3){ + layer.prompt('请输入撤回理由', function(val, index){ + if(val==''){ + layer.msg('请输入撤回理由'); + return false; + } + $.ajax({ + url: "/api/check/flow_check", + type:'post', + data:{ + action_id:action_id, + check_name:me.sets.check_name, + check_flow_id:check_flow_id, + check:check_status, + content:val + }, + success: function (e) { + layer.msg(e.msg); + if (e.code == 0) { + if(e.data.check_status==4 && typeof me.sets.check_back ==='function'){ + me.sets.check_back(e); + } + tool.reload(1000); + } + } + }) + layer.close(index); + }); + } + else if(check_status ==4){ + layer.prompt('请输入反确认理由', function(val, index){ + if(val==''){ + layer.msg('请输入反确认理由'); + return false; + } + $.ajax({ + url: "/api/check/flow_check", + type:'post', + data:{ + action_id:action_id, + check_name:me.sets.check_name, + check_flow_id:check_flow_id, + check:check_status, + content:val + }, + success: function (e) { + layer.msg(e.msg); + if (e.code == 0) { + if(e.data.check_status==0 && typeof me.sets.check_reversed ==='function'){ + me.sets.check_reversed(e); + } + tool.reload(1000); + } + } + }) + layer.close(index); + }); + } + return false; + }); + + } + }; + exports('oaCheck', obj); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/oaComment.js b/public/static/assets/mbui/module/oaComment.js new file mode 100644 index 0000000..d97399a --- /dev/null +++ b/public/static/assets/mbui/module/oaComment.js @@ -0,0 +1,121 @@ +mbui.define(['tool','layer','userPicker','loadData'], function (exports) { + const layer = mbui.layer, tool = mbui.tool,userPicker = mbui.userPicker,loadData = mbui.loadData; + const obj = { + comment_box:'comment_box', + module:'module', + topic_id:'topic_id', + load: function (comment_box,module,topic_id) { + let that = this; + that.comment_box=comment_box; + that.module=module; + that.topic_id=topic_id; + loadData({ + url:'/api/comment/datalist', + elem:'#'+comment_box, + where: {topic_id: topic_id, module: module}, + limit:100, + template:function(data){ + let to_names = '', ops = '' ,ptext=''; + if (data.to_names !='') { + to_names = `@${data.to_names}`; + } + if (data.admin_id == login_admin) { + ops = `编辑删除`; + } + else{ + ops = `回复`; + } + if(data.pid>0){ + ptext=`
                        回复『${data.padmin}』${data.ptimes}的评论${data.pcontent}
                        `; + } + + let listItem = ` +
                        +
                        + +
                        +
                        +
                        + ${data.name}${data.create_times}${data.update_times} +
                        +
                        ${to_names} ${data.content}
                        + ${ptext} +
                        ${ops}
                        +
                        +
                        + `; + return listItem; + } + }); + }, + add: function (topic_id, module,content,to_uids,pid) { + let that = this; + let callback = function (res) { + layer.closeAll(); + that.load(that.comment_box,that.module,that.topic_id); + } + if (content == '') { + layer.msg('请完善评论内容'); + return false; + } + let postData = { module: module,topic_id: topic_id, content: content, to_uids: to_uids, pid: pid}; + tool.post("/api/comment/add", postData, callback); + }, + edit: function (id,content) { + let that = this; + let callback = function (res) { + layer.closeAll(); + that.load(that.comment_box,that.module,that.topic_id); + } + if (content == '') { + layer.msg('请完善评论内容'); + return false; + } + let postData = {id: id, content: content}; + tool.post("/api/comment/add", postData, callback); + }, + del: function (id) { + let that = this; + layer.confirm('确定删除该评论吗?', function (index) { + let callback = function (e) { + layer.msg(e.msg); + if (e.code == 0) { + that.load(that.comment_box,that.module,that.topic_id); + } + } + tool.delete("/api/comment/del", { id: id }, callback); + layer.close(index); + }); + }, + //文本 + textarea: function (id, topic_id, module, content, to_uids, to_unames, pid) { + let that = this; + let usersInput=''; + if(id==0){ + usersInput='
                        '; + } + + layer.open({ + type:5, + title: '请输入评论内容', + content: '
                        '+usersInput+'
                        ', + btn:['确定','取消'], + yes:function(index){ + let content = $("#editTextarea").val(); + if (content != '') { + if(id>0){ + that.edit(id, content); + } + else{ + let to_uids = $("#to_uids").val(); + that.add(topic_id, module, content, to_uids, pid); + } + } else { + layer.msg('请输入评论内容'); + } + } + }); + } + }; + exports('oaComment', obj); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/oaEdit.js b/public/static/assets/mbui/module/oaEdit.js new file mode 100644 index 0000000..20178fa --- /dev/null +++ b/public/static/assets/mbui/module/oaEdit.js @@ -0,0 +1,403 @@ +mbui.define(['tool','layer','picker','userPicker'],function(exports){ + let layer = mbui.layer,tool=mbui.tool,picker = mbui.picker,adminpicker = mbui.userPicker; + const opts={ + "box":'editBox',//编辑容器id + "id":0,//编辑容器id + "url": '', + "radio":{}, + "checbox":{}, + "menu":{}, + "callback":function(e){ + layer.msg(e.msg); + if(e.code==0){ + setTimeout(function(){ + location.reload(); + },1000) + } + } + }; + + const obj = { + //短文本 + text: function (that) { + let me = this; + let field = that.data('field'); + let text = that.data('text'); + text = typeof(text) == "undefined" ? that.text():text; + + layer.open({ + type: 1, + title: '请输入内容', + area: ['360px', '158px'], + content: '
                        ', + btnAlign: 'c', + btn: ['保存','取消'], + yes: function () { + let val = $("#oaEditText").val(); + if (val != '') { + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } else { + layer.msg('请输入内容'); + } + } + }) + }, + //长文本 + textarea: function (that) { + let me = this; + let field = that.data('field'); + let target = that.data('target'); + let textarea=''; + if (typeof(target) == "undefined") { + textarea = that.text(); + } + else{ + textarea = $('#'+target).text(); + } + layer.open({ + type: 1, + title: '请输入内容', + area: ['600px', '320px'], + content: '
                        ', + btnAlign: 'c', + btn: ['保存','取消'], + yes: function () { + let val = $("#oaEditTextarea").val(); + if (val != '') { + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } else { + layer.msg('请输入内容'); + } + } + }) + }, + //数字 + num: function (that) { + let me = this; + let field = that.data('field'); + let text = that.data('text'); + text = typeof(text) == "undefined" ? that.text():text; + + let min = that.data('min'); + min = typeof(min) == "undefined" ? 0:min; + + let max = that.data('max'); + max = typeof(max) == "undefined" ? 100:max; + + layer.open({ + type: 1, + title: '请输入数字', + area: ['200px', '158px'], + content: '
                        ', + btnAlign: 'c', + btn: ['保存','取消'], + yes: function () { + let val = $("#oaEditNum").val(); + if (val != '') { + if(min !='' && valmax){ + layer.msg('输入数字不能大于'+max); + return false; + } + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } else { + layer.msg('请输入内容'); + } + } + }) + }, + oadate: function (that) { + let me = this; + let type = that.data('type'); + let min = that.data('min'); + let max = that.data('max'); + if (typeof(type) == "undefined" || type === '') { + type = 'date'; + } + if (typeof(min) == "undefined" || min === '' || min === 1) { + min = '1970-01-01 00:00:00'; + } + if (typeof(max) == "undefined" || max === '' || max === 100) { + max = '2099-12-31 23:59:59'; + } + let field = that.data('field'); + let text = that.data('text'); + text = typeof(text) == "undefined" ? that.text():text; + + picker.init({ + elem: that, // 绑定元素 + options: type, // 设置为日期选择器(日期选择器可设置:year、month、date、time、timesecond、datetime、datetimesecond) + onSuccess: function(index, elem){ // 渲染成功回调 + picker.show(index); + }, + onClear: function(index){ // 停止滚动触发:index是当前对象的标识, i 是当前滑动的对象,result是前面的值集 + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = 0; + tool.post(me.sets.url,postData,me.sets.callback); + picker.remove(index); + }, + onConfirm: function(index, val, result){ // 点击确认回调 + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + picker.remove(index); + }, + onCancel: function(index){ // 点击取消回调 + picker.remove(index); + }, + onShade: function(index){ // 点击遮罩回调 + picker.remove(index); + }, + minDate:min, + maxDate:max + }) + }, + adminpicker: function (that){ + let me = this; + let field = that.data('field'); + let ids = that.data('ids'); + let names = that.data('names'); + let min = that.data('min'); + min = typeof(min) == "undefined" ? 1:min; + + adminpicker({ + type:min, + callback:function(ids,names,dids,departments){ + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = ids.join(','); + tool.post(me.sets.url,postData,me.sets.callback); + } + }); + }, + picker:function(that){ + let me = this; + let field = that.data('field'); + let api = that.data('api'); + if(typeof(api) == "undefined"){ + layer.msg('相关API参数未完善'); + return false; + } + let min = that.data('min'); + min = typeof(min) == "undefined" ? 1:min; + let loading; + $.ajax({ + url: api, + type: 'get', + beforeSend:function(){ + loading = layer.loading('加载中...'); + }, + success: function (e) { + if (e.code == 0) { + data = e.data; + if(min==1){ + me.radio(that,data); + } + else{ + me.checkbox(that,data); + } + } + }, + complete:function(){ + layer.close(loading); + } + }) + }, + radio:function(that,data){ + let me = this; + let field = that.data('field'); + let text = that.data('text'); + text = typeof(text) == "undefined" ? that.text():text; + + let arrayidx = that.data('array'); + if(typeof(arrayidx) != "undefined" && arrayidx!=''){ + data = me.sets.radio[arrayidx]; + } + if (data.length == 0) { + layer.msg('无可选择的内容'); + return false; + } + let len = data.length; + let editHtml = '
                        ' + while (len--) { + if (data[len].id == text) { + editHtml+='
                        '; + } + else{ + editHtml+='
                        '; + } + } + editHtml+='
                        '; + layer.open({ + type:5, + content:editHtml, + btn:['确定','取消'], + yes:function(index){ + let val = $('input[name="layer_radio"]:checked').val(); + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = val; + tool.post(me.sets.url,postData,me.sets.callback); + } + }); + }, + checkbox:function(that){ + let me = this; + let field = that.data('field'); + let text = that.data('text'); + text = typeof(text) == "undefined" ? that.text():text; + + let selected_array = text+''.split(','); + let arrayidx = that.data('array'); + let data = me.sets.checkbox[arrayidx]; + if (data.length == 0) { + layer.msg('无可选择的内容'); + return false; + } + let len = data.length; + let editHtml = '
                        ' + while (len--) { + if (selected_array.includes(data[len].id)) { + editHtml+='
                        '; + } + else{ + editHtml+='
                        '; + } + } + editHtml+='
                        '; + layer.open({ + type:5, + content:editHtml, + btn:['确定','取消'], + yes:function(index){ + let checkedValues = $('input[name="layer_checkbox"]:checked').map(function(){ + return $(this).val(); + }).get(); + let postData = {'id':me.sets.id,'scene':'oaedit'}; + postData[field] = checkedValues.join(','); + tool.post(me.sets.url,postData,me.sets.callback); + } + }); + }, + menu: function (that) { + let me = this; + let arrayidx = that.data('array'); + let data = me.sets.menu[arrayidx]; + if (data.length == 0) { + layer.msg('无可选择的内容'); + return false; + } + let len = data.length; + let editHtml = '' + while (len--) { + let item = $('#edit_'+data[len].field); + let types = item.data('types'); + let text = item.data('text'); + text = typeof(text) == "undefined" ? item.text():text; + + let arrays = item.data('array'); + arrays = typeof(arrays) == "undefined" ? '':arrays; + + let api = item.data('api'); + api = typeof(api) == "undefined" ? '':api; + + let min = item.data('min'); + min = typeof(min) == "undefined" ? 1:min; + + let max = item.data('max'); + max = typeof(max) == "undefined" ? 100:max; + + editHtml+=''+data[len].title+''; + } + layer.open({ + type:4, + content: editHtml, + btn:['取消'], + success:function(elem,index){ + $(elem).on('click','.actionsheet-btn',function(){ + let thatmenu = $(this); + let types = thatmenu.data('types'); + layer.close(index); + switch (types) { + case "num": + me.num(thatmenu); + break; + case "oadate": + me.oadate(thatmenu); + break; + case "textarea": + me.textarea(thatmenu); + break; + case "adminpicker": + me.adminpicker(thatmenu); + break; + case "picker": + me.picker(thatmenu); + break; + case "radio": + me.radio(thatmenu,[]); + break; + case "checkbox": + me.checkbox(thatmenu,[]); + break; + default: + me.text(thatmenu); + } + }) + } + }); + }, + init: function (options) { + this.sets = $.extend({}, opts, options); + let me = this; + let editBox = $('#'+me.sets.box); + editBox.on('click','.click-edit',function(){ + let that = $(this); + let types = that.data('types'); + let role = that.data('role'); + role = typeof(role) == "undefined" ? 1:role; + if(role==0){ + layer.msg('你无权限操作'); + return false; + } + switch (types) { + case "num": + me.num(that); + break; + case "oadate": + me.oadate(that); + break; + case "textarea": + me.textarea(that); + break; + case "adminpicker": + me.adminpicker(that); + break; + case "picker": + me.picker(that); + break; + case "radio": + me.radio(that,[]); + break; + case "checkbox": + me.checkbox(that,[]); + break; + case "menu": + me.menu(that); + break; + default: + me.text(that); + } + }) + } + } + //输出接口 + exports('oaEdit', obj); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/oaLog.js b/public/static/assets/mbui/module/oaLog.js new file mode 100644 index 0000000..928af03 --- /dev/null +++ b/public/static/assets/mbui/module/oaLog.js @@ -0,0 +1,47 @@ +layui.define(['tool'], function (exports) { + const tool = layui.tool; + const obj = { + load: function (box,name, action_id) { + let page=1; + let callback = function (res) { + if (res.code == 0 && res.data.length > 0) { + let itemLog = '',log_time=''; + $.each(res.data, function (index, item) { + let detail = ""; + if(log_time != item.create_time){ + if(log_time==''){ + itemLog+='
                        '+item.create_time+'
                        ' + } + else{ + itemLog+='
                        '+item.create_time+'
                        ' + } + log_time = item.create_time; + } + detail= ` + ${item.field_name}${item.old_content} ${item.action}为 ${item.new_content}${item.times} + `; + itemLog+= ` +
                        ${item.admin_name}${detail}
                        + `; + }); + itemLog+='
                        '; + if(res.data.length>19){ + itemLog+='
                        '; + } + $("#"+box).html(itemLog); + } + else{ + if(page ==1){ + $("#"+box).html('
                        暂无记录
                        '); + } + } + } + tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback); + $("#"+box).on('click','.log-more',function(){ + page++; + tool.get("/api/index/load_log", {name:name,action_id:action_id,page:page}, callback); + }); + } + }; + exports('oaLog', obj); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/picker.js b/public/static/assets/mbui/module/picker.js new file mode 100644 index 0000000..6b196e3 --- /dev/null +++ b/public/static/assets/mbui/module/picker.js @@ -0,0 +1,1189 @@ +mbui.define(['layer'], function (exports) { +var layer = mbui.layer; +var layPicker = { + index: 0, // 递增的index,作为元素的唯一标识 + indexList: [], // 每个index的集合 + offset: {}, // 每个ul元素的滚动位置 + liHeight: 50, // 每个li的高度 + selectList: {}, // 存储每个被选中的值,li下标 + textField: 'name', // 参数名称-内容 + valueField: 'value',// 参数名称-值 + fieldList: {}, // 参数名称集 + dataList: {}, // 数据集合 + tempSearchList: {}, // 临时存储搜索前的主数据 + minMaxData: {}, // 最小最大限制数据 + init: function(data){ + layPicker.index ++; + layPicker.indexList.push(layPicker.index); + var key = ''+layPicker.index; + // 参数名称替换 + layPicker.fieldList[key] = { + textField: data.textField || layPicker.textField, + valueField: data.valueField || layPicker.valueField, + }; + // 滚动位置初始化 + layPicker.offset[key] = { + start: {}, + move: {}, + end: {state: false}, + }; + // 日期选择器-获取对应值 + if(data.options){ + var minObj = lay_picker_date.getMinOrMaxDate(data.minDate); + var maxObj = lay_picker_date.getMinOrMaxDate(data.maxDate); + layPicker.minMaxData[key] = {}; + layPicker.minMaxData[key]['minObj'] = minObj; + layPicker.minMaxData[key]['maxObj'] = maxObj; + layPicker.minMaxData[key]['options'] = data.options; + data.data = lay_picker_date.getData(data.options, key); + } + // 选中值初始化 + layPicker.selectList[key] = {}; + // 数据集 + layPicker.dataList[key] = data.data; + // 渲染标签 + var html = layPicker.initBody(data, key); + $('body').append(html); + // 给绑定元素添加标识 + //data.elem.attr('readonly', true); + data.elem.attr('lay-picker-id', key); + + // 不等于自定义html才需要执行这些操作 + if(!data.type || data.type != 3){ + // 初始化标签和值 + layPicker.initBox(data.data, key); + layPicker.initSelect(key); + // 日期选择器-赋值 + if(data.options){ + layPicker.setValue(key, lay_picker_date.getVoluation(data.options, layPicker.fieldList[key].valueField), data.options); + } + // 搜索监听 + if(data.search){ + layPicker.tempSearchList[key] = data.data[0]; + var temp_keyup; + $('#lay-picker-input-'+key).on('keyup', function() { +     var value = $(this).val(); + clearTimeout(temp_keyup); + temp_keyup = setTimeout(function(){ + var tempArray = []; + if(value){ + var arr = layPicker.tempSearchList[key]; + for(var i=0; i layPicker.offset[key].move.y){ + layPicker.offset[key].move.num = true; + tempLen = layPicker.offset[key].start.y - layPicker.offset[key].move.y; + }else{ + layPicker.offset[key].move.num = false; + tempLen = layPicker.offset[key].move.y - layPicker.offset[key].start.y; + } + tempLen = tempLen / layPicker.liHeight; + var _this = this; + var ul = $(_this).find('ul')[0], ul2 = $(_this).find('ul'); + var tempNum = 1; + layPicker.tempInter = setInterval(function(){ + tempNum ++; + var tempTop = layPicker.offset[key].start.top; + layPicker.offset[key].start.top = parseInt(ul.style.transform.split(",")[1].replace('px', '')) || 0; + if(tempLen <= 3 + || tempTop >= 0 + || layPicker.offset[key].start.top >= 0 + || ((ul.children.length - 1) * layPicker.liHeight) <= Math.abs(tempTop) + || ((ul.children.length - 1) * layPicker.liHeight) <= Math.abs(layPicker.offset[key].start.top)){ + tempNum = tempLen; + }else{ + layPicker.offset[key].start.y = layPicker.offset[key].move.y; + if(layPicker.offset[key].move.num){ + layPicker.offset[key].move.y = layPicker.offset[key].move.y - ((tempLen - tempNum) * layPicker.liHeight); + }else{ + if(layPicker.offset[key].move.y < 0){ + layPicker.offset[key].move.y = layPicker.offset[key].move.y - ((tempLen - tempNum) * layPicker.liHeight); + }else{ + layPicker.offset[key].move.y = layPicker.offset[key].move.y + ((tempLen - tempNum) * layPicker.liHeight); + } + } + var y = layPicker.offset[key].move.y - layPicker.offset[key].start.y + layPicker.offset[key].start.top; + ul2.css('transform', 'translate3d(0px, ' + y + 'px, 0px)'); + layPicker.offset[key].end.y = y; + } + // 在这前面的都是实现延迟继续滚动效果,这下面的则是原来的效果 + if(tempNum >= tempLen){ + clearInterval(layPicker.tempInter); + layPicker.offset[key].end.state = false; + var itemHeight = layPicker.liHeight; + var sign = layPicker.offset[key].end.y >= 0 ? 1 : -1; + var thisIndex = $(_this).attr("index"); + // 计算超出回弹 + var fieldIndex = Math.round(Math.abs(layPicker.offset[key].end.y) / itemHeight); + var len = sign * (fieldIndex * itemHeight); + if (len > 0) { + len = 0; + fieldIndex = 0; + } else if (len < -(ul.children.length - 1) * itemHeight) { + len = -(ul.children.length - 1) * itemHeight; + fieldIndex = ul.children.length - 1; + }; + ul2.css('transform', 'translate3d(0px, ' + len + 'px, 0px)'); + layPicker.selectList[key][thisIndex] = fieldIndex; + // 获取选中值 + var list = layPicker.dataList[key]; + var resultArray = []; + for(var k in layPicker.selectList[key]){ + var arr = list[Number(k)] + if(arr && arr.length > 0){ + var obj = arr[layPicker.selectList[key][k]] + resultArray.push(obj); + } + } + // 回调 + if(data.onSelect){ + data.onSelect(key, thisIndex, resultArray); + } + // 日期选择器-赋值day + if(data.options){ + var valList = layPicker.setOptions(data.options, key, resultArray, thisIndex); + layPicker.setValue(key, valList); // 赋值,以位置类推 + } + } + }, 100) + e.stopPropagation();// 防止屏幕滑动 + }); + // 取消-点击 + $('.lay-picker-'+key).on("click", ".lay-picker-cancel-click", function(e){ + layPicker.hiden($(this).parents('.lay-picker').attr('lay-index')); + if(data.onCancel){ + data.onCancel(key); + } + }); + // 确认-点击 + $('.lay-picker-'+key).on("click", ".lay-picker-confirm-click", function(e){ + layPicker.hiden($(this).parents('.lay-picker').attr('lay-index')); + var list = layPicker.dataList[key]; + var v = '', resultArray = []; + for(var k in layPicker.selectList[key]){ + var arr = list[Number(k)] + if(arr && arr.length > 0){ + var obj = arr[layPicker.selectList[key][k]] + if(data.options && (data.options == 'time' || data.options == 'timesecond' || data.options == 'datetime' || data.options == 'datetimesecond')){ + if(data.options == 'time' || data.options == 'timesecond'){ + v += obj[layPicker.fieldList[key].valueField] + ":"; + }else if((data.options == 'datetime' || data.options == 'datetimesecond') && Number(k) == 2){ + v += obj[layPicker.fieldList[key].valueField] + " "; + }else if((data.options == 'datetime' || data.options == 'datetimesecond') && Number(k) > 2){ + v += obj[layPicker.fieldList[key].valueField] + ":"; + }else{ + v += obj[layPicker.fieldList[key].valueField] + "-"; + } + }else{ + v += obj[layPicker.fieldList[key].valueField] + "-"; + } + resultArray.push(obj); + } + } + if(data.onConfirm){ + data.onConfirm(key, v.substring(0, v.length-1), resultArray); + } + }); + // 清除-点击 + $('.lay-picker-'+key).on("click", ".lay-picker-clear-click", function(e){ + if(data.onClear){ + data.onClear(key); + } + }); + } + // 绑定元素-点击 + data.elem.on('click', function(e){ + layPicker.show($(this).attr('lay-picker-id')); + if(data.onShow){ + data.onShow(key); + } + }) + // 遮罩-点击 + $('.lay-picker-'+key).on("click", ".lay-picker-shade", function(e){ + layPicker.hiden($(this).parents('.lay-picker').attr('lay-index')); + if(data.onShade){ + data.onShade(key); + } + }); + // 成功回调 + if(data.onSuccess){ + data.onSuccess(key, '.lay-picker-'+key); + } + return key; + }, + /** 重置值*/ + setOptions: function(options, key, resultArray, thisIndex){ + var valList = []; + if(options == 'month' || options == 'date' || options == 'datetime' || options == 'datetimesecond'){ + if(thisIndex == 0){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getMonth(resultArray, key)); + if(options != 'month'){ + layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getDay(resultArray, key)); + } + }else if(thisIndex == 1 && options != 'month'){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getDay(resultArray, key)); + } + if(options != 'month'){ + var tempDay = resultArray[2][layPicker.fieldList[key].valueField]; + var lastDay = lay_picker_date.getLastDay(resultArray); + if(Number(tempDay) > lastDay){ + tempDay = lastDay; + } + valList = [ + {value: resultArray[0][layPicker.fieldList[key].valueField]}, + {value: resultArray[1][layPicker.fieldList[key].valueField]}, + {value: tempDay}, + ]; + if(options == 'datetime' || options == 'datetimesecond'){ + if(thisIndex == 0){ + layPicker.setData(key, Number(thisIndex) + 2, lay_picker_date.getHours(resultArray, key)); + layPicker.setData(key, Number(thisIndex) + 3, lay_picker_date.getMinutes(resultArray, key)); + }else if(thisIndex == 1){ + layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getHours(resultArray, key)); + layPicker.setData(key, Number(thisIndex) + 2, lay_picker_date.getMinutes(resultArray, key)); + }else if(thisIndex == 2){ + layPicker.setData(key, Number(thisIndex) , lay_picker_date.getHours(resultArray, key)); + layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getMinutes(resultArray, key)); + }else if(thisIndex == 3){ + layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key)); + } + valList.push({value: resultArray[3][layPicker.fieldList[key].valueField]}) + valList.push({value: resultArray[4][layPicker.fieldList[key].valueField]}) + if(options == 'datetimesecond'){ + if(thisIndex == 0){ + layPicker.setData(key, Number(thisIndex) + 4, lay_picker_date.getSeconds(resultArray, key)); + }else if(thisIndex == 1){ + layPicker.setData(key, Number(thisIndex) + 3, lay_picker_date.getSeconds(resultArray, key)); + }else if(thisIndex == 2){ + layPicker.setData(key, Number(thisIndex) + 2, lay_picker_date.getSeconds(resultArray, key)); + }else if(thisIndex == 3){ + layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getSeconds(resultArray, key)); + }else if(thisIndex == 4){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key)); + } + valList.push({value: resultArray[5][layPicker.fieldList[key].valueField]}) + } + } + } + } + if(options == 'time' || options == 'timesecond'){ + if(thisIndex == 0){ + layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key, 1)); + } + valList = [ + {value: resultArray[0][layPicker.fieldList[key].valueField]}, + {value: resultArray[1][layPicker.fieldList[key].valueField]}, + ]; + if(options == 'timesecond'){ + if(thisIndex == 0){ + layPicker.setData(key, Number(thisIndex) + 1, lay_picker_date.getSeconds(resultArray, key, 1)); + }else if(thisIndex == 1){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key, 1)); + } + valList.push({value: resultArray[2][layPicker.fieldList[key].valueField]}); + } + } + return valList; + }, + initBody: function(data, index){ + var s = ''; + s += ''; + }else if(data.type == 2){ + var sumHeight = 350; // 高度超出出现滚动条 + sumHeight = (data.title) ? sumHeight += 80 : sumHeight; + sumHeight = (data.search) ? sumHeight += 80 : sumHeight; + var h = $(window).height(); + var radius = (data.radius?'border-radius: '+data.radius+'px '+data.radius+'px 0px 0;':''); + s += '
                        '; + if(data.title){ + s += '
                        '; + s += '
                        '+(data.title || '')+'
                        '; + s += '
                        '; + } + if(data.search){ + s += ' '; + } + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += ' '+cancel+''; + s += ' '+clear+''; + s += ' '+confirm+''; + s += '
                        '; + s += '
                        '; + s += '
                        '; + }else{ + var sumHeight = 350; // 高度超出出现滚动条 + sumHeight = (data.search) ? sumHeight += 80 : sumHeight; + var h = $(window).height(); + var radius = (data.radius?'border-radius: '+data.radius+'px '+data.radius+'px 0px 0;':''); + s += '
                        '; + s += '
                        '; + s += '
                        '+(data.title || '')+'
                        '; + s += '
                        '; + s += ' '+cancel+''; + s += ' '+clear+''; + s += ' '+confirm+''; + s += '
                        '; + s += '
                        '; + if(data.search){ + s += ' '; + } + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += '
                        '; + s += '
                        '; + } + return s; + }, + initBox: function(data, index){ + var len = 100 / data.length; + var box = $('.lay-picker-'+index).find('.lay-picker-box'); + for(var i=0; i
                        '); + var ul = $('
                          '); + for(var j=0; j'+data[i][j][layPicker.fieldList[index].textField]+''); + ul.append(li); + } + div.append(ul); + box.append(div); + } + }, + initSelect: function(index){ + var list = layPicker.dataList[index]; + for(var i=0; iul'); + ul.empty(); + ul.css('transform', 'translate3d(0px, 0px, 0px)'); + for(var i=0; i'+data[i][layPicker.fieldList[index].textField]+''); + ul.append(li); + } + layPicker.selectList[index][t_index+''] = 0; + layPicker.dataList[index][t_index] = data; + + }, + setDataTrends: function(index, i, data){ + var t_index = (Number(i) + 1); + if(!data || data.length == 0){ + layPicker.deleteData(index, i, t_index); + var len = 100 / layPicker.dataList[index].length; + $('.lay-picker-'+index).find('.lay-picker-list-wrap').css('width', len+'%'); + return; + } + var data_len = t_index > layPicker.dataList[index].length-1; + if(data_len){ + layPicker.dataList[index].push(data); + }else{ + layPicker.dataList[index][t_index] = data; + layPicker.deleteData(index, t_index, t_index+1); + } + var box = $('.lay-picker-'+index).find('.lay-picker-box'); + var len = 100 / layPicker.dataList[index].length; + $('.lay-picker-'+index).find('.lay-picker-list-wrap').css('width', len+'%'); + if(data_len){ + var div = $('
                            '); + box.append(div); + } + var ul = $('.lay-picker-'+index).find('.lay-picker-box').find('[index='+t_index+']>ul'); + ul.empty(); + ul.css('transform', 'translate3d(0px, 0px, 0px)'); + for(var i=0; i'+data[i][layPicker.fieldList[index].textField]+''); + ul.append(li); + } + layPicker.selectList[index][t_index+''] = 0; + }, + deleteData: function(index, i, t_index){ + if(layPicker.dataList[index].length > Number(i)){ + for(var i=t_index; iul').css('transform', 'translate3d(0px, -'+y+'px, 0px)'); + } + } + } + }, + setOptionsValue: function(options, key, resultArray, thisIndex){ + if(options == 'month' || options == 'date' || options == 'datetime' || options == 'datetimesecond'){ + if(thisIndex == 0){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getMonth(resultArray, key)); + }else if(thisIndex == 1 && options != 'month'){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getDay(resultArray, key)); + } + if(options == 'datetime' || options == 'datetimesecond'){ + if(thisIndex == 2){ + layPicker.setData(key, Number(thisIndex) , lay_picker_date.getHours(resultArray, key)); + }else if(thisIndex == 3){ + layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key)); + } + if(options == 'datetimesecond'){ + if(thisIndex == 4){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key)); + } + } + } + } + if(options == 'time' || options == 'timesecond'){ + if(thisIndex == 0){ + layPicker.setData(key, thisIndex, lay_picker_date.getMinutes(resultArray, key, 1)); + } + if(options == 'timesecond'){ + if(thisIndex == 1){ + layPicker.setData(key, Number(thisIndex), lay_picker_date.getSeconds(resultArray, key, 1)); + } + } + } + }, + hiden: function(index){ + $('.lay-picker-'+index).find('.lay-picker-container').css('transform', 'translate3d(0px, 100%, 0px)'); + $('.lay-picker-'+index).find('.lay-picker-shade').fadeOut(200); + setTimeout(function(){ + $('.lay-picker-'+index).css('display', 'none'); + }, 100) + }, + show: function(index){ + $('.lay-picker-'+index).css('display', 'block'); + $('.lay-picker-'+index).find('.lay-picker-shade').fadeIn(200); + setTimeout(function(){ + $('.lay-picker-'+index).find('.lay-picker-container').css('transform', 'translate3d(0px, 0px, 0px)'); + }, 10) + $(".lay-picker-not-mobile").remove(); + if(!layPicker.isMobile()){ + $(".lay-picker-container").append("
                            非手机模式无法滑动
                            ") + } + }, + remove: function(index){ + layPicker.hiden(index); + setTimeout(function(){ + $('.lay-picker-'+index).remove(); + }, 200) + for(var i=0; i 0){ + for(var i=0; i= d2){ + maxMonth = Number(maxObj.ymd[1]); + } + } + } + } + for(var i = minMonth; i <= maxMonth; i++) { + var code = ('00' + i).slice(-2); + arr.push({ + name: i + '月', + value: code + }); + } + return arr; + }, + getDay: function(result, key) { + var year = result[0].value, + month = result[1].value; + var thisDate = new Date(Number(year), Number(month), 0); + var maxDay = thisDate.getDate(); + var minDay = 1; + if(key){ + var minObj = layPicker.minMaxData[key].minObj; + if(minObj && minObj.ymd){ + if(year == minObj.ymd[0] && month == minObj.ymd[1]){ + minDay = Number(minObj.ymd[2]); + }else{ + var d1 = Number(year+''+month+''+result[1].value); + var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]); + if(d1 <= d2){ + minDay = Number(minObj.ymd[2]); + } + } + } + var maxObj = layPicker.minMaxData[key].maxObj; + if(maxObj && maxObj.ymd){ + if(year == maxObj.ymd[0] && month == maxObj.ymd[1]){ + maxDay = Number(maxObj.ymd[2]); + }else{ + var d1 = Number(year+''+month+''+result[1].value); + var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]); + if(d1 >= d2){ + maxDay = Number(maxObj.ymd[2]); + } + } + } + } + var arr = []; + for(var i = minDay; i <= maxDay; i++) { + var code = ('00' + i).slice(-2); + arr.push({ + name: i + '日', + value: code + }); + } + return arr; + }, + getHours: function(result, key, type) { + var arr = []; + var minHour = 0; + var maxHour = 23; + if(key){ + if(type){ + var minObj = layPicker.minMaxData[key].minObj; + if(minObj && minObj.hms){ + minHour = Number(minObj.hms[0]); + } + var maxObj = layPicker.minMaxData[key].maxObj; + if(maxObj && maxObj.hms){ + maxHour = Number(maxObj.hms[0]); + } + }else{ + var year = result[0].value, + month = result[1].value, + day = result[2].value; + var minObj = layPicker.minMaxData[key].minObj; + if(minObj && minObj.hms){ + if(minObj && minObj.ymd){ + var d1 = Number(year+''+month+''+day+''+minObj.hms[0]); + var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]+''+minObj.hms[0]); + if(d1 <= d2){ + minHour = Number(minObj.hms[0]); + } + }else{ + minHour = Number(minObj.hms[0]); + } + } + var maxObj = layPicker.minMaxData[key].maxObj; + if(maxObj && maxObj.hms){ + if(maxObj && maxObj.ymd){ + var d1 = Number(year+''+month+''+day+''+maxObj.hms[0]); + var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]+''+maxObj.hms[0]); + if(d1 >= d2){ + maxHour = Number(maxObj.hms[0]); + } + }else{ + maxHour = Number(maxObj.hms[0]); + } + } + } + } + for(var i = minHour; i <= maxHour; i++) { + var value = ('00' + i).slice(-2); + arr.push({ + name: value + '时', + value: value + }) + } + return arr; + }, + getMinutes: function(result, key, type) { + var arr = []; + var minMinute = 0; + var maxMinute = 59; + if(key){ + if(type){ + var hours = result[0].value; + var minObj = layPicker.minMaxData[key].minObj; + if(minObj && minObj.hms){ + var d1 = Number(hours +''+ minObj.hms[1]); + var d2 = Number(minObj.hms[0] +''+ minObj.hms[1]); + if(d1 <= d2){ + minMinute = Number(minObj.hms[1]); + } + } + var maxObj = layPicker.minMaxData[key].maxObj; + if(maxObj && maxObj.hms){ + var d1 = Number(hours +''+ maxObj.hms[1]); + var d2 = Number(maxObj.hms[0] +''+ maxObj.hms[1]); + if(d1 >= d2){ + maxMinute = Number(maxObj.hms[1]); + } + } + }else{ + var year = result[0].value, + month = result[1].value, + day = result[2].value; + hours = result[3].value; + var minObj = layPicker.minMaxData[key].minObj; + if(minObj && minObj.hms){ + if(minObj && minObj.ymd){ + var d1 = Number(year+''+month+''+day+''+hours+''+minObj.hms[1]); + var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]+''+minObj.hms[0]+''+minObj.hms[1]); + if(d1 <= d2){ + minMinute = Number(minObj.hms[1]); + } + }else{ + minMinute = Number(minObj.hms[1]); + } + } + var maxObj = layPicker.minMaxData[key].maxObj; + if(maxObj && maxObj.hms){ + if(maxObj && maxObj.ymd){ + var d1 = Number(year+''+month+''+day+''+hours+''+maxObj.hms[1]); + var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]+''+maxObj.hms[0]+''+maxObj.hms[1]); + if(d1 >= d2){ + maxMinute = Number(maxObj.hms[1]); + } + }else{ + maxMinute = Number(maxObj.hms[1]); + } + } + } + } + for(var i = minMinute; i <= maxMinute; i++) { + var value = ('00' + i).slice(-2); + arr.push({ + name: value + '分', + value: value + }) + } + return arr; + }, + getSeconds: function(result, key, type) { + var arr = []; + var minSecond = 0; + var maxSecond = 59 + if(key){ + if(type){ + var hours = result[0].value; + var minute = result[1].value; + var minObj = layPicker.minMaxData[key].minObj; + if(minObj && minObj.hms && minObj.hms.length > 2){ + var d1 = Number(hours +''+ minute+''+ minObj.hms[2]); + var d2 = Number(minObj.hms[0] +''+ minObj.hms[1]+''+ minObj.hms[2]); + if(d1 <= d2){ + minSecond = Number(minObj.hms[2]); + } + } + var maxObj = layPicker.minMaxData[key].maxObj; + if(maxObj && maxObj.hms && maxObj.hms.length > 2){ + var d1 = Number(hours +''+ minute+''+ maxObj.hms[2]); + var d2 = Number(maxObj.hms[0] +''+ maxObj.hms[1]+''+ maxObj.hms[2]); + if(d1 >= d2){ + maxSecond = Number(maxObj.hms[2]); + } + } + }else{ + var year = result[0].value, + month = result[1].value, + day = result[2].value; + hours = result[3].value; + minute = result[4].value; + var minObj = layPicker.minMaxData[key].minObj; + if(minObj && minObj.hms){ + if(minObj && minObj.ymd){ + var d1 = Number(year+''+month+''+day+''+hours+''+minute+''+minObj.hms[2]); + var d2 = Number(minObj.ymd[0]+''+minObj.ymd[1]+''+minObj.ymd[2]+''+minObj.hms[0]+''+minObj.hms[1]+''+minObj.hms[2]); + if(d1 <= d2){ + minSecond = Number(minObj.hms[2]); + } + }else{ + minSecond = Number(minObj.hms[2]); + } + } + var maxObj = layPicker.minMaxData[key].maxObj; + if(maxObj && maxObj.hms){ + if(maxObj && maxObj.ymd){ + var d1 = Number(year+''+month+''+day+''+hours+''+minute+''+maxObj.hms[2]); + var d2 = Number(maxObj.ymd[0]+''+maxObj.ymd[1]+''+maxObj.ymd[2]+''+maxObj.hms[0]+''+maxObj.hms[1]+''+maxObj.hms[2]); + if(d1 >= d2){ + maxSecond = Number(maxObj.hms[2]); + } + }else{ + maxSecond = Number(maxObj.hms[2]); + } + } + } + } + for(var i = minSecond; i <= maxSecond; i++) { + var value = ('00' + i).slice(-2); + arr.push({ + name: value + '秒', + value: value + }) + } + return arr; + }, + getLastDay: function(result){ + var year = result[0].value, + month = result[1].value; + var thisDate = new Date(Number(year), Number(month), 0); + return thisDate.getDate(); + }, + getMinOrMaxDate: function(date){ + if(!date){ + return; + } + var arr = date.split(" "); + var obj = {}; + if(arr.length > 0){ + if(arr.length == 2){ + obj.ymd = arr[0].split("-"); + obj.hms = arr[1].split(":"); + }else if(arr.length == 1 && date.indexOf(":") == -1){ + obj.ymd = arr[0].split("-"); + }else{ + obj.hms = arr[0].split(":"); + } + } + return obj; + }, +} + +$('body').on('click', '.tool-time', function () { + let elem = $(this); + let type = $(this).data('type'); + let min = $(this).data('min'); + let max = $(this).data('max'); + if (typeof(type) == "undefined" || type === '') { + type = 'date'; + } + if (typeof(min) == "undefined" || min === '') { + minDate = '1900-1-1'; + } + if (typeof(max) == "undefined" || max === '') { + maxDate = '2099-1-1'; + } + layPicker.init({ + elem: elem, // 绑定元素 + options: type, // 设置为日期选择器(日期选择器可设置:year、month、date、time、timesecond、datetime、datetimesecond),不设置默认取data作为选择值 + onSuccess: function(index, elem){ // 渲染成功回调 + layPicker.show(index); + /* + layPicker.setValue(index, [ // 赋值,以位置类推 + {value: ''}, + {value: ''}, + {value: ''}, + ]) + */ + }, + onClear: function(index){ // 停止滚动触发:index是当前对象的标识, i 是当前滑动的对象,result是前面的值集 + elem.val(''); + layPicker.remove(index); + }, + onConfirm: function(index, val, result){ // 点击确认回调 + elem.val(val) + layPicker.remove(index); + }, + onCancel: function(index){ // 点击取消回调 + layPicker.remove(index); + }, + onShade: function(index){ // 点击遮罩回调 + layPicker.remove(index); + } + }); + return false; +}); + +$('body').on('click', '.picker-oa', function () { + let elem = $(this); + let url = $(this).data('url'); + let field = $(this).data('field'); + if (typeof(url) == "undefined" || url === '') { + return false; + } + if (typeof(field) == "undefined" || field === '') { + field = 'title'; + } + let loading; + $.ajax({ + url: url, + type: 'get', + data:{limit:999999}, + beforeSend:function(){ + loading = layer.loading('加载中...'); + }, + success: function (e) { + if (e.code == 0) { + let pickerData = e.data; + layPicker.init({ + elem: elem, // 绑定元素 + data: [pickerData], + textField: field, + valueField: 'id', + search:true, + onSuccess: function(index, elem){ // 渲染成功回调 + layPicker.show(index); + layPicker.setValue(index, [ // 赋值,以位置类推 + {value: ''} + ]) + }, + onClear: function(index){ + elem.val(''); + elem.next().val(''); + layPicker.remove(index); + }, + onConfirm: function(index, val, result){ // 点击确认回调 + if(result.length>0){ + elem.val(result[0][field]); + elem.next().val(result[0].id); + } + layPicker.remove(index); + }, + onCancel: function(index){ // 点击取消回调 + layPicker.remove(index); + }, + onShade: function(index){ // 点击遮罩回调 + layPicker.remove(index); + } + }); + } + }, + complete:function(){ + layer.close(loading); + } + }) + return false; +}); + +exports('picker', layPicker); +}); diff --git a/public/static/assets/mbui/module/tab.js b/public/static/assets/mbui/module/tab.js new file mode 100644 index 0000000..fcd6bde --- /dev/null +++ b/public/static/assets/mbui/module/tab.js @@ -0,0 +1,37 @@ +mbui.define([], function (exports) { + var Tab = function () { + this.config = { + elem: null, + trigger: 'click', + ontab: null + }; + }; + + // 初始化Tab + Tab.prototype.init = function (options) { + var that = this; + $.extend(true, that.config, options); + var elem = $(that.config.elem); + var tabs = elem.find('.mbui-tab-title li'); + var contents = elem.find('.mbui-tab-content .mbui-tab-item'); + + tabs.on(that.config.trigger, function () { + var index = $(this).index(); + tabs.removeClass('active'); + contents.removeClass('mbui-tab-show'); + $(this).addClass('active'); + contents.eq(index).addClass('mbui-tab-show'); + + // 执行回调函数 + if (typeof that.config.ontab === 'function') { + that.config.ontab(index, $(this)); + } + }); + }; + + // 导出Tab模块 + exports('tab', function (options) { + var tab = new Tab(); + tab.init(options); + }); +}); \ No newline at end of file diff --git a/public/static/assets/mbui/module/tool.js b/public/static/assets/mbui/module/tool.js new file mode 100644 index 0000000..56fae9a --- /dev/null +++ b/public/static/assets/mbui/module/tool.js @@ -0,0 +1,874 @@ +/** + * tool 工具组件 + */ +mbui.define([], function (exports) { + "use strict"; + var tool = { + ajax: function (options, callback) { + let format = 'json'; + if (options.hasOwnProperty('data')) { + format = options.data.hasOwnProperty('format') ? options.data.format : 'json'; + } + callback = callback || options.success; + callback && delete options.success; + let optsetting = { timeout: 10000 }; + if (format == 'jsonp') { + optsetting = { timeout: 10000, dataType: 'jsonp', jsonp: 'callback' } + } + let opts = $.extend({}, optsetting, { + success: function (res) { + if (callback && typeof callback === 'function') { + callback(res); + } + } + }, options); + $.ajax(opts); + }, + get: function (url, data, callback) { + this.ajax({ url: url, type: "GET", data: data }, callback); + }, + post: function (url, data, callback) { + this.ajax({ url: url, type: "POST", data: data }, callback); + }, + put: function (url, data, callback) { + this.ajax({ url: url, type: "PUT", data: data }, callback); + }, + delete: function (url, data, callback) { + this.ajax({ url: url, type: "DELETE", data: data }, callback); + }, + reload: function (delay) { + //延迟刷新,一般是在编辑完页面数据后需要自动关闭页面用到 + if(delay && delay>0){ + setTimeout(function () { + location.reload(); + }, delay); + }else{ + location.reload(); + } + }, + replace: function (url,delay) { + //延迟刷新,一般是在编辑完页面数据后需要自动关闭页面用到 + if(delay && delay>0){ + setTimeout(function () { + window.location.replace(url); + }, delay); + }else{ + window.location.replace(url); + } + }, + //格式化文件大小 + renderSize:function(val){ + if(null==val||val==''){ + return "0 Bytes"; + } + var unitArr = new Array("Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"); + var index=0; + var srcsize = parseFloat(val); + index=Math.floor(Math.log(srcsize)/Math.log(1024)); + var size =srcsize/Math.pow(1024,index); + size=size.toFixed(2);//保留的小数位数 + return size+unitArr[index]; + }, + // 格式化文件 + file_item:function(file,view=''){ + let image=['jpg','jpeg','png','gif']; + let fileshow='
                            '; + if(file['fileext'] == 'pdf'){ + + } + if(image.includes(file['fileext'])){ + fileshow='
                            '+file['name']+'
                            '; + } + let file_del=''; + if(view == ''){ + file_del = '
                            '; + } + let filesize = this.renderSize(file['filesize']); + let filedate = this.formatDate(file['create_time']); + let item = '
                            \ + '+fileshow+'\ +
                            \ +
                            '+file['name']+'
                            \ +
                            '+filesize+','+filedate+'
                            \ +
                            \ + '+file_del+'\ +
                            '; + return item; + }, + // 倒计时 + countdown: function (options) { + var that = this; + // 默认可选项 + options = $.extend(true, { + date: new Date(), + now: new Date() + }, options); + + // 兼容旧版参数 + var args = arguments; + if (args.length > 1) { + options.date = new Date(args[0]); + options.now = new Date(args[1]); + options.clock = args[2]; + } + // 实例对象 + var inst = { + options: options, + clear: function () { // 清除计时器 + clearTimeout(inst.timer); + }, + reload: function (opts) { // 重置倒计时 + this.clear(); + $.extend(true, this.options, { + now: new Date() + }, opts); + count(); + } + }; + typeof options.ready === 'function' && options.ready(); + // 计算倒计时 + var count = (function fn() { + var date = new Date(options.date); + var now = new Date(options.now); + var countTime = function (time) { + return time > 0 ? time : 0; + }(date.getTime() - now.getTime()); + var result = { + d: Math.floor(countTime / (1000 * 60 * 60 * 24)), // 天 + h: Math.floor(countTime / (1000 * 60 * 60)) % 24, // 时 + m: Math.floor(countTime / (1000 * 60)) % 60, // 分 + s: Math.floor(countTime / 1000) % 60 // 秒 + }; + var next = function () { + now.setTime(now.getTime() + 1000); + options.now = now; + count(); + }; + // 计时 - 以秒间隔 + inst.timer = setTimeout(next, 1000); + typeof options.clock === 'function' && options.clock(result, inst); + + // 计时完成 + if (countTime <= 0) { + clearTimeout(inst.timer); + typeof options.done === 'function' && options.done(result, inst); + } + return fn; + })(); + return inst; + }, + // 某个时间在当前时间的多久前 + timeAgo: function (time, onlyDate) { + var that = this; + var arr = [[], []]; + var stamp = new Date().getTime() - new Date(time).getTime(); + + // 返回具体日期 + if (stamp > 1000 * 60 * 60 * 24 * 31) { + stamp = new Date(time); + arr[0][0] = that.digit(stamp.getFullYear(), 4); + arr[0][1] = that.digit(stamp.getMonth() + 1); + arr[0][2] = that.digit(stamp.getDate()); + + // 是否输出时间 + if (!onlyDate) { + arr[1][0] = that.digit(stamp.getHours()); + arr[1][1] = that.digit(stamp.getMinutes()); + arr[1][2] = that.digit(stamp.getSeconds()); + } + return arr[0].join('-') + ' ' + arr[1].join(':'); + } + + // 30 天以内,返回「多久前」 + if (stamp >= 1000 * 60 * 60 * 24) { + return ((stamp / 1000 / 60 / 60 / 24) | 0) + ' 天前'; + } else if (stamp >= 1000 * 60 * 60) { + return ((stamp / 1000 / 60 / 60) | 0) + ' 小时前'; + } else if (stamp >= 1000 * 60 * 3) { // 3 分钟以内为:刚刚 + return ((stamp / 1000 / 60) | 0) + ' 分钟前'; + } else if (stamp < 0) { + return '未来'; + } else { + return '刚刚'; + } + }, + /** + * 格式化时间戳为指定格式 + * @param {number} timestamp - 时间戳(毫秒或秒) + * @param {string} formatStr - 格式字符串,例如 'YYYY-MM-DD HH:mm:ss' + * @returns {string} + */ + formatDate:function(timestamp, formatStr = 'YYYY-MM-DD HH:mm:ss') { + const date = new Date(timestamp); + + // 如果是秒级时间戳,转为毫秒 + if (timestamp.toString().length === 10) { + date.setTime(timestamp * 1000); + } + + const padZero = (num) => String(num).padStart(2, '0'); + + const replacements = { + YYYY: date.getFullYear(), + MM: padZero(date.getMonth() + 1), // 月份从 0 开始 + DD: padZero(date.getDate()), + HH: padZero(date.getHours()), + mm: padZero(date.getMinutes()), + ss: padZero(date.getSeconds()) + }; + + return Object.entries(replacements).reduce((str, [key, value]) => { + return str.replace(key, value); + }, formatStr); + }, + //返回10位时间戳 + time: function () { + return Math.floor((new Date).getTime() / 1e3); + }, + /** + * + * @param n 格式化样式Y-m-d H:i:s返回带0 Y-n-j不带0 z一年中第几天要+1才正确 w星期0是周日 N 7是周日D三个字母星期 l英语星期 W周 F月份英语 L闰年判断 c带时区日期时间 r英文形式 + * @param t 时间戳 + * @returns 格式化时间 + */ + date: function (n, t) { + var e, r, u = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], o = /\\?(.?)/gi, i = function (n, t) { return r[n] ? r[n]() : t }, c = function (n, t) { for (n = String(n); n.length < t;)n = "0" + n; return n }; r = { d: function () { return c(r.j(), 2) }, D: function () { return r.l().slice(0, 3) }, j: function () { return e.getDate() }, l: function () { return u[r.w()] + "day" }, N: function () { return r.w() || 7 }, S: function () { var n = r.j(), t = n % 10; return t <= 3 && 1 === parseInt(n % 100 / 10, 10) && (t = 0), ["st", "nd", "rd"][t - 1] || "th" }, w: function () { return e.getDay() }, z: function () { var n = new Date(r.Y(), r.n() - 1, r.j()), t = new Date(r.Y(), 0, 1); return Math.round((n - t) / 864e5) }, W: function () { var n = new Date(r.Y(), r.n() - 1, r.j() - r.N() + 3), t = new Date(n.getFullYear(), 0, 4); return c(1 + Math.round((n - t) / 864e5 / 7), 2) }, F: function () { return u[6 + r.n()] }, m: function () { return c(r.n(), 2) }, M: function () { return r.F().slice(0, 3) }, n: function () { return e.getMonth() + 1 }, t: function () { return new Date(r.Y(), r.n(), 0).getDate() }, L: function () { var n = r.Y(); return n % 4 == 0 & n % 100 != 0 | n % 400 == 0 }, o: function () { var n = r.n(), t = r.W(); return r.Y() + (12 === n && t < 9 ? 1 : 1 === n && t > 9 ? -1 : 0) }, Y: function () { return e.getFullYear() }, y: function () { return r.Y().toString().slice(-2) }, a: function () { return e.getHours() > 11 ? "pm" : "am" }, A: function () { return r.a().toUpperCase() }, B: function () { var n = 3600 * e.getUTCHours(), t = 60 * e.getUTCMinutes(), r = e.getUTCSeconds(); return c(Math.floor((n + t + r + 3600) / 86.4) % 1e3, 3) }, g: function () { return r.G() % 12 || 12 }, G: function () { return e.getHours() }, h: function () { return c(r.g(), 2) }, H: function () { return c(r.G(), 2) }, i: function () { return c(e.getMinutes(), 2) }, s: function () { return c(e.getSeconds(), 2) }, u: function () { return c(1e3 * e.getMilliseconds(), 6) }, e: function () { throw new Error("Not supported (see source code of date() for timezone on how to add support)") }, I: function () { return new Date(r.Y(), 0) - Date.UTC(r.Y(), 0) != new Date(r.Y(), 6) - Date.UTC(r.Y(), 6) ? 1 : 0 }, O: function () { var n = e.getTimezoneOffset(), t = Math.abs(n); return (n > 0 ? "-" : "+") + c(100 * Math.floor(t / 60) + t % 60, 4) }, P: function () { var n = r.O(); return n.substr(0, 3) + ":" + n.substr(3, 2) }, T: function () { return "UTC" }, Z: function () { return 60 * -e.getTimezoneOffset() }, c: function () { return "Y-m-d\\TH:i:sP".replace(o, i) }, r: function () { return "D, d M Y H:i:s O".replace(o, i) }, U: function () { return e / 1e3 | 0 } }; return function (n, t) { return e = void 0 === t ? new Date : t instanceof Date ? new Date(t) : new Date(1e3 * t), n.replace(o, i) }(n, t) + }, + /** + * + * @param text 转换参数now +-1 day +- 2 days +-1 week + * @param now 默认当前时间戳 + * @returns 字符串转换时间戳 + */ + strtotime: function (text, now) { + var parsed, match, today, year, date, days, ranges, len, times, regex, i, fail = false; if (!text) { return fail } text = text.replace(/^\s+|\s+$/g, "").replace(/\s{2,}/g, " ").replace(/[\t\r\n]/g, "").toLowerCase(); match = text.match(/^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/); if (match && match[2] === match[4]) { if (match[1] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": return fail; case "/": if (match[3] > 12 || match[5] > 31) { return fail } return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { if (match[5] > 1901) { switch (match[2]) { case "-": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case "/": if (match[1] > 12 || match[3] > 31) { return fail } return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } } else { switch (match[2]) { case "-": if (match[3] > 12 || match[5] > 31 || (match[1] < 70 && match[1] > 38)) { return fail } year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1]; return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ".": if (match[5] >= 70) { if (match[3] > 12 || match[1] > 31) { return fail } return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000 } if (match[5] < 60 && !match[6]) { if (match[1] > 23 || match[3] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0, match[9] || 0) / 1000 } return fail; case "/": if (match[1] > 12 || match[3] > 31 || (match[5] < 70 && match[5] > 38)) { return fail } year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5]; return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] || 0, match[9] || 0) / 1000; case ":": if (match[1] > 23 || match[3] > 59 || match[5] > 59) { return fail } today = new Date(); return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] || 0, match[5] || 0) / 1000 } } } } if (text === "now") { return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0 } if (!isNaN(parsed = Date.parse(text))) { return parsed / 1000 | 0 } date = now ? new Date(now * 1000) : new Date(); days = { "sun": 0, "mon": 1, "tue": 2, "wed": 3, "thu": 4, "fri": 5, "sat": 6 }; ranges = { "yea": "FullYear", "mon": "Month", "day": "Date", "hou": "Hours", "min": "Minutes", "sec": "Seconds" }; function lastNext(type, range, modifier) { var diff, day = days[range]; if (typeof day !== "undefined") { diff = day - date.getDay(); if (diff === 0) { diff = 7 * modifier } else { if (diff > 0 && type === "last") { diff -= 7 } else { if (diff < 0 && type === "next") { diff += 7 } } } date.setDate(date.getDate() + diff) } } function process(val) { var splt = val.split(" "), type = splt[0], range = splt[1].substring(0, 3), typeIsNumber = /\d+/.test(type), ago = splt[2] === "ago", num = (type === "last" ? -1 : 1) * (ago ? -1 : 1); if (typeIsNumber) { num *= parseInt(type, 10) } if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) { return date["set" + ranges[range]](date["get" + ranges[range]]() + num) } if (range === "wee") { return date.setDate(date.getDate() + (num * 7)) } if (type === "next" || type === "last") { lastNext(type, range, num) } else { if (!typeIsNumber) { return false } } return true } times = "(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec" + "|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?" + "|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)"; regex = "([+-]?\\d+\\s" + times + "|" + "(last|next)\\s" + times + ")(\\sago)?"; match = text.match(new RegExp(regex, "gi")); if (!match) { return fail } for (i = 0, len = match.length; i < len; i++) { if (!process(match[i])) { return fail } } return (date.getTime() / 1000) + }, + /** + * date_eq('2019-10-22','2019-10-21') true + * @param 前日期 + * @param 后日期 + * @returns 判断日期是否前边大于后边 + */ + date_eq: function (strDate1, strDate2) { + var date1 = new Date(strDate1.replace(/\-/g, "\/")); var date2 = new Date(strDate2.replace(/\-/g, "\/")); if ((date1 - date2) >= 0) { return true; } else { return false; } + }, + /** + * @param 时间戳10位 + * @returns 格式化时间 + */ + timeline: function (tt) { + var today = new Date(); var d = new Date(tt * 1000); var m = today.getTime() - d.getTime(); if (m <= 0) { m = 1000 } if (m < 60 * 1000) { return Math.floor(m / 1000) + "秒前" } else { if (m < 60 * 60 * 1000) { return Math.floor(m / (1000 * 60)) + "分钟前" } else { if (m < 60 * 60 * 1000 * 24) { return Math.floor(m / (1000 * 60 * 60)) + "小时前" } else { if (m < 60 * 60 * 1000 * 24 * 7) { return Math.floor(m / (1000 * 60 * 60 * 24)) + "天前" } else { if (m < 60 * 60 * 1000 * 24 * 7 * 56) { return Math.floor(m / (1000 * 60 * 60 * 24 * 7)) + "周前" } else { return Math.floor(m / (1000 * 60 * 60 * 24 * 7 * 52)) + "年前" } } } } } + }, + /** + * 获取某个月份的第一天、最后一天 + * @param nowDate 时间 + * @return {(string|string)[]} + */ + getFirstNowLastDay: function (nowDate) { + var now = nowDate ? new Date(nowDate) : new Date(); + var strLink = "-"; + var year = now.getFullYear(); + var month = now.getMonth() + 1; + var day = now.getDate(); + if (month >= 1 && month <= 9) { + month = "0" + month; + } + if (day >= 1 && day <= 9) { + day = "0" + day; + } + var yearMonth = year + strLink + month; + var firstDate = year + strLink + month + strLink + '01'; + var sysDate = year + strLink + month + strLink + day; + var lastDay = this.getLastDay(year, month); + var lastDate = year + strLink + month + strLink + lastDay; + //以数组形式返回 + return [firstDate, sysDate, lastDate, yearMonth]; + }, + /** + * 获取当月的最后一天 + * @param year 年份 + * @param month 月份 + **/ + getLastDay: function (year, month) { + var new_year = year; + var new_month = month++;//取下一个月的第一天,方便计算(最后一天不固定) + if (month > 12) {//如果当前大于12月,则年份转到下一年 + new_month -= 12;//月份减 + new_year++;//年份增 + } + // 取当年当月对应的下个月的前一天,即当前月的最后一天 + return new Date(new_year, new_month, 0).getDate(); + }, + /** + *array_keys( {firstname: 'Kevin', surname: 'van Zonneveld'} ); + * @param 数组 + * @returns 返回数组中key + */ + array_keys: function (r, n, a) { + var e = void 0 !== n, o = [], t = !!a, i = !0, y = ""; for (y in r) r.hasOwnProperty(y) && (i = !0, e && (t && r[y] !== n ? i = !1 : r[y] !== n && (i = !1)), i && (o[o.length] = y)); return o + }, + /** + * array_values( {firstname: 'Kevin', surname: 'van Zonneveld'} ); + * @param 数组 + * @returns 返回数组中值 + */ + array_values: function (r) { + var n = [], a = ""; for (a in r) n[n.length] = r[a]; return n + }, + /** + *array_unique({'a': 'green', 0: 'red', 'b': 'green', 1: 'blue', 2: 'red'}) + * @param 数组 + * @returns 去除数组重复 + */ + array_unique: function (r) { + var n = "", t = {}, u = ""; for (n in r) r.hasOwnProperty(n) && (u = r[n], !1 === function (r, n) { var t = ""; for (t in n) if (n.hasOwnProperty(t) && n[t] + "" == r + "") return t; return !1 }(u, t) && (t[n] = u)); return t + }, + /** + * array_slice(["a", "b", "c", "d", "e"], 2, -1, true); + * @param 数组 + * @param 开始位置 + * @param 取出个数 + * @param 是否重排 + * @returns 截取数组 + */ + array_slice: function (r, i, e, t) { + var o = ""; if ("[object Array]" !== Object.prototype.toString.call(r) || t && 0 !== i) { var a = 0, c = {}; for (o in r) a += 1, c[o] = r[o]; r = c, i = i < 0 ? a + i : i, e = void 0 === e ? a : e < 0 ? a + e - i : e; var n = {}, l = !1, f = -1, s = 0, v = 0; for (o in r) { if (++f, s >= e) break; f === i && (l = !0), l && (++s, is_int(o) && !t ? n[v++] = r[o] : n[o] = r[o]) } return n } return void 0 === e ? r.slice(i) : e >= 0 ? r.slice(i, i + e) : r.slice(i, e) + }, + /** + *array_search('e',["a", "b", "c", "d", "e"]) + * @param 要查找的值 + * @param 数组 + * @returns 数组中搜索指定值返回键 + */ + array_search: function (r, e, t) { + var n = !!t, i = ""; if ("object" == typeof r && r.exec) { if (!n) { var o = "i" + (r.global ? "g" : "") + (r.multiline ? "m" : "") + (r.sticky ? "y" : ""); r = new RegExp(r.source, o) } for (i in e) if (e.hasOwnProperty(i) && r.test(e[i])) return i; return !1 } for (i in e) if (e.hasOwnProperty(i) && (n && e[i] === r || !n && e[i] == r)) return i; return !1 + }, + /** + * + * @param 变量 + * @returns 是否数组判断 + */ + is_array: function (t) { + if (!t || "object" != typeof t) return !1; if (function (t) { if (!t || "object" != typeof t || "number" != typeof t.length) return !1; var e = t.length; return t[t.length] = "bogus", e !== t.length ? (t.length -= 1, !0) : (delete t[t.length], !1) }(t)) return !0; var e = Object.prototype.toString.call(t), n = function (t) { var e = /\W*function\s+([\w$]+)\s*\(/.exec(t); return e ? e[1] : "(Anonymous)" }(t.constructor); return "[object Object]" === e && "Object" === n + }, + /** + * + * @param 值 + * @param 数组 + * @returns 判断元素是否在数组中bool + */ + in_array: function (r, n, i) { + var f = ""; if (!i) { for (f in n) if (n[f] == r) return !0 } else for (f in n) if (n[f] === r) return !0; return !1 + }, + /** + *sort(["a","b"],"SORT_STRING",true) + * @param 数组 + * @param SORT_STRING|SORT_NUMERIC 排序类型 + * @param 默认true只排序不输出,false输出 + * @returns 数组排序 + */ + sort: function (inputArr, sort_flags, strictForIn = true) { + var valArr = [], keyArr = [], k = '', i = 0, sorter = false, populateArr = []; switch (sort_flags) { case 'SORT_STRING': sorter = function (a, b) { return strnatcmp(a, b); }; break; case 'SORT_NUMERIC': sorter = function (a, b) { return (a - b); }; break; default: sorter = function (a, b) { var aFloat = parseFloat(a), bFloat = parseFloat(b), aNumeric = aFloat + '' === a, bNumeric = bFloat + '' === b; if (aNumeric && bNumeric) { return aFloat > bFloat ? 1 : aFloat < bFloat ? -1 : 0; } else if (aNumeric && !bNumeric) { return 1; } else if (!aNumeric && bNumeric) { return -1; } return a > b ? 1 : a < b ? -1 : 0; }; break; }populateArr = strictForIn ? inputArr : populateArr; for (k in inputArr) { if (inputArr.hasOwnProperty(k)) { valArr.push(inputArr[k]); if (strictForIn) { delete inputArr[k]; } } } valArr.sort(sorter); for (i = 0; i < valArr.length; i++) { populateArr[i] = valArr[i]; } return strictForIn || populateArr; + }, + /** + * + * @param 字符 + * @returns 是否整数判断 + */ + is_int: function (i) { + return i === +i && isFinite(i) && !(i % 1) + }, + /** + * + * @param 字符 + * @returns 是否浮点数判断 + */ + is_float: function (i) { + return !(+i !== i || isFinite(i) && !(i % 1)) + }, + /** + * + * @param 变量 + * @returns 是否对象判断 + */ + is_object: function (t) { + return "[object Array]" !== Object.prototype.toString.call(t) && (null !== t && "object" == typeof t) + }, + /** + * @param 函数名字符串 + * @returns 判断函数是否存在 + */ + function_exists: function (n) { + var o = "undefined" != typeof window ? window : global; return "string" == typeof n && (n = o[n]), "function" == typeof n + }, + /** + * + * @param 数组或对象 + * @returns 序列化 + */ + serialize: function (r) { + var e, t, a, n = "", o = 0, i = function (r) { var e, t, a, n, o = typeof r; if ("object" === o && !r) return "null"; if ("object" === o) { if (!r.constructor) return "object"; a = r.constructor.toString(), e = a.match(/(\w+)\(/), e && (a = e[1].toLowerCase()), n = ["boolean", "number", "string", "array"]; for (t in n) if (a == n[t]) { o = n[t]; break } } return o }, c = i(r); switch (c) { case "function": e = ""; break; case "boolean": e = "b:" + (r ? "1" : "0"); break; case "number": e = (Math.round(r) == r ? "i" : "d") + ":" + r; break; case "string": e = "s:" + function (r) { var e = 0, t = 0, a = r.length, n = ""; for (t = 0; t < a; t++)n = r.charCodeAt(t), e += n < 128 ? 1 : n < 2048 ? 2 : 3; return e }(r) + ':"' + r + '"'; break; case "array": case "object": e = "a"; for (t in r) if (r.hasOwnProperty(t)) { if ("function" === i(r[t])) continue; a = t.match(/^[0-9]+$/) ? parseInt(t, 10) : t, n += this.serialize(a) + this.serialize(r[t]), o++ } e += ":" + o + ":{" + n + "}"; break; case "undefined": default: e = "N" }return "object" !== c && "array" !== c && (e += ";"), e + }, + /** + * + * @param 字符串 + * @returns 解码序列化 + */ + unserialize: function (r) { + var e = this, n = function (r) { var e = r.charCodeAt(0); return e < 128 ? 0 : e < 2048 ? 1 : 2 }; return error = function (r, n, a, t) { throw new e.window[r](n, a, t) }, read_until = function (r, e, n) { for (var a = 2, t = [], i = r.slice(e, e + 1); i != n;)a + e > r.length && error("Error", "Invalid"), t.push(i), i = r.slice(e + (a - 1), e + a), a += 1; return [t.length, t.join("")] }, read_chrs = function (r, e, a) { var t, i, u; for (u = [], t = 0; t < a; t++)i = r.slice(e + (t - 1), e + t), u.push(i), a -= n(i); return [u.length, u.join("")] }, _unserialize = function (r, e) { var n, a, t, i, u, s, o, l, c, d, f, h, _, p, w, b, k, g, v = 0, I = function (r) { return r }; switch (e || (e = 0), n = r.slice(e, e + 1).toLowerCase(), a = e + 2, n) { case "i": I = function (r) { return parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "b": I = function (r) { return 0 !== parseInt(r, 10) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "d": I = function (r) { return parseFloat(r) }, c = read_until(r, a, ";"), v = c[0], l = c[1], a += v + 1; break; case "n": l = null; break; case "s": d = read_until(r, a, ":"), v = d[0], f = d[1], a += v + 2, c = read_chrs(r, a + 1, parseInt(f, 10)), v = c[0], l = c[1], a += v + 2, v != parseInt(f, 10) && v != l.length && error("SyntaxError", "String length mismatch"); break; case "a": for (l = {}, t = read_until(r, a, ":"), v = t[0], i = t[1], a += v + 2, s = parseInt(i, 10), u = !0, h = 0; h < s; h++)p = _unserialize(r, a), w = p[1], _ = p[2], a += w, b = _unserialize(r, a), k = b[1], g = b[2], a += k, _ !== h && (u = !1), l[_] = g; if (u) { for (o = new Array(s), h = 0; h < s; h++)o[h] = l[h]; l = o } a += 1; break; default: error("SyntaxError", "Unknown / Unhandled data type(s): " + n) }return [n, a - e, I(l)] }, _unserialize(r + "", 0)[2] + }, + /** + * uniqid('',true)长度23 默认13 + * @param 前缀 + * @param 是否增加长度 + * @returns 生成唯一id + */ + uniqid: function (n, e) { + void 0 === n && (n = ""); var t, i = function (n, e) { return n = parseInt(n, 10).toString(16), e < n.length ? n.slice(n.length - e) : e > n.length ? Array(e - n.length + 1).join("0") + n : n }, o = "undefined" != typeof window ? window : global; o.$locutus = o.$locutus || {}; var d = o.$locutus; return d.php = d.php || {}, d.php.uniqidSeed || (d.php.uniqidSeed = Math.floor(123456789 * Math.random())), d.php.uniqidSeed++, t = n, t += i(parseInt((new Date).getTime() / 1e3, 10), 8), t += i(d.php.uniqidSeed, 5), e && (t += (10 * Math.random()).toFixed(8).toString()), t + }, + /** + * + * @param 变量 + * @param 进制,默认十进制 + * @returns 转换成整型 + */ + intval: function (i, t) { + var n, a, e = typeof i; return "boolean" === e ? +i : "string" === e ? (0 === t && (a = i.match(/^\s*0(x?)/i), t = a ? a[1] ? 16 : 8 : 10), n = parseInt(i, t || 10), isNaN(n) || !isFinite(n) ? 0 : n) : "number" === e && isFinite(i) ? i < 0 ? Math.ceil(i) : Math.floor(i) : 0 + }, + //转换成浮点型 + floatval: function (a) { + return parseFloat(a) || 0 + }, + //打印变量 + log: function (arr) { + console.log(arr); + }, + /** + * + * @param 字符串 + * @param 要去除的字符,默认为空格 + * @returns 去除两边空格 + */ + trim: function (r, n) { + var t = [" ", "\n", "\r", "\t", "\f", "\v", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "​", "\u2028", "\u2029", " "].join(""), e = 0, i = 0; for (r += "", n && (t = (n + "").replace(/([[\]().?\/*{}+$^:])/g, "$1")), e = r.length, i = 0; i < e; i++)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(i); break } for (e = r.length, i = e - 1; i >= 0; i--)if (-1 === t.indexOf(r.charAt(i))) { r = r.substring(0, i + 1); break } return -1 === t.indexOf(r.charAt(0)) ? r : "" + }, + /** + * + * @param 字符串 + * @param 要去除的字符 + * @returns 去除右边空格 + */ + rtrim: function (e, r) { + return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "\\$1") : " \\s ", (e + "").replace(new RegExp("[" + r + "]+$", "g"), "") + }, + /** + * + * @param 字符串 + * @param 要去除的字符 + * @returns 去除左边空格 + */ + ltrim: function (e, r) { + return r = r ? (r + "").replace(/([[\]().?\/*{}+$^:])/g, "$1") : " \\s ", (e + "").replace(new RegExp("^[" + r + "]+", "g"), "") + }, + //字符串删除多个空格只保留一个 + strtrim: function (a) { + return a.replace(/\s+/g, " "); + }, + /** + *str_replace("a","我","来自于a") + * @param 要查找的字符 + * @param 要替换的字符 + * @param 字符串 + * @returns 字符串替换 + */ + str_replace: function (t, o, e, c) { + var r = 0, l = 0, n = "", a = "", i = 0, p = 0, u = [].concat(t), f = [].concat(o), g = e, y = "[object Array]" === Object.prototype.toString.call(f), b = "[object Array]" === Object.prototype.toString.call(g); g = [].concat(g); var j = "undefined" != typeof window ? window : global; j.$locutus = j.$locutus || {}; var v = j.$locutus; if (v.php = v.php || {}, "object" == typeof t && "string" == typeof o) { for (n = o, o = [], r = 0; r < t.length; r += 1)o[r] = n; n = "", f = [].concat(o), y = "[object Array]" === Object.prototype.toString.call(f) } for (void 0 !== c && (c.value = 0), r = 0, i = g.length; r < i; r++)if ("" !== g[r]) for (l = 0, p = u.length; l < p; l++)n = g[r] + "", a = y ? void 0 !== f[l] ? f[l] : "" : f[0], g[r] = n.split(u[l]).join(a), void 0 !== c && (c.value += n.split(u[l]).length - 1); return b ? g : g[0] + }, + /** + * + * @param 字符串 + * @param 保留的标签 + * @returns 过滤去除html标签 + */ + strip_tags: function (input, allowed) { + allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join(""); var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi, commentsAndPhpTags = /|<\?(?:php)?[\s\S]*?\?>/gi; return input.replace(commentsAndPhpTags, "").replace(tags, function ($0, $1) { return allowed.indexOf("<" + $1.toLowerCase() + ">") > -1 ? $0 : "" }) + }, + //字符串转换首字母大写 + ucfirst: function (t) { + return t += "", t.charAt(0).toUpperCase() + t.substr(1) + }, + //html转换实体 + htmlencode: function (sStr) { + var htmlspecialchars = function (e, E, T, _) { var r = 0, t = 0, a = !1; ("undefined" == typeof E || null === E) && (E = 2), e = e.toString(), _ !== !1 && (e = e.replace(/&/g, "&")), e = e.replace(//g, ">"); var N = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (a = !0), "number" != typeof E) { for (E = [].concat(E), t = 0; t < E.length; t++)0 === N[E[t]] ? a = !0 : N[E[t]] && (r |= N[E[t]]); E = r } return E & N.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/'/g, "'")), a || (e = e.replace(/"/g, """)), e }; return htmlspecialchars(sStr); + }, + //html实体还原 + htmldecode: function (sStr) { + var htmlspecialchars_decode = function (e, E) { var T = 0, _ = 0, r = !1; "undefined" == typeof E && (E = 2), e = e.toString().replace(/</g, "<").replace(/>/g, ">"); var t = { ENT_NOQUOTES: 0, ENT_HTML_QUOTE_SINGLE: 1, ENT_HTML_QUOTE_DOUBLE: 2, ENT_COMPAT: 2, ENT_QUOTES: 3, ENT_IGNORE: 4 }; if (0 === E && (r = !0), "number" != typeof E) { for (E = [].concat(E), _ = 0; _ < E.length; _++)0 === t[E[_]] ? r = !0 : t[E[_]] && (T |= t[E[_]]); E = T } return E & t.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/�*39;/g, "'")), r || (e = e.replace(/"/g, '"')), e = e.replace(/&/g, "&") }; return htmlspecialchars_decode(sStr) + }, + // 转义 html + escape: function (html) { + var exp = /[<"'>]|&(?=#[a-zA-Z0-9]+)/g; + if (html === undefined || html === null) return ''; + html += ''; + if (!exp.test(html)) return html; + return html.replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&') + .replace(//g, '>') + .replace(/'/g, ''').replace(/"/g, '"'); + }, + // 还原转义的 html + unescape: function (html) { + if (html === undefined || html === null) html = ''; + html += ''; + return html.replace(/\&/g, '&') + .replace(/\</g, '<').replace(/\>/g, '>') + .replace(/\'/g, '\'').replace(/\"/g, '"'); + }, + //base64还原 + base64_decode: function (n) { + var r = function (n) { return decodeURIComponent(n.split("").map(function (n) { return "%" + ("00" + n.charCodeAt(0).toString(16)).slice(-2) }).join("")) }; if ("undefined" == typeof window) return new Buffer(n, "base64").toString("utf-8"); if (void 0 !== window.atob) return r(window.atob(n)); var e, t, o, i, d, f, a, c, u = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", h = 0, w = 0, C = "", g = []; if (!n) return n; n += ""; do { i = u.indexOf(n.charAt(h++)), d = u.indexOf(n.charAt(h++)), f = u.indexOf(n.charAt(h++)), a = u.indexOf(n.charAt(h++)), c = i << 18 | d << 12 | f << 6 | a, e = c >> 16 & 255, t = c >> 8 & 255, o = 255 & c, g[w++] = 64 === f ? String.fromCharCode(e) : 64 === a ? String.fromCharCode(e, t) : String.fromCharCode(e, t, o) } while (h < n.length); return C = g.join(""), r(C.replace(/\0+$/, "")) + }, + // base64编码 + base64_encode: function (e) { + var r = function (e) { return encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, function (e, r) { return String.fromCharCode("0x" + r) }) }; if ("undefined" == typeof window) return new Buffer(e).toString("base64"); if (void 0 !== window.btoa) return window.btoa(r(e)); var n, t, o, i, a, c, d, f, h = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", u = 0, w = 0, A = "", l = []; if (!e) return e; e = r(e); do { n = e.charCodeAt(u++), t = e.charCodeAt(u++), o = e.charCodeAt(u++), f = n << 16 | t << 8 | o, i = f >> 18 & 63, a = f >> 12 & 63, c = f >> 6 & 63, d = 63 & f, l[w++] = h.charAt(i) + h.charAt(a) + h.charAt(c) + h.charAt(d) } while (u < e.length); A = l.join(""); var C = e.length % 3; return (C ? A.slice(0, C - 3) : A) + "===".slice(C || 3) + }, + //字符串URL编码 + urlencode: function (e) { + return e += "", encodeURIComponent(e).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/~/g, "%7E").replace(/%20/g, "+") + }, + //字符串URL解码 + urldecode: function (e) { + return decodeURIComponent((e + "").replace(/%(?![\da-f]{2})/gi, function () { return "%25" }).replace(/\+/g, "%20")) + }, + //unicode解码表情中文 + unicode_decode: function (e) { + return e = e.replace(/\\/g, "%"), unescape(e) + }, + /** + * @param 字符串 + * @param 是否中文也编码 + * @returns unicode编码中文表情 + */ + unicode_encode: function (n) { + if (1 == (arguments.length > 1 && void 0 !== arguments[1] && arguments[1])) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") } var e = function (n) { for (var r = [], t = 0; t < n.length; t++)r[t] = ("00" + n.charCodeAt(t).toString(16)).slice(-4); return "\\u" + r.join("\\u") }, u = /[\ud800-\udbff][\udc00-\udfff]/g; return n = n.replace(u, function (n) { return 2 === n.length ? e(n) : n }) + }, + //获取url变量值 + get_params: function (c) { + var e = c + "=", b = window.location.href, h = b.indexOf("?"), b = b.slice(h + 1), a = b.split("&"), d = 0, f = "", g = a.length; for (d = 0; d < g; d++) { var f = a[d]; if (f.indexOf(e) === 0) { return decodeURIComponent(f.slice(e.length).replace(/\+/g, "%20")) } } return null + }, + /** + * 可以不要参数 + * @param 最小 + * @param 最大 + * @returns 生成更好随机数 + */ + mt_rand: function (r, e) { + var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else { if (1 === n) throw new Error("Warning: mt_rand() expects exactly 2 parameters, 1 given"); r = parseInt(r, 10), e = parseInt(e, 10) } return Math.floor(Math.random() * (e - r + 1)) + r + }, + /** + * 可以不要参数 + * @param 最小 + * @param 最大 + * @returns 生成随机数 + */ + rand: function (r, e) { + var n = arguments.length; if (0 === n) r = 0, e = 2147483647; else if (1 === n) throw new Error("Warning: rand() expects exactly 2 parameters, 1 given"); return Math.floor(Math.random() * (e - r + 1)) + r + }, + /** + *strcut("我爱中国人",4,"...") + * @param 字符串 + * @param 长度中文汉字算两个 + * @param 显示符号 + * @returns 字符串截取 + */ + strcut: function (str, iMaxBytes, sSuffix) { + if (isNaN(iMaxBytes)) { return str } if (strlen(str) <= iMaxBytes) { return str } var i = 0, bytes = 0; for (; i < str.length && bytes < iMaxBytes; ++i, ++bytes) { if (str.charCodeAt(i) > 255) { ++bytes } } sSuffix = sSuffix || ""; return (bytes - iMaxBytes == 1 ? str.substr(0, i - 1) : str.substr(0, i)) + sSuffix + }, + /** + * @param 字符串 + * @param 子字符串 + * @returns 查找字符串 + */ + strfind: function (string, find) { + return !(string.indexOf(find) === -1) + }, + //判断是否数字 + is_num: function (num) { + var reg = new RegExp("^[0-9]*$"); return reg.test(num) + }, + //判断是否手机号 + is_mobile: function (num) { + var reg = /^1\d{10}$/; return reg.test(num) + }, + //判断是否QQ + is_qq: function (num) { + var reg = /^[1-utf8_decode]{1}\d{4,11}$/; return reg.test(num) + }, + //判断是否邮箱 + is_email: function (str) { + var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; return reg.test(str) + }, + //判断是否中文 + is_chinese: function (num) { + var reg = /[\u4e00-\u9fa5]/g; return reg.test(num) + }, + //判断是否符合注册用户名(数字字母组成,下划钱字母开头) + is_reg: function (num) { + var reg = /^([a-zA-z_]{1})([\w]*)$/g; return reg.test(num) + }, + //判断是否电话 + is_tel: function (str) { + var reg = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; return reg.test(str) + }, + //判断是否是IP + is_ip: function (strIP) { + if (isNull(strIP)) { return false } var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g; if (re.test(strIP)) { if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) { return true } } return false + }, + //判断是否邮编 + is_zipcode: function (str) { + var reg = /^(\d){6}$/; return reg.test(str) + }, + //判断是否英文 + is_english: function (str) { + var reg = /^[A-Za-z]+$/; return reg.test(str) + }, + //判断是否是URL + is_url: function (url) { + var strRegex = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/; var re = new RegExp(strRegex); return re.test(url); + }, + //判断是否http + is_http: function (url) { + if (url.indexOf("http://") === -1 && url.indexOf("https://") === -1) { return false } return true + }, + //判断是否金额 + is_money: function (n) { + return !!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(n) + }, + //是否是银行卡号 + is_CardNumber: function (num) { + return num.toString().replace(/\s/g, '').replace(/(.{4})/g, "$1 "); + }, + //是否是身份证号 + is_IDCard: function (idcode) { + var weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; + var check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2', 'x']; + var code = idcode + ""; + var last = idcode[17];//最后一位 + var seventeen = code.substring(0, 17); + var arr = seventeen.split(""); + var len = arr.length; + var num = 0; + for (var i = 0; i < len; i++) { + num = num + arr[i] * weight_factor[i]; + } + var resisue = num % 11; + var last_no = check_code[resisue]; + var idcard_patter = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/; + var format = idcard_patter.test(idcode); + return last === last_no && format; + }, + /** + * + * @param 整数 + * @param 最小 + * @param 最大 + * @returns 判断是否在两个整数内 + */ + in_int: function (n, iMin, iMax) { + if (!isFinite(n)) { return false } if (!/^[+-]?\d+$/.test(n)) { return false } if (iMin != undefined && parseInt(n) < parseInt(iMin)) { return false } if (iMax != undefined && parseInt(n) > parseInt(iMax)) { return false } return true + }, + /** + * + * @param 浮点数 + * @param 最小 + * @param 最大 + * @returns 判断是否在两个浮点数之内 + */ + in_float: function (n, fMin, fMax) { + if (!isFinite(n)) { return false } if (fMin != undefined && parseFloat(n) < parseFloat(fMin)) { return false } if (fMax != undefined && parseFloat(n) > parseFloat(fMax)) { return false } return true + }, + /** + *number_format('150.456', 2, '.', ',') + * @param 数字 + * @param 保留小数位数 + * @param 小数点显示符号 + * @param 千分位符号 + * @returns 格式化数字 + */ + number_format: function (e, n, t, i) { + e = (e + "").replace(/[^0-9+\-Ee.]/g, ""); var r = isFinite(+e) ? +e : 0, o = isFinite(+n) ? Math.abs(n) : 0, a = void 0 === i ? "," : i, d = void 0 === t ? "." : t, u = ""; return u = (o ? function (e, n) { if (-1 === ("" + e).indexOf("e")) return +(Math.round(e + "e+" + n) + "e-" + n); var t = ("" + e).split("e"), i = ""; return +t[1] + n > 0 && (i = "+"), (+(Math.round(+t[0] + "e" + i + (+t[1] + n)) + "e-" + n)).toFixed(n) }(r, o).toString() : "" + Math.round(r)).split("."), u[0].length > 3 && (u[0] = u[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, a)), (u[1] || "").length < o && (u[1] = u[1] || "", u[1] += new Array(o - u[1].length + 1).join("0")), u.join(d) + }, + // 数字前置补零 + digit: function (num, length) { + var str = ''; + num = String(num); + length = length || 2; + for (var i = num.length; i < length; i++) { + str += '0'; + } + return num < Math.pow(10, length) ? str + (num | 0) : num; + }, + /** + * 金额数字转大写 + * @param num number + * @return {string} + */ + upDigit: function (num, is_head = false) { + var fraction = ['角', '分', '厘']; + var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; + var unit = [ + ['元', '万', '亿'], + ['', '拾', '佰', '仟'] + ]; + var head = num < 0 ? '欠人民币' : '人民币'; + num = Math.abs(num); + var s = '', i; + for (i = 0; i < fraction.length; i++) { + s += (digit[Math.floor(num * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, ''); + } + s = s || '整'; + num = Math.floor(num); + for (i = 0; i < unit[0].length && num > 0; i++) { + var p = ''; + for (var j = 0; j < unit[1].length && num > 0; j++) { + p = digit[num % 10] + unit[1][j] + p; + num = Math.floor(num / 10); + } + s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; + } + if (is_head == true) { + return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整'); + } + else { + return s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整'); + } + + }, + //隐藏银行号码 + hidebank: function (s = "6217995510035399947") { + return s.replace(/^(\d{8})\d+(\d{4})$/, "$1*******$2"); + }, + // 隐藏手机号中间四位 + hidemobile: function (s = "18291447788") { + return s.replace(/^(\d{3})\d+(\d{4})$/, "$1****$2"); + }, + /** + * + * @param css代码 + * @returns 添加css代码 + */ + addcss: function (e) { + var t = document.createElement("style"), d = document.head || document.getElementsByTagName("head")[0]; if (t.type = "text/css", t.styleSheet) { var a = function () { try { t.styleSheet.cssText = e } catch (e) { } }; t.styleSheet.disabled ? setTimeout(a, 10) : a() } else { var s = document.createTextNode(e); t.appendChild(s) } d.appendChild(t) + }, + /** + * @param js代码 + * @returns 添加js代码 + */ + addjs: function (t) { + var e = document.createElement("script"); e.type = "text/javascript"; try { e.appendChild(document.createTextNode(t)) } catch (d) { e.text = t } document.head.appendChild(e) + }, + /** + * + * @param js文件路径 + * @param 回调函数 + * @returns 加载js支持回调 + */ + loadjs: function (e, a) { + var t = document.createElement("script"); t.src = e, t.onload = function () { var e = t.readyState && "complete" != t.readyState && "loaded" != t.readyState; a && a(!e) }, document.head.appendChild(t) + }, + /** + * + * @param css路径 + * @param 回调函数 + * @returns 加载css支持回调 + */ + loadcss: function (e, n) { + var t = document.createElement("link"); t.rel = "stylesheet", t.type = "text/css", t.onerror = function () { n(!1) }, t.onload = function () { n(!0) }, t.href = e, document.head.appendChild(t) + }, + //获取当前域名主机 + gethost: function () { + return window.location.protocol + "//" + window.location.host; + }, + /** + * 由经纬度计算两点之间的距离 + * @param latlngFirst + * @param latlngLast + * @return {string} + */ + distance: function (latlngFirst, latlngLast) { + var La1 = latlngFirst.lat * Math.PI / 180.0; + var La2 = latlngLast.lat * Math.PI / 180.0; + var La3 = La1 - La2; + var Lb3 = latlngFirst.lng * Math.PI / 180.0 - latlngLast.lng * Math.PI / 180.0; + var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2))); + dis = dis * 6378.137; + dis = Math.round(dis * 10000) / 10000; + return dis.toFixed(2); + }, + /** + * 设置cookie + * @param name + * @param value + * @param iDay + */ + setCookie: function (name, value, iDay) { + var oDate = new Date(); + oDate.setDate(oDate.getDate() + iDay); + document.cookie = name + '=' + value + ';expires=' + oDate; + }, + /** + * 获取cookie + * @param name + * @return {string} + */ + getCookie: function (name) { + var arr = document.cookie.split('; '); + for (var i = 0; i < arr.length; i++) { + var arr2 = arr[i].split('='); + if (arr2[0] == name) { + return arr2[1]; + } + } + return ''; + }, + /** + * 删除Cookie + * @param name + */ + removeCookie: function (name) { + this.setCookie(name, 1, -1); + }, + /** + * 运算百分制 + * @param thisNum + * @param totalNum + * @return {number} + */ + computeProgres: function (thisNum, totalNum) { + var num = parseFloat(thisNum) || 0.00, total = parseFloat(totalNum) || 0.00; + return Math.round(num / total * 10000) / 100; + }, + /** + * 生成随着大小写token + * @param length 长度,默认32 + * @return {string} + */ + token: function (length) { + length = length || 32; + var char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + var result = ''; + for (var i = 0; i < length; i++) { + result += char.charAt(Math.floor(Math.random() * char.length)); + } + return result; + } + }; + $('body').on('click', '.link-a', function () { + let url = $(this).data('href'); + if (url && url !== '') { + window.location.replace(url); + } + return false; + }); + // 输出接口 + exports('tool', tool); +}); diff --git a/public/static/assets/mbui/module/userPicker.js b/public/static/assets/mbui/module/userPicker.js new file mode 100644 index 0000000..2392350 --- /dev/null +++ b/public/static/assets/mbui/module/userPicker.js @@ -0,0 +1,160 @@ +mbui.define(['layer'], function (exports) { + var layer = mbui.layer; + var userSelector = function () { + this.config = { + type:1, + url: "/api/index/get_employee", + where: {}, + callback: function(){} + }; + this.loaded = 0; + }; + // 初始化 + userSelector.prototype.init = function (options) { + var that = this; + $.extend(true, that.config, options); + that.select(); + }; + + userSelector.prototype.select = function () { + var that = this; + var types = that.config.type == 2 ? 'checkbox' : 'radio'; + var users = []; + var alphabet = []; + var userGroups = {}; + var selector = $('.user-selector'); + if (selector.length > 0) { + return false; + } + let loading; + $.ajax({ + url: that.config.url, + type: 'get', + data: { did: 0 }, + beforeSend:function(){ + loading = layer.loading('加载中...'); + }, + success: function (e) { + if (e.code == 0) { + users = e.data; + bulidSelector(); + } + }, + complete:function(){ + layer.close(loading); + } + }) + + function bulidSelector() { + // 将用户账号按照首字母分组 + for (var i = 0; i < users.length; i++) { + var user = users[i]['username']; + var firstLetter = user.charAt(0).toUpperCase(); + if (!userGroups[firstLetter]) { + userGroups[firstLetter] = []; + alphabet.push(firstLetter); + } + userGroups[firstLetter].push(users[i]); + } + alphabet.sort(); + var $container = $('
                            关闭确认

                            选择员工

                            '); + var $letters = $('
                            '); + var $userList = $('
                            '); + + var item = ''; + for (var j = 0; j < alphabet.length; j++) { + var $letterLink = $('' + alphabet[j] + ''); + $letters.append($letterLink); + + item += '
                            ' + alphabet[j] + '
                            '; + var userData = userGroups[alphabet[j]]; + for (var k = 0; k < userData.length; k++) { + item += ''; + } + } + $userList.append(item); + $container.append($letters).append($userList); + $('body').append($container); + + // 点击字母滚动到对应的字母开头的用户位置 + $letters.on('click', 'a', function (e) { + e.preventDefault(); + var letter = $(this).attr('href').substring(1); + var $letterSection = $('#' + letter); + var scrollTop = $letterSection.offset().top - $userList.offset().top + $userList.scrollTop(); + $userList.animate({ scrollTop: scrollTop }, 500); + }); + + $container.find('.left').click(function () { + $container.fadeOut(function () { + $container.remove(); + }); + }); + + $container.find('.right').click(function () { + let selected = $container.find('input:checked'); + if (selected.length == 0) { + layer.msg('请选择员工'); + return false; + } + let ids = [], names = [], dids = [],departments=[]; + for (var m = 0; m < selected.length; m++) { + let selected_item = $(selected[m]).parent(); + ids.push(selected_item.data('id')); + names.push(selected_item.data('name')); + dids.push(selected_item.data('did')); + departments.push(selected_item.data('department')); + } + that.config.callback(ids,names,dids,departments); + $container.fadeOut(function () { + $container.remove(); + }); + }); + } + }; + + //选择员工弹窗 + $('body').on('click','.picker-admin',function () { + let that = $(this); + let type = that.data('type'); + let sub = that.data('sub'); + if (typeof(type) == "undefined" || type == '') { + type = 1; + } + if (typeof(sub) == "undefined" || sub == '') { + sub = 0; + } + let ids=that.next().val()+'',names = that.val()+''; + let picker = new userSelector(); + if(sub ==1){ + picker.init({ + type:type, + url:'/api/index/get_employee_sub', + callback:function(ids,names,dids,departments){ + that.val(names.join(',')); + that.next().val(ids.join(',')); + that.next().next().val(dids.join(',')); + } + }); + } + else{ + picker.init({ + type:type, + callback:function(ids,names,dids,departments){ + that.val(names.join(',')); + that.next().val(ids.join(',')); + that.next().next().val(dids.join(',')); + } + }); + } + }); + // 导出userPicker模块 + exports('userPicker', function (options) { + var userPicker = new userSelector(); + userPicker.init(options); + }); +}); \ No newline at end of file diff --git a/public/static/assets/third_party/echart/china.js b/public/static/assets/third_party/echart/china.js new file mode 100644 index 0000000..917887e --- /dev/null +++ b/public/static/assets/third_party/echart/china.js @@ -0,0 +1,27 @@ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['exports', 'echarts'], factory); + } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { + // CommonJS + factory(exports, require('echarts')); + } else { + // Browser globals + factory({}, root.echarts); + } +}(this, function (exports, echarts) { + var log = function (msg) { + if (typeof console !== 'undefined') { + console && console.error && console.error(msg); + } + } + if (!echarts) { + log('ECharts is not Loaded'); + return; + } + if (!echarts.registerMap) { + log('ECharts Map is not loaded') + return; + } + echarts.registerMap('china', {"type":"FeatureCollection","features":[{"id":"710000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@°Ü¯Û"],["@@ƛĴÕƊÉɼģºðʀ\\ƎsÆNŌÔĚäœnÜƤɊĂǀĆĴžĤNJŨxĚĮǂƺòƌ‚–âÔ®ĮXŦţƸZûЋƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"],["@@\\p|WoYG¿¥I†j@¢"],["@@…¡‰@ˆV^RqˆBbAŒnTXeRz¤Lž«³I"],["@@ÆEE—„kWqë @œ"],["@@fced"]],"encodeOffsets":[[[122886,24033]],[[123335,22980]],[[122375,24193]],[[122518,24117]],[[124427,22618]],[[124862,26043]]]},"properties":{"cp":[121.509062,25.044332],"name":"台湾","childNum":6}},{"id":"130000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@o~†Z]‚ªr‰ºc_ħ²G¼s`jΟnüsœłNX_“M`ǽÓnUK…Ĝēs¤­©yrý§uģŒc†JŠ›e"],["@@U`Ts¿m‚"],["@@oºƋÄd–eVŽDJj£€J|Ådz•Ft~žKŨ¸IÆv|”‡¢r}膎onb˜}`RÎÄn°ÒdÞ²„^®’lnÐèĄlðӜ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcœŋ`–ZÔ’¶êqvFƚ†N®ĆTH®¦O’¾ŠIbÐã´BĐɢŴÆíȦp–ĐÞXR€·nndOž¤’OÀĈƒ­Qg˜µFo|gȒęSWb©osx|hYh•gŃfmÖĩnº€T̒Sp›¢dYĤ¶UĈjl’ǐpäìë|³kÛfw²Xjz~ÂqbTŠÑ„ěŨ@|oM‡’zv¢ZrÃVw¬ŧˏfŒ°ÐT€ªqŽs{Sž¯r æÝlNd®²Ğ džiGʂJ™¼lr}~K¨ŸƐÌWö€™ÆŠzRš¤lêmĞL΄’@¡|q]SvK€ÑcwpÏρ†ĿćènĪWlĄkT}ˆJ”¤~ƒÈT„d„™pddʾĬŠ”ŽBVt„EÀ¢ôPĎƗè@~‚k–ü\\rÊĔÖæW_§¼F˜†´©òDòj’ˆYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkv‚GpuARhÞÆǶgƊTǼƹS£¨¡ù³ŘÍ]¿Ây™ôEP xX¶¹܇O¡“gÚ¡IwÃ鑦ÅB‡Ï|ǰ…N«úmH¯‹âŸDùŽyŜžŲIÄuШDž•¸dɂ‡‚FŸƒ•›Oh‡đ©OŸ›iÃ`ww^ƒÌkŸ‘ÑH«ƇǤŗĺtFu…{Z}Ö@U‡´…ʚLg®¯Oı°ÃwŸ ^˜—€VbÉs‡ˆmA…ê]]w„§›RRl£‡ȭµu¯b{ÍDěïÿȧŽuT£ġƒěŗƃĝ“Q¨fV†Ƌ•ƅn­a@‘³@šď„yýIĹÊKšŭfċŰóŒxV@tˆƯŒJ”]eƒR¾fe|rHA˜|h~Ėƍl§ÏŠlTíb ØoˆÅbbx³^zÃ͚¶Sj®A”yÂhðk`š«P€”ˈµEF†Û¬Y¨Ļrõqi¼‰Wi°§’б´°^[ˆÀ|ĠO@ÆxO\\tŽa\\tĕtû{ġŒȧXýĪÓjùÎRb›š^ΛfK[ݏděYfíÙTyŽuUSyŌŏů@Oi½’éŅ­aVcř§ax¹XŻác‡žWU£ôãºQ¨÷Ñws¥qEH‰Ù|‰›šYQoŕÇyáĂ£MðoťÊ‰P¡mšWO¡€v†{ôvîēÜISpÌhp¨ ‘j†deŔQÖj˜X³à™Ĉ[n`Yp@Už–cM`’RKhŒEbœ”pŞlNut®Etq‚nsÁŠgA‹iú‹oH‡qCX‡”hfgu“~ϋWP½¢G^}¯ÅīGCŸÑ^ãziMáļMTÃƘrMc|O_ž¯Ŏ´|‡morDkO\\mĆJfl@c̬¢aĦtRıҙ¾ùƀ^juųœK­ƒUFy™—Ɲ…›īÛ÷ąV×qƥV¿aȉd³B›qPBm›aËđŻģm“Å®Vйd^K‡KoŸnYg“¯Xhqa”Ldu¥•ÍpDž¡KąÅƒkĝęěhq‡}HyÓ]¹ǧ£…Í÷¿qáµ§š™g‘¤o^á¾ZE‡¤i`ij{n•ƒOl»ŸWÝĔįhg›F[¿¡—ßkOüš_‰€ū‹i„DZàUtėGylƒ}ŒÓM}€jpEC~¡FtoQi‘šHkk{Ãmï‚"]],"encodeOffsets":[[[119712,40641]],[[121616,39981]],[[116462,37237]]]},"properties":{"cp":[114.502461,38.045474],"name":"河北","childNum":3}},{"id":"140000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@Þĩ҃S‰ra}Á€yWix±Üe´lè“ßÓǏok‘ćiµVZģ¡coœ‘TS˹ĪmnÕńe–hZg{gtwªpXaĚThȑp{¶Eh—®RćƑP¿£‘Pmc¸mQÝW•ďȥoÅîɡųAďä³aωJ‘½¥PG­ąSM­™…EÅruµé€‘Yӎ•Ō_d›ĒCo­Èµ]¯_²ÕjāŽK~©ÅØ^ԛkïçămϑk]­±ƒcݯÑÃmQÍ~_a—pm…~ç¡q“ˆu{JÅŧ·Ls}–EyÁÆcI{¤IiCfUc•ƌÃp§]웫vD@¡SÀ‘µM‚ÅwuŽYY‡¡DbÑc¡hƒ×]nkoQdaMç~eD•ÛtT‰©±@¥ù@É¡‰ZcW|WqOJmĩl«ħşvOÓ«IqăV—¥ŸD[mI~Ó¢cehiÍ]Ɠ~ĥqXŠ·eƷœn±“}v•[ěďŽŕ]_‘œ•`‰¹ƒ§ÕōI™o©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs׌¥ŅxŸÊdÒ{ºvĴÎêÌɊ²¶€ü¨|ÞƸµȲ‘LLúÉƎ¤ϊęĔV`„_bª‹S^|ŸdŠzY|dz¥p†ZbÆ£¶ÒK}tĦÔņƠ‚PYzn€ÍvX¶Ěn ĠÔ„zý¦ª˜÷žÑĸَUȌ¸‚dòÜJð´’ìúNM¬ŒXZ´‘¤ŊǸ_tldIš{¦ƀðĠȤ¥NehXnYG‚‡R° ƬDj¬¸|CĞ„Kq‚ºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBŒÊ”TœŸ˜ʂōĖ’šĴŞ–ȀœÆÿȄlŤĒö„t”νî¼ĨXhŒ‘˜|ªM¤Ðz"],"encodeOffsets":[[116874,41716]]},"properties":{"cp":[112.549248,37.857014],"name":"山西","childNum":1}},{"id":"150000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@Č^â£Ăh–šĖMÈÄw‚\\fŦ°W ¢¾luŸD„wŠ\\̀ʉÌÛM…Ā[bӞEn}¶Vc…ê“sƒ–›¯PqƒFB…‰|S•³C|kñ•H‹d‘iÄ¥sˆʼnő…PóÑÑE^‘ÅPpy_YtS™hQ·aHwsOnʼnÚs©iqj›‰€USiº]ïWš‰«gW¡A–R붛ijʕ…Œů`çõh]y»ǃŸǛҤxÒm~zf}pf|ÜroÈzrKÈĵSƧ„ż؜Ġu¦ö"],["@@sKCš…GS|úþX”gp›{ÁX¿Ÿć{ƱȏñZáĔyoÁhA™}ŅĆfdʼn„_¹„Y°ėǩÑ¡H¯¶oMQqð¡Ë™|‘Ñ`ƭŁX½·óۓxğįÅcQ‡ˆ“ƒs«tȋDžF“Ÿù^i‘t«Č¯[›hAi©á¥ÇĚ×l|¹y¯YȵƓ‹ñǙµï‚ċ™Ļ|Dœ™üȭ¶¡˜›oŽäÕG\\ďT¿Òõr¯œŸLguÏYęRƩšɷŌO\\İТæ^Ŋ IJȶȆbÜGŽĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľƒ]ėl¥Ë‡ĭûÁ„ƒėéV©±ćn©­ȇžÍq¯½•YÃÔʼn“ÉNѝÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱà‘ưN¢ƔÊuľýľώȪƺɂļžxœZĈ}ÌʼnŪ˜ĺœŽĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ǎ›¼ȳÐUf†dIxÿ\\G ˆzâɏÙOº·pqy£†@ŒŠqþ@Ǟ˽IBäƣzsÂZ†ÁàĻdñ°ŕzéØűzșCìDȐĴĺf®ŽÀľưø@ɜÖÞKĊŇƄ§‚͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘNJ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´¼mȠJˀŸƲÀɠmǐnǔĎȆÞǠN~€ʢĜ‚¶ƌĆĘźʆȬ˪ĚǏĞGȖƴƀj`ĢçĶāàŃºē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^žªƂ`ªt¾äƚêĦĀ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDĝŒ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°dždÀɞ_ĸdîàŎjʜêTĞªŌ‡ŜWÈ|tqĢUB~´°ÎFC•ŽU¼pĀēƄN¦¾O¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Ší¨ÅDK°ßtŇĔKš¨ǵÂcḷ̌ĚǣȄĽF‡lġUĵœŇ‹ȣFʉɁƒMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFŽxúQ„Er´W„rh¤Ɛ \\talĈDJ˜Ü|[Pll̚¸ƎGú´Pž¬W¦†^¦–H]prR“n|or¾wLVnÇIujkmon£cX^Bh`¥V”„¦U¤¸}€xRj–[^xN[~ªŠxQ„‚[`ªHÆÂExx^wšN¶Ê˜|¨ì†˜€MrœdYp‚oRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚r¤–`[|òDŞĔöxElÖdH„ÀI`„Ď\\Àì~ƎR¼tf•¦^¢ķ¶e”ÐÚMŒptgj–„ɡČÅyġLû™ŇV®ŠÄÈƀ†Ď°P|ªVV†ªj–¬ĚÒêp¬–E|ŬÂc|ÀtƐK fˆ{ĘFǜƌXƲąo½Ę‘\\¥–o}›Ûu£ç­kX‘{uĩ«āíÓUŅßŢq€Ť¥lyň[€oi{¦‹L‡ń‡ðFȪȖ”ĒL„¿Ì‹ˆfŒ£K£ʺ™oqNŸƒwğc`ue—tOj×°KJ±qƒÆġm‰Ěŗos¬…qehqsuœƒH{¸kH¡Š…ÊRǪÇƌbȆ¢´ä܍¢NìÉʖ¦â©Ż؛Ç@Vu»A—ylßí¹ĵê…ÝlISò³C¹Ìâ„²i¶’Ìoú^H“²CǜңDŽ z¼g^èöŰ_‹‚–†IJĕꄜ}gÁnUI«m‰…„‹]j‡vV¼euhwqA„aW˜ƒ_µj…»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáG“›OUۗOB±•XŸkŇ¹£k|e]ol™ŸkVͼÕqtaÏõjgÁ£§U^Œ”RLˆËnX°Ç’Bz†^~wfvˆypV ¯„ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyx‹þp]Évïè‘vƀnÂĴÖ@‚‰†V~Ĉ™Š³MEˆĸÅĖt—ējyÄDXÄxGQuv_›i¦aBçw‘˛wD™©{ŸtāmQ€{EJ§KPśƘƿ¥@‰sCT•É}ɃwˆƇy±ŸgÑ“}T[÷kÐ禫…SÒ¥¸ëBX½‰HáŵÀğtSÝÂa[ƣ°¯¦P]£ġ“–“Òk®G²„èQ°óMq}EŠóƐÇ\\ƒ‡@áügQ͋u¥Fƒ“T՛¿Jû‡]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶—ˆ¿A•†‹[¡Œ{d×uQAƒ›M•xV‹vMOmăl«ct[wº_šÇʊŽŸjb£ĦS_é“QZ“_lwgOiýe`YYLq§IÁˆdz£ÙË[ÕªuƏ³ÍT—s·bÁĽäė[›b[ˆŗfãcn¥îC¿÷µ[ŏÀQ­ōšĉm¿Á^£mJVm‡—L[{Ï_£›F¥Ö{ŹA}…×Wu©ÅaųijƳhB{·TQqÙIķˑZđ©Yc|M¡…L•eVUóK_QWk’_ĥ‘¿ãZ•»X\\ĴuUƒè‡lG®ěłTĠğDєOrÍd‚ÆÍz]‹±…ŭ©ŸÅ’]ŒÅÐ}UË¥©Tċ™ïxgckfWgi\\ÏĒ¥HkµE˜ë{»ÏetcG±ahUiñiWsɁˆ·c–C‚Õk]wȑ|ća}w…VaĚ᠞ŒG°ùnM¬¯†{ÈˆÐÆA’¥ÄêJxÙ¢”hP¢Ûˆº€µwWOŸóFŽšÁz^ÀŗÎú´§¢T¤ǻƺSė‰ǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇq‡Z‘ñiñC³ª—…»E`¨åXēÕqÉû[l•}ç@čƘóO¿¡ƒFUsA‰“ʽīccšocƒ‚ƒÇS}„“£‡IS~ălkĩXçmĈ…ŀЂoÐdxÒuL^T{r@¢‘žÍƒĝKén£kQ™‰yšÅõËXŷƏL§~}kqš»IHėDžjĝŸ»ÑÞoŸå°qTt|r©ÏS‹¯·eŨĕx«È[eMˆ¿yuˆ‘pN~¹ÏyN£{©’—g‹ħWí»Í¾s“əšDž_ÃĀɗ±ą™ijĉʍŌŷ—S›É“A‹±åǥɋ@럣R©ąP©}ĹªƏj¹erƒLDĝ·{i«ƫC£µ"]],"encodeOffsets":[[[127444,52594]],[[113793,40312]]]},"properties":{"cp":[111.670801,40.818311],"name":"内蒙古","childNum":2}},{"id":"210000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@L–Ž@@s™a"],["@@MnNm"],["@@d‚c"],["@@eÀ‚C@b‚“‰"],["@@f‡…Xwkbr–Ä`qg"],["@@^jtW‘Q"],["@@~ Y]c"],["@@G`ĔN^_¿Z‚ÃM"],["@@iX¶B‹Y"],["@@„YƒZ"],["@@L_{Epf"],["@@^WqCT\\"],["@@\\[“‹§t|”¤_"],["@@m`n_"],["@@Ïxnj{q_×^Giip"],["@@@œé^B†‡ntˆaÊU—˜Ÿ]x ¯ÄPIJ­°h€ʙK³†VˆÕ@Y~†|EvĹsDŽ¦­L^p²ŸÒG ’Ël]„xxÄ_˜fT¤Ď¤cŽœP„–C¨¸TVjbgH²sdÎdHt`Bˆ—²¬GJję¶[ÐhjeXdlwhšðSȦªVÊπ‹Æ‘Z˜ÆŶ®²†^ŒÎyÅÎcPqń“ĚDMħĜŁH­ˆk„çvV[ij¼W–‚YÀäĦ’‘`XlžR`žôLUVžfK–¢†{NZdĒª’YĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~†źBŽ|¦ÕœEž¤Ð`\\|Kˆ˜UnnI]¤ÀÂĊnŎ™R®Ő¿¶\\ÀøíDm¦ÎbŨab‰œaĘ\\ľã‚¸a˜tÎSƐ´©v\\ÖÚÌǴ¤Â‡¨JKr€Z_Z€fjþhPkx€`Y”’RIŒjJcVf~sCN¤ ˆE‚œhæm‰–sHy¨SðÑÌ\\\\ŸĐRZk°IS§fqŒßýáЍÙÉÖ[^¯ǤŲ„ê´\\¦¬ĆPM¯£Ÿˆ»uïpùzEx€žanµyoluqe¦W^£ÊL}ñrkqWňûP™‰UP¡ôJŠoo·ŒU}£Œ„[·¨@XŒĸŸ“‹‹DXm­Ûݏº‡›GU‹CÁª½{íĂ^cj‡k“¶Ã[q¤“LÉö³cux«zZfƒ²BWÇ®Yß½ve±ÃC•ý£W{Ú^’q^sÑ·¨‹ÍOt“¹·C¥‡GD›rí@wÕKţ݋˜Ÿ«V·i}xËÍ÷‘i©ĝ‡ɝǡ]ƒˆ{c™±OW‹³Ya±Ÿ‰_穂Hžĕoƫ€Ňqƒr³‰Lys[„ñ³¯OS–ďOMisZ†±ÅFC¥Pq{‚Ã[Pg}\\—¿ghćO…•k^ģÁFıĉĥM­oEqqZûěʼn³F‘¦oĵ—hŸÕP{¯~TÍlª‰N‰ßY“Ð{Ps{ÃVU™™eĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀff‘dF~ˆ€ĀeĖ€d`sx² šƒ®EżĀdQ‹Âd^~ăÔHˆ¦\\›LKpĄVez¤NP ǹӗR™ÆąJSh­a[¦´Âghwm€BÐ¨źhI|žVVŽ—Ž|p] Â¼èNä¶ÜBÖ¼“L`‚¼bØæŒKV”ŸpoœúNZÞÒKxpw|ÊEMnzEQšŽIZ”ŽZ‡NBˆčÚFÜçmĩ‚WĪñt‘ÞĵÇñZ«uD‚±|Əlij¥ãn·±PmÍa‰–da‡ CL‡Ǒkùó¡³Ï«QaċϑOÃ¥ÕđQȥċƭy‹³ÃA"]],"encodeOffsets":[[[123686,41445]],[[126019,40435]],[[124393,40128]],[[126117,39963]],[[125322,40140]],[[126686,40700]],[[126041,40374]],[[125584,40168]],[[125453,40165]],[[125362,40214]],[[125280,40291]],[[125774,39997]],[[125976,40496]],[[125822,39993]],[[125509,40217]],[[122731,40949]]]},"properties":{"cp":[123.429096,41.796767],"name":"辽宁","childNum":16}},{"id":"220000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@‘p䔳PClƒFbbÍzš€wBG’ĭ€Z„Åi“»ƒlY­ċ²SgŽkÇ£—^S‰“qd¯•‹R…©éŽ£¯S†\\cZ¹iűƏCuƍÓX‡oR}“M^o•£…R}oªU­F…uuXHlEŕ‡€Ï©¤ÛmTŽþ¤D–²ÄufàÀ­XXȱAe„yYw¬dvõ´KÊ£”\\rµÄl”iˆdā]|DÂVŒœH¹ˆÞ®ÜWnŒC”Œķ W‹§@\\¸‹ƒ~¤‹Vp¸‰póIO¢ŠVOšŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð‡¼¤ N°ąO¥«³[ƒéǡű_°Õ\\ÚÊĝŽþâőàerR¨­JYlďQ[ ÏYëЧTGz•tnŠß¡gFkMŸāGÁ¤ia É‰™È¹`\\xs€¬dĆkNnuNUŠ–užP@‚vRY¾•–\\¢…ŒGªóĄ~RãÖÎĢù‚đŴÕhQŽxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp‚]vbÍZuĂ{nˆ^IüœÀSք”¦EŒvRÎûh@℈[‚Əȉô~FNr¯ôçR±ƒ­HÑl•’Ģ–^¤¢‚OðŸŒævxsŒ]ÞÁTĠs¶¿âƊGW¾ìA¦·TѬ†è¥€ÏÐJ¨¼ÒÖ¼ƒƦɄxÊ~S–tD@ŠĂ¼Ŵ¡jlºWžvЉˆzƦZЎ²CH— „Axiukd‹ŒGgetqmcžÛ£Ozy¥cE}|…¾cZ…k‚‰¿uŐã[oxGikfeäT@…šSUwpiÚFM©’£è^ڟ‚`@v¶eň†f h˜eP¶žt“äOlÔUgƒÞzŸU`lœ}ÔÆUvØ_Ō¬Öi^ĉi§²ÃŠB~¡Ĉ™ÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYx‘ƘDVÇĺĿg¿cwÅ\\¹˜¥Yĭlœ¤žOv†šLjM_a W`zļMž·\\swqÝSA‡š—q‰Śij¯Š‘°kŠRē°wx^Đkǂғ„œž“œŽ„‹\\]˜nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°“G³¼XÀ““™¤¹i´o¤ŃšŸÈ`̃DzÄUĞd\\i֚ŒˆmÈBĤÜɲDEh LG¾ƀľ{WaŒYÍȏĢĘÔRîĐj‹}Ǟ“ccj‡oUb½š{“h§Ǿ{K‹ƖµÎ÷žGĀÖŠåưÎs­l›•yiē«‹`姝H¥Ae^§„GK}iã\\c]v©ģZ“mÃ|“[M}ģTɟĵ‘Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜYünĎųVY^’˜ydõkÅZW„«WUa~U·Sb•wGçǑ‚“iW^q‹F‚“›uNĝ—·Ew„‹UtW·Ýďæ©PuqEzwAV•—XR‰ãQ`­©GŒM‡ehc›c”ďϝd‡©ÑW_ϗYƅŒ»…é\\ƒɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ý‘L¡‘ýŸqT^rme™\\Pp•ZZbƒyŸ’uybQ—efµ]UhĿDCmûvašÙNSkCwn‰cćfv~…Y‹„ÇG"],"encodeOffsets":[[130196,42528]]},"properties":{"cp":[125.3245,43.886841],"name":"吉林","childNum":1}},{"id":"230000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@ƨƒĶTLÇyqpÇÛqe{~oyen}s‰`q‡iXG”ù]Ëp½“©lɇÁp]Þñ´FÔ^f‘äîºkà˜z¼BUvÈ@"],["@@UƒµNÿ¥īè灋•HÍøƕ¶LŒǽ|g¨|”™Ža¾pViˆdd”~ÈiŒíďÓQġėǐZ΋ŽXb½|ſÃH½ŸKFgɱCģÛÇA‡n™‹jÕc[VĝDZÃ˄Ç_™ £ń³pŽj£º”š¿”»WH´¯”U¸đĢmžtĜyzzNN|g¸÷äűѱĉā~mq^—Œ[ƒ”››”ƒǁÑďlw]¯xQĔ‰¯l‰’€°řĴrŠ™˜BˆÞTxr[tޏĻN_yŸX`biN™Ku…P›£k‚ZĮ—¦[ºxÆÀdhŽĹŀUÈƗCw’áZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFćš}¢‰A±Äj¨]ĊÕjŋ«×`VuÓś~_kŷVÝyh„“VkÄãPs”Oµ—fŸge‚Ň…µf@u_Ù ÙcŸªNªÙEojVx™T@†ãSefjlwH\\pŏäÀvŠŽlY†½d{†F~¦dyz¤PÜndsrhf‹HcŒvlwjFœ£G˜±DύƥY‡yϊu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|Cš˜zxAè¥bœfudTrFWÁ¹Am|˜ĔĕsķÆF‡´Nš‰}ć…UŠÕ@Áijſmužç’uð^ÊýowŒFzØÎĕNőžǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°ƒUŸzou‡xe]}Ž…AyȑW¯ÌmK‡“Q]‹Īºif¸ÄX|sZt|½ÚUΠlkš^p{f¤lˆºlÆW –€A²˜PVܜPH”Êâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi†`¶—„bXƒrBgxfv»ŽuUiˆŒ^v~”J¬mVp´£Œ´VWrnP½ì¢BX‚¬h™ŠðX¹^TjVœŠriªj™tŊÄm€tPGx¸bgRšŽsT`ZozÆO]’ÒFô҆Oƒ‡ŊŒvŞ”p’cGŒêŠsx´DR–Œ{A†„EOr°Œ•žx|íœbˆ³Wm~DVjºéNN†Ëܲɶ­GƒxŷCStŸ}]ûō•SmtuÇÃĕN•™āg»šíT«u}ç½BĵÞʣ¥ëÊ¡Mێ³ãȅ¡ƋaǩÈÉQ‰†G¢·lG|›„tvgrrf«†ptęŘnŠÅĢr„I²¯LiØsPf˜_vĠd„xM prʹšL¤‹¤‡eˌƒÀđK“žïÙVY§]I‡óáĥ]ķ†Kˆ¥Œj|pŇ\\kzţ¦šnņäÔVĂîά|vW’®l¤èØr‚˜•xm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄ–Ą»ƢjȦOǺ¨ìSŖÆƬy”Qœv`–cwƒZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨS’Œfm Ċ‚ƀP̎ēz©Ċ‚ÄÕÊmgŸÇsJ¥ƔˆŊśæ’΁Ñqv¿íUOµª‰ÂnĦÁ_½ä@ê텣P}Ġ[@gġ}g“ɊדûÏWXá¢užƻÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Ǹ¯YßċġHµ ¡eå`ļƒrĉŘóƢFì“ĎWøxÊk†”ƈdƬv|–I|·©NqńRŀƒ¤é”eŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^Xm‡—HĊĕË«W·ċëx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ħ…ŨK~”ȰCĐ´Ƕ£’fNÎèâw¢XnŮeÂÆĶŽ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®‚ØCÔ ŬGƠ”ƦYĜ‡ĘÜƬDJ—g_ͥœ@čŅĻA“¶¯@wÎqC½Ĉ»NŸăëK™ďÍQ“Ùƫ[«Ãí•gßÔÇOÝáW‘ñuZ“¯ĥ€Ÿŕā¡ÑķJu¤E Ÿå¯°WKɱ_d_}}vyŸõu¬ï¹ÓU±½@gÏ¿rýD‰†g…Cd‰µ—°MFYxw¿CG£‹Rƛ½Õ{]L§{qqąš¿BÇƻğëšܭNJË|c²}Fµ}›ÙRsÓpg±ŠQNqǫŋRwŕnéÑÉKŸ†«SeYR…ŋ‹@{¤SJ}šD Ûǖ֍Ÿ]gr¡µŷjqWÛham³~S«“„›Þ]"]],"encodeOffsets":[[[127123,51780]],[[134456,44547]]]},"properties":{"cp":[126.642464,45.756967],"name":"黑龙江","childNum":2}},{"id":"320000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@cþÅPiŠ`ZŸRu¥É\\]~°ŽY`µ†Óƒ^phÁbnÀşúŽòa–ĬºTÖŒb‚˜e¦¦€{¸ZâćNpŒ©žHr|^ˆmjhŠSEb\\afv`sz^lkŽlj‹Ätg‹¤D˜­¾Xš¿À’|ДiZ„ȀåB·î}GL¢õcßjaŸyBFµÏC^ĭ•cÙt¿sğH]j{s©HM¢ƒQnDÀ©DaÜތ·jgàiDbPufjDk`dPOîƒhw¡ĥ‡¥šG˜ŸP²ĐobºrY†„î¶aHŢ´ ]´‚rılw³r_{£DB_Ûdåuk|ˆŨ¯F Cºyr{XFy™e³Þċ‡¿Â™kĭB¿„MvÛpm`rÚã”@ƹhågËÖƿxnlč¶Åì½Ot¾dJlŠVJʜǀœŞqvnOŠ^ŸJ”Z‘ż·Q}ê͎ÅmµÒ]Žƍ¦Dq}¬R^èĂ´ŀĻĊIԒtžIJyQŐĠMNtœR®òLh‰›Ěs©»œ}OӌGZz¶A\\jĨFˆäOĤ˜HYš†JvÞHNiÜaϚɖnFQlšNM¤ˆB´ĄNöɂtp–Ŭdf先‹qm¿QûŠùއÚb¤uŃJŴu»¹Ą•lȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Y™xci‡tğ®jű¢KOķ•Coy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋĝÄ͎ī‰çÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıDž_k}¢m[ÝóDµ—¡RLčiXy‡ÅNïă¡¸iĔϑNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCt‹OPrƒE^ÒoŠg™ĉIµžÛÅʹK…¤½phMŠü`o怆ŀ"],"encodeOffsets":[[121740,32276]]},"properties":{"cp":[118.767413,32.041544],"name":"江苏","childNum":1}},{"id":"330000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@E^dQ]K"],["@@jX^j‡"],["@@sfŠbU‡"],["@@qP\\xz[ck"],["@@‘Rƒ¢‚FX}°[s_"],["@@Cbœ\\—}"],["@@e|v\\la{u"],["@@v~u}"],["@@QxÂF¯}"],["@@¹nŒvÞs¯o"],["@@rSkUEj"],["@@bi­ZŒP"],["@@p[}INf"],["@@À¿€"],["@@¹dnbŒ…"],["@@rSŸBnR"],["@@g~h}"],["@@FlEk"],["@@OdPc"],["@@v[u\\"],["@@FjâL~wyoo~›sµL–\\"],["@@¬e¹aNˆ"],["@@\\nÔ¡q]L³ë\\ÿ®ŒQ֎"],["@@ÊA­©[¬"],["@@KxŒv­"],["@@@hlIk]"],["@@pW{o||j"],["@@Md|_mC"],["@@¢…X£ÏylD¼XˆtH"],["@@hlÜ[LykAvyfw^Ež›¤"],["@@fp¤Mus“R"],["@@®_ma~•LÁ¬šZ"],["@@iM„xZ"],["@@ZcYd"],["@@Z~dOSo|A¿qZv"],["@@@`”EN¡v"],["@@|–TY{"],["@@@n@m"],["@@XWkCT\\"],["@@ºwšZRkĕWO¢"],["@@™X®±Grƪ\\ÔáXq{‹"],["@@ůTG°ĄLHm°UC‹"],["@@¤Ž€aÜx~}dtüGæţŎíĔcŖpMËВj碷ðĄÆMzˆjWKĎ¢Q¶˜À_꒔_Bı€i«pZ€gf€¤Nrq]§ĂN®«H±‡yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªˆŠÁŖHŗʼnåqûõi¨hÜ·ƒñt»¹ýv_[«¸m‰YL¯‰Qª…mĉÅdMˆ•gÇjcº«•ęœ¬­K­´ƒB«Âącoċ\\xKd¡gěŧ«®á’[~ıxu·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZB{ŠaM‘µ‰fzʼnfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®‚\\ßðCšh™iqªĭiAu‡A­µ”_W¥ƣO\\lċĢttC¨£t`ˆ™PZäuXßBs‡Ļyek€OđġĵHuXBšµ]׌‡­­\\›°®¬F¢¾pµ¼kŘó¬Wät’¸|@ž•L¨¸µr“ºù³Ù~§WI‹ŸZWŽ®’±Ð¨ÒÉx€`‰²pĜ•rOògtÁZ}þÙ]„’¡ŒŸFK‚wsPlU[}¦Rvn`hq¬\\”nQ´ĘRWb”‚_ rtČFI֊kŠŠĦPJ¶ÖÀÖJĈĄTĚòžC ²@Pú…Øzœ©PœCÈÚœĒ±„hŖ‡l¬â~nm¨f©–iļ«m‡nt–u†ÖZÜÄj“ŠLŽ®E̜Fª²iÊxبžIÈhhst"],["@@o\\V’zRZ}y"],["@@†@°¡mۛGĕ¨§Ianá[ýƤjfæ‡ØL–•äGr™"]],"encodeOffsets":[[[125592,31553]],[[125785,31436]],[[125729,31431]],[[125513,31380]],[[125223,30438]],[[125115,30114]],[[124815,29155]],[[124419,28746]],[[124095,28635]],[[124005,28609]],[[125000,30713]],[[125111,30698]],[[125078,30682]],[[125150,30684]],[[124014,28103]],[[125008,31331]],[[125411,31468]],[[125329,31479]],[[125626,30916]],[[125417,30956]],[[125254,30976]],[[125199,30997]],[[125095,31058]],[[125083,30915]],[[124885,31015]],[[125218,30798]],[[124867,30838]],[[124755,30788]],[[124802,30809]],[[125267,30657]],[[125218,30578]],[[125200,30562]],[[124968,30474]],[[125167,30396]],[[124955,29879]],[[124714,29781]],[[124762,29462]],[[124325,28754]],[[123990,28459]],[[125366,31477]],[[125115,30363]],[[125369,31139]],[[122495,31878]],[[125329,30690]],[[125192,30787]]]},"properties":{"cp":[120.153576,30.287459],"name":"浙江","childNum":45}},{"id":"340000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@^iuLX^"],["@@‚e©Ehl"],["@@°ZÆëϵmkǀwÌÕæhºgBĝâqÙĊz›ÖgņtÀÁÊÆá’hEz|WzqD¹€Ÿ°E‡ŧl{ævÜcA`¤C`|´qžxIJkq^³³ŸGšµbƒíZ…¹qpa±ď OH—¦™Ħˆx¢„gPícOl_iCveaOjCh߸i݋bÛªCC¿€m„RV§¢A|t^iĠGÀtÚs–d]ĮÐDE¶zAb àiödK¡~H¸íæAžǿYƒ“j{ď¿‘™À½W—®£ChŒÃsiŒkkly]_teu[bFa‰Tig‡n{]Gqªo‹ĈMYá|·¥f¥—őaSÕė™NµñĞ«ImŒ_m¿Âa]uĜp …Z_§{Cƒäg¤°r[_Yj‰ÆOdý“[ŽI[á·¥“Q_n‡ùgL¾mv™ˊBÜÆ¶ĊJhšp“c¹˜O]iŠ]œ¥ jtsggJǧw×jÉ©±›EFˍ­‰Ki”ÛÃÕYv…s•ˆm¬njĻª•§emná}k«ŕˆƒgđ²Ù›DǤ›í¡ªOy›†×Où±@DŸñSęćăÕIÕ¿IµĥO‰‰jNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßŽF¶žX®¿‰mŒ™w…RIޓfßoG‘³¾©uyH‘į{Ɓħ¯AFnuP…ÍÔzšŒV—dàôº^Ðæd´€‡oG¤{S‰¬ćxã}›ŧ×Kǥĩ«žÕOEзÖdÖsƘѨ[’Û^Xr¢¼˜§xvěƵ`K”§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē…ßúLÃϖ_ÈÏ|]ÂÏFl”g`bšežž€n¾¢pU‚h~ƴ˶_‚r sĄ~cž”ƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³…]’u}›f…ïQl{skl“oNdŸjŸäËzDvčoQŠďHI¦rb“tHĔ~BmlRš—V_„ħTLnñH±’DžœL‘¼L˜ªl§Ťa¸ŒĚlK²€\\RòvDcÎJbt[¤€D@®hh~kt°ǾzÖ@¾ªdb„YhüóZ ň¶vHrľ\\ʗJuxAT|dmÀO„‹[ÃԋG·ĚąĐlŪÚpSJ¨ĸˆLvÞcPæķŨŽ®mАˆálŸwKhïgA¢ųƩޖ¤OȜm’°ŒK´"]],"encodeOffsets":[[[121722,32278]],[[119475,30423]],[[119168,35472]]]},"properties":{"cp":[117.283042,31.86119],"name":"安徽","childNum":3}},{"id":"350000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@“zht´‡]"],["@@aj^~ĆG—©O"],["@@ed¨„C}}i"],["@@@vˆPGsQ"],["@@‰sBz‚ddW]Q"],["@@SލQ“{"],["@@NŽVucW"],["@@qptBAq"],["@@‰’¸[mu"],["@@Q\\pD]_"],["@@jSwUadpF"],["@@eXª~ƒ•"],["@@AjvFso"],["@@fT–›_Çí\\Ÿ™—v|ba¦jZÆy€°"],["@@IjJi"],["@@wJI€ˆxš«¼AoNe{M­"],["@@K‰±¡Óˆ”ČäeZ"],["@@k¡¹Eh~c®wBk‹UplÀ¡I•~Māe£bN¨gZý¡a±Öcp©PhžI”Ÿ¢Qq…ÇGj‹|¥U™ g[Ky¬ŏ–v@OpˆtÉEŸF„\\@ åA¬ˆV{Xģ‰ĐBy…cpě…¼³Ăp·¤ƒ¥o“hqqÚ¡ŅLsƒ^ᗞ§qlŸÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěcݧSùĩąSWó«íęACµ›eR—åǃRCÒÇZÍ¢‹ź±^dlsŒtjD¸•‚ZpužÔâÒH¾oLUêÃÔjjēò´ĄW‚ƛ…^Ñ¥‹ĦŸ@Çò–ŠmŒƒOw¡õyJ†yD}¢ďÑÈġfŠZd–a©º²z£šN–ƒjD°Ötj¶¬ZSÎ~¾c°¶Ðm˜x‚O¸¢Pl´žSL|¥žA†ȪĖM’ņIJg®áIJČĒü` ŽQF‡¬h|ÓJ@zµ |ê³È ¸UÖŬŬÀEttĸr‚]€˜ðŽM¤ĶIJHtÏ A’†žĬkvsq‡^aÎbvŒd–™fÊòSD€´Z^’xPsÞrv‹ƞŀ˜jJd×ŘÉ ®A–ΦĤd€xĆqAŒ†ZR”ÀMźŒnĊ»ŒİÐZ— YX–æJŠyĊ²ˆ·¶q§·–K@·{s‘Xãô«lŗ¶»o½E¡­«¢±¨Yˆ®Ø‹¶^A™vWĶGĒĢžPlzfˆļŽtàAvWYãšO_‡¤sD§ssČġ[kƤPX¦Ž`¶“ž®ˆBBvĪjv©šjx[L¥àï[F…¼ÍË»ğV`«•Ip™}ccÅĥZE‹ãoP…´B@ŠD—¸m±“z«Ƴ—¿å³BRضˆœWlâþäą`“]Z£Tc— ĹGµ¶H™m@_©—kŒ‰¾xĨ‡ôȉðX«½đCIbćqK³Á‹Äš¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNxij¤D¢ŽîĎÎB§°_JœGsƒ¥E@…¤uć…P‘å†cuMuw¢BI¿‡]zG¹guĮck\\_"]],"encodeOffsets":[[[123250,27563]],[[122541,27268]],[[123020,27189]],[[122916,27125]],[[122887,26845]],[[122808,26762]],[[122568,25912]],[[122778,26197]],[[122515,26757]],[[122816,26587]],[[123388,27005]],[[122450,26243]],[[122578,25962]],[[121255,25103]],[[120987,24903]],[[122339,25802]],[[121042,25093]],[[122439,26024]]]},"properties":{"cp":[119.306239,26.075302],"name":"福建","childNum":18}},{"id":"360000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ĢĨƐgÂMD~ņªe^\\^§„ý©j׍cZ†Ø¨zdÒa¶ˆlҍJŒìõ`oz÷@¤u޸´†ôęöY¼‰HČƶajlÞƩ¥éZ[”|h}^U Œ ¥p„ĄžƦO lt¸Æ €Q\\€ŠaÆ|CnÂOjt­ĚĤd’ÈŒF`’¶„@Ð딠¦ōҞ¨Sêv†HĢûXD®…QgėWiØPÞìºr¤dž€NĠ¢l–•ĄtZoœCƞÔºCxrpĠV®Ê{f_Y`_ƒeq’’®Aot`@o‚DXfkp¨|Šs¬\\D‘ÄSfè©Hn¬…^DhÆyøJh“ØxĢĀLʈ„ƠPżċĄwȠ̦G®ǒĤäTŠÆ~ĦwŠ«|TF¡Šn€c³Ïå¹]ĉđxe{ÎӐ†vOEm°BƂĨİ|G’vz½ª´€H’àp”eJ݆Qšxn‹ÀŠW­žEµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[“r«_gŽmQu~¥V\\OkxtL E¢‹ƒ‘Ú^~ýê‹Pó–qo슱_Êw§ÑªåƗ⼋mĉŹ‹¿NQ“…YB‹ąrwģcÍ¥B•Ÿ­ŗÊcØiI—žƝĿuŒqtāwO]‘³YCñTeɕš‹caub͈]trlu€ī…B‘ПGsĵıN£ï—^ķqss¿FūūV՟·´Ç{éĈý‰ÿ›OEˆR_ŸđûIċâJh­ŅıN‘ȩĕB…¦K{Tk³¡OP·wn—µÏd¯}½TÍ«YiµÕsC¯„iM•¤™­•¦¯P|ÿUHv“he¥oFTu‰õ\\ŽOSs‹MòđƇiaºćXŸĊĵà·çhƃ÷ǜ{‘ígu^›đg’m[×zkKN‘¶Õ»lčÓ{XSƉv©_ÈëJbVk„ĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B„±’ÌŒK˜y’áV‡¼Ã~­…`g›ŸsÙfI›Ƌlę¹e|–~udjˆuTlXµf`¿JdŠ[\\˜„L‚‘²"],"encodeOffsets":[[116689,26234]]},"properties":{"cp":[115.892151,28.676493],"name":"江西","childNum":1}},{"id":"370000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@Xjd]{K"],["@@itbFHy"],["@@HlGk"],["@@T‚ŒGŸy"],["@@K¬˜•‹U"],["@@WdXc"],["@@PtOs"],["@@•LnXhc"],["@@ppVƒu]Or"],["@@cdzAUa"],["@@udRhnCI‡"],["@@ˆoIƒpR„"],["@@Ľč{fzƤî’Kš–ÎMĮ]†—ZFˆ½Y]â£ph’™š¶¨râøÀ†ÎǨ¤^ºÄ”Gzˆ~grĚĜlĞÆ„LĆdž¢Îo¦–cv“Kb€gr°Wh”mZp ˆL]LºcU‰Æ­n”żĤÌǜbAnrOAœ´žȊcÀbƦUØrĆUÜøœĬƞ†š˜Ez„VL®öØBkŖÝĐ˹ŧ̄±ÀbÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿ¸‘lµ¾Z|†ZWyFYŸ¨Mf~C¿`€à_RÇzwƌfQnny´INoƬˆèôº|sT„JUš›‚L„îVj„ǎ¾Ē؍‚Dz²XPn±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«M`‡¶d¡ô‰Ö°šmȰBÔjjŒ´PM|”c^d¤u•ƒ¤Û´Œä«ƢfPk¶Môlˆ]Lb„}su^ke{lC‘…M•rDŠÇ­]NÑFsmoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøCǷ돡ąuhÛ¡^Kx•C`C\\bÅxì²ĝÝ¿_N‰īCȽĿåB¥¢·IŖÕy\\‡¹kx‡Ã£Č×GDyÕ¤ÁçFQ¡„KtŵƋ]CgÏAùSed‡cÚź—ŠuYfƒyMmhUWpSyGwMPqŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕBmœ@Io‚g——Z¯u‹TMx}C‘‰VK‚ï{éƵP—™_K«™pÛÙqċtkkù]gŽ‹Tğwo•ɁsMõ³ă‡AN£™MRkmEʕč™ÛbMjÝGu…IZ™—GPģ‡ãħE[iµBEuŸDPԛ~ª¼ętŠœ]ŒûG§€¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏY’I“] P‰umŝrƿ›‰›Iā‹[x‰edz‹L‘¯v¯s¬ÁY…~}…ťuٌg›ƋpÝĄ_ņī¶ÏSR´ÁP~ž¿Cyžċßdwk´Ss•X|t‰`Ä Èð€AªìÎT°¦Dd–€a^lĎDĶÚY°Ž`ĪŴǒˆ”àŠv\\ebŒZH„ŖR¬ŢƱùęO•ÑM­³FۃWp[ƒ"]],"encodeOffsets":[[[123806,39303]],[[123821,39266]],[[123742,39256]],[[123702,39203]],[[123649,39066]],[[123847,38933]],[[123580,38839]],[[123894,37288]],[[123043,36624]],[[123344,38676]],[[123522,38857]],[[123628,38858]],[[118260,36742]]]},"properties":{"cp":[117.000923,36.675807],"name":"山东","childNum":13}},{"id":"410000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@•ýL™ùµP³swIÓxcŢĞð†´E®žÚPt†ĴXØx¶˜@«ŕŕQGƒ‹Yfa[şu“ßǩ™đš_X³ijÕčC]kbc•¥CS¯ëÍB©÷‹–³­Siˆ_}m˜YTtž³xlàcȂzÀD}ÂOQ³ÐTĨ¯†ƗòËŖ[hœł‹Ŧv~††}ÂZž«¤lPǕ£ªÝŴÅR§ØnhcŒtâk‡nύ­ľŹUÓÝdKuķ‡I§oTũÙďkęĆH¸ÓŒ\\ăŒ¿PcnS{wBIvɘĽ[GqµuŸŇôYgûƒZcaŽ©@½Õǽys¯}lgg@­C\\£as€IdÍuCQñ[L±ęk·‹ţb¨©kK—’»›KC²‘òGKmĨS`ƒ˜UQ™nk}AGē”sqaJ¥ĐGR‰ĎpCuÌy ã iMc”plk|tRk†ðœev~^‘´†¦ÜŽSí¿_iyjI|ȑ|¿_»d}qŸ^{“Ƈdă}Ÿtqµ`Ƴĕg}V¡om½fa™Ço³TTj¥„tĠ—Ry”K{ùÓjuµ{t}uËR‘iŸvGŠçJFjµŠÍyqΘàQÂFewixGw½Yŷpµú³XU›½ġy™łå‰kÚwZXˆ·l„¢Á¢K”zO„Λ΀jc¼htoDHr…|­J“½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ…Ťƒ]MÛfaQpě±ǽ¾]u­Fu‹÷nƒ™čįADp}AjmcEǒaª³o³ÆÍSƇĈÙDIzˑ赟^ˆKLœ—i—Þñ€[œƒaA²zz‰Ì÷Dœ|[šíijgf‚ÕÞd®|`ƒĆ~„oĠƑô³Ŋ‘D×°¯CsŠøÀ«ì‰UMhTº¨¸ǡîS–Ô„DruÂÇZ•ÖEŽ’vPZ„žW”~؋ÐtĄE¢¦Ðy¸bŠô´oŬ¬Ž²Ês~€€]®tªašpŎJ¨Öº„_ŠŔ–`’Ŗ^Ѝ\\Ĝu–”~m²Ƹ›¸fW‰ĦrƔ}Î^gjdfÔ¡J}\\n C˜¦þWxªJRÔŠu¬ĨĨmF†dM{\\d\\ŠYÊ¢ú@@¦ª²SŠÜsC–}fNècbpRmlØ^g„d¢aÒ¢CZˆZxvÆ¶N¿’¢T@€uCœ¬^ĊðÄn|žlGl’™Rjsp¢ED}€Fio~ÔNŽ‹„~zkĘHVsDzßjƒŬŒŠŢ`Pûàl¢˜\\ÀœEhŽİgÞē X¼Pk–„|m"],"encodeOffsets":[[118256,37017]]},"properties":{"cp":[113.665412,34.757975],"name":"河南","childNum":1}},{"id":"420000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AB‚"],["@@lskt"],["@@¾«}{ra®pîÃ\\™›{øCŠËyyB±„b\\›ò˜Ý˜jK›‡L ]ĎĽÌ’JyÚCƈćÎT´Å´pb©È‘dFin~BCo°BĎĚømvŒ®E^vǾ½Ĝ²Ro‚bÜeNŽ„^ĺ£R†¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I”¾®I†{GqpCgyl{‡£œÍƒÍyPL“¡ƒ¡¸kW‡xYlÙæŠšŁĢzœ¾žV´W¶ùŸo¾ZHxjwfx„GNÁ•³Xéæl¶‰EièIH‰ u’jÌQ~v|sv¶Ôi|ú¢Fh˜Qsğ¦ƒSiŠBg™ÐE^ÁÐ{–čnOÂȞUÎóĔ†ÊēIJ}Z³½Mŧïeyp·uk³DsѨŸL“¶_œÅuèw»—€¡WqÜ]\\‘Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟO‡ƒKÉġÿ×wg”÷IÅzCg†]m«ªGeçÃTC’«[‰t§{loWeC@ps_Bp‘­r‘„f_``Z|ei¡—oċMqow€¹DƝӛDYpûs•–‹Ykıǃ}s¥ç³[§ŸcYЧHK„«Qy‰]¢“wwö€¸ïx¼ņ¾Xv®ÇÀµRĠЋžHMž±cÏd„ƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy…¿³x¯N‰o‰|¹H™ÏÛm‹júË~Tš•u˜ęjCöAwě¬R’đl¯ Ñb­‰ŇT†Ŀ_[Œ‘IčĄʿnM¦ğ\\É[T·™k¹œ©oĕ@A¾w•ya¥Y\\¥Âaz¯ãÁ¡k¥ne£Ûw†E©Êō¶˓uoj_Uƒ¡cF¹­[Wv“P©w—huÕyBF“ƒ`R‹qJUw\\i¡{jŸŸEPïÿ½fć…QÑÀQ{ž‚°‡fLԁ~wXg—ītêݾ–ĺ‘Hdˆ³fJd]‹HJ²…E€ƒoU¥†HhwQsƐ»Xmg±çve›]Dm͂PˆoCc¾‹_h”–høYrŊU¶eD°Č_N~øĹĚ·`z’]Äþp¼…äÌQŒv\\rCŒé¾TnkžŐڀÜa‡“¼ÝƆ̶Ûo…d…ĔňТJq’Pb ¾|JŒ¾fXŠƐîĨ_Z¯À}úƲ‹N_ĒĊ^„‘ĈaŐyp»CÇĕKŠšñL³ŠġMŒ²wrIÒŭxjb[œžn«øœ˜—æˆàƒ ^²­h¯Ú€ŐªÞ¸€Y²ĒVø}Ā^İ™´‚LŠÚm„¥ÀJÞ{JVŒųÞŃx×sxxƈē ģMř–ÚðòIf–Ċ“Œ\\Ʈ±ŒdʧĘD†vČ_Àæ~DŒċ´A®µ†¨ØLV¦êHÒ¤"]],"encodeOffsets":[[[113712,34000]],[[115612,30507]],[[113649,34054]]]},"properties":{"cp":[114.298572,30.584355],"name":"湖北","childNum":3}},{"id":"430000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@—n„FTs"],["@@ßÅÆá‰½ÔXr—†CO™“…ËR‘ïÿĩ­TooQyšÓ[‹ŅBE¬–ÎÓXa„į§Ã¸G °ITxp‰úxÚij¥Ïš–̾ŠedžÄ©ĸG…œàGh‚€M¤–Â_U}Ċ}¢pczfŠþg¤€”ÇòAV‘‹M"],["@@©K—ƒA·³CQ±Á«³BUŠƑ¹AŠtćOw™D]ŒJiØSm¯b£‘ylƒ›X…HËѱH•«–‘C^õľA–Å§¤É¥„ïyuǙuA¢^{ÌC´­¦ŷJ£^[†“ª¿‡ĕ~•Ƈ…•N… skóā‡¹¿€ï]ă~÷O§­@—Vm¡‹Qđ¦¢Ĥ{ºjԏŽŒª¥nf´•~ÕoŸž×Ûą‹MąıuZœmZcÒ IJβSÊDŽŶ¨ƚƒ’CÖŎªQؼrŭŽ­«}NÏürʬŒmjr€@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hTœ}mĉ–¹¥ě‰Dÿë©ıÓ[Oº£ž“¥ót€ł¹MՄžƪƒ`Pš…Di–ÛUоÅ‌ìˆU’ñB“È£ýhe‰dy¡oċ€`pfmjP~‚kZa…ZsÐd°wj§ƒ@€Ĵ®w~^‚kÀÅKvNmX\\¨a“”сqvíó¿F„¤¡@ũÑVw}S@j}¾«pĂr–ªg àÀ²NJ¶¶Dô…K‚|^ª†Ž°LX¾ŴäPᜣEXd›”^¶›IJÞܓ~‘u¸ǔ˜Ž›MRhsR…e†`ÄofIÔ\\Ø  i”ćymnú¨cj ¢»–GČìƊÿШXeĈ¾Oð Fi ¢|[jVxrIQŒ„_E”zAN¦zLU`œcªx”OTu RLÄ¢dV„i`p˔vŎµªÉžF~ƒØ€d¢ºgİàw¸Áb[¦Zb¦–z½xBĖ@ªpº›šlS¸Ö\\Ĕ[N¥ˀmĎă’J\\‹ŀ`€…ňSڊĖÁĐiO“Ĝ«BxDõĚiv—ž–S™Ì}iùŒžÜnšÐºGŠ{Šp°M´w†ÀÒzJ²ò¨ oTçüöoÛÿñŽőФ‚ùTz²CȆȸǎۃƑÐc°dPÎŸğ˶[Ƚu¯½WM¡­Éž“’B·rížnZŸÒ `‡¨GA¾\\pē˜XhÆRC­üWGġu…T靧Ŏѝ©ò³I±³}_‘‹EÃħg®ęisÁPDmÅ{‰b[Rşs·€kPŸŽƥƒóRo”O‹ŸVŸ~]{g\\“êYƪ¦kÝbiċƵŠGZ»Ěõ…ó·³vŝž£ø@pyö_‹ëŽIkѵ‡bcѧy…×dY؎ªiþž¨ƒ[]f]Ņ©C}ÁN‡»hĻħƏ’ĩ"]],"encodeOffsets":[[[115640,30489]],[[112543,27312]],[[116690,26230]]]},"properties":{"cp":[112.982279,28.19409],"name":"湖南","childNum":3}},{"id":"440000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@QdˆAua"],["@@ƒlxDLo"],["@@sbhNLo"],["@@Ă āŸ"],["@@WltO[["],["@@Krœ]S"],["@@e„„I]y"],["@@I|„Mym"],["@@ƒÛ³LSŒž¼Y"],["@@nvºB–ëui©`¾"],["@@zdšÛ›Jw®"],["@@†°…¯"],["@@a yAª¸ËJIx،@€ĀHAmßV¡o•fu•o"],["@@šs‰ŗÃÔėAƁ›ZšÄ ~°ČP‚‹äh"],["@@‹¶Ý’Ì‚vmĞh­ı‡Q"],["@@HœŠdSjĒ¢D}war…“u«ZqadYM"],["@@elŒ\\LqqU"],["@@~rMo\\"],["@@f„^ƒC"],["@@øPªoj÷ÍÝħXČx”°Q¨ıXNv"],["@@gÇƳˆŽˆ”oˆŠˆ[~tly"],["@@E–ÆC¿‘"],["@@OŽP"],["@@w‹†đóg‰™ĝ—[³‹¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰ĥ‡¡«BhlmtÃPµyU¯uc“d·w_bŝcīímGOŽ|KP’ȏ‡ŹãŝIŕŭŕ@Óoo¿ē‹±ß}Ž…ŭ‚ŸIJWÈCőâUâǙI›ğʼn©I›ijEׅÁ”³Aó›wXJþ±ÌŒÜӔĨ£L]ĈÙƺZǾĆĖMĸĤfŒÎĵl•ŨnȈ‘ĐtF”Š–FĤ–‚êk¶œ^k°f¶gŠŽœ}®Fa˜f`vXŲxl˜„¦–ÔÁ²¬ÐŸ¦pqÊ̲ˆi€XŸØRDÎ}†Ä@ZĠ’s„x®AR~®ETtĄZ†–ƈfŠŠHâÒÐA†µ\\S¸„^wĖkRzŠalŽŜ|E¨ÈNĀňZTŒ’pBh£\\ŒĎƀuXĖtKL–¶G|Ž»ĺEļĞ~ÜĢÛĊrˆO˜Ùîvd]nˆ¬VœÊĜ°R֟pM††–‚ƂªFbwžEÀˆ˜©Œž\\…¤]ŸI®¥D³|ˎ]CöAŤ¦…æ’´¥¸Lv¼€•¢ĽBaô–F~—š®²GÌҐEY„„œzk¤’°ahlV՞I^‹šCxĈPŽsB‰ƒºV‰¸@¾ªR²ĨN]´_eavSi‡vc•}p}Đ¼ƌkJœÚe thœ†_¸ ºx±ò_xN›Ë‹²‘@ƒă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIžÇª`ŠuTÅxYĒÖ¼k֞’µ‚MžjJÚwn\\h‘œĒv]îh|’È›Ƅøègž¸Ķß ĉĈWb¹ƀdéƌNTtP[ŠöSvrCZžžaGuœbo´ŖÒÇА~¡zCI…özx¢„Pn‹•‰Èñ @ŒĥÒ¦†]ƞŠV}³ăĔñiiÄÓVépKG½Ä‘ÓávYo–C·sit‹iaÀy„ŧΡÈYDÑům}‰ý|m[węõĉZÅxUO}÷N¹³ĉo_qtă“qwµŁYلǝŕ¹tïÛUïmRCº…ˆĭ|µ›ÕÊK™½R‘ē ó]‘–GªęAx–»HO£|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™á²\\‹ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀLJğ·¿ÃˆOj YÇ÷Qě‹i"]],"encodeOffsets":[[[117381,22988]],[[116552,22934]],[[116790,22617]],[[116973,22545]],[[116444,22536]],[[116931,22515]],[[116496,22490]],[[116453,22449]],[[113301,21439]],[[118726,21604]],[[118709,21486]],[[113210,20816]],[[115482,22082]],[[113171,21585]],[[113199,21590]],[[115232,22102]],[[115739,22373]],[[115134,22184]],[[113056,21175]],[[119573,21271]],[[119957,24020]],[[115859,22356]],[[116561,22649]],[[116285,22746]]]},"properties":{"cp":[113.280637,23.125178],"name":"广东","childNum":24}},{"id":"450000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@H– TQ§•A"],["@@ĨʪƒLƒƊDÎĹĐCǦė¸zÚGn£¾›rªŀÜt¬@֛ڈSx~øOŒ˜ŶÐÂæȠ\\„ÈÜObĖw^oބLf¬°bI lTØB̈F£Ć¹gñĤaY“t¿¤VSñœK¸¤nM†¼‚JE±„½¸šŠño‹ÜCƆæĪ^ŠĚQÖ¦^‡ˆˆf´Q†üÜʝz¯šlzUĺš@쇀p¶n]sxtx¶@„~ÒĂJb©gk‚{°‚~c°`ԙ¬rV\\“la¼¤ôá`¯¹LC†ÆbŒxEræO‚v[H­˜„[~|aB£ÖsºdAĐzNÂðsŽÞƔ…Ĥªbƒ–ab`ho¡³F«èVloޤ™ÔRzpp®SŽĪº¨ÖƒºN…ij„d`’a”¦¤F³ºDÎńĀìŠCžĜº¦Ċ•~nS›|gźvZkCÆj°zVÈÁƔ]LÊFZg…čP­kini«‹qǀcz͔Y®¬Ů»qR×ō©DՄ‘§ƙǃŵTÉĩ±ŸıdÑnYY›IJvNĆÌØÜ Öp–}e³¦m‹©iÓ|¹Ÿħņ›|ª¦QF¢Â¬ʖovg¿em‡^ucà÷gՎuŒíÙćĝ}FϼĹ{µHK•sLSđƃr‹č¤[Ag‘oS‹ŇYMÿ§Ç{Fśbky‰lQxĕƒ]T·¶[B…ÑÏGáşşƇe€…•ăYSs­FQ}­Bƒw‘tYğÃ@~…C̀Q ×W‡j˱rÉ¥oÏ ±«ÓÂ¥•ƒ€k—ŽwWűŒmcih³K›~‰µh¯e]lµ›él•E쉕E“ďs‡’mǖŧē`ãògK_ÛsUʝ“ćğ¶hŒöŒO¤Ǜn³Žc‘`¡y‹¦C‘ez€YŠwa™–‘[ďĵűMę§]X˜Î_‚훘Û]é’ÛUćİÕBƣ±…dƒy¹T^džûÅÑŦ·‡PĻþÙ`K€¦˜…¢ÍeœĥR¿Œ³£[~Œäu¼dl‰t‚†W¸oRM¢ď\\zœ}Æzdvň–{ÎXF¶°Â_„ÒÂÏL©Ö•TmuŸ¼ãl‰›īkiqéfA„·Êµ\\őDc¥ÝF“y›Ôć˜c€űH_hL܋êĺШc}rn`½„Ì@¸¶ªVLŒŠhŒ‹\\•Ţĺk~ŽĠið°|gŒtTĭĸ^x‘vK˜VGréAé‘bUu›MJ‰VÃO¡…qĂXËS‰ģãlýàŸ_ju‡YÛÒB†œG^˜é֊¶§ŽƒEG”ÅzěƒƯ¤Ek‡N[kdåucé¬dnYpAyČ{`]þ¯T’bÜÈk‚¡Ġ•vŒàh„ÂƄ¢Jî¶²"]],"encodeOffsets":[[[111707,21520]],[[107619,25527]]]},"properties":{"cp":[108.320004,22.82402],"name":"广西","childNum":2}},{"id":"460000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@š¦Ŝil¢”XƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅kÇm@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĀÒRŒšZdž™zÐŘΰH¨Ƣb²_Ġ "],"encodeOffsets":[[112750,20508]]},"properties":{"cp":[110.33119,20.031971],"name":"海南","childNum":1}},{"id":"510000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@LqKr"],["@@Š[ĻéV£ž_ţġñpG •réÏ·~ąSfy×͂·ºſƽiÍıƣıĻmHH}siaX@iǰÁÃ×t«ƒ­Tƒ¤J–JJŒyJ•ÈŠ`Ohߦ¡uËhIyCjmÿw…ZG……Ti‹SˆsO‰žB²ŸfNmsPaˆ{M{ŠõE‘^Hj}gYpaeuž¯‘oáwHjÁ½M¡pM“–uå‡mni{fk”\\oƒÎqCw†EZ¼K›ĝŠƒAy{m÷L‡wO×SimRI¯rK™õBS«sFe‡]fµ¢óY_ÆPRcue°Cbo׌bd£ŌIHgtrnyPt¦foaXďx›lBowz‹_{ÊéWiêE„GhܸºuFĈIxf®Ž•Y½ĀǙ]¤EyŸF²ċ’w¸¿@g¢§RGv»–áŸW`ÃĵJwi]t¥wO­½a[׈]`Ãi­üL€¦LabbTÀå’c}Íh™Æhˆ‹®BH€î|Ék­¤S†y£„ia©taį·Ɖ`ō¥Uh“O…ƒĝLk}©Fos‰´›Jm„µlŁu—…ø–nÑJWΪ–YÀïAetTžŅ‚ӍG™Ë«bo‰{ıwodƟ½ƒžOġܑµxàNÖ¾P²§HKv¾–]|•B‡ÆåoZ`¡Ø`ÀmºĠ~ÌЧnDž¿¤]wğ@sƒ‰rğu‰~‘Io”[é±¹ ¿žſđӉ@q‹gˆ¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@ỗs›Zϕ‹œÅĭ€Ƌ•ěpwDóÖሯneQˌq·•GCœýS]xŸ·ý‹q³•O՜Œ¶Qzßti{ř‰áÍÇWŝŭñzÇW‹pç¿JŒ™‚Xœĩè½cŒF–ÂLiVjx}\\N†ŇĖ¥Ge–“JA¼ÄHfÈu~¸Æ«dE³ÉMA|b˜Ò…˜ćhG¬CM‚õŠ„ƤąAvƒüV€éŀ‰_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»Ÿ“˜ÕZ³ġqDo‰y`L¬gdp°şŠp¦ėìÅĮZްIä”h‚‘ˆzŠĵœf²å ›ĚрKp‹IN|‹„Ñz]ń……·FU×é»R³™MƒÉ»GM«€ki€™ér™}Ã`¹ăÞmȝnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²Ġ…þTº·àUȞÏʦ¶†I’«dĽĢdĬ¿–»Ĕ׊h\\c¬†ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvw–ˆxBèĻĒ©Ĉ“tCĢɽŠȣ¦āæ·HĽî“ôNԓ~^¤Ɗœu„œ^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ‘®Z´ğ~Sn|ªWÚ©òzPOȸ‚bð¢|‹øĞŠŒœŒQìÛÐ@Ğ™ǎRS¤Á§d…i“´ezÝúØã]Hq„kIŸþËQǦÃsǤ[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwn‘ÆƄmÀêErĒtD®ċæcQƒ”E®³^ĭ¥©l}äQto˜ŖÜqƎkµ–„ªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿœQP‘JvÄz„^Đ¹Æ¯fLà´GC²‘dt˜­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïžPȆ®âbMüÀXZ ¸£@Ś›»»QÉ­™]d“sÖ×_͖_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|Y‹Ô‚ZśÎs´xº±UŒ’ñˆt|O’ĩĠºNbgþŠJy^dÂY Į„]Řz¦gC‚³€R`Šz’¢AjŒ¸CL„¤RÆ»@­Ŏk\\Ç´£YW}z@Z}‰Ã¶“oû¶]´^N‡Ò}èN‚ª–P˜Íy¹`S°´†ATe€VamdUĐwʄvĮÕ\\ƒu‹Æŗ¨Yp¹àZÂm™Wh{á„}WØǍ•Éüw™ga§áCNęÎ[ĀÕĪgÖɪX˜øx¬½Ů¦¦[€—„NΆL€ÜUÖ´òrÙŠxR^–†J˜k„ijnDX{Uƒ~ET{ļº¦PZc”jF²Ė@Žp˜g€ˆ¨“B{ƒu¨ŦyhoÚD®¯¢˜ WòàFΤ¨GDäz¦kŮPœġq˚¥À]€Ÿ˜eŽâÚ´ªKxī„Pˆ—Ö|æ[xäJÞĥ‚s’NÖ½ž€I†¬nĨY´®Ð—ƐŠ€mD™ŝuäđđEb…e’e_™v¡}ìęNJē}q”É埁T¯µRs¡M@}ůa†a­¯wvƉåZwž\\Z{åû^›"]],"encodeOffsets":[[[108815,30935]],[[110617,31811]]]},"properties":{"cp":[104.065735,30.659462],"name":"四川","childNum":2}},{"id":"520000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@†G\\†lY£‘in"],["@@q‚|ˆ‚mc¯tχVSÎ"],["@@hÑ£Is‡NgßH†›HªķÃh_¹ƒ¡ĝħń¦uيùŽgS¯JHŸ|sÝÅtÁïyMDč»eÕtA¤{b\\}—ƒG®u\\åPFq‹wÅaD…žK°ºâ_£ùbµ”mÁ‹ÛœĹM[q|hlaªāI}тƒµ@swtwm^oµˆD鼊yV™ky°ÉžûÛR…³‚‡eˆ‡¥]RՋěħ[ƅåÛDpŒ”J„iV™™‰ÂF²I…»mN·£›LbÒYb—WsÀbŽ™pki™TZĄă¶HŒq`……ĥ_JŸ¯ae«ƒKpÝx]aĕÛPƒÇȟ[ÁåŵÏő—÷Pw}‡TœÙ@Õs«ĿÛq©½œm¤ÙH·yǥĘĉBµĨÕnđ]K„©„œá‹ŸG纍§Õßg‡ǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊžw¶øV¤w”²Ĉ]ʚKx|`ź¦ÂÈdr„cȁbe¸›`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pН`oÒh޶pa‚^ÓĔ}D»^Xyœ`d˜[Kv…JPhèhCrĂĚÂ^Êƌ wˆZL­Ġ£šÁbrzOIl’MM”ĪŐžËr×ÎeŦŽtw|Œ¢mKjSǘňĂStÎŦEtqFT†¾†E쬬ôxÌO¢Ÿ KгŀºäY†„”PVgŎ¦Ŋm޼VZwVlŒ„z¤…ž£Tl®ctĽÚó{G­A‡ŒÇgeš~Αd¿æaSba¥KKûj®_ć^\\ؾbP®¦x^sxjĶI_Ä X‚⼕Hu¨Qh¡À@Ëô}ޱžGNìĎlT¸ˆ…`V~R°tbÕĊ`¸úÛtπFDu€[ƒMfqGH·¥yA‰ztMFe|R‚_Gk†ChZeÚ°to˜v`x‹b„ŒDnÐ{E}šZ˜è€x—†NEފREn˜[Pv@{~rĆAB§‚EO¿|UZ~ì„Uf¨J²ĂÝÆ€‚sª–B`„s¶œfvö¦ŠÕ~dÔq¨¸º»uù[[§´sb¤¢zþFœ¢Æ…Àhˆ™ÂˆW\\ıŽËI݊o±ĭŠ£þˆÊs}¡R]ŒěƒD‚g´VG¢‚j±®è†ºÃmpU[Á›‘Œëº°r›ÜbNu¸}Žº¼‡`ni”ºÔXĄ¤¼Ôdaµ€Á_À…†ftQQgœR—‘·Ǔ’v”}Ýלĵ]µœ“Wc¤F²›OĩųãW½¯K‚©…]€{†LóµCIµ±Mß¿hŸ•©āq¬o‚½ž~@i~TUxŪÒ¢@ƒ£ÀEîôruń‚”“‚b[§nWuMÆLl¿]x}ij­€½"]],"encodeOffsets":[[[112158,27383]],[[112105,27474]],[[112095,27476]]]},"properties":{"cp":[106.713478,26.578343],"name":"贵州","childNum":3}},{"id":"530000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@[„ùx½}ÑRH‘YīĺûsÍn‘iEoã½Ya²ė{c¬ĝg•ĂsA•ØÅwď‚õzFjw}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónũuą¡Ã¢pÒŌ“Ø TF²‚xa²ËX€‚cʋlHîAßËŁkŻƑŷÉ©h™W­æßU‡“Ës¡¦}•teèÆ¶StǀÇ}Fd£j‹ĈZĆÆ‹¤T‚č\\Dƒ}O÷š£Uˆ§~ŃG™‚åŃDĝ¸œTsd¶¶Bªš¤u¢ŌĎo~t¾ÍŶÒtD¦Ú„iôö‰€z›ØX²ghįh½Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†cÚbŒw\\zlvWžªâˆ ¦g–mĿBş£¢ƹřbĥkǫßeeZkÙIKueT»sVesb‘aĕ  ¶®dNœĄÄpªyސ¼—„³BE˜®l‡ŽGœŭCœǶwêżĔÂe„pÍÀQƞpC„–¼ŲÈ­AÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“Æ´sâDŽŲPnÊD^¯°’Upv†}®BP̪–jǬx–Söwlfòªv€qĸ|`H€­viļ€ndĜ­Ćhň•‚em·FyށqóžSᝑ³X_ĞçêtryvL¤§z„¦c¦¥jnŞk˜ˆlD¤øz½ĜàžĂŧMÅ|áƆàÊcðÂF܎‚áŢ¥\\\\º™İøÒÐJĴ‡„îD¦zK²ǏÎEh~’CD­hMn^ÌöÄ©ČZÀžaü„fɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~Äqššê€ljN¬¼H„ÊšNQ´ê¼VظE††^ŃÒyŒƒM{ŒJLoÒœęæŸe±Ķ›y‰’‡gã“¯JYÆĭĘëo¥Š‰o¯hcK«z_pŠrC´ĢÖY”—¼ v¸¢RŽÅW³Â§fǸYi³xR´ďUˊ`êĿU„û€uĆBƒƣö‰N€DH«Ĉg†——Ñ‚aB{ÊNF´¬c·Åv}eÇÃGB»”If•¦HňĕM…~[iwjUÁKE•Ž‹¾dĪçW›šI‹èÀŒoÈXòyŞŮÈXâÎŚŠj|àsRy‹µÖ›–Pr´þŒ ¸^wþTDŔ–Hr¸‹žRÌmf‡żÕâCôox–ĜƌÆĮŒ›Ð–œY˜tâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyh‡rŒŠ@ĒԝƀŸÀ²º\\êp“’JŠ}ĠvŠqt„Ġ@^xÀ£È†¨mËÏğ}n¹_¿¢×Y_æpˆÅ–A^{½•Lu¨GO±Õ½ßM¶w’ÁĢۂP‚›Ƣ¼pcIJxŠ|ap̬HšÐŒŊSfsðBZ¿©“XÏÒK•k†÷Eû¿‰S…rEFsÕūk”óVǥʼniTL‚¡n{‹uxţÏh™ôŝ¬ğōN“‘NJkyPaq™Âğ¤K®‡YŸxÉƋÁ]āęDqçgOg†ILu—\\_gz—]W¼ž~CÔē]bµogpў_oď`´³Țkl`IªºÎȄqÔþž»E³ĎSJ»œ_f·‚adÇqƒÇc¥Á_Źw{™L^ɱćx“U£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣG˛÷Ÿk°_^ý|_zċBZocmø¯hhcæ\\lˆMFlư£Ĝ„ÆyH“„F¨‰µêÕ]—›HA…àӄ^it `þßäkŠĤÎT~Wlÿ¨„ÔPzUC–NVv [jâôDôď[}ž‰z¿–msSh‹¯{jïğl}šĹ[–őŒ‰gK‹©U·µË@¾ƒm_~q¡f¹…ÅË^»‘f³ø}Q•„¡Ö˳gͱ^ǁ…\\ëÃA_—¿bW›Ï[¶ƛ鏝£F{īZgm@|kHǭƁć¦UĔťƒ×ë}ǝƒeďºȡȘÏíBə£āĘPªij¶“ʼnÿ‡y©n‰ď£G¹¡I›Š±LÉĺÑdĉ܇W¥˜‰}g˜Á†{aqÃ¥aŠıęÏZ—ï`"],"encodeOffsets":[[104636,22969]]},"properties":{"cp":[102.712251,25.040609],"name":"云南","childNum":1}},{"id":"540000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@hžľxŽŖ‰xƒÒVކºÅâAĪÝȆµę¯Ňa±r_w~uSÕň‘qOj]ɄQ…£Z……UDûoY’»©M[‹L¼qãË{V͕çWViŽ]ë©Ä÷àyƛh›ÚU°ŒŒa”d„cQƒ~Mx¥™cc¡ÙaSyF—ցk­ŒuRýq¿Ôµ•QĽ³aG{¿FµëªéĜÿª@¬·–K‰·àariĕĀ«V»Ŷ™Ĵū˜gèLǴŇƶaf‹tŒèBŚ£^Šâ†ǐÝ®–šM¦ÁǞÿ¬LhŸŽJ¾óƾƺcxw‹f]Y…´ƒ¦|œQLn°aœdĊ…œ\\¨o’œǀÍŎœ´ĩĀd`tÊQŞŕ|‚¨C^©œĈ¦„¦ÎJĊ{ŽëĎjª²rЉšl`¼Ą[t|¦St辉PŒÜK¸€d˜Ƅı]s¤—î_v¹ÎVòŦj˜£Əsc—¬_Ğ´|٘¦Avަw`ăaÝaa­¢e¤ı²©ªSªšÈMĄwžÉØŔì@T‘¤—Ę™\\õª@”þo´­xA s”ÂtŎKzó´ÇĊµ¢rž^nĊ­Æ¬×üGž¢‚³ {âĊ]š™G‚~bÀgVjzlhǶf€žOšfdЉªB]pj„•TO–tĊ‚n¤}®¦ƒČ¥d¢¼»ddš”Y¼Žt—¢eȤJ¤}Ǿ¡°§¤AГlc@ĝ”sªćļđAç‡wx•UuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H…ãd«g[؉¼ēÀ•cīľġ¬cJ‘µ…ÐʥVȝ¸ßS¹†ý±ğkƁ¼ą^ɛ¤Ûÿ‰b[}¬ōõÃ]ËNm®g@•Bg}ÍF±ǐyL¥íCˆƒIij€Ï÷њį[¹¦[⚍EÛïÁÉdƅß{âNÆāŨߝ¾ě÷yC£‡k­´ÓH@¹†TZ¥¢įƒ·ÌAЧ®—Zc…v½ŸZ­¹|ŕWZqgW“|ieZÅYVӁqdq•bc²R@†c‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnwôɍėªƒ²•CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛ†ęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷‡f±iMݑ›‰@ĥ°G¬ÃM¥n£Øą‚ğ¯ß”§aëbéüÑOčœk£{\\‘eµª×M‘šÉfm«Ƒ{Å׃Gŏǩãy³©WÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔTŘvŽgÌsN@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxq¹Zo‘b‹s[׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRS~½ŠěVVе‚õ‡«ŒM££µB•ĉ¥áºae~³AuĐh`Ü³ç@BۘïĿa©|z²Ý¼D”£à貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaň¨€~ªSĈ½Ž½KÙóĿeƃÆBŽ·¬ën×W|Uº}LJrƳ˜lŒµ`bÔ`QˆˆÐÓ@s¬ñIŒÍ@ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSij‚‹Yo|Ç[ǾµMW¢ĭiÕØ¿@˜šMh…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB™Š\\”qTGªÇĜçPoŠÿfñòą¦óQīÈáP•œābß{ƒZŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­L·ăU›Èíoù´Êj°ŁŤ_uµ^‘°Œìǖ@tĶĒ¡Æ‡M³Ģ«˜İĨÅ®ğ†RŽāð“ggheÆ¢z‚Ê©Ô\\°ÝĎz~ź¤Pn–MĪÖB£Ÿk™n鄧żćŠ˜ĆK„ǰ¼L¶è‰âz¨u¦¥LDĘz¬ýÎmĘd¾ß”Fz“hg²™Fy¦ĝ¤ċņbΛ@y‚Ąæm°NĮZRÖíŽJ²öLĸÒ¨Y®ƌÐV‰à˜tt_ڀÂyĠzž]Ţh€zĎ{†ĢX”ˆc|šÐqŽšfO¢¤ög‚ÌHNŽ„PKŖœŽ˜Uú´xx[xˆvĐCûŠìÖT¬¸^}Ìsòd´_އKgžLĴ…ÀBon|H@–Êx˜—¦BpŰˆŌ¿fµƌA¾zLjRxжF”œkĄźRzŀˆ~¶[”´Hnª–VƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxdžB’šú^´W†£–d„kɾĬpœw‚˂ØɦļĬIŚœÊ•n›Ŕa¸™~J°î”lɌxĤÊÈðhÌ®‚g˜T´øŽàCˆŽÀ^ªerrƘdž¢İP|Ė ŸWœªĦ^¶´ÂL„aT±üWƜ˜ǀRšŶUńšĖ[QhlLüA†‹Ü\\†qR›Ą©"],"encodeOffsets":[[90849,37210]]},"properties":{"cp":[91.132212,29.660361],"name":"西藏","childNum":1}},{"id":"610000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@˜p¢—ȮµšûG™Ħ}Ħšðǚ¶òƄ€jɂz°{ºØkÈęâ¦jª‚Bg‚\\œċ°s¬Ž’]jžú ‚E”Ȍdž¬s„t‡”RˆÆdĠݎwܔ¸ôW¾ƮłÒ_{’Ìšû¼„jº¹¢GǪÒ¯ĘƒZ`ºŊƒecņąš~BÂgzpâēòYǠȰÌTΨÂWœ|fcŸă§uF—Œ@NŸ¢XLƒŠRMº[ğȣſï|¥J™kc`sʼnǷ’Y¹‹W@µ÷K…ãï³ÛIcñ·VȋڍÒķø©—þ¥ƒy‚ÓŸğęmWµÎumZyOŅƟĥÓ~sÑL¤µaŅY¦ocyZ{‰y c]{ŒTa©ƒ`U_Ěē£ωÊƍKù’K¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑd‘ŠìUYƒŽO‘uF–ÕÈYvÁCqӃT•Ǣí§·S¹NgŠV¬ë÷Át‡°Dد’C´ʼnƒópģ}„ċcE˅FŸŸéGU¥×K…§­¶³B‹Č}C¿åċ`wġB·¤őcƭ²ő[Å^axwQO…ÿEËߌ•ĤNĔŸwƇˆÄŠńwĪ­Šo[„_KÓª³“ÙnK‰Çƒěœÿ]ď€ă_d©·©Ýŏ°Ù®g]±„Ÿ‡ß˜å›—¬÷m\\›iaǑkěX{¢|ZKlçhLt€Ňîŵ€œè[€É@ƉĄEœ‡tƇÏ˜³­ħZ«mJ…›×¾‘MtÝĦ£IwÄå\\Õ{‡˜ƒOwĬ©LÙ³ÙgBƕŀr̛ĢŭO¥lãyC§HÍ£ßEñŸX¡—­°ÙCgpťz‘ˆb`wI„vA|§”‡—hoĕ@E±“iYd¥OϹS|}F@¾oAO²{tfžÜ—¢Fǂ҈W²°BĤh^Wx{@„¬‚­F¸¡„ķn£P|ŸªĴ@^ĠĈæb–Ôc¶l˜Yi…–^Mi˜cϰÂ[ä€vï¶gv@À“Ĭ·lJ¸sn|¼u~a]’ÆÈtŌºJp’ƒþ£KKf~ЦUbyäIšĺãn‡Ô¿^­žŵMT–hĠܤko¼Ŏìąǜh`[tŒRd²IJ_œXPrɲ‰l‘‚XžiL§àƒ–¹ŽH˜°Ȧqº®QC—bA†„ŌJ¸ĕÚ³ĺ§ `d¨YjžiZvRĺ±öVKkjGȊĐePОZmļKÀ€‚[ŠŽ`ösìh†ïÎoĬdtKÞ{¬èÒÒBŒÔpIJÇĬJŊ¦±J«ˆY§‹@·pH€µàåVKe›pW†ftsAÅqC·¬ko«pHÆuK@oŸHĆۄķhx“e‘n›S³àǍrqƶRbzy€¸ËАl›¼EºpĤ¼Œx¼½~Ğ’”à@†ÚüdK^ˆmÌSj"],"encodeOffsets":[[110234,38774]]},"properties":{"cp":[108.948024,34.263161],"name":"陕西","childNum":1}},{"id":"620000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@VuUv"],["@@ũ‹EĠtt~nkh`Q‰¦ÅÄÜdw˜Ab×ĠąJˆ¤DüègĺqBqœj°lI¡ĨÒ¤úSHbš‡ŠjΑBаaZˆ¢KJŽ’O[|A£žDx}Nì•HUnrk„ kp€¼Y kMJn[aG‚áÚÏ[½rc†}aQxOgsPMnUs‡nc‹Z…ž–sKúvA›t„Þġ’£®ĀYKdnFwš¢JE°”Latf`¼h¬we|€Æ‡šbj}GA€·~WŽ”—`†¢MC¤tL©IJ°qdf”O‚“bÞĬ¹ttu`^ZúE`Œ[@„Æsîz®¡’C„ƳƜG²“R‘¢R’m”fŽwĸg܃‚ą G@pzJM½mŠhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬‡²I‚¥IʼnÈīoı‹ÓÑAçÑ|«LÝcspīðÍg…të_õ‰\\ĉñLYnĝg’ŸRǡÁiHLlõUĹ²uQjYi§Z_c¨Ÿ´ĹĖÙ·ŋI…ƒaBD˜­R¹ȥr—¯G•ºß„K¨jWk’ɱŠOq›Wij\\a­‹Q\\sg_ĆǛōëp»£lğۀgS•ŶN®À]ˆÓäm™ĹãJaz¥V}‰Le¤L„ýo‘¹IsŋÅÇ^‘Žbz…³tmEÁ´aйcčecÇN•ĊãÁ\\蝗dNj•]j†—ZµkÓda•ćå]ğij@ ©O{¤ĸm¢ƒE·®ƒ«|@Xwg]A챝‡XǁÑdzªc›wQÚŝñsÕ³ÛV_ýƒ˜¥\\ů¥©¾÷w—Ž©WÕÊĩhÿÖÁRo¸V¬âDb¨šhûx–Ê×nj~Zâƒg|šXÁnßYoº§ZÅŘvŒ[„ĭÖʃuďxcVbnUSf…B¯³_Tzº—ΕO©çMÑ~Mˆ³]µ^püµ”ŠÄY~y@X~¤Z³€[Èōl@®Å¼£QKƒ·Di‹¡By‘ÿ‰Q_´D¥hŗyƒ^ŸĭÁZ]cIzý‰ah¹MĪğP‘s{ò‡‹‘²Vw¹t³Ŝˁ[ŽÑ}X\\gsFŸ£sPAgěp×ëfYHāďÖqēŭOÏë“dLü•\\iŒ”t^c®šRʺ¶—¢H°mˆ‘rYŸ£BŸ¹čIoľu¶uI]vģSQ{ƒUŻ”Å}QÂ|̋°ƅ¤ĩŪU ęĄžÌZҞ\\v˜²PĔ»ƢNHƒĂyAmƂwVmž`”]ȏb•”H`‰Ì¢²ILvĜ—H®¤Dlt_„¢JJÄämèÔDëþgºƫ™”aʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b…ð÷’Žˆ‡®‚”üs”zMzÖĖQdȨý†v§Tè|ªH’þa¸|šÐ ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v†·À|\\ƁĚN´Ĝ€çèÁz]ġ¤²¨QÒŨTIl‡ªťØ}¼˗ƦvÄùØE‹’«Fï˛Iq”ōŒTvāÜŏ‚íÛߜÛV—j³âwGăÂíNOŠˆŠPìyV³ʼnĖýZso§HіiYw[߆\\X¦¥c]ÔƩÜ·«j‡ÐqvÁ¦m^ċ±R™¦΋ƈťĚgÀ»IïĨʗƮްƝ˜ĻþÍAƉſ±tÍEÕÞāNU͗¡\\ſčåÒʻĘm ƭÌŹöʥ’ëQ¤µ­ÇcƕªoIýˆ‰Iɐ_mkl³ă‰Ɠ¦j—¡Yz•Ňi–}Msßõ–īʋ —}ƒÁVmŸ_[n}eı­Uĥ¼‘ª•I{ΧDӜƻėoj‘qYhĹT©oūĶ£]ďxĩ‹ǑMĝ‰q`B´ƃ˺Ч—ç~™²ņj@”¥@đ´ί}ĥtPńǾV¬ufӃÉC‹tÓ̻‰…¹£G³€]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼ‚ĤŊɲĖ­Kq´ï¦—ºĒDzņɾªǀÞĈĂD†½ĄĎÌŗĞrôñnŽœN¼â¾ʄľԆ|DŽŽ֦ज़ȗlj̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏijëCȚDŲyê×Ŗyò¯ļcÂßY…tÁƤyAã˾J@ǝrý‹‰@¤…rz¸oP¹ɐÚyᐇHŸĀ[Jw…cVeȴϜ»ÈŽĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔ—ĹŊũ~ËUă{ŸĻƹɁύȩþĽvĽƓÉ@ē„ĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶Ž¨c~c¼īŒeXǚ‹\\đ¾JŽwÀďksãA‹fÕ¦L}wa‚o”Z’‹D½†Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LF‹LzĈ„ôe]gx}•|KK}xklL]c¦£fRtív¦†PĤoH{tK"]],"encodeOffsets":[[[108619,36299]],[[108589,36341]]]},"properties":{"cp":[103.823557,36.058039],"name":"甘肃","childNum":2}},{"id":"630000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@InJm"],["@@CƒÆ½OŃĦsΰ~dz¦@@“Ņiš±è}ؘƄ˹A³r_ĞŠǒNΌĐw¤^ŬĵªpĺSZg’rpiƼĘԛ¨C|͖J’©Ħ»®VIJ~f\\m `Un„˜~ʌŸ•ĬàöNt•~ňjy–¢Zi˜Ɣ¥ĄŠk´nl`JʇŠJþ©pdƖ®È£¶ìRʦ‘źõƮËnŸʼėæÑƀĎ[‚˜¢VÎĂMÖÝÎF²sƊƀÎBļýƞ—¯ʘƭðħ¼Jh¿ŦęΌƇš¥²Q]Č¥nuÂÏriˆ¸¬ƪÛ^Ó¦d€¥[Wà…x\\ZŽjҕ¨GtpþYŊĕ´€zUO뇉P‰îMĄÁxH´á˜iÜUà›îÜՁĂÛSuŎ‹r“œJð̬EŒ‘FÁú×uÃÎkr“Ē{V}İ«O_ÌËĬ©ŽÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u…ºµ[gt£¸OƤĿéYŸõ·kŸq]juw¥Dĩƍ€õÇPéĽG‘ž©ã‡¤G…uȧþRcÕĕNy“yût“ˆ­‡ø‘†ï»a½ē¿BMoᣟÍj}éZËqbʍš“Ƭh¹ìÿÓAçãnIáI`ƒks£CG­ě˜Uy×Cy•…’Ÿ@¶ʡÊBnāzG„ơMē¼±O÷õJËĚăVŸĪũƆ£Œ¯{ËL½Ìzż“„VR|ĠTbuvJvµhĻĖH”Aëáa…­OÇðñęNw‡…œľ·L›mI±íĠĩPÉ×®ÿs—’cB³±JKßĊ«`…ađ»·QAmO’‘Vţéÿ¤¹SQt]]Çx€±¯A@ĉij¢Ó祖•ƒl¶ÅÛr—ŕspãRk~¦ª]Į­´“FR„åd­ČsCqđéFn¿Åƃm’Éx{W©ºƝºįkÕƂƑ¸wWūЩÈFž£\\tÈ¥ÄRÈýÌJ ƒlGr^×äùyÞ³fj”c†€¨£ÂZ|ǓMĝšÏ@ëÜőR‹›ĝ‰Œ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³’­ÞIňµç½©C¡į÷¯B»|St»›]vƒųƒs»”}MÓ ÿʪƟǭA¡fs˜»PY¼c¡»¦c„ċ­¥£~msĉP•–Siƒ^o©A‰Šec‚™PeǵŽkg‚yUi¿h}aH™šĉ^|ᴟ¡HØûÅ«ĉ®]m€¡qĉ¶³ÈyôōLÁst“BŸ®wn±ă¥HSò뚣˜S’ë@לÊăxÇN©™©T±ª£IJ¡fb®ÞbŽb_Ą¥xu¥B—ž{łĝ³«`d˜Ɛt—¤ťiñžÍUuºí`£˜^tƃIJc—·ÛLO‹½Šsç¥Ts{ă\\_»™kϊ±q©čiìĉ|ÍIƒ¥ć¥›€]ª§D{ŝŖÉR_sÿc³Īō›ƿΑ›§p›[ĉ†›c¯bKm›R¥{³„Z†e^ŽŒwx¹dƽŽôIg §Mĕ ƹĴ¿—ǣÜ̓]‹Ý–]snåA{‹eŒƭ`ǻŊĿ\\ijŬű”YÂÿ¬jĖqŽßbЏ•L«¸©@ěĀ©ê¶ìÀEH|´bRľž–Ó¶rÀQþ‹vl®Õ‚E˜TzÜdb ˜hw¤{LR„ƒd“c‹b¯‹ÙVgœ‚ƜßzÃô쮍^jUèXΖ|UäÌ»rKŽ\\ŒªN‘¼pZCü†VY††¤ɃRi^rPҒTÖ}|br°qňb̰ªiƶGQ¾²„x¦PœmlŜ‘[Ĥ¡ΞsĦŸÔÏâ\\ªÚŒU\\f…¢N²§x|¤§„xĔsZPòʛ²SÐqF`ª„VƒÞŜĶƨVZŒÌL`ˆ¢dŐIqr\\oäõ–F礻Ŷ×h¹]Clـ\\¦ďÌį¬řtTӺƙgQÇÓHţĒ”´ÃbEÄlbʔC”|CˆŮˆk„Ʈ[ʼ¬ňœ´KŮÈΰÌζƶlð”ļA†TUvdTŠG†º̼ŠÔ€ŒsÊDԄveOg"]],"encodeOffsets":[[[105308,37219]],[[95370,40081]]]},"properties":{"cp":[101.778916,36.623178],"name":"青海","childNum":2}},{"id":"640000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@KëÀęĞ«OęȿȕŸı]ʼn¡åįÕÔ«Ǵõƪ™ĚQÐZhv K°›öqÀѐS[ÃÖHƖčË‡nL]ûc…Ùß@‚“ĝ‘¾}w»»‹oģF¹œ»kÌÏ·{zPƒ§B­¢íyÅt@ƒ@áš]Yv_ssģ¼i߁”ĻL¾ġsKD£¡N_…“˜X¸}B~Haiˆ™Åf{«x»ge_bs“KF¯¡Ix™mELcÿZ¤­Ģ‘ƒÝœsuBLù•t†ŒYdˆmVtNmtOPhRw~bd…¾qÐ\\âÙH\\bImlNZŸ»loƒŸqlVm–Gā§~QCw¤™{A\\‘PKŸNY‡¯bF‡kC¥’sk‹Šs_Ã\\ă«¢ħkJi¯r›rAhĹûç£CU‡ĕĊ_ԗBixÅُĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~–hw^‚ófćƒKyEŒ­K­zuÔ¡qQ¤xZÑ¢^ļöܾEpž±âbÊÑÆ^fk¬…NC¾‘Œ“YpxbK~¥Že֎ŒäBlt¿Đx½I[ĒǙŒWž‹f»Ĭ}d§dµùEuj¨‚IÆ¢¥dXªƅx¿]mtÏwßR͌X¢͎vÆzƂZò®ǢÌʆCrâºMÞzžÆMҔÊÓŊZľ–r°Î®Ȉmª²ĈUªĚøºˆĮ¦ÌĘk„^FłĬhĚiĀ˾iİbjÕ"],["@@mfwěwMrŢªv@G‰"]],"encodeOffsets":[[[109366,40242]],[[108600,36303]]]},"properties":{"cp":[106.278179,38.46637],"name":"宁夏","childNum":2}},{"id":"650000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@QØĔ²X¨”~ǘBºjʐߨvK”ƔX¨vĊOžÃƒ·¢i@~c—‡ĝe_«”Eš“}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuX…ê•Îf`œC‚¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥Oéȇ¿ÖğǤǷÂF҇zÉx[]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±’ēO…¦E–•}‘`cȺrĦáŖuҞª«IJ‡πdƺÏØZƴwʄ¤ĖGЙǂZ̓èH¶}ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»›òmqóŘĝč˾ăC…ćāƿÝɽ©DZŅ¹đ¥˜³ðLrÁ®ɱĕģʼnǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕŠUv£ƁQï“Ƶkŏ½ΉÃŭdzLқʻ«ƭ\\lƒ‡ŭD‡“{ʓDkaFÃÄa“³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍö•€ůʼnT¡c_‡ËKY‹ƧUśĵ„݃U_©rETÏʜ±OñtYw獃{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\‚ś’nkO›w¥±ƒT»ƷFɯàĩÞáB¹Æ…ÑUw„੍žĽw[“mG½Èå~‡Æ÷QyŠěCFmĭZī—ŵVÁ™ƿQƛ—ûXS²‰b½KϽĉS›©ŷXĕŸ{ŽĕK·¥Ɨcqq©f¿]‡ßDõU³h—­gËÇïģÉɋw“k¯í}I·šœbmœÉ–ř›īJɥĻˁ×xo›ɹī‡l•c…¤³Xù]‘™DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®Ɲv•Um©³G\\“}µĿ‡QyŹl㓛µEw‰LJQ½yƋBe¶ŋÀů‡ož¥A—˜Éw@•{Gpm¿Aij†ŽKLhˆ³`ñcËtW‚±»ÕS‰ëüÿďD‡u\\wwwù³—V›LŕƒOMËGh£õP¡™er™Ïd{“‡ġWÁ…č|yšg^ğyÁzÙs`—s|ÉåªÇ}m¢Ń¨`x¥’ù^•}ƒÌ¥H«‰Yªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´AňĀ҄¶ûEYospõD[{ù°]u›Jq•U•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGÉbřaDü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKwbm‡ÄNô‡ŠfœƫVÉvi†dz—H‘‹QµâFšù­Âœ³¦{YGžƒd¢ĚÜO „€{Ö¦ÞÍÀPŒ^b–ƾŠlŽ[„vt×ĈÍE˨¡Đ~´î¸ùÎh€uè`¸ŸHÕŔVºwĠââWò‡@{œÙNÝ´ə²ȕn{¿¥{l—÷eé^e’ďˆXj©î\\ªÑò˜Üìc\\üqˆÕ[Č¡xoÂċªbØ­Œø|€¶ȴZdÆÂšońéŒGš\\”¼C°ÌƁn´nxšÊOĨ’ہƴĸ¢¸òTxÊǪMīИÖŲÃɎOvˆʦƢ~FއRěò—¿ġ~åŊœú‰Nšžš¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾œĄYÒ©ÊfºmԈĘcDoĬMŬ’˜S¤„s²‚”ʘچžȂVŦ –ŽèW°ªB|IJXŔþÈJĦÆæFĚêŠYĂªĂ]øªŖNÞüA€’fɨJ€˜¯ÎrDDšĤ€`€mz\\„§~D¬{vJÂ˜«lµĂb–¤p€ŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMT”‡òP˜÷fØĶK¢ȝ˔Sô¹òEð­”`Ɩ½ǒÂň×äı–§ĤƝ§C~¡‚hlå‚ǺŦŞkâ’~}ŽFøàIJaĞ‚fƠ¥Ž„Ŕdž˜®U¸ˆźXœv¢aƆúŪtŠųƠjd•ƺŠƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹œ\\ĜÑŚŸ¶ZƄ³àjĨoâŠȴLʉȮŒĐ­ĚăŽÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTŠiƢ¾ªì°`öøu®Ê¾ãØ"],"encodeOffsets":[[88824,50096]]},"properties":{"cp":[87.617733,43.792818],"name":"新疆","childNum":1}},{"id":"110000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ĽOÁ›ûtŷmiÍt_H»Ĩ±d`й­{bw…Yr“³S]§§o¹€qGtm_Sŧ€“oa›‹FLg‘QN_•dV€@Zom_ć\\ߚc±x¯oœRcfe…£’o§ËgToÛJíĔóu…|wP¤™XnO¢ÉˆŦ¯rNÄā¤zâŖÈRpŢZŠœÚ{GŠrFt¦Òx§ø¹RóäV¤XdˆżâºWbwڍUd®bêņ¾‘jnŎGŃŶŠnzÚSeîĜZczî¾i]͜™QaúÍÔiþĩȨWĢ‹ü|Ėu[qb[swP@ÅğP¿{\\‡¥A¨Ï‘Ѩj¯ŠX\\¯œMK‘pA³[H…īu}}"],"encodeOffsets":[[120023,41045]]},"properties":{"cp":[116.405285,39.904989],"name":"北京","childNum":1}},{"id":"120000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ŬgX§Ü«E…¶Ḟ“¬O_™ïlÁg“z±AXe™µÄĵ{¶]gitgšIj·›¥îakS€‰¨ÐƎk}ĕ{gB—qGf{¿a†U^fI“ư‹³õ{YƒıëNĿžk©ïËZŏ‘R§òoY×Ógc…ĥs¡bġ«@dekąI[nlPqCnp{ˆō³°`{PNdƗqSÄĻNNâyj]äžÒD ĬH°Æ]~¡HO¾ŒX}ÐxŒgp“gWˆrDGˆŒpù‚Š^L‚ˆrzWxˆZ^¨´T\\|~@I‰zƒ–bĤ‹œjeĊªz£®Ĕvě€L†mV¾Ô_ȔNW~zbĬvG†²ZmDM~”~"],"encodeOffsets":[[120237,41215]]},"properties":{"cp":[117.190182,39.125596],"name":"天津","childNum":1}},{"id":"310000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@ɧư¬EpƸÁxc‡"],["@@©„ªƒ"],["@@”MA‹‘š"],["@@Qp݁E§ÉC¾"],["@@bŝՕÕEȣÚƥêImɇǦèÜĠŒÚžÃƌÃ͎ó"],["@@ǜûȬɋŠŭ™×^‰sYŒɍDŋ‘ŽąñCG²«ªč@h–_p¯A{‡oloY€¬j@IJ`•gQڛhr|ǀ^MIJvtbe´R¯Ô¬¨YŽô¤r]ì†Ƭį"]],"encodeOffsets":[[[124702,32062]],[[124547,32200]],[[124808,31991]],[[124726,32110]],[[124903,32376]],[[124438,32149]]]},"properties":{"cp":[121.472644,31.231706],"name":"上海","childNum":6}},{"id":"500000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êЖqHŸðqĖ䒊¥^CƒIj–²p…\\_ æüY|[YxƊæuž°xb®…Űb@~¢NQt°¶‚S栓Ê~rljĔëĚ¢~šuf`‘‚†fa‚ĔJåĊ„nÖ]„jƎćÊ@Š£¾a®£Ű{ŶĕF‹ègLk{Y|¡ĜWƔtƬJÑxq‹±ĢN´‰òK‰™–LÈüD|s`ŋ’ć]ƒÃ‰`đŒMûƱ½~Y°ħ`ƏíW‰½eI‹½{aŸ‘OIrÏ¡ĕŇa†p†µÜƅġ‘œ^ÖÛbÙŽŏml½S‹êqDu[R‹ãË»†ÿw`»y‘¸_ĺę}÷`M¯ċfCVµqʼn÷Z•gg“Œ`d½pDO‡ÎCnœ^uf²ènh¼WtƏxRGg¦…pV„†FI±ŽG^ŒIc´ec‡’G•ĹÞ½sëĬ„h˜xW‚}Kӈe­Xsbk”F¦›L‘ØgTkïƵNï¶}Gy“w\\oñ¡nmĈzjŸ•@™Óc£»Wă¹Ój“_m»ˆ¹·~MvÛaqœ»­‰êœ’\\ÂoVnŽÓØÍ™²«‹bq¿efE „€‹Ĝ^Qž~ Évý‡ş¤²Į‰pEİ}zcĺƒL‹½‡š¿gņ›¡ýE¡ya£³t\\¨\\vú»¼§·Ñr_oÒý¥u‚•_n»_ƒ•At©Þűā§IVeëƒY}{VPÀFA¨ąB}q@|Ou—\\Fm‰QF݅Mw˜å}]•€|FmϋCaƒwŒu_p—¯sfÙgY…DHl`{QEfNysBЦzG¸rHe‚„N\\CvEsÐùÜ_·ÖĉsaQ¯€}_U‡†xÃđŠq›NH¬•Äd^ÝŰR¬ã°wećJEž·vÝ·Hgƒ‚éFXjÉê`|yŒpxkAwœWĐpb¥eOsmzwqChóUQl¥F^laf‹anòsr›EvfQdÁUVf—ÎvÜ^efˆtET¬ôA\\œ¢sJŽnQTjP؈xøK|nBz‰„œĞ»LY‚…FDxӄvr“[ehľš•vN”¢o¾NiÂxGp⬐z›bfZo~hGi’]öF|‰|Nb‡tOMn eA±ŠtPT‡LjpYQ|†SH††YĀxinzDJ€Ìg¢và¥Pg‰_–ÇzII‹€II•„£®S¬„Øs쐣ŒN"],["@@ifjN@s"]],"encodeOffsets":[[[109628,30765]],[[111725,31320]]]},"properties":{"cp":[106.504962,29.533155],"name":"重庆","childNum":2}},{"id":"810000","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AlBk"],["@@mŽn"],["@@EpFo"],["@@ea¢pl¸Eõ¹‡hj[ƒ]ÔCΖ@lj˜¡uBXŸ…•´‹AI¹…[‹yDUˆ]W`çwZkmc–…M›žp€Åv›}I‹oJlcaƒfёKްä¬XJmРđhI®æÔtSHn€Eˆ„ÒrÈc"],["@@rMUw‡AS®€e"]],"encodeOffsets":[[[117111,23002]],[[117072,22876]],[[117045,22887]],[[116975,23082]],[[116882,22747]]]},"properties":{"cp":[114.173355,22.320048],"name":"香港","childNum":5}},{"id":"820000","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@kÊd°å§s"],"encodeOffsets":[[116279,22639]]},"properties":{"cp":[113.54909,22.198951],"name":"澳门","childNum":1}}],"UTF8Encoding":true}); +})); \ No newline at end of file diff --git a/public/static/assets/third_party/echart/echarts.min.js b/public/static/assets/third_party/echart/echarts.min.js new file mode 100644 index 0000000..a472100 --- /dev/null +++ b/public/static/assets/third_party/echart/echarts.min.js @@ -0,0 +1,45 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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. +*/ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).echarts={})}(this,(function(t){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,n)};function n(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}var i=function(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1},r=new function(){this.browser=new i,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow="undefined"!=typeof window};"object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?(r.wxa=!0,r.touchEventsSupported=!0):"undefined"==typeof document&&"undefined"!=typeof self?r.worker=!0:"undefined"==typeof navigator?(r.node=!0,r.svgSupported=!0):function(t,e){var n=e.browser,i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge?\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(n.firefox=!0,n.version=i[1]);r&&(n.ie=!0,n.version=r[1]);o&&(n.edge=!0,n.version=o[1],n.newEdge=+o[1].split(".")[0]>18);a&&(n.weChat=!0);e.svgSupported="undefined"!=typeof SVGRect,e.touchEventsSupported="ontouchstart"in window&&!n.ie&&!n.edge,e.pointerEventsSupported="onpointerdown"in window&&(n.edge||n.ie&&+n.version>=11),e.domSupported="undefined"!=typeof document;var s=document.documentElement.style;e.transform3dSupported=(n.ie&&"transition"in s||n.edge||"WebKitCSSMatrix"in window&&"m11"in new WebKitCSSMatrix||"MozPerspective"in s)&&!("OTransition"in s),e.transformSupported=e.transform3dSupported||n.ie&&+n.version>=9}(navigator.userAgent,r);var o="sans-serif",a="12px sans-serif";var s,l,u=function(t){var e={};if("undefined"==typeof JSON)return e;for(var n=0;n=0)o=r*t.length;else for(var c=0;c>1)%2;a.style.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",i[s]+":0",r[l]+":0",i[1-s]+":auto",r[1-l]+":auto",""].join("!important;"),t.appendChild(a),n.push(a)}return n}(e,a),a,o);if(s)return s(t,n,i),!0}return!1}function Jt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Qt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,te=[],ee=r.browser.firefox&&+r.browser.version.split(".")[0]<39;function ne(t,e,n,i){return n=n||{},i?ie(t,e,n):ee&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):ie(t,e,n),n}function ie(t,e,n){if(r.domSupported&&t.getBoundingClientRect){var i=e.clientX,o=e.clientY;if(Jt(t)){var a=t.getBoundingClientRect();return n.zrX=i-a.left,void(n.zrY=o-a.top)}if($t(te,t,i,o))return n.zrX=te[0],void(n.zrY=te[1])}n.zrX=n.zrY=0}function re(t){return t||window.event}function oe(t,e,n){if(null!=(e=re(e)).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!==i?e.targetTouches[0]:e.changedTouches[0];r&&ne(t,r,e,n)}else{ne(t,e,e,n);var o=function(t){var e=t.wheelDelta;if(e)return e;var n=t.deltaX,i=t.deltaY;if(null==n||null==i)return e;return 3*(0!==i?Math.abs(i):Math.abs(n))*(i>0?-1:i<0?1:n>0?-1:1)}(e);e.zrDelta=o?o/120:-(e.detail||0)/3}var a=e.button;return null==e.which&&void 0!==a&&Qt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function ae(t,e,n,i){t.addEventListener(e,n,i)}var se=function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0};function le(t){return 2===t.which||3===t.which}var ue=function(){function t(){this._track=[]}return t.prototype.recognize=function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},t.prototype.clear=function(){return this._track.length=0,this},t.prototype._doTrack=function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o1&&r&&r.length>1){var a=he(r)/he(o);!isFinite(a)&&(a=1),e.pinchScale=a;var s=[((i=r)[0][0]+i[1][0])/2,(i[0][1]+i[1][1])/2];return e.pinchX=s[0],e.pinchY=s[1],{type:"pinch",target:t[0].target,event:e}}}}},pe="silent";function de(){se(this.event)}var fe=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.handler=null,e}return n(e,t),e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(Xt),ge=function(t,e){this.x=t,this.y=e},ye=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],ve=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o._hovered=new ge(0,0),o.storage=e,o.painter=n,o.painterRoot=r,i=i||new fe,o.proxy=null,o.setHandlerProxy(i),o._draggingMgr=new Ut(o),o}return n(e,t),e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(E(ye,(function(e){t.on&&t.on(e,this[e],this)}),this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var e=t.zrX,n=t.zrY,i=xe(this,e,n),r=this._hovered,o=r.target;o&&!o.__zr&&(o=(r=this.findHover(r.x,r.y)).target);var a=this._hovered=i?new ge(e,n):this.findHover(e,n),s=a.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),o&&s!==o&&this.dispatchToElement(r,"mouseout",t),this.dispatchToElement(a,"mousemove",t),s&&s!==o&&this.dispatchToElement(a,"mouseover",t)},e.prototype.mouseout=function(t){var e=t.zrEventControl;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&this.trigger("globalout",{type:"globalout",event:t})},e.prototype.resize=function(){this._hovered=new ge(0,0)},e.prototype.dispatch=function(t,e){var n=this[t];n&&n.call(this,e)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},e.prototype.dispatchToElement=function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=function(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:de}}(e,t,n);i&&(i[r]&&(o.cancelBubble=!!i[r].call(i,o)),i.trigger(e,o),i=i.__hostTarget?i.__hostTarget:i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer((function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)})))}},e.prototype.findHover=function(t,e,n){for(var i=this.storage.getDisplayList(),r=new ge(t,e),o=i.length-1;o>=0;o--){var a=void 0;if(i[o]!==n&&!i[o].ignore&&(a=me(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),a!==pe)){r.target=i[o];break}}return r},e.prototype.processGesture=function(t,e){this._gestureMgr||(this._gestureMgr=new ue);var n=this._gestureMgr;"start"===e&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&n.clear(),i){var r=i.type;t.gestureEvent=r;var o=new ge;o.target=i.target,this.dispatchToElement(o,r,i.event)}},e}(Xt);function me(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i=t,r=void 0,o=!1;i;){if(i.ignoreClip&&(o=!0),!o){var a=i.getClipPath();if(a&&!a.contain(e,n))return!1;i.silent&&(r=!0)}var s=i.__hostTarget;i=s||i.parent}return!r||pe}return!1}function xe(t,e,n){var i=t.painter;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],(function(t){ve.prototype[t]=function(e){var n,i,r=e.zrX,o=e.zrY,a=xe(this,r,o);if("mouseup"===t&&a||(i=(n=this.findHover(r,o)).target),"mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||Et(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}));function _e(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r=0;)r++;return r-e}function be(t,e,n,i,r){for(i===e&&i++;i>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function we(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function Se(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;ls&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function Me(t,e){var n,i,r=7,o=0;t.length;var a=[];function s(s){var l=n[s],u=i[s],h=n[s+1],c=i[s+1];i[s]=u+c,s===o-3&&(n[s+1]=n[s+2],i[s+1]=i[s+2]),o--;var p=Se(t[h],t,l,u,0,e);l+=p,0!==(u-=p)&&0!==(c=we(t[l+u-1],t,h,c,c-1,e))&&(u<=c?function(n,i,o,s){var l=0;for(l=0;l=7||d>=7);if(f)break;g<0&&(g=0),g+=2}if((r=g)<1&&(r=1),1===i){for(l=0;l=0;l--)t[d+l]=t[p+l];return void(t[c]=a[h])}var f=r;for(;;){var g=0,y=0,v=!1;do{if(e(a[h],t[u])<0){if(t[c--]=t[u--],g++,y=0,0==--i){v=!0;break}}else if(t[c--]=a[h--],y++,g=0,1==--s){v=!0;break}}while((g|y)=0;l--)t[d+l]=t[p+l];if(0===i){v=!0;break}}if(t[c--]=a[h--],1==--s){v=!0;break}if(0!==(y=s-we(t[u],a,0,s,s-1,e))){for(s-=y,d=(c-=y)+1,p=(h-=y)+1,l=0;l=7||y>=7);if(v)break;f<0&&(f=0),f+=2}(r=f)<1&&(r=1);if(1===s){for(d=(c-=i)+1,p=(u-=i)+1,l=i-1;l>=0;l--)t[d+l]=t[p+l];t[c]=a[h]}else{if(0===s)throw new Error;for(p=c-(s-1),l=0;l1;){var t=o-2;if(t>=1&&i[t-1]<=i[t]+i[t+1]||t>=2&&i[t-2]<=i[t]+i[t-1])i[t-1]i[t+1])break;s(t)}},forceMergeRuns:function(){for(;o>1;){var t=o-2;t>0&&i[t-1]=32;)e|=1&t,t>>=1;return t+e}(r);do{if((o=_e(t,n,i,e))s&&(l=s),be(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}}var Te=!1;function Ce(){Te||(Te=!0,console.warn("z / z2 / zlevel of displayable is invalid, which may cause unexpected errors"))}function De(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var Ae=function(){function t(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=De}return t.prototype.traverse=function(t,e){for(var n=0;n0&&(u.__clipPaths=[]),isNaN(u.z)&&(Ce(),u.z=0),isNaN(u.z2)&&(Ce(),u.z2=0),isNaN(u.zlevel)&&(Ce(),u.zlevel=0),this._displayList[this._displayListLen++]=u}var h=t.getDecalElement&&t.getDecalElement();h&&this._updateAndAddDisplayable(h,e,n);var c=t.getTextGuideLine();c&&this._updateAndAddDisplayable(c,e,n);var p=t.getTextContent();p&&this._updateAndAddDisplayable(p,e,n)}},t.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},t.prototype.delRoot=function(t){if(t instanceof Array)for(var e=0,n=t.length;e=0&&this._roots.splice(i,1)}},t.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},t.prototype.getRoots=function(){return this._roots},t.prototype.dispose=function(){this._displayList=null,this._roots=null},t}(),ke=r.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){return setTimeout(t,16)},Le={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Le.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Le.bounceIn(2*t):.5*Le.bounceOut(2*t-1)+.5}},Pe=Math.pow,Oe=Math.sqrt,Re=1e-8,Ne=1e-4,Ee=Oe(3),ze=1/3,Ve=wt(),Be=wt(),Fe=wt();function Ge(t){return t>-1e-8&&tRe||t<-1e-8}function He(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function Ye(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function Ue(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,p=l*l-3*s*u,d=0;if(Ge(h)&&Ge(c)){if(Ge(s))o[0]=0;else(M=-l/s)>=0&&M<=1&&(o[d++]=M)}else{var f=c*c-4*h*p;if(Ge(f)){var g=c/h,y=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y)}else if(f>0){var v=Oe(f),m=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((m=m<0?-Pe(-m,ze):Pe(m,ze))+(x=x<0?-Pe(-x,ze):Pe(x,ze))))/(3*a))>=0&&M<=1&&(o[d++]=M)}else{var _=(2*h*s-3*a*c)/(2*Oe(h*h*h)),b=Math.acos(_)/3,w=Oe(h),S=Math.cos(b),M=(-s-2*w*S)/(3*a),I=(y=(-s+w*(S+Ee*Math.sin(b)))/(3*a),(-s+w*(S-Ee*Math.sin(b)))/(3*a));M>=0&&M<=1&&(o[d++]=M),y>=0&&y<=1&&(o[d++]=y),I>=0&&I<=1&&(o[d++]=I)}}return d}function Xe(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Ge(a)){if(We(o))(h=-s/o)>=0&&h<=1&&(r[l++]=h)}else{var u=o*o-4*a*s;if(Ge(u))r[0]=-o/(2*a);else if(u>0){var h,c=Oe(u),p=(-o-c)/(2*a);(h=(-o+c)/(2*a))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}function Ze(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function je(t,e,n,i,r,o,a,s,l,u,h){var c,p,d,f,g,y=.005,v=1/0;Ve[0]=l,Ve[1]=u;for(var m=0;m<1;m+=.05)Be[0]=He(t,n,r,a,m),Be[1]=He(e,i,o,s,m),(f=Vt(Ve,Be))=0&&f=0&&y=1?1:Ue(0,i,o,1,t,s)&&He(0,r,a,1,s[0])}}}var on=function(){function t(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||xt,this.ondestroy=t.ondestroy||xt,this.onrestart=t.onrestart||xt,t.easing&&this.setEasing(t.easing)}return t.prototype.step=function(t,e){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),!this._paused){var n=this._life,i=t-this._startTime-this._pausedTime,r=i/n;r<0&&(r=0),r=Math.min(r,1);var o=this.easingFunc,a=o?o(r):r;if(this.onframe(a),1===r){if(!this.loop)return!0;var s=i%n;this._startTime=t-s,this._pausedTime=0,this.onrestart()}return!1}this._pausedTime+=e},t.prototype.pause=function(){this._paused=!0},t.prototype.resume=function(){this._paused=!1},t.prototype.setEasing=function(t){this.easing=t,this.easingFunc=U(t)?t:Le[t]||rn(t)},t}(),an=function(t){this.value=t},sn=function(){function t(){this._len=0}return t.prototype.insert=function(t){var e=new an(t);return this.insertEntry(e),e},t.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},t.prototype.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},t.prototype.len=function(){return this._len},t.prototype.clear=function(){this.head=this.tail=null,this._len=0},t}(),ln=function(){function t(t){this._list=new sn,this._maxSize=10,this._map={},this._maxSize=t}return t.prototype.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new an(e),a.key=t,n.insertEntry(a),i[t]=a}return r},t.prototype.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},t.prototype.clear=function(){this._list.clear(),this._map={}},t.prototype.len=function(){return this._list.len()},t}(),un={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function hn(t){return(t=Math.round(t))<0?0:t>255?255:t}function cn(t){return t<0?0:t>1?1:t}function pn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?hn(parseFloat(e)/100*255):hn(parseInt(e,10))}function dn(t){var e=t;return e.length&&"%"===e.charAt(e.length-1)?cn(parseFloat(e)/100):cn(parseFloat(e))}function fn(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function gn(t,e,n){return t+(e-t)*n}function yn(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function vn(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}var mn=new ln(20),xn=null;function _n(t,e){xn&&vn(xn,e),xn=mn.put(t,xn||e.slice())}function bn(t,e){if(t){e=e||[];var n=mn.get(t);if(n)return vn(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in un)return vn(e,un[i]),_n(t,e),e;var r,o=i.length;if("#"===i.charAt(0))return 4===o||5===o?(r=parseInt(i.slice(1,4),16))>=0&&r<=4095?(yn(e,(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,5===o?parseInt(i.slice(4),16)/15:1),_n(t,e),e):void yn(e,0,0,0,1):7===o||9===o?(r=parseInt(i.slice(1,7),16))>=0&&r<=16777215?(yn(e,(16711680&r)>>16,(65280&r)>>8,255&r,9===o?parseInt(i.slice(7),16)/255:1),_n(t,e),e):void yn(e,0,0,0,1):void 0;var a=i.indexOf("("),s=i.indexOf(")");if(-1!==a&&s+1===o){var l=i.substr(0,a),u=i.substr(a+1,s-(a+1)).split(","),h=1;switch(l){case"rgba":if(4!==u.length)return 3===u.length?yn(e,+u[0],+u[1],+u[2],1):yn(e,0,0,0,1);h=dn(u.pop());case"rgb":return 3!==u.length?void yn(e,0,0,0,1):(yn(e,pn(u[0]),pn(u[1]),pn(u[2]),h),_n(t,e),e);case"hsla":return 4!==u.length?void yn(e,0,0,0,1):(u[3]=dn(u[3]),wn(u,e),_n(t,e),e);case"hsl":return 3!==u.length?void yn(e,0,0,0,1):(wn(u,e),_n(t,e),e);default:return}}yn(e,0,0,0,1)}}function wn(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=dn(t[1]),r=dn(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return yn(e=e||[],hn(255*fn(a,o,n+1/3)),hn(255*fn(a,o,n)),hn(255*fn(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Sn(t,e){var n=bn(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:n[i]<0&&(n[i]=0);return kn(n,4===n.length?"rgba":"rgb")}}function Mn(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=hn(gn(a[0],s[0],l)),n[1]=hn(gn(a[1],s[1],l)),n[2]=hn(gn(a[2],s[2],l)),n[3]=cn(gn(a[3],s[3],l)),n}}var In=Mn;function Tn(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=bn(e[r]),s=bn(e[o]),l=i-r,u=kn([hn(gn(a[0],s[0],l)),hn(gn(a[1],s[1],l)),hn(gn(a[2],s[2],l)),cn(gn(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}var Cn=Tn;function Dn(t,e,n,i){var r=bn(t);if(t)return r=function(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,p=((s-o)/6+l/2)/l;i===s?e=p-c:r===s?e=1/3+h-p:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,u];return null!=t[3]&&d.push(t[3]),d}}(r),null!=e&&(r[0]=function(t){return(t=Math.round(t))<0?0:t>360?360:t}(e)),null!=n&&(r[1]=dn(n)),null!=i&&(r[2]=dn(i)),kn(wn(r),"rgba")}function An(t,e){var n=bn(t);if(n&&null!=e)return n[3]=cn(e),kn(n,"rgba")}function kn(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function Ln(t,e){var n=bn(t);return n?(.299*n[0]+.587*n[1]+.114*n[2])*n[3]/255+(1-n[3])*e:0}var Pn=Object.freeze({__proto__:null,parse:bn,lift:Sn,toHex:function(t){var e=bn(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)},fastLerp:Mn,fastMapToColor:In,lerp:Tn,mapToColor:Cn,modifyHSL:Dn,modifyAlpha:An,stringify:kn,lum:Ln,random:function(){return kn([Math.round(255*Math.random()),Math.round(255*Math.random()),Math.round(255*Math.random())],"rgb")}}),On=Math.round;function Rn(t){var e;if(t&&"transparent"!==t){if("string"==typeof t&&t.indexOf("rgba")>-1){var n=bn(t);n&&(t="rgb("+n[0]+","+n[1]+","+n[2]+")",e=n[3])}}else t="none";return{color:t,opacity:null==e?1:e}}var Nn=1e-4;function En(t){return t-1e-4}function zn(t){return On(1e3*t)/1e3}function Vn(t){return On(1e4*t)/1e4}var Bn={left:"start",right:"end",center:"middle",middle:"middle"};function Fn(t){return t&&!!t.image}function Gn(t){return"linear"===t.type}function Wn(t){return"radial"===t.type}function Hn(t){return"url(#"+t+")"}function Yn(t){var e=t.getGlobalScale(),n=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(n)/Math.log(10)),1)}function Un(t){var e=t.x||0,n=t.y||0,i=(t.rotation||0)*_t,r=rt(t.scaleX,1),o=rt(t.scaleY,1),a=t.skewX||0,s=t.skewY||0,l=[];return(e||n)&&l.push("translate("+e+"px,"+n+"px)"),i&&l.push("rotate("+i+")"),1===r&&1===o||l.push("scale("+r+","+o+")"),(a||s)&&l.push("skew("+On(a*_t)+"deg, "+On(s*_t)+"deg)"),l.join(" ")}var Xn=r.hasGlobalWindow&&U(window.btoa)?function(t){return window.btoa(unescape(t))}:"undefined"!=typeof Buffer?function(t){return Buffer.from(t).toString("base64")}:function(t){return null},Zn=Array.prototype.slice;function jn(t,e,n){return(e-t)*n+t}function qn(t,e,n,i){for(var r=e.length,o=0;oi?e:t,o=Math.min(n,i),a=r[o-1]||{color:[0,0,0,0],offset:0},s=o;sa)i.length=a;else for(var s=o;s=1},t.prototype.getAdditiveTrack=function(){return this._additiveTrack},t.prototype.addKeyframe=function(t,e,n){this._needsSort=!0;var i=this.keyframes,r=i.length,o=!1,a=6,s=e;if(N(e)){var l=function(t){return N(t&&t[0])?2:1}(e);a=l,(1===l&&!j(e[0])||2===l&&!j(e[0][0]))&&(o=!0)}else if(j(e)&&!nt(e))a=0;else if(X(e))if(isNaN(+e)){var u=bn(e);u&&(s=u,a=3)}else a=0;else if(Q(e)){var h=A({},s);h.colorStops=z(e.colorStops,(function(t){return{offset:t.offset,color:bn(t.color)}})),Gn(e)?a=4:Wn(e)&&(a=5),s=h}0===r?this.valType=a:a===this.valType&&6!==a||(o=!0),this.discrete=this.discrete||o;var c={time:t,value:s,rawValue:e,percent:0};return n&&(c.easing=n,c.easingFunc=U(n)?n:Le[n]||rn(n)),i.push(c),c},t.prototype.prepare=function(t,e){var n=this.keyframes;this._needsSort&&n.sort((function(t,e){return t.time-e.time}));for(var i=this.valType,r=n.length,o=n[r-1],a=this.discrete,s=ii(i),l=ni(i),u=0;u=0&&!(l[n].percent<=e);n--);n=d(n,u-2)}else{for(n=p;ne);n++);n=d(n-1,u-2)}r=l[n+1],i=l[n]}if(i&&r){this._lastFr=n,this._lastFrP=e;var f=r.percent-i.percent,g=0===f?1:d((e-i.percent)/f,1);r.easingFunc&&(g=r.easingFunc(g));var y=o?this._additiveValue:c?ri:t[h];if(!ii(s)&&!c||y||(y=this._additiveValue=[]),this.discrete)t[h]=g<1?i.rawValue:r.rawValue;else if(ii(s))1===s?qn(y,i[a],r[a],g):function(t,e,n,i){for(var r=e.length,o=r&&e[0].length,a=0;a0&&s.addKeyframe(0,ti(l),i),this._trackKeys.push(a)}s.addKeyframe(t,ti(e[a]),i)}return this._maxTime=Math.max(this._maxTime,t),this},t.prototype.pause=function(){this._clip.pause(),this._paused=!0},t.prototype.resume=function(){this._clip.resume(),this._paused=!1},t.prototype.isPaused=function(){return!!this._paused},t.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},t.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var e=t.length,n=0;n0)){this._started=1;for(var e=this,n=[],i=this._maxTime||0,r=0;r1){var a=o.pop();r.addKeyframe(a.time,t[i]),r.prepare(this._maxTime,r.getAdditiveTrack())}}}},t}();function si(){return(new Date).getTime()}var li,ui,hi=function(t){function e(e){var n=t.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,e=e||{},n.stage=e.stage||{},n}return n(e,t),e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var e=t.getClip();e&&this.addClip(e)},e.prototype.removeClip=function(t){if(t.animation){var e=t.prev,n=t.next;e?e.next=n:this._head=n,n?n.prev=e:this._tail=e,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var e=t.getClip();e&&this.removeClip(e),t.animation=null},e.prototype.update=function(t){for(var e=si()-this._pausedTime,n=e-this._time,i=this._head;i;){var r=i.next;i.step(e,n)?(i.ondestroy(),this.removeClip(i),i=r):i=r}this._time=e,t||(this.trigger("frame",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0,ke((function e(){t._running&&(ke(e),!t._paused&&t.update())}))},e.prototype.start=function(){this._running||(this._time=si(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=si(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=si()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._head;t;){var e=t.next;t.prev=t.next=t.animation=null,t=e}this._head=this._tail=null},e.prototype.isFinished=function(){return null==this._head},e.prototype.animate=function(t,e){e=e||{},this.start();var n=new ai(t,e.loop);return this.addAnimator(n),n},e}(Xt),ci=r.domSupported,pi=(ui={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},{mouse:li=["click","dblclick","mousewheel","wheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],touch:["touchstart","touchend","touchmove"],pointer:z(li,(function(t){var e=t.replace("mouse","pointer");return ui.hasOwnProperty(e)?e:t}))}),di=["mousemove","mouseup"],fi=["pointermove","pointerup"],gi=!1;function yi(t){var e=t.pointerType;return"pen"===e||"touch"===e}function vi(t){t&&(t.zrByTouch=!0)}function mi(t,e){for(var n=e,i=!1;n&&9!==n.nodeType&&!(i=n.domBelongToZr||n!==e&&n===t.painterRoot);)n=n.parentNode;return i}var xi=function(t,e){this.stopPropagation=xt,this.stopImmediatePropagation=xt,this.preventDefault=xt,this.type=e.type,this.target=this.currentTarget=t.dom,this.pointerType=e.pointerType,this.clientX=e.clientX,this.clientY=e.clientY},_i={mousedown:function(t){t=oe(this.dom,t),this.__mayPointerCapture=[t.zrX,t.zrY],this.trigger("mousedown",t)},mousemove:function(t){t=oe(this.dom,t);var e=this.__mayPointerCapture;!e||t.zrX===e[0]&&t.zrY===e[1]||this.__togglePointerCapture(!0),this.trigger("mousemove",t)},mouseup:function(t){t=oe(this.dom,t),this.__togglePointerCapture(!1),this.trigger("mouseup",t)},mouseout:function(t){mi(this,(t=oe(this.dom,t)).toElement||t.relatedTarget)||(this.__pointerCapturing&&(t.zrEventControl="no_globalout"),this.trigger("mouseout",t))},wheel:function(t){gi=!0,t=oe(this.dom,t),this.trigger("mousewheel",t)},mousewheel:function(t){gi||(t=oe(this.dom,t),this.trigger("mousewheel",t))},touchstart:function(t){vi(t=oe(this.dom,t)),this.__lastTouchMoment=new Date,this.handler.processGesture(t,"start"),_i.mousemove.call(this,t),_i.mousedown.call(this,t)},touchmove:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"change"),_i.mousemove.call(this,t)},touchend:function(t){vi(t=oe(this.dom,t)),this.handler.processGesture(t,"end"),_i.mouseup.call(this,t),+new Date-+this.__lastTouchMoment<300&&_i.click.call(this,t)},pointerdown:function(t){_i.mousedown.call(this,t)},pointermove:function(t){yi(t)||_i.mousemove.call(this,t)},pointerup:function(t){_i.mouseup.call(this,t)},pointerout:function(t){yi(t)||_i.mouseout.call(this,t)}};E(["click","dblclick","contextmenu"],(function(t){_i[t]=function(e){e=oe(this.dom,e),this.trigger(t,e)}}));var bi={pointermove:function(t){yi(t)||bi.mousemove.call(this,t)},pointerup:function(t){bi.mouseup.call(this,t)},mousemove:function(t){this.trigger("mousemove",t)},mouseup:function(t){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger("mouseup",t),e&&(t.zrEventControl="only_globalout",this.trigger("mouseout",t))}};function wi(t,e){var n=e.domHandlers;r.pointerEventsSupported?E(pi.pointer,(function(i){Mi(e,i,(function(e){n[i].call(t,e)}))})):(r.touchEventsSupported&&E(pi.touch,(function(i){Mi(e,i,(function(r){n[i].call(t,r),function(t){t.touching=!0,null!=t.touchTimer&&(clearTimeout(t.touchTimer),t.touchTimer=null),t.touchTimer=setTimeout((function(){t.touching=!1,t.touchTimer=null}),700)}(e)}))})),E(pi.mouse,(function(i){Mi(e,i,(function(r){r=re(r),e.touching||n[i].call(t,r)}))})))}function Si(t,e){function n(n){Mi(e,n,(function(i){i=re(i),mi(t,i.target)||(i=function(t,e){return oe(t.dom,new xi(t,e),!0)}(t,i),e.domHandlers[n].call(t,i))}),{capture:!0})}r.pointerEventsSupported?E(fi,n):r.touchEventsSupported||E(di,n)}function Mi(t,e,n,i){t.mounted[e]=n,t.listenerOpts[e]=i,ae(t.domTarget,e,n,i)}function Ii(t){var e,n,i,r,o=t.mounted;for(var a in o)o.hasOwnProperty(a)&&(e=t.domTarget,n=a,i=o[a],r=t.listenerOpts[a],e.removeEventListener(n,i,r));t.mounted={}}var Ti=function(t,e){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=e},Ci=function(t){function e(e,n){var i=t.call(this)||this;return i.__pointerCapturing=!1,i.dom=e,i.painterRoot=n,i._localHandlerScope=new Ti(e,_i),ci&&(i._globalHandlerScope=new Ti(document,bi)),wi(i,i._localHandlerScope),i}return n(e,t),e.prototype.dispose=function(){Ii(this._localHandlerScope),ci&&Ii(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,ci&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var e=this._globalHandlerScope;t?Si(this,e):Ii(e)}},e}(Xt),Di=1;r.hasGlobalWindow&&(Di=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var Ai=Di,ki="#333",Li="#ccc";function Pi(){return[1,0,0,1,0,0]}function Oi(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function Ri(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function Ni(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function Ei(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function zi(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function Vi(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function Bi(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function Fi(t){var e=[1,0,0,1,0,0];return Ri(e,t),e}var Gi=Object.freeze({__proto__:null,create:Pi,identity:Oi,copy:Ri,mul:Ni,translate:Ei,rotate:zi,scale:Vi,invert:Bi,clone:Fi}),Wi=Oi,Hi=5e-5;function Yi(t){return t>Hi||t<-5e-5}var Ui=[],Xi=[],Zi=[1,0,0,1,0,0],ji=Math.abs,qi=function(){function t(){}return t.prototype.getLocalTransform=function(e){return t.getLocalTransform(this,e)},t.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},t.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},t.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},t.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},t.prototype.needLocalTransform=function(){return Yi(this.rotation)||Yi(this.x)||Yi(this.y)||Yi(this.scaleX-1)||Yi(this.scaleY-1)||Yi(this.skewX)||Yi(this.skewY)},t.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,e=this.needLocalTransform(),n=this.transform;e||t?(n=n||[1,0,0,1,0,0],e?this.getLocalTransform(n):Wi(n),t&&(e?Ni(n,t,n):Ri(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)):n&&Wi(n)},t.prototype._resolveGlobalScaleRatio=function(t){var e=this.globalScaleRatio;if(null!=e&&1!==e){this.getGlobalScale(Ui);var n=Ui[0]<0?-1:1,i=Ui[1]<0?-1:1,r=((Ui[0]-n)*e+n)/Ui[0]||0,o=((Ui[1]-i)*e+i)/Ui[1]||0;t[0]*=r,t[1]*=r,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||[1,0,0,1,0,0],Bi(this.invTransform,t)},t.prototype.getComputedTransform=function(){for(var t=this,e=[];t;)e.push(t),t=t.parent;for(;t=e.pop();)t.updateTransform();return this.transform},t.prototype.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),r=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(r),e=Math.sqrt(e),this.skewX=r,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=e,this.scaleY=n,this.originX=0,this.originY=0}},t.prototype.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(Ni(Xi,t.invTransform,e),e=Xi);var n=this.originX,i=this.originY;(n||i)&&(Zi[4]=n,Zi[5]=i,Ni(Xi,e,Zi),Xi[4]-=n,Xi[5]-=i,e=Xi),this.setLocalTransform(e)}},t.prototype.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},t.prototype.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&Ft(n,n,i),n},t.prototype.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&Ft(n,n,i),n},t.prototype.getLineScale=function(){var t=this.transform;return t&&ji(t[0]-1)>1e-10&&ji(t[3]-1)>1e-10?Math.sqrt(ji(t[0]*t[3]-t[2]*t[1])):1},t.prototype.copyTransform=function(t){$i(this,t)},t.getLocalTransform=function(t,e){e=e||[];var n=t.originX||0,i=t.originY||0,r=t.scaleX,o=t.scaleY,a=t.anchorX,s=t.anchorY,l=t.rotation||0,u=t.x,h=t.y,c=t.skewX?Math.tan(t.skewX):0,p=t.skewY?Math.tan(-t.skewY):0;if(n||i||a||s){var d=n+a,f=i+s;e[4]=-d*r-c*f*o,e[5]=-f*o-p*d*r}else e[4]=e[5]=0;return e[0]=r,e[3]=o,e[1]=p*r,e[2]=c*o,l&&zi(e,e,l),e[4]+=n+u,e[5]+=i+h,e},t.initDefaultProps=function(){var e=t.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),t}(),Ki=["x","y","originX","originY","anchorX","anchorY","rotation","scaleX","scaleY","skewX","skewY"];function $i(t,e){for(var n=0;nf&&(f=x,gf&&(f=_,v=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(e){t.copy(this,e)},t.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},t.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},t.prototype.isZero=function(){return 0===this.width||0===this.height},t.create=function(e){return new t(e.x,e.y,e.width,e.height)},t.copy=function(t,e){t.x=e.x,t.y=e.y,t.width=e.width,t.height=e.height},t.applyTransform=function(e,n,i){if(i){if(i[1]<1e-5&&i[1]>-1e-5&&i[2]<1e-5&&i[2]>-1e-5){var r=i[0],o=i[3],a=i[4],s=i[5];return e.x=n.x*r+a,e.y=n.y*o+s,e.width=n.width*r,e.height=n.height*o,e.width<0&&(e.x+=e.width,e.width=-e.width),void(e.height<0&&(e.y+=e.height,e.height=-e.height))}er.x=ir.x=n.x,er.y=rr.y=n.y,nr.x=rr.x=n.x+n.width,nr.y=ir.y=n.y+n.height,er.transform(i),rr.transform(i),nr.transform(i),ir.transform(i),e.x=Qi(er.x,nr.x,ir.x,rr.x),e.y=Qi(er.y,nr.y,ir.y,rr.y);var l=tr(er.x,nr.x,ir.x,rr.x),u=tr(er.y,nr.y,ir.y,rr.y);e.width=l-e.x,e.height=u-e.y}else e!==n&&t.copy(e,n)},t}(),lr={};function ur(t,e){var n=lr[e=e||a];n||(n=lr[e]=new ln(500));var i=n.get(t);return null==i&&(i=h.measureText(t,e).width,n.put(t,i)),i}function hr(t,e,n,i){var r=ur(t,e),o=fr(e),a=pr(0,r,n),s=dr(0,o,i);return new sr(a,s,r,o)}function cr(t,e,n,i){var r=((t||"")+"").split("\n");if(1===r.length)return hr(r[0],e,n,i);for(var o=new sr(0,0,0,0),a=0;a=0?parseFloat(t)/100*e:parseFloat(t):t}function yr(t,e,n){var i=e.position||"inside",r=null!=e.distance?e.distance:5,o=n.height,a=n.width,s=o/2,l=n.x,u=n.y,h="left",c="top";if(i instanceof Array)l+=gr(i[0],n.width),u+=gr(i[1],n.height),h=null,c=null;else switch(i){case"left":l-=r,u+=s,h="right",c="middle";break;case"right":l+=r+a,u+=s,c="middle";break;case"top":l+=a/2,u-=r,h="center",c="bottom";break;case"bottom":l+=a/2,u+=o+r,h="center";break;case"inside":l+=a/2,u+=s,h="center",c="middle";break;case"insideLeft":l+=r,u+=s,c="middle";break;case"insideRight":l+=a-r,u+=s,h="right",c="middle";break;case"insideTop":l+=a/2,u+=r,h="center";break;case"insideBottom":l+=a/2,u+=o-r,h="center",c="bottom";break;case"insideTopLeft":l+=r,u+=r;break;case"insideTopRight":l+=a-r,u+=r,h="right";break;case"insideBottomLeft":l+=r,u+=o-r,c="bottom";break;case"insideBottomRight":l+=a-r,u+=o-r,h="right",c="bottom"}return(t=t||{}).x=l,t.y=u,t.align=h,t.verticalAlign=c,t}var vr="__zr_normal__",mr=Ki.concat(["ignore"]),xr=V(Ki,(function(t,e){return t[e]=!0,t}),{ignore:!1}),_r={},br=new sr(0,0,0,0),wr=function(){function t(t){this.id=M(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return t.prototype._init=function(t){this.attr(t)},t.prototype.drift=function(t,e,n){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.markRedraw()},t.prototype.beforeUpdate=function(){},t.prototype.afterUpdate=function(){},t.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},t.prototype.updateInnerText=function(t){var e=this._textContent;if(e&&(!e.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,r=e.innerTransformable,o=void 0,a=void 0,s=!1;r.parent=i?this:null;var l=!1;if(r.copyTransform(e),null!=n.position){var u=br;n.layoutRect?u.copy(n.layoutRect):u.copy(this.getBoundingRect()),i||u.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(_r,n,u):yr(_r,n,u),r.x=_r.x,r.y=_r.y,o=_r.align,a=_r.verticalAlign;var h=n.origin;if(h&&null!=n.rotation){var c=void 0,p=void 0;"center"===h?(c=.5*u.width,p=.5*u.height):(c=gr(h[0],u.width),p=gr(h[1],u.height)),l=!0,r.originX=-r.x+c+(i?0:u.x),r.originY=-r.y+p+(i?0:u.y)}}null!=n.rotation&&(r.rotation=n.rotation);var d=n.offset;d&&(r.x+=d[0],r.y+=d[1],l||(r.originX=-d[0],r.originY=-d[1]));var f=null==n.inside?"string"==typeof n.position&&n.position.indexOf("inside")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,v=void 0,m=void 0;f&&this.canBeInsideText()?(y=n.insideFill,v=n.insideStroke,null!=y&&"auto"!==y||(y=this.getInsideTextFill()),null!=v&&"auto"!==v||(v=this.getInsideTextStroke(y),m=!0)):(y=n.outsideFill,v=n.outsideStroke,null!=y&&"auto"!==y||(y=this.getOutsideFill()),null!=v&&"auto"!==v||(v=this.getOutsideStroke(y),m=!0)),(y=y||"#000")===g.fill&&v===g.stroke&&m===g.autoStroke&&o===g.align&&a===g.verticalAlign||(s=!0,g.fill=y,g.stroke=v,g.autoStroke=m,g.align=o,g.verticalAlign=a,e.setDefaultTextStyle(g)),e.__dirty|=1,s&&e.dirtyStyle(!0)}},t.prototype.canBeInsideText=function(){return!0},t.prototype.getInsideTextFill=function(){return"#fff"},t.prototype.getInsideTextStroke=function(t){return"#000"},t.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Li:ki},t.prototype.getOutsideStroke=function(t){var e=this.__zr&&this.__zr.getBackgroundColor(),n="string"==typeof e&&bn(e);n||(n=[255,255,255,1]);for(var i=n[3],r=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(r?0:255)*(1-i);return n[3]=1,kn(n,"rgba")},t.prototype.traverse=function(t,e){},t.prototype.attrKV=function(t,e){"textConfig"===t?this.setTextConfig(e):"textContent"===t?this.setTextContent(e):"clipPath"===t?this.setClipPath(e):"extra"===t?(this.extra=this.extra||{},A(this.extra,e)):this[t]=e},t.prototype.hide=function(){this.ignore=!0,this.markRedraw()},t.prototype.show=function(){this.ignore=!1,this.markRedraw()},t.prototype.attr=function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(q(t))for(var n=G(t),i=0;i0},t.prototype.getState=function(t){return this.states[t]},t.prototype.ensureState=function(t){var e=this.states;return e[t]||(e[t]={}),e[t]},t.prototype.clearStates=function(t){this.useState(vr,!1,t)},t.prototype.useState=function(t,e,n,i){var r=t===vr;if(this.hasState()||!r){var o=this.currentStates,a=this.stateTransition;if(!(P(o,t)>=0)||!e&&1!==o.length){var s;if(this.stateProxy&&!r&&(s=this.stateProxy(t)),s||(s=this.states&&this.states[t]),s||r){r||this.saveCurrentToNormalState(s);var l=!!(s&&s.hoverLayer||i);l&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,s,this._normalState,e,!n&&!this.__inHover&&a&&a.duration>0,a);var u=this._textContent,h=this._textGuide;return u&&u.useState(t,e,n,l),h&&h.useState(t,e,n,l),r?(this.currentStates=[],this._normalState={}):e?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!l&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2),s}I("State "+t+" not exists.")}}},t.prototype.useStates=function(t,e,n){if(t.length){var i=[],r=this.currentStates,o=t.length,a=o===r.length;if(a)for(var s=0;s0,d);var f=this._textContent,g=this._textGuide;f&&f.useStates(t,e,c),g&&g.useStates(t,e,c),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!c&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=-2)}else this.clearStates()},t.prototype._updateAnimationTargets=function(){for(var t=0;t=0){var n=this.currentStates.slice();n.splice(e,1),this.useStates(n)}},t.prototype.replaceState=function(t,e,n){var i=this.currentStates.slice(),r=P(i,t),o=P(i,e)>=0;r>=0?o?i.splice(r,1):i[r]=e:n&&!o&&i.push(e),this.useStates(i)},t.prototype.toggleState=function(t,e){e?this.useState(t,!0):this.removeState(t)},t.prototype._mergeStates=function(t){for(var e,n={},i=0;i=0&&e.splice(n,1)})),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},t.prototype.updateDuringAnimation=function(t){this.markRedraw()},t.prototype.stopAnimation=function(t,e){for(var n=this.animators,i=n.length,r=[],o=0;o0&&n.during&&o[0].during((function(t,e){n.during(e)}));for(var p=0;p0||r.force&&!a.length){var w,S=void 0,M=void 0,I=void 0;if(s){M={},p&&(S={});for(_=0;_=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,e){var n=P(this._children,t);return n>=0&&this.replaceAt(e,n),this},e.prototype.replaceAt=function(t,e){var n=this._children,i=n[e];if(t&&t!==this&&t.parent!==this&&t!==i){n[e]=t,i.parent=null;var r=this.__zr;r&&i.removeSelfFromZr(r),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__zr;e&&e!==t.__zr&&t.addSelfToZr(e),e&&e.refresh()},e.prototype.remove=function(t){var e=this.__zr,n=this._children,i=P(n,t);return i<0||(n.splice(i,1),t.parent=null,e&&t.removeSelfFromZr(e),e&&e.refresh()),this},e.prototype.removeAll=function(){for(var t=this._children,e=this.__zr,n=0;n0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},t.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},t.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},t.prototype.refreshHover=function(){this._needsRefreshHover=!0},t.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&"canvas"===this.painter.getType()&&this.painter.refreshHover()},t.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},t.prototype.clearAnimation=function(){this.animation.clear()},t.prototype.getWidth=function(){return this.painter.getWidth()},t.prototype.getHeight=function(){return this.painter.getHeight()},t.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},t.prototype.findHover=function(t,e){return this.handler.findHover(t,e)},t.prototype.on=function(t,e,n){return this.handler.on(t,e,n),this},t.prototype.off=function(t,e){this.handler.off(t,e)},t.prototype.trigger=function(t,e){this.handler.trigger(t,e)},t.prototype.clear=function(){for(var t=this.storage.getRoots(),e=0;e0){if(t<=r)return a;if(t>=o)return s}else{if(t>=r)return a;if(t<=o)return s}else{if(t===r)return a;if(t===o)return s}return(t-r)/l*u+a}function Er(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return X(t)?(n=t,n.replace(/^\s+|\s+$/g,"")).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t;var n}function zr(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Vr(t){return t.sort((function(t,e){return t-e})),t}function Br(t){if(t=+t,isNaN(t))return 0;if(t>1e-14)for(var e=1,n=0;n<15;n++,e*=10)if(Math.round(t*e)/e===t)return n;return Fr(t)}function Fr(t){var e=t.toString().toLowerCase(),n=e.indexOf("e"),i=n>0?+e.slice(n+1):0,r=n>0?n:e.length,o=e.indexOf("."),a=o<0?0:r-1-o;return Math.max(0,a-i)}function Gr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Wr(t,e,n){if(!t[e])return 0;var i=V(t,(function(t,e){return t+(isNaN(e)?0:e)}),0);if(0===i)return 0;for(var r=Math.pow(10,n),o=z(t,(function(t){return(isNaN(t)?0:t)/i*r*100})),a=100*r,s=z(o,(function(t){return Math.floor(t)})),l=V(s,(function(t,e){return t+e}),0),u=z(o,(function(t,e){return t-s[e]}));lh&&(h=u[p],c=p);++s[c],u[c]=0,++l}return s[e]/r}function Hr(t,e){var n=Math.max(Br(t),Br(e)),i=t+e;return n>20?i:zr(i,n)}var Yr=9007199254740991;function Ur(t){var e=2*Math.PI;return(t%e+e)%e}function Xr(t){return t>-1e-4&&t=10&&e++,e}function $r(t,e){var n=Kr(t),i=Math.pow(10,n),r=t/i;return t=(e?r<1.5?1:r<2.5?2:r<4?3:r<7?5:10:r<1?1:r<2?2:r<3?3:r<5?5:10)*i,n>=-20?+t.toFixed(n<0?-n:0):t}function Jr(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r}function Qr(t){t.sort((function(t,e){return s(t,e,0)?-1:1}));for(var e=-1/0,n=1,i=0;i=0||r&&P(r,s)<0)){var l=n.getShallow(s,e);null!=l&&(o[t[a][0]]=l)}}return o}}var Ho=Wo([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),Yo=function(){function t(){}return t.prototype.getAreaStyle=function(t,e){return Ho(this,t,e)},t}(),Uo=new ln(50);function Xo(t){if("string"==typeof t){var e=Uo.get(t);return e&&e.image}return t}function Zo(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=Uo.get(t),a={hostEl:n,cb:i,cbPayload:r};if(o)!qo(e=o.image)&&o.pending.push(a);else{var s=h.loadImage(t,jo,jo);s.__zrImageSrc=t,Uo.put(t,s.__cachedImgObj={image:s,pending:[a]})}return e}return t}return e}function jo(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e=a;l++)s-=a;var u=ur(n,e);return u>s&&(n="",u=0),s=t-u,r.ellipsis=n,r.ellipsisWidth=u,r.contentWidth=s,r.containerWidth=t,r}function Qo(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=ur(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?ta(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=ur(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function ta(t,e,n,i){for(var r=0,o=0,a=t.length;o0&&f+i.accumWidth>i.width&&(o=e.split("\n"),c=!0),i.accumWidth=f}else{var g=sa(e,h,i.width,i.breakAll,i.accumWidth);i.accumWidth=g.accumWidth+d,a=g.linesWidths,o=g.lines}}else o=e.split("\n");for(var y=0;y=33&&e<=383}(t)||!!oa[t]}function sa(t,e,n,i,r){for(var o=[],a=[],s="",l="",u=0,h=0,c=0;cn:r+h+d>n)?h?(s||l)&&(f?(s||(s=l,l="",h=u=0),o.push(s),a.push(h-u),l+=p,s="",h=u+=d):(l&&(s+=l,l="",u=0),o.push(s),a.push(h),s=p,h=d)):f?(o.push(l),a.push(u),l=p,u=d):(o.push(p),a.push(d)):(h+=d,f?(l+=p,u+=d):(l&&(s+=l,l="",u=0),s+=p))}else l&&(s+=l,h+=u),o.push(s),a.push(h),s="",l="",u=0,h=0}return o.length||s||(s=t,l="",u=0),l&&(s+=l),s&&(o.push(s),a.push(h)),1===o.length&&(h+=r),{accumWidth:h,lines:o,linesWidths:a}}var la="__zr_style_"+Math.round(10*Math.random()),ua={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:"#000",opacity:1,blend:"source-over"},ha={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};ua[la]=!0;var ca=["z","z2","invisible"],pa=["invisible"],da=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype._init=function(e){for(var n=G(e),i=0;i1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(ba[0]=xa(r)*n+t,ba[1]=ma(r)*i+e,wa[0]=xa(o)*n+t,wa[1]=ma(o)*i+e,u(s,ba,wa),h(l,ba,wa),(r%=_a)<0&&(r+=_a),(o%=_a)<0&&(o+=_a),r>o&&!a?o+=_a:rr&&(Sa[0]=xa(d)*n+t,Sa[1]=ma(d)*i+e,u(s,Sa,s),h(l,Sa,l))}var La={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},Pa=[],Oa=[],Ra=[],Na=[],Ea=[],za=[],Va=Math.min,Ba=Math.max,Fa=Math.cos,Ga=Math.sin,Wa=Math.abs,Ha=Math.PI,Ya=2*Ha,Ua="undefined"!=typeof Float32Array,Xa=[];function Za(t){return Math.round(t/Ha*1e8)/1e8%2*Ha}var ja=function(){function t(t){this.dpr=1,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._len=0,t&&(this._saveData=!1),this._saveData&&(this.data=[])}return t.prototype.increaseVersion=function(){this._version++},t.prototype.getVersion=function(){return this._version},t.prototype.setScale=function(t,e,n){(n=n||0)>0&&(this._ux=Wa(n/Ai/t)||0,this._uy=Wa(n/Ai/e)||0)},t.prototype.setDPR=function(t){this.dpr=t},t.prototype.setContext=function(t){this._ctx=t},t.prototype.getContext=function(){return this._ctx},t.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},t.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},t.prototype.moveTo=function(t,e){return this._drawPendingPt(),this.addData(La.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},t.prototype.lineTo=function(t,e){var n=Wa(t-this._xi),i=Wa(e-this._yi),r=n>this._ux||i>this._uy;if(this.addData(La.L,t,e),this._ctx&&r&&this._ctx.lineTo(t,e),r)this._xi=t,this._yi=e,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=e,this._pendingPtDist=o)}return this},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){return this._drawPendingPt(),this.addData(La.C,t,e,n,i,r,o),this._ctx&&this._ctx.bezierCurveTo(t,e,n,i,r,o),this._xi=r,this._yi=o,this},t.prototype.quadraticCurveTo=function(t,e,n,i){return this._drawPendingPt(),this.addData(La.Q,t,e,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,e,n,i),this._xi=n,this._yi=i,this},t.prototype.arc=function(t,e,n,i,r,o){this._drawPendingPt(),Xa[0]=i,Xa[1]=r,function(t,e){var n=Za(t[0]);n<0&&(n+=Ya);var i=n-t[0],r=t[1];r+=i,!e&&r-n>=Ya?r=n+Ya:e&&n-r>=Ya?r=n-Ya:!e&&n>r?r=n+(Ya-Za(n-r)):e&&nu.length&&(this._expandData(),u=this.data);for(var h=0;h0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},t.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e11&&(this.data=new Float32Array(t)))}},t.prototype.getBoundingRect=function(){Ra[0]=Ra[1]=Ea[0]=Ea[1]=Number.MAX_VALUE,Na[0]=Na[1]=za[0]=za[1]=-Number.MAX_VALUE;var t,e=this.data,n=0,i=0,r=0,o=0;for(t=0;tn||Wa(y)>i||c===e-1)&&(f=Math.sqrt(A*A+y*y),r=g,o=x);break;case La.C:var v=t[c++],m=t[c++],x=(g=t[c++],t[c++]),_=t[c++],b=t[c++];f=qe(r,o,v,m,g,x,_,b,10),r=_,o=b;break;case La.Q:f=en(r,o,v=t[c++],m=t[c++],g=t[c++],x=t[c++],10),r=g,o=x;break;case La.A:var w=t[c++],S=t[c++],M=t[c++],I=t[c++],T=t[c++],C=t[c++],D=C+T;c+=1;t[c++];d&&(a=Fa(T)*M+w,s=Ga(T)*I+S),f=Ba(M,I)*Va(Ya,Math.abs(C)),r=Fa(D)*M+w,o=Ga(D)*I+S;break;case La.R:a=r=t[c++],s=o=t[c++],f=2*t[c++]+2*t[c++];break;case La.Z:var A=a-r;y=s-o;f=Math.sqrt(A*A+y*y),r=a,o=s}f>=0&&(l[h++]=f,u+=f)}return this._pathLen=u,u},t.prototype.rebuildPath=function(t,e){var n,i,r,o,a,s,l,u,h,c,p=this.data,d=this._ux,f=this._uy,g=this._len,y=e<1,v=0,m=0,x=0;if(!y||(this._pathSegLen||this._calculateLength(),l=this._pathSegLen,u=e*this._pathLen))t:for(var _=0;_0&&(t.lineTo(h,c),x=0),b){case La.M:n=r=p[_++],i=o=p[_++],t.moveTo(r,o);break;case La.L:a=p[_++],s=p[_++];var S=Wa(a-r),M=Wa(s-o);if(S>d||M>f){if(y){if(v+(j=l[m++])>u){var I=(u-v)/j;t.lineTo(r*(1-I)+a*I,o*(1-I)+s*I);break t}v+=j}t.lineTo(a,s),r=a,o=s,x=0}else{var T=S*S+M*M;T>x&&(h=a,c=s,x=T)}break;case La.C:var C=p[_++],D=p[_++],A=p[_++],k=p[_++],L=p[_++],P=p[_++];if(y){if(v+(j=l[m++])>u){Ze(r,C,A,L,I=(u-v)/j,Pa),Ze(o,D,k,P,I,Oa),t.bezierCurveTo(Pa[1],Oa[1],Pa[2],Oa[2],Pa[3],Oa[3]);break t}v+=j}t.bezierCurveTo(C,D,A,k,L,P),r=L,o=P;break;case La.Q:C=p[_++],D=p[_++],A=p[_++],k=p[_++];if(y){if(v+(j=l[m++])>u){Qe(r,C,A,I=(u-v)/j,Pa),Qe(o,D,k,I,Oa),t.quadraticCurveTo(Pa[1],Oa[1],Pa[2],Oa[2]);break t}v+=j}t.quadraticCurveTo(C,D,A,k),r=A,o=k;break;case La.A:var O=p[_++],R=p[_++],N=p[_++],E=p[_++],z=p[_++],V=p[_++],B=p[_++],F=!p[_++],G=N>E?N:E,W=Wa(N-E)>.001,H=z+V,Y=!1;if(y)v+(j=l[m++])>u&&(H=z+V*(u-v)/j,Y=!0),v+=j;if(W&&t.ellipse?t.ellipse(O,R,N,E,B,z,H,F):t.arc(O,R,G,z,H,F),Y)break t;w&&(n=Fa(z)*N+O,i=Ga(z)*E+R),r=Fa(H)*N+O,o=Ga(H)*E+R;break;case La.R:n=r=p[_],i=o=p[_+1],a=p[_++],s=p[_++];var U=p[_++],X=p[_++];if(y){if(v+(j=l[m++])>u){var Z=u-v;t.moveTo(a,s),t.lineTo(a+Va(Z,U),s),(Z-=U)>0&&t.lineTo(a+U,s+Va(Z,X)),(Z-=X)>0&&t.lineTo(a+Ba(U-Z,0),s+X),(Z-=U)>0&&t.lineTo(a,s+Ba(X-Z,0));break t}v+=j}t.rect(a,s,U,X);break;case La.Z:if(y){var j;if(v+(j=l[m++])>u){I=(u-v)/j;t.lineTo(r*(1-I)+n*I,o*(1-I)+i*I);break t}v+=j}t.closePath(),r=n,o=i}}},t.prototype.clone=function(){var e=new t,n=this.data;return e.data=n.slice?n.slice():Array.prototype.slice.call(n),e._len=this._len,e},t.CMD=La,t.initDefaultProps=function(){var e=t.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),t}();function qa(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0;if(a>e+s&&a>i+s||at+s&&o>n+s||oe+c&&h>i+c&&h>o+c&&h>s+c||ht+c&&u>n+c&&u>r+c&&u>a+c||ue+u&&l>i+u&&l>o+u||lt+u&&s>n+u&&s>r+u||sn||h+ur&&(r+=ts);var p=Math.atan2(l,s);return p<0&&(p+=ts),p>=i&&p<=r||p+ts>=i&&p+ts<=r}function ns(t,e,n,i,r,o){if(o>e&&o>i||or?s:0}var is=ja.CMD,rs=2*Math.PI;var os=[-1,-1,-1],as=[-1,-1];function ss(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u1&&(h=void 0,h=as[0],as[0]=as[1],as[1]=h),f=He(e,i,o,s,as[0]),d>1&&(g=He(e,i,o,s,as[1]))),2===d?ve&&s>i&&s>o||s=0&&h<=1&&(r[l++]=h);else{var u=a*a-4*o*s;if(Ge(u))(h=-a/(2*o))>=0&&h<=1&&(r[l++]=h);else if(u>0){var h,c=Oe(u),p=(-a-c)/(2*o);(h=(-a+c)/(2*o))>=0&&h<=1&&(r[l++]=h),p>=0&&p<=1&&(r[l++]=p)}}return l}(e,i,o,s,os);if(0===l)return 0;var u=Je(e,i,o);if(u>=0&&u<=1){for(var h=0,c=Ke(e,i,o,u),p=0;pn||s<-n)return 0;var l=Math.sqrt(n*n-s*s);os[0]=-l,os[1]=l;var u=Math.abs(i-r);if(u<1e-4)return 0;if(u>=rs-1e-4){i=0,r=rs;var h=o?1:-1;return a>=os[0]+t&&a<=os[1]+t?h:0}if(i>r){var c=i;i=r,r=c}i<0&&(i+=rs,r+=rs);for(var p=0,d=0;d<2;d++){var f=os[d];if(f+t>a){var g=Math.atan2(s,f);h=o?1:-1;g<0&&(g=rs+g),(g>=i&&g<=r||g+rs>=i&&g+rs<=r)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),p+=h)}}return p}function hs(t,e,n,i,r){for(var o,a,s,l,u=t.data,h=t.len(),c=0,p=0,d=0,f=0,g=0,y=0;y1&&(n||(c+=ns(p,d,f,g,i,r))),m&&(f=p=u[y],g=d=u[y+1]),v){case is.M:p=f=u[y++],d=g=u[y++];break;case is.L:if(n){if(qa(p,d,u[y],u[y+1],e,i,r))return!0}else c+=ns(p,d,u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case is.C:if(n){if(Ka(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ss(p,d,u[y++],u[y++],u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case is.Q:if(n){if($a(p,d,u[y++],u[y++],u[y],u[y+1],e,i,r))return!0}else c+=ls(p,d,u[y++],u[y++],u[y],u[y+1],i,r)||0;p=u[y++],d=u[y++];break;case is.A:var x=u[y++],_=u[y++],b=u[y++],w=u[y++],S=u[y++],M=u[y++];y+=1;var I=!!(1-u[y++]);o=Math.cos(S)*b+x,a=Math.sin(S)*w+_,m?(f=o,g=a):c+=ns(p,d,o,a,i,r);var T=(i-x)*w/b+x;if(n){if(es(x,_,w,S,S+M,I,e,T,r))return!0}else c+=us(x,_,w,S,S+M,I,T,r);p=Math.cos(S+M)*b+x,d=Math.sin(S+M)*w+_;break;case is.R:if(f=p=u[y++],g=d=u[y++],o=f+u[y++],a=g+u[y++],n){if(qa(f,g,o,g,e,i,r)||qa(o,g,o,a,e,i,r)||qa(o,a,f,a,e,i,r)||qa(f,a,f,g,e,i,r))return!0}else c+=ns(o,g,o,a,i,r),c+=ns(f,a,f,g,i,r);break;case is.Z:if(n){if(qa(p,d,f,g,e,i,r))return!0}else c+=ns(p,d,f,g,i,r);p=f,d=g}}return n||(s=d,l=g,Math.abs(s-l)<1e-4)||(c+=ns(p,d,f,g,i,r)||0),0!==c}var cs=k({fill:"#000",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:"butt",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},ua),ps={style:k({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},ha.style)},ds=Ki.concat(["invisible","culling","z","z2","zlevel","parent"]),fs=function(t){function e(e){return t.call(this,e)||this}var i;return n(e,t),e.prototype.update=function(){var n=this;t.prototype.update.call(this);var i=this.style;if(i.decal){var r=this._decalEl=this._decalEl||new e;r.buildPath===e.prototype.buildPath&&(r.buildPath=function(t){n.buildPath(t,n.shape)}),r.silent=!0;var o=r.style;for(var a in i)o[a]!==i[a]&&(o[a]=i[a]);o.fill=i.fill?i.decal:null,o.decal=null,o.shadowColor=null,i.strokeFirst&&(o.stroke=null);for(var s=0;s.5?ki:e>.2?"#eee":Li}if(t)return Li}return ki},e.prototype.getInsideTextStroke=function(t){var e=this.style.fill;if(X(e)){var n=this.__zr;if(!(!n||!n.isDarkMode())===Ln(t,0)<.4)return e}},e.prototype.buildPath=function(t,e,n){},e.prototype.pathUpdated=function(){this.__dirty&=-5},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new ja(!1)},e.prototype.hasStroke=function(){var t=this.style,e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.getBoundingRect=function(){var t=this._rect,e=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var r=this.path;(i||4&this.__dirty)&&(r.beginPath(),this.buildPath(r,this.shape,!1),this.pathUpdated()),t=r.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var o=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){o.copy(t);var a=e.strokeNoScale?this.getLineScale():1,s=e.lineWidth;if(!this.hasFill()){var l=this.strokeContainThreshold;s=Math.max(s,null==l?4:l)}a>1e-10&&(o.width+=s/a,o.height+=s/a,o.x-=s/a/2,o.y-=s/a/2)}return o}return t},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path;if(this.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(this.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),function(t,e,n,i){return hs(t,e,!0,n,i)}(o,a/s,t,e)))return!0}if(this.hasFill())return function(t,e,n){return hs(t,0,!1,e,n)}(o,t,e)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=4,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate("shape",t)},e.prototype.updateDuringAnimation=function(t){"style"===t?this.dirtyStyle():"shape"===t?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(e,n){"shape"===e?this.setShape(n):t.prototype.attrKV.call(this,e,n)},e.prototype.setShape=function(t,e){var n=this.shape;return n||(n=this.shape={}),"string"==typeof t?n[t]=e:A(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(4&this.__dirty)},e.prototype.createStyle=function(t){return yt(cs,t)},e.prototype._innerSaveToNormal=function(e){t.prototype._innerSaveToNormal.call(this,e);var n=this._normalState;e.shape&&!n.shape&&(n.shape=A({},this.shape))},e.prototype._applyStateObj=function(e,n,i,r,o,a){t.prototype._applyStateObj.call(this,e,n,i,r,o,a);var s,l=!(n&&r);if(n&&n.shape?o?r?s=n.shape:(s=A({},i.shape),A(s,n.shape)):(s=A({},r?this.shape:i.shape),A(s,n.shape)):l&&(s=i.shape),s)if(o){this.shape=A({},this.shape);for(var u={},h=G(s),c=0;c0},e.prototype.hasFill=function(){var t=this.style.fill;return null!=t&&"none"!==t},e.prototype.createStyle=function(t){return yt(gs,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var e=t.text;null!=e?e+="":e="";var n=cr(e,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=void(e.prototype.dirtyRectTolerance=10),e}(da);ys.prototype.type="tspan";var vs=k({x:0,y:0},ua),ms={style:k({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},ha.style)};var xs=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.createStyle=function(t){return yt(vs,t)},e.prototype._getSize=function(t){var e=this.style,n=e[t];if(null!=n)return n;var i,r=(i=e.image)&&"string"!=typeof i&&i.width&&i.height?e.image:this.__image;if(!r)return 0;var o="width"===t?"height":"width",a=e[o];return null==a?r[t]:r[t]/r[o]*a},e.prototype.getWidth=function(){return this._getSize("width")},e.prototype.getHeight=function(){return this._getSize("height")},e.prototype.getAnimationStyleProps=function(){return ms},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new sr(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(da);xs.prototype.type="image";var _s=Math.round;function bs(t,e,n){if(e){var i=e.x1,r=e.x2,o=e.y1,a=e.y2;t.x1=i,t.x2=r,t.y1=o,t.y2=a;var s=n&&n.lineWidth;return s?(_s(2*i)===_s(2*r)&&(t.x1=t.x2=Ss(i,s,!0)),_s(2*o)===_s(2*a)&&(t.y1=t.y2=Ss(o,s,!0)),t):t}}function ws(t,e,n){if(e){var i=e.x,r=e.y,o=e.width,a=e.height;t.x=i,t.y=r,t.width=o,t.height=a;var s=n&&n.lineWidth;return s?(t.x=Ss(i,s,!0),t.y=Ss(r,s,!0),t.width=Math.max(Ss(i+o,s,!1)-t.x,0===o?0:1),t.height=Math.max(Ss(r+a,s,!1)-t.y,0===a?0:1),t):t}}function Ss(t,e,n){if(!e)return t;var i=_s(2*t);return(i+_s(e))%2==0?i/2:(i+(n?1:-1))/2}var Ms=function(){this.x=0,this.y=0,this.width=0,this.height=0},Is={},Ts=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Ms},e.prototype.buildPath=function(t,e){var n,i,r,o;if(this.subPixelOptimize){var a=ws(Is,e,this.style);n=a.x,i=a.y,r=a.width,o=a.height,a.r=e.r,e=a}else n=e.x,i=e.y,r=e.width,o=e.height;e.r?function(t,e){var n,i,r,o,a,s=e.x,l=e.y,u=e.width,h=e.height,c=e.r;u<0&&(s+=u,u=-u),h<0&&(l+=h,h=-h),"number"==typeof c?n=i=r=o=c:c instanceof Array?1===c.length?n=i=r=o=c[0]:2===c.length?(n=r=c[0],i=o=c[1]):3===c.length?(n=c[0],i=o=c[1],r=c[2]):(n=c[0],i=c[1],r=c[2],o=c[3]):n=i=r=o=0,n+i>u&&(n*=u/(a=n+i),i*=u/a),r+o>u&&(r*=u/(a=r+o),o*=u/a),i+r>h&&(i*=h/(a=i+r),r*=h/a),n+o>h&&(n*=h/(a=n+o),o*=h/a),t.moveTo(s+n,l),t.lineTo(s+u-i,l),0!==i&&t.arc(s+u-i,l+i,i,-Math.PI/2,0),t.lineTo(s+u,l+h-r),0!==r&&t.arc(s+u-r,l+h-r,r,0,Math.PI/2),t.lineTo(s+o,l+h),0!==o&&t.arc(s+o,l+h-o,o,Math.PI/2,Math.PI),t.lineTo(s,l+n),0!==n&&t.arc(s+n,l+n,n,Math.PI,1.5*Math.PI)}(t,e):t.rect(n,i,r,o)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(fs);Ts.prototype.type="rect";var Cs={fill:"#000"},Ds={style:k({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},ha.style)},As=function(t){function e(e){var n=t.call(this)||this;return n.type="text",n._children=[],n._defaultStyle=Cs,n.attr(e),n}return n(e,t),e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){t.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var e=0;ed&&h){var f=Math.floor(d/l);n=n.slice(0,f)}if(t&&a&&null!=c)for(var g=Jo(c,o,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),y=0;y0,T=null!=t.width&&("truncate"===t.overflow||"break"===t.overflow||"breakAll"===t.overflow),C=i.calculatedLineHeight,D=0;Dl&&ra(n,t.substring(l,u),e,s),ra(n,i[2],e,s,i[1]),l=Ko.lastIndex}lo){b>0?(m.tokens=m.tokens.slice(0,b),y(m,_,x),n.lines=n.lines.slice(0,v+1)):n.lines=n.lines.slice(0,v);break t}var C=w.width,D=null==C||"auto"===C;if("string"==typeof C&&"%"===C.charAt(C.length-1))P.percentWidth=C,h.push(P),P.contentWidth=ur(P.text,I);else{if(D){var A=w.backgroundColor,k=A&&A.image;k&&qo(k=Xo(k))&&(P.width=Math.max(P.width,k.width*T/k.height))}var L=f&&null!=r?r-_:null;null!=L&&L=0&&"right"===(C=x[T]).align;)this._placeToken(C,t,b,f,I,"right",y),w-=C.width,I-=C.width,T--;for(M+=(n-(M-d)-(g-I)-w)/2;S<=T;)C=x[S],this._placeToken(C,t,b,f,M+C.width/2,"center",y),M+=C.width,S++;f+=b}},e.prototype._placeToken=function(t,e,n,i,r,o,s){var l=e.rich[t.styleName]||{};l.text=t.text;var u=t.verticalAlign,h=i+n/2;"top"===u?h=i+t.height/2:"bottom"===u&&(h=i+n-t.height/2),!t.isLineHolder&&Gs(l)&&this._renderBackground(l,e,"right"===o?r-t.width:"center"===o?r-t.width/2:r,h-t.height/2,t.width,t.height);var c=!!l.backgroundColor,p=t.textPadding;p&&(r=Bs(r,o,p),h-=t.height/2-p[0]-t.innerHeight/2);var d=this._getOrCreateChild(ys),f=d.createStyle();d.useStyle(f);var g=this._defaultStyle,y=!1,v=0,m=Vs("fill"in l?l.fill:"fill"in e?e.fill:(y=!0,g.fill)),x=zs("stroke"in l?l.stroke:"stroke"in e?e.stroke:c||s||g.autoStroke&&!y?null:(v=2,g.stroke)),_=l.textShadowBlur>0||e.textShadowBlur>0;f.text=t.text,f.x=r,f.y=h,_&&(f.shadowBlur=l.textShadowBlur||e.textShadowBlur||0,f.shadowColor=l.textShadowColor||e.textShadowColor||"transparent",f.shadowOffsetX=l.textShadowOffsetX||e.textShadowOffsetX||0,f.shadowOffsetY=l.textShadowOffsetY||e.textShadowOffsetY||0),f.textAlign=o,f.textBaseline="middle",f.font=t.font||a,f.opacity=ot(l.opacity,e.opacity,1),Rs(f,l),x&&(f.lineWidth=ot(l.lineWidth,e.lineWidth,v),f.lineDash=rt(l.lineDash,e.lineDash),f.lineDashOffset=e.lineDashOffset||0,f.stroke=x),m&&(f.fill=m);var b=t.contentWidth,w=t.contentHeight;d.setBoundingRect(new sr(pr(f.x,b,f.textAlign),dr(f.y,w,f.textBaseline),b,w))},e.prototype._renderBackground=function(t,e,n,i,r,o){var a,s,l,u=t.backgroundColor,h=t.borderWidth,c=t.borderColor,p=u&&u.image,d=u&&!p,f=t.borderRadius,g=this;if(d||t.lineHeight||h&&c){(a=this._getOrCreateChild(Ts)).useStyle(a.createStyle()),a.style.fill=null;var y=a.shape;y.x=n,y.y=i,y.width=r,y.height=o,y.r=f,a.dirtyShape()}if(d)(l=a.style).fill=u||null,l.fillOpacity=rt(t.fillOpacity,1);else if(p){(s=this._getOrCreateChild(xs)).onload=function(){g.dirtyStyle()};var v=s.style;v.image=u.image,v.x=n,v.y=i,v.width=r,v.height=o}h&&c&&((l=a.style).lineWidth=h,l.stroke=c,l.strokeOpacity=rt(t.strokeOpacity,1),l.lineDash=t.borderDash,l.lineDashOffset=t.borderDashOffset||0,a.strokeContainThreshold=0,a.hasFill()&&a.hasStroke()&&(l.strokeFirst=!0,l.lineWidth*=2));var m=(a||s).style;m.shadowBlur=t.shadowBlur||0,m.shadowColor=t.shadowColor||"transparent",m.shadowOffsetX=t.shadowOffsetX||0,m.shadowOffsetY=t.shadowOffsetY||0,m.opacity=ot(t.opacity,e.opacity,1)},e.makeFont=function(t){var e="";return Ns(t)&&(e=[t.fontStyle,t.fontWeight,Os(t.fontSize),t.fontFamily||"sans-serif"].join(" ")),e&&ut(e)||t.textFont||t.font},e}(da),ks={left:!0,right:1,center:1},Ls={top:1,bottom:1,middle:1},Ps=["fontStyle","fontWeight","fontSize","fontFamily"];function Os(t){return"string"!=typeof t||-1===t.indexOf("px")&&-1===t.indexOf("rem")&&-1===t.indexOf("em")?isNaN(+t)?"12px":t+"px":t}function Rs(t,e){for(var n=0;n=0,o=!1;if(t instanceof fs){var a=Xs(t),s=r&&a.selectFill||a.normalFill,l=r&&a.selectStroke||a.normalStroke;if(nl(s)||nl(l)){var u=(i=i||{}).style||{};"inherit"===u.fill?(o=!0,i=A({},i),(u=A({},u)).fill=s):!nl(u.fill)&&nl(s)?(o=!0,i=A({},i),(u=A({},u)).fill=rl(s)):!nl(u.stroke)&&nl(l)&&(o||(i=A({},i),u=A({},u)),u.stroke=rl(l)),i.style=u}}if(i&&null==i.z2){o||(i=A({},i));var h=t.z2EmphasisLift;i.z2=t.z2+(null!=h?h:Ks)}return i}(this,0,e,n);if("blur"===t)return function(t,e,n){var i=P(t.currentStates,e)>=0,r=t.style.opacity,o=i?null:function(t,e,n,i){for(var r=t.style,o={},a=0;a0){var o={dataIndex:r,seriesIndex:t.seriesIndex};null!=i&&(o.dataType=i),e.push(o)}}))})),e}function Pl(t,e,n){Vl(t,!0),dl(t,yl),Rl(t,e,n)}function Ol(t,e,n,i){i?function(t){Vl(t,!1)}(t):Pl(t,e,n)}function Rl(t,e,n){var i=Ws(t);null!=e?(i.focus=e,i.blurScope=n):i.focus&&(i.focus=null)}var Nl=["emphasis","blur","select"],El={itemStyle:"getItemStyle",lineStyle:"getLineStyle",areaStyle:"getAreaStyle"};function zl(t,e,n,i){n=n||"itemStyle";for(var r=0;r1&&(a*=Zl(f),s*=Zl(f));var g=(r===o?-1:1)*Zl((a*a*(s*s)-a*a*(d*d)-s*s*(p*p))/(a*a*(d*d)+s*s*(p*p)))||0,y=g*a*d/s,v=g*-s*p/a,m=(t+n)/2+ql(c)*y-jl(c)*v,x=(e+i)/2+jl(c)*y+ql(c)*v,_=Ql([1,0],[(p-y)/a,(d-v)/s]),b=[(p-y)/a,(d-v)/s],w=[(-1*p-y)/a,(-1*d-v)/s],S=Ql(b,w);if(Jl(b,w)<=-1&&(S=Kl),Jl(b,w)>=1&&(S=0),S<0){var M=Math.round(S/Kl*1e6)/1e6;S=2*Kl+M%2*Kl}h.addData(u,m,x,a,s,_,S,c,o)}var eu=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,nu=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g;var iu=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.applyTransform=function(t){},e}(fs);function ru(t){return null!=t.setData}function ou(t,e){var n=function(t){var e=new ja;if(!t)return e;var n,i=0,r=0,o=i,a=r,s=ja.CMD,l=t.match(eu);if(!l)return e;for(var u=0;uk*k+L*L&&(M=T,I=C),{cx:M,cy:I,x0:-h,y0:-c,x1:M*(r/b-1),y1:I*(r/b-1)}}function Mu(t,e){var n,i=_u(e.r,0),r=_u(e.r0||0,0),o=i>0;if(o||r>0){if(o||(i=r,r=0),r>i){var a=i;i=r,r=a}var s=e.startAngle,l=e.endAngle;if(!isNaN(s)&&!isNaN(l)){var u=e.cx,h=e.cy,c=!!e.clockwise,p=mu(l-s),d=p>du&&p%du;if(d>wu&&(p=d),i>wu)if(p>du-wu)t.moveTo(u+i*gu(s),h+i*fu(s)),t.arc(u,h,i,s,l,!c),r>wu&&(t.moveTo(u+r*gu(l),h+r*fu(l)),t.arc(u,h,r,l,s,c));else{var f=void 0,g=void 0,y=void 0,v=void 0,m=void 0,x=void 0,_=void 0,b=void 0,w=void 0,S=void 0,M=void 0,I=void 0,T=void 0,C=void 0,D=void 0,A=void 0,k=i*gu(s),L=i*fu(s),P=r*gu(l),O=r*fu(l),R=p>wu;if(R){var N=e.cornerRadius;N&&(f=(n=function(t){var e;if(Y(t)){var n=t.length;if(!n)return t;e=1===n?[t[0],t[0],0,0]:2===n?[t[0],t[0],t[1],t[1]]:3===n?t.concat(t[2]):t}else e=[t,t,t,t];return e}(N))[0],g=n[1],y=n[2],v=n[3]);var E=mu(i-r)/2;if(m=bu(E,y),x=bu(E,v),_=bu(E,f),b=bu(E,g),M=w=_u(m,x),I=S=_u(_,b),(w>wu||S>wu)&&(T=i*gu(l),C=i*fu(l),D=r*gu(s),A=r*fu(s),pwu){var U=bu(y,M),X=bu(v,M),Z=Su(D,A,k,L,i,U,c),j=Su(T,C,P,O,i,X,c);t.moveTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),M0&&t.arc(u+Z.cx,h+Z.cy,U,vu(Z.y0,Z.x0),vu(Z.y1,Z.x1),!c),t.arc(u,h,i,vu(Z.cy+Z.y1,Z.cx+Z.x1),vu(j.cy+j.y1,j.cx+j.x1),!c),X>0&&t.arc(u+j.cx,h+j.cy,X,vu(j.y1,j.x1),vu(j.y0,j.x0),!c))}else t.moveTo(u+k,h+L),t.arc(u,h,i,s,l,!c);else t.moveTo(u+k,h+L);if(r>wu&&R)if(I>wu){U=bu(f,I),Z=Su(P,O,T,C,r,-(X=bu(g,I)),c),j=Su(k,L,D,A,r,-U,c);t.lineTo(u+Z.cx+Z.x0,h+Z.cy+Z.y0),I0&&t.arc(u+Z.cx,h+Z.cy,X,vu(Z.y0,Z.x0),vu(Z.y1,Z.x1),!c),t.arc(u,h,r,vu(Z.cy+Z.y1,Z.cx+Z.x1),vu(j.cy+j.y1,j.cx+j.x1),c),U>0&&t.arc(u+j.cx,h+j.cy,U,vu(j.y1,j.x1),vu(j.y0,j.x0),!c))}else t.lineTo(u+P,h+O),t.arc(u,h,r,l,s,c);else t.lineTo(u+P,h+O)}else t.moveTo(u,h);t.closePath()}}}var Iu=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0,this.cornerRadius=0},Tu=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Iu},e.prototype.buildPath=function(t,e){Mu(t,e)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(fs);Tu.prototype.type="sector";var Cu=function(){this.cx=0,this.cy=0,this.r=0,this.r0=0},Du=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultShape=function(){return new Cu},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)},e}(fs);function Au(t,e,n){var i=e.smooth,r=e.points;if(r&&r.length>=2){if(i){var o=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var p=0,d=t.length;pju[1]){if(a=!1,r)return a;var u=Math.abs(ju[0]-Zu[1]),h=Math.abs(Zu[0]-ju[1]);Math.min(u,h)>i.len()&&(u0){var c={duration:h.duration,delay:h.delay||0,easing:h.easing,done:o,force:!!o||!!a,setToFinal:!u,scope:t,during:a};l?e.animateFrom(n,c):e.animateTo(n,c)}else e.stopAnimation(),!l&&e.attr(n),a&&a(1),o&&o()}function ih(t,e,n,i,r,o){nh("update",t,e,n,i,r,o)}function rh(t,e,n,i,r,o){nh("enter",t,e,n,i,r,o)}function oh(t){if(!t.__zr)return!0;for(var e=0;eMath.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function Ch(t){return!t.isGroup}function Dh(t,e,n){if(t&&e){var i,r=(i={},t.traverse((function(t){Ch(t)&&t.anid&&(i[t.anid]=t)})),i);e.traverse((function(t){if(Ch(t)&&t.anid){var e=r[t.anid];if(e){var i=o(t);t.attr(o(e)),ih(t,i,n,Ws(t).dataIndex)}}}))}function o(t){var e={x:t.x,y:t.y,rotation:t.rotation};return function(t){return null!=t.shape}(t)&&(e.shape=A({},t.shape)),e}}function Ah(t,e){return z(t,(function(t){var n=t[0];n=hh(n,e.x),n=ch(n,e.x+e.width);var i=t[1];return i=hh(i,e.y),[n,i=ch(i,e.y+e.height)]}))}function kh(t,e){var n=hh(t.x,e.x),i=ch(t.x+t.width,e.x+e.width),r=hh(t.y,e.y),o=ch(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}}function Lh(t,e,n){var i=A({rectHover:!0},e),r=i.style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(r.image=t.slice(8),k(r,n),new xs(i)):mh(t.replace("path://",""),i,n,"center")}function Ph(t,e,n,i,r){for(var o=0,a=r[r.length-1];o=-1e-6)return!1;var f=t-r,g=e-o,y=Rh(f,g,u,h)/d;if(y<0||y>1)return!1;var v=Rh(f,g,c,p)/d;return!(v<0||v>1)}function Rh(t,e,n,i){return t*i-n*e}function Nh(t){var e=t.itemTooltipOption,n=t.componentModel,i=t.itemName,r=X(e)?{formatter:e}:e,o=n.mainType,a=n.componentIndex,s={componentType:o,name:i,$vars:["name"]};s[o+"Index"]=a;var l=t.formatterParamsExtra;l&&E(G(l),(function(t){mt(s,t)||(s[t]=l[t],s.$vars.push(t))}));var u=Ws(t.el);u.componentMainType=o,u.componentIndex=a,u.tooltipConfig={name:i,option:k({content:i,formatterParams:s},r)}}function Eh(t,e){var n;t.isGroup&&(n=e(t)),n||t.traverse(e)}function zh(t,e){if(t)if(Y(t))for(var n=0;n-1?yc:mc;function wc(t,e){t=t.toUpperCase(),_c[t]=new pc(e),xc[t]=e}function Sc(t){return _c[t]}wc(vc,{time:{month:["January","February","March","April","May","June","July","August","September","October","November","December"],monthAbbr:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayOfWeek:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayOfWeekAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},legend:{selector:{all:"All",inverse:"Inv"}},toolbox:{brush:{title:{rect:"Box Select",polygon:"Lasso Select",lineX:"Horizontally Select",lineY:"Vertically Select",keep:"Keep Selections",clear:"Clear Selections"}},dataView:{title:"Data View",lang:["Data View","Close","Refresh"]},dataZoom:{title:{zoom:"Zoom",back:"Zoom Reset"}},magicType:{title:{line:"Switch to Line Chart",bar:"Switch to Bar Chart",stack:"Stack",tiled:"Tile"}},restore:{title:"Restore"},saveAsImage:{title:"Save as Image",lang:["Right Click to Save Image"]}},series:{typeNames:{pie:"Pie chart",bar:"Bar chart",line:"Line chart",scatter:"Scatter plot",effectScatter:"Ripple scatter plot",radar:"Radar chart",tree:"Tree",treemap:"Treemap",boxplot:"Boxplot",candlestick:"Candlestick",k:"K line chart",heatmap:"Heat map",map:"Map",parallel:"Parallel coordinate map",lines:"Line graph",graph:"Relationship graph",sankey:"Sankey diagram",funnel:"Funnel chart",gauge:"Gauge",pictorialBar:"Pictorial bar",themeRiver:"Theme River Map",sunburst:"Sunburst"}},aria:{general:{withTitle:'This is a chart about "{title}"',withoutTitle:"This is a chart"},series:{single:{prefix:"",withName:" with type {seriesType} named {seriesName}.",withoutName:" with type {seriesType}."},multiple:{prefix:". It consists of {seriesCount} series count.",withName:" The {seriesId} series is a {seriesType} representing {seriesName}.",withoutName:" The {seriesId} series is a {seriesType}.",separator:{middle:"",end:""}}},data:{allData:"The data is as follows: ",partialData:"The first {displayCnt} items are: ",withName:"the data for {name} is {value}",withoutName:"{value}",separator:{middle:", ",end:". "}}}}),wc(yc,{time:{month:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthAbbr:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayOfWeek:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayOfWeekAbbr:["日","一","二","三","四","五","六"]},legend:{selector:{all:"全选",inverse:"反选"}},toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}});var Mc=1e3,Ic=6e4,Tc=36e5,Cc=864e5,Dc=31536e6,Ac={year:"{yyyy}",month:"{MMM}",day:"{d}",hour:"{HH}:{mm}",minute:"{HH}:{mm}",second:"{HH}:{mm}:{ss}",millisecond:"{HH}:{mm}:{ss} {SSS}",none:"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}"},kc="{yyyy}-{MM}-{dd}",Lc={year:"{yyyy}",month:"{yyyy}-{MM}",day:kc,hour:"{yyyy}-{MM}-{dd} "+Ac.hour,minute:"{yyyy}-{MM}-{dd} "+Ac.minute,second:"{yyyy}-{MM}-{dd} "+Ac.second,millisecond:Ac.none},Pc=["year","month","day","hour","minute","second","millisecond"],Oc=["year","half-year","quarter","month","week","half-week","day","half-day","quarter-day","hour","minute","second","millisecond"];function Rc(t,e){return"0000".substr(0,e-(t+="").length)+t}function Nc(t){switch(t){case"half-year":case"quarter":return"month";case"week":case"half-week":return"day";case"half-day":case"quarter-day":return"hour";default:return t}}function Ec(t){return t===Nc(t)}function zc(t,e,n,i){var r=jr(t),o=r[Fc(n)](),a=r[Gc(n)]()+1,s=Math.floor((a-1)/4)+1,l=r[Wc(n)](),u=r["get"+(n?"UTC":"")+"Day"](),h=r[Hc(n)](),c=(h-1)%12+1,p=r[Yc(n)](),d=r[Uc(n)](),f=r[Xc(n)](),g=(i instanceof pc?i:Sc(i||bc)||_c.EN).getModel("time"),y=g.get("month"),v=g.get("monthAbbr"),m=g.get("dayOfWeek"),x=g.get("dayOfWeekAbbr");return(e||"").replace(/{yyyy}/g,o+"").replace(/{yy}/g,o%100+"").replace(/{Q}/g,s+"").replace(/{MMMM}/g,y[a-1]).replace(/{MMM}/g,v[a-1]).replace(/{MM}/g,Rc(a,2)).replace(/{M}/g,a+"").replace(/{dd}/g,Rc(l,2)).replace(/{d}/g,l+"").replace(/{eeee}/g,m[u]).replace(/{ee}/g,x[u]).replace(/{e}/g,u+"").replace(/{HH}/g,Rc(h,2)).replace(/{H}/g,h+"").replace(/{hh}/g,Rc(c+"",2)).replace(/{h}/g,c+"").replace(/{mm}/g,Rc(p,2)).replace(/{m}/g,p+"").replace(/{ss}/g,Rc(d,2)).replace(/{s}/g,d+"").replace(/{SSS}/g,Rc(f,3)).replace(/{S}/g,f+"")}function Vc(t,e){var n=jr(t),i=n[Gc(e)]()+1,r=n[Wc(e)](),o=n[Hc(e)](),a=n[Yc(e)](),s=n[Uc(e)](),l=0===n[Xc(e)](),u=l&&0===s,h=u&&0===a,c=h&&0===o,p=c&&1===r;return p&&1===i?"year":p?"month":c?"day":h?"hour":u?"minute":l?"second":"millisecond"}function Bc(t,e,n){var i=j(t)?jr(t):t;switch(e=e||Vc(t,n)){case"year":return i[Fc(n)]();case"half-year":return i[Gc(n)]()>=6?1:0;case"quarter":return Math.floor((i[Gc(n)]()+1)/4);case"month":return i[Gc(n)]();case"day":return i[Wc(n)]();case"half-day":return i[Hc(n)]()/24;case"hour":return i[Hc(n)]();case"minute":return i[Yc(n)]();case"second":return i[Uc(n)]();case"millisecond":return i[Xc(n)]()}}function Fc(t){return t?"getUTCFullYear":"getFullYear"}function Gc(t){return t?"getUTCMonth":"getMonth"}function Wc(t){return t?"getUTCDate":"getDate"}function Hc(t){return t?"getUTCHours":"getHours"}function Yc(t){return t?"getUTCMinutes":"getMinutes"}function Uc(t){return t?"getUTCSeconds":"getSeconds"}function Xc(t){return t?"getUTCMilliseconds":"getMilliseconds"}function Zc(t){return t?"setUTCFullYear":"setFullYear"}function jc(t){return t?"setUTCMonth":"setMonth"}function qc(t){return t?"setUTCDate":"setDate"}function Kc(t){return t?"setUTCHours":"setHours"}function $c(t){return t?"setUTCMinutes":"setMinutes"}function Jc(t){return t?"setUTCSeconds":"setSeconds"}function Qc(t){return t?"setUTCMilliseconds":"setMilliseconds"}function tp(t){if(!eo(t))return X(t)?t:"-";var e=(t+"").split(".");return e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:"")}function ep(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,(function(t,e){return e.toUpperCase()})),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}var np=st,ip=/([&<>"'])/g,rp={"&":"&","<":"<",">":">",'"':""","'":"'"};function op(t){return null==t?"":(t+"").replace(ip,(function(t,e){return rp[e]}))}function ap(t,e,n){function i(t){return t&&ut(t)?t:"-"}function r(t){return!(null==t||isNaN(t)||!isFinite(t))}var o="time"===e,a=t instanceof Date;if(o||a){var s=o?jr(t):t;if(!isNaN(+s))return zc(s,"{yyyy}-{MM}-{dd} {hh}:{mm}:{ss}",n);if(a)return"-"}if("ordinal"===e)return Z(t)?i(t):j(t)&&r(t)?t+"":"-";var l=to(t);return r(l)?tp(l):Z(t)?i(t):"boolean"==typeof t?t+"":"-"}var sp=["a","b","c","d","e","f","g"],lp=function(t,e){return"{"+t+(null==e?"":e)+"}"};function up(t,e,n){Y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o':'':{renderMode:o,content:"{"+(n.markerId||"markerX")+"|} ",style:"subItem"===r?{width:4,height:4,borderRadius:2,backgroundColor:i}:{width:10,height:10,borderRadius:5,backgroundColor:i}}:""}function cp(t,e){return e=e||"transparent",X(t)?t:q(t)&&t.colorStops&&(t.colorStops[0]||{}).color||e}function pp(t,e){if("_blank"===e||"blank"===e){var n=window.open();n.opener=null,n.location.href=t}else window.open(t,e)}var dp=E,fp=["left","right","top","bottom","width","height"],gp=[["width","left","right"],["height","top","bottom"]];function yp(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild((function(l,u){var h,c,p=l.getBoundingRect(),d=e.childAt(u+1),f=d&&d.getBoundingRect();if("horizontal"===t){var g=p.width+(f?-f.x+p.x:0);(h=o+g)>i||l.newline?(o=0,h=g,a+=s+n,s=p.height):s=Math.max(s,p.height)}else{var y=p.height+(f?-f.y+p.y:0);(c=a+y)>r||l.newline?(o+=s+n,a=0,c=y,s=p.width):s=Math.max(s,p.width)}l.newline||(l.x=o,l.y=a,l.markRedraw(),"horizontal"===t?o=h+n:a=c+n)}))}var vp=yp;H(yp,"vertical"),H(yp,"horizontal");function mp(t,e,n){n=np(n||0);var i=e.width,r=e.height,o=Er(t.left,i),a=Er(t.top,r),s=Er(t.right,i),l=Er(t.bottom,r),u=Er(t.width,i),h=Er(t.height,r),c=n[2]+n[0],p=n[1]+n[3],d=t.aspect;switch(isNaN(u)&&(u=i-s-p-o),isNaN(h)&&(h=r-l-c-a),null!=d&&(isNaN(u)&&isNaN(h)&&(d>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=d*h),isNaN(h)&&(h=u/d)),isNaN(o)&&(o=i-s-u-p),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-p}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-p-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var f=new sr(o+n[3],a+n[0],u,h);return f.margin=n,f}function xp(t,e,n,i,r,o){var a,s=!r||!r.hv||r.hv[0],l=!r||!r.hv||r.hv[1],u=r&&r.boundingMode||"all";if((o=o||t).x=t.x,o.y=t.y,!s&&!l)return!1;if("raw"===u)a="group"===t.type?new sr(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(a=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(a=a.clone()).applyTransform(h)}var c=mp(k({width:a.width,height:a.height},e),n,i),p=s?c.x-a.x:0,d=l?c.y-a.y:0;return"raw"===u?(o.x=p,o.y=d):(o.x+=p,o.y+=d),o===t&&t.markRedraw(),!0}function _p(t){var e=t.layoutMode||t.constructor.layoutMode;return q(e)?e:e?{type:e}:null}function bp(t,e,n){var i=n&&n.ignoreSize;!Y(i)&&(i=[i,i]);var r=a(gp[0],0),o=a(gp[1],1);function a(n,r){var o={},a=0,u={},h=0;if(dp(n,(function(e){u[e]=t[e]})),dp(n,(function(t){s(e,t)&&(o[t]=u[t]=e[t]),l(o,t)&&a++,l(u,t)&&h++})),i[r])return l(e,n[1])?u[n[2]]=null:l(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&a){if(a>=2)return o;for(var c=0;c=0;a--)o=C(o,n[a],!0);e.defaultOption=o}return e.defaultOption},e.prototype.getReferringComponents=function(t,e){var n=t+"Index",i=t+"Id";return Ao(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},e)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get("left"),top:t.get("top"),right:t.get("right"),bottom:t.get("bottom"),width:t.get("width"),height:t.get("height")}},e.prototype.getZLevelKey=function(){return""},e.prototype.setZLevel=function(t){this.option.zlevel=t},e.protoInitialize=function(){var t=e.prototype;t.type="component",t.id="",t.name="",t.mainType="",t.subType="",t.componentIndex=0}(),e}(pc);zo(Ip,pc),Go(Ip),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){var i=No(t);e[i.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=No(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Ip),function(t,e){function n(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}t.topologicalTravel=function(t,i,r,o){if(t.length){var a=function(t){var i={},r=[];return E(t,(function(o){var a=n(i,o),s=function(t,e){var n=[];return E(t,(function(t){P(e,t)>=0&&n.push(t)})),n}(a.originalDeps=e(o),t);a.entryCount=s.length,0===a.entryCount&&r.push(o),E(s,(function(t){P(a.predecessor,t)<0&&a.predecessor.push(t);var e=n(i,t);P(e.successor,t)<0&&e.successor.push(o)}))})),{graph:i,noEntryList:r}}(i),s=a.graph,l=a.noEntryList,u={};for(E(t,(function(t){u[t]=!0}));l.length;){var h=l.pop(),c=s[h],p=!!u[h];p&&(r.call(o,h,c.originalDeps.slice()),delete u[h]),E(c.successor,p?f:d)}E(u,(function(){var t="";throw new Error(t)}))}function d(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}function f(t){u[t]=!0,d(t)}}}(Ip,(function(t){var e=[];E(Ip.getClassesByMainType(t),(function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])})),e=z(e,(function(t){return No(t).main})),"dataset"!==t&&P(e,"dataset")<=0&&e.unshift("dataset");return e}));var Tp="";"undefined"!=typeof navigator&&(Tp=navigator.platform||"");var Cp="rgba(0, 0, 0, 0.2)",Dp={darkMode:"auto",colorBy:"series",color:["#5470c6","#91cc75","#fac858","#ee6666","#73c0de","#3ba272","#fc8452","#9a60b4","#ea7ccc"],gradientColor:["#f6efa6","#d88273","#bf444c"],aria:{decal:{decals:[{color:Cp,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Cp,symbol:"circle",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Cp,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Cp,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Cp,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Cp,symbol:"triangle",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Tp.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,stateAnimation:{duration:300,easing:"cubicOut"},animation:"auto",animationDuration:1e3,animationDurationUpdate:500,animationEasing:"cubicInOut",animationEasingUpdate:"cubicInOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Ap=ft(["tooltip","label","itemName","itemId","itemGroupId","seriesName"]),kp="original",Lp="arrayRows",Pp="objectRows",Op="keyedColumns",Rp="typedArray",Np="unknown",Ep="column",zp="row",Vp=1,Bp=2,Fp=3,Gp=So();function Wp(t,e,n){var i={},r=Yp(e);if(!r||!t)return i;var o,a,s=[],l=[],u=e.ecModel,h=Gp(u).datasetMap,c=r.uid+"_"+n.seriesLayoutBy;E(t=t.slice(),(function(e,n){var r=q(e)?e:t[n]={name:e};"ordinal"===r.type&&null==o&&(o=n,a=f(r)),i[r.name]=[]}));var p=h.get(c)||h.set(c,{categoryWayDim:a,valueWayDim:0});function d(t,e,n){for(var i=0;ie)return t[i];return t[n-1]}(i,a):n;if((h=h||n)&&h.length){var c=h[l];return r&&(u[r]=c),s.paletteIdx=(l+1)%h.length,c}}var nd=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(t,e,n,i,r,o){i=i||{},this.option=null,this._theme=new pc(i),this._locale=new pc(r),this._optionManager=o},e.prototype.setOption=function(t,e,n){var i=od(e);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,e){return this._resetOption(t,od(e))},e.prototype._resetOption=function(t,e){var n=!1,i=this._optionManager;if(!t||"recreate"===t){var r=i.mountOption("recreate"===t);0,this.option&&"recreate"!==t?(this.restoreData(),this._mergeOption(r,e)):Kp(this,r),n=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(n=!0,this._mergeOption(o,e))}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this);a.length&&E(a,(function(t){n=!0,this._mergeOption(t,e)}),this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,e){var n=this.option,i=this._componentsMap,r=this._componentsCount,o=[],a=ft(),s=e&&e.replaceMergeMainTypeMap;Gp(this).datasetMap=ft(),E(t,(function(t,e){null!=t&&(Ip.hasClass(e)?e&&(o.push(e),a.set(e,!0)):n[e]=null==n[e]?T(t):C(n[e],t,!0))})),s&&s.each((function(t,e){Ip.hasClass(e)&&!a.get(e)&&(o.push(e),a.set(e,!0))})),Ip.topologicalTravel(o,Ip.getAllClassMainTypes(),(function(e){var o=function(t,e,n){var i=Zp.get(e);if(!i)return n;var r=i(t);return r?n.concat(r):n}(this,e,ho(t[e])),a=i.get(e),l=a?s&&s.get(e)?"replaceMerge":"normalMerge":"replaceAll",u=yo(a,o,l);(function(t,e,n){E(t,(function(t){var i=t.newOption;q(i)&&(t.keyInfo.mainType=e,t.keyInfo.subType=function(t,e,n,i){return e.type?e.type:n?n.subType:i.determineSubType(t,e)}(e,i,t.existing,n))}))})(u,e,Ip),n[e]=null,i.set(e,null),r.set(e,0);var h,c=[],p=[],d=0;E(u,(function(t,n){var i=t.existing,r=t.newOption;if(r){var o="series"===e,a=Ip.getClass(e,t.keyInfo.subType,!o);if(!a)return;if("tooltip"===e){if(h)return void 0;h=!0}if(i&&i.constructor===a)i.name=t.keyInfo.name,i.mergeOption(r,this),i.optionUpdated(r,!1);else{var s=A({componentIndex:n},t.keyInfo);A(i=new a(r,this,this,s),s),t.brandNew&&(i.__requireNewView=!0),i.init(r,this,this),i.optionUpdated(null,!0)}}else i&&(i.mergeOption({},this),i.optionUpdated({},!1));i?(c.push(i.option),p.push(i),d++):(c.push(void 0),p.push(void 0))}),this),n[e]=c,i.set(e,p),r.set(e,d),"series"===e&&jp(this)}),this),this._seriesIndices||jp(this)},e.prototype.getOption=function(){var t=T(this.option);return E(t,(function(e,n){if(Ip.hasClass(n)){for(var i=ho(e),r=i.length,o=!1,a=r-1;a>=0;a--)i[a]&&!bo(i[a])?o=!0:(i[a]=null,!o&&r--);i.length=r,t[n]=i}})),delete t["\0_ec_inner"],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,e){var n=this._componentsMap.get(t);if(n){var i=n[e||0];if(i)return i;if(null==e)for(var r=0;r=e:"max"===n?t<=e:t===e})(i[a],t,o)||(r=!1)}})),r}var dd=E,fd=q,gd=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];function yd(t){var e=t&&t.itemStyle;if(e)for(var n=0,i=gd.length;n=0;f--){var g=t[f];if(s||(c=g.data.rawIndexOf(g.stackedByDimension,h)),c>=0){var y=g.data.getByRawIndex(g.stackResultDimension,c);if(p>=0&&y>0||p<=0&&y<0){p=Hr(p,y),d=y;break}}}return i[0]=p,i[1]=d,i}))}))}var Rd,Nd,Ed,zd,Vd,Bd=function(t){this.data=t.data||(t.sourceFormat===Op?{}:[]),this.sourceFormat=t.sourceFormat||Np,this.seriesLayoutBy=t.seriesLayoutBy||Ep,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var e=this.dimensionsDefine=t.dimensionsDefine;if(e)for(var n=0;nu&&(u=d)}s[0]=l,s[1]=u}},i=function(){return this._data?this._data.length/this._dimSize:0};function r(t){for(var e=0;e=0&&(s=o.interpolatedValue[l])}return null!=s?s+"":""})):void 0},t.prototype.getRawValue=function(t,e){return of(this.getData(e),t)},t.prototype.formatTooltip=function(t,e,n){},t}();function lf(t){var e,n;return q(t)?t.type&&(n=t):e=t,{text:e,frag:n}}function uf(t){return new hf(t)}var hf=function(){function t(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return t.prototype.perform=function(t){var e,n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this),this._plan&&!i&&(e=this._plan(this.context));var o,a=h(this._modBy),s=this._modDataCount||0,l=h(t&&t.modBy),u=t&&t.modDataCount||0;function h(t){return!(t>=1)&&(t=1),t}a===l&&s===u||(e="reset"),(this._dirty||"reset"===e)&&(this._dirty=!1,o=this._doReset(i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var p=this._dueIndex,d=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(o||p1&&i>0?s:a}};return o;function a(){return e=t?null:oe},gte:function(t,e){return t>=e}},yf=function(){function t(t,e){if(!j(e)){var n="";0,ao(n)}this._opFn=gf[t],this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){return j(t)?this._opFn(t,this._rvalFloat):this._opFn(to(t),this._rvalFloat)},t}(),vf=function(){function t(t,e){var n="desc"===t;this._resultLT=n?1:-1,null==e&&(e=n?"min":"max"),this._incomparable="min"===e?-1/0:1/0}return t.prototype.evaluate=function(t,e){var n=j(t)?t:to(t),i=j(e)?e:to(e),r=isNaN(n),o=isNaN(i);if(r&&(n=this._incomparable),o&&(i=this._incomparable),r&&o){var a=X(t),s=X(e);a&&(n=s?t:0),s&&(i=a?e:0)}return ni?-this._resultLT:0},t}(),mf=function(){function t(t,e){this._rval=e,this._isEQ=t,this._rvalTypeof=typeof e,this._rvalFloat=to(e)}return t.prototype.evaluate=function(t){var e=t===this._rval;if(!e){var n=typeof t;n===this._rvalTypeof||"number"!==n&&"number"!==this._rvalTypeof||(e=to(t)===this._rvalFloat)}return this._isEQ?e:!e},t}();function xf(t,e){return"eq"===t||"ne"===t?new mf("eq"===t,e):mt(gf,t)?new yf(t,e):null}var _f=function(){function t(){}return t.prototype.getRawData=function(){throw new Error("not supported")},t.prototype.getRawDataItem=function(t){throw new Error("not supported")},t.prototype.cloneRawData=function(){},t.prototype.getDimensionInfo=function(t){},t.prototype.cloneAllDimensionInfo=function(){},t.prototype.count=function(){},t.prototype.retrieveValue=function(t,e){},t.prototype.retrieveValueFromItem=function(t,e){},t.prototype.convertValue=function(t,e){return pf(t,e)},t}();function bf(t){var e=t.sourceFormat;if(!Cf(e)){var n="";0,ao(n)}return t.data}function wf(t){var e=t.sourceFormat,n=t.data;if(!Cf(e)){var i="";0,ao(i)}if(e===Lp){for(var r=[],o=0,a=n.length;o65535?kf:Lf}function Ef(t,e,n,i,r){var o=Rf[n||"float"];if(r){var a=t[e],s=a&&a.length;if(s!==i){for(var l=new o(i),u=0;ug[1]&&(g[1]=f)}return this._rawCount=this._count=s,{start:a,end:s}},t.prototype._initDataFromProvider=function(t,e,n){for(var i=this._provider,r=this._chunks,o=this._dimensions,a=o.length,s=this._rawExtent,l=z(o,(function(t){return t.property})),u=0;uy[1]&&(y[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=e,this._extent=[]},t.prototype.count=function(){return this._count},t.prototype.get=function(t,e){if(!(e>=0&&e=0&&e=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,n=e[t];if(null!=n&&nt))return o;r=o-1}}return-1},t.prototype.indicesOfNearest=function(t,e,n){var i=this._chunks[t],r=[];if(!i)return r;null==n&&(n=1/0);for(var o=1/0,a=-1,s=0,l=0,u=this.count();l=0&&a<0)&&(o=c,a=h,s=0),h===a&&(r[s++]=l))}return r.length=s,r},t.prototype.getIndices=function(){var t,e=this._indices;if(e){var n=e.constructor,i=this._count;if(n===Array){t=new n(i);for(var r=0;r=u&&x<=h||isNaN(x))&&(a[s++]=d),d++}p=!0}else if(2===r){f=c[i[0]];var y=c[i[1]],v=t[i[1]][0],m=t[i[1]][1];for(g=0;g=u&&x<=h||isNaN(x))&&(_>=v&&_<=m||isNaN(_))&&(a[s++]=d),d++}p=!0}}if(!p)if(1===r)for(g=0;g=u&&x<=h||isNaN(x))&&(a[s++]=b)}else for(g=0;gt[M][1])&&(w=!1)}w&&(a[s++]=e.getRawIndex(g))}return sy[1]&&(y[1]=g)}}}},t.prototype.lttbDownSample=function(t,e){var n,i,r,o=this.clone([t],!0),a=o._chunks[t],s=this.count(),l=0,u=Math.floor(1/e),h=this.getRawIndex(0),c=new(Nf(this._rawCount))(Math.ceil(s/u)+2);c[l++]=h;for(var p=1;pn&&(n=i,r=S)}c[l++]=r,h=r}return c[l++]=this.getRawIndex(s-1),o._count=l,o._indices=c,o.getRawIndex=this._getRawIdx,o},t.prototype.downSample=function(t,e,n,i){for(var r=this.clone([t],!0),o=r._chunks,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=r._rawExtent[t]=[1/0,-1/0],c=new(Nf(this._rawCount))(Math.ceil(u/s)),p=0,d=0;du-d&&(s=u-d,a.length=s);for(var f=0;fh[1]&&(h[1]=y),c[p++]=v}return r._count=p,r._indices=c,r._updateGetRawIdx(),r},t.prototype.each=function(t,e){if(this._count)for(var n=t.length,i=this._chunks,r=0,o=this.count();ra&&(a=l)}return i=[o,a],this._extent[t]=i,i},t.prototype.getRawDataItem=function(t){var e=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(e);for(var n=[],i=this._chunks,r=0;r=0?this._indices[t]:-1},t.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},t.internalField=function(){function t(t,e,n,i){return pf(t[i],this._dimensions[i])}Df={arrayRows:t,objectRows:function(t,e,n,i){return pf(t[e],this._dimensions[i])},keyedColumns:t,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return pf(r instanceof Array?r[i]:r,this._dimensions[i])},typedArray:function(t,e,n,i){return t[i]}}}(),t}(),Vf=function(){function t(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return t.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},t.prototype._setLocalSource=function(t,e){this._sourceList=t,this._upstreamSignList=e,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},t.prototype._getVersionSign=function(){return this._sourceHost.uid+"_"+this._versionSignBase},t.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},t.prototype._createSource=function(){this._setLocalSource([],[]);var t,e,n=this._sourceHost,i=this._getUpstreamSourceManagers(),r=!!i.length;if(Ff(n)){var o=n,a=void 0,s=void 0,l=void 0;if(r){var u=i[0];u.prepareSource(),a=(l=u.getSource()).data,s=l.sourceFormat,e=[u._getVersionSign()]}else s=$(a=o.get("data",!0))?Rp:kp,e=[];var h=this._getSourceMetaRawOption()||{},c=l&&l.metaRawOption||{},p=rt(h.seriesLayoutBy,c.seriesLayoutBy)||null,d=rt(h.sourceHeader,c.sourceHeader),f=rt(h.dimensions,c.dimensions);t=p!==c.seriesLayoutBy||!!d!=!!c.sourceHeader||f?[Gd(a,{seriesLayoutBy:p,sourceHeader:d,dimensions:f},s)]:[]}else{var g=n;if(r){var y=this._applyTransform(i);t=y.sourceList,e=y.upstreamSignList}else{t=[Gd(g.get("source",!0),this._getSourceMetaRawOption(),null)],e=[]}}this._setLocalSource(t,e)},t.prototype._applyTransform=function(t){var e,n=this._sourceHost,i=n.get("transform",!0),r=n.get("fromTransformResult",!0);if(null!=r){var o="";1!==t.length&&Gf(o)}var a,s=[],l=[];return E(t,(function(t){t.prepareSource();var e=t.getSource(r||0),n="";null==r||e||Gf(n),s.push(e),l.push(t._getVersionSign())})),i?e=function(t,e,n){var i=ho(t),r=i.length,o="";r||ao(o);for(var a=0,s=r;a1||n>0&&!t.noHeader;return E(t.blocks,(function(t){var n=jf(t);n>=e&&(e=n+ +(i&&(!n||Xf(t)&&!t.noHeader)))})),e}return 0}function qf(t,e,n,i){var r,o=e.noHeader,a=(r=jf(e),{html:Hf[r],richText:Yf[r]}),s=[],l=e.blocks||[];lt(!l||Y(l)),l=l||[];var u=t.orderMode;if(e.sortBlocks&&u){l=l.slice();var h={valueAsc:"asc",valueDesc:"desc"};if(mt(h,u)){var c=new vf(h[u],null);l.sort((function(t,e){return c.evaluate(t.sortParam,e.sortParam)}))}else"seriesDesc"===u&&l.reverse()}E(l,(function(n,r){var o=e.valueFormatter,l=Zf(n)(o?A(A({},t),{valueFormatter:o}):t,n,r>0?a.html:0,i);null!=l&&s.push(l)}));var p="richText"===t.renderMode?s.join(a.richText):Jf(s.join(""),o?n:a.html);if(o)return p;var d=ap(e.header,"ordinal",t.useUTC),f=Wf(i,t.renderMode).nameStyle;return"richText"===t.renderMode?Qf(t,d,f)+a.richText+p:Jf('
                            '+op(d)+"
                            "+p,n)}function Kf(t,e,n,i){var r=t.renderMode,o=e.noName,a=e.noValue,s=!e.markerType,l=e.name,u=t.useUTC,h=e.valueFormatter||t.valueFormatter||function(t){return z(t=Y(t)?t:[t],(function(t,e){return ap(t,Y(d)?d[e]:d,u)}))};if(!o||!a){var c=s?"":t.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||"#333",r),p=o?"":ap(l,"ordinal",u),d=e.valueType,f=a?[]:h(e.value),g=!s||!o,y=!s&&o,v=Wf(i,r),m=v.nameStyle,x=v.valueStyle;return"richText"===r?(s?"":c)+(o?"":Qf(t,p,m))+(a?"":function(t,e,n,i,r){var o=[r],a=i?10:20;return n&&o.push({padding:[0,0,0,a],align:"right"}),t.markupStyleCreator.wrapRichTextStyle(Y(e)?e.join(" "):e,o)}(t,f,g,y,x)):Jf((s?"":c)+(o?"":function(t,e,n){return''+op(t)+""}(p,!s,m))+(a?"":function(t,e,n,i){var r=n?"10px":"20px",o=e?"float:right;margin-left:"+r:"";return t=Y(t)?t:[t],''+z(t,(function(t){return op(t)})).join("  ")+""}(f,g,y,x)),n)}}function $f(t,e,n,i,r,o){if(t)return Zf(t)({useUTC:r,renderMode:n,orderMode:i,markupStyleCreator:e,valueFormatter:t.valueFormatter},t,0,o)}function Jf(t,e){return'
                            '+t+'
                            '}function Qf(t,e,n){return t.markupStyleCreator.wrapRichTextStyle(e,n)}function tg(t,e){return cp(t.getData().getItemVisual(e,"style")[t.visualDrawType])}function eg(t,e){var n=t.get("padding");return null!=n?n:"richText"===e?[8,10]:10}var ng=function(){function t(){this.richTextStyles={},this._nextStyleNameId=no()}return t.prototype._generateStyleName=function(){return"__EC_aUTo_"+this._nextStyleNameId++},t.prototype.makeTooltipMarker=function(t,e,n){var i="richText"===n?this._generateStyleName():null,r=hp({color:e,type:t,renderMode:n,markerId:i});return X(r)?r:(this.richTextStyles[i]=r.style,r.content)},t.prototype.wrapRichTextStyle=function(t,e){var n={};Y(e)?E(e,(function(t){return A(n,t)})):A(n,e);var i=this._generateStyleName();return this.richTextStyles[i]=n,"{"+i+"|"+t+"}"},t}();function ig(t){var e,n,i,r,o=t.series,a=t.dataIndex,s=t.multipleSeries,l=o.getData(),u=l.mapDimensionsAll("defaultedTooltip"),h=u.length,c=o.getRawValue(a),p=Y(c),d=tg(o,a);if(h>1||p&&!h){var f=function(t,e,n,i,r){var o=e.getData(),a=V(t,(function(t,e,n){var i=o.getDimensionInfo(n);return t||i&&!1!==i.tooltip&&null!=i.displayName}),!1),s=[],l=[],u=[];function h(t,e){var n=o.getDimensionInfo(e);n&&!1!==n.otherDims.tooltip&&(a?u.push(Uf("nameValue",{markerType:"subItem",markerColor:r,name:n.displayName,value:t,valueType:n.type})):(s.push(t),l.push(n.type)))}return i.length?E(i,(function(t){h(of(o,n,t),t)})):E(t,h),{inlineValues:s,inlineValueTypes:l,blocks:u}}(c,o,a,u,d);e=f.inlineValues,n=f.inlineValueTypes,i=f.blocks,r=f.inlineValues[0]}else if(h){var g=l.getDimensionInfo(u[0]);r=e=of(l,a,u[0]),n=g.type}else r=e=p?c[0]:c;var y=_o(o),v=y&&o.name||"",m=l.getName(a),x=s?v:m;return Uf("section",{header:v,noHeader:s||!y,sortParam:r,blocks:[Uf("nameValue",{markerType:"item",markerColor:d,name:x,noName:!ut(x),value:e,valueType:n})].concat(i||[])})}var rg=So();function og(t,e){return t.getName(e)||t.getId(e)}var ag=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._selectedDataIndicesMap={},e}return n(e,t),e.prototype.init=function(t,e,n){this.seriesIndex=this.componentIndex,this.dataTask=uf({count:lg,reset:ug}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),(rg(this).sourceManager=new Vf(this)).prepareSource();var i=this.getInitialData(t,n);cg(i,this),this.dataTask.context.data=i,rg(this).dataBeforeProcessed=i,sg(this),this._initSelectedMapFromData(i)},e.prototype.mergeDefaultAndTheme=function(t,e){var n=_p(this),i=n?wp(t):{},r=this.subType;Ip.hasClass(r)&&(r+="Series"),C(t,e.getTheme().get(this.subType)),C(t,this.getDefaultOption()),co(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&bp(t,i,n)},e.prototype.mergeOption=function(t,e){t=C(this.option,t,!0),this.fillDataTextStyle(t.data);var n=_p(this);n&&bp(this.option,t,n);var i=rg(this).sourceManager;i.dirty(),i.prepareSource();var r=this.getInitialData(t,e);cg(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,rg(this).dataBeforeProcessed=r,sg(this),this._initSelectedMapFromData(r)},e.prototype.fillDataTextStyle=function(t){if(t&&!$(t))for(var e=["show"],n=0;nthis.getShallow("animationThreshold")&&(e=!1),!!e},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,e,n){var i=this.ecModel,r=Qp.prototype.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get("progressive")},e.prototype.getProgressiveThreshold=function(){return this.get("progressiveThreshold")},e.prototype.select=function(t,e){this._innerSelect(this.getData(e),t)},e.prototype.unselect=function(t,e){var n=this.option.selectedMap;if(n){var i=this.option.selectedMode,r=this.getData(e);if("series"===i||"all"===n)return this.option.selectedMap={},void(this._selectedDataIndicesMap={});for(var o=0;o=0&&n.push(r)}return n},e.prototype.isSelected=function(t,e){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(e);return("all"===n||n[og(i,t)])&&!i.getItemModel(t).get(["select","disabled"])},e.prototype.isUniversalTransitionEnabled=function(){if(this.__universalTransitionEnabled)return!0;var t=this.option.universalTransition;return!!t&&(!0===t||t&&t.enabled)},e.prototype._innerSelect=function(t,e){var n,i,r=this.option,o=r.selectedMode,a=e.length;if(o&&a)if("series"===o)r.selectedMap="all";else if("multiple"===o){q(r.selectedMap)||(r.selectedMap={});for(var s=r.selectedMap,l=0;l0&&this._innerSelect(t,e)}},e.registerClass=function(t){return Ip.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type="series.__base__",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol="circle",t.visualStyleAccessPath="itemStyle",t.visualDrawType="fill"}(),e}(Ip);function sg(t){var e=t.name;_o(t)||(t.name=function(t){var e=t.getRawData(),n=e.mapDimensionsAll("seriesName"),i=[];return E(n,(function(t){var n=e.getDimensionInfo(t);n.displayName&&i.push(n.displayName)})),i.join(" ")}(t)||e)}function lg(t){return t.model.getRawData().count()}function ug(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),hg}function hg(t,e){e.outputData&&t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function cg(t,e){E(gt(t.CHANGABLE_METHODS,t.DOWNSAMPLE_METHODS),(function(n){t.wrapMethod(n,H(pg,e))}))}function pg(t,e){var n=dg(t);return n&&n.setOutputEnd((e||this).count()),e}function dg(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}R(ag,sf),R(ag,Qp),zo(ag,Ip);var fg=function(){function t(){this.group=new Cr,this.uid=fc("viewComponent")}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){},t.prototype.updateLayout=function(t,e,n,i){},t.prototype.updateVisual=function(t,e,n,i){},t.prototype.blurSeries=function(t,e){},t.prototype.eachRendered=function(t){var e=this.group;e&&e.traverse(t)},t}();function gg(){var t=So();return function(e){var n=t(e),i=e.pipelineContext,r=!!n.large,o=!!n.progressiveRender,a=n.large=!(!i||!i.large),s=n.progressiveRender=!(!i||!i.progressiveRender);return!(r===a&&o===s)&&"reset"}}Eo(fg),Go(fg);var yg=So(),vg=gg(),mg=function(){function t(){this.group=new Cr,this.uid=fc("viewChart"),this.renderTask=uf({plan:bg,reset:wg}),this.renderTask.context={view:this}}return t.prototype.init=function(t,e){},t.prototype.render=function(t,e,n,i){0},t.prototype.highlight=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&_g(r,i,"emphasis")},t.prototype.downplay=function(t,e,n,i){var r=t.getData(i&&i.dataType);r&&_g(r,i,"normal")},t.prototype.remove=function(t,e){this.group.removeAll()},t.prototype.dispose=function(t,e){},t.prototype.updateView=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateLayout=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},t.prototype.eachRendered=function(t){zh(this.group,t)},t.markUpdateMethod=function(t,e){yg(t).updateMethod=e},t.protoInitialize=void(t.prototype.type="chart"),t}();function xg(t,e,n){t&&Bl(t)&&("emphasis"===e?xl:_l)(t,n)}function _g(t,e,n){var i=wo(t,e),r=e&&null!=e.highlightKey?function(t){var e=Us[t];return null==e&&Ys<=32&&(e=Us[t]=Ys++),e}(e.highlightKey):null;null!=i?E(ho(i),(function(e){xg(t.getItemGraphicEl(e),n,r)})):t.eachItemGraphicEl((function(t){xg(t,n,r)}))}function bg(t){return vg(t.model)}function wg(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&yg(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),Sg[l]}Eo(mg),Go(mg);var Sg={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},Mg="\0__throttleOriginMethod",Ig="\0__throttleRate",Tg="\0__throttleType";function Cg(t,e,n){var i,r,o,a,s,l=0,u=0,h=null;function c(){u=(new Date).getTime(),h=null,t.apply(o,a||[])}e=e||0;var p=function(){for(var t=[],p=0;p=0?c():h=setTimeout(c,-r),l=i};return p.clear=function(){h&&(clearTimeout(h),h=null)},p.debounceNextCall=function(t){s=t},p}function Dg(t,e,n,i){var r=t[e];if(r){var o=r[Mg]||r,a=r[Tg];if(r[Ig]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=Cg(o,n,"debounce"===i))[Mg]=o,r[Tg]=i,r[Ig]=n}return r}}function Ag(t,e){var n=t[e];n&&n[Mg]&&(n.clear&&n.clear(),t[e]=n[Mg])}var kg=So(),Lg={itemStyle:Wo(uc,!0),lineStyle:Wo(ac,!0)},Pg={lineStyle:"stroke",itemStyle:"fill"};function Og(t,e){var n=t.visualStyleMapper||Lg[e];return n||(console.warn("Unkown style type '"+e+"'."),Lg.itemStyle)}function Rg(t,e){var n=t.visualDrawType||Pg[e];return n||(console.warn("Unkown style type '"+e+"'."),"fill")}var Ng={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=t.getModel(i),o=Og(t,i)(r),a=r.getShallow("decal");a&&(n.setVisual("decal",a),a.dirty=!0);var s=Rg(t,i),l=o[s],u=U(l)?l:null,h="auto"===o.fill||"auto"===o.stroke;if(!o[s]||u||h){var c=t.getColorFromPalette(t.name,null,e.getSeriesCount());o[s]||(o[s]=c,n.setVisual("colorFromPalette",!0)),o.fill="auto"===o.fill||U(o.fill)?c:o.fill,o.stroke="auto"===o.stroke||U(o.stroke)?c:o.stroke}if(n.setVisual("style",o),n.setVisual("drawType",s),!e.isSeriesFiltered(t)&&u)return n.setVisual("colorFromPalette",!1),{dataEach:function(e,n){var i=t.getDataParams(n),r=A({},o);r[s]=u(i),e.setItemVisual(n,"style",r)}}}},Eg=new pc,zg={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){if(!t.ignoreStyleOnData&&!e.isSeriesFiltered(t)){var n=t.getData(),i=t.visualStyleAccessPath||"itemStyle",r=Og(t,i),o=n.getVisual("drawType");return{dataEach:n.hasItemOption?function(t,e){var n=t.getRawDataItem(e);if(n&&n[i]){Eg.option=n[i];var a=r(Eg);A(t.ensureUniqueItemVisual(e,"style"),a),Eg.option.decal&&(t.setItemVisual(e,"decal",Eg.option.decal),Eg.option.decal.dirty=!0),o in a&&t.setItemVisual(e,"colorFromPalette",!1)}}:null}}}},Vg={performRawSeries:!0,overallReset:function(t){var e=ft();t.eachSeries((function(t){var n=t.getColorBy();if(!t.isColorBySeries()){var i=t.type+"-"+n,r=e.get(i);r||(r={},e.set(i,r)),kg(t).scope=r}})),t.eachSeries((function(e){if(!e.isColorBySeries()&&!t.isSeriesFiltered(e)){var n=e.getRawData(),i={},r=e.getData(),o=kg(e).scope,a=e.visualStyleAccessPath||"itemStyle",s=Rg(e,a);r.each((function(t){var e=r.getRawIndex(t);i[e]=t})),n.each((function(t){var a=i[t];if(r.getItemVisual(a,"colorFromPalette")){var l=r.ensureUniqueItemVisual(a,"style"),u=n.getName(t)||t+"",h=n.count();l[s]=e.getColorFromPalette(u,o,h)}}))}}))}},Bg=Math.PI;var Fg=function(){function t(t,e,n,i){this._stageTaskMap=ft(),this.ecInstance=t,this.api=e,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return t.prototype.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each((function(t){var e=t.overallTask;e&&e.dirty()}))},t.prototype.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},t.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},t.prototype.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},t.prototype.restorePipelines=function(t){var e=this,n=e._pipelineMap=ft();t.eachSeries((function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),e._pipe(t,t.dataTask)}))},t.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.api.getModel(),n=this.api;E(this._allHandlers,(function(i){var r=t.get(i.uid)||t.set(i.uid,{}),o="";lt(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,r,e,n),i.overallReset&&this._createOverallStageTask(i,r,e,n)}),this)},t.prototype.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,this._pipe(e,r)},t.prototype.performDataProcessorTasks=function(t,e){this._performStageTasks(this._dataProcessorHandlers,t,e,{block:!0})},t.prototype.performVisualTasks=function(t,e,n){this._performStageTasks(this._visualHandlers,t,e,n)},t.prototype._performStageTasks=function(t,e,n,i){i=i||{};var r=!1,o=this;function a(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}E(t,(function(t,s){if(!i.visualType||i.visualType===t.visualType){var l=o._stageTaskMap.get(t.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,p=h.agentStubMap;p.each((function(t){a(i,t)&&(t.dirty(),c=!0)})),c&&h.dirty(),o.updatePayload(h,n);var d=o.getPerformArgs(h,i.block);p.each((function(t){t.perform(d)})),h.perform(d)&&(r=!0)}else u&&u.each((function(s,l){a(i,s)&&s.dirty();var u=o.getPerformArgs(s,i.block);u.skip=!t.performRawSeries&&e.isSeriesFiltered(s.context.model),o.updatePayload(s,n),s.perform(u)&&(r=!0)}))}})),this.unfinished=r||this.unfinished},t.prototype.performSeriesTasks=function(t){var e;t.eachSeries((function(t){e=t.dataTask.perform()||e})),this.unfinished=e||this.unfinished},t.prototype.plan=function(){this._pipelineMap.each((function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)}))},t.prototype.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},t.prototype._createSeriesStageTask=function(t,e,n,i){var r=this,o=e.seriesTaskMap,a=e.seriesTaskMap=ft(),s=t.seriesType,l=t.getTargetSeries;function u(e){var s=e.uid,l=a.set(s,o&&o.get(s)||uf({plan:Ug,reset:Xg,count:qg}));l.context={model:e,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:r},r._pipe(e,l)}t.createOnAllSeries?n.eachRawSeries(u):s?n.eachRawSeriesByType(s,u):l&&l(n,i).each(u)},t.prototype._createOverallStageTask=function(t,e,n,i){var r=this,o=e.overallTask=e.overallTask||uf({reset:Gg});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:r};var a=o.agentStubMap,s=o.agentStubMap=ft(),l=t.seriesType,u=t.getTargetSeries,h=!0,c=!1,p="";function d(t){var e=t.uid,n=s.set(e,a&&a.get(e)||(c=!0,uf({reset:Wg,onDirty:Yg})));n.context={model:t,overallProgress:h},n.agent=o,n.__block=h,r._pipe(t,n)}lt(!t.createOnAllSeries,p),l?n.eachRawSeriesByType(l,d):u?u(n,i).each(d):(h=!1,E(n.getSeries(),d)),c&&o.dirty()},t.prototype._pipe=function(t,e){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=e),i.tail&&i.tail.pipe(e),i.tail=e,e.__idxInPipeline=i.count++,e.__pipeline=i},t.wrapStageHandler=function(t,e){return U(t)&&(t={overallReset:t,seriesType:Kg(t)}),t.uid=fc("stageHandler"),e&&(t.visualType=e),t},t}();function Gg(t){t.overallReset(t.ecModel,t.api,t.payload)}function Wg(t){return t.overallProgress&&Hg}function Hg(){this.agent.dirty(),this.getDownstream().dirty()}function Yg(){this.agent&&this.agent.dirty()}function Ug(t){return t.plan?t.plan(t.model,t.ecModel,t.api,t.payload):null}function Xg(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=ho(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?z(e,(function(t,e){return jg(e)})):Zg}var Zg=jg(0);function jg(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)}))}return{cptQuery:e,dataQuery:n,otherQuery:i}},t.prototype.filter=function(t,e){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,r=n.packedEvent,o=n.model,a=n.view;if(!o||!a)return!0;var s=e.cptQuery,l=e.dataQuery;return u(s,o,"mainType")&&u(s,o,"subType")&&u(s,o,"index","componentIndex")&&u(s,o,"name")&&u(s,o,"id")&&u(l,r,"name")&&u(l,r,"dataIndex")&&u(l,r,"dataType")&&(!a.filterForExposedEvent||a.filterForExposedEvent(t,e.otherQuery,i,r));function u(t,e,n,i){return null==t[n]||e[i||n]===t[n]}},t.prototype.afterTrigger=function(){this.eventInfo=null},t}(),uy=["symbol","symbolSize","symbolRotate","symbolOffset"],hy=uy.concat(["symbolKeepAspect"]),cy={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData();if(t.legendIcon&&n.setVisual("legendIcon",t.legendIcon),t.hasSymbolVisual){for(var i={},r={},o=!1,a=0;a0&&(e=i.lineDash,n=i.lineWidth,e&&"solid"!==e&&n>0?"dashed"===e?[4*n,2*n]:"dotted"===e?[n]:j(e)?[e]:Y(e)?e:null:null),o=i.lineDashOffset;if(r){var a=i.strokeNoScale&&t.getLineScale?t.getLineScale():1;a&&1!==a&&(r=z(r,(function(t){return t/a})),o/=a)}return[r,o]}var zy=new ja(!0);function Vy(t){var e=t.stroke;return!(null==e||"none"===e||!(t.lineWidth>0))}function By(t){return"string"==typeof t&&"none"!==t}function Fy(t){var e=t.fill;return null!=e&&"none"!==e}function Gy(t,e){if(null!=e.fillOpacity&&1!==e.fillOpacity){var n=t.globalAlpha;t.globalAlpha=e.fillOpacity*e.opacity,t.fill(),t.globalAlpha=n}else t.fill()}function Wy(t,e){if(null!=e.strokeOpacity&&1!==e.strokeOpacity){var n=t.globalAlpha;t.globalAlpha=e.strokeOpacity*e.opacity,t.stroke(),t.globalAlpha=n}else t.stroke()}function Hy(t,e,n){var i=Zo(e.image,e.__image,n);if(qo(i)){var r=t.createPattern(i,e.repeat||"repeat");if("function"==typeof DOMMatrix&&r&&r.setTransform){var o=new DOMMatrix;o.translateSelf(e.x||0,e.y||0),o.rotateSelf(0,0,(e.rotation||0)*_t),o.scaleSelf(e.scaleX||1,e.scaleY||1),r.setTransform(o)}return r}}var Yy=["shadowBlur","shadowOffsetX","shadowOffsetY"],Uy=[["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]];function Xy(t,e,n,i,r){var o=!1;if(!i&&e===(n=n||{}))return!1;if(i||e.opacity!==n.opacity){qy(t,r),o=!0;var a=Math.max(Math.min(e.opacity,1),0);t.globalAlpha=isNaN(a)?ua.opacity:a}(i||e.blend!==n.blend)&&(o||(qy(t,r),o=!0),t.globalCompositeOperation=e.blend||ua.blend);for(var s=0;s0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.isSSR=function(){return this._ssr},e.prototype.setOption=function(t,e,n){if(!this.__flagInMainProcess)if(this._disposed)Gv(this.id);else{var i,r,o;if(q(e)&&(n=e.lazyUpdate,i=e.silent,r=e.replaceMerge,o=e.transition,e=e.notMerge),this.__flagInMainProcess=!0,!this._model||e){var a=new cd(this._api),s=this._theme,l=this._model=new nd;l.scheduler=this._scheduler,l.ssr=this._ssr,l.init(null,null,null,s,this._locale,a)}this._model.setOption(t,{replaceMerge:r},Uv);var u={seriesTransition:o,optionChanged:!0};if(n)this.__pendingUpdate={silent:i,updateParams:u},this.__flagInMainProcess=!1,this.getZr().wakeUp();else{try{mv(this),bv.update.call(this,null,u)}catch(t){throw this.__pendingUpdate=null,this.__flagInMainProcess=!1,t}this._ssr||this._zr.flush(),this.__pendingUpdate=null,this.__flagInMainProcess=!1,Iv.call(this,i),Tv.call(this,i)}}},e.prototype.setTheme=function(){oo()},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||uv&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},e.prototype.renderToCanvas=function(t){t=t||{};var e=this._zr.painter;return e.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get("backgroundColor"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.renderToSVGString=function(t){t=t||{};var e=this._zr.painter;return e.renderToString({useViewBox:t.useViewBox})},e.prototype.getSvgDataURL=function(){if(r.svgSupported){var t=this._zr;return E(t.storage.getDisplayList(),(function(t){t.stopAnimation(null,!0)})),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(!this._disposed){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;E(e,(function(t){n.eachComponent({mainType:t},(function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)}))}));var o="svg"===this._zr.painter.getType()?this.getSvgDataURL():this.renderToCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return E(i,(function(t){t.group.ignore=!1})),o}Gv(this.id)},e.prototype.getConnectedDataURL=function(t){if(!this._disposed){var e="svg"===t.type,n=this.group,i=Math.min,r=Math.max,o=1/0;if(Kv[n]){var a=o,s=o,l=-1/0,u=-1/0,c=[],p=t&&t.pixelRatio||this.getDevicePixelRatio();E(qv,(function(o,h){if(o.group===n){var p=e?o.getZr().painter.getSvgDom().innerHTML:o.renderToCanvas(T(t)),d=o.getDom().getBoundingClientRect();a=i(d.left,a),s=i(d.top,s),l=r(d.right,l),u=r(d.bottom,u),c.push({dom:p,left:d.left,top:d.top})}}));var d=(l*=p)-(a*=p),f=(u*=p)-(s*=p),g=h.createCanvas(),y=Lr(g,{renderer:e?"svg":"canvas"});if(y.resize({width:d,height:f}),e){var v="";return E(c,(function(t){var e=t.left-a,n=t.top-s;v+=''+t.dom+""})),y.painter.getSvgRoot().innerHTML=v,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}return t.connectedBackgroundColor&&y.add(new Ts({shape:{x:0,y:0,width:d,height:f},style:{fill:t.connectedBackgroundColor}})),E(c,(function(t){var e=new xs({style:{x:t.left*p-a,y:t.top*p-s,image:t.dom}});y.add(e)})),y.refreshImmediately(),g.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}Gv(this.id)},e.prototype.convertToPixel=function(t,e){return wv(this,"convertToPixel",t,e)},e.prototype.convertFromPixel=function(t,e){return wv(this,"convertFromPixel",t,e)},e.prototype.containPixel=function(t,e){var n;if(!this._disposed)return E(Io(this._model,t),(function(t,i){i.indexOf("Models")>=0&&E(t,(function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n=n||!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n=n||o.containPoint(e,t))}else 0}),this)}),this),!!n;Gv(this.id)},e.prototype.getVisual=function(t,e){var n=Io(this._model,t,{defaultMainType:"series"}),i=n.seriesModel;var r=i.getData(),o=n.hasOwnProperty("dataIndexInside")?n.dataIndexInside:n.hasOwnProperty("dataIndex")?r.indexOfRawIndex(n.dataIndex):null;return null!=o?dy(r,o,e):fy(r,e)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t,e,n,i=this;E(Fv,(function(t){var e=function(e){var n,r=i.getModel(),o=e.target,a="globalout"===t;if(a?n={}:o&&my(o,(function(t){var e=Ws(t);if(e&&null!=e.dataIndex){var i=e.dataModel||r.getSeriesByIndex(e.seriesIndex);return n=i&&i.getDataParams(e.dataIndex,e.dataType)||{},!0}if(e.eventData)return n=A({},e.eventData),!0}),!0),n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&r.getComponent(s,l),h=u&&i["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];0,n.event=e,n.type=t,i._$eventProcessor.eventInfo={targetEl:o,packedEvent:n,model:u,view:h},i.trigger(t,n)}};e.zrEventfulCallAtLast=!0,i._zr.on(t,e,i)})),E(Hv,(function(t,e){i._messageCenter.on(e,(function(t){this.trigger(e,t)}),i)})),E(["selectchanged"],(function(t){i._messageCenter.on(t,(function(e){this.trigger(t,e)}),i)})),t=this._messageCenter,e=this,n=this._api,t.on("selectchanged",(function(t){var i=n.getModel();t.isFromClick?(vy("map","selectchanged",e,i,t),vy("pie","selectchanged",e,i,t)):"select"===t.fromAction?(vy("map","selected",e,i,t),vy("pie","selected",e,i,t)):"unselect"===t.fromAction&&(vy("map","unselected",e,i,t),vy("pie","unselected",e,i,t))}))},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){this._disposed?Gv(this.id):this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed)Gv(this.id);else{this._disposed=!0,this.getDom()&&ko(this.getDom(),Qv,"");var t=this,e=t._api,n=t._model;E(t._componentsViews,(function(t){t.dispose(n,e)})),E(t._chartsViews,(function(t){t.dispose(n,e)})),t._zr.dispose(),t._dom=t._model=t._chartsMap=t._componentsMap=t._chartsViews=t._componentsViews=t._scheduler=t._api=t._zr=t._throttledZrFlush=t._theme=t._coordSysMgr=t._messageCenter=null,delete qv[t.id]}},e.prototype.resize=function(t){if(!this.__flagInMainProcess)if(this._disposed)Gv(this.id);else{this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this.__pendingUpdate&&(null==i&&(i=this.__pendingUpdate.silent),n=!0,this.__pendingUpdate=null),this.__flagInMainProcess=!0;try{n&&mv(this),bv.update.call(this,{type:"resize",animation:A({duration:0},t&&t.animation)})}catch(t){throw this.__flagInMainProcess=!1,t}this.__flagInMainProcess=!1,Iv.call(this,i),Tv.call(this,i)}}},e.prototype.showLoading=function(t,e){if(this._disposed)Gv(this.id);else if(q(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),jv[t]){var n=jv[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){this._disposed?Gv(this.id):(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},e.prototype.makeActionFromEvent=function(t){var e=A({},t);return e.type=Hv[t.type],e},e.prototype.dispatchAction=function(t,e){if(this._disposed)Gv(this.id);else if(q(e)||(e={silent:!!e}),Wv[t.type]&&this._model)if(this.__flagInMainProcess)this._pendingActions.push(t);else{var n=e.silent;Mv.call(this,t,n);var i=e.flush;i?this._zr.flush():!1!==i&&r.browser.weChat&&this._throttledZrFlush(),Iv.call(this,n),Tv.call(this,n)}},e.prototype.updateLabelLayout=function(){av.trigger("series:layoutlabels",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed)Gv(this.id);else{var e=t.seriesIndex,n=this.getModel().getSeriesByIndex(e);0,n.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()}},e.internalField=function(){function t(t){t.clearColorPalette(),t.eachSeries((function(t){t.clearColorPalette()}))}function e(t){for(var e=[],n=t.currentStates,i=0;i0?{duration:o,delay:i.get("delay"),easing:i.get("easing")}:null;n.eachRendered((function(t){if(t.states&&t.states.emphasis){if(oh(t))return;if(t instanceof fs&&function(t){var e=Xs(t);e.normalFill=t.style.fill,e.normalStroke=t.style.stroke;var n=t.states.select||{};e.selectFill=n.style&&n.style.fill||null,e.selectStroke=n.style&&n.style.stroke||null}(t),t.__dirty){var n=t.prevStates;n&&t.useStates(n)}if(r){t.stateTransition=a;var i=t.getTextContent(),o=t.getTextGuideLine();i&&(i.stateTransition=a),o&&(o.stateTransition=a)}t.__dirty&&e(t)}}))}mv=function(t){var e=t._scheduler;e.restorePipelines(t._model),e.prepareStageTasks(),xv(t,!0),xv(t,!1),e.plan()},xv=function(t,e){for(var n=t._model,i=t._scheduler,r=e?t._componentsViews:t._chartsViews,o=e?t._componentsMap:t._chartsMap,a=t._zr,s=t._api,l=0;le.get("hoverLayerThreshold")&&!r.node&&!r.worker&&e.eachSeries((function(e){if(!e.preventUsingHoverLayer){var n=t._chartsMap[e.__viewId];n.__alive&&n.eachRendered((function(t){t.states.emphasis&&(t.states.emphasis.hoverLayer=!0)}))}}))}(t,e),av.trigger("series:afterupdate",e,n,l)},Rv=function(t){t.__needsUpdateStatus=!0,t.getZr().wakeUp()},Nv=function(t){t.__needsUpdateStatus&&(t.getZr().storage.traverse((function(t){oh(t)||e(t)})),t.__needsUpdateStatus=!1)},Pv=function(t){return new(function(e){function i(){return null!==e&&e.apply(this,arguments)||this}return n(i,e),i.prototype.getCoordinateSystems=function(){return t._coordSysMgr.getCoordinateSystems()},i.prototype.getComponentByElement=function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}},i.prototype.enterEmphasis=function(e,n){xl(e,n),Rv(t)},i.prototype.leaveEmphasis=function(e,n){_l(e,n),Rv(t)},i.prototype.enterBlur=function(e){bl(e),Rv(t)},i.prototype.leaveBlur=function(e){wl(e),Rv(t)},i.prototype.enterSelect=function(e){Sl(e),Rv(t)},i.prototype.leaveSelect=function(e){Ml(e),Rv(t)},i.prototype.getModel=function(){return t.getModel()},i.prototype.getViewOfComponentModel=function(e){return t.getViewOfComponentModel(e)},i.prototype.getViewOfSeriesModel=function(e){return t.getViewOfSeriesModel(e)},i}(sd))(t)},Ov=function(t){function e(t,e){for(var n=0;n=0)){dm.push(n);var o=Fg.wrapStageHandler(n,r);o.__prio=e,o.__raw=n,t.push(o)}}function gm(t,e){jv[t]=e}function ym(t,e,n){var i=lv("registerMap");i&&i(t,e,n)}var vm=function(t){var e=(t=T(t)).type,n="";e||ao(n);var i=e.split(":");2!==i.length&&ao(n);var r=!1;"echarts"===i[0]&&(e=i[1],r=!0),t.__isBuiltIn=r,If.set(e,t)};pm(hv,Ng),pm(cv,zg),pm(cv,Vg),pm(hv,cy),pm(cv,py),pm(7e3,(function(t,e){t.eachRawSeries((function(n){if(!t.isSeriesFiltered(n)){var i=n.getData();i.hasItemVisual()&&i.each((function(t){var n=i.getItemVisual(t,"decal");n&&(i.ensureUniqueItemVisual(t,"style").decal=nv(n,e))}));var r=i.getVisual("decal");if(r)i.getVisual("style").decal=nv(r,e)}}))})),rm(Pd),om(900,(function(t){var e=ft();t.eachSeries((function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}})),e.each(Od)})),gm("default",(function(t,e){k(e=e||{},{text:"loading",textColor:"#000",fontSize:12,fontWeight:"normal",fontStyle:"normal",fontFamily:"sans-serif",maskColor:"rgba(255, 255, 255, 0.8)",showSpinner:!0,color:"#5470c6",spinnerRadius:10,lineWidth:5,zlevel:0});var n=new Cr,i=new Ts({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});n.add(i);var r,o=new As({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),a=new Ts({style:{fill:"none"},textContent:o,textConfig:{position:"right",distance:10},zlevel:e.zlevel,z:10001});return n.add(a),e.showSpinner&&((r=new Wu({shape:{startAngle:-Bg/2,endAngle:-Bg/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:"round",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001})).animateShape(!0).when(1e3,{endAngle:3*Bg/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*Bg/2}).delay(300).start("circularInOut"),n.add(r)),n.resize=function(){var n=o.getBoundingRect().width,s=e.showSpinner?e.spinnerRadius:0,l=(t.getWidth()-2*s-(e.showSpinner&&n?10:0)-n)/2-(e.showSpinner&&n?0:5+n/2)+(e.showSpinner?0:n/2)+(n?0:s),u=t.getHeight()/2;e.showSpinner&&r.setShape({cx:l,cy:u}),a.setShape({x:l-s,y:u-s,width:2*s,height:2*s}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},n.resize(),n})),um({type:$s,event:$s,update:$s},xt),um({type:Js,event:Js,update:Js},xt),um({type:Qs,event:Qs,update:Qs},xt),um({type:tl,event:tl,update:tl},xt),um({type:el,event:el,update:el},xt),im("light",ny),im("dark",sy);var mm=[],xm={registerPreprocessor:rm,registerProcessor:om,registerPostInit:am,registerPostUpdate:sm,registerUpdateLifecycle:lm,registerAction:um,registerCoordinateSystem:hm,registerLayout:cm,registerVisual:pm,registerTransform:vm,registerLoading:gm,registerMap:ym,registerImpl:function(t,e){sv[t]=e},PRIORITY:pv,ComponentModel:Ip,ComponentView:fg,SeriesModel:ag,ChartView:mg,registerComponentModel:function(t){Ip.registerClass(t)},registerComponentView:function(t){fg.registerClass(t)},registerSeriesModel:function(t){ag.registerClass(t)},registerChartView:function(t){mg.registerClass(t)},registerSubTypeDefaulter:function(t,e){Ip.registerSubTypeDefaulter(t,e)},registerPainter:function(t,e){Pr(t,e)}};function _m(t){Y(t)?E(t,(function(t){_m(t)})):P(mm,t)>=0||(mm.push(t),U(t)&&(t={install:t}),t.install(xm))}function bm(t){return null==t?0:t.length||1}function wm(t){return t}var Sm=function(){function t(t,e,n,i,r,o){this._old=t,this._new=e,this._oldKeyGetter=n||wm,this._newKeyGetter=i||wm,this.context=r,this._diffModeMultiple="multiple"===o}return t.prototype.add=function(t){return this._add=t,this},t.prototype.update=function(t){return this._update=t,this},t.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},t.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},t.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},t.prototype.remove=function(t){return this._remove=t,this},t.prototype.execute=function(){this[this._diffModeMultiple?"_executeMultiple":"_executeOneToOne"]()},t.prototype._executeOneToOne=function(){var t=this._old,e=this._new,n={},i=new Array(t.length),r=new Array(e.length);this._initIndexMap(t,null,i,"_oldKeyGetter"),this._initIndexMap(e,n,r,"_newKeyGetter");for(var o=0;o1){var u=s.shift();1===s.length&&(n[a]=s[0]),this._update&&this._update(u,o)}else 1===l?(n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o)}this._performRestAdd(r,n)},t.prototype._executeMultiple=function(){var t=this._old,e=this._new,n={},i={},r=[],o=[];this._initIndexMap(t,n,r,"_oldKeyGetter"),this._initIndexMap(e,i,o,"_newKeyGetter");for(var a=0;a1&&1===c)this._updateManyToOne&&this._updateManyToOne(u,l),i[s]=null;else if(1===h&&c>1)this._updateOneToMany&&this._updateOneToMany(u,l),i[s]=null;else if(1===h&&1===c)this._update&&this._update(u,l),i[s]=null;else if(h>1&&c>1)this._updateManyToMany&&this._updateManyToMany(u,l),i[s]=null;else if(h>1)for(var p=0;p1)for(var a=0;a30}var Nm,Em,zm,Vm,Bm,Fm,Gm,Wm=q,Hm=z,Ym="undefined"==typeof Int32Array?Array:Int32Array,Um=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_dimSummary","userOutput","_rawData","_dimValueGetter","_nameDimIdx","_idDimIdx","_nameRepeatCount"],Xm=["_approximateExtent"],Zm=function(){function t(t,e){var n;this.type="list",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=["cloneShallow","downSample","lttbDownSample","map"],this.CHANGABLE_METHODS=["filterSelf","selectRange"],this.DOWNSAMPLE_METHODS=["downSample","lttbDownSample"];var i=!1;Lm(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||["x","y"];for(var r={},o=[],a={},s=!1,l={},u=0;u=e)){var n=this._store.getProvider();this._updateOrdinalMeta();var i=this._nameList,r=this._idList;if(n.getSource().sourceFormat===kp&&!n.pure)for(var o=[],a=t;a0},t.prototype.ensureUniqueItemVisual=function(t,e){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var r=i[e];return null==r&&(Y(r=this.getVisual(e))?r=r.slice():Wm(r)&&(r=A({},r)),i[e]=r),r},t.prototype.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,Wm(e)?A(i,e):i[e]=n},t.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},t.prototype.setLayout=function(t,e){Wm(t)?A(this._layout,t):this._layout[t]=e},t.prototype.getLayout=function(t){return this._layout[t]},t.prototype.getItemLayout=function(t){return this._itemLayouts[t]},t.prototype.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?A(this._itemLayouts[t]||{},e):e},t.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},t.prototype.setItemGraphicEl=function(t,e){var n=this.hostModel&&this.hostModel.seriesIndex;Hs(n,this.dataType,t,e),this._graphicEls[t]=e},t.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},t.prototype.eachItemGraphicEl=function(t,e){E(this._graphicEls,(function(n,i){n&&t&&t.call(e,n,i)}))},t.prototype.cloneShallow=function(e){return e||(e=new t(this._schema?this._schema:Hm(this.dimensions,this._getDimInfo,this),this.hostModel)),Bm(e,this),e._store=this._store,e},t.prototype.wrapMethod=function(t,e){var n=this[t];U(n)&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(at(arguments)))})},t.internalField=(Nm=function(t){var e=t._invertedIndicesMap;E(e,(function(n,i){var r=t._dimInfos[i],o=r.ordinalMeta,a=t._store;if(o){n=e[i]=new Ym(o.categories.length);for(var s=0;s1&&(s+="__ec__"+u),i[e]=s}})),t}();function jm(t,e){Fd(t)||(t=Wd(t));var n=(e=e||{}).coordDimensions||[],i=e.dimensionsDefine||t.dimensionsDefine||[],r=ft(),o=[],a=function(t,e,n,i){var r=Math.max(t.dimensionsDetectedCount||1,e.length,n.length,i||0);return E(e,(function(t){var e;q(t)&&(e=t.dimsDef)&&(r=Math.max(r,e.length))})),r}(t,n,i,e.dimensionsCount),s=e.canOmitUnusedDimensions&&Rm(a),l=i===t.dimensionsDefine,u=l?Om(t):Pm(i),h=e.encodeDefine;!h&&e.encodeDefaulter&&(h=e.encodeDefaulter(t,a));for(var c=ft(h),p=new Pf(a),d=0;d0&&(i.name=r+(o-1)),o++,e.set(r,o)}}(o),new km({source:t,dimensions:o,fullDimensionCount:a,dimensionOmitted:s})}function qm(t,e,n){var i=e.data;if(n||i.hasOwnProperty(t)){for(var r=0;i.hasOwnProperty(t+r);)r++;t+=r}return e.set(t,!0),t}var Km=function(t){this.coordSysDims=[],this.axisMap=ft(),this.categoryAxisMap=ft(),this.coordSysName=t};var $m={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis",Co).models[0],o=t.getReferringComponents("yAxis",Co).models[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),Jm(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),Jm(o)&&(i.set("y",o),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis",Co).models[0];e.coordSysDims=["single"],n.set("single",r),Jm(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar",Co).models[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),Jm(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),Jm(a)&&(i.set("angle",a),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=1))},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();E(o.parallelAxisIndex,(function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),Jm(s)&&(i.set(l,s),null==e.firstCategoryDimIndex&&(e.firstCategoryDimIndex=o))}))}};function Jm(t){return"category"===t.get("type")}function Qm(t,e,n){var i,r,o,a=(n=n||{}).byIndex,s=n.stackedCoordDimension;!function(t){return!Lm(t.schema)}(e)?(r=e.schema,i=r.dimensions,o=e.store):i=e;var l,u,h,c,p=!(!t||!t.get("stack"));if(E(i,(function(t,e){X(t)&&(i[e]=t={name:t}),p&&!t.isExtraCoord&&(a||l||!t.ordinalMeta||(l=t),u||"ordinal"===t.type||"time"===t.type||s&&s!==t.coordDim||(u=t))})),!u||a||l||(a=!0),u){h="__\0ecstackresult_"+t.id,c="__\0ecstackedover_"+t.id,l&&(l.createInvertedIndices=!0);var d=u.coordDim,f=u.type,g=0;E(i,(function(t){t.coordDim===d&&g++}));var y={name:h,coordDim:d,coordDimIndex:g,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},v={name:c,coordDim:c,coordDimIndex:g+1,type:f,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};r?(o&&(y.storeDimIndex=o.ensureCalculationDimension(c,f),v.storeDimIndex=o.ensureCalculationDimension(h,f)),r.appendCalculationDimension(y),r.appendCalculationDimension(v)):(i.push(y),i.push(v))}return{stackedDimension:u&&u.name,stackedByDimension:l&&l.name,isStackedByIndex:a,stackedOverDimension:c,stackResultDimension:h}}function tx(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function ex(t,e){return tx(t,e)?t.getCalculationInfo("stackResultDimension"):e}function nx(t,e,n){n=n||{};var i,r=e.getSourceManager(),o=!1;t?(o=!0,i=Wd(t)):o=(i=r.getSource()).sourceFormat===kp;var a=function(t){var e=t.get("coordinateSystem"),n=new Km(e),i=$m[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}(e),s=function(t,e){var n,i=t.get("coordinateSystem"),r=ud.get(i);return e&&e.coordSysDims&&(n=z(e.coordSysDims,(function(t){var n={name:t},i=e.axisMap.get(t);if(i){var r=i.get("type");n.type=Tm(r)}return n}))),n||(n=r&&(r.getDimensionsInfo?r.getDimensionsInfo():r.dimensions.slice())||["x","y"]),n}(e,a),l=n.useEncodeDefaulter,u=U(l)?l:l?H(Wp,s,e):null,h=jm(i,{coordDimensions:s,generateCoord:n.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!o}),c=function(t,e,n){var i,r;return n&&E(t,(function(t,o){var a=t.coordDim,s=n.categoryAxisMap.get(a);s&&(null==i&&(i=o),t.ordinalMeta=s.getOrdinalMeta(),e&&(t.createInvertedIndices=!0)),null!=t.otherDims.itemName&&(r=!0)})),r||null==i||(t[i].otherDims.itemName=0),i}(h.dimensions,n.createInvertedIndices,a),p=o?null:r.getSharedDataStore(h),d=Qm(e,{schema:h,store:p}),f=new Zm(h,e);f.setCalculationInfo(d);var g=null!=c&&function(t){if(t.sourceFormat===kp){return!Y(fo(function(t){var e=0;for(;ee[1]&&(e[1]=t[1])},t.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},t.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},t.prototype.isBlank=function(){return this._isBlank},t.prototype.setBlank=function(t){this._isBlank=t},t}();Go(ix);var rx=0,ox=function(){function t(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++rx}return t.createByAxisModel=function(e){var n=e.option,i=n.data,r=i&&z(i,ax);return new t({categories:r,needCollect:!r,deduplication:!1!==n.dedplication})},t.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},t.prototype.parseAndCollect=function(t){var e,n=this._needCollect;if(!X(t)&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=this._getOrCreateMap();return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e},t.prototype._getOrCreateMap=function(){return this._map||(this._map=ft(this.categories))},t}();function ax(t){return q(t)&&null!=t.value?t.value:t+""}function sx(t){return"interval"===t.type||"log"===t.type}function lx(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=$r(o/e,!0);null!=n&&ai&&(a=r.interval=i);var s=r.intervalPrecision=hx(a);return function(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),cx(t,0,e),cx(t,1,e),t[0]>t[1]&&(t[0]=t[1])}(r.niceTickExtent=[zr(Math.ceil(t[0]/a)*a,s),zr(Math.floor(t[1]/a)*a,s)],t),r}function ux(t){var e=Math.pow(10,Kr(t)),n=t/e;return n?2===n?n=3:3===n?n=5:n*=2:n=1,zr(n*e)}function hx(t){return Br(t)+2}function cx(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function px(t,e){return t>=e[0]&&t<=e[1]}function dx(t,e){return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])}function fx(t,e){return t*(e[1]-e[0])+e[0]}var gx=function(t){function e(e){var n=t.call(this,e)||this;n.type="ordinal";var i=n.getSetting("ordinalMeta");return i||(i=new ox({})),Y(i)&&(i=new ox({categories:z(i,(function(t){return q(t)?t.value:t}))})),n._ordinalMeta=i,n._extent=n.getSetting("extent")||[0,i.categories.length-1],n}return n(e,t),e.prototype.parse=function(t){return X(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return px(t=this.parse(t),this._extent)&&null!=this._ordinalMeta.categories[t]},e.prototype.normalize=function(t){return dx(t=this._getTickNumber(this.parse(t)),this._extent)},e.prototype.scale=function(t){return t=Math.round(fx(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(null!=t){for(var e=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],r=0,o=this._ordinalMeta.categories.length,a=Math.min(o,e.length);r=0&&t=0&&t=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.calcNiceTicks=function(){},e.prototype.calcNiceExtent=function(){},e.type="ordinal",e}(ix);ix.registerClass(gx);var yx=zr,vx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="interval",e._interval=0,e._intervalPrecision=2,e}return n(e,t),e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return px(t,this._extent)},e.prototype.normalize=function(t){return dx(t,this._extent)},e.prototype.scale=function(t){return fx(t,this._extent)},e.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},e.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),this.setExtent(e[0],e[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=hx(t)},e.prototype.getTicks=function(t){var e=this._interval,n=this._extent,i=this._niceExtent,r=this._intervalPrecision,o=[];if(!e)return o;n[0]1e4)return[];var s=o.length?o[o.length-1].value:i[1];return n[1]>s&&(t?o.push({value:yx(s+e,r)}):o.push({value:n[1]})),o},e.prototype.getMinorTicks=function(t){for(var e=this.getTicks(!0),n=[],i=this.getExtent(),r=1;ri[0]&&h0&&(o=null===o?s:Math.min(o,s))}n[i]=o}}return n}(t),n=[];return E(t,(function(t){var i,r=t.coordinateSystem.getBaseAxis(),o=r.getExtent();if("category"===r.type)i=r.getBandWidth();else if("value"===r.type||"time"===r.type){var a=r.dim+"_"+r.index,s=e[a],l=Math.abs(o[1]-o[0]),u=r.scale.getExtent(),h=Math.abs(u[1]-u[0]);i=s?l/h*s:l}else{var c=t.getData();i=Math.abs(o[1]-o[0])/c.count()}var p=Er(t.get("barWidth"),i),d=Er(t.get("barMaxWidth"),i),f=Er(t.get("barMinWidth")||(Lx(t)?.5:1),i),g=t.get("barGap"),y=t.get("barCategoryGap");n.push({bandWidth:i,barWidth:p,barMaxWidth:d,barMinWidth:f,barGap:g,barCategoryGap:y,axisKey:Mx(r),stackId:Sx(t)})})),Cx(n)}function Cx(t){var e={};E(t,(function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:null,gap:"20%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barMinWidth;h&&(a[s].minWidth=h);var c=t.barGap;null!=c&&(o.gap=c);var p=t.barCategoryGap;null!=p&&(o.categoryGap=p)}));var n={};return E(e,(function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=t.categoryGap;if(null==o){var a=G(i).length;o=Math.max(35-4*a,15)+"%"}var s=Er(o,r),l=Er(t.gap,1),u=t.remainedWidth,h=t.autoWidthCount,c=(u-s)/(h+(h-1)*l);c=Math.max(c,0),E(i,(function(t){var e=t.maxWidth,n=t.minWidth;if(t.width){i=t.width;e&&(i=Math.min(i,e)),n&&(i=Math.max(i,n)),t.width=i,u-=i+l*i,h--}else{var i=c;e&&ei&&(i=n),i!==c&&(t.width=i,u-=i+l*i,h--)}})),c=(u-s)/(h+(h-1)*l),c=Math.max(c,0);var p,d=0;E(i,(function(t,e){t.width||(t.width=c),p=t,d+=t.width*(1+l)})),p&&(d-=p.width*l);var f=-d/2;E(i,(function(t,i){n[e][i]=n[e][i]||{bandWidth:r,offset:f,width:t.width},f+=t.width*(1+l)}))})),n}function Dx(t,e){var n=Ix(t,e),i=Tx(n);E(n,(function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),r=Sx(t),o=i[Mx(n)][r],a=o.offset,s=o.width;e.setLayout({bandWidth:o.bandWidth,offset:a,size:s})}))}function Ax(t){return{seriesType:t,plan:gg(),reset:function(t){if(kx(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.getDimensionIndex(e.mapDimension(r.dim)),a=e.getDimensionIndex(e.mapDimension(i.dim)),s=t.get("showBackground",!0),l=e.mapDimension(r.dim),u=e.getCalculationInfo("stackResultDimension"),h=tx(e,l)&&!!e.getCalculationInfo("stackedOnSeries"),c=r.isHorizontal(),p=function(t,e){return e.toGlobalCoord(e.dataToCoord("log"===e.type?1:0))}(0,r),d=Lx(t),f=t.get("barMinHeight")||0,g=u&&e.getDimensionIndex(u),y=e.getLayout("size"),v=e.getLayout("offset");return{progress:function(t,e){for(var i,r=t.count,l=d&&_x(3*r),u=d&&s&&_x(3*r),m=d&&_x(r),x=n.master.getRect(),_=c?x.width:x.height,b=e.getStore(),w=0;null!=(i=t.next());){var S=b.get(h?g:o,i),M=b.get(a,i),I=p,T=void 0;h&&(T=+S-b.get(o,i));var C=void 0,D=void 0,A=void 0,k=void 0;if(c){var L=n.dataToPoint([S,M]);if(h)I=n.dataToPoint([T,M])[0];C=I,D=L[1]+v,A=L[0]-I,k=y,Math.abs(A)0)for(var s=0;s=0;--s)if(l[u]){o=l[u];break}o=o||a.none}if(Y(o)){var h=null==t.level?0:t.level>=0?t.level:o.length+t.level;o=o[h=Math.min(h,o.length-1)]}}return zc(new Date(t.value),o,r,i)}(t,e,n,this.getSetting("locale"),i)},e.prototype.getTicks=function(){var t=this._interval,e=this._extent,n=[];if(!t)return n;n.push({value:e[0],level:0});var i=this.getSetting("useUTC"),r=function(t,e,n,i){var r=1e4,o=Oc,a=0;function s(t,e,n,r,o,a,s){for(var l=new Date(e),u=e,h=l[r]();u1&&0===u&&o.unshift({value:o[0].value-p})}}for(u=0;u=i[0]&&v<=i[1]&&c++)}var m=(i[1]-i[0])/e;if(c>1.5*m&&p>m/1.5)break;if(u.push(g),c>m||t===o[d])break}h=[]}}0;var x=B(z(u,(function(t){return B(t,(function(t){return t.value>=i[0]&&t.value<=i[1]&&!t.notAdd}))})),(function(t){return t.length>0})),_=[],b=x.length-1;for(d=0;dn&&(this._approxInterval=n);var o=Ox.length,a=Math.min(function(t,e,n,i){for(;n>>1;t[r][1]16?16:t>7.5?7:t>3.5?4:t>1.5?2:1}function Nx(t){return(t/=2592e6)>6?6:t>3?3:t>2?2:1}function Ex(t){return(t/=Tc)>12?12:t>6?6:t>3.5?4:t>2?2:1}function zx(t,e){return(t/=e?Ic:Mc)>30?30:t>20?20:t>15?15:t>10?10:t>5?5:t>2?2:1}function Vx(t){return $r(t,!0)}function Bx(t,e,n){var i=new Date(t);switch(Nc(e)){case"year":case"month":i[jc(n)](0);case"day":i[qc(n)](1);case"hour":i[Kc(n)](0);case"minute":i[$c(n)](0);case"second":i[Jc(n)](0),i[Qc(n)](0)}return i.getTime()}ix.registerClass(Px);var Fx=ix.prototype,Gx=vx.prototype,Wx=zr,Hx=Math.floor,Yx=Math.ceil,Ux=Math.pow,Xx=Math.log,Zx=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="log",e.base=10,e._originalScale=new vx,e._interval=0,e}return n(e,t),e.prototype.getTicks=function(t){var e=this._originalScale,n=this._extent,i=e.getExtent();return z(Gx.getTicks.call(this,t),(function(t){var e=t.value,r=zr(Ux(this.base,e));return r=e===n[0]&&this._fixMin?qx(r,i[0]):r,{value:r=e===n[1]&&this._fixMax?qx(r,i[1]):r}}),this)},e.prototype.setExtent=function(t,e){var n=this.base;t=Xx(t)/Xx(n),e=Xx(e)/Xx(n),Gx.setExtent.call(this,t,e)},e.prototype.getExtent=function(){var t=this.base,e=Fx.getExtent.call(this);e[0]=Ux(t,e[0]),e[1]=Ux(t,e[1]);var n=this._originalScale.getExtent();return this._fixMin&&(e[0]=qx(e[0],n[0])),this._fixMax&&(e[1]=qx(e[1],n[1])),e},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=Xx(t[0])/Xx(e),t[1]=Xx(t[1])/Xx(e),Fx.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},e.prototype.calcNiceTicks=function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=qr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[zr(Yx(e[0]/i)*i),zr(Hx(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},e.prototype.calcNiceExtent=function(t){Gx.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return px(t=Xx(t)/Xx(this.base),this._extent)},e.prototype.normalize=function(t){return dx(t=Xx(t)/Xx(this.base),this._extent)},e.prototype.scale=function(t){return t=fx(t,this._extent),Ux(this.base,t)},e.type="log",e}(ix),jx=Zx.prototype;function qx(t,e){return Wx(t,Br(e))}jx.getMinorTicks=Gx.getMinorTicks,jx.getLabel=Gx.getLabel,ix.registerClass(Zx);var Kx=function(){function t(t,e,n){this._prepareParams(t,e,n)}return t.prototype._prepareParams=function(t,e,n){n[1]0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=this._determinedMin,p=this._determinedMax;return null!=c&&(a=c,l=!0),null!=p&&(s=p,u=!0),{min:a,max:s,minFixed:l,maxFixed:u,isBlank:h}},t.prototype.modifyDataMinMax=function(t,e){this[Jx[t]]=e},t.prototype.setDeterminedMinMax=function(t,e){var n=$x[t];this[n]=e},t.prototype.freeze=function(){this.frozen=!0},t}(),$x={min:"_determinedMin",max:"_determinedMax"},Jx={min:"_dataMin",max:"_dataMax"};function Qx(t,e,n){var i=t.rawExtentInfo;return i||(i=new Kx(t,e,n),t.rawExtentInfo=i,i)}function t_(t,e){return null==e?null:nt(e)?NaN:t.parse(e)}function e_(t,e){var n=t.type,i=Qx(t,e,t.getExtent()).calculate();t.setBlank(i.isBlank);var r=i.min,o=i.max,a=e.ecModel;if(a&&"time"===n){var s=Ix("bar",a),l=!1;if(E(s,(function(t){l=l||t.getBaseAxis()===e.axis})),l){var u=Tx(s),h=function(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=function(t,e,n){if(t&&e){var i=t[Mx(e)];return null!=i&&null!=n?i[Sx(n)]:i}}(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;E(a,(function(t){s=Math.min(t.offset,s)}));var l=-1/0;E(a,(function(t){l=Math.max(t.offset+t.width,l)})),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return{min:t-=c*(s/u),max:e+=c*(l/u)}}(r,o,e,u);r=h.min,o=h.max}}return{extent:[r,o],fixMin:i.minFixed,fixMax:i.maxFixed}}function n_(t,e){var n=e,i=e_(t,n),r=i.extent,o=n.get("splitNumber");t instanceof Zx&&(t.base=n.get("logBase"));var a=t.type,s=n.get("interval"),l="interval"===a||"time"===a;t.setExtent(r[0],r[1]),t.calcNiceExtent({splitNumber:o,fixMin:i.fixMin,fixMax:i.fixMax,minInterval:l?n.get("minInterval"):null,maxInterval:l?n.get("maxInterval"):null}),null!=s&&t.setInterval&&t.setInterval(s)}function i_(t,e){if(e=e||t.get("type"))switch(e){case"category":return new gx({ordinalMeta:t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),extent:[1/0,-1/0]});case"time":return new Px({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new(ix.getClass(e)||vx)}}function r_(t){var e,n,i=t.getLabelModel().get("formatter"),r="category"===t.type?t.scale.getExtent()[0]:null;return"time"===t.scale.type?(n=i,function(e,i){return t.scale.getFormattedLabel(e,i,n)}):X(i)?function(e){return function(n){var i=t.scale.getLabel(n);return e.replace("{value}",null!=i?i:"")}}(i):U(i)?(e=i,function(n,i){return null!=r&&(i=n.value-r),e(o_(t,n),i,null!=n.level?{level:n.level}:null)}):function(e){return t.scale.getLabel(e)}}function o_(t,e){return"category"===t.type?t.scale.getLabel(e):e.value}function a_(t,e){var n=e*Math.PI/180,i=t.width,r=t.height,o=i*Math.abs(Math.cos(n))+Math.abs(r*Math.sin(n)),a=i*Math.abs(Math.sin(n))+Math.abs(r*Math.cos(n));return new sr(t.x,t.y,o,a)}function s_(t){var e=t.get("interval");return null==e?"auto":e}function l_(t){return"category"===t.type&&0===s_(t.getLabelModel())}function u_(t,e){var n={};return E(t.mapDimensionsAll(e),(function(e){n[ex(t,e)]=!0})),G(n)}var h_=function(){function t(){}return t.prototype.getNeedCrossZero=function(){return!this.option.scale},t.prototype.getCoordSysModel=function(){},t}();var c_={isDimensionStacked:tx,enableDataStack:Qm,getStackedDimension:ex};var p_=Object.freeze({__proto__:null,createList:function(t){return nx(null,t)},getLayoutRect:mp,dataStack:c_,createScale:function(t,e){var n=e;e instanceof pc||(n=new pc(e));var i=i_(n);return i.setExtent(t[0],t[1]),n_(i,n),i},mixinAxisModelCommonMethods:function(t){R(t,h_)},getECData:Ws,createTextStyle:function(t,e){return Yh(t,null,null,"normal"!==(e=e||{}).state)},createDimensions:function(t,e){return jm(t,e).dimensions},createSymbol:ky,enableHoverEmphasis:Pl});function d_(t,e){return Math.abs(t-e)<1e-8}function f_(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;on&&(t=r,n=a)}if(t)return function(t){for(var e=0,n=0,i=0,r=t.length,o=t[r-1][0],a=t[r-1][1],s=0;s>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function I_(t,e){return z(B((t=function(t){if(!t.UTF8Encoding)return t;var e=t,n=e.UTF8Scale;return null==n&&(n=1024),E(e.features,(function(t){var e=t.geometry,i=e.encodeOffsets,r=e.coordinates;if(i)switch(e.type){case"LineString":e.coordinates=M_(r,i,n);break;case"Polygon":case"MultiLineString":S_(r,i,n);break;case"MultiPolygon":E(r,(function(t,e){return S_(t,i[e],n)}))}})),e.UTF8Encoding=!1,e}(t)).features,(function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0})),(function(t){var n=t.properties,i=t.geometry,r=[];switch(i.type){case"Polygon":var o=i.coordinates;r.push(new x_(o[0],o.slice(1)));break;case"MultiPolygon":E(i.coordinates,(function(t){t[0]&&r.push(new x_(t[0],t.slice(1)))}));break;case"LineString":r.push(new __([i.coordinates]));break;case"MultiLineString":r.push(new __(i.coordinates))}var a=new b_(n[e||"name"],r,n.cp);return a.properties=n,a}))}var T_=Object.freeze({__proto__:null,linearMap:Nr,round:zr,asc:Vr,getPrecision:Br,getPrecisionSafe:Fr,getPixelPrecision:Gr,getPercentWithPrecision:Wr,MAX_SAFE_INTEGER:Yr,remRadian:Ur,isRadianAroundZero:Xr,parseDate:jr,quantity:qr,quantityExponent:Kr,nice:$r,quantile:Jr,reformIntervals:Qr,isNumeric:eo,numericToNumber:to}),C_=Object.freeze({__proto__:null,parse:jr,format:zc}),D_=Object.freeze({__proto__:null,extendShape:dh,extendPath:gh,makePath:mh,makeImage:xh,mergePath:bh,resizePath:wh,createIcon:Lh,updateProps:ih,initProps:rh,getTransform:Mh,clipPointsByRect:Ah,clipRectByRect:kh,registerShape:yh,getShapeClass:vh,Group:Cr,Image:xs,Text:As,Circle:uu,Ellipse:cu,Sector:Tu,Ring:Du,Polygon:Lu,Polyline:Ou,Rect:Ts,Line:Eu,BezierCurve:Fu,Arc:Wu,IncrementalDisplayable:Qu,CompoundPath:Hu,LinearGradient:Uu,RadialGradient:Xu,BoundingRect:sr}),A_=Object.freeze({__proto__:null,addCommas:tp,toCamelCase:ep,normalizeCssArray:np,encodeHTML:op,formatTpl:up,getTooltipMarker:hp,formatTime:function(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=jr(e),r=n?"getUTC":"get",o=i[r+"FullYear"](),a=i[r+"Month"]()+1,s=i[r+"Date"](),l=i[r+"Hours"](),u=i[r+"Minutes"](),h=i[r+"Seconds"](),c=i[r+"Milliseconds"]();return t=t.replace("MM",Rc(a,2)).replace("M",a).replace("yyyy",o).replace("yy",o%100+"").replace("dd",Rc(s,2)).replace("d",s).replace("hh",Rc(l,2)).replace("h",l).replace("mm",Rc(u,2)).replace("m",u).replace("ss",Rc(h,2)).replace("s",h).replace("SSS",Rc(c,3))},capitalFirst:function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},truncateText:$o,getTextRect:function(t,e,n,i,r,o,a,s){return new As({style:{text:t,font:e,align:n,verticalAlign:i,padding:r,rich:o,overflow:a?"truncate":null,lineHeight:s}}).getBoundingRect()}}),k_=Object.freeze({__proto__:null,map:z,each:E,indexOf:P,inherits:O,reduce:V,filter:B,bind:W,curry:H,isArray:Y,isString:X,isObject:q,isFunction:U,extend:A,defaults:k,clone:T,merge:C}),L_=So();function P_(t){return"category"===t.type?function(t){var e=t.getLabelModel(),n=R_(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}(t):function(t){var e=t.scale.getTicks(),n=r_(t);return{labels:z(e,(function(e,i){return{level:e.level,formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e.value}}))}}(t)}function O_(t,e){return"category"===t.type?function(t,e){var n,i,r=N_(t,"ticks"),o=s_(e),a=E_(r,o);if(a)return a;e.get("show")&&!t.scale.isBlank()||(n=[]);if(U(o))n=B_(t,o,!0);else if("auto"===o){var s=R_(t,t.getLabelModel());i=s.labelCategoryInterval,n=z(s.labels,(function(t){return t.tickValue}))}else n=V_(t,i=o,!0);return z_(r,o,{ticks:n,tickCategoryInterval:i})}(t,e):{ticks:z(t.scale.getTicks(),(function(t){return t.value}))}}function R_(t,e){var n,i,r=N_(t,"labels"),o=s_(e),a=E_(r,o);return a||(U(o)?n=B_(t,o):(i="auto"===o?function(t){var e=L_(t).autoInterval;return null!=e?e:L_(t).autoInterval=t.calculateCategoryInterval()}(t):o,n=V_(t,i)),z_(r,o,{labels:n,labelCategoryInterval:i}))}function N_(t,e){return L_(t)[e]||(L_(t)[e]=[])}function E_(t,e){for(var n=0;n1&&h/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=l_(t),p=a.get("showMinLabel")||c,d=a.get("showMaxLabel")||c;p&&u!==o[0]&&g(o[0]);for(var f=u;f<=o[1];f+=l)g(f);function g(t){var e={value:t};s.push(n?t:{formattedLabel:i(e),rawLabel:r.getLabel(e),tickValue:t})}return d&&f-l!==o[1]&&g(o[1]),s}function B_(t,e,n){var i=t.scale,r=r_(t),o=[];return E(i.getTicks(),(function(t){var a=i.getLabel(t),s=t.value;e(t.value,a)&&o.push(n?s:{formattedLabel:r(t),rawLabel:a,tickValue:s})})),o}var F_=[0,1],G_=function(){function t(t,e,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=e,this._extent=n||[0,0]}return t.prototype.contain=function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},t.prototype.containData=function(t){return this.scale.contain(t)},t.prototype.getExtent=function(){return this._extent.slice()},t.prototype.getPixelPrecision=function(t){return Gr(t||this.scale.getExtent(),this._extent)},t.prototype.setExtent=function(t,e){var n=this._extent;n[0]=t,n[1]=e},t.prototype.dataToCoord=function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&W_(n=n.slice(),i.count()),Nr(t,F_,n,e)},t.prototype.coordToData=function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&W_(n=n.slice(),i.count());var r=Nr(t,n,F_,e);return this.scale.scale(r)},t.prototype.pointToData=function(t,e){},t.prototype.getTicksCoords=function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=z(O_(this,e).ticks,(function(t){return{coord:this.dataToCoord("ordinal"===this.scale.type?this.scale.getRawOrdinalNumber(t):t),tickValue:t}}),this);return function(t,e,n,i){var r=e.length;if(!t.onBand||n||!r)return;var o,a,s=t.getExtent();if(1===r)e[0].coord=s[0],o=e[1]={coord:s[0]};else{var l=e[r-1].tickValue-e[0].tickValue,u=(e[r-1].coord-e[0].coord)/l;E(e,(function(t){t.coord-=u/2})),a=1+t.scale.getExtent()[1]-e[r-1].tickValue,o={coord:e[r-1].coord+u*a},e.push(o)}var h=s[0]>s[1];c(e[0].coord,s[0])&&(i?e[0].coord=s[0]:e.shift());i&&c(s[0],e[0].coord)&&e.unshift({coord:s[0]});c(s[1],o.coord)&&(i?o.coord=s[1]:e.pop());i&&c(o.coord,s[1])&&e.push({coord:s[1]});function c(t,e){return t=zr(t),e=zr(e),h?t>e:t0&&t<100||(t=5),z(this.scale.getMinorTicks(t),(function(t){return z(t,(function(t){return{coord:this.dataToCoord(t),tickValue:t}}),this)}),this)},t.prototype.getViewLabels=function(){return P_(this).labels},t.prototype.getLabelModel=function(){return this.model.getModel("axisLabel")},t.prototype.getTickModel=function(){return this.model.getModel("axisTick")},t.prototype.getBandWidth=function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},t.prototype.calculateCategoryInterval=function(){return function(t){var e=function(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}(t),n=r_(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),p=0,d=0;l<=o[1];l+=s){var f,g,y=cr(n({value:l}),e.font,"center","top");f=1.3*y.width,g=1.3*y.height,p=Math.max(p,f,7),d=Math.max(d,g,7)}var v=p/h,m=d/c;isNaN(v)&&(v=1/0),isNaN(m)&&(m=1/0);var x=Math.max(0,Math.floor(Math.min(v,m))),_=L_(t.model),b=t.getExtent(),w=_.lastAutoInterval,S=_.lastTickCount;return null!=w&&null!=S&&Math.abs(w-x)<=1&&Math.abs(S-a)<=1&&w>x&&_.axisExtent0===b[0]&&_.axisExtent1===b[1]?x=w:(_.lastTickCount=a,_.lastAutoInterval=x,_.axisExtent0=b[0],_.axisExtent1=b[1]),x}(this)},t}();function W_(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}var H_=2*Math.PI,Y_=ja.CMD,U_=["top","right","bottom","left"];function X_(t,e,n,i,r){var o=n.width,a=n.height;switch(t){case"top":i.set(n.x+o/2,n.y-e),r.set(0,-1);break;case"bottom":i.set(n.x+o/2,n.y+a+e),r.set(0,1);break;case"left":i.set(n.x-e,n.y+a/2),r.set(-1,0);break;case"right":i.set(n.x+o+e,n.y+a/2),r.set(1,0)}}function Z_(t,e,n,i,r,o,a,s,l){a-=t,s-=e;var u=Math.sqrt(a*a+s*s),h=(a/=u)*n+t,c=(s/=u)*n+e;if(Math.abs(i-r)%H_<1e-4)return l[0]=h,l[1]=c,u-n;if(o){var p=i;i=Qa(r),r=Qa(p)}else i=Qa(i),r=Qa(r);i>r&&(r+=H_);var d=Math.atan2(s,a);if(d<0&&(d+=H_),d>=i&&d<=r||d+H_>=i&&d+H_<=r)return l[0]=h,l[1]=c,u-n;var f=n*Math.cos(i)+t,g=n*Math.sin(i)+e,y=n*Math.cos(r)+t,v=n*Math.sin(r)+e,m=(f-a)*(f-a)+(g-s)*(g-s),x=(y-a)*(y-a)+(v-s)*(v-s);return m0){e=e/180*Math.PI,Q_.fromArray(t[0]),tb.fromArray(t[1]),eb.fromArray(t[2]),Ji.sub(nb,Q_,tb),Ji.sub(ib,eb,tb);var n=nb.len(),i=ib.len();if(!(n<.001||i<.001)){nb.scale(1/n),ib.scale(1/i);var r=nb.dot(ib);if(Math.cos(e)1&&Ji.copy(ab,eb),ab.toArray(t[1])}}}}function lb(t,e,n){if(n<=180&&n>0){n=n/180*Math.PI,Q_.fromArray(t[0]),tb.fromArray(t[1]),eb.fromArray(t[2]),Ji.sub(nb,tb,Q_),Ji.sub(ib,eb,tb);var i=nb.len(),r=ib.len();if(!(i<.001||r<.001))if(nb.scale(1/i),ib.scale(1/r),nb.dot(e)=a)Ji.copy(ab,eb);else{ab.scaleAndAdd(ib,o/Math.tan(Math.PI/2-s));var l=eb.x!==tb.x?(ab.x-tb.x)/(eb.x-tb.x):(ab.y-tb.y)/(eb.y-tb.y);if(isNaN(l))return;l<0?Ji.copy(ab,tb):l>1&&Ji.copy(ab,eb)}ab.toArray(t[1])}}}function ub(t,e,n,i){var r="normal"===n,o=r?t:t.ensureState(n);o.ignore=e;var a=i.get("smooth");a&&!0===a&&(a=.3),o.shape=o.shape||{},a>0&&(o.shape.smooth=a);var s=i.getModel("lineStyle").getLineStyle();r?t.useStyle(s):o.style=s}function hb(t,e){var n=e.smooth,i=e.points;if(i)if(t.moveTo(i[0][0],i[0][1]),n>0&&i.length>=3){var r=Et(i[0],i[1]),o=Et(i[1],i[2]);if(!r||!o)return t.lineTo(i[1][0],i[1][1]),void t.lineTo(i[2][0],i[2][1]);var a=Math.min(r,o)*n,s=Bt([],i[1],i[0],a/r),l=Bt([],i[1],i[2],a/o),u=Bt([],s,l,.5);t.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),t.bezierCurveTo(l[0],l[1],l[0],l[1],i[2][0],i[2][1])}else for(var h=1;h0&&o&&_(-h/a,0,a);var f,g,y=t[0],v=t[a-1];return m(),f<0&&b(-f,.8),g<0&&b(g,.8),m(),x(f,g,1),x(g,f,-1),m(),f<0&&w(-f),g<0&&w(g),u}function m(){f=y.rect[e]-i,g=r-v.rect[e]-v.rect[n]}function x(t,e,n){if(t<0){var i=Math.min(e,-t);if(i>0){_(i*n,0,a);var r=i+t;r<0&&b(-r*n,1)}else b(-t*n,1)}}function _(n,i,r){0!==n&&(u=!0);for(var o=i;o0)for(l=0;l0;l--){_(-(o[l-1]*c),l,a)}}}function w(t){var e=t<0?-1:1;t=Math.abs(t);for(var n=Math.ceil(t/(a-1)),i=0;i0?_(n,0,i+1):_(-n,a-i-1,a),(t-=n)<=0)return}}function gb(t,e,n,i){return fb(t,"y","height",e,n,i)}function yb(t){var e=[];t.sort((function(t,e){return e.priority-t.priority}));var n=new sr(0,0,0,0);function i(t){if(!t.ignore){var e=t.ensureState("emphasis");null==e.ignore&&(e.ignore=!1)}t.ignore=!0}for(var r=0;r=0&&n.attr(d.oldLayoutSelect),P(u,"emphasis")>=0&&n.attr(d.oldLayoutEmphasis)),ih(n,s,e,a)}else if(n.attr(s),!$h(n).valueAnimation){var h=rt(n.style.opacity,1);n.style.opacity=0,rh(n,{style:{opacity:h}},e,a)}if(d.oldLayout=s,n.states.select){var c=d.oldLayoutSelect={};Sb(c,s,Mb),Sb(c,n.states.select,Mb)}if(n.states.emphasis){var p=d.oldLayoutEmphasis={};Sb(p,s,Mb),Sb(p,n.states.emphasis,Mb)}Qh(n,a,l,e,e)}if(i&&!i.ignore&&!i.invisible){r=(d=wb(i)).oldLayout;var d,f={points:i.shape.points};r?(i.attr({shape:r}),ih(i,{shape:f},e)):(i.setShape(f),i.style.strokePercent=0,rh(i,{style:{strokePercent:1}},e)),d.oldLayout=f}},t}(),Tb=So();var Cb=Math.sin,Db=Math.cos,Ab=Math.PI,kb=2*Math.PI,Lb=180/Ab,Pb=function(){function t(){}return t.prototype.reset=function(t){this._start=!0,this._d=[],this._str="",this._p=Math.pow(10,t||4)},t.prototype.moveTo=function(t,e){this._add("M",t,e)},t.prototype.lineTo=function(t,e){this._add("L",t,e)},t.prototype.bezierCurveTo=function(t,e,n,i,r,o){this._add("C",t,e,n,i,r,o)},t.prototype.quadraticCurveTo=function(t,e,n,i){this._add("Q",t,e,n,i)},t.prototype.arc=function(t,e,n,i,r,o){this.ellipse(t,e,n,n,0,i,r,o)},t.prototype.ellipse=function(t,e,n,i,r,o,a,s){var l=a-o,u=!s,h=Math.abs(l),c=En(h-kb)||(u?l>=kb:-l>=kb),p=l>0?l%kb:l%kb+kb,d=!1;d=!!c||!En(h)&&p>=Ab==!!u;var f=t+n*Db(o),g=e+i*Cb(o);this._start&&this._add("M",f,g);var y=Math.round(r*Lb);if(c){var v=1/this._p,m=(u?1:-1)*(kb-v);this._add("A",n,i,y,1,+u,t+n*Db(o+m),e+i*Cb(o+m)),v>.01&&this._add("A",n,i,y,0,+u,f,g)}else{var x=t+n*Db(a),_=e+i*Cb(a);this._add("A",n,i,y,+d,+u,x,_)}},t.prototype.rect=function(t,e,n,i){this._add("M",t,e),this._add("l",n,0),this._add("l",0,i),this._add("l",-n,0),this._add("Z")},t.prototype.closePath=function(){this._d.length>0&&this._add("Z")},t.prototype._add=function(t,e,n,i,r,o,a,s,l){for(var u=[],h=this._p,c=1;c"}(r,e.attrs)+(e.text||"")+(i?""+n+z(i,(function(e){return t(e)})).join(n)+n:"")+("")}(t)}function Hb(t){return{zrId:t,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssClassIdx:0,cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function Yb(t,e,n,i){return Gb("svg","root",{width:t,height:e,xmlns:Vb,"xmlns:xlink":Bb,version:"1.1",baseProfile:"full",viewBox:!!i&&"0 0 "+t+" "+e},n)}var Ub={cubicIn:"0.32,0,0.67,0",cubicOut:"0.33,1,0.68,1",cubicInOut:"0.65,0,0.35,1",quadraticIn:"0.11,0,0.5,0",quadraticOut:"0.5,1,0.89,1",quadraticInOut:"0.45,0,0.55,1",quarticIn:"0.5,0,0.75,0",quarticOut:"0.25,1,0.5,1",quarticInOut:"0.76,0,0.24,1",quinticIn:"0.64,0,0.78,0",quinticOut:"0.22,1,0.36,1",quinticInOut:"0.83,0,0.17,1",sinusoidalIn:"0.12,0,0.39,0",sinusoidalOut:"0.61,1,0.88,1",sinusoidalInOut:"0.37,0,0.63,1",exponentialIn:"0.7,0,0.84,0",exponentialOut:"0.16,1,0.3,1",exponentialInOut:"0.87,0,0.13,1",circularIn:"0.55,0,1,0.45",circularOut:"0,0.55,0.45,1",circularInOut:"0.85,0,0.15,1"},Xb="transform-origin";function Zb(t,e,n){var i=A({},t.shape);A(i,e),t.buildPath(n,i);var r=new Pb;return r.reset(Yn(t)),n.rebuildPath(r,1),r.generateStr(),r.getStr()}function jb(t,e){var n=e.originX,i=e.originY;(n||i)&&(t[Xb]=n+"px "+i+"px")}var qb={fill:"fill",opacity:"opacity",lineWidth:"stroke-width",lineDashOffset:"stroke-dashoffset"};function Kb(t,e){var n=e.zrId+"-ani-"+e.cssAnimIdx++;return e.cssAnims[n]=t,n}function $b(t){return X(t)?Ub[t]?"cubic-bezier("+Ub[t]+")":rn(t)?t:"":""}function Jb(t,e,n,i){var r=t.animators,o=r.length,a=[];if(t instanceof Hu){if(y=function(t,e,n){var i,r,o=t.shape.paths,a={};if(E(o,(function(t){var e=Hb(n.zrId);e.animation=!0,Jb(t,{},e,!0);var o=e.cssAnims,s=e.cssNodes,l=G(o),u=l.length;if(u){var h=o[r=l[u-1]];for(var c in h){var p=h[c];a[c]=a[c]||{d:""},a[c].d+=p.d||""}for(var d in s){var f=s[d].animation;f.indexOf(r)>=0&&(i=f)}}})),i){e.d=!1;var s=Kb(a,n);return i.replace(r,s)}}(t,e,n))a.push(y);else if(!o)return}else if(!o)return;for(var s={},l=0;l0})).length)return Kb(h,n)+" "+r[0]+" both"}for(var g in s){var y;(y=f(s[g]))&&a.push(y)}if(a.length){var v=n.zrId+"-cls-"+n.cssClassIdx++;n.cssNodes["."+v]={animation:a.join(",")},e.class=v}}var Qb=Math.round;function tw(t){return t&&X(t.src)}function ew(t){return t&&U(t.toDataURL)}function nw(t,e,n,i){zb((function(r,o){var a="fill"===r||"stroke"===r;a&&function(t){return t&&("linear"===t.type||"radial"===t.type)}(o)?function(t,e,n,i){var r,o=t[n],a={gradientUnits:o.global?"userSpaceOnUse":"objectBoundingBox"};if(Gn(o))r="linearGradient",a.x1=o.x,a.y1=o.y,a.x2=o.x2,a.y2=o.y2;else{if(!Wn(o))return void 0;r="radialGradient",a.cx=rt(o.x,.5),a.cy=rt(o.y,.5),a.r=rt(o.r,.5)}for(var s=o.colorStops,l=[],u=0,h=s.length;ul?Tw(t,null==n[c+1]?null:n[c+1].elm,n,s,c):Cw(t,e,a,l))}(n,i,r):ww(r)?(ww(t.text)&&xw(n,""),Tw(n,null,r,0,r.length-1)):ww(i)?Cw(n,i,0,i.length-1):ww(t.text)&&xw(n,""):t.text!==e.text&&(ww(i)&&Cw(n,i,0,i.length-1),xw(n,e.text)))}var kw=0,Lw=function(){function t(t,e,n){if(this.type="svg",this.refreshHover=Pw("refreshHover"),this.configLayer=Pw("configLayer"),this.storage=e,this._opts=n=A({},n),this.root=t,this._id="zr"+kw++,this._oldVNode=Yb(n.width,n.height),t&&!n.ssr){var i=this._viewport=document.createElement("div");i.style.cssText="position:relative;overflow:hidden";var r=this._svgDom=this._oldVNode.elm=Fb("svg");Dw(null,this._oldVNode),i.appendChild(r),t.appendChild(i)}this.resize(n.width,n.height)}return t.prototype.getType=function(){return this.type},t.prototype.getViewportRoot=function(){return this._viewport},t.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},t.prototype.getSvgDom=function(){return this._svgDom},t.prototype.refresh=function(){if(this.root){var t=this.renderToVNode({willUpdate:!0});t.attrs.style="position:absolute;left:0;top:0;user-select:none",function(t,e){if(Mw(t,e))Aw(t,e);else{var n=t.elm,i=vw(n);Iw(e),null!==i&&(fw(i,e.elm,mw(n)),Cw(i,[t],0,0))}}(this._oldVNode,t),this._oldVNode=t}},t.prototype.renderOneToVNode=function(t){return cw(t,Hb(this._id))},t.prototype.renderToVNode=function(t){t=t||{};var e=this.storage.getDisplayList(!0),n=this._backgroundColor,i=this._width,r=this._height,o=Hb(this._id);o.animation=t.animation,o.willUpdate=t.willUpdate,o.compress=t.compress;var a=[];if(n&&"none"!==n){var s=Rn(n),l=s.color,u=s.opacity;this._bgVNode=Gb("rect","bg",{width:i,height:r,x:"0",y:"0",id:"0",fill:l,"fill-opacity":u}),a.push(this._bgVNode)}else this._bgVNode=null;var h=t.compress?null:this._mainVNode=Gb("g","main",{},[]);this._paintList(e,o,h?h.children:a),h&&a.push(h);var c=z(G(o.defs),(function(t){return o.defs[t]}));if(c.length&&a.push(Gb("defs","defs",{},c)),t.animation){var p=function(t,e,n){var i=(n=n||{}).newline?"\n":"",r=" {"+i,o=i+"}",a=z(G(t),(function(e){return e+r+z(G(t[e]),(function(n){return n+":"+t[e][n]+";"})).join(i)+o})).join(i),s=z(G(e),(function(t){return"@keyframes "+t+r+z(G(e[t]),(function(n){return n+r+z(G(e[t][n]),(function(i){var r=e[t][n][i];return"d"===i&&(r='path("'+r+'")'),i+":"+r+";"})).join(i)+o})).join(i)+o})).join(i);return a||s?[""].join(i):""}(o.cssNodes,o.cssAnims,{newline:!0});if(p){var d=Gb("style","stl",{},[],p);a.push(d)}}return Yb(i,r,a,t.useViewBox)},t.prototype.renderToString=function(t){return t=t||{},Wb(this.renderToVNode({animation:rt(t.cssAnimation,!0),willUpdate:!1,compress:!0,useViewBox:rt(t.useViewBox,!0)}),{newline:!0})},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t;var e=this._bgVNode;if(e&&e.elm){var n=Rn(t),i=n.color,r=n.opacity;e.elm.setAttribute("fill",i),r<1&&e.elm.setAttribute("fill-opacity",r)}},t.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},t.prototype._paintList=function(t,e,n){for(var i,r,o=t.length,a=[],s=0,l=0,u=0;u=0&&(!c||!r||c[f]!==r[f]);f--);for(var g=d-1;g>f;g--)i=a[--s-1];for(var y=f+1;y=a)}}for(var h=this.__startIndex;h15)break}n.prevElClipPaths&&u.restore()};if(p)if(0===p.length)s=l.__endIndex;else for(var _=d.dpr,b=0;b0&&t>i[0]){for(s=0;st);s++);a=n[i[s]]}if(i.splice(s+1,0,t),n[t]=e,!e.virtual)if(a){var l=a.dom;l.nextSibling?o.insertBefore(e.dom,l.nextSibling):o.appendChild(e.dom)}else o.firstChild?o.insertBefore(e.dom,o.firstChild):o.appendChild(e.dom);e.__painter=this}},t.prototype.eachLayer=function(t,e){for(var n=this._zlevelList,i=0;i0?zw:0),this._needsManuallyCompositing),u.__builtin__||I("ZLevel "+l+" has been used by unkown layer "+u.id),u!==o&&(u.__used=!0,u.__startIndex!==r&&(u.__dirty=!0),u.__startIndex=r,u.incremental?u.__drawIndex=-1:u.__drawIndex=r,e(r),o=u),1&s.__dirty&&!s.__inHover&&(u.__dirty=!0,u.incremental&&u.__drawIndex<0&&(u.__drawIndex=r))}e(r),this.eachBuiltinLayer((function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)}))},t.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},t.prototype._clearLayer=function(t){t.clear()},t.prototype.setBackgroundColor=function(t){this._backgroundColor=t,E(this._layers,(function(t){t.setUnpainted()}))},t.prototype.configLayer=function(t,e){if(e){var n=this._layerConfig;n[t]?C(n[t],e,!0):n[t]=e;for(var i=0;i-1&&(s.style.stroke=s.style.fill,s.style.fill="#fff",s.style.lineWidth=2),e},e.type="series.line",e.dependencies=["grid","polar"],e.defaultOption={z:3,coordinateSystem:"cartesian2d",legendHoverLink:!0,clip:!0,label:{position:"top"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:"solid"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:"clone"},triggerLineEvent:!1},e}(ag);function Fw(t,e){var n=t.mapDimensionsAll("defaultedLabel"),i=n.length;if(1===i){var r=of(t,e,n[0]);return null!=r?r+"":null}if(i){for(var o=[],a=0;a=0&&i.push(e[o])}return i.join(" ")}var Ww=function(t){function e(e,n,i,r){var o=t.call(this)||this;return o.updateData(e,n,i,r),o}return n(e,t),e.prototype._createSymbol=function(t,e,n,i,r){this.removeAll();var o=ky(t,-1,-1,2,2,null,r);o.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),o.drift=Hw,this._symbolType=t,this.add(o)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){xl(this.childAt(0))},e.prototype.downplay=function(){_l(this.childAt(0))},e.prototype.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},e.prototype.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":e.cursor},e.prototype.updateData=function(t,n,i,r){this.silent=!1;var o=t.getItemVisual(n,"symbol")||"circle",a=t.hostModel,s=e.getSymbolSize(t,n),l=o!==this._symbolType,u=r&&r.disableAnimation;if(l){var h=t.getItemVisual(n,"symbolKeepAspect");this._createSymbol(o,t,n,s,h)}else{(p=this.childAt(0)).silent=!1;var c={scaleX:s[0]/2,scaleY:s[1]/2};u?p.attr(c):ih(p,c,a,n),uh(p)}if(this._updateCommon(t,n,s,i,r),l){var p=this.childAt(0);if(!u){c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:p.style.opacity}};p.scaleX=p.scaleY=0,p.style.opacity=0,rh(p,c,a,n)}}u&&this.childAt(0).stopAnimation("leave"),this._seriesModel=a},e.prototype._updateCommon=function(t,e,n,i,r){var o,a,s,l,u,h,c,p,d,f=this.childAt(0),g=t.hostModel;if(i&&(o=i.emphasisItemStyle,a=i.blurItemStyle,s=i.selectItemStyle,l=i.focus,u=i.blurScope,c=i.labelStatesModels,p=i.hoverScale,d=i.cursorStyle,h=i.emphasisDisabled),!i||t.hasItemOption){var y=i&&i.itemModel?i.itemModel:t.getItemModel(e),v=y.getModel("emphasis");o=v.getModel("itemStyle").getItemStyle(),s=y.getModel(["select","itemStyle"]).getItemStyle(),a=y.getModel(["blur","itemStyle"]).getItemStyle(),l=v.get("focus"),u=v.get("blurScope"),h=v.get("disabled"),c=Hh(y),p=v.getShallow("scale"),d=y.getShallow("cursor")}var m=t.getItemVisual(e,"symbolRotate");f.attr("rotation",(m||0)*Math.PI/180||0);var x=Py(t.getItemVisual(e,"symbolOffset"),n);x&&(f.x=x[0],f.y=x[1]),d&&f.attr("cursor",d);var _=t.getItemVisual(e,"style"),b=_.fill;if(f instanceof xs){var w=f.style;f.useStyle(A({image:w.image,x:w.x,y:w.y,width:w.width,height:w.height},_))}else f.__isEmptyBrush?f.useStyle(A({},_)):f.useStyle(_),f.style.decal=null,f.setColor(b,r&&r.symbolInnerColor),f.style.strokeNoScale=!0;var S=t.getItemVisual(e,"liftZ"),M=this._z2;null!=S?null==M&&(this._z2=f.z2,f.z2+=S):null!=M&&(f.z2=M,this._z2=null);var I=r&&r.useNameLabel;Wh(f,c,{labelFetcher:g,labelDataIndex:e,defaultText:function(e){return I?t.getName(e):Fw(t,e)},inheritColor:b,defaultOpacity:_.opacity}),this._sizeX=n[0]/2,this._sizeY=n[1]/2;var T=f.ensureState("emphasis");if(T.style=o,f.ensureState("select").style=s,f.ensureState("blur").style=a,p){var C=Math.max(1.1,3/this._sizeY);T.scaleX=this._sizeX*C,T.scaleY=this._sizeY*C}this.setSymbolScale(1),Ol(this,l,u,h)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,e){var n=this.childAt(0),i=this._seriesModel,r=Ws(this).dataIndex,o=e&&e.animation;if(this.silent=n.silent=!0,e&&e.fadeLabel){var a=n.getTextContent();a&&ah(a,{style:{opacity:0}},i,{dataIndex:r,removeOpt:o,cb:function(){n.removeTextContent()}})}else n.removeTextContent();ah(n,{style:{opacity:0},scaleX:0,scaleY:0},i,{dataIndex:r,cb:t,removeOpt:o})},e.getSymbolSize=function(t,e){return Ly(t.getItemVisual(e,"symbolSize"))},e}(Cr);function Hw(t,e){this.parent.drift(t,e)}function Yw(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function Uw(t){return null==t||q(t)||(t={isIgnore:t}),t||{}}function Xw(t){var e=t.hostModel,n=e.getModel("emphasis");return{emphasisItemStyle:n.getModel("itemStyle").getItemStyle(),blurItemStyle:e.getModel(["blur","itemStyle"]).getItemStyle(),selectItemStyle:e.getModel(["select","itemStyle"]).getItemStyle(),focus:n.get("focus"),blurScope:n.get("blurScope"),emphasisDisabled:n.get("disabled"),hoverScale:n.get("scale"),labelStatesModels:Hh(e),cursorStyle:e.get("cursor")}}var Zw=function(){function t(t){this.group=new Cr,this._SymbolCtor=t||Ww}return t.prototype.updateData=function(t,e){this._progressiveEls=null,e=Uw(e);var n=this.group,i=t.hostModel,r=this._data,o=this._SymbolCtor,a=e.disableAnimation,s=Xw(t),l={disableAnimation:a},u=e.getSymbolPoint||function(e){return t.getItemLayout(e)};r||n.removeAll(),t.diff(r).add((function(i){var r=u(i);if(Yw(t,r,i,e)){var a=new o(t,i,s,l);a.setPosition(r),t.setItemGraphicEl(i,a),n.add(a)}})).update((function(h,c){var p=r.getItemGraphicEl(c),d=u(h);if(Yw(t,d,h,e)){var f=t.getItemVisual(h,"symbol")||"circle",g=p&&p.getSymbolType&&p.getSymbolType();if(!p||g&&g!==f)n.remove(p),(p=new o(t,h,s,l)).setPosition(d);else{p.updateData(t,h,s,l);var y={x:d[0],y:d[1]};a?p.attr(y):ih(p,y,i)}n.add(p),t.setItemGraphicEl(h,p)}else n.remove(p)})).remove((function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut((function(){n.remove(e)}))})).execute(),this._getSymbolPoint=u,this._data=t},t.prototype.updateLayout=function(){var t=this,e=this._data;e&&e.eachItemGraphicEl((function(e,n){var i=t._getSymbolPoint(n);e.setPosition(i),e.markRedraw()}))},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=Xw(t),this._data=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e,n){function i(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[],n=Uw(n);for(var r=t.start;r0?n=i[0]:i[1]<0&&(n=i[1]);return n}(r,n),a=i.dim,s=r.dim,l=e.mapDimension(s),u=e.mapDimension(a),h="x"===s||"radius"===s?1:0,c=z(t.dimensions,(function(t){return e.mapDimension(t)})),p=!1,d=e.getCalculationInfo("stackResultDimension");return tx(e,c[0])&&(p=!0,c[0]=d),tx(e,c[1])&&(p=!0,c[1]=d),{dataDimsForPoint:c,valueStart:o,valueAxisDim:s,baseAxisDim:a,stacked:!!p,valueDim:l,baseDim:u,baseDataOffset:h,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function qw(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}var Kw=Math.min,$w=Math.max;function Jw(t,e){return isNaN(t)||isNaN(e)}function Qw(t,e,n,i,r,o,a,s,l){for(var u,h,c,p,d,f,g=n,y=0;y=r||g<0)break;if(Jw(v,m)){if(l){g+=o;continue}break}if(g===n)t[o>0?"moveTo":"lineTo"](v,m),c=v,p=m;else{var x=v-u,_=m-h;if(x*x+_*_<.5){g+=o;continue}if(a>0){for(var b=g+o,w=e[2*b],S=e[2*b+1];w===v&&S===m&&y=i||Jw(w,S))d=v,f=m;else{T=w-u,C=S-h;var k=v-u,L=w-v,P=m-h,O=S-m,R=void 0,N=void 0;if("x"===s){var E=T>0?1:-1;d=v-E*(R=Math.abs(k))*a,f=m,D=v+E*(N=Math.abs(L))*a,A=m}else if("y"===s){var z=C>0?1:-1;d=v,f=m-z*(R=Math.abs(P))*a,D=v,A=m+z*(N=Math.abs(O))*a}else R=Math.sqrt(k*k+P*P),d=v-T*a*(1-(I=(N=Math.sqrt(L*L+O*O))/(N+R))),f=m-C*a*(1-I),A=m+C*a*I,D=Kw(D=v+T*a*I,$w(w,v)),A=Kw(A,$w(S,m)),D=$w(D,Kw(w,v)),f=m-(C=(A=$w(A,Kw(S,m)))-m)*R/N,d=Kw(d=v-(T=D-v)*R/N,$w(u,v)),f=Kw(f,$w(h,m)),D=v+(T=v-(d=$w(d,Kw(u,v))))*N/R,A=m+(C=m-(f=$w(f,Kw(h,m))))*N/R}t.bezierCurveTo(c,p,d,f,v,m),c=D,p=A}else t.lineTo(v,m)}u=v,h=m,g+=o}return y}var tS=function(){this.smooth=0,this.smoothConstraint=!0},eS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polyline",n}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new tS},e.prototype.buildPath=function(t,e){var n=e.points,i=0,r=n.length/2;if(e.connectNulls){for(;r>0&&Jw(n[2*r-2],n[2*r-1]);r--);for(;i=0){var y=a?(h-i)*g+i:(u-n)*g+n;return a?[t,y]:[y,t]}n=u,i=h;break;case o.C:u=r[l++],h=r[l++],c=r[l++],p=r[l++],d=r[l++],f=r[l++];var v=a?Ue(n,u,c,d,t,s):Ue(i,h,p,f,t,s);if(v>0)for(var m=0;m=0){y=a?He(i,h,p,f,x):He(n,u,c,d,x);return a?[t,y]:[y,t]}}n=d,i=f}}},e}(fs),nS=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e}(tS),iS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="ec-polygon",n}return n(e,t),e.prototype.getDefaultShape=function(){return new nS},e.prototype.buildPath=function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length/2,a=e.smoothMonotone;if(e.connectNulls){for(;o>0&&Jw(n[2*o-2],n[2*o-1]);o--);for(;r=0;a--){var s=t.getDimensionInfo(i[a].dimension);if("x"===(r=s&&s.coordDim)||"y"===r){o=i[a];break}}if(o){var l=e.getAxis(r),u=z(o.stops,(function(t){return{coord:l.toGlobalCoord(l.dataToCoord(t.value)),color:t.color}})),h=u.length,c=o.outerColors.slice();h&&u[0].coord>u[h-1].coord&&(u.reverse(),c.reverse());var p=function(t,e){var n,i,r=[],o=t.length;function a(t,e,n){var i=t.coord;return{coord:n,color:Tn((n-i)/(e.coord-i),[t.color,e.color])}}for(var s=0;se){i?r.push(a(i,l,e)):n&&r.push(a(n,l,0),a(n,l,e));break}n&&(r.push(a(n,l,0)),n=null),r.push(l),i=l}}return r}(u,"x"===r?n.getWidth():n.getHeight()),d=p.length;if(!d&&h)return u[0].coord<0?c[1]?c[1]:u[h-1].color:c[0]?c[0]:u[0].color;var f=p[0].coord-10,g=p[d-1].coord+10,y=g-f;if(y<.001)return"transparent";E(p,(function(t){t.offset=(t.coord-f)/y})),p.push({offset:d?p[d-1].offset:.5,color:c[1]||"transparent"}),p.unshift({offset:d?p[0].offset:.5,color:c[0]||"transparent"});var v=new Uu(0,0,0,0,p,!0);return v[r]=f,v[r+"2"]=g,v}}}function fS(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!function(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;ai)return!1;return!0}(o,e))){var a=e.mapDimension(o.dim),s={};return E(o.getViewLabels(),(function(t){var e=o.scale.getRawOrdinalNumber(t.tickValue);s[e]=1})),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function gS(t,e){return[t[2*e],t[2*e+1]]}function yS(t){if(t.get(["endLabel","show"]))return!0;for(var e=0;e0&&"bolder"===t.get(["emphasis","lineStyle","width"]))&&(d.getState("emphasis").style.lineWidth=+d.style.lineWidth+1);Ws(d).seriesIndex=t.seriesIndex,Ol(d,A,L,P);var O=cS(t.get("smooth")),R=t.get("smoothMonotone"),N=t.get("connectNulls");if(d.setShape({smooth:O,smoothMonotone:R,connectNulls:N}),f){var E=a.getCalculationInfo("stackedOnSeries"),z=0;f.useStyle(k(l.getAreaStyle(),{fill:T,opacity:.7,lineJoin:"bevel",decal:a.getVisual("style").decal})),E&&(z=cS(E.get("smooth"))),f.setShape({smooth:O,stackedOnSmooth:z,smoothMonotone:R,connectNulls:N}),zl(f,t,"areaStyle"),Ws(f).seriesIndex=t.seriesIndex,Ol(f,A,L,P)}var V=function(t){i._changePolyState(t)};a.eachItemGraphicEl((function(t){t&&(t.onHoverStateChange=V)})),this._polyline.onHoverStateChange=V,this._data=a,this._coordSys=r,this._stackedOnPoints=_,this._points=u,this._step=I,this._valueOrigin=m,t.get("triggerLineEvent")&&(this.packEventData(t,d),f&&this.packEventData(t,f))},e.prototype.packEventData=function(t,e){Ws(e).eventData={componentType:"series",componentSubType:"line",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:"line"}},e.prototype.highlight=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("emphasis"),!(o instanceof Array)&&null!=o&&o>=0){var a=r.getLayout("points"),s=r.getItemGraphicEl(o);if(!s){var l=a[2*o],u=a[2*o+1];if(isNaN(l)||isNaN(u))return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(l,u))return;var h=t.get("zlevel"),c=t.get("z");(s=new Ww(r,o)).x=l,s.y=u,s.setZ(h,c);var p=s.getSymbolPath().getTextContent();p&&(p.zlevel=h,p.z=c,p.z2=this._polyline.z2+1),s.__temp=!0,r.setItemGraphicEl(o,s),s.stopSymbolAnimation(!0),this.group.add(s)}s.highlight()}else mg.prototype.highlight.call(this,t,e,n,i)},e.prototype.downplay=function(t,e,n,i){var r=t.getData(),o=wo(r,i);if(this._changePolyState("normal"),null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else mg.prototype.downplay.call(this,t,e,n,i)},e.prototype._changePolyState=function(t){var e=this._polygon;fl(this._polyline,t),e&&fl(e,t)},e.prototype._newPolyline=function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new eS({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(e),this._polyline=e,e},e.prototype._newPolygon=function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new iS({shape:{points:t,stackedOnPoints:e},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,e,n){var i,r,o=e.getBaseAxis(),a=o.inverse;"cartesian2d"===e.type?(i=o.isHorizontal(),r=!1):"polar"===e.type&&(i="angle"===o.dim,r=!0);var s=t.hostModel,l=s.get("animationDuration");U(l)&&(l=l(null));var u=s.get("animationDelay")||0,h=U(u)?u(null):u;t.eachItemGraphicEl((function(t,o){var s=t;if(s){var c=[t.x,t.y],p=void 0,d=void 0,f=void 0;if(n)if(r){var g=n,y=e.pointToCoord(c);i?(p=g.startAngle,d=g.endAngle,f=-y[1]/180*Math.PI):(p=g.r0,d=g.r,f=y[0])}else{var v=n;i?(p=v.x,d=v.x+v.width,f=t.x):(p=v.y+v.height,d=v.y,f=t.y)}var m=d===p?0:(f-p)/(d-p);a&&(m=1-m);var x=U(u)?u(o):l*m+h,_=s.getSymbolPath(),b=_.getTextContent();s.attr({scaleX:0,scaleY:0}),s.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:x}),b&&b.animateFrom({style:{opacity:0}},{duration:300,delay:x}),_.disableLabelAnimation=!0}}))},e.prototype._initOrUpdateEndLabel=function(t,e,n){var i=t.getModel("endLabel");if(yS(t)){var r=t.getData(),o=this._polyline,a=r.getLayout("points");if(!a)return o.removeTextContent(),void(this._endLabel=null);var s=this._endLabel;s||((s=this._endLabel=new As({z2:200})).ignoreClip=!0,o.setTextContent(this._endLabel),o.disableLabelAnimation=!0);var l=function(t){for(var e,n,i=t.length/2;i>0&&(e=t[2*i-2],n=t[2*i-1],isNaN(e)||isNaN(n));i--);return i-1}(a);l>=0&&(Wh(o,Hh(t,"endLabel"),{inheritColor:n,labelFetcher:t,labelDataIndex:l,defaultText:function(t,e,n){return null!=n?Gw(r,n):Fw(r,t)},enableTextSetter:!0},function(t,e){var n=e.getBaseAxis(),i=n.isHorizontal(),r=n.inverse,o=i?r?"right":"left":"center",a=i?"middle":r?"top":"bottom";return{normal:{align:t.get("align")||o,verticalAlign:t.get("verticalAlign")||a}}}(i,e)),o.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,e,n,i,r,o,a){var s=this._endLabel,l=this._polyline;if(s){t<1&&null==i.originalX&&(i.originalX=s.x,i.originalY=s.y);var u=n.getLayout("points"),h=n.hostModel,c=h.get("connectNulls"),p=o.get("precision"),d=o.get("distance")||0,f=a.getBaseAxis(),g=f.isHorizontal(),y=f.inverse,v=e.shape,m=y?g?v.x:v.y+v.height:g?v.x+v.width:v.y,x=(g?d:0)*(y?-1:1),_=(g?0:-d)*(y?-1:1),b=g?"x":"y",w=function(t,e,n){for(var i,r,o=t.length/2,a="x"===n?0:1,s=0,l=-1,u=0;u=e||i>=e&&r<=e){l=u;break}s=u,i=r}else i=r;return{range:[s,l],t:(e-i)/(r-i)}}(u,m,b),S=w.range,M=S[1]-S[0],I=void 0;if(M>=1){if(M>1&&!c){var T=gS(u,S[0]);s.attr({x:T[0]+x,y:T[1]+_}),r&&(I=h.getRawValue(S[0]))}else{(T=l.getPointOn(m,b))&&s.attr({x:T[0]+x,y:T[1]+_});var C=h.getRawValue(S[0]),D=h.getRawValue(S[1]);r&&(I=Po(n,p,C,D,w.t))}i.lastFrameIndex=S[0]}else{var A=1===t||i.lastFrameIndex>0?S[0]:0;T=gS(u,A);r&&(I=h.getRawValue(A)),s.attr({x:T[0]+x,y:T[1]+_})}r&&$h(s).setLabelText(I)}},e.prototype._doUpdateAnimation=function(t,e,n,i,r,o){var a=this._polyline,s=this._polygon,l=t.hostModel,u=function(t,e,n,i,r,o,a,s){for(var l=function(t,e){var n=[];return e.diff(t).add((function(t){n.push({cmd:"+",idx:t})})).update((function(t,e){n.push({cmd:"=",idx:e,idx1:t})})).remove((function(t){n.push({cmd:"-",idx:t})})).execute(),n}(t,e),u=[],h=[],c=[],p=[],d=[],f=[],g=[],y=jw(r,e,a),v=t.getLayout("points")||[],m=e.getLayout("points")||[],x=0;x3e3||s&&hS(c,d)>3e3)return a.stopAnimation(),a.setShape({points:p}),void(s&&(s.stopAnimation(),s.setShape({points:p,stackedOnPoints:d})));a.shape.__points=u.current,a.shape.points=h;var f={shape:{points:p}};u.current!==h&&(f.shape.__points=u.next),a.stopAnimation(),ih(a,f,l),s&&(s.setShape({points:h,stackedOnPoints:c}),s.stopAnimation(),ih(s,{shape:{stackedOnPoints:d}},l),a.shape.points!==s.shape.points&&(s.shape.points=a.shape.points));for(var g=[],y=u.status,v=0;ve&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n10&&"cartesian2d"===o.type&&r){var s=o.getBaseAxis(),l=o.getOtherAxis(s),u=s.getExtent(),h=n.getDevicePixelRatio(),c=Math.abs(u[1]-u[0])*(h||1),p=Math.round(a/c);if(p>1){"lttb"===r&&t.setData(i.lttbDownSample(i.mapDimension(l.dim),1/p));var d=void 0;X(r)?d=_S[r]:U(r)&&(d=r),d&&t.setData(i.downSample(i.mapDimension(l.dim),1/p,d,bS))}}}}}var SS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(t,e){return nx(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t){var e=this.coordinateSystem;if(e&&e.clampData){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},e.type="series.__base_bar__",e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod"},e}(ag);ag.registerClass(SS);var MS=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.getInitialData=function(){return nx(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get("realtimeSort",!0)||null})},e.prototype.getProgressive=function(){return!!this.get("large")&&this.get("progressive")},e.prototype.getProgressiveThreshold=function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t},e.prototype.brushSelector=function(t,e,n){return n.rect(e.getItemLayout(t))},e.type="series.bar",e.dependencies=["grid","polar"],e.defaultOption=gc(SS.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:"rgba(180, 180, 180, 0.2)",borderColor:null,borderWidth:0,borderType:"solid",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:"#212121"}},realtimeSort:!1}),e}(SS),IS=function(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=2*Math.PI,this.clockwise=!0},TS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="sausage",n}return n(e,t),e.prototype.getDefaultShape=function(){return new IS},e.prototype.buildPath=function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=.5*(o-r),s=r+a,l=e.startAngle,u=e.endAngle,h=e.clockwise,c=2*Math.PI,p=h?u-lo)return!0;o=u}return!1},e.prototype._isOrderDifferentInView=function(t,e){for(var n=e.scale,i=n.getExtent(),r=Math.max(0,i[0]),o=Math.min(i[1],n.getOrdinalMeta().categories.length-1);r<=o;++r)if(t.ordinalNumbers[r]!==n.getRawOrdinalNumber(r))return!0},e.prototype._updateSortWithinSameData=function(t,e,n,i){if(this._isOrderChangedWithinSameData(t,e,n)){var r=this._dataSort(t,n,e);this._isOrderDifferentInView(r,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:"changeAxisOrder",componentType:n.dim+"Axis",axisId:n.index,sortInfo:r}))}},e.prototype._dispatchInitSort=function(t,e,n){var i=e.baseAxis,r=this._dataSort(t,i,(function(n){return t.get(t.mapDimension(e.otherAxis.dim),n)}));n.dispatchAction({type:"changeAxisOrder",componentType:i.dim+"Axis",isInitSort:!0,axisId:i.index,sortInfo:r})},e.prototype.remove=function(t,e){this._clear(this._model),this._removeOnRenderedListener(e)},e.prototype.dispose=function(t,e){this._removeOnRenderedListener(e)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off("rendered",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var e=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl((function(e){lh(e,t,Ws(e).dataIndex)}))):e.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type="bar",e}(mg),PS={cartesian2d:function(t,e){var n=e.width<0?-1:1,i=e.height<0?-1:1;n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height);var r=t.x+t.width,o=t.y+t.height,a=AS(e.x,t.x),s=kS(e.x+e.width,r),l=AS(e.y,t.y),u=kS(e.y+e.height,o),h=sr?s:a,e.y=c&&l>o?u:l,e.width=h?0:s-a,e.height=c?0:u-l,n<0&&(e.x+=e.width,e.width=-e.width),i<0&&(e.y+=e.height,e.height=-e.height),h||c},polar:function(t,e){var n=e.r0<=e.r?1:-1;if(n<0){var i=e.r;e.r=e.r0,e.r0=i}var r=kS(e.r,t.r),o=AS(e.r0,t.r0);e.r=r,e.r0=o;var a=r-o<0;if(n<0){i=e.r;e.r=e.r0,e.r0=i}return a}},OS={cartesian2d:function(t,e,n,i,r,o,a,s,l){var u=new Ts({shape:A({},i),z2:1});(u.__dataIndex=n,u.name="item",o)&&(u.shape[r?"height":"width"]=0);return u},polar:function(t,e,n,i,r,o,a,s,l){var u=!r&&l?TS:Tu,h=new u({shape:i,z2:1});h.name="item";var c,p,d=FS(r);if(h.calculateTextPosition=(c=d,p=({isRoundCap:u===TS}||{}).isRoundCap,function(t,e,n){var i=e.position;if(!i||i instanceof Array)return yr(t,e,n);var r=c(i),o=null!=e.distance?e.distance:5,a=this.shape,s=a.cx,l=a.cy,u=a.r,h=a.r0,d=(u+h)/2,f=a.startAngle,g=a.endAngle,y=(f+g)/2,v=p?Math.abs(u-h)/2:0,m=Math.cos,x=Math.sin,_=s+u*m(f),b=l+u*x(f),w="left",S="top";switch(r){case"startArc":_=s+(h-o)*m(y),b=l+(h-o)*x(y),w="center",S="top";break;case"insideStartArc":_=s+(h+o)*m(y),b=l+(h+o)*x(y),w="center",S="bottom";break;case"startAngle":_=s+d*m(f)+CS(f,o+v,!1),b=l+d*x(f)+DS(f,o+v,!1),w="right",S="middle";break;case"insideStartAngle":_=s+d*m(f)+CS(f,-o+v,!1),b=l+d*x(f)+DS(f,-o+v,!1),w="left",S="middle";break;case"middle":_=s+d*m(y),b=l+d*x(y),w="center",S="middle";break;case"endArc":_=s+(u+o)*m(y),b=l+(u+o)*x(y),w="center",S="bottom";break;case"insideEndArc":_=s+(u-o)*m(y),b=l+(u-o)*x(y),w="center",S="top";break;case"endAngle":_=s+d*m(g)+CS(g,o+v,!0),b=l+d*x(g)+DS(g,o+v,!0),w="left",S="middle";break;case"insideEndAngle":_=s+d*m(g)+CS(g,-o+v,!0),b=l+d*x(g)+DS(g,-o+v,!0),w="right",S="middle";break;default:return yr(t,e,n)}return(t=t||{}).x=_,t.y=b,t.align=w,t.verticalAlign=S,t}),o){var f=r?"r":"endAngle",g={};h.shape[f]=r?0:i.startAngle,g[f]=i[f],(s?ih:rh)(h,{shape:g},o)}return h}};function RS(t,e,n,i,r,o,a,s){var l,u;o?(u={x:i.x,width:i.width},l={y:i.y,height:i.height}):(u={y:i.y,height:i.height},l={x:i.x,width:i.width}),s||(a?ih:rh)(n,{shape:l},e,r,null),(a?ih:rh)(n,{shape:u},e?t.baseAxis.model:null,r)}function NS(t,e){for(var n=0;n0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle,clockwise:i.clockwise}}};function FS(t){return function(t){var e=t?"Arc":"Angle";return function(t){switch(t){case"start":case"insideStart":case"end":case"insideEnd":return t+e;default:return t}}}(t)}function GS(t,e,n,i,r,o,a,s){var l=e.getItemVisual(n,"style");s||t.setShape("r",i.get(["itemStyle","borderRadius"])||0),t.useStyle(l);var u=i.getShallow("cursor");u&&t.attr("cursor",u);var h=s?a?r.r>=r.r0?"endArc":"startArc":r.endAngle>=r.startAngle?"endAngle":"startAngle":a?r.height>=0?"bottom":"top":r.width>=0?"right":"left",c=Hh(i);Wh(t,c,{labelFetcher:o,labelDataIndex:n,defaultText:Fw(o.getData(),n),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:h});var p=t.getTextContent();if(s&&p){var d=i.get(["label","position"]);t.textConfig.inside="middle"===d||null,function(t,e,n,i){if(j(i))t.setTextConfig({rotation:i});else if(Y(e))t.setTextConfig({rotation:0});else{var r,o=t.shape,a=o.clockwise?o.startAngle:o.endAngle,s=o.clockwise?o.endAngle:o.startAngle,l=(a+s)/2,u=n(e);switch(u){case"startArc":case"insideStartArc":case"middle":case"insideEndArc":case"endArc":r=l;break;case"startAngle":case"insideStartAngle":r=a;break;case"endAngle":case"insideEndAngle":r=s;break;default:return void t.setTextConfig({rotation:0})}var h=1.5*Math.PI-r;"middle"===u&&h>Math.PI/2&&h<1.5*Math.PI&&(h-=Math.PI),t.setTextConfig({rotation:h})}}(t,"outside"===d?h:d,FS(a),i.get(["label","rotate"]))}Jh(p,c,o.getRawValue(n),(function(t){return Gw(e,t)}));var f=i.getModel(["emphasis"]);Ol(t,f.get("focus"),f.get("blurScope"),f.get("disabled")),zl(t,i),function(t){return null!=t.startAngle&&null!=t.endAngle&&t.startAngle===t.endAngle}(r)&&(t.style.fill="none",t.style.stroke="none",E(t.states,(function(t){t.style&&(t.style.fill=t.style.stroke="none")})))}var WS=function(){},HS=function(t){function e(e){var n=t.call(this,e)||this;return n.type="largeBar",n}return n(e,t),e.prototype.getDefaultShape=function(){return new WS},e.prototype.buildPath=function(t,e){for(var n=e.points,i=this.baseDimIdx,r=1-this.baseDimIdx,o=[],a=[],s=this.barWidth,l=0;l=s[0]&&e<=s[0]+l[0]&&n>=s[1]&&n<=s[1]+l[1])return a[h]}return-1}(this,t.offsetX,t.offsetY);Ws(this).dataIndex=e>=0?e:null}),30,!1);function XS(t,e,n){if(sS(n,"cartesian2d")){var i=e,r=n.getArea();return{x:t?i.x:r.x,y:t?r.y:i.y,width:t?i.width:r.width,height:t?r.height:i.height}}var o=e;return{cx:(r=n.getArea()).cx,cy:r.cy,r0:t?r.r0:o.r0,r:t?r.r:o.r,startAngle:t?o.startAngle:0,endAngle:t?o.endAngle:2*Math.PI}}var ZS=2*Math.PI,jS=Math.PI/180;function qS(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function KS(t,e){var n=qS(t,e),i=t.get("center"),r=t.get("radius");Y(r)||(r=[0,r]),Y(i)||(i=[i,i]);var o=Er(n.width,e.getWidth()),a=Er(n.height,e.getHeight()),s=Math.min(o,a);return{cx:Er(i[0],o)+n.x,cy:Er(i[1],a)+n.y,r0:Er(r[0],s/2),r:Er(r[1],s/2)}}function $S(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.getData(),i=e.mapDimension("value"),r=qS(t,n),o=KS(t,n),a=o.cx,s=o.cy,l=o.r,u=o.r0,h=-t.get("startAngle")*jS,c=t.get("minAngle")*jS,p=0;e.each(i,(function(t){!isNaN(t)&&p++}));var d=e.getSum(i),f=Math.PI/(d||p)*2,g=t.get("clockwise"),y=t.get("roseType"),v=t.get("stillShowZeroSum"),m=e.getDataExtent(i);m[0]=0;var x=ZS,_=0,b=h,w=g?1:-1;if(e.setLayout({viewRect:r,r:l}),e.each(i,(function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:g,cx:a,cy:s,r0:u,r:y?NaN:l});else{(i="area"!==y?0===d&&v?f:t*f:ZS/p)n?a:o,h=Math.abs(l.label.y-n);if(h>=u.maxY){var c=l.label.x-e-l.len2*r,p=i+l.len,f=Math.abs(c)t.unconstrainedWidth?null:d:null;i.setStyle("width",f)}var g=i.getBoundingRect();o.width=g.width;var y=(i.style.margin||0)+2.1;o.height=g.height+y,o.y-=(o.height-c)/2}}}function nM(t){return"center"===t.position}function iM(t){var e,n,i=t.getData(),r=[],o=!1,a=(t.get("minShowLabelAngle")||0)*QS,s=i.getLayout("viewRect"),l=i.getLayout("r"),u=s.width,h=s.x,c=s.y,p=s.height;function d(t){t.ignore=!0}i.each((function(t){var s=i.getItemGraphicEl(t),c=s.shape,p=s.getTextContent(),f=s.getTextGuideLine(),g=i.getItemModel(t),y=g.getModel("label"),v=y.get("position")||g.get(["emphasis","label","position"]),m=y.get("distanceToLabelLine"),x=y.get("alignTo"),_=Er(y.get("edgeDistance"),u),b=y.get("bleedMargin"),w=g.getModel("labelLine"),S=w.get("length");S=Er(S,u);var M=w.get("length2");if(M=Er(M,u),Math.abs(c.endAngle-c.startAngle)0?"right":"left":k>0?"left":"right"}var B=Math.PI,F=0,G=y.get("rotate");if(j(G))F=G*(B/180);else if("center"===v)F=0;else if("radial"===G||!0===G){F=k<0?-A+B:-A}else if("tangential"===G&&"outside"!==v&&"outer"!==v){var W=Math.atan2(k,L);W<0&&(W=2*B+W),L>0&&(W=B+W),F=W-B}if(o=!!F,p.x=I,p.y=T,p.rotation=F,p.setStyle({verticalAlign:"middle"}),P){p.setStyle({align:D});var H=p.states.select;H&&(H.x+=p.x,H.y+=p.y)}else{var Y=p.getBoundingRect().clone();Y.applyTransform(p.getComputedTransform());var U=(p.style.margin||0)+2.1;Y.y-=U/2,Y.height+=U,r.push({label:p,labelLine:f,position:v,len:S,len2:M,minTurnAngle:w.get("minTurnAngle"),maxSurfaceAngle:w.get("maxSurfaceAngle"),surfaceNormal:new Ji(k,L),linePoints:C,textAlign:D,labelDistance:m,labelAlignTo:x,edgeDistance:_,bleedMargin:b,rect:Y,unconstrainedWidth:Y.width,labelStyleWidth:p.style.width})}s.setTextConfig({inside:P})}})),!o&&t.get("avoidLabelOverlap")&&function(t,e,n,i,r,o,a,s){for(var l=[],u=[],h=Number.MAX_VALUE,c=-Number.MAX_VALUE,p=0;p0){for(var l=o.getItemLayout(0),u=1;isNaN(l&&l.startAngle)&&u=n.r0}},e.type="pie",e}(mg);function sM(t,e,n){e=Y(e)&&{coordDimensions:e}||A({encodeDefine:t.getEncode()},e);var i=t.getSource(),r=jm(i,e).dimensions,o=new Zm(r,t);return o.initData(i,n),o}var lM=function(){function t(t,e){this._getDataWithEncodedVisual=t,this._getRawData=e}return t.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},t.prototype.containName=function(t){return this._getRawData().indexOfName(t)>=0},t.prototype.indexOfName=function(t){return this._getDataWithEncodedVisual().indexOfName(t)},t.prototype.getItemVisual=function(t,e){return this._getDataWithEncodedVisual().getItemVisual(t,e)},t}(),uM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new lM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.mergeOption=function(){t.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return sM(this,{coordDimensions:["value"],encodeDefaulter:H(Hp,this)})},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=[];return n.each(n.mapDimension("value"),(function(t){r.push(t)})),i.percent=Wr(r,e,n.hostModel.get("percentPrecision")),i.$vars.push("percent"),i},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type="series.pie",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:"truncate",position:"outer",alignTo:"none",edgeDistance:"25%",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1,borderJoin:"round"},showEmptyCircle:!0,emptyCircleStyle:{color:"lightgray",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:"expansion",animationDuration:1e3,animationTypeUpdate:"transition",animationEasingUpdate:"cubicInOut",animationDurationUpdate:500,animationEasing:"cubicInOut"},e}(ag);var hM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){return nx(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},e.prototype.brushSelector=function(t,e,n){return n.point(e.getItemLayout(t))},e.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:""},e.type="series.scatter",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:"#212121"}},universalTransition:{divideShape:"clone"}},e}(ag),cM=function(){},pM=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.getDefaultShape=function(){return new cM},e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.buildPath=function(t,e){var n,i=e.points,r=e.size,o=this.symbolProxy,a=o.shape,s=t.getContext?t.getContext():t,l=s&&r[0]<4,u=this.softClipShape;if(l)this._ctx=s;else{for(this._ctx=null,n=this._off;n=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape,n=e.points,i=e.size,r=i[0],o=i[1],a=1/0,s=1/0,l=-1/0,u=-1/0,h=0;h=0&&(l.dataIndex=n+(t.startIndex||0))}))},t.prototype.remove=function(){this._clear()},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),fM=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData(),{clipShape:this._getClipShape(e)}),this._finished=t.end===e.getData().count()},e.prototype.updateTransform=function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var r=xS("").reset(t,e,n);r.progress&&r.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},e.prototype._getClipShape=function(t){var e=t.coordinateSystem,n=e&&e.getArea&&e.getArea();return t.get("clip",!0)?n:null},e.prototype._updateSymbolDraw=function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new dM:new Zw,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type="scatter",e}(mg),gM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.type="grid",e.dependencies=["xAxis","yAxis"],e.layoutMode="box",e.defaultOption={show:!1,z:0,left:"10%",top:60,right:"10%",bottom:70,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"},e}(Ip),yM=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("grid",Co).models[0]},e.type="cartesian2dAxis",e}(Ip);R(yM,h_);var vM={show:!0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#6E7079",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#E0E6F1"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.2)","rgba(210,219,238,0.2)"]}}},mM=C({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},vM),xM=C({boundaryGap:[0,0],axisLine:{show:"auto"},axisTick:{show:"auto"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#F4F7FD",width:1}}},vM),_M={category:mM,value:xM,time:C({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:"bold"}}},splitLine:{show:!1}},xM),log:k({logBase:10},xM)},bM={value:1,category:1,time:1,log:1};function wM(t,e,i,r){E(bM,(function(o,a){var s=C(C({},_M[a],!0),r,!0),l=function(t){function i(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e+"Axis."+a,n}return n(i,t),i.prototype.mergeDefaultAndTheme=function(t,e){var n=_p(this),i=n?wp(t):{};C(t,e.getTheme().get(a+"Axis")),C(t,this.getDefaultOption()),t.type=SM(t),n&&bp(t,i,n)},i.prototype.optionUpdated=function(){"category"===this.option.type&&(this.__ordinalMeta=ox.createByAxisModel(this))},i.prototype.getCategories=function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},i.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},i.type=e+"Axis."+a,i.defaultOption=s,i}(i);t.registerComponentModel(l)})),t.registerSubTypeDefaulter(e+"Axis",SM)}function SM(t){return t.type||(t.data?"category":"value")}var MM=function(){function t(t){this.type="cartesian",this._dimList=[],this._axes={},this.name=t||""}return t.prototype.getAxis=function(t){return this._axes[t]},t.prototype.getAxes=function(){return z(this._dimList,(function(t){return this._axes[t]}),this)},t.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),B(this.getAxes(),(function(e){return e.scale.type===t}))},t.prototype.addAxis=function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},t}(),IM=["x","y"];function TM(t){return"interval"===t.type||"time"===t.type}var CM=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="cartesian2d",e.dimensions=IM,e}return n(e,t),e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis("x").scale,e=this.getAxis("y").scale;if(TM(t)&&TM(e)){var n=t.getExtent(),i=e.getExtent(),r=this.dataToPoint([n[0],i[0]]),o=this.dataToPoint([n[1],i[1]]),a=n[1]-n[0],s=i[1]-i[0];if(a&&s){var l=(o[0]-r[0])/a,u=(o[1]-r[1])/s,h=r[0]-n[0]*l,c=r[1]-i[0]*u,p=this._transform=[l,0,0,u,h,c];this._invTransform=Bi([],p)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},e.prototype.containPoint=function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},e.prototype.dataToPoint=function(t,e,n){n=n||[];var i=t[0],r=t[1];if(this._transform&&null!=i&&isFinite(i)&&null!=r&&isFinite(r))return Ft(n,t,this._transform);var o=this.getAxis("x"),a=this.getAxis("y");return n[0]=o.toGlobalCoord(o.dataToCoord(i,e)),n[1]=a.toGlobalCoord(a.dataToCoord(r,e)),n},e.prototype.clampData=function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return(e=e||[])[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},e.prototype.pointToData=function(t,e){var n=[];if(this._invTransform)return Ft(n,t,this._invTransform);var i=this.getAxis("x"),r=this.getAxis("y");return n[0]=i.coordToData(i.toLocalCoord(t[0]),e),n[1]=r.coordToData(r.toLocalCoord(t[1]),e),n},e.prototype.getOtherAxis=function(t){return this.getAxis("x"===t.dim?"y":"x")},e.prototype.getArea=function(){var t=this.getAxis("x").getGlobalExtent(),e=this.getAxis("y").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(e[0],e[1]),r=Math.max(t[0],t[1])-n,o=Math.max(e[0],e[1])-i;return new sr(n,i,r,o)},e}(MM),DM=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.index=0,a.type=r||"value",a.position=o||"bottom",a}return n(e,t),e.prototype.isHorizontal=function(){var t=this.position;return"top"===t||"bottom"===t},e.prototype.getGlobalExtent=function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},e.prototype.pointToData=function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},e.prototype.setCategorySortInfo=function(t){if("category"!==this.type)return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(G_);function AM(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],p={left:0,right:1,top:0,bottom:1,onZero:2},d=e.get("offset")||0,f="x"===u?[c[2]-d,c[3]+d]:[c[0]-d,c[1]+d];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));f[p.onZero]=Math.max(Math.min(g,f[1]),f[0])}o.position=["y"===u?f[p[l]]:c[0],"x"===u?f[p[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);o.labelDirection=o.tickDirection=o.nameDirection={top:-1,bottom:1,left:-1,right:1}[s],o.labelOffset=a?f[p[s]]-f[p.onZero]:0,e.get(["axisTick","inside"])&&(o.tickDirection=-o.tickDirection),it(n.labelInside,e.get(["axisLabel","inside"]))&&(o.labelDirection=-o.labelDirection);var y=e.get(["axisLabel","rotate"]);return o.labelRotate="top"===l?-y:y,o.z2=1,o}function kM(t){return"cartesian2d"===t.get("coordinateSystem")}function LM(t){var e={xAxisModel:null,yAxisModel:null};return E(e,(function(n,i){var r=i.replace(/Model$/,""),o=t.getReferringComponents(r,Co).models[0];e[i]=o})),e}var PM=Math.log;function OM(t,e,n){var i=vx.prototype,r=i.getTicks.call(n),o=i.getTicks.call(n,!0),a=r.length-1,s=i.getInterval.call(n),l=e_(t,e),u=l.extent,h=l.fixMin,c=l.fixMax;if("log"===t.type){var p=PM(t.base);u=[PM(u[0])/p,PM(u[1])/p]}t.setExtent(u[0],u[1]),t.calcNiceExtent({splitNumber:a,fixMin:h,fixMax:c});var d=i.getExtent.call(t);h&&(u[0]=d[0]),c&&(u[1]=d[1]);var f=i.getInterval.call(t),g=u[0],y=u[1];if(h&&c)f=(y-g)/a;else if(h)for(y=u[0]+f*a;yu[0]&&isFinite(g)&&isFinite(u[0]);)f=ux(f),g=u[1]-f*a;else{t.getTicks().length-1>a&&(f=ux(f));var v=f*a;(g=zr((y=Math.ceil(u[1]/f)*f)-v))<0&&u[0]>=0?(g=0,y=zr(v)):y>0&&u[1]<=0&&(y=0,g=-zr(v))}var m=(r[0].value-o[0].value)/s,x=(r[a].value-o[a].value)/s;i.setExtent.call(t,g+f*m,y+f*x),i.setInterval.call(t,f),(m||x)&&i.setNiceExtent.call(t,g+f,y-f)}var RM=function(){function t(t,e,n){this.type="grid",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=IM,this._initCartesian(t,e,n),this.model=t}return t.prototype.getRect=function(){return this._rect},t.prototype.update=function(t,e){var n=this._axesMap;function i(t){var e,n=G(t),i=n.length;if(i){for(var r=[],o=i-1;o>=0;o--){var a=t[+n[o]],s=a.model,l=a.scale;sx(l)&&s.get("alignTicks")&&null==s.get("interval")?r.push(a):(n_(l,s),sx(l)&&(e=a))}r.length&&(e||n_((e=r.pop()).scale,e.model),E(r,(function(t){OM(t.scale,t.model,e.scale)})))}}this._updateScale(t,this.model),i(n.x),i(n.y);var r={};E(n.x,(function(t){EM(n,"y",t,r)})),E(n.y,(function(t){EM(n,"x",t,r)})),this.resize(this.model,e)},t.prototype.resize=function(t,e,n){var i=t.getBoxLayoutParams(),r=!n&&t.get("containLabel"),o=mp(i,{width:e.getWidth(),height:e.getHeight()});this._rect=o;var a=this._axesList;function s(){E(a,(function(t){var e=t.isHorizontal(),n=e?[0,o.width]:[0,o.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),function(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}(t,e?o.x:o.y)}))}s(),r&&(E(a,(function(t){if(!t.model.get(["axisLabel","inside"])){var e=function(t){var e=t.model,n=t.scale;if(e.get(["axisLabel","show"])&&!n.isBlank()){var i,r,o=n.getExtent();r=n instanceof gx?n.count():(i=n.getTicks()).length;var a,s=t.getLabelModel(),l=r_(t),u=1;r>40&&(u=Math.ceil(r/40));for(var h=0;h0&&i>0||n<0&&i<0)}(t)}var VM=Math.PI,BM=function(){function t(t,e){this.group=new Cr,this.opt=e,this.axisModel=t,k(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new Cr({x:e.position[0],y:e.position[1],rotation:e.rotation});n.updateTransform(),this._transformGroup=n}return t.prototype.hasBuilder=function(t){return!!FM[t]},t.prototype.add=function(t){FM[t](this.opt,this.axisModel,this.group,this._transformGroup)},t.prototype.getGroup=function(){return this.group},t.innerTextLayout=function(t,e,n){var i,r,o=Ur(e-t);return Xr(o)?(r=n>0?"top":"bottom",i="center"):Xr(o-VM)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},t.makeAxisEventDataBase=function(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e},t.isLabelSilent=function(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)},t}(),FM={axisLine:function(t,e,n,i){var r=e.get(["axisLine","show"]);if("auto"===r&&t.handleAutoShown&&(r=t.handleAutoShown("axisLine")),r){var o=e.axis.getExtent(),a=i.transform,s=[o[0],0],l=[o[1],0];a&&(Ft(s,s,a),Ft(l,l,a));var u=A({lineCap:"round"},e.getModel(["axisLine","lineStyle"]).getLineStyle()),h=new Eu({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1});h.anid="line",n.add(h);var c=e.get(["axisLine","symbol"]);if(null!=c){var p=e.get(["axisLine","symbolSize"]);X(c)&&(c=[c,c]),(X(p)||j(p))&&(p=[p,p]);var d=Py(e.get(["axisLine","symbolOffset"])||0,p),f=p[0],g=p[1];E([{rotate:t.rotation+Math.PI/2,offset:d[0],r:0},{rotate:t.rotation-Math.PI/2,offset:d[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],(function(e,i){if("none"!==c[i]&&null!=c[i]){var r=ky(c[i],-f/2,-g/2,f,g,u.stroke,!0),o=e.r+e.offset;r.attr({rotation:e.rotate,x:s[0]+o*Math.cos(t.rotation),y:s[1]-o*Math.sin(t.rotation),silent:!0,z2:11}),n.add(r)}}))}}},axisTickLabel:function(t,e,n,i){var r=function(t,e,n,i){var r=n.axis,o=n.getModel("axisTick"),a=o.get("show");"auto"===a&&i.handleAutoShown&&(a=i.handleAutoShown("axisTick"));if(!a||r.scale.isBlank())return;for(var s=o.getModel("lineStyle"),l=i.tickDirection*o.get("length"),u=YM(r.getTicksCoords(),e.transform,l,k(s.getLineStyle(),{stroke:n.get(["axisLine","lineStyle","color"])}),"ticks"),h=0;hc[1]?-1:1,d=["start"===s?c[0]-p*h:"end"===s?c[1]+p*h:(c[0]+c[1])/2,HM(s)?t.labelOffset+l*h:0],f=e.get("nameRotate");null!=f&&(f=f*VM/180),HM(s)?o=BM.innerTextLayout(t.rotation,null!=f?f:t.rotation,l):(o=function(t,e,n,i){var r,o,a=Ur(n-t),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;Xr(a-VM/2)?(o=l?"bottom":"top",r="center"):Xr(a-1.5*VM)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*VM&&a>VM/2?l?"left":"right":l?"right":"left");return{rotation:a,textAlign:r,textVerticalAlign:o}}(t.rotation,s,f||0,c),null!=(a=t.axisNameAvailableWidth)&&(a=Math.abs(a/Math.sin(o.rotation)),!isFinite(a)&&(a=null)));var g=u.getFont(),y=e.get("nameTruncate",!0)||{},v=y.ellipsis,m=it(t.nameTruncateMaxWidth,y.maxWidth,a),x=new As({x:d[0],y:d[1],rotation:o.rotation,silent:BM.isLabelSilent(e),style:Yh(u,{text:r,font:g,overflow:"truncate",width:m,ellipsis:v,fill:u.getTextColor()||e.get(["axisLine","lineStyle","color"]),align:u.get("align")||o.textAlign,verticalAlign:u.get("verticalAlign")||o.textVerticalAlign}),z2:1});if(Nh({el:x,componentModel:e,itemName:r}),x.__fullText=r,x.anid="name",e.get("triggerEvent")){var _=BM.makeAxisEventDataBase(e);_.targetType="axisName",_.name=r,Ws(x).eventData=_}i.add(x),x.updateTransform(),n.add(x),x.decomposeTransform()}}};function GM(t){t&&(t.ignore=!0)}function WM(t,e){var n=t&&t.getBoundingRect().clone(),i=e&&e.getBoundingRect().clone();if(n&&i){var r=Oi([]);return zi(r,r,-t.rotation),n.applyTransform(Ni([],r,t.getLocalTransform())),i.applyTransform(Ni([],r,e.getLocalTransform())),n.intersect(i)}}function HM(t){return"middle"===t||"center"===t}function YM(t,e,n,i,r){for(var o=[],a=[],s=[],l=0;l=0||t===e}function ZM(t){var e=jM(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=qM(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a0&&!c.min?c.min=0:null!=c.min&&c.min<0&&!c.max&&(c.max=0);var p=a;null!=c.color&&(p=k({color:c.color},a));var d=C(T(c),{boundaryGap:t,splitNumber:e,scale:n,axisLine:i,axisTick:r,axisLabel:o,name:c.text,showName:s,nameLocation:"end",nameGap:u,nameTextStyle:p,triggerEvent:h},!1);if(s||(d.name=""),X(l)){var f=d.name;d.name=l.replace("{value}",null!=f?f:"")}else U(l)&&(d.name=l(d.name,d));var g=new pc(d,null,this.ecModel);return R(g,h_.prototype),g.mainType="radar",g.componentIndex=this.componentIndex,g}),this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type="radar",e.defaultOption={z:0,center:["50%","50%"],radius:"75%",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:"polygon",axisLine:C({lineStyle:{color:"#bbb"}},vI.axisLine),axisLabel:mI(vI.axisLabel,!1),axisTick:mI(vI.axisTick,!1),splitLine:mI(vI.splitLine,!0),splitArea:mI(vI.splitArea,!0),indicator:[]},e}(Ip),_I=["axisLine","axisTickLabel","axisName"],bI=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var e=t.coordinateSystem;E(z(e.getIndicatorAxes(),(function(t){var n=t.model.get("showName")?t.name:"";return new BM(t.model,{axisName:n,position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})})),(function(t){E(_I,t.add,t),this.group.add(t.getGroup())}),this)},e.prototype._buildSplitLineAndArea=function(t){var e=t.coordinateSystem,n=e.getIndicatorAxes();if(n.length){var i=t.get("shape"),r=t.getModel("splitLine"),o=t.getModel("splitArea"),a=r.getModel("lineStyle"),s=o.getModel("areaStyle"),l=r.get("show"),u=o.get("show"),h=a.get("color"),c=s.get("color"),p=Y(h)?h:[h],d=Y(c)?c:[c],f=[],g=[];if("circle"===i)for(var y=n[0].getTicksCoords(),v=e.cx,m=e.cy,x=0;x3?1.4:r>1?1.2:1.1;AI(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a,isAvailableBehavior:null})}if(n){var l=Math.abs(i);AI(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){TI(this._zr,"globalPan")||AI(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})},e}(Xt);function AI(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(se(i.event),kI(t,e,n,i,r))}function kI(t,e,n,i,r){r.isAvailableBehavior=W(LI,null,n,i),t.trigger(e,r)}function LI(t,e,n){var i=n[t];return!t||i&&(!X(i)||e.event[i+"Key"])}function PI(t,e,n){var i=t.target;i.x+=e,i.y+=n,i.dirty()}function OI(t,e,n,i){var r=t.target,o=t.zoomLimit,a=t.zoom=t.zoom||1;if(a*=e,o){var s=o.min||0,l=o.max||1/0;a=Math.max(Math.min(l,a),s)}var u=a/t.zoom;t.zoom=a,r.x-=(n-r.x)*(u-1),r.y-=(i-r.y)*(u-1),r.scaleX*=u,r.scaleY*=u,r.dirty()}var RI,NI={axisPointer:1,tooltip:1,brush:1};function EI(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!NI.hasOwnProperty(i.mainType)&&r&&r.model!==n}function zI(t){X(t)&&(t=(new DOMParser).parseFromString(t,"text/xml"));var e=t;for(9===e.nodeType&&(e=e.firstChild);"svg"!==e.nodeName.toLowerCase()||1!==e.nodeType;)e=e.nextSibling;return e}var VI={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-anchor":"textAlign",visibility:"visibility",display:"display"},BI=G(VI),FI={"alignment-baseline":"textBaseline","stop-color":"stopColor"},GI=G(FI),WI=function(){function t(){this._defs={},this._root=null}return t.prototype.parse=function(t,e){e=e||{};var n=zI(t);this._defsUsePending=[];var i=new Cr;this._root=i;var r=[],o=n.getAttribute("viewBox")||"",a=parseFloat(n.getAttribute("width")||e.width),s=parseFloat(n.getAttribute("height")||e.height);isNaN(a)&&(a=null),isNaN(s)&&(s=null),jI(n,i,null,!0,!1);for(var l,u,h=n.firstChild;h;)this._parseNode(h,i,r,null,!1,!1),h=h.nextSibling;if(function(t,e){for(var n=0;n=4&&(l={x:parseFloat(c[0]||0),y:parseFloat(c[1]||0),width:parseFloat(c[2]),height:parseFloat(c[3])})}if(l&&null!=a&&null!=s&&(u=iT(l,{x:0,y:0,width:a,height:s}),!e.ignoreViewBox)){var p=i;(i=new Cr).add(p),p.scaleX=p.scaleY=u.scale,p.x=u.x,p.y=u.y}return e.ignoreRootClip||null==a||null==s||i.setClipPath(new Ts({shape:{x:0,y:0,width:a,height:s}})),{root:i,width:a,height:s,viewBoxRect:l,viewBoxTransform:u,named:r}},t.prototype._parseNode=function(t,e,n,i,r,o){var a,s=t.nodeName.toLowerCase(),l=i;if("defs"===s&&(r=!0),"text"===s&&(o=!0),"defs"===s||"switch"===s)a=e;else{if(!r){var u=RI[s];if(u&&mt(RI,s)){a=u.call(this,t,e);var h=t.getAttribute("name");if(h){var c={name:h,namedFrom:null,svgNodeTagLower:s,el:a};n.push(c),"g"===s&&(l=c)}else i&&n.push({name:i.name,namedFrom:i,svgNodeTagLower:s,el:a});e.add(a)}}var p=HI[s];if(p&&mt(HI,s)){var d=p.call(this,t),f=t.getAttribute("id");f&&(this._defs[f]=d)}}if(a&&a.isGroup)for(var g=t.firstChild;g;)1===g.nodeType?this._parseNode(g,a,n,l,r,o):3===g.nodeType&&o&&this._parseText(g,a),g=g.nextSibling},t.prototype._parseText=function(t,e){var n=new ys({style:{text:t.textContent},silent:!0,x:this._textX||0,y:this._textY||0});XI(e,n),jI(t,n,this._defsUsePending,!1,!1),function(t,e){var n=e.__selfStyle;if(n){var i=n.textBaseline,r=i;i&&"auto"!==i?"baseline"===i?r="alphabetic":"before-edge"===i||"text-before-edge"===i?r="top":"after-edge"===i||"text-after-edge"===i?r="bottom":"central"!==i&&"mathematical"!==i||(r="middle"):r="alphabetic",t.style.textBaseline=r}var o=e.__inheritedStyle;if(o){var a=o.textAlign,s=a;a&&("middle"===a&&(s="center"),t.style.textAlign=s)}}(n,e);var i=n.style,r=i.fontSize;r&&r<9&&(i.fontSize=9,n.scaleX*=r/9,n.scaleY*=r/9);var o=(i.fontSize||i.fontFamily)&&[i.fontStyle,i.fontWeight,(i.fontSize||12)+"px",i.fontFamily||"sans-serif"].join(" ");i.font=o;var a=n.getBoundingRect();return this._textX+=a.width,e.add(n),n},t.internalField=void(RI={g:function(t,e){var n=new Cr;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n},rect:function(t,e){var n=new Ts;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({x:parseFloat(t.getAttribute("x")||"0"),y:parseFloat(t.getAttribute("y")||"0"),width:parseFloat(t.getAttribute("width")||"0"),height:parseFloat(t.getAttribute("height")||"0")}),n.silent=!0,n},circle:function(t,e){var n=new uu;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),r:parseFloat(t.getAttribute("r")||"0")}),n.silent=!0,n},line:function(t,e){var n=new Eu;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({x1:parseFloat(t.getAttribute("x1")||"0"),y1:parseFloat(t.getAttribute("y1")||"0"),x2:parseFloat(t.getAttribute("x2")||"0"),y2:parseFloat(t.getAttribute("y2")||"0")}),n.silent=!0,n},ellipse:function(t,e){var n=new cu;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setShape({cx:parseFloat(t.getAttribute("cx")||"0"),cy:parseFloat(t.getAttribute("cy")||"0"),rx:parseFloat(t.getAttribute("rx")||"0"),ry:parseFloat(t.getAttribute("ry")||"0")}),n.silent=!0,n},polygon:function(t,e){var n,i=t.getAttribute("points");i&&(n=ZI(i));var r=new Lu({shape:{points:n||[]},silent:!0});return XI(e,r),jI(t,r,this._defsUsePending,!1,!1),r},polyline:function(t,e){var n,i=t.getAttribute("points");i&&(n=ZI(i));var r=new Ou({shape:{points:n||[]},silent:!0});return XI(e,r),jI(t,r,this._defsUsePending,!1,!1),r},image:function(t,e){var n=new xs;return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.setStyle({image:t.getAttribute("xlink:href")||t.getAttribute("href"),x:+t.getAttribute("x"),y:+t.getAttribute("y"),width:+t.getAttribute("width"),height:+t.getAttribute("height")}),n.silent=!0,n},text:function(t,e){var n=t.getAttribute("x")||"0",i=t.getAttribute("y")||"0",r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0";this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Cr;return XI(e,a),jI(t,a,this._defsUsePending,!1,!0),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||"0",o=t.getAttribute("dy")||"0",a=new Cr;return XI(e,a),jI(t,a,this._defsUsePending,!1,!0),this._textX+=parseFloat(r),this._textY+=parseFloat(o),a},path:function(t,e){var n=au(t.getAttribute("d")||"");return XI(e,n),jI(t,n,this._defsUsePending,!1,!1),n.silent=!0,n}}),t}(),HI={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||"0",10),n=parseInt(t.getAttribute("y1")||"0",10),i=parseInt(t.getAttribute("x2")||"10",10),r=parseInt(t.getAttribute("y2")||"0",10),o=new Uu(e,n,i,r);return YI(t,o),UI(t,o),o},radialgradient:function(t){var e=parseInt(t.getAttribute("cx")||"0",10),n=parseInt(t.getAttribute("cy")||"0",10),i=parseInt(t.getAttribute("r")||"0",10),r=new Xu(e,n,i);return YI(t,r),UI(t,r),r}};function YI(t,e){"userSpaceOnUse"===t.getAttribute("gradientUnits")&&(e.global=!0)}function UI(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType&&"stop"===n.nodeName.toLocaleLowerCase()){var i=n.getAttribute("offset"),r=void 0;r=i&&i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var o={};nT(n,o,o);var a=o.stopColor||n.getAttribute("stop-color")||"#000000";e.colorStops.push({offset:r,color:a})}n=n.nextSibling}}function XI(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),k(e.__inheritedStyle,t.__inheritedStyle))}function ZI(t){for(var e=JI(t),n=[],i=0;i0;o-=2){var a=i[o],s=i[o-1],l=JI(a);switch(r=r||[1,0,0,1,0,0],s){case"translate":Ei(r,r,[parseFloat(l[0]),parseFloat(l[1]||"0")]);break;case"scale":Vi(r,r,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case"rotate":zi(r,r,-parseFloat(l[0])*tT);break;case"skewX":Ni(r,[1,0,Math.tan(parseFloat(l[0])*tT),1,0,0],r);break;case"skewY":Ni(r,[1,Math.tan(parseFloat(l[0])*tT),0,1,0,0],r);break;case"matrix":r[0]=parseFloat(l[0]),r[1]=parseFloat(l[1]),r[2]=parseFloat(l[2]),r[3]=parseFloat(l[3]),r[4]=parseFloat(l[4]),r[5]=parseFloat(l[5])}}e.setLocalTransform(r)}}(t,e),nT(t,a,s),i||function(t,e,n){for(var i=0;i0,f={api:n,geo:s,mapOrGeoModel:t,data:a,isVisualEncodedByVisualMap:d,isGeo:o,transformInfoRaw:c};"geoJSON"===s.resourceType?this._buildGeoJSON(f):"geoSVG"===s.resourceType&&this._buildSVG(f),this._updateController(t,e,n),this._updateMapSelectHandler(t,l,n,i)},t.prototype._buildGeoJSON=function(t){var e=this._regionsGroupByName=ft(),n=ft(),i=this._regionsGroup,r=t.transformInfoRaw,o=t.mapOrGeoModel,a=t.data,s=t.geo.projection,l=s&&s.stream;function u(t,e){return e&&(t=e(t)),t&&[t[0]*r.scaleX+r.x,t[1]*r.scaleY+r.y]}function h(t){for(var e=[],n=!l&&s&&s.project,i=0;i=0)&&(p=r);var d=a?{normal:{align:"center",verticalAlign:"middle"}}:null;Wh(e,Hh(i),{labelFetcher:p,labelDataIndex:c,defaultText:n},d);var f=e.getTextContent();if(f&&(MT(f).ignore=f.ignore,e.textConfig&&a)){var g=e.getBoundingRect().clone();e.textConfig.layoutRect=g,e.textConfig.position=[(a[0]-g.x)/g.width*100+"%",(a[1]-g.y)/g.height*100+"%"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function kT(t,e,n,i,r,o){t.data?t.data.setItemGraphicEl(o,e):Ws(e).eventData={componentType:"geo",componentIndex:r.componentIndex,geoIndex:r.componentIndex,name:n,region:i&&i.option||{}}}function LT(t,e,n,i,r){t.data||Nh({el:e,componentModel:r,itemName:n,itemTooltipOption:i.get("tooltip")})}function PT(t,e,n,i,r){e.highDownSilentOnTouch=!!r.get("selectedMode");var o=i.getModel("emphasis"),a=o.get("focus");return Ol(e,a,o.get("blurScope"),o.get("disabled")),t.isGeo&&function(t,e,n){var i=Ws(t);i.componentMainType=e.mainType,i.componentIndex=e.componentIndex,i.componentHighDownName=n}(e,r,n),a}function OT(t,e,n){var i,r=[];function o(){i=[]}function a(){i.length&&(r.push(i),i=[])}var s=e({polygonStart:o,polygonEnd:a,lineStart:o,lineEnd:a,point:function(t,e){isFinite(t)&&isFinite(e)&&i.push([t,e])},sphere:function(){}});return!n&&s.polygonStart(),E(t,(function(t){s.lineStart();for(var e=0;e-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2),n},e.type="series.map",e.dependencies=["geo"],e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}},select:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{color:"rgba(255,215,0,0.8)"}},nameProperty:"name"},e}(ag);function ET(t){var e={};t.eachSeriesByType("map",(function(t){var n=t.getHostGeoModel(),i=n?"o"+n.id:"i"+t.getMapType();(e[i]=e[i]||[]).push(t)})),E(e,(function(t,e){for(var n,i,r,o=(n=z(t,(function(t){return t.getData()})),i=t[0].get("mapValueCalculation"),r={},E(n,(function(t){t.each(t.mapDimension("value"),(function(e,n){var i="ec-"+t.getName(n);r[i]=r[i]||[],isNaN(e)||r[i].push(e)}))})),n[0].map(n[0].mapDimension("value"),(function(t,e){for(var o="ec-"+n[0].getName(e),a=0,s=1/0,l=-1/0,u=r[o].length,h=0;h1?(d.width=p,d.height=p/x):(d.height=p,d.width=p*x),d.y=c[1]-d.height/2,d.x=c[0]-d.width/2;else{var b=t.getBoxLayoutParams();b.aspect=x,d=mp(b,{width:v,height:m})}this.setViewRect(d.x,d.y,d.width,d.height),this.setCenter(t.get("center")),this.setZoom(t.get("zoom"))}R(HT,BT);var XT=new(function(){function t(){this.dimensions=WT}return t.prototype.create=function(t,e){var n=[];function i(t){return{nameProperty:t.get("nameProperty"),aspectScale:t.get("aspectScale"),projection:t.get("projection")}}t.eachComponent("geo",(function(t,r){var o=t.get("map"),a=new HT(o+r,o,A({nameMap:t.get("nameMap")},i(t)));a.zoomLimit=t.get("scaleLimit"),n.push(a),t.coordinateSystem=a,a.model=t,a.resize=UT,a.resize(t,e)})),t.eachSeries((function(t){if("geo"===t.get("coordinateSystem")){var e=t.get("geoIndex")||0;t.coordinateSystem=n[e]}}));var r={};return t.eachSeriesByType("map",(function(t){if(!t.getHostGeoModel()){var e=t.getMapType();r[e]=r[e]||[],r[e].push(t)}})),E(r,(function(t,r){var o=z(t,(function(t){return t.get("nameMap")})),a=new HT(r,r,A({nameMap:D(o)},i(t[0])));a.zoomLimit=it.apply(null,z(t,(function(t){return t.get("scaleLimit")}))),n.push(a),a.resize=UT,a.resize(t[0],e),E(t,(function(t){t.coordinateSystem=a,function(t,e){E(e.get("geoCoord"),(function(e,n){t.addGeoCoord(n,e)}))}(a,t)}))})),n},t.prototype.getFilledRegions=function(t,e,n,i){for(var r=(t||[]).slice(),o=ft(),a=0;a=0;){var o=e[n];o.hierNode.prelim+=i,o.hierNode.modifier+=i,r+=o.hierNode.change,i+=o.hierNode.shift+r}}(t);var o=(n[0].hierNode.prelim+n[n.length-1].hierNode.prelim)/2;r?(t.hierNode.prelim=r.hierNode.prelim+e(t,r),t.hierNode.modifier=t.hierNode.prelim-o):t.hierNode.prelim=o}else r&&(t.hierNode.prelim=r.hierNode.prelim+e(t,r));t.parentNode.hierNode.defaultAncestor=function(t,e,n,i){if(e){for(var r=t,o=t,a=o.parentNode.children[0],s=e,l=r.hierNode.modifier,u=o.hierNode.modifier,h=a.hierNode.modifier,c=s.hierNode.modifier;s=iC(s),o=rC(o),s&&o;){r=iC(r),a=rC(a),r.hierNode.ancestor=t;var p=s.hierNode.prelim+c-o.hierNode.prelim-u+i(s,o);p>0&&(aC(oC(s,t,n),t,p),u+=p,l+=p),c+=s.hierNode.modifier,u+=o.hierNode.modifier,l+=r.hierNode.modifier,h+=a.hierNode.modifier}s&&!iC(r)&&(r.hierNode.thread=s,r.hierNode.modifier+=c-l),o&&!rC(a)&&(a.hierNode.thread=o,a.hierNode.modifier+=u-h,n=t)}return n}(t,r,t.parentNode.hierNode.defaultAncestor||i[0],e)}function tC(t){var e=t.hierNode.prelim+t.parentNode.hierNode.modifier;t.setLayout({x:e},!0),t.hierNode.modifier+=t.parentNode.hierNode.modifier}function eC(t){return arguments.length?t:sC}function nC(t,e){return t-=Math.PI/2,{x:e*Math.cos(t),y:e*Math.sin(t)}}function iC(t){var e=t.children;return e.length&&t.isExpand?e[e.length-1]:t.hierNode.thread}function rC(t){var e=t.children;return e.length&&t.isExpand?e[0]:t.hierNode.thread}function oC(t,e,n){return t.hierNode.ancestor.parentNode===e.parentNode?t.hierNode.ancestor:n}function aC(t,e,n){var i=n/(e.hierNode.i-t.hierNode.i);e.hierNode.change-=i,e.hierNode.shift+=n,e.hierNode.modifier+=n,e.hierNode.prelim+=n,t.hierNode.change+=i}function sC(t,e){return t.parentNode===e.parentNode?1:2}var lC=function(){this.parentPoint=[],this.childPoints=[]},uC=function(t){function e(e){return t.call(this,e)||this}return n(e,t),e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new lC},e.prototype.buildPath=function(t,e){var n=e.childPoints,i=n.length,r=e.parentPoint,o=n[0],a=n[i-1];if(1===i)return t.moveTo(r[0],r[1]),void t.lineTo(o[0],o[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Er(e.forkPosition,1),c=[];c[l]=r[l],c[u]=r[u]+(a[u]-r[u])*h,t.moveTo(r[0],r[1]),t.lineTo(c[0],c[1]),t.moveTo(o[0],o[1]),c[l]=o[l],t.lineTo(c[0],c[1]),c[l]=a[l],t.lineTo(c[0],c[1]),t.lineTo(a[0],a[1]);for(var p=1;pm.x)||(_-=Math.PI);var S=b?"left":"right",M=s.getModel("label"),I=M.get("rotate"),T=I*(Math.PI/180),C=y.getTextContent();C&&(y.setTextConfig({position:M.get("position")||S,rotation:null==I?-_:T,origin:"center"}),C.setStyle("verticalAlign","middle"))}var D=s.get(["emphasis","focus"]),A="ancestor"===D?a.getAncestorsIndices():"descendant"===D?a.getDescendantIndices():null;A&&(Ws(n).focus=A),function(t,e,n,i,r,o,a,s){var l=e.getModel(),u=t.get("edgeShape"),h=t.get("layout"),c=t.getOrient(),p=t.get(["lineStyle","curveness"]),d=t.get("edgeForkPosition"),f=l.getModel("lineStyle").getLineStyle(),g=i.__edge;if("curve"===u)e.parentNode&&e.parentNode!==n&&(g||(g=i.__edge=new Fu({shape:yC(h,c,p,r,r)})),ih(g,{shape:yC(h,c,p,o,a)},t));else if("polyline"===u)if("orthogonal"===h){if(e!==n&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var y=e.children,v=[],m=0;me&&(e=i.height)}this.height=e+1},t.prototype.getNodeById=function(t){if(this.getId()===t)return this;for(var e=0,n=this.children,i=n.length;e=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},t.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},t.prototype.getModel=function(t){if(!(this.dataIndex<0))return this.hostTree.data.getItemModel(this.dataIndex).getModel(t)},t.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},t.prototype.setVisual=function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},t.prototype.getVisual=function(t){return this.hostTree.data.getItemVisual(this.dataIndex,t)},t.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},t.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},t.prototype.getChildIndex=function(){if(this.parentNode){for(var t=this.parentNode.children,e=0;e=0){var i=n.getData().tree.root,r=t.targetNode;if(X(r)&&(r=i.getNodeById(r)),r&&i.contains(r))return{node:r};var o=t.targetNodeId;if(null!=o&&(r=i.getNodeById(o)))return{node:r}}}function AC(t){for(var e=[];t;)(t=t.parentNode)&&e.push(t);return e.reverse()}function kC(t,e){return P(AC(t),e)>=0}function LC(t,e){for(var n=[];t;){var i=t.dataIndex;n.push({name:t.name,dataIndex:i,value:e.getRawValue(i)}),t=t.parentNode}return n.reverse(),n}var PC=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.hasSymbolVisual=!0,e.ignoreStyleOnData=!0,e}return n(e,t),e.prototype.getInitialData=function(t){var e={name:t.name,children:t.data},n=t.leaves||{},i=new pc(n,this,this.ecModel),r=CC.createTree(e,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e);return n&&n.children.length&&n.isExpand||(t.parentModel=i),t}))}));var o=0;r.eachNode("preorder",(function(t){t.depth>o&&(o=t.depth)}));var a=t.expandAndCollapse&&t.initialTreeDepth>=0?t.initialTreeDepth:o;return r.root.eachNode("preorder",(function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=a})),r.data},e.prototype.getOrient=function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,e,n){for(var i=this.getData().tree,r=i.root.children[0],o=i.getNodeByDataIndex(t),a=o.getValue(),s=o.name;o&&o!==r;)s=o.parentNode.name+"."+s,o=o.parentNode;return Uf("nameValue",{name:s,value:a,noValue:isNaN(a)||null==a})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=LC(i,this),n},e.type="series.tree",e.layoutMode="box",e.defaultOption={z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderWidth:1.5},label:{show:!0},animationEasing:"linear",animationDuration:700,animationDurationUpdate:500},e}(ag);function OC(t,e){for(var n,i=[t];n=i.pop();)if(e(n),n.isExpand){var r=n.children;if(r.length)for(var o=r.length-1;o>=0;o--)i.push(r[o])}}function RC(t,e){t.eachSeriesByType("tree",(function(t){!function(t,e){var n=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=n;var i=t.get("layout"),r=0,o=0,a=null;"radial"===i?(r=2*Math.PI,o=Math.min(n.height,n.width)/2,a=eC((function(t,e){return(t.parentNode===e.parentNode?1:2)/t.depth}))):(r=n.width,o=n.height,a=eC());var s=t.getData().tree.root,l=s.children[0];if(l){!function(t){var e=t;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var n,i,r=[e];n=r.pop();)if(i=n.children,n.isExpand&&i.length)for(var o=i.length-1;o>=0;o--){var a=i[o];a.hierNode={defaultAncestor:null,ancestor:a,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},r.push(a)}}(s),function(t,e,n){for(var i,r=[t],o=[];i=r.pop();)if(o.push(i),i.isExpand){var a=i.children;if(a.length)for(var s=0;sh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)}));var p=u===h?1:a(u,h)/2,d=p-u.getLayout().x,f=0,g=0,y=0,v=0;if("radial"===i)f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),OC(l,(function(t){y=(t.getLayout().x+d)*f,v=(t.depth-1)*g;var e=nC(y,v);t.setLayout({x:e.x,y:e.y,rawX:y,rawY:v},!0)}));else{var m=t.getOrient();"RL"===m||"LR"===m?(g=o/(h.getLayout().x+p+d),f=r/(c.depth-1||1),OC(l,(function(t){v=(t.getLayout().x+d)*g,y="LR"===m?(t.depth-1)*f:r-(t.depth-1)*f,t.setLayout({x:y,y:v},!0)}))):"TB"!==m&&"BT"!==m||(f=r/(h.getLayout().x+p+d),g=o/(c.depth-1||1),OC(l,(function(t){y=(t.getLayout().x+d)*f,v="TB"===m?(t.depth-1)*g:o-(t.depth-1)*g,t.setLayout({x:y,y:v},!0)})))}}}(t,e)}))}function NC(t){t.eachSeriesByType("tree",(function(t){var e=t.getData();e.tree.eachNode((function(t){var n=t.getModel().getModel("itemStyle").getItemStyle();A(e.ensureUniqueItemVisual(t.dataIndex,"style"),n)}))}))}var EC=["treemapZoomToNode","treemapRender","treemapMove"];function zC(t){var e=t.getData().tree,n={};e.eachNode((function(e){for(var i=e;i&&i.depth>1;)i=i.parentNode;var r=td(t.ecModel,i.name||i.dataIndex+"",n);e.setVisual("decal",r)}))}var VC=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.preventUsingHoverLayer=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};BC(n);var i=t.levels||[],r=this.designatedVisualItemStyle={},o=new pc({itemStyle:r},this,e),a=z((i=t.levels=function(t,e){var n,i,r=ho(e.get("color")),o=ho(e.get(["aria","decal","decals"]));if(!r)return;E(t=t||[],(function(t){var e=new pc(t),r=e.get("color"),o=e.get("decal");(e.get(["itemStyle","color"])||r&&"none"!==r)&&(n=!0),(e.get(["itemStyle","decal"])||o&&"none"!==o)&&(i=!0)}));var a=t[0]||(t[0]={});n||(a.color=r.slice());!i&&o&&(a.decal=o.slice());return t}(i,e))||[],(function(t){return new pc(t,o,e)}),this),s=CC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=s.getNodeByDataIndex(e),i=n?a[n.depth]:null;return t.parentModel=i||o,t}))}));return s.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,e,n){var i=this.getData(),r=this.getRawValue(t);return Uf("nameValue",{name:i.getName(t),value:r})},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treeAncestors=LC(i,this),n.treePathInfo=n.treeAncestors,n},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},A(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=ft(),this._idIndexMapCount=0);var n=e.get(t);return null==n&&e.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){zC(this)},e.type="series.treemap",e.layoutMode="box",e.defaultOption={progressive:0,left:"center",top:"middle",width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",textStyle:{color:"#fff"}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",overflow:"truncate"},upperLabel:{show:!1,position:[0,"50%"],height:20,overflow:"truncate",verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],overflow:"truncate",verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(ag);function BC(t){var e=0;E(t.children,(function(t){BC(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var FC=function(){function t(t){this.group=new Cr,t.add(this.group)}return t.prototype.render=function(t,e,n,i){var r=t.getModel("breadcrumb"),o=this.group;if(o.removeAll(),r.get("show")&&n){var a=r.getModel("itemStyle"),s=a.getModel("textStyle"),l={pos:{left:r.get("left"),right:r.get("right"),top:r.get("top"),bottom:r.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:r.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,l,s),this._renderContent(t,l,a,s,i),xp(o,l.pos,l.box)}},t.prototype._prepare=function(t,e,n){for(var i=t;i;i=i.parentNode){var r=xo(i.getModel().get("name"),""),o=n.getTextRect(r),a=Math.max(o.width+16,e.emptyItemWidth);e.totalWidth+=a+8,e.renderList.push({node:i,text:r,width:a})}},t.prototype._renderContent=function(t,e,n,i,r){for(var o,a,s,l,u,h,c,p,d,f=0,g=e.emptyItemWidth,y=t.get(["breadcrumb","height"]),v=(o=e.pos,a=e.box,l=a.width,u=a.height,h=Er(o.left,l),c=Er(o.top,u),p=Er(o.right,l),d=Er(o.bottom,u),(isNaN(h)||isNaN(parseFloat(o.left)))&&(h=0),(isNaN(p)||isNaN(parseFloat(o.right)))&&(p=l),(isNaN(c)||isNaN(parseFloat(o.top)))&&(c=0),(isNaN(d)||isNaN(parseFloat(o.bottom)))&&(d=u),s=np(s||0),{width:Math.max(p-h-s[1]-s[3],0),height:Math.max(d-c-s[0]-s[2],0)}),m=e.totalWidth,x=e.renderList,_=x.length-1;_>=0;_--){var b=x[_],w=b.node,S=b.width,M=b.text;m>v.width&&(m-=S-g,S=g,M=null);var I=new Lu({shape:{points:GC(f,0,S,y,_===x.length-1,0===_)},style:k(n.getItemStyle(),{lineJoin:"bevel"}),textContent:new As({style:{text:M,fill:i.getTextColor(),font:i.getFont()}}),textConfig:{position:"inside"},z2:1e5,onclick:H(r,w)});I.disableLabelAnimation=!0,this.group.add(I),WC(I,t,w),f+=S+8}},t.prototype.remove=function(){this.group.removeAll()},t}();function GC(t,e,n,i,r,o){var a=[[r?t:t-5,e],[t+n,e],[t+n,e+i],[r?t:t-5,e+i]];return!o&&a.splice(2,0,[t+n+5,e+i/2]),!r&&a.push([t,e+i/2]),a}function WC(t,e,n){Ws(t).eventData={componentType:"series",componentSubType:"treemap",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:n&&n.dataIndex,name:n&&n.name},treePathInfo:n&&LC(n,e)}}var HC=function(){function t(){this._storage=[],this._elExistsMap={}}return t.prototype.add=function(t,e,n,i,r){return!this._elExistsMap[t.id]&&(this._elExistsMap[t.id]=!0,this._storage.push({el:t,target:e,duration:n,delay:i,easing:r}),!0)},t.prototype.finished=function(t){return this._finishedCallback=t,this},t.prototype.start=function(){for(var t=this,e=this._storage.length,n=function(){--e<=0&&(t._storage.length=0,t._elExistsMap={},t._finishedCallback&&t._finishedCallback())},i=0,r=this._storage.length;i3||Math.abs(t.dy)>3)){var e=this.seriesModel.getData().tree.root;if(!e)return;var n=e.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var e=t.originX,n=t.originY;if("animating"!==this._state){var i=this.seriesModel.getData().tree.root;if(!i)return;var r=i.getLayout();if(!r)return;var o=new sr(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo,s=[1,0,0,1,0,0];Ei(s,s,[-(e-=a.x),-(n-=a.y)]),Vi(s,s,[t.scale,t.scale]),Ei(s,s,[e,n]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},e.prototype._initEvents=function(t){var e=this;t.on("click",(function(t){if("ready"===e._state){var n=e.seriesModel.get("nodeClick",!0);if(n){var i=e.findTarget(t.offsetX,t.offsetY);if(i){var r=i.node;if(r.getLayout().isLeafRoot)e._rootToNode(i);else if("zoomToNode"===n)e._zoomToNode(i);else if("link"===n){var o=r.hostTree.data.getItemModel(r.dataIndex),a=o.get("link",!0),s=o.get("target",!0)||"blank";a&&pp(a,s)}}}}}),this)},e.prototype._renderBreadcrumb=function(t,e,n){var i=this;n||(n=null!=t.get("leafDepth",!0)?{node:t.getViewRoot()}:this.findTarget(e.getWidth()/2,e.getHeight()/2))||(n={node:t.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new FC(this.group))).render(t,e,n.node,(function(e){"animating"!==i._state&&(kC(t.getViewRoot(),e)?i._rootToNode({node:e}):i._zoomToNode({node:e}))}))},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage={nodeGroup:[],background:[],content:[]},this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,e){var n;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},(function(i){var r=this._storage.background[i.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;n={node:i,offsetX:o[0],offsetY:o[1]}}}),this),n},e.type="treemap",e}(mg);var JC=E,QC=q,tD=-1,eD=function(){function t(e){var n=e.mappingMethod,i=e.type,r=this.option=T(e);this.type=i,this.mappingMethod=n,this._normalizeData=cD[n];var o=t.visualHandlers[i];this.applyVisual=o.applyVisual,this.getColorMapper=o.getColorMapper,this._normalizedToVisual=o._normalizedToVisual[n],"piecewise"===n?(nD(r),function(t){var e=t.pieceList;t.hasSpecialVisual=!1,E(e,(function(e,n){e.originIndex=n,null!=e.visual&&(t.hasSpecialVisual=!0)}))}(r)):"category"===n?r.categories?function(t){var e=t.categories,n=t.categoryMap={},i=t.visual;if(JC(e,(function(t,e){n[t]=e})),!Y(i)){var r=[];q(i)?JC(i,(function(t,e){var i=n[e];r[null!=i?i:tD]=t})):r[-1]=i,i=hD(t,r)}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}(r):nD(r,!0):(lt("linear"!==n||r.dataExtent),nD(r))}return t.prototype.mapValueToVisual=function(t){var e=this._normalizeData(t);return this._normalizedToVisual(e,t)},t.prototype.getNormalizer=function(){return W(this._normalizeData,this)},t.listVisualTypes=function(){return G(t.visualHandlers)},t.isValidType=function(e){return t.visualHandlers.hasOwnProperty(e)},t.eachVisual=function(t,e,n){q(t)?E(t,e,n):e.call(n,t)},t.mapVisual=function(e,n,i){var r,o=Y(e)?[]:q(e)?{}:(r=!0,null);return t.eachVisual(e,(function(t,e){var a=n.call(i,t,e);r?o=a:o[e]=a})),o},t.retrieveVisuals=function(e){var n,i={};return e&&JC(t.visualHandlers,(function(t,r){e.hasOwnProperty(r)&&(i[r]=e[r],n=!0)})),n?i:null},t.prepareVisualTypes=function(t){if(Y(t))t=t.slice();else{if(!QC(t))return[];var e=[];JC(t,(function(t,n){e.push(n)})),t=e}return t.sort((function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1})),t},t.dependsOn=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},t.findPieceIndex=function(t,e,n){for(var i,r=1/0,o=0,a=e.length;ou[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:a.name,dataExtent:u,visual:a.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var p=new eD(c);return dD(p).drColorMappingBy=h,p}(0,r,o,0,u,d);E(d,(function(t,e){if(t.depth>=n.length||t===n[t.depth]){var o=function(t,e,n,i,r,o){var a=A({},e);if(r){var s=r.type,l="color"===s&&dD(r).drColorMappingBy,u="index"===l?i:"id"===l?o.mapIdToIndex(n.getId()):n.getValue(t.get("visualDimension"));a[s]=r.mapValueToVisual(u)}return a}(r,u,t,e,f,i);gD(t,o,n,i)}}))}else s=yD(u),h.fill=s}}function yD(t){var e=vD(t,"color");if(e){var n=vD(t,"colorAlpha"),i=vD(t,"colorSaturation");return i&&(e=Dn(e,null,null,i)),n&&(e=An(e,n)),e}}function vD(t,e){var n=t[e];if(null!=n&&"none"!==n)return n}function mD(t,e){var n=t.get(e);return Y(n)&&n.length?{name:e,range:n}:null}var xD=Math.max,_D=Math.min,bD=it,wD=E,SD=["itemStyle","borderWidth"],MD=["itemStyle","gapWidth"],ID=["upperLabel","show"],TD=["upperLabel","height"],CD={seriesType:"treemap",reset:function(t,e,n,i){var r=n.getWidth(),o=n.getHeight(),a=t.option,s=mp(t.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()}),l=a.size||[],u=Er(bD(s.width,l[0]),r),h=Er(bD(s.height,l[1]),o),c=i&&i.type,p=DC(i,["treemapZoomToNode","treemapRootToNode"],t),d="treemapRender"===c||"treemapMove"===c?i.rootRect:null,f=t.getViewRoot(),g=AC(f);if("treemapMove"!==c){var y="treemapZoomToNode"===c?function(t,e,n,i,r){var o,a=(e||{}).node,s=[i,r];if(!a||a===n)return s;var l=i*r,u=l*t.option.zoomToNodeRatio;for(;o=a.parentNode;){for(var h=0,c=o.children,p=0,d=c.length;pYr&&(u=Yr),a=o}ua[1]&&(a[1]=e)}))):a=[NaN,NaN];return{sum:i,dataExtent:a}}(e,a,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,n,i,r){if(!i)return n;for(var o=t.get("visibleMin"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r["asc"===i?a-l-1:l].getValue();u/n*ei&&(i=a));var l=t.area*t.area,u=e*e*n;return l?xD(u*i/l,l/(u*r)):1/0}function kD(t,e,n,i,r){var o=e===n.width?0:1,a=1-o,s=["x","y"],l=["width","height"],u=n[s[o]],h=e?t.area/e:0;(r||h>n[l[a]])&&(h=n[l[a]]);for(var c=0,p=t.length;ci&&(i=e);var o=i%2?i+2:i+3;r=[];for(var a=0;a0&&(m[0]=-m[0],m[1]=-m[1]);var _=v[0]<0?-1:1;if("start"!==i.__position&&"end"!==i.__position){var b=-Math.atan2(v[1],v[0]);u[0].8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";break;case"start":i.x=-h[0]*f+l[0],i.y=-h[1]*g+l[1],c=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";break;case"insideStartTop":case"insideStart":case"insideStartBottom":i.x=f*_+l[0],i.y=l[1]+w,c=v[0]<0?"right":"left",i.originX=-f*_,i.originY=-w;break;case"insideMiddleTop":case"insideMiddle":case"insideMiddleBottom":case"middle":i.x=x[0],i.y=x[1]+w,c="center",i.originY=-w;break;case"insideEndTop":case"insideEnd":case"insideEndBottom":i.x=-f*_+u[0],i.y=u[1]+w,c=v[0]>=0?"right":"left",i.originX=f*_,i.originY=-w}i.scaleX=i.scaleY=r,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||c})}}}function S(t,e){var n=t.__specifiedRotation;if(null==n){var i=a.tangentAt(e);t.attr("rotation",(1===e?-1:1)*Math.PI/2-Math.atan2(i[1],i[0]))}else t.attr("rotation",n)}},e}(Cr),dA=function(){function t(t){this.group=new Cr,this._LineCtor=t||pA}return t.prototype.updateData=function(t){var e=this;this._progressiveEls=null;var n=this,i=n.group,r=n._lineData;n._lineData=t,r||i.removeAll();var o=fA(t);t.diff(r).add((function(n){e._doAdd(t,n,o)})).update((function(n,i){e._doUpdate(r,t,i,n,o)})).remove((function(t){i.remove(r.getItemGraphicEl(t))})).execute()},t.prototype.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl((function(e,n){e.updateLayout(t,n)}),this)},t.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=fA(t),this._lineData=null,this.group.removeAll()},t.prototype.incrementalUpdate=function(t,e){function n(t){t.isGroup||function(t){return t.animators&&t.animators.length>0}(t)||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}this._progressiveEls=[];for(var i=t.start;i=0?i+=u:i-=u:f>=0?i-=u:i+=u}return i}function MA(t,e){var n=[],i=Qe,r=[[],[],[]],o=[[],[]],a=[];e/=2,t.eachEdge((function(t,s){var l=t.getLayout(),u=t.getVisual("fromSymbol"),h=t.getVisual("toSymbol");l.__original||(l.__original=[Mt(l[0]),Mt(l[1])],l[2]&&l.__original.push(Mt(l[2])));var c=l.__original;if(null!=l[2]){if(St(r[0],c[0]),St(r[1],c[2]),St(r[2],c[1]),u&&"none"!==u){var p=jD(t.node1),d=SA(r,c[0],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[0][0]=n[3],r[1][0]=n[4],i(r[0][1],r[1][1],r[2][1],d,n),r[0][1]=n[3],r[1][1]=n[4]}if(h&&"none"!==h){p=jD(t.node2),d=SA(r,c[1],p*e);i(r[0][0],r[1][0],r[2][0],d,n),r[1][0]=n[1],r[2][0]=n[2],i(r[0][1],r[1][1],r[2][1],d,n),r[1][1]=n[1],r[2][1]=n[2]}St(l[0],r[0]),St(l[1],r[2]),St(l[2],r[1])}else{if(St(o[0],c[0]),St(o[1],c[1]),Dt(a,o[1],o[0]),Rt(a,a),u&&"none"!==u){p=jD(t.node1);Ct(o[0],o[0],a,p*e)}if(h&&"none"!==h){p=jD(t.node2);Ct(o[1],o[1],a,-p*e)}St(l[0],o[0]),St(l[1],o[1])}}))}function IA(t){return"view"===t.type}var TA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){var n=new Zw,i=new dA,r=this.group;this._controller=new DI(e.getZr()),this._controllerHost={target:r},r.add(n.group),r.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,e,n){var i=this,r=t.coordinateSystem;this._model=t;var o=this._symbolDraw,a=this._lineDraw,s=this.group;if(IA(r)){var l={x:r.x,y:r.y,scaleX:r.scaleX,scaleY:r.scaleY};this._firstRender?s.attr(l):ih(s,l,t)}MA(t.getGraph(),ZD(t));var u=t.getData();o.updateData(u);var h=t.getEdgeData();a.updateData(h),this._updateNodeAndLinkScale(),this._updateController(t,e,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,p=t.get(["force","layoutAnimation"]);c&&this._startForceLayoutIteration(c,p),u.graph.eachNode((function(t){var e=t.dataIndex,n=t.getGraphicEl(),r=t.getModel();if(n){n.off("drag").off("dragend");var o=r.get("draggable");o&&n.on("drag",(function(){c&&(c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,p),c.setFixed(e),u.setItemLayout(e,[n.x,n.y]))})).on("dragend",(function(){c&&c.setUnfixed(e)})),n.setDraggable(o&&!!c),"adjacency"===r.get(["emphasis","focus"])&&(Ws(n).focus=t.getAdjacentDataIndices())}})),u.graph.eachEdge((function(t){var e=t.getGraphicEl(),n=t.getModel().get(["emphasis","focus"]);e&&"adjacency"===n&&(Ws(e).focus={edge:[t.dataIndex],node:[t.node1.dataIndex,t.node2.dataIndex]})}));var d="circular"===t.get("layout")&&t.get(["circular","rotateLabel"]),f=u.getLayout("cx"),g=u.getLayout("cy");u.eachItemGraphicEl((function(t,e){var n=u.getItemModel(e).get(["label","rotate"])||0,i=t.getSymbolPath();if(d){var r=u.getItemLayout(e),o=Math.atan2(r[1]-g,r[0]-f);o<0&&(o=2*Math.PI+o);var a=r[0]=0&&t.call(e,n[r],r)},t.prototype.eachEdge=function(t,e){for(var n=this.edges,i=n.length,r=0;r=0&&n[r].node1.dataIndex>=0&&n[r].node2.dataIndex>=0&&t.call(e,n[r],r)},t.prototype.breadthFirstTraverse=function(t,e,n,i){if(e instanceof AA||(e=this._nodesMap[CA(e)]),e){for(var r="out"===n?"outEdges":"in"===n?"inEdges":"edges",o=0;o=0&&n.node2.dataIndex>=0}));for(r=0,o=i.length;r=0&&this[t][e].setItemVisual(this.dataIndex,n,i)},getVisual:function(n){return this[t][e].getItemVisual(this.dataIndex,n)},setLayout:function(n,i){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,n,i)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}}function PA(t,e,n,i,r){for(var o=new DA(i),a=0;a "+p)),u++)}var d,f=n.get("coordinateSystem");if("cartesian2d"===f||"polar"===f)d=nx(t,n);else{var g=ud.get(f),y=g&&g.dimensions||[];P(y,"value")<0&&y.concat(["value"]);var v=jm(t,{coordDimensions:y,encodeDefine:n.getEncode()}).dimensions;(d=new Zm(v,n)).initData(t)}var m=new Zm(["value"],n);return m.initData(l,s),r&&r(d,m),mC({mainData:d,struct:o,structAttr:"graph",datas:{node:d,edge:m},datasAttr:{node:"data",edge:"edgeData"}}),o.update(),o}R(AA,LA("hostGraph","data")),R(kA,LA("hostGraph","edgeData"));var OA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments);var n=this;function i(){return n._categoriesData}this.legendVisualProvider=new lM(i,i),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(e){t.prototype.mergeDefaultAndTheme.apply(this,arguments),co(e,"edgeLabel",["show"])},e.prototype.getInitialData=function(t,e){var n,i=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;if(r&&i){VD(n=this)&&(n.__curvenessList=[],n.__edgeMap={},BD(n));var a=PA(r,i,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t){var e=o._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t}));var n=pc.prototype.getModel;function i(t,e){var i=n.call(this,t,e);return i.resolveParentPath=r,i}function r(t){if(t&&("label"===t[0]||"label"===t[1])){var e=t.slice();return"label"===t[0]?e[0]="edgeLabel":"label"===t[1]&&(e[1]="edgeLabel"),e}return t}e.wrapMethod("getItemModel",(function(t){return t.resolveParentPath=r,t.getModel=i,t}))}));return E(a.edges,(function(t){!function(t,e,n,i){if(VD(n)){var r=FD(t,e,n),o=n.__edgeMap,a=o[GD(r)];o[r]&&!a?o[r].isForward=!0:a&&o[r]&&(a.isForward=!0,o[r].isForward=!1),o[r]=o[r]||[],o[r].push(i)}}(t.node1,t.node2,this,t.dataIndex)}),this),a.data}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,e,n){if("edge"===n){var i=this.getData(),r=this.getDataParams(t,n),o=i.graph.getEdgeByIndex(t),a=i.getName(o.node1.dataIndex),s=i.getName(o.node2.dataIndex),l=[];return null!=a&&l.push(a),null!=s&&l.push(s),Uf("nameValue",{name:l.join(" > "),value:r.value,noValue:null==r.value})}return ig({series:this,dataIndex:t,multipleSeries:e})},e.prototype._updateCategoriesData=function(){var t=z(this.option.categories||[],(function(t){return null!=t.value?t:A({value:0},t)})),e=new Zm(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray((function(t){return e.getItemModel(t)}))},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return t.prototype.isAnimationEnabled.call(this)&&!("force"===this.get("layout")&&this.get(["force","layoutAnimation"]))},e.type="series.graph",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={z:2,coordinateSystem:"view",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(ag),RA={type:"graphRoam",event:"graphRoam",update:"none"};var NA=function(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0},EA=function(t){function e(e){var n=t.call(this,e)||this;return n.type="pointer",n}return n(e,t),e.prototype.getDefaultShape=function(){return new NA},e.prototype.buildPath=function(t,e){var n=Math.cos,i=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-n(a)*o*(o>=r/3?1:2),l=e.y-i(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+n(a)*o,e.y+i(a)*o),t.lineTo(e.x+n(e.angle)*r,e.y+i(e.angle)*r),t.lineTo(e.x-n(a)*o,e.y-i(a)*o),t.lineTo(s,l)},e}(fs);function zA(t,e){var n=null==t?"":t+"";return e&&(X(e)?n=e.replace("{value}",n):U(e)&&(n=e(t))),n}var VA=2*Math.PI,BA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeAll();var i=t.get(["axisLine","lineStyle","color"]),r=function(t,e){var n=t.get("center"),i=e.getWidth(),r=e.getHeight(),o=Math.min(i,r);return{cx:Er(n[0],e.getWidth()),cy:Er(n[1],e.getHeight()),r:Er(t.get("radius"),o/2)}}(t,n);this._renderMain(t,e,n,i,r),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,e,n,i,r){for(var o=this.group,a=t.get("clockwise"),s=-t.get("startAngle")/180*Math.PI,l=-t.get("endAngle")/180*Math.PI,u=t.getModel("axisLine"),h=u.get("roundCap")?TS:Tu,c=u.get("show"),p=u.getModel("lineStyle"),d=p.get("width"),f=(l-s)%VA||l===s?(l-s)%VA:VA,g=s,y=0;c&&y=t&&(0===e?0:i[e-1][0]).8?"bottom":"middle",align:u<-.4?"left":u>.4?"right":"center"},{inheritColor:R}),silent:!0}))}if(m.get("show")&&k!==_){P=(P=m.get("distance"))?P+l:l;for(var N=0;N<=b;N++){u=Math.cos(M),h=Math.sin(M);var E=new Eu({shape:{x1:u*(f-P)+p,y1:h*(f-P)+d,x2:u*(f-S-P)+p,y2:h*(f-S-P)+d},silent:!0,style:D});"auto"===D.stroke&&E.setStyle({stroke:i((k+N/b)/_)}),c.add(E),M+=T}M-=T}else M+=I}},e.prototype._renderPointer=function(t,e,n,i,r,o,a,s,l){var u=this.group,h=this._data,c=this._progressEls,p=[],d=t.get(["pointer","show"]),f=t.getModel("progress"),g=f.get("show"),y=t.getData(),v=y.mapDimension("value"),m=+t.get("min"),x=+t.get("max"),_=[m,x],b=[o,a];function w(e,n){var i,o=y.getItemModel(e).getModel("pointer"),a=Er(o.get("width"),r.r),s=Er(o.get("length"),r.r),l=t.get(["pointer","icon"]),u=o.get("offsetCenter"),h=Er(u[0],r.r),c=Er(u[1],r.r),p=o.get("keepAspect");return(i=l?ky(l,h-a/2,c-s,a,s,null,p):new EA({shape:{angle:-Math.PI/2,width:a,r:s,x:h,y:c}})).rotation=-(n+Math.PI/2),i.x=r.cx,i.y=r.cy,i}function S(t,e){var n=f.get("roundCap")?TS:Tu,i=f.get("overlap"),a=i?f.get("width"):l/y.count(),u=i?r.r-a:r.r-(t+1)*a,h=i?r.r:r.r-t*a,c=new n({shape:{startAngle:o,endAngle:e,cx:r.cx,cy:r.cy,clockwise:s,r0:u,r:h}});return i&&(c.z2=x-y.get(v,t)%x),c}(g||d)&&(y.diff(h).add((function(e){var n=y.get(v,e);if(d){var i=w(e,o);rh(i,{rotation:-((isNaN(+n)?b[0]:Nr(n,_,b,!0))+Math.PI/2)},t),u.add(i),y.setItemGraphicEl(e,i)}if(g){var r=S(e,o),a=f.get("clip");rh(r,{shape:{endAngle:Nr(n,_,b,a)}},t),u.add(r),Hs(t.seriesIndex,y.dataType,e,r),p[e]=r}})).update((function(e,n){var i=y.get(v,e);if(d){var r=h.getItemGraphicEl(n),a=r?r.rotation:o,s=w(e,a);s.rotation=a,ih(s,{rotation:-((isNaN(+i)?b[0]:Nr(i,_,b,!0))+Math.PI/2)},t),u.add(s),y.setItemGraphicEl(e,s)}if(g){var l=c[n],m=S(e,l?l.shape.endAngle:o),x=f.get("clip");ih(m,{shape:{endAngle:Nr(i,_,b,x)}},t),u.add(m),Hs(t.seriesIndex,y.dataType,e,m),p[e]=m}})).execute(),y.each((function(t){var e=y.getItemModel(t),n=e.getModel("emphasis"),r=n.get("focus"),o=n.get("blurScope"),a=n.get("disabled");if(d){var s=y.getItemGraphicEl(t),l=y.getItemVisual(t,"style"),u=l.fill;if(s instanceof xs){var h=s.style;s.useStyle(A({image:h.image,x:h.x,y:h.y,width:h.width,height:h.height},l))}else s.useStyle(l),"pointer"!==s.type&&s.setColor(u);s.setStyle(e.getModel(["pointer","itemStyle"]).getItemStyle()),"auto"===s.style.fill&&s.setStyle("fill",i(Nr(y.get(v,t),_,[0,1],!0))),s.z2EmphasisLift=0,zl(s,e),Ol(s,r,o,a)}if(g){var c=p[t];c.useStyle(y.getItemVisual(t,"style")),c.setStyle(e.getModel(["progress","itemStyle"]).getItemStyle()),c.z2EmphasisLift=0,zl(c,e),Ol(c,r,o,a)}})),this._progressEls=p)},e.prototype._renderAnchor=function(t,e){var n=t.getModel("anchor");if(n.get("show")){var i=n.get("size"),r=n.get("icon"),o=n.get("offsetCenter"),a=n.get("keepAspect"),s=ky(r,e.cx-i/2+Er(o[0],e.r),e.cy-i/2+Er(o[1],e.r),i,i,null,a);s.z2=n.get("showAbove")?1:0,s.setStyle(n.getModel("itemStyle").getItemStyle()),this.group.add(s)}},e.prototype._renderTitleAndDetail=function(t,e,n,i,r){var o=this,a=t.getData(),s=a.mapDimension("value"),l=+t.get("min"),u=+t.get("max"),h=new Cr,c=[],p=[],d=t.isAnimationEnabled(),f=t.get(["pointer","showAbove"]);a.diff(this._data).add((function(t){c[t]=new As({silent:!0}),p[t]=new As({silent:!0})})).update((function(t,e){c[t]=o._titleEls[e],p[t]=o._detailEls[e]})).execute(),a.each((function(e){var n=a.getItemModel(e),o=a.get(s,e),g=new Cr,y=i(Nr(o,[l,u],[0,1],!0)),v=n.getModel("title");if(v.get("show")){var m=v.get("offsetCenter"),x=r.cx+Er(m[0],r.r),_=r.cy+Er(m[1],r.r);(D=c[e]).attr({z2:f?0:2,style:Yh(v,{x:x,y:_,text:a.getName(e),align:"center",verticalAlign:"middle"},{inheritColor:y})}),g.add(D)}var b=n.getModel("detail");if(b.get("show")){var w=b.get("offsetCenter"),S=r.cx+Er(w[0],r.r),M=r.cy+Er(w[1],r.r),I=Er(b.get("width"),r.r),T=Er(b.get("height"),r.r),C=t.get(["progress","show"])?a.getItemVisual(e,"style").fill:y,D=p[e],A=b.get("formatter");D.attr({z2:f?0:2,style:Yh(b,{x:S,y:M,text:zA(o,A),width:isNaN(I)?null:I,height:isNaN(T)?null:T,align:"center",verticalAlign:"middle"},{inheritColor:C})}),Jh(D,{normal:b},o,(function(t){return zA(t,A)})),d&&Qh(D,e,a,t,{getFormattedLabel:function(t,e,n,i,r,a){return zA(a?a.interpolatedValue:o,A)}}),g.add(D)}h.add(g)})),this.group.add(h),this._titleEls=c,this._detailEls=p},e.type="gauge",e}(mg),FA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="itemStyle",n}return n(e,t),e.prototype.getInitialData=function(t,e){return sM(this,["value"])},e.type="series.gauge",e.defaultOption={z:2,colorBy:"data",center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,"#E6EBF8"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:"#63677A",width:3,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:"#63677A",width:1,type:"solid"}},axisLabel:{show:!0,distance:15,color:"#464646",fontSize:12},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:"60%",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:"circle",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:"#fff",borderWidth:0,borderColor:"#5470c6"}},title:{show:!0,offsetCenter:[0,"20%"],color:"#464646",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"#464646",fontSize:30,fontWeight:"bold",lineHeight:30,valueAnimation:!1}},e}(ag);var GA=["itemStyle","opacity"],WA=function(t){function e(e,n){var i=t.call(this)||this,r=i,o=new Ou,a=new As;return r.setTextContent(a),i.setTextGuideLine(o),i.updateData(e,n,!0),i}return n(e,t),e.prototype.updateData=function(t,e,n){var i=this,r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e),s=o.getModel("emphasis"),l=o.get(GA);l=null==l?1:l,n||uh(i),i.useStyle(t.getItemVisual(e,"style")),i.style.lineJoin="round",n?(i.setShape({points:a.points}),i.style.opacity=0,rh(i,{style:{opacity:l}},r,e)):ih(i,{style:{opacity:l},shape:{points:a.points}},r,e),zl(i,o),this._updateLabel(t,e),Ol(this,s.get("focus"),s.get("blurScope"),s.get("disabled"))},e.prototype._updateLabel=function(t,e){var n=this,i=this.getTextGuideLine(),r=n.getTextContent(),o=t.hostModel,a=t.getItemModel(e),s=t.getItemLayout(e).label,l=t.getItemVisual(e,"style"),u=l.fill;Wh(r,Hh(a),{labelFetcher:t.hostModel,labelDataIndex:e,defaultOpacity:l.opacity,defaultText:t.getName(e)},{normal:{align:s.textAlign,verticalAlign:s.verticalAlign}}),n.setTextConfig({local:!0,inside:!!s.inside,insideStroke:u,outsideFill:u});var h=s.linePoints;i.setShape({points:h}),n.textGuideLineConfig={anchor:h?new Ji(h[0][0],h[0][1]):null},ih(r,{style:{x:s.x,y:s.y}},o,e),r.attr({rotation:s.rotation,originX:s.x,originY:s.y,z2:10}),cb(n,pb(a),{stroke:u})},e}(Lu),HA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreLabelLineUpdate=!0,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this._data,o=this.group;i.diff(r).add((function(t){var e=new WA(i,t);i.setItemGraphicEl(t,e),o.add(e)})).update((function(t,e){var n=r.getItemGraphicEl(e);n.updateData(i,t),o.add(n),i.setItemGraphicEl(t,n)})).remove((function(e){lh(r.getItemGraphicEl(e),t,e)})).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type="funnel",e}(mg),YA=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e){t.prototype.init.apply(this,arguments),this.legendVisualProvider=new lM(W(this.getData,this),W(this.getRawData,this)),this._defaultLabelLine(e)},e.prototype.getInitialData=function(t,e){return sM(this,{coordDimensions:["value"],encodeDefaulter:H(Hp,this)})},e.prototype._defaultLabelLine=function(t){co(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(e){var n=this.getData(),i=t.prototype.getDataParams.call(this,e),r=n.mapDimension("value"),o=n.getSum(r);return i.percent=o?+(n.get(r,e)/o*100).toFixed(2):0,i.$vars.push("percent"),i},e.type="series.funnel",e.defaultOption={z:2,legendHoverLink:!0,colorBy:"data",left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",orient:"vertical",gap:0,funnelAlign:"center",label:{show:!0,position:"outer"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:"#fff",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:"#212121"}}},e}(ag);function UA(t,e){t.eachSeriesByType("funnel",(function(t){var n=t.getData(),i=n.mapDimension("value"),r=t.get("sort"),o=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e),a=t.get("orient"),s=o.width,l=o.height,u=function(t,e){for(var n=t.mapDimension("value"),i=t.mapArray(n,(function(t){return t})),r=[],o="ascending"===e,a=0,s=t.count();a5)return;var i=this._model.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]);"none"!==i.behavior&&this._dispatchExpand({axisExpandWindow:i.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(t){if(!this._mouseDownPoint&&rk(this,"mousemove")){var e=this._model,n=e.coordinateSystem.getSlidedAxisExpandWindow([t.offsetX,t.offsetY]),i=n.behavior;"jump"===i&&this._throttledDispatchExpand.debounceNextCall(e.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===i?null:{axisExpandWindow:n.axisExpandWindow,animation:"jump"===i?null:{duration:0}})}}};function rk(t,e){var n=t._model;return n.get("axisExpandable")&&n.get("axisExpandTriggerOn")===e}var ok=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){t.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var e=this.option;t&&C(e,t,!0),this._initDimensions()},e.prototype.contains=function(t,e){var n=t.get("parallelIndex");return null!=n&&e.getComponent("parallel",n)===this},e.prototype.setAxisExpand=function(t){E(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],(function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])}),this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[];E(B(this.ecModel.queryComponents({mainType:"parallelAxis"}),(function(t){return(t.get("parallelIndex")||0)===this.componentIndex}),this),(function(n){t.push("dim"+n.get("dim")),e.push(n.componentIndex)}))},e.type="parallel",e.dependencies=["parallelAxis"],e.layoutMode="box",e.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},e}(Ip),ak=function(t){function e(e,n,i,r,o){var a=t.call(this,e,n,i)||this;return a.type=r||"value",a.axisIndex=o,a}return n(e,t),e.prototype.isHorizontal=function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")},e}(G_);function sk(t,e,n,i,r,o){t=t||0;var a=n[1]-n[0];if(null!=r&&(r=uk(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i){var s=Math.abs(e[1]-e[0]);s=uk(s,[0,a]),r=o=uk(s,[r,o]),i=0}e[0]=uk(e[0],n),e[1]=uk(e[1],n);var l=lk(e,i);e[i]+=t;var u,h=r||0,c=n.slice();return l.sign<0?c[0]+=h:c[1]-=h,e[i]=uk(e[i],c),u=lk(e,i),null!=r&&(u.sign!==l.sign||u.spano&&(e[1-i]=e[i]+u.sign*o),e}function lk(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function uk(t,e){return Math.min(null!=e[1]?e[1]:1/0,Math.max(null!=e[0]?e[0]:-1/0,t))}var hk=E,ck=Math.min,pk=Math.max,dk=Math.floor,fk=Math.ceil,gk=zr,yk=Math.PI,vk=function(){function t(t,e,n){this.type="parallel",this._axesMap=ft(),this._axesLayout={},this.dimensions=t.dimensions,this._model=t,this._init(t,e,n)}return t.prototype._init=function(t,e,n){var i=t.dimensions,r=t.parallelAxisIndex;hk(i,(function(t,n){var i=r[n],o=e.getComponent("parallelAxis",i),a=this._axesMap.set(t,new ak(t,i_(o),[0,0],o.get("type"),i)),s="category"===a.type;a.onBand=s&&o.get("boundaryGap"),a.inverse=o.get("inverse"),o.axis=a,a.model=o,a.coordinateSystem=o.coordinateSystem=this}),this)},t.prototype.update=function(t,e){this._updateAxesFromSeries(this._model,t)},t.prototype.containPoint=function(t){var e=this._makeLayoutInfo(),n=e.axisBase,i=e.layoutBase,r=e.pixelDimIndex,o=t[1-r],a=t[r];return o>=n&&o<=n+e.axisLength&&a>=i&&a<=i+e.layoutLength},t.prototype.getModel=function(){return this._model},t.prototype._updateAxesFromSeries=function(t,e){e.eachSeries((function(n){if(t.contains(n,e)){var i=n.getData();hk(this.dimensions,(function(t){var e=this._axesMap.get(t);e.scale.unionExtentFromData(i,i.mapDimension(t)),n_(e.scale,e.model)}),this)}}),this)},t.prototype.resize=function(t,e){this._rect=mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes()},t.prototype.getRect=function(){return this._rect},t.prototype._makeLayoutInfo=function(){var t,e=this._model,n=this._rect,i=["x","y"],r=["width","height"],o=e.get("layout"),a="horizontal"===o?0:1,s=n[r[a]],l=[0,s],u=this.dimensions.length,h=mk(e.get("axisExpandWidth"),l),c=mk(e.get("axisExpandCount")||0,[0,u]),p=e.get("axisExpandable")&&u>3&&u>c&&c>1&&h>0&&s>0,d=e.get("axisExpandWindow");d?(t=mk(d[1]-d[0],l),d[1]=d[0]+t):(t=mk(h*(c-1),l),(d=[h*(e.get("axisExpandCenter")||dk(u/2))-t/2])[1]=d[0]+t);var f=(s-t)/(u-c);f<3&&(f=0);var g=[dk(gk(d[0]/h,1))+1,fk(gk(d[1]/h,1))-1],y=f/h*d[0];return{layout:o,pixelDimIndex:a,layoutBase:n[i[a]],layoutLength:s,axisBase:n[i[1-a]],axisLength:n[r[1-a]],axisExpandable:p,axisExpandWidth:h,axisCollapseWidth:f,axisExpandWindow:d,axisCount:u,winInnerIndices:g,axisExpandWindow0Pos:y}},t.prototype._layoutAxes=function(){var t=this._rect,e=this._axesMap,n=this.dimensions,i=this._makeLayoutInfo(),r=i.layout;e.each((function(t){var e=[0,i.axisLength],n=t.inverse?1:0;t.setExtent(e[n],e[1-n])})),hk(n,(function(e,n){var o=(i.axisExpandable?_k:xk)(n,i),a={horizontal:{x:o.position,y:i.axisLength},vertical:{x:0,y:o.position}},s={horizontal:yk/2,vertical:0},l=[a[r].x+t.x,a[r].y+t.y],u=s[r],h=[1,0,0,1,0,0];zi(h,h,u),Ei(h,h,l),this._axesLayout[e]={position:l,rotation:u,transform:h,axisNameAvailableWidth:o.axisNameAvailableWidth,axisLabelShow:o.axisLabelShow,nameTruncateMaxWidth:o.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}}),this)},t.prototype.getAxis=function(t){return this._axesMap.get(t)},t.prototype.dataToPoint=function(t,e){return this.axisCoordToPoint(this._axesMap.get(e).dataToCoord(t),e)},t.prototype.eachActiveState=function(t,e,n,i){null==n&&(n=0),null==i&&(i=t.count());var r=this._axesMap,o=this.dimensions,a=[],s=[];E(o,(function(e){a.push(t.mapDimension(e)),s.push(r.get(e).model)}));for(var l=this.hasAxisBrushed(),u=n;ur*(1-h[0])?(l="jump",a=s-r*(1-h[2])):(a=s-r*h[1])>=0&&(a=s-r*(1-h[1]))<=0&&(a=0),(a*=e.axisExpandWidth/u)?sk(a,i,o,"all"):l="none";else{var p=i[1]-i[0];(i=[pk(0,o[1]*s/p-p/2)])[1]=ck(o[1],i[0]+p),i[0]=i[1]-p}return{axisExpandWindow:i,behavior:l}},t}();function mk(t,e){return ck(pk(t,e[0]),e[1])}function xk(t,e){var n=e.layoutLength/(e.axisCount-1);return{position:n*t,axisNameAvailableWidth:n,axisLabelShow:!0}}function _k(t,e){var n,i,r=e.layoutLength,o=e.axisExpandWidth,a=e.axisCount,s=e.axisCollapseWidth,l=e.winInnerIndices,u=s,h=!1;return t=0;n--)Vr(e[n])},e.prototype.getActiveState=function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(+t))return"inactive";if(1===e.length){var n=e[0];if(n[0]<=t&&t<=n[1])return"active"}else for(var i=0,r=e.length;i6}(t)||o){if(a&&!o){"single"===s.brushMode&&Gk(t);var l=T(s);l.brushType=rL(l.brushType,a),l.panelId=a===Sk?null:a.panelId,o=t._creatingCover=Ok(t,l),t._covers.push(o)}if(o){var u=sL[rL(t._brushType,a)];o.__brushOption.range=u.getCreatingRange(tL(t,o,t._track)),i&&(Rk(t,o),u.updateCommon(t,o)),Nk(t,o),r={isEnd:i}}}else i&&"single"===s.brushMode&&s.removeOnClick&&Bk(t,e,n)&&Gk(t)&&(r={isEnd:i,removeOnClick:!0});return r}function rL(t,e){return"auto"===t?e.defaultBrushType:t}var oL={mousedown:function(t){if(this._dragging)aL(this,t);else if(!t.target||!t.target.draggable){eL(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=Bk(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=t.offsetX,n=t.offsetY,i=this.group.transformCoordToLocal(e,n);if(function(t,e,n){if(t._brushType&&!function(t,e,n){var i=t._zr;return e<0||e>i.getWidth()||n<0||n>i.getHeight()}(t,e.offsetX,e.offsetY)){var i=t._zr,r=t._covers,o=Bk(t,e,n);if(!t._dragging)for(var a=0;a=0&&(o[r[a].depth]=new pc(r[a],this,e));if(i&&n)return PA(i,n,this,!0,(function(t,e){t.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getData().getItemLayout(e);if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t})),e.wrapMethod("getItemModel",(function(t,e){var n=t.parentModel,i=n.getGraph().getEdgeByIndex(e).node1.getLayout();if(i){var r=i.depth,o=n.levelModels[r];o&&(t.parentModel=o)}return t}))})).data},e.prototype.setNodePosition=function(t,e){var n=(this.option.data||this.option.nodes)[t];n.localX=e[0],n.localY=e[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,e,n){function i(t){return isNaN(t)||null==t}if("edge"===n){var r=this.getDataParams(t,n),o=r.data,a=r.value;return Uf("nameValue",{name:o.source+" -- "+o.target,value:a,noValue:i(a)})}var s=this.getGraph().getNodeByIndex(t).getLayout().value,l=this.getDataParams(t,n).data.name;return Uf("nameValue",{name:null!=l?l+"":null,value:s,noValue:i(s)})},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(e,n){var i=t.prototype.getDataParams.call(this,e,n);if(null==i.value&&"node"===n){var r=this.getGraph().getNodeByIndex(e).getLayout().value;i.value=r}return i},e.type="series.sankey",e.defaultOption={z:2,coordinateSystem:"view",left:"5%",top:"5%",right:"20%",bottom:"5%",orient:"horizontal",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:"right",fontSize:12},levels:[],nodeAlign:"justify",lineStyle:{color:"#314656",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:"#212121"}},animationEasing:"linear",animationDuration:1e3},e}(ag);function wL(t,e){t.eachSeriesByType("sankey",(function(t){var n=t.get("nodeWidth"),i=t.get("nodeGap"),r=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}(t,e);t.layoutInfo=r;var o=r.width,a=r.height,s=t.getGraph(),l=s.nodes,u=s.edges;!function(t){E(t,(function(t){var e=PL(t.outEdges,LL),n=PL(t.inEdges,LL),i=t.getValue()||0,r=Math.max(e,n,i);t.setLayout({value:r},!0)}))}(l),function(t,e,n,i,r,o,a,s,l){(function(t,e,n,i,r,o,a){for(var s=[],l=[],u=[],h=[],c=0,p=0;p=0;v&&y.depth>d&&(d=y.depth),g.setLayout({depth:v?y.depth:c},!0),"vertical"===o?g.setLayout({dy:n},!0):g.setLayout({dx:n},!0);for(var m=0;mc-1?d:c-1;a&&"left"!==a&&function(t,e,n,i){if("right"===e){for(var r=[],o=t,a=0;o.length;){for(var s=0;s0;o--)IL(s,l*=.99,a),ML(s,r,n,i,a),OL(s,l,a),ML(s,r,n,i,a)}(t,e,o,r,i,a,s),function(t,e){var n="vertical"===e?"x":"y";E(t,(function(t){t.outEdges.sort((function(t,e){return t.node2.getLayout()[n]-e.node2.getLayout()[n]})),t.inEdges.sort((function(t,e){return t.node1.getLayout()[n]-e.node1.getLayout()[n]}))})),E(t,(function(t){var e=0,n=0;E(t.outEdges,(function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy})),E(t.inEdges,(function(t){t.setLayout({ty:n},!0),n+=t.getLayout().dy}))}))}(t,s)}(l,u,n,i,o,a,0!==B(l,(function(t){return 0===t.getLayout().value})).length?0:t.get("layoutIterations"),t.get("orient"),t.get("nodeAlign"))}))}function SL(t){var e=t.hostGraph.data.getRawDataItem(t.dataIndex);return null!=e.depth&&e.depth>=0}function ML(t,e,n,i,r){var o="vertical"===r?"x":"y";E(t,(function(t){var a,s,l;t.sort((function(t,e){return t.getLayout()[o]-e.getLayout()[o]}));for(var u=0,h=t.length,c="vertical"===r?"dx":"dy",p=0;p0&&(a=s.getLayout()[o]+l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]+s.getLayout()[c]+e;if((l=u-e-("vertical"===r?i:n))>0){a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0),u=a;for(p=h-2;p>=0;--p)(l=(s=t[p]).getLayout()[o]+s.getLayout()[c]+e-u)>0&&(a=s.getLayout()[o]-l,"vertical"===r?s.setLayout({x:a},!0):s.setLayout({y:a},!0)),u=s.getLayout()[o]}}))}function IL(t,e,n){E(t.slice().reverse(),(function(t){E(t,(function(t){if(t.outEdges.length){var i=PL(t.outEdges,TL,n)/PL(t.outEdges,LL);if(isNaN(i)){var r=t.outEdges.length;i=r?PL(t.outEdges,CL,n)/r:0}if("vertical"===n){var o=t.getLayout().x+(i-kL(t,n))*e;t.setLayout({x:o},!0)}else{var a=t.getLayout().y+(i-kL(t,n))*e;t.setLayout({y:a},!0)}}}))}))}function TL(t,e){return kL(t.node2,e)*t.getValue()}function CL(t,e){return kL(t.node2,e)}function DL(t,e){return kL(t.node1,e)*t.getValue()}function AL(t,e){return kL(t.node1,e)}function kL(t,e){return"vertical"===e?t.getLayout().x+t.getLayout().dx/2:t.getLayout().y+t.getLayout().dy/2}function LL(t){return t.getValue()}function PL(t,e,n){for(var i=0,r=t.length,o=-1;++oi&&(i=e)})),E(e,(function(e){var r=new eD({type:"color",mappingMethod:"linear",dataExtent:[n,i],visual:t.get("color")}).mapValueToVisual(e.getLayout().value),o=e.getModel().get(["itemStyle","color"]);null!=o?(e.setVisual("color",o),e.setVisual("style",{fill:o})):(e.setVisual("color",r),e.setVisual("style",{fill:r}))}))}}))}var NL=function(){function t(){}return t.prototype.getInitialData=function(t,e){var n,i,r=e.getComponent("xAxis",this.get("xAxisIndex")),o=e.getComponent("yAxis",this.get("yAxisIndex")),a=r.get("type"),s=o.get("type");"category"===a?(t.layout="horizontal",n=r.getOrdinalMeta(),i=!0):"category"===s?(t.layout="vertical",n=o.getOrdinalMeta(),i=!0):t.layout=t.layout||"horizontal";var l=["x","y"],u="horizontal"===t.layout?0:1,h=this._baseAxisDim=l[u],c=l[1-u],p=[r,o],d=p[u].get("type"),f=p[1-u].get("type"),g=t.data;if(g&&i){var y=[];E(g,(function(t,e){var n;Y(t)?(n=t.slice(),t.unshift(e)):Y(t.value)?((n=A({},t)).value=n.value.slice(),t.value.unshift(e)):n=t,y.push(n)})),t.data=y}var v=this.defaultValueDimensions,m=[{name:h,type:Tm(d),ordinalMeta:n,otherDims:{tooltip:!1,itemName:0},dimsDef:["base"]},{name:c,type:Tm(f),dimsDef:v.slice()}];return sM(this,{coordDimensions:m,dimensionsCount:v.length+1,encodeDefaulter:H(Wp,m,this)})},t.prototype.getBaseAxis=function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis},t}(),EL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"min",defaultTooltip:!0},{name:"Q1",defaultTooltip:!0},{name:"median",defaultTooltip:!0},{name:"Q3",defaultTooltip:!0},{name:"max",defaultTooltip:!0}],n.visualDrawType="stroke",n}return n(e,t),e.type="series.boxplot",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:"#fff",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0,0,0,0.2)"}},animationDuration:800},e}(ag);R(EL,NL,!0);var zL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this.group,o=this._data;this._data||r.removeAll();var a="horizontal"===t.get("layout")?1:0;i.diff(o).add((function(t){if(i.hasValue(t)){var e=FL(i.getItemLayout(t),i,t,a,!0);i.setItemGraphicEl(t,e),r.add(e)}})).update((function(t,e){var n=o.getItemGraphicEl(e);if(i.hasValue(t)){var s=i.getItemLayout(t);n?(uh(n),GL(s,n,i,t)):n=FL(s,i,t,a),r.add(n),i.setItemGraphicEl(t,n)}else r.remove(n)})).remove((function(t){var e=o.getItemGraphicEl(t);e&&r.remove(e)})).execute(),this._data=i},e.prototype.remove=function(t){var e=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl((function(t){t&&e.remove(t)}))},e.type="boxplot",e}(mg),VL=function(){},BL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="boxplotBoxPath",n}return n(e,t),e.prototype.getDefaultShape=function(){return new VL},e.prototype.buildPath=function(t,e){var n=e.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();ig){var _=[v,x];i.push(_)}}}return{boxData:n,outliers:i}}(e.getRawData(),t.config);return[{dimensions:["ItemName","Low","Q1","Q2","Q3","High"],data:i.boxData},{data:i.outliers}]}};var ZL=["color","borderColor"],jL=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,e,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,e,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,e):this._incrementalRenderNormal(t,e)},e.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var e=t.pipelineContext.large;null!=this._isLargeDraw&&e===this._isLargeDraw||(this._isLargeDraw=e,this._clear())},e.prototype._renderNormal=function(t){var e=t.getData(),n=this._data,i=this.group,r=e.getLayout("isSimpleBox"),o=t.get("clip",!0),a=t.coordinateSystem,s=a.getArea&&a.getArea();this._data||i.removeAll(),e.diff(n).add((function(n){if(e.hasValue(n)){var a=e.getItemLayout(n);if(o&&JL(s,a))return;var l=$L(a,n,!0);rh(l,{shape:{points:a.ends}},t,n),QL(l,e,n,r),i.add(l),e.setItemGraphicEl(n,l)}})).update((function(a,l){var u=n.getItemGraphicEl(l);if(e.hasValue(a)){var h=e.getItemLayout(a);o&&JL(s,h)?i.remove(u):(u?(ih(u,{shape:{points:h.ends}},t,a),uh(u)):u=$L(h),QL(u,e,a,r),i.add(u),e.setItemGraphicEl(a,u))}else i.remove(u)})).remove((function(t){var e=n.getItemGraphicEl(t);e&&i.remove(e)})).execute(),this._data=e},e.prototype._renderLarge=function(t){this._clear(),iP(t,this.group);var e=t.get("clip",!0)?aS(t.coordinateSystem,!1,t):null;e?this.group.setClipPath(e):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,e){for(var n,i=e.getData(),r=i.getLayout("isSimpleBox");null!=(n=t.next());){var o=$L(i.getItemLayout(n));QL(o,i,n,r),o.incremental=!0,this.group.add(o),this._progressiveEls.push(o)}},e.prototype._incrementalRenderLarge=function(t,e){iP(e,this.group,this._progressiveEls,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type="candlestick",e}(mg),qL=function(){},KL=function(t){function e(e){var n=t.call(this,e)||this;return n.type="normalCandlestickBox",n}return n(e,t),e.prototype.getDefaultShape=function(){return new qL},e.prototype.buildPath=function(t,e){var n=e.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(fs);function $L(t,e,n){var i=t.ends;return new KL({shape:{points:n?tP(i,t):i},z2:100})}function JL(t,e){for(var n=!0,i=0;i0?"borderColor":"borderColor0"])||n.get(["itemStyle",t>0?"color":"color0"]),o=n.getModel("itemStyle").getItemStyle(ZL);e.useStyle(o),e.style.fill=null,e.style.stroke=r}var oP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.defaultValueDimensions=[{name:"open",defaultTooltip:!0},{name:"close",defaultTooltip:!0},{name:"lowest",defaultTooltip:!0},{name:"highest",defaultTooltip:!0}],n}return n(e,t),e.prototype.getShadowDim=function(){return"open"},e.prototype.brushSelector=function(t,e,n){var i=e.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type="series.candlestick",e.dependencies=["xAxis","yAxis","grid"],e.defaultOption={z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:"#eb5454",color0:"#47b262",borderColor:"#eb5454",borderColor0:"#47b262",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:"mod",animationEasing:"linear",animationDuration:300},e}(ag);function aP(t){t&&Y(t.series)&&E(t.series,(function(t){q(t)&&"k"===t.type&&(t.type="candlestick")}))}R(oP,NL,!0);var sP=["itemStyle","borderColor"],lP=["itemStyle","borderColor0"],uP=["itemStyle","color"],hP=["itemStyle","color0"],cP={seriesType:"candlestick",plan:gg(),performRawSeries:!0,reset:function(t,e){function n(t,e){return e.get(t>0?uP:hP)}function i(t,e){return e.get(t>0?sP:lP)}if(!e.isSeriesFiltered(t))return!t.pipelineContext.large&&{progress:function(t,e){for(var r;null!=(r=t.next());){var o=e.getItemModel(r),a=e.getItemLayout(r).sign,s=o.getItemStyle();s.fill=n(a,o),s.stroke=i(a,o)||s.fill,A(e.ensureUniqueItemVisual(r,"style"),s)}}}}},pP={seriesType:"candlestick",plan:gg(),reset:function(t){var e=t.coordinateSystem,n=t.getData(),i=function(t,e){var n,i=t.getBaseAxis(),r="category"===i.type?i.getBandWidth():(n=i.getExtent(),Math.abs(n[1]-n[0])/e.count()),o=Er(rt(t.get("barMaxWidth"),r),r),a=Er(rt(t.get("barMinWidth"),1),r),s=t.get("barWidth");return null!=s?Er(s,r):Math.max(Math.min(r/2,o),a)}(t,n),r=["x","y"],o=n.getDimensionIndex(n.mapDimension(r[0])),a=z(n.mapDimensionsAll(r[1]),n.getDimensionIndex,n),s=a[0],l=a[1],u=a[2],h=a[3];if(n.setLayout({candleWidth:i,isSimpleBox:i<=1.3}),!(o<0||a.length<4))return{progress:t.pipelineContext.large?function(t,n){var i,r,a=_x(4*t.count),c=0,p=[],d=[],f=n.getStore();for(;null!=(r=t.next());){var g=f.get(o,r),y=f.get(s,r),v=f.get(l,r),m=f.get(u,r),x=f.get(h,r);isNaN(g)||isNaN(m)||isNaN(x)?(a[c++]=NaN,c+=3):(a[c++]=dP(f,r,y,v,l),p[0]=g,p[1]=m,i=e.dataToPoint(p,null,d),a[c++]=i?i[0]:NaN,a[c++]=i?i[1]:NaN,p[1]=x,i=e.dataToPoint(p,null,d),a[c++]=i?i[1]:NaN)}n.setLayout("largePoints",a)}:function(t,n){var r,a=n.getStore();for(;null!=(r=t.next());){var c=a.get(o,r),p=a.get(s,r),d=a.get(l,r),f=a.get(u,r),g=a.get(h,r),y=Math.min(p,d),v=Math.max(p,d),m=S(y,c),x=S(v,c),_=S(f,c),b=S(g,c),w=[];M(w,x,0),M(w,m,1),w.push(T(b),T(x),T(_),T(m)),n.setItemLayout(r,{sign:dP(a,r,p,d,l),initBaseline:p>d?x[1]:m[1],ends:w,brushRect:I(f,g,c)})}function S(t,n){var i=[];return i[0]=n,i[1]=t,isNaN(n)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function M(t,e,n){var r=e.slice(),o=e.slice();r[0]=Sh(r[0]+i/2,1,!1),o[0]=Sh(o[0]-i/2,1,!0),n?t.push(r,o):t.push(o,r)}function I(t,e,n){var r=S(t,n),o=S(e,n);return r[0]-=i/2,o[0]-=i/2,{x:r[0],y:r[1],width:i,height:o[1]-r[1]}}function T(t){return t[0]=Sh(t[0],1),t}}}}};function dP(t,e,n,i,r){return n>i?-1:n0?t.get(r,e-1)<=i?1:-1:1}function fP(t,e){var n=e.rippleEffectColor||e.color;t.eachChild((function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:"stroke"===e.brushType?n:null,fill:"fill"===e.brushType?n:null}})}))}var gP=function(t){function e(e,n){var i=t.call(this)||this,r=new Ww(e,n),o=new Cr;return i.add(r),i.add(o),i.updateData(e,n),i}return n(e,t),e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var e=t.symbolType,n=t.color,i=t.rippleNumber,r=this.childAt(1),o=0;o0&&(a=this._getLineLength(i)/l*1e3),(a!==this._period||s!==this._loop)&&(i.stopAnimation(),a>0)){var h=void 0;h=U(u)?u(n):u,i.__t>0&&(h=-a*i.__t),i.__t=0;var c=i.animate("",s).when(a,{__t:1}).delay(h).during((function(){r._updateSymbolPosition(i)}));s||c.done((function(){r.remove(i)})),c.start()}this._period=a,this._loop=s}},e.prototype._getLineLength=function(t){return Et(t.__p1,t.__cp1)+Et(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},e.prototype.updateData=function(t,e,n){this.childAt(0).updateData(t,e,n),this._updateEffectSymbol(t,e)},e.prototype._updateSymbolPosition=function(t){var e=t.__p1,n=t.__p2,i=t.__cp1,r=t.__t,o=[t.x,t.y],a=o.slice(),s=Ke,l=$e;o[0]=s(e[0],i[0],n[0],r),o[1]=s(e[1],i[1],n[1],r);var u=l(e[0],i[0],n[0],r),h=l(e[1],i[1],n[1],r);t.rotation=-Math.atan2(h,u)-Math.PI/2,"line"!==this._symbolType&&"rect"!==this._symbolType&&"roundRect"!==this._symbolType||(void 0!==t.__lastT&&t.__lastT=0&&!(i[o]<=e);o--);o=Math.min(o,r-2)}else{for(o=a;oe);o++);o=Math.min(o-1,r-2)}var s=(e-i[o])/(i[o+1]-i[o]),l=n[o],u=n[o+1];t.x=l[0]*(1-s)+s*u[0],t.y=l[1]*(1-s)+s*u[1];var h=u[0]-l[0],c=u[1]-l[1];t.rotation=-Math.atan2(c,h)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},e}(mP),bP=function(){this.polyline=!1,this.curveness=0,this.segs=[]},wP=function(t){function e(e){var n=t.call(this,e)||this;return n._off=0,n.hoverDataIdx=-1,n}return n(e,t),e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.getDefaultStyle=function(){return{stroke:"#000",fill:null}},e.prototype.getDefaultShape=function(){return new bP},e.prototype.buildPath=function(t,e){var n,i=e.segs,r=e.curveness;if(e.polyline)for(n=this._off;n0){t.moveTo(i[n++],i[n++]);for(var a=1;a0){var c=(s+u)/2-(l-h)*r,p=(l+h)/2-(u-s)*r;t.quadraticCurveTo(c,p,u,h)}else t.lineTo(u,h)}this.incremental&&(this._off=n,this.notClear=!0)},e.prototype.findDataIndex=function(t,e){var n=this.shape,i=n.segs,r=n.curveness,o=this.style.lineWidth;if(n.polyline)for(var a=0,s=0;s0)for(var u=i[s++],h=i[s++],c=1;c0){if($a(u,h,(u+p)/2-(h-d)*r,(h+d)/2-(p-u)*r,p,d,o,t,e))return a}else if(qa(u,h,p,d,o,t,e))return a;a++}return-1},e.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return t=n[0],e=n[1],i.contain(t,e)?(this.hoverDataIdx=this.findDataIndex(t,e))>=0:(this.hoverDataIdx=-1,!1)},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var e=this.shape.segs,n=1/0,i=1/0,r=-1/0,o=-1/0,a=0;a0&&(o.dataIndex=n+t.__startIndex)}))},t.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},t}(),MP={seriesType:"lines",plan:gg(),reset:function(t){var e=t.coordinateSystem;if(e){var n=t.get("polyline"),i=t.pipelineContext.large;return{progress:function(r,o){var a=[];if(i){var s=void 0,l=r.end-r.start;if(n){for(var u=0,h=r.start;h0&&(l||s.configLayer(o,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(a/10+.9,1),0)})),r.updateData(i);var u=t.get("clip",!0)&&aS(t.coordinateSystem,!1,t);u?this.group.setClipPath(u):this.group.removeClipPath(),this._lastZlevel=o,this._finished=!0},e.prototype.incrementalPrepareRender=function(t,e,n){var i=t.getData();this._updateLineDraw(i,t).incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},e.prototype.incrementalRender=function(t,e,n){this._lineDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},e.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},e.prototype.updateTransform=function(t,e,n){var i=t.getData(),r=t.pipelineContext;if(!this._finished||r.large||r.progressiveRender)return{update:!0};var o=MP.reset(t,e,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},e.prototype._updateLineDraw=function(t,e){var n=this._lineDraw,i=this._showEffect(e),r=!!e.get("polyline"),o=e.pipelineContext.large;return n&&i===this._hasEffet&&r===this._isPolyline&&o===this._isLargeDraw||(n&&n.remove(),n=this._lineDraw=o?new SP:new dA(r?i?_P:xP:i?mP:pA),this._hasEffet=i,this._isPolyline=r,this._isLargeDraw=o),this.group.add(n.group),n},e.prototype._showEffect=function(t){return!!t.get(["effect","show"])},e.prototype._clearLayer=function(t){var e=t.getZr();"svg"===e.painter.getType()||null==this._lastZlevel||e.painter.getLayer(this._lastZlevel).clear(!0)},e.prototype.remove=function(t,e){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(e)},e.prototype.dispose=function(t,e){this.remove(t,e)},e.type="lines",e}(mg),TP="undefined"==typeof Uint32Array?Array:Uint32Array,CP="undefined"==typeof Float64Array?Array:Float64Array;function DP(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=z(e,(function(t){var e={coords:[t[0].coord,t[1].coord]};return t[0].name&&(e.fromName=t[0].name),t[1].name&&(e.toName=t[1].name),D([e,t[0],t[1]])})))}var AP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.visualStyleAccessPath="lineStyle",n.visualDrawType="stroke",n}return n(e,t),e.prototype.init=function(e){e.data=e.data||[],DP(e);var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count)),t.prototype.init.apply(this,arguments)},e.prototype.mergeOption=function(e){if(DP(e),e.data){var n=this._processFlatCoordsArray(e.data);this._flatCoords=n.flatCoords,this._flatCoordsOffset=n.flatCoordsOffset,n.flatCoords&&(e.data=new Float32Array(n.count))}t.prototype.mergeOption.apply(this,arguments)},e.prototype.appendData=function(t){var e=this._processFlatCoordsArray(t.data);e.flatCoords&&(this._flatCoords?(this._flatCoords=gt(this._flatCoords,e.flatCoords),this._flatCoordsOffset=gt(this._flatCoordsOffset,e.flatCoordsOffset)):(this._flatCoords=e.flatCoords,this._flatCoordsOffset=e.flatCoordsOffset),t.data=new Float32Array(e.count)),this.getRawData().appendData(t.data)},e.prototype._getCoordsFromItemModel=function(t){var e=this.getData().getItemModel(t),n=e.option instanceof Array?e.option:e.getShallow("coords");return n},e.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[2*t+1]:this._getCoordsFromItemModel(t).length},e.prototype.getLineCoords=function(t,e){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[2*t],i=this._flatCoordsOffset[2*t+1],r=0;r ")})},e.prototype.preventIncremental=function(){return!!this.get(["effect","show"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},e.prototype.getZLevelKey=function(){var t=this.getModel("effect"),e=t.get("trailLength");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get("show")&&e>0?e+"":""},e.type="series.lines",e.dependencies=["grid","polar","geo","calendar"],e.defaultOption={coordinateSystem:"geo",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}},e}(ag);function kP(t){return t instanceof Array||(t=[t,t]),t}var LP={seriesType:"lines",reset:function(t){var e=kP(t.get("symbol")),n=kP(t.get("symbolSize")),i=t.getData();return i.setVisual("fromSymbol",e&&e[0]),i.setVisual("toSymbol",e&&e[1]),i.setVisual("fromSymbolSize",n&&n[0]),i.setVisual("toSymbolSize",n&&n[1]),{dataEach:i.hasItemOption?function(t,e){var n=t.getItemModel(e),i=kP(n.getShallow("symbol",!0)),r=kP(n.getShallow("symbolSize",!0));i[0]&&t.setItemVisual(e,"fromSymbol",i[0]),i[1]&&t.setItemVisual(e,"toSymbol",i[1]),r[0]&&t.setItemVisual(e,"fromSymbolSize",r[0]),r[1]&&t.setItemVisual(e,"toSymbolSize",r[1])}:null}}};var PP=function(){function t(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var t=h.createCanvas();this.canvas=t}return t.prototype.update=function(t,e,n,i,r,o){var a=this._getBrush(),s=this._getGradient(r,"inRange"),l=this._getGradient(r,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),p=t.length;h.width=e,h.height=n;for(var d=0;d0){var I=o(v)?s:l;v>0&&(v=v*S+w),x[_++]=I[M],x[_++]=I[M+1],x[_++]=I[M+2],x[_++]=I[M+3]*v*256}else _+=4}return c.putImageData(m,0,0),h},t.prototype._getBrush=function(){var t=this._brushCanvas||(this._brushCanvas=h.createCanvas()),e=this.pointSize+this.blurSize,n=2*e;t.width=n,t.height=n;var i=t.getContext("2d");return i.clearRect(0,0,n,n),i.shadowOffsetX=n,i.shadowBlur=this.blurSize,i.shadowColor="#000",i.beginPath(),i.arc(-e,e,this.pointSize,0,2*Math.PI,!0),i.closePath(),i.fill(),t},t.prototype._getGradient=function(t,e){for(var n=this._gradientPixels,i=n[e]||(n[e]=new Uint8ClampedArray(1024)),r=[0,0,0,0],o=0,a=0;a<256;a++)t[e](a/255,!0,r),i[o++]=r[0],i[o++]=r[1],i[o++]=r[2],i[o++]=r[3];return i},t}();function OP(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var RP=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i;e.eachComponent("visualMap",(function(e){e.eachTargetSeries((function(n){n===t&&(i=e)}))})),this._progressiveEls=null,this.group.removeAll();var r=t.coordinateSystem;"cartesian2d"===r.type||"calendar"===r.type?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):OP(r)&&this._renderOnGeo(r,t,i,n)},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,e,n,i){var r=e.coordinateSystem;r&&(OP(r)?this.render(e,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(e,i,t.start,t.end,!0)))},e.prototype.eachRendered=function(t){zh(this._progressiveEls||this.group,t)},e.prototype._renderOnCartesianAndCalendar=function(t,e,n,i,r){var o,a,s,l,u=t.coordinateSystem;if(sS(u,"cartesian2d")){var h=u.getAxis("x"),c=u.getAxis("y");0,o=h.getBandWidth(),a=c.getBandWidth(),s=h.scale.getExtent(),l=c.scale.getExtent()}for(var p=this.group,d=t.getData(),f=t.getModel(["emphasis","itemStyle"]).getItemStyle(),g=t.getModel(["blur","itemStyle"]).getItemStyle(),y=t.getModel(["select","itemStyle"]).getItemStyle(),v=Hh(t),m=t.getModel("emphasis"),x=m.get("focus"),_=m.get("blurScope"),b=m.get("disabled"),w=sS(u,"cartesian2d")?[d.mapDimension("x"),d.mapDimension("y"),d.mapDimension("value")]:[d.mapDimension("time"),d.mapDimension("value")],S=n;Ss[1]||Cl[1])continue;var D=u.dataToPoint([T,C]);M=new Ts({shape:{x:Math.floor(Math.round(D[0])-o/2),y:Math.floor(Math.round(D[1])-a/2),width:Math.ceil(o),height:Math.ceil(a)},style:I})}else{if(isNaN(d.get(w[1],S)))continue;M=new Ts({z2:1,shape:u.dataToRect([d.get(w[0],S)]).contentShape,style:I})}var A=d.getItemModel(S);if(d.hasItemOption){var k=A.getModel("emphasis");f=k.getModel("itemStyle").getItemStyle(),g=A.getModel(["blur","itemStyle"]).getItemStyle(),y=A.getModel(["select","itemStyle"]).getItemStyle(),x=k.get("focus"),_=k.get("blurScope"),b=k.get("disabled"),v=Hh(A)}var L=t.getRawValue(S),P="-";L&&null!=L[2]&&(P=L[2]+""),Wh(M,v,{labelFetcher:t,labelDataIndex:S,defaultOpacity:I.opacity,defaultText:P}),M.ensureState("emphasis").style=f,M.ensureState("blur").style=g,M.ensureState("select").style=y,Ol(M,x,_,b),M.incremental=r,r&&(M.states.emphasis.hoverLayer=!0),p.add(M),d.setItemGraphicEl(S,M),this._progressiveEls&&this._progressiveEls.push(M)}},e.prototype._renderOnGeo=function(t,e,n,i){var r=n.targetVisuals.inRange,o=n.targetVisuals.outOfRange,a=e.getData(),s=this._hmLayer||this._hmLayer||new PP;s.blurSize=e.get("blurSize"),s.pointSize=e.get("pointSize"),s.minOpacity=e.get("minOpacity"),s.maxOpacity=e.get("maxOpacity");var l=t.getViewRect().clone(),u=t.getRoamTransform();l.applyTransform(u);var h=Math.max(l.x,0),c=Math.max(l.y,0),p=Math.min(l.width+l.x,i.getWidth()),d=Math.min(l.height+l.y,i.getHeight()),f=p-h,g=d-c,y=[a.mapDimension("lng"),a.mapDimension("lat"),a.mapDimension("value")],v=a.mapArray(y,(function(e,n,i){var r=t.dataToPoint([e,n]);return r[0]-=h,r[1]-=c,r.push(i),r})),m=n.getExtent(),x="visualMap.continuous"===n.type?function(t,e){var n=t[1]-t[0];return e=[(e[0]-t[0])/n,(e[1]-t[0])/n],function(t){return t>=e[0]&&t<=e[1]}}(m,n.option.range):function(t,e,n){var i=t[1]-t[0],r=(e=z(e,(function(e){return{interval:[(e.interval[0]-t[0])/i,(e.interval[1]-t[0])/i]}}))).length,o=0;return function(t){var i;for(i=o;i=0;i--){var a;if((a=e[i].interval)[0]<=t&&t<=a[1]){o=i;break}}return i>=0&&i0?1:-1}(n,o,r,i,c),function(t,e,n,i,r,o,a,s,l,u){var h,c=l.valueDim,p=l.categoryDim,d=Math.abs(n[p.wh]),f=t.getItemVisual(e,"symbolSize");h=Y(f)?f.slice():null==f?["100%","100%"]:[f,f];h[p.index]=Er(h[p.index],d),h[c.index]=Er(h[c.index],i?d:Math.abs(o)),u.symbolSize=h,(u.symbolScale=[h[0]/s,h[1]/s])[c.index]*=(l.isHorizontal?-1:1)*a}(t,e,r,o,0,c.boundingLength,c.pxSign,u,i,c),function(t,e,n,i,r){var o=t.get(EP)||0;o&&(VP.attr({scaleX:e[0],scaleY:e[1],rotation:n}),VP.updateTransform(),o/=VP.getLineScale(),o*=e[i.valueDim.index]);r.valueLineWidth=o}(n,c.symbolScale,l,i,c);var p=c.symbolSize,d=Py(n.get("symbolOffset"),p);return function(t,e,n,i,r,o,a,s,l,u,h,c){var p=h.categoryDim,d=h.valueDim,f=c.pxSign,g=Math.max(e[d.index]+s,0),y=g;if(i){var v=Math.abs(l),m=it(t.get("symbolMargin"),"15%")+"",x=!1;m.lastIndexOf("!")===m.length-1&&(x=!0,m=m.slice(0,m.length-1));var _=Er(m,e[d.index]),b=Math.max(g+2*_,0),w=x?0:2*_,S=eo(i),M=S?i:nO((v+w)/b);b=g+2*(_=(v-M*g)/2/(x?M:Math.max(M-1,1))),w=x?0:2*_,S||"fixed"===i||(M=u?nO((Math.abs(u)+w)/b):0),y=M*b-w,c.repeatTimes=M,c.symbolMargin=_}var I=f*(y/2),T=c.pathPosition=[];T[p.index]=n[p.wh]/2,T[d.index]="start"===a?I:"end"===a?l-I:l/2,o&&(T[0]+=o[0],T[1]+=o[1]);var C=c.bundlePosition=[];C[p.index]=n[p.xy],C[d.index]=n[d.xy];var D=c.barRectShape=A({},n);D[d.wh]=f*Math.max(Math.abs(n[d.wh]),Math.abs(T[d.index]+I)),D[p.wh]=n[p.wh];var k=c.clipShape={};k[p.xy]=-n[p.xy],k[p.wh]=h.ecSize[p.wh],k[d.xy]=0,k[d.wh]=n[d.wh]}(n,p,r,o,0,d,s,c.valueLineWidth,c.boundingLength,c.repeatCutLength,i,c),c}function GP(t,e){return t.toGlobalCoord(t.dataToCoord(t.scale.parse(e)))}function WP(t){var e=t.symbolPatternSize,n=ky(t.symbolType,-e/2,-e/2,e,e);return n.attr({culling:!0}),"image"!==n.type&&n.setStyle({strokeNoScale:!0}),n}function HP(t,e,n,i){var r=t.__pictorialBundle,o=n.symbolSize,a=n.valueLineWidth,s=n.pathPosition,l=e.valueDim,u=n.repeatTimes||0,h=0,c=o[e.valueDim.index]+a+2*n.symbolMargin;for(QP(t,(function(t){t.__pictorialAnimationIndex=h,t.__pictorialRepeatTimes=u,h0:i<0)&&(r=u-1-t),e[l.index]=c*(r-u/2+.5)+s[l.index],{x:e[0],y:e[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation}}}function YP(t,e,n,i){var r=t.__pictorialBundle,o=t.__pictorialMainPath;o?tO(o,null,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:n.symbolScale[0],scaleY:n.symbolScale[1],rotation:n.rotation},n,i):(o=t.__pictorialMainPath=WP(n),r.add(o),tO(o,{x:n.pathPosition[0],y:n.pathPosition[1],scaleX:0,scaleY:0,rotation:n.rotation},{scaleX:n.symbolScale[0],scaleY:n.symbolScale[1]},n,i))}function UP(t,e,n){var i=A({},e.barRectShape),r=t.__pictorialBarRect;r?tO(r,null,{shape:i},e,n):((r=t.__pictorialBarRect=new Ts({z2:2,shape:i,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}})).disableMorphing=!0,t.add(r))}function XP(t,e,n,i){if(n.symbolClip){var r=t.__pictorialClipPath,o=A({},n.clipShape),a=e.valueDim,s=n.animationModel,l=n.dataIndex;if(r)ih(r,{shape:o},s,l);else{o[a.wh]=0,r=new Ts({shape:o}),t.__pictorialBundle.setClipPath(r),t.__pictorialClipPath=r;var u={};u[a.wh]=n.clipShape[a.wh],Vh[i?"updateProps":"initProps"](r,{shape:u},s,l)}}}function ZP(t,e){var n=t.getItemModel(e);return n.getAnimationDelayParams=jP,n.isAnimationEnabled=qP,n}function jP(t){return{index:t.__pictorialAnimationIndex,count:t.__pictorialRepeatTimes}}function qP(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function KP(t,e,n,i){var r=new Cr,o=new Cr;return r.add(o),r.__pictorialBundle=o,o.x=n.bundlePosition[0],o.y=n.bundlePosition[1],n.symbolRepeat?HP(r,e,n):YP(r,0,n),UP(r,n,i),XP(r,e,n,i),r.__pictorialShapeStr=JP(t,n),r.__pictorialSymbolMeta=n,r}function $P(t,e,n,i){var r=i.__pictorialBarRect;r&&r.removeTextContent();var o=[];QP(i,(function(t){o.push(t)})),i.__pictorialMainPath&&o.push(i.__pictorialMainPath),i.__pictorialClipPath&&(n=null),E(o,(function(t){ah(t,{scaleX:0,scaleY:0},n,e,(function(){i.parent&&i.parent.remove(i)}))})),t.setItemGraphicEl(e,null)}function JP(t,e){return[t.getItemVisual(e.dataIndex,"symbol")||"none",!!e.symbolRepeat,!!e.symbolClip].join(":")}function QP(t,e,n){E(t.__pictorialBundle.children(),(function(i){i!==t.__pictorialBarRect&&e.call(n,i)}))}function tO(t,e,n,i,r,o){e&&t.attr(e),i.symbolClip&&!r?n&&t.attr(n):n&&Vh[r?"updateProps":"initProps"](t,n,i.animationModel,i.dataIndex,o)}function eO(t,e,n){var i=n.dataIndex,r=n.itemModel,o=r.getModel("emphasis"),a=o.getModel("itemStyle").getItemStyle(),s=r.getModel(["blur","itemStyle"]).getItemStyle(),l=r.getModel(["select","itemStyle"]).getItemStyle(),u=r.getShallow("cursor"),h=o.get("focus"),c=o.get("blurScope"),p=o.get("scale");QP(t,(function(t){if(t instanceof xs){var e=t.style;t.useStyle(A({image:e.image,x:e.x,y:e.y,width:e.width,height:e.height},n.style))}else t.useStyle(n.style);var i=t.ensureState("emphasis");i.style=a,p&&(i.scaleX=1.1*t.scaleX,i.scaleY=1.1*t.scaleY),t.ensureState("blur").style=s,t.ensureState("select").style=l,u&&(t.cursor=u),t.z2=n.z2}));var d=e.valueDim.posDesc[+(n.boundingLength>0)];Wh(t.__pictorialBarRect,Hh(r),{labelFetcher:e.seriesModel,labelDataIndex:i,defaultText:Fw(e.seriesModel.getData(),i),inheritColor:n.style.fill,defaultOpacity:n.style.opacity,defaultOutsidePosition:d}),Ol(t,h,c,o.get("disabled"))}function nO(t){var e=Math.round(t);return Math.abs(t-e)<1e-4?e:Math.ceil(t)}var iO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.hasSymbolVisual=!0,n.defaultSymbol="roundRect",n}return n(e,t),e.prototype.getInitialData=function(e){return e.stack=null,t.prototype.getInitialData.apply(this,arguments)},e.type="series.pictorialBar",e.dependencies=["grid"],e.defaultOption=gc(SS.defaultOption,{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:"#212121"}}}),e}(SS);var rO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._layers=[],n}return n(e,t),e.prototype.render=function(t,e,n){var i=t.getData(),r=this,o=this.group,a=t.getLayerSeries(),s=i.getLayout("layoutInfo"),l=s.rect,u=s.boundaryGap;function h(t){return t.name}o.x=0,o.y=l.y+u[0];var c=new Sm(this._layersSeries||[],a,h,h),p=[];function d(e,n,s){var l=r._layers;if("remove"!==e){for(var u,h,c=[],d=[],f=a[n].indices,g=0;go&&(o=s),i.push(s)}for(var u=0;uo&&(o=c)}return{y0:r,max:o}}(l),h=u.y0,c=n/u.max,p=o.length,d=o[0].indices.length,f=0;fMath.PI/2?"right":"left"):w&&"center"!==w?"left"===w?(v=r.r0+b,a>Math.PI/2&&(w="right")):"right"===w&&(v=r.r-b,a>Math.PI/2&&(w="left")):(v=(r.r+r.r0)/2,w="center"),d.style.align=w,d.style.verticalAlign=f(o,"verticalAlign")||"middle",d.x=v*s+r.cx,d.y=v*l+r.cy;var S=f(o,"rotate"),M=0;"radial"===S?(M=-a)<-Math.PI/2&&(M+=Math.PI):"tangential"===S?(M=Math.PI/2-a)>Math.PI/2?M-=Math.PI:M<-Math.PI/2&&(M+=Math.PI):j(S)&&(M=S*Math.PI/180),d.rotation=M})),h.dirtyStyle()},e}(Tu),uO="sunburstRootToNode",hO="sunburstHighlight";var cO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this;this.seriesModel=t,this.api=n,this.ecModel=e;var o=t.getData(),a=o.tree.root,s=t.getViewRoot(),l=this.group,u=t.get("renderLabelForZeroData"),h=[];s.eachNode((function(t){h.push(t)}));var c=this._oldChildren||[];!function(i,r){if(0===i.length&&0===r.length)return;function s(t){return t.getId()}function h(s,h){!function(i,r){u||!i||i.getValue()||(i=null);if(i!==a&&r!==a)if(r&&r.piece)i?(r.piece.updateData(!1,i,t,e,n),o.setItemGraphicEl(i.dataIndex,r.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(r);else if(i){var s=new lO(i,t,e,n);l.add(s),o.setItemGraphicEl(i.dataIndex,s)}}(null==s?null:i[s],null==h?null:r[h])}new Sm(r,i,s,s).add(h).update(h).remove(H(h,null)).execute()}(h,c),function(i,o){o.depth>0?(r.virtualPiece?r.virtualPiece.updateData(!1,i,t,e,n):(r.virtualPiece=new lO(i,t,e,n),l.add(r.virtualPiece)),o.piece.off("click"),r.virtualPiece.on("click",(function(t){r._rootToNode(o.parentNode)}))):r.virtualPiece&&(l.remove(r.virtualPiece),r.virtualPiece=null)}(a,s),this._initEvents(),this._oldChildren=h},e.prototype._initEvents=function(){var t=this;this.group.off("click"),this.group.on("click",(function(e){var n=!1;t.seriesModel.getViewRoot().eachNode((function(i){if(!n&&i.piece&&i.piece===e.target){var r=i.getModel().get("nodeClick");if("rootToNode"===r)t._rootToNode(i);else if("link"===r){var o=i.getModel(),a=o.get("link");if(a)pp(a,o.get("target",!0)||"_blank")}n=!0}}))}))},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:uO,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}},e.type="sunburst",e}(mg),pO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.ignoreStyleOnData=!0,n}return n(e,t),e.prototype.getInitialData=function(t,e){var n={name:t.name,children:t.data};dO(n);var i=this._levelModels=z(t.levels||[],(function(t){return new pc(t,this,e)}),this),r=CC.createTree(n,this,(function(t){t.wrapMethod("getItemModel",(function(t,e){var n=r.getNodeByDataIndex(e),o=i[n.depth];return o&&(t.parentModel=o),t}))}));return r.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(e){var n=t.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(e);return n.treePathInfo=LC(i,this),n},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)},e.prototype.enableAriaDecal=function(){zC(this)},e.type="series.sunburst",e.defaultOption={z:2,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:"rootToNode",renderLabelForZeroData:!1,label:{rotate:"radial",show:!0,opacity:1,align:"center",position:"inside",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:"white",borderType:"solid",shadowBlur:0,shadowColor:"rgba(0, 0, 0, 0.2)",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:"descendant"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:"expansion",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:"desc"},e}(ag);function dO(t){var e=0;E(t.children,(function(t){dO(t);var n=t.value;Y(n)&&(n=n[0]),e+=n}));var n=t.value;Y(n)&&(n=n[0]),(null==n||isNaN(n))&&(n=e),n<0&&(n=0),Y(t.value)?t.value[0]=n:t.value=n}var fO=Math.PI/180;function gO(t,e,n){e.eachSeriesByType(t,(function(t){var e=t.get("center"),i=t.get("radius");Y(i)||(i=[0,i]),Y(e)||(e=[e,e]);var r=n.getWidth(),o=n.getHeight(),a=Math.min(r,o),s=Er(e[0],r),l=Er(e[1],o),u=Er(i[0],a/2),h=Er(i[1],a/2),c=-t.get("startAngle")*fO,p=t.get("minAngle")*fO,d=t.getData().tree.root,f=t.getViewRoot(),g=f.depth,y=t.get("sort");null!=y&&yO(f,y);var v=0;E(f.children,(function(t){!isNaN(t.getValue())&&v++}));var m=f.getValue(),x=Math.PI/(m||v)*2,_=f.depth>0,b=f.height-(_?-1:1),w=(h-u)/(b||1),S=t.get("clockwise"),M=t.get("stillShowZeroSum"),I=S?1:-1,T=function(e,n){if(e){var i=n;if(e!==d){var r=e.getValue(),o=0===m&&M?x:r*x;o1;)r=r.parentNode;var o=n.getColorFromPalette(r.name||r.dataIndex+"",e);return t.depth>1&&X(o)&&(o=Sn(o,(t.depth-1)/(i-1)*.5)),o}(r,t,i.root.height)),A(n.ensureUniqueItemVisual(r.dataIndex,"style"),o)}))}))}var mO={color:"fill",borderColor:"stroke"},xO={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},_O=So(),bO=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){this.currentZLevel=this.get("zlevel",!0),this.currentZ=this.get("z",!0)},e.prototype.getInitialData=function(t,e){return nx(null,this)},e.prototype.getDataParams=function(e,n,i){var r=t.prototype.getDataParams.call(this,e,n);return i&&(r.info=_O(i).info),r},e.type="series.custom",e.dependencies=["grid","polar","geo","singleAxis","calendar"],e.defaultOption={coordinateSystem:"cartesian2d",z:2,legendHoverLink:!0,clip:!1},e}(ag);function wO(t,e){return e=e||[0,0],z(["x","y"],(function(n,i){var r=this.getAxis(n),o=e[i],a=t[i]/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a))}),this)}function SO(t,e){return e=e||[0,0],z([0,1],(function(n){var i=e[n],r=t[n]/2,o=[],a=[];return o[n]=i-r,a[n]=i+r,o[1-n]=a[1-n]=e[1-n],Math.abs(this.dataToPoint(o)[n]-this.dataToPoint(a)[n])}),this)}function MO(t,e){var n=this.getAxis(),i=e instanceof Array?e[0]:e,r=(t instanceof Array?t[0]:t)/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(i-r)-n.dataToCoord(i+r))}function IO(t,e){return e=e||[0,0],z(["Radius","Angle"],(function(n,i){var r=this["get"+n+"Axis"](),o=e[i],a=t[i]/2,s="category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(o-a)-r.dataToCoord(o+a));return"Angle"===n&&(s=s*Math.PI/180),s}),this)}function TO(t,e,n,i){return t&&(t.legacy||!1!==t.legacy&&!n&&!i&&"tspan"!==e&&("text"===e||mt(t,"text")))}function CO(t,e,n){var i,r,o,a=t;if("text"===e)o=a;else{o={},mt(a,"text")&&(o.text=a.text),mt(a,"rich")&&(o.rich=a.rich),mt(a,"textFill")&&(o.fill=a.textFill),mt(a,"textStroke")&&(o.stroke=a.textStroke),mt(a,"fontFamily")&&(o.fontFamily=a.fontFamily),mt(a,"fontSize")&&(o.fontSize=a.fontSize),mt(a,"fontStyle")&&(o.fontStyle=a.fontStyle),mt(a,"fontWeight")&&(o.fontWeight=a.fontWeight),r={type:"text",style:o,silent:!0},i={};var s=mt(a,"textPosition");n?i.position=s?a.textPosition:"inside":s&&(i.position=a.textPosition),mt(a,"textPosition")&&(i.position=a.textPosition),mt(a,"textOffset")&&(i.offset=a.textOffset),mt(a,"textRotation")&&(i.rotation=a.textRotation),mt(a,"textDistance")&&(i.distance=a.textDistance)}return DO(o,t),E(o.rich,(function(t){DO(t,t)})),{textConfig:i,textContent:r}}function DO(t,e){e&&(e.font=e.textFont||e.font,mt(e,"textStrokeWidth")&&(t.lineWidth=e.textStrokeWidth),mt(e,"textAlign")&&(t.align=e.textAlign),mt(e,"textVerticalAlign")&&(t.verticalAlign=e.textVerticalAlign),mt(e,"textLineHeight")&&(t.lineHeight=e.textLineHeight),mt(e,"textWidth")&&(t.width=e.textWidth),mt(e,"textHeight")&&(t.height=e.textHeight),mt(e,"textBackgroundColor")&&(t.backgroundColor=e.textBackgroundColor),mt(e,"textPadding")&&(t.padding=e.textPadding),mt(e,"textBorderColor")&&(t.borderColor=e.textBorderColor),mt(e,"textBorderWidth")&&(t.borderWidth=e.textBorderWidth),mt(e,"textBorderRadius")&&(t.borderRadius=e.textBorderRadius),mt(e,"textBoxShadowColor")&&(t.shadowColor=e.textBoxShadowColor),mt(e,"textBoxShadowBlur")&&(t.shadowBlur=e.textBoxShadowBlur),mt(e,"textBoxShadowOffsetX")&&(t.shadowOffsetX=e.textBoxShadowOffsetX),mt(e,"textBoxShadowOffsetY")&&(t.shadowOffsetY=e.textBoxShadowOffsetY))}function AO(t,e,n){var i=t;i.textPosition=i.textPosition||n.position||"inside",null!=n.offset&&(i.textOffset=n.offset),null!=n.rotation&&(i.textRotation=n.rotation),null!=n.distance&&(i.textDistance=n.distance);var r=i.textPosition.indexOf("inside")>=0,o=t.fill||"#000";kO(i,e);var a=null==i.textFill;return r?a&&(i.textFill=n.insideFill||"#fff",!i.textStroke&&n.insideStroke&&(i.textStroke=n.insideStroke),!i.textStroke&&(i.textStroke=o),null==i.textStrokeWidth&&(i.textStrokeWidth=2)):(a&&(i.textFill=t.fill||n.outsideFill||"#000"),!i.textStroke&&n.outsideStroke&&(i.textStroke=n.outsideStroke)),i.text=e.text,i.rich=e.rich,E(e.rich,(function(t){kO(t,t)})),i}function kO(t,e){e&&(mt(e,"fill")&&(t.textFill=e.fill),mt(e,"stroke")&&(t.textStroke=e.fill),mt(e,"lineWidth")&&(t.textStrokeWidth=e.lineWidth),mt(e,"font")&&(t.font=e.font),mt(e,"fontStyle")&&(t.fontStyle=e.fontStyle),mt(e,"fontWeight")&&(t.fontWeight=e.fontWeight),mt(e,"fontSize")&&(t.fontSize=e.fontSize),mt(e,"fontFamily")&&(t.fontFamily=e.fontFamily),mt(e,"align")&&(t.textAlign=e.align),mt(e,"verticalAlign")&&(t.textVerticalAlign=e.verticalAlign),mt(e,"lineHeight")&&(t.textLineHeight=e.lineHeight),mt(e,"width")&&(t.textWidth=e.width),mt(e,"height")&&(t.textHeight=e.height),mt(e,"backgroundColor")&&(t.textBackgroundColor=e.backgroundColor),mt(e,"padding")&&(t.textPadding=e.padding),mt(e,"borderColor")&&(t.textBorderColor=e.borderColor),mt(e,"borderWidth")&&(t.textBorderWidth=e.borderWidth),mt(e,"borderRadius")&&(t.textBorderRadius=e.borderRadius),mt(e,"shadowColor")&&(t.textBoxShadowColor=e.shadowColor),mt(e,"shadowBlur")&&(t.textBoxShadowBlur=e.shadowBlur),mt(e,"shadowOffsetX")&&(t.textBoxShadowOffsetX=e.shadowOffsetX),mt(e,"shadowOffsetY")&&(t.textBoxShadowOffsetY=e.shadowOffsetY),mt(e,"textShadowColor")&&(t.textShadowColor=e.textShadowColor),mt(e,"textShadowBlur")&&(t.textShadowBlur=e.textShadowBlur),mt(e,"textShadowOffsetX")&&(t.textShadowOffsetX=e.textShadowOffsetX),mt(e,"textShadowOffsetY")&&(t.textShadowOffsetY=e.textShadowOffsetY))}var LO={position:["x","y"],scale:["scaleX","scaleY"],origin:["originX","originY"]},PO=G(LO),OO=(V(Ki,(function(t,e){return t[e]=1,t}),{}),Ki.join(", "),["","style","shape","extra"]),RO=So();function NO(t,e,n,i,r){var o=t+"Animation",a=eh(t,i,r)||{},s=RO(e).userDuring;return a.duration>0&&(a.during=s?W(WO,{el:e,userDuring:s}):null,a.setToFinal=!0,a.scope=t),A(a,n[o]),a}function EO(t,e,n,i){var r=(i=i||{}).dataIndex,o=i.isInit,a=i.clearStyle,s=n.isAnimationEnabled(),l=RO(t),u=e.style;l.userDuring=e.during;var h={},c={};if(function(t,e,n){for(var i=0;i=0)){var c=t.getAnimationStyleProps(),p=c?c.style:null;if(p){!r&&(r=i.style={});var d=G(n);for(u=0;u0&&t.animateFrom(p,d)}else!function(t,e,n,i,r){if(r){var o=NO("update",t,e,i,n);o.duration>0&&t.animateFrom(r,o)}}(t,e,r||0,n,h);zO(t,e),u?t.dirty():t.markRedraw()}function zO(t,e){for(var n=RO(t).leaveToProps,i=0;i=0){!o&&(o=i[t]={});var p=G(a);for(h=0;hi[1]&&i.reverse(),{coordSys:{type:"polar",cx:t.cx,cy:t.cy,r:i[1],r0:i[0]},api:{coord:function(i){var r=e.dataToRadius(i[0]),o=n.dataToAngle(i[1]),a=t.coordToPoint([r,o]);return a.push(r,o*Math.PI/180),a},size:W(IO,t)}}},calendar:function(t){var e=t.getRect(),n=t.getRangeInfo();return{coordSys:{type:"calendar",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:t.getCellWidth(),cellHeight:t.getCellHeight(),rangeInfo:{start:n.start,end:n.end,weeks:n.weeks,dayCount:n.allDay}},api:{coord:function(e,n){return t.dataToPoint(e,n)}}}}};function aR(t){return t instanceof fs}function sR(t){return t instanceof da}var lR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n,i){this._progressiveEls=null;var r=this._data,o=t.getData(),a=this.group,s=dR(t,o,e,n);r||a.removeAll(),o.diff(r).add((function(e){gR(n,null,e,s(e,i),t,a,o)})).remove((function(e){var n=r.getItemGraphicEl(e);VO(n,_O(n).option,t)})).update((function(e,l){var u=r.getItemGraphicEl(l);gR(n,u,e,s(e,i),t,a,o)})).execute();var l=t.get("clip",!0)?aS(t.coordinateSystem,!1,t):null;l?a.setClipPath(l):a.removeClipPath(),this._data=o},e.prototype.incrementalPrepareRender=function(t,e,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,e,n,i,r){var o=e.getData(),a=dR(e,o,n,i),s=this._progressiveEls=[];function l(t){t.isGroup||(t.incremental=!0,t.ensureState("emphasis").hoverLayer=!0)}for(var u=t.start;u=0?e.getStore().get(r,n):void 0}var o=e.get(i.name,n),a=i&&i.ordinalMeta;return a?a.categories[o]:o},styleEmphasis:function(n,i){0;null==i&&(i=s);var r=m(i,KO).getItemStyle(),o=x(i,KO),a=Yh(o,null,null,!0,!0);a.text=o.getShallow("show")?ot(t.getFormattedLabel(i,KO),t.getFormattedLabel(i,$O),Fw(e,i)):null;var l=Uh(o,null,!0);return b(n,r),r=AO(r,a,l),n&&_(r,n),r.legacy=!0,r},visual:function(t,n){if(null==n&&(n=s),mt(mO,t)){var i=e.getItemVisual(n,"style");return i?i[mO[t]]:null}if(mt(xO,t))return e.getItemVisual(n,t)},barLayout:function(t){if("cartesian2d"===o.type){return function(t){var e=[],n=t.axis,i="axis0";if("category"===n.type){for(var r=n.getBandWidth(),o=0;o=c;p--){VO(e.childAt(p),_O(e).option,r)}}(t,c,n,i,r),a>=0?o.replaceAt(c,a):o.add(c),c}function vR(t,e,n){var i,r=_O(t),o=e.type,a=e.shape,s=e.style;return n.isUniversalTransitionEnabled()||null!=o&&o!==r.customGraphicType||"path"===o&&((i=a)&&(mt(i,"pathData")||mt(i,"d")))&&MR(a)!==r.customPathData||"image"===o&&mt(s,"image")&&s.image!==r.customImagePath}function mR(t,e,n){var i=e?xR(t,e):t,r=e?_R(t,i,KO):t.style,o=t.type,a=i?i.textConfig:null,s=t.textContent,l=s?e?xR(s,e):s:null;if(r&&(n.isLegacy||TO(r,o,!!a,!!l))){n.isLegacy=!0;var u=CO(r,o,!e);!a&&u.textConfig&&(a=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var h=l;!h.type&&(h.type="text")}var c=e?n[e]:n.normal;c.cfg=a,c.conOpt=l}function xR(t,e){return e?t?t[e]:null:t}function _R(t,e,n){var i=e&&e.style;return null==i&&n===KO&&t&&(i=t.styleEmphasis),i}function bR(t,e){var n=t&&t.name;return null!=n?n:"e\0\0"+e}function wR(t,e){var n=this.context,i=null!=t?n.newChildren[t]:null,r=null!=e?n.oldChildren[e]:null;yR(n.api,r,n.dataIndex,i,n.seriesModel,n.group)}function SR(t){var e=this.context,n=e.oldChildren[t];VO(n,_O(n).option,e.seriesModel)}function MR(t){return t&&(t.pathData||t.d)}var IR=So(),TR=T,CR=W,DR=function(){function t(){this._dragging=!1,this.animationThreshold=15}return t.prototype.render=function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=H(AR,e,h);this.updatePointerEl(a,l,c),this.updateLabelEl(a,l,c,e)}else a=this._group=new Cr,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);OR(a,e,!0),this._renderHandle(r)}},t.prototype.remove=function(t){this.clear(t)},t.prototype.dispose=function(t){this.clear(t)},t.prototype.determineAnimation=function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=jM(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},t.prototype.makeElOption=function(t,e,n,i,r){},t.prototype.createPointerEl=function(t,e,n,i){var r=e.pointer;if(r){var o=IR(t).pointerEl=new Vh[r.type](TR(e.pointer));t.add(o)}},t.prototype.createLabelEl=function(t,e,n,i){if(e.label){var r=IR(t).labelEl=new As(TR(e.label));t.add(r),LR(r,i)}},t.prototype.updatePointerEl=function(t,e,n){var i=IR(t).pointerEl;i&&e.pointer&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},t.prototype.updateLabelEl=function(t,e,n,i){var r=IR(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{x:e.label.x,y:e.label.y}),LR(r,i))},t.prototype._renderHandle=function(t){if(!this._dragging&&this.updateHandleTransform){var e,n=this._axisPointerModel,i=this._api.getZr(),r=this._handle,o=n.getModel("handle"),a=n.get("status");if(!o.get("show")||!a||"hide"===a)return r&&i.remove(r),void(this._handle=null);this._handle||(e=!0,r=this._handle=Lh(o.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){se(t.event)},onmousedown:CR(this._onHandleDragMove,this,0,0),drift:CR(this._onHandleDragMove,this),ondragend:CR(this._onHandleDragEnd,this)}),i.add(r)),OR(r,n,!1),r.setStyle(o.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=o.get("size");Y(s)||(s=[s,s]),r.scaleX=s[0]/2,r.scaleY=s[1]/2,Dg(this,"_doDispatchAxisPointer",o.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},t.prototype._moveHandleToValue=function(t,e){AR(this._axisPointerModel,!e&&this._moveAnimation,this._handle,PR(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},t.prototype._onHandleDragMove=function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(PR(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(PR(i)),IR(n).lastProp=null,this._doDispatchAxisPointer()}},t.prototype._doDispatchAxisPointer=function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},t.prototype._onHandleDragEnd=function(){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},t.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),Ag(this,"_doDispatchAxisPointer")},t.prototype.doClear=function(){},t.prototype.buildLabel=function(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}},t}();function AR(t,e,n,i){kR(IR(n).lastProp,i)||(IR(n).lastProp=i,e?ih(n,i,t):(n.stopAnimation(),n.attr(i)))}function kR(t,e){if(q(t)&&q(e)){var n=!0;return E(e,(function(e,i){n=n&&kR(t[i],e)})),!!n}return t===e}function LR(t,e){t[e.get(["label","show"])?"show":"hide"]()}function PR(t){return{x:t.x||0,y:t.y||0,rotation:t.rotation||0}}function OR(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse((function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)}))}function RR(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function NR(t,e,n,i,r){var o=ER(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get(["label","precision"]),formatter:n.get(["label","formatter"])}),a=n.getModel("label"),s=np(a.get("padding")||0),l=a.getFont(),u=cr(o,l),h=r.position,c=u.width+s[1]+s[3],p=u.height+s[0]+s[2],d=r.align;"right"===d&&(h[0]-=c),"center"===d&&(h[0]-=c/2);var f=r.verticalAlign;"bottom"===f&&(h[1]-=p),"middle"===f&&(h[1]-=p/2),function(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}(h,c,p,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get(["axisLine","lineStyle","color"])),t.label={x:h[0],y:h[1],style:Yh(a,{text:o,font:l,fill:a.getTextColor(),padding:s,backgroundColor:g}),z2:10}}function ER(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel({value:t},{precision:r.precision}),a=r.formatter;if(a){var s={value:o_(e,{value:t}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};E(i,(function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)})),X(a)?o=a.replace("{value}",o):U(a)&&(o=a(s))}return o}function zR(t,e,n){var i=[1,0,0,1,0,0];return zi(i,i,n.rotation),Ei(i,i,n.position),Ih([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function VR(t,e,n,i,r,o){var a=BM.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get(["label","margin"]),NR(e,i,r,o,{position:zR(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function BR(t,e,n){return{x1:t[n=n||0],y1:t[1-n],x2:e[n],y2:e[1-n]}}function FR(t,e,n){return{x:t[n=n||0],y:t[1-n],width:e[n],height:e[1-n]}}function GR(t,e,n,i,r,o){return{cx:t,cy:e,r0:n,r:i,startAngle:r,endAngle:o,clockwise:!0}}var WR=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=HR(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=RR(i),c=YR[s](o,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}VR(e,t,AM(a.model,n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=AM(e.axis.grid.model,e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=zR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=HR(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=[t.x,t.y];u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{x:u[0],y:u[1],rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}},e}(DR);function HR(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}var YR={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:BR([e,n[0]],[e,n[1]],UR(t))}},shadow:function(t,e,n){var i=Math.max(1,t.getBandWidth()),r=n[1]-n[0];return{type:"Rect",shape:FR([e-i/2,n[0]],[i,r],UR(t))}}};function UR(t){return"x"===t.dim?0:1}var XR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="axisPointer",e.defaultOption={show:"auto",z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#B9BEC9",width:1,type:"dashed"},shadowStyle:{color:"rgba(210,219,238,0.2)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(Ip),ZR=So(),jR=E;function qR(t,e,n){if(!r.node){var i=e.getZr();ZR(i).records||(ZR(i).records={}),function(t,e){if(ZR(t).initialized)return;function n(n,i){t.on(n,(function(n){var r=function(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}(e);jR(ZR(t).records,(function(t){t&&i(t,n,r.dispatchAction)})),function(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]);n&&(n.dispatchAction=null,e.dispatchAction(n))}(r.pendings,e)}))}ZR(t).initialized=!0,n("click",H($R,"click")),n("mousemove",H($R,"mousemove")),n("globalout",KR)}(i,e),(ZR(i).records[t]||(ZR(i).records[t]={})).handler=n}}function KR(t,e,n){t.handler("leave",null,n)}function $R(t,e,n,i){e.handler(t,n,i)}function JR(t,e){if(!r.node){var n=e.getZr();(ZR(n).records||{})[t]&&(ZR(n).records[t]=null)}}var QR=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";qR("axisPointer",n,(function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})}))},e.prototype.remove=function(t,e){JR("axisPointer",e)},e.prototype.dispose=function(t,e){JR("axisPointer",e)},e.type="axisPointer",e}(fg);function tN(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=wo(o,t);if(null==a||a<0||Y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)if(t.isStacked){var u=l.getBaseAxis(),h=l.getOtherAxis(u).dim,c=u.dim,p="x"===h||"radius"===h?1:0,d=o.mapDimension(c),f=[];f[p]=o.get(d,a),f[1-p]=o.get(o.getCalculationInfo("stackResultDimension"),a),i=l.dataToPoint(f)||[]}else i=l.dataToPoint(o.getValues(z(l.dimensions,(function(t){return o.mapDimension(t)})),a))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),i=[g.x+g.width/2,g.y+g.height/2]}return{point:i,el:s}}var eN=So();function nN(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||W(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){sN(r)&&(r=tN({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=sN(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||sN(r),p={},d={},f={list:[],map:{}},g={showPointer:H(rN,d),showTooltip:H(oN,f)};E(s.coordSysMap,(function(t,e){var n=l||t.containPoint(r);E(s.coordSysAxesInfo[e],(function(t,e){var i=t.axis,o=function(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&iN(t,a,g,!1,p)}}))}));var y={};return E(h,(function(t,e){var n=t.linkGroup;n&&!d[e]&&E(n.axesInfo,(function(e,i){var r=d[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,aN(e),aN(t)))),y[t.key]=o}}))})),E(y,(function(t,e){iN(h[e],t,g,!0,p)})),function(t,e,n){var i=n.axesInfo=[];E(e,(function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})}))}(d,h,p),function(t,e,n,i){if(sN(e)||!t.list.length)return void i({type:"hideTip"});var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}(f,r,t,a),function(t,e,n){var i=n.getZr(),r="axisPointerLastHighlights",o=eN(i)[r]||{},a=eN(i)[r]={};E(t,(function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&E(n.seriesDataIndices,(function(t){var e=t.seriesIndex+" | "+t.dataIndex;a[e]=t}))}));var s=[],l=[];E(o,(function(t,e){!a[e]&&l.push(t)})),E(a,(function(t,e){!o[e]&&s.push(t)})),l.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,notBlur:!0,batch:s})}(h,0,n),p}}function iN(t,e,n,i,r){var o=t.axis;if(!o.scale.isBlank()&&o.containData(e))if(t.involveSeries){var a=function(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return E(e.seriesModels,(function(e,l){var u,h,c=e.getData().mapDimensionsAll(i);if(e.getAxisTooltipData){var p=e.getAxisTooltipData(c,t,n);h=p.dataIndices,u=p.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var d=t-u,f=Math.abs(d);f<=a&&((f=0&&s<0)&&(a=f,s=d,r=u,o.length=0),E(h,(function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})})))}})),{payloadBatch:o,snapToValue:r}}(e,t),s=a.payloadBatch,l=a.snapToValue;s[0]&&null==r.seriesIndex&&A(r,s[0]),!i&&t.snap&&o.containData(l)&&null!=l&&(e=l),n.showPointer(t,e,s),n.showTooltip(t,a,l)}else n.showPointer(t,e)}function rN(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function oN(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=KM(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get(["label","precision"]),formatter:s.get(["label","formatter"])},seriesDataIndices:r.slice()})}}function aN(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function sN(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function lN(t){JM.registerAxisPointerClass("CartesianAxisPointer",WR),t.registerComponentModel(XR),t.registerComponentView(QR),t.registerPreprocessor((function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!Y(e)&&(t.axisPointer.link=[e])}})),t.registerProcessor(t.PRIORITY.PROCESSOR.STATISTIC,(function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=UM(t,e)})),t.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},nN)}var uN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis;"angle"===o.dim&&(this.animationThreshold=Math.PI/18);var a=o.polar,s=a.getOtherAxis(o).getExtent(),l=o.dataToCoord(e),u=i.get("type");if(u&&"none"!==u){var h=RR(i),c=hN[u](o,a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}var p=function(t,e,n,i,r){var o=e.axis,a=o.dataToCoord(t),s=i.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l,u,h,c=i.getRadiusAxis().getExtent();if("radius"===o.dim){var p=[1,0,0,1,0,0];zi(p,p,s),Ei(p,p,[i.cx,i.cy]),l=Ih([a,-r],p);var d=e.getModel("axisLabel").get("rotate")||0,f=BM.innerTextLayout(s,d*Math.PI/180,-1);u=f.textAlign,h=f.textVerticalAlign}else{var g=c[1];l=i.coordToPoint([g+r,a]);var y=i.cx,v=i.cy;u=Math.abs(l[0]-y)/g<.3?"center":l[0]>y?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,n,0,a,i.get(["label","margin"]));NR(t,n,i,r,p)},e}(DR);var hN={line:function(t,e,n,i){return"angle"===t.dim?{type:"Line",shape:BR(e.coordToPoint([i[0],n]),e.coordToPoint([i[1],n]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:n}}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:GR(e.cx,e.cy,i[0],i[1],(-n-r/2)*o,(r/2-n)*o)}:{type:"Sector",shape:GR(e.cx,e.cy,n-r/2,n+r/2,0,2*Math.PI)}}},cN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.findAxisModel=function(t){var e;return this.ecModel.eachComponent(t,(function(t){t.getCoordSysModel()===this&&(e=t)}),this),e},e.type="polar",e.dependencies=["radiusAxis","angleAxis"],e.defaultOption={z:0,center:["50%","50%"],radius:"80%"},e}(Ip),pN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getCoordSysModel=function(){return this.getReferringComponents("polar",Co).models[0]},e.type="polarAxis",e}(Ip);R(pN,h_);var dN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="angleAxis",e}(pN),fN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="radiusAxis",e}(pN),gN=function(t){function e(e,n){return t.call(this,"radius",e,n)||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e}(G_);gN.prototype.dataToRadius=G_.prototype.dataToCoord,gN.prototype.radiusToData=G_.prototype.coordToData;var yN=So(),vN=function(t){function e(e,n){return t.call(this,"angle",e,n||[0,360])||this}return n(e,t),e.prototype.pointToData=function(t,e){return this.polar.pointToData(t,e)["radius"===this.dim?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,e=t.getLabelModel(),n=t.scale,i=n.getExtent(),r=n.count();if(i[1]-i[0]<1)return 0;var o=i[0],a=t.dataToCoord(o+1)-t.dataToCoord(o),s=Math.abs(a),l=cr(null==o?"":o+"",e.getFont(),"center","top"),u=Math.max(l.height,7)/s;isNaN(u)&&(u=1/0);var h=Math.max(0,Math.floor(u)),c=yN(t.model),p=c.lastAutoInterval,d=c.lastTickCount;return null!=p&&null!=d&&Math.abs(p-h)<=1&&Math.abs(d-r)<=1&&p>h?h=p:(c.lastTickCount=r,c.lastAutoInterval=h),h},e}(G_);vN.prototype.dataToAngle=G_.prototype.dataToCoord,vN.prototype.angleToData=G_.prototype.coordToData;var mN=["radius","angle"],xN=function(){function t(t){this.dimensions=mN,this.type="polar",this.cx=0,this.cy=0,this._radiusAxis=new gN,this._angleAxis=new vN,this.axisPointerEnabled=!0,this.name=t||"",this._radiusAxis.polar=this._angleAxis.polar=this}return t.prototype.containPoint=function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},t.prototype.containData=function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},t.prototype.getAxis=function(t){return this["_"+t+"Axis"]},t.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},t.prototype.getAxesByScale=function(t){var e=[],n=this._angleAxis,i=this._radiusAxis;return n.scale.type===t&&e.push(n),i.scale.type===t&&e.push(i),e},t.prototype.getAngleAxis=function(){return this._angleAxis},t.prototype.getRadiusAxis=function(){return this._radiusAxis},t.prototype.getOtherAxis=function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},t.prototype.getBaseAxis=function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},t.prototype.getTooltipAxes=function(t){var e=null!=t&&"auto"!==t?this.getAxis(t):this.getBaseAxis();return{baseAxes:[e],otherAxes:[this.getOtherAxis(e)]}},t.prototype.dataToPoint=function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},t.prototype.pointToData=function(t,e){var n=this.pointToCoord(t);return[this._radiusAxis.radiusToData(n[0],e),this._angleAxis.angleToData(n[1],e)]},t.prototype.pointToCoord=function(t){var e=t[0]-this.cx,n=t[1]-this.cy,i=this.getAngleAxis(),r=i.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);i.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+n*n);e/=s,n/=s;for(var l=Math.atan2(-n,e)/Math.PI*180,u=la;)l+=360*u;return[s,l]},t.prototype.coordToPoint=function(t){var e=t[0],n=t[1]/180*Math.PI;return[Math.cos(n)*e+this.cx,-Math.sin(n)*e+this.cy]},t.prototype.getArea=function(){var t=this.getAngleAxis(),e=this.getRadiusAxis().getExtent().slice();e[0]>e[1]&&e.reverse();var n=t.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:t.inverse,contain:function(t,e){var n=t-this.cx,i=e-this.cy,r=n*n+i*i-1e-4,o=this.r,a=this.r0;return r<=o*o&&r>=a*a}}},t.prototype.convertToPixel=function(t,e,n){return _N(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return _N(e)===this?this.pointToData(n):null},t}();function _N(t){var e=t.seriesModel,n=t.polarModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}function bN(t,e){var n=this,i=n.getAngleAxis(),r=n.getRadiusAxis();if(i.scale.setExtent(1/0,-1/0),r.scale.setExtent(1/0,-1/0),t.eachSeries((function(t){if(t.coordinateSystem===n){var e=t.getData();E(u_(e,"radius"),(function(t){r.scale.unionExtentFromData(e,t)})),E(u_(e,"angle"),(function(t){i.scale.unionExtentFromData(e,t)}))}})),n_(i.scale,i.model),n_(r.scale,r.model),"category"===i.type&&!i.onBand){var o=i.getExtent(),a=360/i.scale.count();i.inverse?o[1]+=a:o[1]-=a,i.setExtent(o[0],o[1])}}function wN(t,e){if(t.type=e.get("type"),t.scale=i_(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),function(t){return"angleAxis"===t.mainType}(e)){t.inverse=t.inverse!==e.get("clockwise");var n=e.get("startAngle");t.setExtent(n,n+(t.inverse?-360:360))}e.axis=t,t.model=e}var SN={dimensions:mN,create:function(t,e){var n=[];return t.eachComponent("polar",(function(t,i){var r=new xN(i+"");r.update=bN;var o=r.getRadiusAxis(),a=r.getAngleAxis(),s=t.findAxisModel("radiusAxis"),l=t.findAxisModel("angleAxis");wN(o,s),wN(a,l),function(t,e,n){var i=e.get("center"),r=n.getWidth(),o=n.getHeight();t.cx=Er(i[0],r),t.cy=Er(i[1],o);var a=t.getRadiusAxis(),s=Math.min(r,o)/2,l=e.get("radius");null==l?l=[0,"100%"]:Y(l)||(l=[0,l]);var u=[Er(l[0],s),Er(l[1],s)];a.inverse?a.setExtent(u[1],u[0]):a.setExtent(u[0],u[1])}(r,t,e),n.push(r),t.coordinateSystem=r,r.model=t})),t.eachSeries((function(t){if("polar"===t.get("coordinateSystem")){var e=t.getReferringComponents("polar",Co).models[0];0,t.coordinateSystem=e.coordinateSystem}})),n}},MN=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function IN(t,e,n){e[1]>e[0]&&(e=e.slice().reverse());var i=t.coordToPoint([e[0],n]),r=t.coordToPoint([e[1],n]);return{x1:i[0],y1:i[1],x2:r[0],y2:r[1]}}function TN(t){return t.getRadiusAxis().inverse?0:1}function CN(t){var e=t[0],n=t[t.length-1];e&&n&&Math.abs(Math.abs(e.coord-n.coord)-360)<1e-4&&t.pop()}var DN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="PolarAxisPointer",n}return n(e,t),e.prototype.render=function(t,e){if(this.group.removeAll(),t.get("show")){var n=t.axis,i=n.polar,r=i.getRadiusAxis().getExtent(),o=n.getTicksCoords(),a=n.getMinorTicksCoords(),s=z(n.getViewLabels(),(function(t){t=T(t);var e=n.scale,i="ordinal"===e.type?e.getRawOrdinalNumber(t.tickValue):t.tickValue;return t.coord=n.dataToCoord(i),t}));CN(s),CN(o),E(MN,(function(e){!t.get([e,"show"])||n.scale.isBlank()&&"axisLine"!==e||AN[e](this.group,t,i,o,a,r,s)}),this)}},e.type="angleAxis",e}(JM),AN={axisLine:function(t,e,n,i,r,o){var a,s=e.getModel(["axisLine","lineStyle"]),l=TN(n),u=l?0:1;(a=0===o[u]?new uu({shape:{cx:n.cx,cy:n.cy,r:o[l]},style:s.getLineStyle(),z2:1,silent:!0}):new Du({shape:{cx:n.cx,cy:n.cy,r:o[l],r0:o[u]},style:s.getLineStyle(),z2:1,silent:!0})).style.fill=null,t.add(a)},axisTick:function(t,e,n,i,r,o){var a=e.getModel("axisTick"),s=(a.get("inside")?-1:1)*a.get("length"),l=o[TN(n)],u=z(i,(function(t){return new Eu({shape:IN(n,[l,l+s],t.coord)})}));t.add(bh(u,{style:k(a.getModel("lineStyle").getLineStyle(),{stroke:e.get(["axisLine","lineStyle","color"])})}))},minorTick:function(t,e,n,i,r,o){if(r.length){for(var a=e.getModel("axisTick"),s=e.getModel("minorTick"),l=(a.get("inside")?-1:1)*s.get("length"),u=o[TN(n)],h=[],c=0;cf?"left":"right",v=Math.abs(d[1]-g)/p<.3?"middle":d[1]>g?"top":"bottom";if(s&&s[c]){var m=s[c];q(m)&&m.textStyle&&(a=new pc(m.textStyle,l,l.ecModel))}var x=new As({silent:BM.isLabelSilent(e),style:Yh(a,{x:d[0],y:d[1],fill:a.getTextColor()||e.get(["axisLine","lineStyle","color"]),text:i.formattedLabel,align:y,verticalAlign:v})});if(t.add(x),h){var _=BM.makeAxisEventDataBase(e);_.targetType="axisLabel",_.value=i.rawLabel,Ws(x).eventData=_}}),this)},splitLine:function(t,e,n,i,r,o){var a=e.getModel("splitLine").getModel("lineStyle"),s=a.get("color"),l=0;s=s instanceof Array?s:[s];for(var u=[],h=0;h=0?"p":"n",T=_;m&&(i[s][M]||(i[s][M]={p:_,n:_}),T=i[s][M][I]);var C=void 0,D=void 0,A=void 0,k=void 0;if("radius"===c.dim){var L=c.dataToCoord(S)-_,P=o.dataToCoord(M);Math.abs(L)=k})}}}))}var zN={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},VN={splitNumber:5},BN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="polar",e}(fg);function FN(t,e){e=e||{};var n=t.coordinateSystem,i=t.axis,r={},o=i.position,a=i.orient,s=n.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};r.position=["vertical"===a?u.vertical[o]:l[0],"horizontal"===a?u.horizontal[o]:l[3]];r.rotation=Math.PI/2*{horizontal:0,vertical:1}[a];r.labelDirection=r.tickDirection=r.nameDirection={top:-1,bottom:1,right:1,left:-1}[o],t.get(["axisTick","inside"])&&(r.tickDirection=-r.tickDirection),it(e.labelInside,t.get(["axisLabel","inside"]))&&(r.labelDirection=-r.labelDirection);var h=e.rotate;return null==h&&(h=t.get(["axisLabel","rotate"])),r.labelRotation="top"===o?-h:h,r.z2=1,r}var GN=["axisLine","axisTickLabel","axisName"],WN=["splitArea","splitLine"],HN=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.axisPointerClass="SingleAxisPointer",n}return n(e,t),e.prototype.render=function(e,n,i,r){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Cr;var s=FN(e),l=new BM(e,s);E(GN,l.add,l),o.add(this._axisGroup),o.add(l.getGroup()),E(WN,(function(t){e.get([t,"show"])&&YN[t](this,this.group,this._axisGroup,e)}),this),Dh(a,this._axisGroup,e),t.prototype.render.call(this,e,n,i,r)},e.prototype.remove=function(){eI(this)},e.type="singleAxis",e}(JM),YN={splitLine:function(t,e,n,i){var r=i.axis;if(!r.scale.isBlank()){var o=i.getModel("splitLine"),a=o.getModel("lineStyle"),s=a.get("color");s=s instanceof Array?s:[s];for(var l=i.coordinateSystem.getRect(),u=r.isHorizontal(),h=[],c=0,p=r.getTicksCoords({tickModel:o}),d=[],f=[],g=0;g=e.y&&t[1]<=e.y+e.height:n.contain(n.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},t.prototype.pointToData=function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},t.prototype.dataToPoint=function(t){var e=this.getAxis(),n=this.getRect(),i=[],r="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),i[r]=e.toGlobalCoord(e.dataToCoord(+t)),i[1-r]=0===r?n.y+n.height/2:n.x+n.width/2,i},t.prototype.convertToPixel=function(t,e,n){return qN(e)===this?this.dataToPoint(n):null},t.prototype.convertFromPixel=function(t,e,n){return qN(e)===this?this.pointToData(n):null},t}();function qN(t){var e=t.seriesModel,n=t.singleAxisModel;return n&&n.coordinateSystem||e&&e.coordinateSystem}var KN={create:function(t,e){var n=[];return t.eachComponent("singleAxis",(function(i,r){var o=new jN(i,t,e);o.name="single_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)})),t.eachSeries((function(t){if("singleAxis"===t.get("coordinateSystem")){var e=t.getReferringComponents("singleAxis",Co).models[0];t.coordinateSystem=e&&e.coordinateSystem}})),n},dimensions:ZN},$N=["x","y"],JN=["width","height"],QN=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.makeElOption=function(t,e,n,i,r){var o=n.axis,a=o.coordinateSystem,s=nE(a,1-eE(o)),l=a.dataToPoint(e)[0],u=i.get("type");if(u&&"none"!==u){var h=RR(i),c=tE[u](o,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}VR(e,t,FN(n),n,i,r)},e.prototype.getHandleTransform=function(t,e,n){var i=FN(e,{labelInside:!1});i.labelMargin=n.get(["handle","margin"]);var r=zR(e.axis,t,i);return{x:r[0],y:r[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,e,n,i){var r=n.axis,o=r.coordinateSystem,a=eE(r),s=nE(o,a),l=[t.x,t.y];l[a]+=e[a],l[a]=Math.min(s[1],l[a]),l[a]=Math.max(s[0],l[a]);var u=nE(o,1-a),h=(u[1]+u[0])/2,c=[h,h];return c[a]=l[a],{x:l[0],y:l[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}},e}(DR),tE={line:function(t,e,n){return{type:"Line",subPixelOptimize:!0,shape:BR([e,n[0]],[e,n[1]],eE(t))}},shadow:function(t,e,n){var i=t.getBandWidth(),r=n[1]-n[0];return{type:"Rect",shape:FR([e-i/2,n[0]],[i,r],eE(t))}}};function eE(t){return t.isHorizontal()?0:1}function nE(t,e){var n=t.getRect();return[n[$N[e]],n[$N[e]]+n[JN[e]]]}var iE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="single",e}(fg);var rE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(e,n,i){var r=wp(e);t.prototype.init.apply(this,arguments),oE(e,r)},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),oE(this.option,e)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type="calendar",e.defaultOption={z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},e}(Ip);function oE(t,e){var n,i=t.cellSize;1===(n=Y(i)?i:t.cellSize=[i,i]).length&&(n[1]=n[0]);var r=z([0,1],(function(t){return function(t,e){return null!=t[gp[e][0]]||null!=t[gp[e][1]]&&null!=t[gp[e][2]]}(e,t)&&(n[t]="auto"),null!=n[t]&&"auto"!==n[t]}));bp(t,e,{type:"box",ignoreSize:r})}var aE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){var i=this.group;i.removeAll();var r=t.coordinateSystem,o=r.getRangeInfo(),a=r.getOrient(),s=e.getLocaleModel();this._renderDayRect(t,o,i),this._renderLines(t,o,a,i),this._renderYearText(t,o,a,i),this._renderMonthText(t,s,a,i),this._renderWeekText(t,s,o,a,i)},e.prototype._renderDayRect=function(t,e,n){for(var i=t.coordinateSystem,r=t.getModel("itemStyle").getItemStyle(),o=i.getCellWidth(),a=i.getCellHeight(),s=e.start.time;s<=e.end.time;s=i.getNextNDay(s,1).time){var l=i.dataToRect([s],!1).tl,u=new Ts({shape:{x:l[0],y:l[1],width:o,height:a},cursor:"default",style:r});n.add(u)}},e.prototype._renderLines=function(t,e,n,i){var r=this,o=t.coordinateSystem,a=t.getModel(["splitLine","lineStyle"]).getLineStyle(),s=t.get(["splitLine","show"]),l=a.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=e.start,h=0;u.time<=e.end.time;h++){p(u.formatedDate),0===h&&(u=o.getDateInfo(e.start.y+"-"+e.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=o.getDateInfo(c)}function p(e){r._firstDayOfMonth.push(o.getDateInfo(e)),r._firstDayPoints.push(o.dataToRect([e],!1).tl);var l=r._getLinePointsOfOneWeek(t,e,n);r._tlpoints.push(l[0]),r._blpoints.push(l[l.length-1]),s&&r._drawSplitline(l,a,i)}p(o.getNextNDay(e.end.time,1).formatedDate),s&&this._drawSplitline(r._getEdgesPoints(r._tlpoints,l,n),a,i),s&&this._drawSplitline(r._getEdgesPoints(r._blpoints,l,n),a,i)},e.prototype._getEdgesPoints=function(t,e,n){var i=[t[0].slice(),t[t.length-1].slice()],r="horizontal"===n?0:1;return i[0][r]=i[0][r]-e/2,i[1][r]=i[1][r]+e/2,i},e.prototype._drawSplitline=function(t,e,n){var i=new Ou({z2:20,shape:{points:t},style:e});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,e,n){for(var i=t.coordinateSystem,r=i.getDateInfo(e),o=[],a=0;a<7;a++){var s=i.getNextNDay(r.time,a),l=i.dataToRect([s.time],!1);o[2*s.day]=l.tl,o[2*s.day+1]=l["horizontal"===n?"bl":"tr"]}return o},e.prototype._formatterLabel=function(t,e){return X(t)&&t?(n=t,E(e,(function(t,e){n=n.replace("{"+e+"}",i?op(t):t)})),n):U(t)?t(e):e.nameMap;var n,i},e.prototype._yearTextPositionControl=function(t,e,n,i,r){var o=e[0],a=e[1],s=["center","bottom"];"bottom"===i?(a+=r,s=["center","top"]):"left"===i?o-=r:"right"===i?(o+=r,s=["center","top"]):a-=r;var l=0;return"left"!==i&&"right"!==i||(l=Math.PI/2),{rotation:l,x:o,y:a,style:{align:s[0],verticalAlign:s[1]}}},e.prototype._renderYearText=function(t,e,n,i){var r=t.getModel("yearLabel");if(r.get("show")){var o=r.get("margin"),a=r.get("position");a||(a="horizontal"!==n?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===n?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},p=e.start.y;+e.end.y>+e.start.y&&(p=p+"-"+e.end.y);var d=r.get("formatter"),f={start:e.start.y,end:e.end.y,nameMap:p},g=this._formatterLabel(d,f),y=new As({z2:30,style:Yh(r,{text:g})});y.attr(this._yearTextPositionControl(y,c[a],n,a,o)),i.add(y)}},e.prototype._monthTextPositionControl=function(t,e,n,i,r){var o="left",a="top",s=t[0],l=t[1];return"horizontal"===n?(l+=r,e&&(o="center"),"start"===i&&(a="bottom")):(s+=r,e&&(a="middle"),"start"===i&&(o="right")),{x:s,y:l,align:o,verticalAlign:a}},e.prototype._renderMonthText=function(t,e,n,i){var r=t.getModel("monthLabel");if(r.get("show")){var o=r.get("nameMap"),a=r.get("margin"),s=r.get("position"),l=r.get("align"),u=[this._tlpoints,this._blpoints];o&&!X(o)||(o&&(e=Sc(o)||e),o=e.get(["time","monthAbbr"])||[]);var h="start"===s?0:1,c="horizontal"===n?0:1;a="start"===s?-a:a;for(var p="center"===l,d=0;d=i.start.time&&n.timea.end.time&&t.reverse(),t},t.prototype._getRangeInfo=function(t){var e,n=[this.getDateInfo(t[0]),this.getDateInfo(t[1])];n[0].time>n[1].time&&(e=!0,n.reverse());var i=Math.floor(n[1].time/sE)-Math.floor(n[0].time/sE)+1,r=new Date(n[0].time),o=r.getDate(),a=n[1].date.getDate();r.setDate(o+i-1);var s=r.getDate();if(s!==a)for(var l=r.getTime()-n[1].time>0?1:-1;(s=r.getDate())!==a&&(r.getTime()-n[1].time)*l>0;)i-=l,r.setDate(s-l);var u=Math.floor((i+n[0].day+6)/7),h=e?1-u:u-1;return e&&n.reverse(),{range:[n[0].formatedDate,n[1].formatedDate],start:n[0],end:n[1],allDay:i,weeks:u,nthWeek:h,fweek:n[0].day,lweek:n[1].day}},t.prototype._getDateByWeeksAndDay=function(t,e,n){var i=this._getRangeInfo(n);if(t>i.weeks||0===t&&ei.lweek)return null;var r=7*(t-1)-i.fweek+e,o=new Date(i.start.time);return o.setDate(+i.start.d+r),this.getDateInfo(o)},t.create=function(e,n){var i=[];return e.eachComponent("calendar",(function(r){var o=new t(r,e,n);i.push(o),r.coordinateSystem=o})),e.eachSeries((function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("calendarIndex")||0])})),i},t.dimensions=["time","value"],t}();function uE(t){var e=t.calendarModel,n=t.seriesModel;return e?e.coordinateSystem:n?n.coordinateSystem:null}function hE(t,e){var n;return E(e,(function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)})),n}var cE=["transition","enterFrom","leaveTo"],pE=cE.concat(["enterAnimation","updateAnimation","leaveAnimation"]);function dE(t,e,n){if(n&&(!t[n]&&e[n]&&(t[n]={}),t=t[n],e=e[n]),t&&e)for(var i=n?cE:pE,r=0;r=0;l--){var p,d,f;if(f=null!=(d=xo((p=n[l]).id,null))?r.get(d):null){var g=f.parent,y=(c=yE(g),{}),v=xp(f,p,g===i?{width:o,height:a}:{width:c.width,height:c.height},null,{hv:p.hv,boundingMode:p.bounding},y);if(!yE(f).isNew&&v){for(var m=p.transition,x={},_=0;_=0)?x[b]=w:f[b]=w}ih(f,x,t,0)}else f.attr(y)}}},e.prototype._clear=function(){var t=this,e=this._elMap;e.each((function(n){_E(n,yE(n).option,e,t._lastGraphicModel)})),this._elMap=ft()},e.prototype.dispose=function(){this._clear()},e.type="graphic",e}(fg);function mE(t){var e=mt(gE,t)?gE[t]:vh(t);var n=new e({});return yE(n).type=t,n}function xE(t,e,n,i){var r=mE(n);return e.add(r),i.set(t,r),yE(r).id=t,yE(r).isNew=!0,r}function _E(t,e,n,i){t&&t.parent&&("group"===t.type&&t.traverse((function(t){_E(t,e,n,i)})),VO(t,e,i),n.removeKey(yE(t).id))}function bE(t,e,n,i){if(!t.isGroup){var r=t;r.z=rt(e.z,n||0),r.zlevel=rt(e.zlevel,i||0);var o=e.z2;null!=o&&(r.z2=o||0)}E(G(e),(function(n){var i=e[n];0===n.indexOf("on")&&U(i)&&(t[n]=i)})),t.draggable=e.draggable,null!=e.name&&(t.name=e.name),null!=e.id&&(t.id=e.id)}var wE=["x","y","radius","angle","single"],SE=["cartesian2d","polar","singleAxis"];function ME(t){return t+"Axis"}function IE(t,e){var n,i=ft(),r=[],o=ft();t.eachComponent({mainType:"dataZoom",query:e},(function(t){o.get(t.uid)||s(t)}));do{n=!1,t.eachComponent("dataZoom",a)}while(n);function a(t){!o.get(t.uid)&&function(t){var e=!1;return t.eachTargetAxis((function(t,n){var r=i.get(t);r&&r[n]&&(e=!0)})),e}(t)&&(s(t),n=!0)}function s(t){o.set(t.uid,!0),r.push(t),t.eachTargetAxis((function(t,e){(i.get(t)||i.set(t,[]))[e]=!0}))}return r}function TE(t){var e=t.ecModel,n={infoList:[],infoMap:ft()};return t.eachTargetAxis((function(t,i){var r=e.getComponent(ME(t),i);if(r){var o=r.getCoordSysModel();if(o){var a=o.uid,s=n.infoMap.get(a);s||(s={model:o,axisModels:[]},n.infoList.push(s),n.infoMap.set(a,s)),s.axisModels.push(r)}}})),n}var CE=function(){function t(){this.indexList=[],this.indexMap=[]}return t.prototype.add=function(t){this.indexMap[t]||(this.indexList.push(t),this.indexMap[t]=!0)},t}(),DE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._autoThrottle=!0,n._noTarget=!0,n._rangePropMode=["percent","percent"],n}return n(e,t),e.prototype.init=function(t,e,n){var i=AE(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var e=AE(t);C(this.option,t,!0),C(this.settledOption,e,!0),this._doInit(e)},e.prototype._doInit=function(t){var e=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(t,i){"value"===this._rangePropMode[i]&&(e[t[0]]=n[t[0]]=null)}),this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get("orient",!0),e=this._targetAxisInfoMap=ft();this._fillSpecifiedTargetAxis(e)?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||"horizontal",this._fillAutoTargetAxisByOrient(e,this._orient)),this._noTarget=!0,e.each((function(t){t.indexList.length&&(this._noTarget=!1)}),this)},e.prototype._fillSpecifiedTargetAxis=function(t){var e=!1;return E(wE,(function(n){var i=this.getReferringComponents(ME(n),Do);if(i.specified){e=!0;var r=new CE;E(i.models,(function(t){r.add(t.componentIndex)})),t.set(n,r)}}),this),e},e.prototype._fillAutoTargetAxisByOrient=function(t,e){var n=this.ecModel,i=!0;if(i){var r="vertical"===e?"y":"x";o(n.findComponents({mainType:r+"Axis"}),r)}i&&o(n.findComponents({mainType:"singleAxis",filter:function(t){return t.get("orient",!0)===e}}),"single");function o(e,n){var r=e[0];if(r){var o=new CE;if(o.add(r.componentIndex),t.set(n,o),i=!1,"x"===n||"y"===n){var a=r.getReferringComponents("grid",Co).models[0];a&&E(e,(function(t){r.componentIndex!==t.componentIndex&&a===t.getReferringComponents("grid",Co).models[0]&&o.add(t.componentIndex)}))}}}i&&E(wE,(function(e){if(i){var r=n.findComponents({mainType:ME(e),filter:function(t){return"category"===t.get("type",!0)}});if(r[0]){var o=new CE;o.add(r[0].componentIndex),t.set(e,o),i=!1}}}),this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis((function(e){!t&&(t=e)}),this),"y"===t?"vertical":"horizontal"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var e=this._rangePropMode,n=this.get("rangeMode");E([["start","startValue"],["end","endValue"]],(function(i,r){var o=null!=t[i[0]],a=null!=t[i[1]];o&&!a?e[r]="percent":!o&&a?e[r]="value":n?e[r]=n[r]:o&&(e[r]="percent")}))},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis((function(e,n){null==t&&(t=this.ecModel.getComponent(ME(e),n))}),this),t},e.prototype.eachTargetAxis=function(t,e){this._targetAxisInfoMap.each((function(n,i){E(n.indexList,(function(n){t.call(e,i,n)}))}))},e.prototype.getAxisProxy=function(t,e){var n=this.getAxisModel(t,e);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,e){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[e])return this.ecModel.getComponent(ME(t),e)},e.prototype.setRawRange=function(t){var e=this.option,n=this.settledOption;E([["start","startValue"],["end","endValue"]],(function(i){null==t[i[0]]&&null==t[i[1]]||(e[i[0]]=n[i[0]]=t[i[0]],e[i[1]]=n[i[1]]=t[i[1]])}),this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var e=this.option;E(["start","startValue","end","endValue"],(function(n){e[n]=t[n]}))},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var e,n=this._targetAxisInfoMap.keys(),i=0;i=0}(e)){var n=ME(this._dimName),i=e.getReferringComponents(n,Co).models[0];i&&this._axisIndex===i.componentIndex&&t.push(e)}}),this),t},t.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},t.prototype.getMinMaxSpan=function(){return T(this._minMaxSpan)},t.prototype.calculateDataWindow=function(t){var e,n=this._dataExtent,i=this.getAxisModel().axis.scale,r=this._dataZoomModel.getRangePropMode(),o=[0,100],a=[],s=[];OE(["start","end"],(function(l,u){var h=t[l],c=t[l+"Value"];"percent"===r[u]?(null==h&&(h=o[u]),c=i.parse(Nr(h,o,n))):(e=!0,h=Nr(c=null==c?n[u]:i.parse(c),n,o)),s[u]=c,a[u]=h})),RE(s),RE(a);var l=this._minMaxSpan;function u(t,e,n,r,o){var a=o?"Span":"ValueSpan";sk(0,t,n,"all",l["min"+a],l["max"+a]);for(var s=0;s<2;s++)e[s]=Nr(t[s],n,r,!0),o&&(e[s]=i.parse(e[s]))}return e?u(s,a,n,o,!1):u(a,s,o,n,!0),{valueWindow:s,percentWindow:a}},t.prototype.reset=function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=function(t,e,n){var i=[1/0,-1/0];OE(n,(function(t){!function(t,e,n){e&&E(u_(e,n),(function(n){var i=e.getApproximateExtent(n);i[0]t[1]&&(t[1]=i[1])}))}(i,t.getData(),e)}));var r=t.getAxisModel(),o=Qx(r.axis.scale,r,i).calculate();return[o.min,o.max]}(this,this._dimName,e),this._updateMinMaxSpan();var n=this.calculateDataWindow(t.settledOption);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,this._setAxisModel()}},t.prototype.filterData=function(t,e){if(t===this._dataZoomModel){var n=this._dimName,i=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow;"none"!==r&&OE(i,(function(t){var e=t.getData(),i=e.mapDimensionsAll(n);if(i.length){if("weakFilter"===r){var a=e.getStore(),s=z(i,(function(t){return e.getDimensionIndex(t)}),e);e.filterSelf((function(t){for(var e,n,r,l=0;lo[1];if(h&&!c&&!p)return!0;h&&(r=!0),c&&(e=!0),p&&(n=!0)}return r&&e&&n}))}else OE(i,(function(n){if("empty"===r)t.setData(e=e.map(n,(function(t){return function(t){return t>=o[0]&&t<=o[1]}(t)?t:NaN})));else{var i={};i[n]=o,e.selectRange(i)}}));OE(i,(function(t){e.setApproximateExtent(o,t)}))}}))}},t.prototype._updateMinMaxSpan=function(){var t=this._minMaxSpan={},e=this._dataZoomModel,n=this._dataExtent;OE(["min","max"],(function(i){var r=e.get(i+"Span"),o=e.get(i+"ValueSpan");null!=o&&(o=this.getAxisModel().axis.scale.parse(o)),null!=o?r=Nr(n[0]+o,n,[0,100],!0):null!=r&&(o=Nr(r,[0,100],n,!0)-n[0]),t[i+"Span"]=r,t[i+"ValueSpan"]=o}),this)},t.prototype._setAxisModel=function(){var t=this.getAxisModel(),e=this._percentWindow,n=this._valueWindow;if(e){var i=Gr(n,[0,500]);i=Math.min(i,20);var r=t.axis.scale.rawExtentInfo;0!==e[0]&&r.setDeterminedMinMax("min",+n[0].toFixed(i)),100!==e[1]&&r.setDeterminedMinMax("max",+n[1].toFixed(i)),r.freeze()}},t}();var EE={getTargetSeries:function(t){function e(e){t.eachComponent("dataZoom",(function(n){n.eachTargetAxis((function(i,r){var o=t.getComponent(ME(i),r);e(i,r,o,n)}))}))}e((function(t,e,n,i){n.__dzAxisProxy=null}));var n=[];e((function(e,i,r,o){r.__dzAxisProxy||(r.__dzAxisProxy=new NE(e,i,o,t),n.push(r.__dzAxisProxy))}));var i=ft();return E(n,(function(t){E(t.getTargetSeriesModels(),(function(t){i.set(t.uid,t)}))})),i},overallReset:function(t,e){t.eachComponent("dataZoom",(function(t){t.eachTargetAxis((function(e,n){t.getAxisProxy(e,n).reset(t)})),t.eachTargetAxis((function(n,i){t.getAxisProxy(n,i).filterData(t,e)}))})),t.eachComponent("dataZoom",(function(t){var e=t.findRepresentativeAxisProxy();if(e){var n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}}))}};var zE=!1;function VE(t){zE||(zE=!0,t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,EE),function(t){t.registerAction("dataZoom",(function(t,e){E(IE(e,t),(function(e){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})}))}))}(t),t.registerSubTypeDefaulter("dataZoom",(function(){return"slider"})))}function BE(t){t.registerComponentModel(kE),t.registerComponentView(PE),VE(t)}var FE=function(){},GE={};function WE(t,e){GE[t]=e}function HE(t){return GE[t]}var YE=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(){t.prototype.optionUpdated.apply(this,arguments);var e=this.ecModel;E(this.option.feature,(function(t,n){var i=HE(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(e)),C(t,i.defaultOption))}))},e.type="toolbox",e.layoutMode={type:"box",ignoreSize:!0},e.defaultOption={show:!0,z:6,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}},tooltip:{show:!1,position:"bottom"}},e}(Ip);function UE(t,e){var n=np(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new Ts({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}var XE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){var r=this.group;if(r.removeAll(),t.get("show")){var o=+t.get("itemSize"),a=t.get("feature")||{},s=this._features||(this._features={}),l=[];E(a,(function(t,e){l.push(e)})),new Sm(this._featureNames||[],l).add(u).update(u).remove(H(u,null)).execute(),this._featureNames=l,function(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=mp(i,o,r);vp(e.get("orient"),t,e.get("itemGap"),a.width,a.height),xp(t,i,o,r)}(r,t,n),r.add(UE(r.getBoundingRect(),t)),r.eachChild((function(t){var e=t.__title,i=t.ensureState("emphasis"),a=i.textConfig||(i.textConfig={}),s=t.getTextContent(),l=s&&s.states.emphasis;if(l&&!U(l)&&e){var u=l.style||(l.style={}),h=cr(e,As.makeFont(u)),c=t.x+r.x,p=!1;t.y+r.y+o+h.height>n.getHeight()&&(a.position="top",p=!0);var d=p?-5-h.height:o+8;c+h.width/2>n.getWidth()?(a.position=["100%",d],u.align="right"):c-h.width/2<0&&(a.position=[0,d],u.align="left")}}))}function u(u,h){var c,p=l[u],d=l[h],f=a[p],g=new pc(f,t,t.ecModel);if(i&&null!=i.newTitle&&i.featureName===p&&(f.title=i.newTitle),p&&!d){if(function(t){return 0===t.indexOf("my")}(p))c={onclick:g.option.onclick,featureName:p};else{var y=HE(p);if(!y)return;c=new y}s[p]=c}else if(!(c=s[d]))return;c.uid=fc("toolbox-feature"),c.model=g,c.ecModel=e,c.api=n;var v=c instanceof FE;p||!d?!g.get("show")||v&&c.unusable?v&&c.remove&&c.remove(e,n):(!function(i,a,s){var l,u,h=i.getModel("iconStyle"),c=i.getModel(["emphasis","iconStyle"]),p=a instanceof FE&&a.getIcons?a.getIcons():i.get("icon"),d=i.get("title")||{};X(p)?(l={})[s]=p:l=p;X(d)?(u={})[s]=d:u=d;var f=i.iconPaths={};E(l,(function(s,l){var p=Lh(s,{},{x:-o/2,y:-o/2,width:o,height:o});p.setStyle(h.getItemStyle()),p.ensureState("emphasis").style=c.getItemStyle();var d=new As({style:{text:u[l],align:c.get("textAlign"),borderRadius:c.get("textBorderRadius"),padding:c.get("textPadding"),fill:null},ignore:!0});p.setTextContent(d),Nh({el:p,componentModel:t,itemName:l,formatterParamsExtra:{title:u[l]}}),p.__title=u[l],p.on("mouseover",(function(){var e=c.getItemStyle(),n="vertical"===t.get("orient")?null==t.get("right")?"right":"left":null==t.get("bottom")?"bottom":"top";d.setStyle({fill:c.get("textFill")||e.fill||e.stroke||"#000",backgroundColor:c.get("textBackgroundColor")}),p.setTextConfig({position:c.get("textPosition")||n}),d.ignore=!t.get("showTitle"),xl(this)})).on("mouseout",(function(){"emphasis"!==i.get(["iconStatus",l])&&_l(this),d.hide()})),("emphasis"===i.get(["iconStatus",l])?xl:_l)(p),r.add(p),p.on("click",W(a.onclick,a,e,n,l)),f[l]=p}))}(g,c,p),g.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&("emphasis"===e?xl:_l)(i[t])},c instanceof FE&&c.render&&c.render(g,e,n,i)):v&&c.dispose&&c.dispose(e,n)}},e.prototype.updateView=function(t,e,n,i){E(this._features,(function(t){t instanceof FE&&t.updateView&&t.updateView(t.model,e,n,i)}))},e.prototype.remove=function(t,e){E(this._features,(function(n){n instanceof FE&&n.remove&&n.remove(t,e)})),this.group.removeAll()},e.prototype.dispose=function(t,e){E(this._features,(function(n){n instanceof FE&&n.dispose&&n.dispose(t,e)}))},e.type="toolbox",e}(fg);var ZE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",o="svg"===e.getZr().painter.getType(),a=o?"svg":n.get("type",!0)||"png",s=e.getConnectedDataURL({type:a,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:n.get("connectedBackgroundColor"),excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")}),l=r.browser;if(U(MouseEvent)&&(l.newEdge||!l.ie&&!l.edge)){var u=document.createElement("a");u.download=i+"."+a,u.target="_blank",u.href=s;var h=new MouseEvent("click",{view:document.defaultView,bubbles:!0,cancelable:!1});u.dispatchEvent(h)}else if(window.navigator.msSaveOrOpenBlob||o){var c=s.split(","),p=c[0].indexOf("base64")>-1,d=o?decodeURIComponent(c[1]):c[1];p&&(d=window.atob(d));var f=i+"."+a;if(window.navigator.msSaveOrOpenBlob){for(var g=d.length,y=new Uint8Array(g);g--;)y[g]=d.charCodeAt(g);var v=new Blob([y]);window.navigator.msSaveOrOpenBlob(v,f)}else{var m=document.createElement("iframe");document.body.appendChild(m);var x=m.contentWindow,_=x.document;_.open("image/svg+xml","replace"),_.write(d),_.close(),x.focus(),_.execCommand("SaveAs",!0,f),document.body.removeChild(m)}}else{var b=n.get("lang"),w='',S=window.open();S.document.write(w),S.document.title=i}},e.getDefaultOption=function(t){return{show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:t.getLocaleModel().get(["toolbox","saveAsImage","title"]),type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],lang:t.getLocaleModel().get(["toolbox","saveAsImage","lang"])}},e}(FE),jE="__ec_magicType_stack__",qE=[["line","bar"],["stack"]],KE=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return E(t.get("type"),(function(t){e[t]&&(n[t]=e[t])})),n},e.getDefaultOption=function(t){return{show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:t.getLocaleModel().get(["toolbox","magicType","title"]),option:{},seriesIndex:{}}},e.prototype.onclick=function(t,e,n){var i=this.model,r=i.get(["seriesIndex",n]);if($E[n]){var o,a={series:[]};E(qE,(function(t){P(t,n)>=0&&E(t,(function(t){i.setIconStatus(t,"normal")}))})),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},(function(t){var e=t.subType,r=t.id,o=$E[n](e,r,t,i);o&&(k(o,t.option),a.series.push(o));var s=t.coordinateSystem;if(s&&"cartesian2d"===s.type&&("line"===n||"bar"===n)){var l=s.getAxesByScale("ordinal")[0];if(l){var u=l.dim+"Axis",h=t.getReferringComponents(u,Co).models[0].componentIndex;a[u]=a[u]||[];for(var c=0;c<=h;c++)a[u][h]=a[u][h]||{};a[u][h].boundaryGap="bar"===n}}}));var s=n;"stack"===n&&(o=C({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),"emphasis"!==i.get(["iconStatus",n])&&(s="tiled")),e.dispatchAction({type:"changeMagicType",currentType:s,newOption:a,newTitle:o,featureName:"magicType"})}},e}(FE),$E={line:function(t,e,n,i){if("bar"===t)return C({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","line"])||{},!0)},bar:function(t,e,n,i){if("line"===t)return C({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},i.get(["option","bar"])||{},!0)},stack:function(t,e,n,i){var r=n.get("stack")===jE;if("line"===t||"bar"===t)return i.setIconStatus("stack",r?"normal":"emphasis"),C({id:e,stack:r?"":jE},i.get(["option","stack"])||{},!0)}};um({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},(function(t,e){e.mergeOption(t.newOption)}));var JE=new Array(60).join("-"),QE="\t";function tz(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}var ez=new RegExp("[\t]+","g");function nz(t,e){var n=t.split(new RegExp("\n*"+JE+"\n*","g")),i={series:[]};return E(n,(function(t,n){if(function(t){if(t.slice(0,t.indexOf("\n")).indexOf(QE)>=0)return!0}(t)){var r=function(t){for(var e=t.split(/\n+/g),n=[],i=z(tz(e.shift()).split(ez),(function(t){return{name:t,data:[]}})),r=0;r=0)&&t(r,i._targetInfoList)}))}return t.prototype.setOutputRanges=function(t,e){return this.matchOutputRanges(t,e,(function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=yz[t.brushType](0,n,e);t.__rangeOffset={offset:mz[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})),t},t.prototype.matchOutputRanges=function(t,e,n){E(t,(function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&E(i.coordSyses,(function(i){var r=yz[t.brushType](1,i,t.range,!0);n(t,r.values,i,e)}))}),this)},t.prototype.setInputRanges=function(t,e){E(t,(function(t){var n,i,r,o,a,s=this.findTargetInfo(t,e);if(t.range=t.range||[],s&&!0!==s){t.panelId=s.panelId;var l=yz[t.brushType](0,s.coordSys,t.coordRange),u=t.__rangeOffset;t.range=u?mz[t.brushType](l.values,u.offset,(n=l.xyMinMax,i=u.xyMinMax,r=_z(n),o=_z(i),a=[r[0]/o[0],r[1]/o[1]],isNaN(a[0])&&(a[0]=1),isNaN(a[1])&&(a[1]=1),a)):l.values}}),this)},t.prototype.makePanelOpts=function(t,e){return z(this._targetInfoList,(function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e?e(n):null,clipPath:uL(i),isTargetByCursor:cL(i,t,n.coordSysModel),getLinearBrushOtherExtent:hL(i)}}))},t.prototype.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&P(i.coordSyses,e.coordinateSystem)>=0},t.prototype.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=pz(e,t),r=0;rt[1]&&t.reverse(),t}function pz(t,e){return Io(t,e,{includeMainTypes:uz})}var dz={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=ft(),a={},s={};(n||i||r)&&(E(n,(function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0})),E(i,(function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0})),E(r,(function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0})),o.each((function(t){var r=t.coordinateSystem,o=[];E(r.getCartesians(),(function(t,e){(P(n,t.getAxis("x").model)>=0||P(i,t.getAxis("y").model)>=0)&&o.push(t)})),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:gz.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})})))},geo:function(t,e){E(t.geoModels,(function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:gz.geo})}))}},fz=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],gz={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(Mh(t)),e}},yz={lineX:H(vz,0),lineY:H(vz,1),rect:function(t,e,n,i){var r=t?e.pointToData([n[0][0],n[1][0]],i):e.dataToPoint([n[0][0],n[1][0]],i),o=t?e.pointToData([n[0][1],n[1][1]],i):e.dataToPoint([n[0][1],n[1][1]],i),a=[cz([r[0],o[0]]),cz([r[1],o[1]])];return{values:a,xyMinMax:a}},polygon:function(t,e,n,i){var r=[[1/0,-1/0],[1/0,-1/0]];return{values:z(n,(function(n){var o=t?e.pointToData(n,i):e.dataToPoint(n,i);return r[0][0]=Math.min(r[0][0],o[0]),r[1][0]=Math.min(r[1][0],o[1]),r[0][1]=Math.max(r[0][1],o[0]),r[1][1]=Math.max(r[1][1],o[1]),o})),xyMinMax:r}}};function vz(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=cz(z([0,1],(function(t){return e?r.coordToData(r.toLocalCoord(i[t]),!0):r.toGlobalCoord(r.dataToCoord(i[t]))}))),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}var mz={lineX:H(xz,0),lineY:H(xz,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return z(t,(function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]}))}};function xz(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function _z(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}var bz,wz,Sz=E,Mz=uo+"toolbox-dataZoom_",Iz=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n,i){this._brushController||(this._brushController=new Pk(n.getZr()),this._brushController.on("brush",W(this._onBrush,this)).mount()),function(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive);n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new hz(Cz(t),e,{include:["grid"]}).makePanelOpts(r,(function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"}));n._brushController.setPanels(a).enableBrush(!(!o||!a.length)&&{brushType:"auto",brushStyle:t.getModel("brushStyle").getItemStyle()})}(t,e,this,i,n),function(t,e){t.setIconStatus("back",function(t){return sz(t).length}(e)>1?"emphasis":"normal")}(t,e)},e.prototype.onclick=function(t,e,n){Tz[n].call(this)},e.prototype.remove=function(t,e){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,e){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var e=t.areas;if(t.isEnd&&e.length){var n={},i=this.ecModel;this._brushController.updateCovers([]),new hz(Cz(this.model),i,{include:["grid"]}).matchOutputRanges(e,i,(function(t,e,n){if("cartesian2d"===n.type){var i=t.brushType;"rect"===i?(r("x",n,e[0]),r("y",n,e[1])):r({lineX:"x",lineY:"y"}[i],n,e)}})),function(t,e){var n=sz(t);oz(e,(function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}})),n.push(e)}(i,n),this._dispatchZoomAction(n)}function r(t,e,r){var o=e.getAxis(t),a=o.model,s=function(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},(function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)})),i}(t,a,i),l=s.findRepresentativeAxisProxy(a).getMinMaxSpan();null==l.minValueSpan&&null==l.maxValueSpan||(r=sk(0,r.slice(),o.scale.getExtent(),0,l.minValueSpan,l.maxValueSpan)),s&&(n[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}},e.prototype._dispatchZoomAction=function(t){var e=[];Sz(t,(function(t,n){e.push(T(t))})),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},e.getDefaultOption=function(t){return{show:!0,filterMode:"filter",icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:t.getLocaleModel().get(["toolbox","dataZoom","title"]),brushStyle:{borderWidth:0,color:"rgba(210,219,238,0.2)"}}},e}(FE),Tz={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(function(t){var e=sz(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return oz(n,(function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}})),i}(this.ecModel))}};function Cz(t){var e={xAxisIndex:t.get("xAxisIndex",!0),yAxisIndex:t.get("yAxisIndex",!0),xAxisId:t.get("xAxisId",!0),yAxisId:t.get("yAxisId",!0)};return null==e.xAxisIndex&&null==e.xAxisId&&(e.xAxisIndex="all"),null==e.yAxisIndex&&null==e.yAxisId&&(e.yAxisIndex="all"),e}bz="dataZoom",wz=function(t){var e=t.getComponent("toolbox",0),n=["feature","dataZoom"];if(e&&null!=e.get(n)){var i=e.getModel(n),r=[],o=Io(t,Cz(i));return Sz(o.xAxisModels,(function(t){return a(t,"xAxis","xAxisIndex")})),Sz(o.yAxisModels,(function(t){return a(t,"yAxis","yAxisIndex")})),r}function a(t,e,n){var o=t.componentIndex,a={type:"select",$fromToolbox:!0,filterMode:i.get("filterMode",!0)||"filter",id:Mz+e+o};a[n]=o,r.push(a)}},lt(null==Zp.get(bz)&&wz),Zp.set(bz,wz);var Dz=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="tooltip",e.dependencies=["axisPointer"],e.defaultOption={z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"#fff",shadowBlur:10,shadowColor:"rgba(0, 0, 0, .2)",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#666",fontSize:14}},e}(Ip);function Az(t){var e=t.get("confine");return null!=e?!!e:"richText"===t.get("renderMode")}function kz(t){if(r.domSupported)for(var e=document.documentElement.style,n=0,i=t.length;n-1?(u+="top:50%",h+="translateY(-50%) rotate("+(a="left"===s?-225:-45)+"deg)"):(u+="left:50%",h+="translateX(-50%) rotate("+(a="top"===s?225:45)+"deg)");var c=a*Math.PI/180,p=l+r,d=p*Math.abs(Math.cos(c))+p*Math.abs(Math.sin(c)),f=e+" solid "+r+"px;";return'
                            '}(n,i,r)),X(t))o.innerHTML=t+a;else if(t){o.innerHTML="",Y(t)||(t=[t]);for(var s=0;s=0?this._tryShow(n,i):"leave"===e&&this._hide(i))}),this))},e.prototype._keepShow=function(){var t=this._tooltipModel,e=this._ecModel,n=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var i=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout((function(){!n.isDisposed()&&i.manuallyShowTip(t,e,n,{x:i._lastX,y:i._lastY,dataByCoordSys:i._lastDataByCoordSys})}))}},e.prototype.manuallyShowTip=function(t,e,n,i){if(i.from!==this.uid&&!r.node&&n.getDom()){var o=Zz(i,n);this._ticket="";var a=i.dataByCoordSys,s=function(t,e,n){var i=To(t).queryOptionMap,r=i.keys()[0];if(!r||"series"===r)return;var o,a=Ao(e,r,i.get(r),{useDefault:!1,enableAll:!1,enableNone:!1}).models[0];if(!a)return;if(n.getViewOfComponentModel(a).group.traverse((function(e){var n=Ws(e).tooltipConfig;if(n&&n.name===t.name)return o=e,!0})),o)return{componentMainType:r,componentIndex:a.componentIndex,el:o}}(i,e,n);if(s){var l=s.el.getBoundingRect().clone();l.applyTransform(s.el.transform),this._tryShow({offsetX:l.x+l.width/2,offsetY:l.y+l.height/2,target:s.el,position:i.position,positionDefault:"bottom"},o)}else if(i.tooltip&&null!=i.x&&null!=i.y){var u=Yz;u.x=i.x,u.y=i.y,u.update(),Ws(u).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:u},o)}else if(a)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:a,tooltipOption:i.tooltipOption},o);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var h=tN(i,e),c=h.point[0],p=h.point[1];null!=c&&null!=p&&this._tryShow({offsetX:c,offsetY:p,target:h.el,position:i.position,positionDefault:"bottom"},o)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},o))}},e.prototype.manuallyHideTip=function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(Zz(i,n))},e.prototype._manuallyAxisShowTip=function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s)if("axis"===Xz([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model],this._tooltipModel).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},e.prototype._tryShow=function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;if(i&&i.length)this._showAxisTooltip(i,t);else if(n){var r,o;this._lastDataByCoordSys=null,my(n,(function(t){return null!=Ws(t).dataIndex?(r=t,!0):null!=Ws(t).tooltipConfig?(o=t,!0):void 0}),!0),r?this._showSeriesItemTooltip(t,r,e):o?this._showComponentItemTooltip(t,o,e):this._hide(e)}else this._lastDataByCoordSys=null,this._hide(e)}},e.prototype._showOrMove=function(t,e){var n=t.get("showDelay");e=W(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},e.prototype._showAxisTooltip=function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=Xz([e.tooltipOption],i),a=this._renderMode,s=[],l=Uf("section",{blocks:[],noHeader:!0}),u=[],h=new ng;E(t,(function(t){E(t.dataByAxis,(function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value;if(e&&null!=r){var o=ER(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt),c=Uf("section",{header:o,noHeader:!ut(o),sortBlocks:!0,blocks:[]});l.blocks.push(c),E(t.seriesDataIndices,(function(l){var p=n.getSeriesByIndex(l.seriesIndex),d=l.dataIndexInside,f=p.getDataParams(d);if(!(f.dataIndex<0)){f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=o_(e.axis,{value:r}),f.axisValueLabel=o,f.marker=h.makeTooltipMarker("item",cp(f.color),a);var g=lf(p.formatTooltip(d,!0,null)),y=g.frag;if(y){var v=Xz([p],i).get("valueFormatter");c.blocks.push(v?A({valueFormatter:v},y):y)}g.text&&u.push(g.text),s.push(f)}}))}}))})),l.blocks.reverse(),u.reverse();var c=e.position,p=o.get("order"),d=$f(l,h,a,p,n.get("useUTC"),o.get("textStyle"));d&&u.unshift(d);var f="richText"===a?"\n\n":"
                            ",g=u.join(f);this._showOrMove(o,(function(){this._updateContentNotChangedOnAxis(t,s)?this._updatePosition(o,c,r[0],r[1],this._tooltipContent,s):this._showTooltipContent(o,g,s,Math.random()+"",r[0],r[1],c,null,h)}))},e.prototype._showSeriesItemTooltip=function(t,e,n){var i=this._ecModel,r=Ws(e),o=r.seriesIndex,a=i.getSeriesByIndex(o),s=r.dataModel||a,l=r.dataIndex,u=r.dataType,h=s.getData(u),c=this._renderMode,p=t.positionDefault,d=Xz([h.getItemModel(l),s,a&&(a.coordinateSystem||{}).model],this._tooltipModel,p?{position:p}:null),f=d.get("trigger");if(null==f||"item"===f){var g=s.getDataParams(l,u),y=new ng;g.marker=y.makeTooltipMarker("item",cp(g.color),c);var v=lf(s.formatTooltip(l,!1,u)),m=d.get("order"),x=d.get("valueFormatter"),_=v.frag,b=_?$f(x?A({valueFormatter:x},_):_,y,c,m,i.get("useUTC"),d.get("textStyle")):v.text,w="item_"+s.name+"_"+l;this._showOrMove(d,(function(){this._showTooltipContent(d,b,g,w,t.offsetX,t.offsetY,t.position,t.target,y)})),n({type:"showTip",dataIndexInside:l,dataIndex:h.getRawIndex(l),seriesIndex:o,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,e,n){var i=Ws(e),r=i.tooltipConfig.option||{};if(X(r)){r={content:r,formatter:r}}var o=[r],a=this._ecModel.getComponent(i.componentMainType,i.componentIndex);a&&o.push(a),o.push({formatter:r.content});var s=t.positionDefault,l=Xz(o,this._tooltipModel,s?{position:s}:null),u=l.get("content"),h=Math.random()+"",c=new ng;this._showOrMove(l,(function(){var n=T(l.get("formatterParams")||{});this._showTooltipContent(l,u,n,h,t.offsetX,t.offsetY,t.position,e,c)})),n({type:"showTip",from:this.uid})},e.prototype._showTooltipContent=function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent,h=t.get("formatter");a=a||t.get("position");var c=e,p=this._getNearestPoint([r,o],n,t.get("trigger"),t.get("borderColor")).color;if(h)if(X(h)){var d=t.ecModel.get("useUTC"),f=Y(n)?n[0]:n;c=h,f&&f.axisType&&f.axisType.indexOf("time")>=0&&(c=zc(f.axisValue,c,d)),c=up(c,n,!0)}else if(U(h)){var g=W((function(e,i){e===this._ticket&&(u.setContent(i,l,t,p,a),this._updatePosition(t,a,r,o,u,n,s))}),this);this._ticket=i,c=h(n,i,g)}else c=h;u.setContent(c,l,t,p,a),u.show(t,p),this._updatePosition(t,a,r,o,u,n,s)}},e.prototype._getNearestPoint=function(t,e,n,i){return"axis"===n||Y(e)?{color:i||("html"===this._renderMode?"#fff":"none")}:Y(e)?void 0:{color:i||e.color||e.borderColor}},e.prototype._updatePosition=function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),p=a&&a.getBoundingRect().clone();if(a&&p.applyTransform(a.transform),U(e)&&(e=e([n,i],o,r.el,p,{viewSize:[s,l],contentSize:u.slice()})),Y(e))n=Er(e[0],s),i=Er(e[1],l);else if(q(e)){var d=e;d.width=u[0],d.height=u[1];var f=mp(d,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else if(X(e)&&a){var g=function(t,e,n,i){var r=n[0],o=n[1],a=Math.ceil(Math.SQRT2*i)+8,s=0,l=0,u=e.width,h=e.height;switch(t){case"inside":s=e.x+u/2-r/2,l=e.y+h/2-o/2;break;case"top":s=e.x+u/2-r/2,l=e.y-o-a;break;case"bottom":s=e.x+u/2-r/2,l=e.y+h+a;break;case"left":s=e.x-r-a,l=e.y+h/2-o/2;break;case"right":s=e.x+u+a,l=e.y+h/2-o/2}return[s,l]}(e,p,u,t.get("borderWidth"));n=g[0],i=g[1]}else{g=function(t,e,n,i,r,o,a){var s=n.getSize(),l=s[0],u=s[1];null!=o&&(t+l+o+2>i?t-=l+o:t+=o);null!=a&&(e+u+a>r?e-=u+a:e+=a);return[t,e]}(n,i,r,s,l,h?null:20,c?null:20);n=g[0],i=g[1]}if(h&&(n-=jz(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=jz(c)?u[1]/2:"bottom"===c?u[1]:0),Az(t)){g=function(t,e,n,i,r){var o=n.getSize(),a=o[0],s=o[1];return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}(n,i,r,s,l);n=g[0],i=g[1]}r.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,e){var n=this._lastDataByCoordSys,i=this._cbParamsList,r=!!n&&n.length===t.length;return r&&E(n,(function(n,o){var a=n.dataByAxis||[],s=(t[o]||{}).dataByAxis||[];(r=r&&a.length===s.length)&&E(a,(function(t,n){var o=s[n]||{},a=t.seriesDataIndices||[],l=o.seriesDataIndices||[];(r=r&&t.value===o.value&&t.axisType===o.axisType&&t.axisId===o.axisId&&a.length===l.length)&&E(a,(function(t,e){var n=l[e];r=r&&t.seriesIndex===n.seriesIndex&&t.dataIndex===n.dataIndex})),i&&E(t.seriesDataIndices,(function(t){var n=t.seriesIndex,o=e[n],a=i[n];o&&a&&a.data!==o.data&&(r=!1)}))}))})),this._lastDataByCoordSys=t,this._cbParamsList=e,!!r},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},e.prototype.dispose=function(t,e){!r.node&&e.getDom()&&(Ag(this,"_updatePosition"),this._tooltipContent.dispose(),JR("itemTooltip",e))},e.type="tooltip",e}(fg);function Xz(t,e,n){var i,r=e.ecModel;n?(i=new pc(n,r,r),i=new pc(e.option,i,r)):i=e;for(var o=t.length-1;o>=0;o--){var a=t[o];a&&(a instanceof pc&&(a=a.get("tooltip",!0)),X(a)&&(a={formatter:a}),a&&(i=new pc(a,i,r)))}return i}function Zz(t,e){return t.dispatchAction||W(e.dispatchAction,e)}function jz(t){return"center"===t||"middle"===t}var qz=["rect","polygon","keep","clear"];function Kz(t,e){var n=ho(t?t.brush:[]);if(n.length){var i=[];E(n,(function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(i=i.concat(e))}));var r=t&&t.toolbox;Y(r)&&(r=r[0]),r||(r={feature:{}},t.toolbox=[r]);var o=r.feature||(r.feature={}),a=o.brush||(o.brush={}),s=a.type||(a.type=[]);s.push.apply(s,i),function(t){var e={};E(t,(function(t){e[t]=1})),t.length=0,E(e,(function(e,n){t.push(n)}))}(s),e&&!s.length&&s.push.apply(s,qz)}}var $z=E;function Jz(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}function Qz(t,e,n){var i={};return $z(e,(function(e){var r,o=i[e]=((r=function(){}).prototype.__hidden=r.prototype,new r);$z(t[e],(function(t,i){if(eD.isValidType(i)){var r={type:i,visual:t};n&&n(r,e),o[i]=new eD(r),"opacity"===i&&((r=T(r)).type="colorAlpha",o.__hidden.__alphaForOpacity=new eD(r))}}))})),i}function tV(t,e,n){var i;E(n,(function(t){e.hasOwnProperty(t)&&Jz(e[t])&&(i=!0)})),i&&E(n,(function(n){e.hasOwnProperty(n)&&Jz(e[n])?t[n]=T(e[n]):delete t[n]}))}var eV={lineX:nV(0),lineY:nV(1),rect:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])},rect:function(t,e,n){return t&&n.boundingRect.intersect(t)}},polygon:{point:function(t,e,n){return t&&n.boundingRect.contain(t[0],t[1])&&f_(n.range,t[0],t[1])},rect:function(t,e,n){var i=n.range;if(!t||i.length<=1)return!1;var r=t.x,o=t.y,a=t.width,s=t.height,l=i[0];return!!(f_(i,r,o)||f_(i,r+a,o)||f_(i,r,o+s)||f_(i,r+a,o+s)||sr.create(t).contain(l[0],l[1])||Ph(r,o,r+a,o,i)||Ph(r,o,r,o+s,i)||Ph(r+a,o,r+a,o+s,i)||Ph(r,o+s,r+a,o+s,i))||void 0}}};function nV(t){var e=["x","y"],n=["width","height"];return{point:function(e,n,i){if(e){var r=i.range;return iV(e[t],r)}},rect:function(i,r,o){if(i){var a=o.range,s=[i[e[t]],i[e[t]]+i[n[t]]];return s[1]e[0][1]&&(e[0][1]=o[0]),o[1]e[1][1]&&(e[1][1]=o[1])}return e&&pV(e)}};function pV(t){return new sr(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var dV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Pk(e.getZr())).on("brush",W(this._onBrush,this)).mount()},e.prototype.render=function(t,e,n,i){this.model=t,this._updateController(t,e,n,i)},e.prototype.updateTransform=function(t,e,n,i){sV(e),this._updateController(t,e,n,i)},e.prototype.updateVisual=function(t,e,n,i){this.updateTransform(t,e,n,i)},e.prototype.updateView=function(t,e,n,i){this._updateController(t,e,n,i)},e.prototype._updateController=function(t,e,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var e=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:e,areas:T(n),$from:e}),t.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:e,areas:T(n),$from:e})},e.type="brush",e}(fg),fV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.areas=[],n.brushOption={},n}return n(e,t),e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&tV(n,t,["inBrush","outOfBrush"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:"#ddd"},i.hasOwnProperty("liftZ")||(i.liftZ=5)},e.prototype.setAreas=function(t){t&&(this.areas=z(t,(function(t){return gV(this.option,t)}),this))},e.prototype.setBrushOption=function(t){this.brushOption=gV(this.option,t),this.brushType=this.brushOption.brushType},e.type="brush",e.dependencies=["geo","grid","xAxis","yAxis","parallel","series"],e.defaultOption={seriesIndex:"all",brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(210,219,238,0.3)",borderColor:"#D2DBEE"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},e}(Ip);function gV(t,e){return C({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new pc(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}var yV=["rect","polygon","lineX","lineY","keep","clear"],vV=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.render=function(t,e,n){var i,r,o;e.eachComponent({mainType:"brush"},(function(t){i=t.brushType,r=t.brushOption.brushMode||"single",o=o||!!t.areas.length})),this._brushType=i,this._brushMode=r,E(t.get("type",!0),(function(e){t.setIconStatus(e,("keep"===e?"multiple"===r:"clear"===e?o:e===i)?"emphasis":"normal")}))},e.prototype.updateView=function(t,e,n){this.render(t,e,n)},e.prototype.getIcons=function(){var t=this.model,e=t.get("icon",!0),n={};return E(t.get("type",!0),(function(t){e[t]&&(n[t]=e[t])})),n},e.prototype.onclick=function(t,e,n){var i=this._brushType,r=this._brushMode;"clear"===n?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===n?i:i!==n&&n,brushMode:"keep"===n?"multiple"===r?"single":"multiple":r}})},e.getDefaultOption=function(t){return{show:!0,type:yV.slice(),icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:t.getLocaleModel().get(["toolbox","brush","title"])}},e}(FE);var mV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode={type:"box",ignoreSize:!0},n}return n(e,t),e.type="title",e.defaultOption={z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bold",color:"#464646"},subtextStyle:{fontSize:12,color:"#6E7079"}},e}(Ip),xV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.render=function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=rt(t.get("textBaseline"),t.get("textVerticalAlign")),l=new As({style:Yh(r,{text:t.get("text"),fill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new As({style:Yh(o,{text:h,fill:o.getTextColor(),y:u.height+t.get("itemGap"),verticalAlign:"top"},{disableBox:!0}),z2:10}),p=t.get("link"),d=t.get("sublink"),f=t.get("triggerEvent",!0);l.silent=!p&&!f,c.silent=!d&&!f,p&&l.on("click",(function(){pp(p,"_"+t.get("target"))})),d&&c.on("click",(function(){pp(d,"_"+t.get("subtarget"))})),Ws(l).eventData=Ws(c).eventData=f?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),y=t.getBoxLayoutParams();y.width=g.width,y.height=g.height;var v=mp(y,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.x=v.x,i.y=v.y,i.markRedraw();var m={align:a,verticalAlign:s};l.setStyle(m),c.setStyle(m),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var b=new Ts({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type="title",e}(fg);var _V=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.layoutMode="box",n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(e){t.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t,e=this.option,n=e.data||[],i=e.axisType,r=this._names=[];"category"===i?(t=[],E(n,(function(e,n){var i,o=xo(fo(e),"");q(e)?(i=T(e)).value=n:i=n,t.push(i),r.push(o)}))):t=n;var o={category:"ordinal",time:"time",value:"number"}[i]||"number";(this._data=new Zm([{name:"value",type:o}],this)).initData(t,r)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if("category"===this.get("axisType"))return this._names.slice()},e.type="timeline",e.defaultOption={z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},e}(Ip),bV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline.slider",e.defaultOption=gc(_V.defaultOption,{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"circle",symbolSize:12,lineStyle:{show:!0,width:2,color:"#DAE1F5"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#A4B1D7"},itemStyle:{color:"#A4B1D7",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:15,color:"#316bf3",borderColor:"#fff",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:"rgba(0, 0, 0, 0.3)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z",prevIcon:"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z",prevBtnSize:18,nextBtnSize:18,color:"#A4B1D7",borderColor:"#A4B1D7",borderWidth:1},emphasis:{label:{show:!0,color:"#6f778d"},itemStyle:{color:"#316BF3"},controlStyle:{color:"#316BF3",borderColor:"#316BF3",borderWidth:2}},progress:{lineStyle:{color:"#316BF3"},itemStyle:{color:"#316BF3"},label:{color:"#6f778d"}},data:[]}),e}(_V);R(bV,sf.prototype);var wV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="timeline",e}(fg),SV=function(t){function e(e,n,i,r){var o=t.call(this,e,n,i)||this;return o.type=r||"value",o}return n(e,t),e.prototype.getLabelModel=function(){return this.model.getModel("label")},e.prototype.isHorizontal=function(){return"horizontal"===this.model.get("orient")},e}(G_),MV=Math.PI,IV=So(),TV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(t,e){this.api=e},e.prototype.render=function(t,e,n){if(this.model=t,this.api=n,this.ecModel=e,this.group.removeAll(),t.get("show",!0)){var i=this._layout(t,n),r=this._createGroup("_mainGroup"),o=this._createGroup("_labelGroup"),a=this._axis=this._createAxis(i,t);t.formatTooltip=function(t){return Uf("nameValue",{noName:!0,value:a.scale.getLabel({value:t})})},E(["AxisLine","AxisTick","Control","CurrentPointer"],(function(e){this["_render"+e](i,r,a,t)}),this),this._renderAxisLabel(i,o,a,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,e){var n,i,r,o,a=t.get(["label","position"]),s=t.get("orient"),l=function(t,e){return mp(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e),u={horizontal:"center",vertical:(n=null==a||"auto"===a?"horizontal"===s?l.y+l.height/2=0||"+"===n?"left":"right"},h={horizontal:n>=0||"+"===n?"top":"bottom",vertical:"middle"},c={horizontal:0,vertical:MV/2},p="vertical"===s?l.height:l.width,d=t.getModel("controlStyle"),f=d.get("show",!0),g=f?d.get("itemSize"):0,y=f?d.get("itemGap"):0,v=g+y,m=t.get(["label","rotate"])||0;m=m*MV/180;var x=d.get("position",!0),_=f&&d.get("showPlayBtn",!0),b=f&&d.get("showPrevBtn",!0),w=f&&d.get("showNextBtn",!0),S=0,M=p;"left"===x||"bottom"===x?(_&&(i=[0,0],S+=v),b&&(r=[S,0],S+=v),w&&(o=[M-g,0],M-=v)):(_&&(i=[M-g,0],M-=v),b&&(r=[0,0],S+=v),w&&(o=[M-g,0],M-=v));var I=[S,M];return t.get("inverse")&&I.reverse(),{viewRect:l,mainLength:p,orient:s,rotation:c[s],labelRotation:m,labelPosOpt:n,labelAlign:t.get(["label","align"])||u[s],labelBaseline:t.get(["label","verticalAlign"])||t.get(["label","baseline"])||h[s],playPosition:i,prevBtnPosition:r,nextBtnPosition:o,axisExtent:I,controlSize:g,controlGap:y}},e.prototype._position=function(t,e){var n=this._mainGroup,i=this._labelGroup,r=t.viewRect;if("vertical"===t.orient){var o=[1,0,0,1,0,0],a=r.x,s=r.y+r.height;Ei(o,o,[-a,-s]),zi(o,o,-MV/2),Ei(o,o,[a,s]),(r=r.clone()).applyTransform(o)}var l=y(r),u=y(n.getBoundingRect()),h=y(i.getBoundingRect()),c=[n.x,n.y],p=[i.x,i.y];p[0]=c[0]=l[0][0];var d,f=t.labelPosOpt;null==f||X(f)?(v(c,u,l,1,d="+"===f?0:1),v(p,h,l,1,1-d)):(v(c,u,l,1,d=f>=0?0:1),p[1]=c[1]+f);function g(t){t.originX=l[0][0]-t.x,t.originY=l[1][0]-t.y}function y(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function v(t,e,n,i,r){t[i]+=n[i][r]-e[i][r]}n.setPosition(c),i.setPosition(p),n.rotation=i.rotation=t.rotation,g(n),g(i)},e.prototype._createAxis=function(t,e){var n=e.getData(),i=e.get("axisType"),r=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new gx({ordinalMeta:t.getCategories(),extent:[1/0,-1/0]});case"time":return new Px({locale:t.ecModel.getLocaleModel(),useUTC:t.ecModel.get("useUTC")});default:return new vx}}(e,i);r.getTicks=function(){return n.mapArray(["value"],(function(t){return{value:t}}))};var o=n.getDataExtent("value");r.setExtent(o[0],o[1]),r.calcNiceTicks();var a=new SV("value",r,t.axisExtent,i);return a.model=e,a},e.prototype._createGroup=function(t){var e=this[t]=new Cr;return this.group.add(e),e},e.prototype._renderAxisLine=function(t,e,n,i){var r=n.getExtent();if(i.get(["lineStyle","show"])){var o=new Eu({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:A({lineCap:"round"},i.getModel("lineStyle").getLineStyle()),silent:!0,z2:1});e.add(o);var a=this._progressLine=new Eu({shape:{x1:r[0],x2:this._currentPointer?this._currentPointer.x:r[0],y1:0,y2:0},style:k({lineCap:"round",lineWidth:o.style.lineWidth},i.getModel(["progress","lineStyle"]).getLineStyle()),silent:!0,z2:1});e.add(a)}},e.prototype._renderAxisTick=function(t,e,n,i){var r=this,o=i.getData(),a=n.scale.getTicks();this._tickSymbols=[],E(a,(function(t){var a=n.dataToCoord(t.value),s=o.getItemModel(t.value),l=s.getModel("itemStyle"),u=s.getModel(["emphasis","itemStyle"]),h=s.getModel(["progress","itemStyle"]),c={x:a,y:0,onclick:W(r._changeTimeline,r,t.value)},p=CV(s,l,e,c);p.ensureState("emphasis").style=u.getItemStyle(),p.ensureState("progress").style=h.getItemStyle(),Pl(p);var d=Ws(p);s.get("tooltip")?(d.dataIndex=t.value,d.dataModel=i):d.dataIndex=d.dataModel=null,r._tickSymbols.push(p)}))},e.prototype._renderAxisLabel=function(t,e,n,i){var r=this;if(n.getLabelModel().get("show")){var o=i.getData(),a=n.getViewLabels();this._tickLabels=[],E(a,(function(i){var a=i.tickValue,s=o.getItemModel(a),l=s.getModel("label"),u=s.getModel(["emphasis","label"]),h=s.getModel(["progress","label"]),c=n.dataToCoord(i.tickValue),p=new As({x:c,y:0,rotation:t.labelRotation-t.rotation,onclick:W(r._changeTimeline,r,a),silent:!1,style:Yh(l,{text:i.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});p.ensureState("emphasis").style=Yh(u),p.ensureState("progress").style=Yh(h),e.add(p),Pl(p),IV(p).dataIndex=a,r._tickLabels.push(p)}))}},e.prototype._renderControl=function(t,e,n,i){var r=t.controlSize,o=t.rotation,a=i.getModel("controlStyle").getItemStyle(),s=i.getModel(["emphasis","controlStyle"]).getItemStyle(),l=i.getPlayState(),u=i.get("inverse",!0);function h(t,n,l,u){if(t){var h=gr(rt(i.get(["controlStyle",n+"BtnSize"]),r),r),c=function(t,e,n,i){var r=i.style,o=Lh(t.get(["controlStyle",e]),i||{},new sr(n[0],n[1],n[2],n[3]));r&&o.setStyle(r);return o}(i,n+"Icon",[0,-h/2,h,h],{x:t[0],y:t[1],originX:r/2,originY:0,rotation:u?-o:0,rectHover:!0,style:a,onclick:l});c.ensureState("emphasis").style=s,e.add(c),Pl(c)}}h(t.nextBtnPosition,"next",W(this._changeTimeline,this,u?"-":"+")),h(t.prevBtnPosition,"prev",W(this._changeTimeline,this,u?"+":"-")),h(t.playPosition,l?"stop":"play",W(this._handlePlayClick,this,!l),!0)},e.prototype._renderCurrentPointer=function(t,e,n,i){var r=i.getData(),o=i.getCurrentIndex(),a=r.getItemModel(o).getModel("checkpointStyle"),s=this,l={onCreate:function(t){t.draggable=!0,t.drift=W(s._handlePointerDrag,s),t.ondragend=W(s._handlePointerDragend,s),DV(t,s._progressLine,o,n,i,!0)},onUpdate:function(t){DV(t,s._progressLine,o,n,i)}};this._currentPointer=CV(a,a,this._mainGroup,{},this._currentPointer,l)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,e,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,e){var n=this._toAxisCoord(t)[0],i=Vr(this._axis.getExtent().slice());n>i[1]&&(n=i[1]),n=0&&(a[o]=+a[o].toFixed(c)),[a,h]}var VV={min:H(zV,"min"),max:H(zV,"max"),average:H(zV,"average"),median:H(zV,"median")};function BV(t,e){var n=t.getData(),i=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!Y(e.coord)&&i){var r=i.dimensions,o=FV(e,n,i,t);if((e=T(e)).type&&VV[e.type]&&o.baseAxis&&o.valueAxis){var a=P(r,o.baseAxis.dim),s=P(r,o.valueAxis.dim),l=VV[e.type](n,o.baseDataDim,o.valueDataDim,a,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)VV[u[h]]&&(u[h]=HV(n,n.mapDimension(r[h]),u[h]));e.coord=u}}return e}function FV(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(function(t,e){var n=t.getData().getDimensionInfo(e);return n&&n.coordDim}(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function GV(t,e){return!(t&&t.containData&&e.coord&&!function(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}(e))||t.containData(e.coord)}function WV(t,e){return t?function(t,n,i,r){return pf(r<2?t.coord&&t.coord[r]:t.value,e[r])}:function(t,n,i,r){return pf(t.value,e[r])}}function HV(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,(function(t,e){isNaN(t)||(i+=t,r++)})),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e)["max"===n?1:0]}var YV=So(),UV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.init=function(){this.markerGroupMap=ft()},e.prototype.render=function(t,e,n){var i=this,r=this.markerGroupMap;r.each((function(t){YV(t).keep=!1})),e.eachSeries((function(t){var r=NV.getMarkerModelFromSeries(t,i.type);r&&i.renderSeries(t,r,e,n)})),r.each((function(t){!YV(t).keep&&i.group.remove(t.group)}))},e.prototype.markKeep=function(t){YV(t).keep=!0},e.prototype.blurSeries=function(t){var e=this;E(t,(function(t){var n=NV.getMarkerModelFromSeries(t,e.type);n&&n.getData().eachItemGraphicEl((function(t){t&&bl(t)}))}))},e.type="marker",e}(fg);function XV(t,e,n){var i=e.coordinateSystem;t.each((function(r){var o,a=t.getItemModel(r),s=Er(a.get("x"),n.getWidth()),l=Er(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)}))}var ZV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=NV.getMarkerModelFromSeries(t,"markPoint");e&&(XV(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout())}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new Zw),u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new Zm(i,n),o=z(n.get("data"),H(BV,e));t&&(o=B(o,H(GV,t)));var a=WV(!!t,i);return r.initData(o,null,a),r}(r,t,e);e.setData(u),XV(e.getData(),t,i),u.each((function(t){var n=u.getItemModel(t),i=n.getShallow("symbol"),r=n.getShallow("symbolSize"),o=n.getShallow("symbolRotate"),s=n.getShallow("symbolOffset"),l=n.getShallow("symbolKeepAspect");if(U(i)||U(r)||U(o)||U(s)){var h=e.getRawValue(t),c=e.getDataParams(t);U(i)&&(i=i(h,c)),U(r)&&(r=r(h,c)),U(o)&&(o=o(h,c)),U(s)&&(s=s(h,c))}var p=n.getModel("itemStyle").getItemStyle(),d=fy(a,"color");p.fill||(p.fill=d),u.setItemVisual(t,{symbol:i,symbolSize:r,symbolRotate:o,symbolOffset:s,symbolKeepAspect:l,style:p})})),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl((function(t){t.traverse((function(t){Ws(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markPoint",e}(UV);var jV=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markLine",e.defaultOption={z:5,symbol:["circle","arrow"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end",distance:5},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"},e}(NV),qV=So(),KV=function(t,e,n,i){var r,o=t.getData();if(Y(i))r=i;else{var a=i.type;if("min"===a||"max"===a||"average"===a||"median"===a||null!=i.xAxis||null!=i.yAxis){var s=void 0,l=void 0;if(null!=i.yAxis||null!=i.xAxis)s=e.getAxis(null!=i.yAxis?"y":"x"),l=it(i.yAxis,i.xAxis);else{var u=FV(i,o,e,t);s=u.valueAxis,l=HV(o,ex(o,u.valueDataDim),a)}var h="x"===s.dim?0:1,c=1-h,p=T(i),d={coord:[]};p.type=null,p.coord=[],p.coord[c]=-1/0,d.coord[c]=1/0;var f=n.get("precision");f>=0&&j(l)&&(l=+l.toFixed(Math.min(f,20))),p.coord[h]=d.coord[h]=l,r=[p,d,{type:a,valueIndex:i.valueIndex,value:l}]}else r=[]}var g=[BV(t,r[0]),BV(t,r[1]),A({},r[2])];return g[2].type=g[2].type||null,C(g[2],g[0]),C(g[2],g[1]),g};function $V(t){return!isNaN(t)&&!isFinite(t)}function JV(t,e,n,i){var r=1-t,o=i.dimensions[t];return $V(e[r])&&$V(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function QV(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(JV(1,n,i,t)||JV(0,n,i,t)))return!0}return GV(t,e[0])&&GV(t,e[1])}function tB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get("x"),r.getWidth()),u=Er(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),p=t.get(h[1],e);o=a.dataToPoint([c,p])}if(sS(a,"cartesian2d")){var d=a.getAxis("x"),f=a.getAxis("y");h=a.dimensions;$V(t.get(h[0],e))?o[0]=d.toGlobalCoord(d.getExtent()[n?0:1]):$V(t.get(h[1],e))&&(o[1]=f.toGlobalCoord(f.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}var eB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=NV.getMarkerModelFromSeries(t,"markLine");if(e){var i=e.getData(),r=qV(e).from,o=qV(e).to;r.each((function(e){tB(r,e,!0,t,n),tB(o,e,!1,t,n)})),i.each((function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])})),this.markerGroupMap.get(t.id).updateLayout()}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new dA);this.group.add(l.group);var u=function(t,e,n){var i;i=t?z(t&&t.dimensions,(function(t){return A(A({},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{}),{name:t,ordinalMeta:null})})):[{name:"value",type:"float"}];var r=new Zm(i,n),o=new Zm(i,n),a=new Zm([],n),s=z(n.get("data"),H(KV,e,t,n));t&&(s=B(s,H(QV,t)));var l=WV(!!t,i);return r.initData(z(s,(function(t){return t[0]})),null,l),o.initData(z(s,(function(t){return t[1]})),null,l),a.initData(z(s,(function(t){return t[2]}))),a.hasItemOption=!0,{from:r,to:o,line:a}}(r,t,e),h=u.from,c=u.to,p=u.line;qV(e).from=h,qV(e).to=c,e.setData(p);var d=e.get("symbol"),f=e.get("symbolSize"),g=e.get("symbolRotate"),y=e.get("symbolOffset");function v(e,n,r){var o=e.getItemModel(n);tB(e,n,r,t,i);var s=o.getModel("itemStyle").getItemStyle();null==s.fill&&(s.fill=fy(a,"color")),e.setItemVisual(n,{symbolKeepAspect:o.get("symbolKeepAspect"),symbolOffset:rt(o.get("symbolOffset",!0),y[r?0:1]),symbolRotate:rt(o.get("symbolRotate",!0),g[r?0:1]),symbolSize:rt(o.get("symbolSize"),f[r?0:1]),symbol:rt(o.get("symbol",!0),d[r?0:1]),style:s})}Y(d)||(d=[d,d]),Y(f)||(f=[f,f]),Y(g)||(g=[g,g]),Y(y)||(y=[y,y]),u.from.each((function(t){v(h,t,!0),v(c,t,!1)})),p.each((function(t){var e=p.getItemModel(t).getModel("lineStyle").getLineStyle();p.setItemLayout(t,[h.getItemLayout(t),c.getItemLayout(t)]),null==e.stroke&&(e.stroke=h.getItemVisual(t,"style").fill),p.setItemVisual(t,{fromSymbolKeepAspect:h.getItemVisual(t,"symbolKeepAspect"),fromSymbolOffset:h.getItemVisual(t,"symbolOffset"),fromSymbolRotate:h.getItemVisual(t,"symbolRotate"),fromSymbolSize:h.getItemVisual(t,"symbolSize"),fromSymbol:h.getItemVisual(t,"symbol"),toSymbolKeepAspect:c.getItemVisual(t,"symbolKeepAspect"),toSymbolOffset:c.getItemVisual(t,"symbolOffset"),toSymbolRotate:c.getItemVisual(t,"symbolRotate"),toSymbolSize:c.getItemVisual(t,"symbolSize"),toSymbol:c.getItemVisual(t,"symbol"),style:e})})),l.updateData(p),u.line.eachItemGraphicEl((function(t,n){t.traverse((function(t){Ws(t).dataModel=e}))})),this.markKeep(l),l.group.silent=e.get("silent")||t.get("silent")},e.type="markLine",e}(UV);var nB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.createMarkerModelFromSeries=function(t,n,i){return new e(t,n,i)},e.type="markArea",e.defaultOption={z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}},e}(NV),iB=So(),rB=function(t,e,n,i){var r=BV(t,i[0]),o=BV(t,i[1]),a=r.coord,s=o.coord;a[0]=it(a[0],-1/0),a[1]=it(a[1],-1/0),s[0]=it(s[0],1/0),s[1]=it(s[1],1/0);var l=D([{},r,o]);return l.coord=[r.coord,o.coord],l.x0=r.x,l.y0=r.y,l.x1=o.x,l.y1=o.y,l};function oB(t){return!isNaN(t)&&!isFinite(t)}function aB(t,e,n,i){var r=1-t;return oB(e[r])&&oB(n[r])}function sB(t,e){var n=e.coord[0],i=e.coord[1];return!!(sS(t,"cartesian2d")&&n&&i&&(aB(1,n,i)||aB(0,n,i)))||(GV(t,{coord:n,x:e.x0,y:e.y0})||GV(t,{coord:i,x:e.x1,y:e.y1}))}function lB(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Er(s.get(n[0]),r.getWidth()),u=Er(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[d=t.get(n[0],e),f=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if(sS(a,"cartesian2d")){var c=a.getAxis("x"),p=a.getAxis("y"),d=t.get(n[0],e),f=t.get(n[1],e);oB(d)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):oB(f)&&(o[1]=p.toGlobalCoord(p.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}var uB=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]],hB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.updateTransform=function(t,e,n){e.eachSeries((function(t){var e=NV.getMarkerModelFromSeries(t,"markArea");if(e){var i=e.getData();i.each((function(e){var r=z(uB,(function(r){return lB(i,e,r,t,n)}));i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)}))}}),this)},e.prototype.renderSeries=function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,{group:new Cr});this.group.add(l.group),this.markKeep(l);var u=function(t,e,n){var i,r,o=["x0","y0","x1","y1"];if(t){var a=z(t&&t.dimensions,(function(t){var n=e.getData();return A(A({},n.getDimensionInfo(n.mapDimension(t))||{}),{name:t,ordinalMeta:null})}));r=z(o,(function(t,e){return{name:t,type:a[e%2].type}})),i=new Zm(r,n)}else i=new Zm(r=[{name:"value",type:"float"}],n);var s=z(n.get("data"),H(rB,e,t,n));t&&(s=B(s,H(sB,t)));var l=t?function(t,e,n,i){return pf(t.coord[Math.floor(i/2)][i%2],r[i])}:function(t,e,n,i){return pf(t.value,r[i])};return i.initData(s,null,l),i.hasItemOption=!0,i}(r,t,e);e.setData(u),u.each((function(e){var n=z(uB,(function(n){return lB(u,e,n,t,i)})),o=r.getAxis("x").scale,s=r.getAxis("y").scale,l=o.getExtent(),h=s.getExtent(),c=[o.parse(u.get("x0",e)),o.parse(u.get("x1",e))],p=[s.parse(u.get("y0",e)),s.parse(u.get("y1",e))];Vr(c),Vr(p);var d=!!(l[0]>c[1]||l[1]p[1]||h[1]=0},e.prototype.getOrient=function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}},e.type="legend.plain",e.dependencies=["series"],e.defaultOption={z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:"inherit",symbolKeepAspect:!0,inactiveColor:"#ccc",inactiveBorderColor:"#ccc",inactiveBorderWidth:"auto",itemStyle:{color:"inherit",opacity:"inherit",borderColor:"inherit",borderWidth:"auto",borderCap:"inherit",borderJoin:"inherit",borderDashOffset:"inherit",borderMiterLimit:"inherit"},lineStyle:{width:"auto",color:"inherit",inactiveColor:"#ccc",inactiveWidth:2,opacity:"inherit",type:"inherit",cap:"inherit",join:"inherit",dashOffset:"inherit",miterLimit:"inherit"},textStyle:{color:"#333"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:"sans-serif",color:"#666",borderWidth:1,borderColor:"#666"},emphasis:{selectorLabel:{show:!0,color:"#eee",backgroundColor:"#666"}},selectorPosition:"auto",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(Ip),pB=H,dB=E,fB=Cr,gB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.newlineDisabled=!1,n}return n(e,t),e.prototype.init=function(){this.group.add(this._contentGroup=new fB),this.group.add(this._selectorGroup=new fB),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,e,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),t.get("show",!0)){var r=t.get("align"),o=t.get("orient");r&&"auto"!==r||(r="right"===t.get("left")&&"vertical"===o?"right":"left");var a=t.get("selector",!0),s=t.get("selectorPosition",!0);!a||s&&"auto"!==s||(s="horizontal"===o?"end":"start"),this.renderInner(r,t,e,n,a,o,s);var l=t.getBoxLayoutParams(),u={width:n.getWidth(),height:n.getHeight()},h=t.get("padding"),c=mp(l,u,h),p=this.layoutInner(t,r,c,i,a,s),d=mp(k({width:p.width,height:p.height},l),u,h);this.group.x=d.x-p.x,this.group.y=d.y-p.y,this.group.markRedraw(),this.group.add(this._backgroundEl=UE(p,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,e,n,i,r,o,a){var s=this.getContentGroup(),l=ft(),u=e.get("selectedMode"),h=[];n.eachRawSeries((function(t){!t.get("legendHoverLink")&&h.push(t.id)})),dB(e.getData(),(function(r,o){var a=r.get("name");if(!this.newlineDisabled&&(""===a||"\n"===a)){var c=new fB;return c.newline=!0,void s.add(c)}var p=n.getSeriesByName(a)[0];if(!l.get(a)){if(p){var d=p.getData(),f=d.getVisual("legendLineStyle")||{},g=d.getVisual("legendIcon"),y=d.getVisual("style");this._createItem(p,a,o,r,e,t,f,y,g,u).on("click",pB(yB,a,null,i,h)).on("mouseover",pB(mB,p.name,null,i,h)).on("mouseout",pB(xB,p.name,null,i,h)),l.set(a,!0)}else n.eachRawSeries((function(n){if(!l.get(a)&&n.legendVisualProvider){var s=n.legendVisualProvider;if(!s.containName(a))return;var c=s.indexOfName(a),p=s.getItemVisual(c,"style"),d=s.getItemVisual(c,"legendIcon"),f=bn(p.fill);f&&0===f[3]&&(f[3]=.2,p=A(A({},p),{fill:kn(f,"rgba")})),this._createItem(n,a,o,r,e,t,{},p,d,u).on("click",pB(yB,null,a,i,h)).on("mouseover",pB(mB,null,a,i,h)).on("mouseout",pB(xB,null,a,i,h)),l.set(a,!0)}}),this);0}}),this),r&&this._createSelector(r,e,i,o,a)},e.prototype._createSelector=function(t,e,n,i,r){var o=this.getSelectorGroup();dB(t,(function(t){var i=t.type,r=new As({style:{x:0,y:0,align:"center",verticalAlign:"middle"},onclick:function(){n.dispatchAction({type:"all"===i?"legendAllSelect":"legendInverseSelect"})}});o.add(r),Wh(r,{normal:e.getModel("selectorLabel"),emphasis:e.getModel(["emphasis","selectorLabel"])},{defaultText:t.title}),Pl(r)}))},e.prototype._createItem=function(t,e,n,i,r,o,a,s,l,u){var h=t.visualDrawType,c=r.get("itemWidth"),p=r.get("itemHeight"),d=r.isSelected(e),f=i.get("symbolRotate"),g=i.get("symbolKeepAspect"),y=i.get("icon"),v=function(t,e,n,i,r,o){function a(t,e){"auto"===t.lineWidth&&(t.lineWidth=e.lineWidth>0?2:0),dB(t,(function(n,i){"inherit"===t[i]&&(t[i]=e[i])}))}var s=e.getModel("itemStyle").getItemStyle(),l=0===t.lastIndexOf("empty",0)?"fill":"stroke";s.decal=i.decal,"inherit"===s.fill&&(s.fill=i[r]);"inherit"===s.stroke&&(s.stroke=i[l]);"inherit"===s.opacity&&(s.opacity=("fill"===r?i:n).opacity);a(s,i);var u=e.getModel("lineStyle"),h=u.getLineStyle();if(a(h,n),"auto"===s.fill&&(s.fill=i.fill),"auto"===s.stroke&&(s.stroke=i.fill),"auto"===h.stroke&&(h.stroke=i.fill),!o){var c=e.get("inactiveBorderWidth"),p=s[l];s.lineWidth="auto"===c?i.lineWidth>0&&p?2:0:s.lineWidth,s.fill=e.get("inactiveColor"),s.stroke=e.get("inactiveBorderColor"),h.stroke=u.get("inactiveColor"),h.lineWidth=u.get("inactiveWidth")}return{itemStyle:s,lineStyle:h}}(l=y||l||"roundRect",i,a,s,h,d),m=new fB,x=i.getModel("textStyle");if(!U(t.getLegendIcon)||y&&"inherit"!==y){var _="inherit"===y&&t.getData().getVisual("symbol")?"inherit"===f?t.getData().getVisual("symbolRotate"):f:0;m.add(function(t){var e=t.icon||"roundRect",n=ky(e,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill,t.symbolKeepAspect);n.setStyle(t.itemStyle),n.rotation=(t.iconRotate||0)*Math.PI/180,n.setOrigin([t.itemWidth/2,t.itemHeight/2]),e.indexOf("empty")>-1&&(n.style.stroke=n.style.fill,n.style.fill="#fff",n.style.lineWidth=2);return n}({itemWidth:c,itemHeight:p,icon:l,iconRotate:_,itemStyle:v.itemStyle,lineStyle:v.lineStyle,symbolKeepAspect:g}))}else m.add(t.getLegendIcon({itemWidth:c,itemHeight:p,icon:l,iconRotate:f,itemStyle:v.itemStyle,lineStyle:v.lineStyle,symbolKeepAspect:g}));var b="left"===o?c+5:-5,w=o,S=r.get("formatter"),M=e;X(S)&&S?M=S.replace("{name}",null!=e?e:""):U(S)&&(M=S(e));var I=i.get("inactiveColor");m.add(new As({style:Yh(x,{text:M,x:b,y:p/2,fill:d?x.getTextColor():I,align:w,verticalAlign:"middle"})}));var T=new Ts({shape:m.getBoundingRect(),invisible:!0}),C=i.getModel("tooltip");return C.get("show")&&Nh({el:T,componentModel:r,itemName:e,itemTooltipOption:C.option}),m.add(T),m.eachChild((function(t){t.silent=!0})),T.silent=!u,this.getContentGroup().add(m),Pl(m),m.__legendDataIndex=n,m},e.prototype.layoutInner=function(t,e,n,i,r,o){var a=this.getContentGroup(),s=this.getSelectorGroup();vp(t.get("orient"),a,t.get("itemGap"),n.width,n.height);var l=a.getBoundingRect(),u=[-l.x,-l.y];if(s.markRedraw(),a.markRedraw(),r){vp("horizontal",s,t.get("selectorItemGap",!0));var h=s.getBoundingRect(),c=[-h.x,-h.y],p=t.get("selectorButtonGap",!0),d=t.getOrient().index,f=0===d?"width":"height",g=0===d?"height":"width",y=0===d?"y":"x";"end"===o?c[d]+=l[f]+p:u[d]+=h[f]+p,c[1-d]+=l[g]/2-h[g]/2,s.x=c[0],s.y=c[1],a.x=u[0],a.y=u[1];var v={x:0,y:0};return v[f]=l[f]+p+h[f],v[g]=Math.max(l[g],h[g]),v[y]=Math.min(0,h[y]+c[1-d]),v}return a.x=u[0],a.y=u[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type="legend.plain",e}(fg);function yB(t,e,n,i){xB(t,e,n,i),n.dispatchAction({type:"legendToggleSelect",name:null!=t?t:e}),mB(t,e,n,i)}function vB(t){for(var e,n=t.getZr().storage.getDisplayList(),i=0,r=n.length;in[r],f=[-c.x,-c.y];e||(f[i]=l[s]);var g=[0,0],y=[-p.x,-p.y],v=rt(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?y[i]+=n[r]-p[r]:g[i]+=p[r]+v);y[1-i]+=c[o]/2-p[o]/2,l.setPosition(f),u.setPosition(g),h.setPosition(y);var m={x:0,y:0};if(m[r]=d?n[r]:c[r],m[o]=Math.max(c[o],p[o]),m[a]=Math.min(0,p[a]+y[1-i]),u.__rectSize=n[r],d){var x={x:0,y:0};x[r]=Math.max(n[r]-p[r]-v,0),x[o]=m[o],u.setClipPath(new Ts({shape:x})),u.__rectSize=x[r]}else h.eachChild((function(t){t.attr({invisible:!0,silent:!0})}));var _=this._getPageInfo(t);return null!=_.pageIndex&&ih(l,{x:_.contentPosition[0],y:_.contentPosition[1]},d?t:null),this._updatePageInfoView(t,_),m},e.prototype._pageGo=function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},e.prototype._updatePageInfoView=function(t,e){var n=this._controllerGroup;E(["pagePrev","pageNext"],(function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")}));var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",X(r)?r.replace("{current}",null==a?"":a+"").replace("{total}",null==s?"":s+""):r({current:a,total:s}))},e.prototype._getPageInfo=function(t){var e=t.get("scrollDataIndex",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,r=t.getOrient().index,o=TB[r],a=CB[r],s=this._findTargetItemIndex(e),l=n.children(),u=l[s],h=l.length,c=h?1:0,p={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return p;var d=m(u);p.contentPosition[r]=-d.s;for(var f=s+1,g=d,y=d,v=null;f<=h;++f)(!(v=m(l[f]))&&y.e>g.s+i||v&&!x(v,g.s))&&(g=y.i>g.i?y:v)&&(null==p.pageNextDataIndex&&(p.pageNextDataIndex=g.i),++p.pageCount),y=v;for(f=s-1,g=d,y=d,v=null;f>=-1;--f)(v=m(l[f]))&&x(y,v.s)||!(g.i=e&&t.s<=e+i}},e.prototype._findTargetItemIndex=function(t){return this._showController?(this.getContentGroup().eachChild((function(i,r){var o=i.__legendDataIndex;null==n&&null!=o&&(n=r),o===t&&(e=r)})),null!=e?e:n):0;var e,n},e.type="legend.scroll",e}(gB);function AB(t){_m(wB),t.registerComponentModel(SB),t.registerComponentView(DB),function(t){t.registerAction("legendScroll","legendscroll",(function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},(function(t){t.setScrollDataIndex(n)}))}))}(t)}var kB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.inside",e.defaultOption=gc(DE.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(DE),LB=So();function PB(t,e,n){LB(t).coordSysRecordMap.each((function(t){var i=t.dataZoomInfoMap.get(e.uid);i&&(i.getRange=n)}))}function OB(t,e){if(e){t.removeKey(e.model.uid);var n=e.controller;n&&n.dispose()}}function RB(t,e){t.isDisposed()||t.dispatchAction({type:"dataZoom",animation:{easing:"cubicOut",duration:100},batch:e})}function NB(t,e,n,i){return t.coordinateSystem.containPoint([n,i])}function EB(t){t.registerProcessor(t.PRIORITY.PROCESSOR.FILTER,(function(t,e){var n=LB(e),i=n.coordSysRecordMap||(n.coordSysRecordMap=ft());i.each((function(t){t.dataZoomInfoMap=null})),t.eachComponent({mainType:"dataZoom",subType:"inside"},(function(t){E(TE(t).infoList,(function(n){var r=n.model.uid,o=i.get(r)||i.set(r,function(t,e){var n={model:e,containsPoint:H(NB,e),dispatchAction:H(RB,t),dataZoomInfoMap:null,controller:null},i=n.controller=new DI(t.getZr());return E(["pan","zoom","scrollMove"],(function(t){i.on(t,(function(e){var i=[];n.dataZoomInfoMap.each((function(r){if(e.isAvailableBehavior(r.model.option)){var o=(r.getRange||{})[t],a=o&&o(r.dzReferCoordSysInfo,n.model.mainType,n.controller,e);!r.model.get("disabled",!0)&&a&&i.push({dataZoomId:r.model.id,start:a[0],end:a[1]})}})),i.length&&n.dispatchAction(i)}))})),n}(e,n.model));(o.dataZoomInfoMap||(o.dataZoomInfoMap=ft())).set(t.uid,{dzReferCoordSysInfo:n,model:t,getRange:null})}))})),i.each((function(t){var e,n=t.controller,r=t.dataZoomInfoMap;if(r){var o=r.keys()[0];null!=o&&(e=r.get(o))}if(e){var a=function(t){var e,n="type_",i={type_true:2,type_move:1,type_false:0,type_undefined:-1},r=!0;return t.each((function(t){var o=t.model,a=!o.get("disabled",!0)&&(!o.get("zoomLock",!0)||"move");i[n+a]>i[n+e]&&(e=a),r=r&&o.get("preventDefaultMouseMove",!0)})),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!r}}}(r);n.enable(a.controlType,a.opt),n.setPointerChecker(t.containsPoint),Dg(t,"dispatchAction",e.model.get("throttle",!0),"fixRate")}else OB(i,t)}))}))}var zB=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.type="dataZoom.inside",e}return n(e,t),e.prototype.render=function(e,n,i){t.prototype.render.apply(this,arguments),e.noTarget()?this._clear():(this.range=e.getPercentRange(),PB(i,e,{pan:W(VB.pan,this),zoom:W(VB.zoom,this),scrollMove:W(VB.scrollMove,this)}))},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){!function(t,e){for(var n=LB(t).coordSysRecordMap,i=n.keys(),r=0;r0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return sk(0,o,[0,100],0,h.minSpan,h.maxSpan),this.range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:BB((function(t,e,n,i,r,o){var a=FB[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength})),scrollMove:BB((function(t,e,n,i,r,o){return FB[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta}))};function BB(t){return function(e,n,i,r){var o=this.range,a=o.slice(),s=e.axisModels[0];if(s)return sk(t(a,s,e,n,i,r),a,[0,100],"all"),this.range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}var FB={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};function GB(t){VE(t),t.registerComponentModel(kB),t.registerComponentView(zB),EB(t)}var WB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.type="dataZoom.slider",e.layoutMode="box",e.defaultOption=gc(DE.defaultOption,{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,borderColor:"#d2dbee",borderRadius:3,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#d2dbee",width:.5},areaStyle:{color:"#d2dbee",opacity:.2}},selectedDataBackground:{lineStyle:{color:"#8fb0f7",width:.5},areaStyle:{color:"#8fb0f7",opacity:.2}},fillerColor:"rgba(135,175,274,0.2)",handleIcon:"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z",handleSize:"100%",handleStyle:{color:"#fff",borderColor:"#ACB8D1"},moveHandleSize:7,moveHandleIcon:"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z",moveHandleStyle:{color:"#D2DBEE",opacity:.7},showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#6E7079"},brushSelect:!0,brushStyle:{color:"rgba(135,175,274,0.15)"},emphasis:{handleStyle:{borderColor:"#8FB0F7"},moveHandleStyle:{color:"#8FB0F7"}}}),e}(DE),HB=Ts,YB="horizontal",UB="vertical",XB=["line","bar","candlestick","scatter"],ZB={easing:"cubicOut",duration:100,delay:0},jB=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._displayables={},n}return n(e,t),e.prototype.init=function(t,e){this.api=e,this._onBrush=W(this._onBrush,this),this._onBrushEnd=W(this._onBrushEnd,this)},e.prototype.render=function(e,n,i,r){if(t.prototype.render.apply(this,arguments),Dg(this,"_dispatchZoomAction",e.get("throttle"),"fixRate"),this._orient=e.getOrient(),!1!==e.get("show")){if(e.noTarget())return this._clear(),void this.group.removeAll();r&&"dataZoom"===r.type&&r.from===this.uid||this._buildView(),this._updateView()}else this.group.removeAll()},e.prototype.dispose=function(){this._clear(),t.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){Ag(this,"_dispatchZoomAction");var t=this.api.getZr();t.off("mousemove",this._onBrush),t.off("mouseup",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var e=this._displayables.sliderGroup=new Cr;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,e=this.api,n=t.get("brushSelect")?7:0,i=this._findCoordRect(),r={width:e.getWidth(),height:e.getHeight()},o=this._orient===YB?{right:r.width-i.x-i.width,top:r.height-30-7-n,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=wp(t.option);E(["right","top","width","height"],(function(t){"ph"===a[t]&&(a[t]=o[t])}));var s=mp(a,r);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===UB&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.sliderGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==YB||r?n===YB&&r?{scaleY:a?1:-1,scaleX:-1}:n!==UB||r?{scaleY:a?-1:1,scaleX:-1,rotation:Math.PI/2}:{scaleY:a?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:a?1:-1,scaleX:1});var s=t.getBoundingRect([o]);t.x=e.x-s.x,t.y=e.y-s.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.sliderGroup,i=t.get("brushSelect");n.add(new HB({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40}));var r=new HB({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:W(this._onClickPanel,this)}),o=this.api.getZr();i?(r.on("mousedown",this._onBrushStart,this),r.cursor="crosshair",o.on("mousemove",this._onBrush),o.on("mouseup",this._onBrushEnd)):(o.off("mousemove",this._onBrush),o.off("mouseup",this._onBrushEnd)),n.add(r)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],t){var e=this._size,n=this._shadowSize||[],i=t.series,r=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=this._shadowPolygonPts,s=this._shadowPolylinePts;if(r!==this._shadowData||o!==this._shadowDim||e[0]!==n[0]||e[1]!==n[1]){var l=r.getDataExtent(o),u=.3*(l[1]-l[0]);l=[l[0]-u,l[1]+u];var h,c=[0,e[1]],p=[0,e[0]],d=[[e[0],0],[0,0]],f=[],g=p[1]/(r.count()-1),y=0,v=Math.round(r.count()/e[0]);r.each([o],(function(t,e){if(v>0&&e%v)y+=g;else{var n=null==t||isNaN(t)||""===t,i=n?0:Nr(t,l,c,!0);n&&!h&&e?(d.push([d[d.length-1][0],0]),f.push([f[f.length-1][0],0])):!n&&h&&(d.push([y,0]),f.push([y,0])),d.push([y,i]),f.push([y,i]),y+=g,h=n}})),a=this._shadowPolygonPts=d,s=this._shadowPolylinePts=f}this._shadowData=r,this._shadowDim=o,this._shadowSize=[e[0],e[1]];for(var m=this.dataZoomModel,x=0;x<3;x++){var _=b(1===x);this._displayables.sliderGroup.add(_),this._displayables.dataShadowSegs.push(_)}}}function b(t){var e=m.getModel(t?"selectedDataBackground":"dataBackground"),n=new Cr,i=new Lu({shape:{points:a},segmentIgnoreThreshold:1,style:e.getModel("areaStyle").getAreaStyle(),silent:!0,z2:-20}),r=new Ou({shape:{points:s},segmentIgnoreThreshold:1,style:e.getModel("lineStyle").getLineStyle(),silent:!0,z2:-19});return n.add(i),n.add(r),n}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis((function(r,o){E(t.getAxisProxy(r,o).getTargetSeriesModels(),(function(t){if(!(n||!0!==e&&P(XB,t.get("type"))<0)){var a,s=i.getComponent(ME(r),o).axis,l={x:"y",y:"x",radius:"angle",angle:"radius"}[r],u=t.coordinateSystem;null!=l&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),l=t.getData().mapDimension(l),n={thisAxis:s,series:t,thisDim:r,otherDim:l,otherAxisInverse:a}}}),this)}),this),n}},e.prototype._renderHandle=function(){var t=this.group,e=this._displayables,n=e.handles=[null,null],i=e.handleLabels=[null,null],r=this._displayables.sliderGroup,o=this._size,a=this.dataZoomModel,s=this.api,l=a.get("borderRadius")||0,u=a.get("brushSelect"),h=e.filler=new HB({silent:u,style:{fill:a.get("fillerColor")},textConfig:{position:"inside"}});r.add(h),r.add(new HB({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:o[0],height:o[1],r:l},style:{stroke:a.get("dataBackgroundColor")||a.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}})),E([0,1],(function(e){var o=a.get("handleIcon");!Cy[o]&&o.indexOf("path://")<0&&o.indexOf("image://")<0&&(o="path://"+o);var s=ky(o,-1,0,2,2,null,!0);s.attr({cursor:qB(this._orient),draggable:!0,drift:W(this._onDragMove,this,e),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1),z2:5});var l=s.getBoundingRect(),u=a.get("handleSize");this._handleHeight=Er(u,this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,s.setStyle(a.getModel("handleStyle").getItemStyle()),s.style.strokeNoScale=!0,s.rectHover=!0,s.ensureState("emphasis").style=a.getModel(["emphasis","handleStyle"]).getItemStyle(),Pl(s);var h=a.get("handleColor");null!=h&&(s.style.fill=h),r.add(n[e]=s);var c=a.getModel("textStyle");t.add(i[e]=new As({silent:!0,invisible:!0,style:Yh(c,{x:0,y:0,text:"",verticalAlign:"middle",align:"center",fill:c.getTextColor(),font:c.getFont()}),z2:10}))}),this);var c=h;if(u){var p=Er(a.get("moveHandleSize"),o[1]),d=e.moveHandle=new Ts({style:a.getModel("moveHandleStyle").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:o[1]-.5,height:p}}),f=.8*p,g=e.moveHandleIcon=ky(a.get("moveHandleIcon"),-f/2,-f/2,f,f,"#fff",!0);g.silent=!0,g.y=o[1]+p/2-.5,d.ensureState("emphasis").style=a.getModel(["emphasis","moveHandleStyle"]).getItemStyle();var y=Math.min(o[1]/2,Math.max(p,10));(c=e.moveZone=new Ts({invisible:!0,shape:{y:o[1]-y,height:p+y}})).on("mouseover",(function(){s.enterEmphasis(d)})).on("mouseout",(function(){s.leaveEmphasis(d)})),r.add(d),r.add(g),r.add(c)}c.attr({draggable:!0,cursor:qB(this._orient),drift:W(this._onDragMove,this,"all"),ondragstart:W(this._showDataInfo,this,!0),ondragend:W(this._onDragEnd,this),onmouseover:W(this._showDataInfo,this,!0),onmouseout:W(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Nr(t[0],[0,100],e,!0),Nr(t[1],[0,100],e,!0)]},e.prototype._updateInterval=function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];sk(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Nr(o.minSpan,a,r,!0):null,null!=o.maxSpan?Nr(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=Vr([Nr(i[0],r,a,!0),Nr(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},e.prototype._updateView=function(t){var e=this._displayables,n=this._handleEnds,i=Vr(n.slice()),r=this._size;E([0,1],(function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scaleX:o/2,scaleY:o/2,x:n[t]+(t?-1:1),y:r[1]/2-o/2})}),this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]});var o={x:i[0],width:i[1]-i[0]};e.moveHandle&&(e.moveHandle.setShape(o),e.moveZone.setShape(o),e.moveZone.getBoundingRect(),e.moveHandleIcon&&e.moveHandleIcon.attr("x",o.x+o.width/2));for(var a=e.dataShadowSegs,s=[0,i[0],i[1],r[0]],l=0;le[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var e=t.offsetX,n=t.offsetY;this._brushStart=new Ji(e,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(this._brushing){var e=this._displayables.brushRect;if(this._brushing=!1,e){e.attr("ignore",!0);var n=e.shape;if(!(+new Date-this._brushStartTime<200&&Math.abs(n.width)<5)){var i=this._getViewExtent(),r=[0,100];this._range=Vr([Nr(n.x,i,r,!0),Nr(n.x+n.width,i,r,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(se(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,e){var n=this._displayables,i=this.dataZoomModel,r=n.brushRect;r||(r=n.brushRect=new HB({silent:!0,style:i.getModel("brushStyle").getItemStyle()}),n.sliderGroup.add(r)),r.attr("ignore",!1);var o=this._brushStart,a=this._displayables.sliderGroup,s=a.transformCoordToLocal(t,e),l=a.transformCoordToLocal(o.x,o.y),u=this._size;s[0]=Math.max(Math.min(u[0],s[0]),0),r.setShape({x:l[0],y:0,width:s[0]-l[0],height:u[1]})},e.prototype._dispatchZoomAction=function(t){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?ZB:null,start:e[0],end:e[1]})},e.prototype._findCoordRect=function(){var t,e=TE(this.dataZoomModel).infoList;if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),r=this.api.getHeight();t={x:.2*i,y:.2*r,width:.6*i,height:.6*r}}return t},e.type="dataZoom.slider",e}(LE);function qB(t){return"vertical"===t?"ns-resize":"ew-resize"}function KB(t){t.registerComponentModel(WB),t.registerComponentView(jB),VE(t)}var $B=function(t,e,n){var i=T((JB[t]||{})[e]);return n&&Y(i)?i[i.length-1]:i},JB={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},QB=eD.mapVisual,tF=eD.eachVisual,eF=Y,nF=E,iF=Vr,rF=Nr,oF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n.stateList=["inRange","outOfRange"],n.replacableOptionKeys=["inRange","outOfRange","target","controller","color"],n.layoutMode={type:"box",ignoreSize:!0},n.dataBound=[-1/0,1/0],n.targetVisuals={},n.controllerVisuals={},n}return n(e,t),e.prototype.init=function(t,e,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,e){var n=this.option;!e&&tV(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var e=this.stateList;t=W(t,this),this.controllerVisuals=Qz(this.option.controller,e,t),this.targetVisuals=Qz(this.option.target,e,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,e=[];return null==t||"all"===t?this.ecModel.eachSeries((function(t,n){e.push(n)})):e=ho(t),e},e.prototype.eachTargetSeries=function(t,e){E(this.getTargetSeriesIndices(),(function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(e,i)}),this)},e.prototype.isTargetSeries=function(t){var e=!1;return this.eachTargetSeries((function(n){n===t&&(e=!0)})),e},e.prototype.formatValueText=function(t,e,n){var i,r=this.option,o=r.precision,a=this.dataBound,s=r.formatter;n=n||["<",">"],Y(t)&&(t=t.slice(),i=!0);var l=e?t:i?[u(t[0]),u(t[1])]:u(t);return X(s)?s.replace("{value}",i?l[0]:l).replace("{value2}",i?l[1]:l):U(s)?i?s(t[0],t[1]):s(t):i?t[0]===a[0]?n[0]+" "+l[1]:t[1]===a[1]?n[1]+" "+l[0]:l[0]+" - "+l[1]:l;function u(t){return t===a[0]?"min":t===a[1]?"max":(+t).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,e=iF([t.min,t.max]);this._dataExtent=e},e.prototype.getDataDimensionIndex=function(t){var e=this.option.dimension;if(null!=e)return t.getDimensionIndex(e);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var r=n[i],o=t.getDimensionInfo(r);if(!o.isCalculationCoord)return o.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,e=this.option,n={inRange:e.inRange,outOfRange:e.outOfRange},i=e.target||(e.target={}),r=e.controller||(e.controller={});C(i,n),C(r,n);var o=this.isCategory();function a(n){eF(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")}}a.call(this,i),a.call(this,r),function(t,e,n){var i=t[e],r=t[n];i&&!r&&(r=t[n]={},nF(i,(function(t,e){if(eD.isValidType(e)){var n=$B(e,"inactive",o);null!=n&&(r[e]=n,"color"!==e||r.hasOwnProperty("opacity")||r.hasOwnProperty("colorAlpha")||(r.opacity=[0,0]))}})))}.call(this,i,"inRange","outOfRange"),function(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,n=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,i=this.get("inactiveColor"),r=this.getItemSymbol()||"roundRect";nF(this.stateList,(function(a){var s=this.itemSize,l=t[a];l||(l=t[a]={color:o?i:[i]}),null==l.symbol&&(l.symbol=e&&T(e)||(o?r:[r])),null==l.symbolSize&&(l.symbolSize=n&&T(n)||(o?s[0]:[s[0],s[0]])),l.symbol=QB(l.symbol,(function(t){return"none"===t?r:t}));var u=l.symbolSize;if(null!=u){var h=-1/0;tF(u,(function(t){t>h&&(h=t)})),l.symbolSize=QB(u,(function(t){return rF(t,[0,h],[0,s[0]],!0)}))}}),this)}.call(this,r)},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type="visualMap",e.dependencies=["series"],e.defaultOption={show:!0,z:4,seriesIndex:"all",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:"#333"}},e}(Ip),aF=[20,140],sF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual((function(t){t.mappingMethod="linear",t.dataExtent=this.getExtent()})),this._resetRange()},e.prototype.resetItemSize=function(){t.prototype.resetItemSize.apply(this,arguments);var e=this.itemSize;(null==e[0]||isNaN(e[0]))&&(e[0]=aF[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=aF[1])},e.prototype._resetRange=function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):Y(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},e.prototype.completeVisualOption=function(){t.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,(function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=e[1]/3)}),this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),e=Vr((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=n[1]||t<=e[1])?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[];return this.eachTargetSeries((function(n){var i=[],r=n.getData();r.each(this.getDataDimensionIndex(r),(function(e,n){t[0]<=e&&e<=t[1]&&i.push(n)}),this),e.push({seriesId:n.id,dataIndex:i})}),this),e},e.prototype.getVisualMeta=function(t){var e=lF(this,"outOfRange",this.getExtent()),n=lF(this,"inRange",this.option.range.slice()),i=[];function r(e,n){i.push({value:e,color:t(e,n)})}for(var o=0,a=0,s=n.length,l=e.length;at[1])break;n.push({color:this.getControllerVisual(o,"color",e),offset:r/100})}return n.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),n},e.prototype._createBarPoints=function(t,e){var n=this.visualMapModel.itemSize;return[[n[0]-e[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-e[1],t[1]]]},e.prototype._createBarGroup=function(t){var e=this._orient,n=this.visualMapModel.get("inverse");return new Cr("horizontal"!==e||n?"horizontal"===e&&n?{scaleX:"bottom"===t?-1:1,rotation:-Math.PI/2}:"vertical"!==e||n?{scaleX:"left"===t?1:-1}:{scaleX:"left"===t?1:-1,scaleY:-1}:{scaleX:"bottom"===t?1:-1,rotation:Math.PI/2})},e.prototype._updateHandle=function(t,e){if(this._useHandle){var n=this._shapes,i=this.visualMapModel,r=n.handleThumbs,o=n.handleLabels,a=i.itemSize,s=i.getExtent();fF([0,1],(function(l){var u=r[l];u.setStyle("fill",e.handlesColor[l]),u.y=t[l];var h=dF(t[l],[0,a[1]],s,!0),c=this.getControllerVisual(h,"symbolSize");u.scaleX=u.scaleY=c/a[0],u.x=a[0]-c/2;var p=Ih(n.handleLabelPoints[l],Mh(u,this.group));o[l].setStyle({x:p[0],y:p[1],text:i.formatValueText(this._dataInterval[l]),verticalAlign:"middle",align:"vertical"===this._orient?this._applyTransform("left",n.mainGroup):"center"})}),this)}},e.prototype._showIndicator=function(t,e,n,i){var r=this.visualMapModel,o=r.getExtent(),a=r.itemSize,s=[0,a[1]],l=this._shapes,u=l.indicator;if(u){u.attr("invisible",!1);var h=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0}),c=this.getControllerVisual(t,"symbolSize"),p=dF(t,o,s,!0),d=a[0]-c/2,f={x:u.x,y:u.y};u.y=p,u.x=d;var g=Ih(l.indicatorLabelPoint,Mh(u,this.group)),y=l.indicatorLabel;y.attr("invisible",!1);var v=this._applyTransform("left",l.mainGroup),m="horizontal"===this._orient;y.setStyle({text:(n||"")+r.formatValueText(e),verticalAlign:m?v:"middle",align:m?"center":v});var x={x:d,y:p,style:{fill:h}},_={style:{x:g[0],y:g[1]}};if(r.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var b={duration:100,easing:"cubicInOut",additive:!0};u.x=f.x,u.y=f.y,u.animateTo(x,b),y.animateTo(_,b)}else u.attr(x),y.attr(_);this._firstShowIndicator=!1;var w=this._shapes.handleLabels;if(w)for(var S=0;Sr[1]&&(u[1]=1/0),e&&(u[0]===-1/0?this._showIndicator(l,u[1],"< ",a):u[1]===1/0?this._showIndicator(l,u[0],"> ",a):this._showIndicator(l,l,"≈ ",a));var h=this._hoverLinkDataIndices,c=[];(e||xF(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(u));var p=function(t,e){var n={},i={};return r(t||[],n),r(e||[],i,n),[o(n),o(i)];function r(t,e,n){for(var i=0,r=t.length;i=0&&(r.dimension=o,i.push(r))}})),t.getData().setVisual("visualMeta",i)}}];function MF(t,e,n,i){for(var r=e.targetVisuals[i],o=eD.prepareVisualTypes(r),a={color:fy(t.getData(),"color")},s=0,l=o.length;s0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})),t.registerAction(bF,wF),E(SF,(function(e){t.registerVisual(t.PRIORITY.VISUAL.COMPONENT,e)})),t.registerPreprocessor(TF))}function kF(t){t.registerComponentModel(sF),t.registerComponentView(vF),AF(t)}var LF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n._pieceList=[],n}return n(e,t),e.prototype.optionUpdated=function(e,n){t.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var i=this._mode=this._determineMode();this._pieceList=[],PF[this._mode].call(this,this._pieceList),this._resetSelected(e,n);var r=this.option.categories;this.resetVisual((function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=T(r)):(t.dataExtent=this.getExtent(),t.mappingMethod="piecewise",t.pieceList=z(this._pieceList,(function(t){return t=T(t),"inRange"!==e&&(t.visual=null),t})))}))},e.prototype.completeVisualOption=function(){var e=this.option,n={},i=eD.listVisualTypes(),r=this.isCategory();function o(t,e,n){return t&&t[e]&&t[e].hasOwnProperty(n)}E(e.pieces,(function(t){E(i,(function(e){t.hasOwnProperty(e)&&(n[e]=1)}))})),E(n,(function(t,n){var i=!1;E(this.stateList,(function(t){i=i||o(e,t,n)||o(e.target,t,n)}),this),!i&&E(this.stateList,(function(t){(e[t]||(e[t]={}))[n]=$B(n,"inRange"===t?"active":"inactive",r)}))}),this),t.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,e){var n=this.option,i=this._pieceList,r=(e?n:t).selected||{};if(n.selected=r,E(i,(function(t,e){var n=this.getSelectedMapKey(t);r.hasOwnProperty(n)||(r[n]=!0)}),this),"single"===n.selectedMode){var o=!1;E(i,(function(t,e){var n=this.getSelectedMapKey(t);r[n]&&(o?r[n]=!1:o=!0)}),this)}},e.prototype.getItemSymbol=function(){return this.get("itemSymbol")},e.prototype.getSelectedMapKey=function(t){return"categories"===this._mode?t.value+"":t.index+""},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},e.prototype.setSelected=function(t){this.option.selected=T(t)},e.prototype.getValueState=function(t){var e=eD.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?"inRange":"outOfRange"},e.prototype.findTargetDataIndices=function(t){var e=[],n=this._pieceList;return this.eachTargetSeries((function(i){var r=[],o=i.getData();o.each(this.getDataDimensionIndex(o),(function(e,i){eD.findPieceIndex(e,n)===t&&r.push(i)}),this),e.push({seriesId:i.id,dataIndex:r})}),this),e},e.prototype.getRepresentValue=function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var n=t.interval||[];e=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return e},e.prototype.getVisualMeta=function(t){if(!this.isCategory()){var e=[],n=["",""],i=this,r=this._pieceList.slice();if(r.length){var o=r[0].interval[0];o!==-1/0&&r.unshift({interval:[-1/0,o]}),(o=r[r.length-1].interval[1])!==1/0&&r.push({interval:[o,1/0]})}else r.push({interval:[-1/0,1/0]});var a=-1/0;return E(r,(function(t){var e=t.interval;e&&(e[0]>a&&s([a,e[0]],"outOfRange"),s(e.slice()),a=e[1])}),this),{stops:e,outerColors:n}}function s(r,o){var a=i.getRepresentValue({interval:r});o||(o=i.getValueState(a));var s=t(a,o);r[0]===-1/0?n[0]=s:r[1]===1/0?n[1]=s:e.push({value:r[0],color:s},{value:r[1],color:s})}},e.type="visualMap.piecewise",e.defaultOption=gc(oF.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieces:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0}),e}(oF),PF={splitNumber:function(t){var e=this.option,n=Math.min(e.precision,20),i=this.getExtent(),r=e.splitNumber;r=Math.max(parseInt(r,10),1),e.splitNumber=r;for(var o=(i[1]-i[0])/r;+o.toFixed(n)!==o&&n<5;)n++;e.precision=n,o=+o.toFixed(n),e.minOpen&&t.push({interval:[-1/0,i[0]],close:[0,0]});for(var a=0,s=i[0];a","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,n)}),this)}};function OF(t,e){var n=t.inverse;("vertical"===t.orient?!n:n)&&e.reverse()}var RF=function(t){function e(){var n=null!==t&&t.apply(this,arguments)||this;return n.type=e.type,n}return n(e,t),e.prototype.doRender=function(){var t=this.group;t.removeAll();var e=this.visualMapModel,n=e.get("textGap"),i=e.textStyleModel,r=i.getFont(),o=i.getTextColor(),a=this._getItemAlign(),s=e.itemSize,l=this._getViewData(),u=l.endsText,h=it(e.get("showLabel",!0),!u);u&&this._renderEndsText(t,u[0],s,h,a),E(l.viewPieceList,(function(i){var l=i.piece,u=new Cr;u.onclick=W(this._onItemClick,this,l),this._enableHoverLink(u,i.indexInModelPieceList);var c=e.getRepresentValue(l);if(this._createItemSymbol(u,c,[0,0,s[0],s[1]]),h){var p=this.visualMapModel.getValueState(c);u.add(new As({style:{x:"right"===a?-n:s[0]+n,y:s[1]/2,text:l.text,verticalAlign:"middle",align:a,font:r,fill:o,opacity:"outOfRange"===p?.5:1}}))}t.add(u)}),this),u&&this._renderEndsText(t,u[1],s,h,a),vp(e.get("orient"),t,e.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,e){var n=this;t.on("mouseover",(function(){return i("highlight")})).on("mouseout",(function(){return i("downplay")}));var i=function(t){var i=n.visualMapModel;i.option.hoverLink&&n.api.dispatchAction({type:t,batch:pF(i.findTargetDataIndices(e),i)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return cF(t,this.api,t.itemSize);var n=e.align;return n&&"auto"!==n||(n="left"),n},e.prototype._renderEndsText=function(t,e,n,i,r){if(e){var o=new Cr,a=this.visualMapModel.textStyleModel;o.add(new As({style:{x:i?"right"===r?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:"middle",align:i?r:"center",text:e,font:a.getFont(),fill:a.getTextColor()}})),t.add(o)}},e.prototype._getViewData=function(){var t=this.visualMapModel,e=z(t.getPieceList(),(function(t,e){return{piece:t,indexInModelPieceList:e}})),n=t.get("text"),i=t.get("orient"),r=t.get("inverse");return("horizontal"===i?r:!r)?e.reverse():n&&(n=n.slice().reverse()),{viewPieceList:e,endsText:n}},e.prototype._createItemSymbol=function(t,e,n){t.add(ky(this.getControllerVisual(e,"symbol"),n[0],n[1],n[2],n[3],this.getControllerVisual(e,"color")))},e.prototype._onItemClick=function(t){var e=this.visualMapModel,n=e.option,i=T(n.selected),r=e.getSelectedMapKey(t);"single"===n.selectedMode?(i[r]=!0,E(i,(function(t,e){i[e]=e===r}))):i[r]=!i[r],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:i})},e.type="visualMap.piecewise",e}(uF);function NF(t){t.registerComponentModel(LF),t.registerComponentView(RF),AF(t)}var EF={label:{enabled:!0},decal:{show:!1}},zF=So(),VF={};function BF(t,e){var n=t.getModel("aria");if(n.get("enabled")){var i=T(EF);C(i.label,t.getLocaleModel().get("aria"),!1),C(n.option,i,!1),function(){if(n.getModel("decal").get("show")){var e=ft();t.eachSeries((function(t){if(!t.isColorBySeries()){var n=e.get(t.type);n||(n={},e.set(t.type,n)),zF(t).scope=n}})),t.eachRawSeries((function(e){if(!t.isSeriesFiltered(e))if(U(e.enableAriaDecal))e.enableAriaDecal();else{var n=e.getData();if(e.isColorBySeries()){var i=td(e.ecModel,e.name,VF,t.getSeriesCount()),r=n.getVisual("decal");n.setVisual("decal",u(r,i))}else{var o=e.getRawData(),a={},s=zF(e).scope;n.each((function(t){var e=n.getRawIndex(t);a[e]=t}));var l=o.count();o.each((function(t){var i=a[t],r=o.getName(t)||t+"",h=td(e.ecModel,r,s,l),c=n.getItemVisual(i,"decal");n.setItemVisual(i,"decal",u(c,h))}))}}function u(t,e){var n=t?A(A({},e),t):e;return n.dirty=!0,n}}))}}(),function(){var i=t.getLocaleModel().get("aria"),o=n.getModel("label");if(o.option=k(o.option,i),!o.get("enabled"))return;var a=e.getZr().dom;if(o.get("description"))return void a.setAttribute("aria-label",o.get("description"));var s,l=t.getSeriesCount(),u=o.get(["data","maxCount"])||10,h=o.get(["series","maxCount"])||10,c=Math.min(l,h);if(l<1)return;var p=function(){var e=t.get("title");e&&e.length&&(e=e[0]);return e&&e.text}();if(p){var d=o.get(["general","withTitle"]);s=r(d,{title:p})}else s=o.get(["general","withoutTitle"]);var f=[],g=l>1?o.get(["series","multiple","prefix"]):o.get(["series","single","prefix"]);s+=r(g,{seriesCount:l}),t.eachSeries((function(e,n){if(n1?o.get(["series","multiple",a]):o.get(["series","single",a]),{seriesId:e.seriesIndex,seriesName:e.get("name"),seriesType:(x=e.subType,t.getLocaleModel().get(["series","typeNames"])[x]||"自定义图")});var s=e.getData();if(s.count()>u)i+=r(o.get(["data","partialData"]),{displayCnt:u});else i+=o.get(["data","allData"]);for(var h=o.get(["data","separator","middle"]),p=o.get(["data","separator","end"]),d=[],g=0;g":"gt",">=":"gte","=":"eq","!=":"ne","<>":"ne"},WF=function(){function t(t){if(null==(this._condVal=X(t)?new RegExp(t):et(t)?t:null)){var e="";0,ao(e)}}return t.prototype.evaluate=function(t){var e=typeof t;return X(e)?this._condVal.test(t):!!j(e)&&this._condVal.test(t+"")},t}(),HF=function(){function t(){}return t.prototype.evaluate=function(){return this.value},t}(),YF=function(){function t(){}return t.prototype.evaluate=function(){for(var t=this.children,e=0;e2&&l.push(e),e=[t,n]}function f(t,n,i,r){iG(t,i)&&iG(n,r)||e.push(t,n,i,r,i,r)}function g(t,n,i,r,o,a){var s=Math.abs(n-t),l=4*Math.tan(s/4)/3,u=nM:C2&&l.push(e),l}function oG(t,e,n,i,r,o,a,s,l,u){if(iG(t,n)&&iG(e,i)&&iG(r,a)&&iG(o,s))l.push(a,s);else{var h=2/u,c=h*h,p=a-t,d=s-e,f=Math.sqrt(p*p+d*d);p/=f,d/=f;var g=n-t,y=i-e,v=r-a,m=o-s,x=g*g+y*y,_=v*v+m*m;if(x=0&&_-w*w=0)l.push(a,s);else{var S=[],M=[];Ze(t,n,r,a,.5,S),Ze(e,i,o,s,.5,M),oG(S[0],M[0],S[1],M[1],S[2],M[2],S[3],M[3],l,u),oG(S[4],M[4],S[5],M[5],S[6],M[6],S[7],M[7],l,u)}}}}function aG(t,e,n){var i=t[e],r=t[1-e],o=Math.abs(i/r),a=Math.ceil(Math.sqrt(o*n)),s=Math.floor(n/a);0===s&&(s=1,a=n);for(var l=[],u=0;u0)for(u=0;uMath.abs(u),c=aG([l,u],h?0:1,e),p=(h?s:u)/c.length,d=0;d1?null:new Ji(d*l+t,d*u+e)}function hG(t,e,n){var i=new Ji;Ji.sub(i,n,e),i.normalize();var r=new Ji;return Ji.sub(r,t,e),r.dot(i)}function cG(t,e){var n=t[t.length-1];n&&n[0]===e[0]&&n[1]===e[1]||t.push(e)}function pG(t){var e=t.points,n=[],i=[];Ma(e,n,i);var r=new sr(n[0],n[1],i[0]-n[0],i[1]-n[1]),o=r.width,a=r.height,s=r.x,l=r.y,u=new Ji,h=new Ji;return o>a?(u.x=h.x=s+o/2,u.y=l,h.y=l+a):(u.y=h.y=l+a/2,u.x=s,h.x=s+o),function(t,e,n){for(var i=t.length,r=[],o=0;or,a=aG([i,r],o?0:1,e),s=o?"width":"height",l=o?"height":"width",u=o?"x":"y",h=o?"y":"x",c=t[s]/a.length,p=0;p0)for(var b=i/n,w=-i/2;w<=i/2;w+=b){var S=Math.sin(w),M=Math.cos(w),I=0;for(x=0;x0;l/=2){var u=0,h=0;(t&l)>0&&(u=1),(e&l)>0&&(h=1),s+=l*l*(3*u^h),0===h&&(1===u&&(t=l-1-t,e=l-1-e),a=t,t=e,e=a)}return s}function AG(t){var e=1/0,n=1/0,i=-1/0,r=-1/0,o=z(t,(function(t){var o=t.getBoundingRect(),a=t.getComputedTransform(),s=o.x+o.width/2+(a?a[4]:0),l=o.y+o.height/2+(a?a[5]:0);return e=Math.min(s,e),n=Math.min(l,n),i=Math.max(s,i),r=Math.max(l,r),[s,l]}));return z(o,(function(o,a){return{cp:o,z:DG(o[0],o[1],e,n,i,r),path:t[a]}})).sort((function(t,e){return t.z-e.z})).map((function(t){return t.path}))}function kG(t){return gG(t.path,t.count)}function LG(t){return Y(t[0])}function PG(t,e){for(var n=[],i=t.length,r=0;r=0;r--)if(!n[r].many.length){var l=n[s].many;if(l.length<=1){if(!s)return n;s=0}o=l.length;var u=Math.ceil(o/2);n[r].many=l.slice(u,o),n[s].many=l.slice(0,u),s++}return n}var OG={clone:function(t){for(var e=[],n=1-Math.pow(1-t.path.style.opacity,1/t.count),i=0;i0){var s,l,u=i.getModel("universalTransition").get("delay"),h=Object.assign({setToFinal:!0},a);LG(t)&&(s=t,l=e),LG(e)&&(s=e,l=t);for(var c=s?s===t:t.length>e.length,p=s?PG(l,s):PG(c?e:t,[c?t:e]),d=0,f=0;f1e4))for(var i=n.getIndices(),r=function(t){for(var e=t.dimensions,n=0;n0&&i.group.traverse((function(t){t instanceof fs&&!t.animators.length&&t.animateFrom({style:{opacity:0}},r)}))}))}function HG(t){var e=t.getModel("universalTransition").get("seriesKey");return e||t.id}function YG(t){return Y(t)?t.sort().join(","):t}function UG(t){if(t.hostModel)return t.hostModel.getModel("universalTransition").get("divideShape")}function XG(t,e){for(var n=0;n=0&&r.push({data:e.oldData[n],divide:UG(e.oldData[n]),dim:t.dimension})})),E(ho(t.to),(function(t){var e=XG(n.updatedSeries,t);if(e>=0){var i=n.updatedSeries[e].getData();o.push({data:i,divide:UG(i),dim:t.dimension})}})),r.length>0&&o.length>0&&WG(r,o,i)}(t,i,n,e)}));else{var o=function(t,e){var n=ft(),i=ft(),r=ft();return E(t.oldSeries,(function(e,n){var o=t.oldData[n],a=HG(e),s=YG(a);i.set(s,o),Y(a)&&E(a,(function(t){r.set(t,{data:o,key:s})}))})),E(e.updatedSeries,(function(t){if(t.isUniversalTransitionEnabled()&&t.isAnimationEnabled()){var e=t.getData(),o=HG(t),a=YG(o),s=i.get(a);if(s)n.set(a,{oldSeries:[{divide:UG(s),data:s}],newSeries:[{divide:UG(e),data:e}]});else if(Y(o)){var l=[];E(o,(function(t){var e=i.get(t);e&&l.push({divide:UG(e),data:e})})),l.length&&n.set(a,{oldSeries:l,newSeries:[{data:e,divide:UG(e)}]})}else{var u=r.get(o);if(u){var h=n.get(u.key);h||(h={oldSeries:[{data:u.data,divide:UG(u.data)}],newSeries:[]},n.set(u.key,h)),h.newSeries.push({data:e,divide:UG(e)})}}}})),n}(i,n);E(o.keys(),(function(t){var n=o.get(t);WG(n.oldSeries,n.newSeries,e)}))}E(n.updatedSeries,(function(t){t.__universalTransitionEnabled&&(t.__universalTransitionEnabled=!1)}))}for(var a=t.getSeries(),s=i.oldSeries=[],l=i.oldData=[],u=0;u.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color,#fff);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business,.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color,rgba(215,215,215,.3))}.fc .fc-bg-event{background:var(--fc-bg-event-color,#8fdf82);opacity:.3;opacity:var(--fc-bg-event-opacity,.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size,.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color,rgba(188,232,241,.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer,.fc-h-event,.fc-v-event{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width,8px)/ 2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width,1px);width:8px;width:var(--fc-event-resizer-dot-total-width,8px);height:8px;height:var(--fc-event-resizer-dot-total-width,8px);border-style:solid;border-color:inherit;background:var(--fc-page-bg-color,#fff)}.fc-event-selected .fc-event-resizer:before{content:'';position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after,.fc-event:focus:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color,rgba(0,0,0,.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-h-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness,8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(-.5 * var(--fc-event-resizer-thickness,8px))}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(-.5 * var(--fc-event-resizer-dot-total-width,8px))}.fc .fc-popover{position:absolute;z-index:9999;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd);background:var(--fc-page-bg-color,#fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}:root{--fc-daygrid-event-dot-width:8px;--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin-top:1px}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;padding:2px 3px 0}.fc .fc-daygrid-day-bottom:before{content:"";clear:both;display:table}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));color:grey;color:var(--fc-neutral-text-color,grey)}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:2px 0}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:700}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:0 4px;box-sizing:content-box;width:0;height:0;border:4px solid #3788d8;border:calc(var(--fc-daygrid-event-dot-width,8px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:4px;border-radius:calc(var(--fc-daygrid-event-dot-width,8px)/ 2)}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-v-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff);height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness,8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-body,.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0}.fc .fc-timegrid-slot:empty:before{content:'\00a0'}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-media-screen.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight,.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness{position:absolute}.fc-timegrid-event-harness>.fc-timegrid-event{position:absolute;top:0;bottom:0;left:0;right:0}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror,.fc-timegrid-more-link{box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px var(--fc-page-bg-color,#fff)}.fc-timegrid-event,.fc-timegrid-more-link{font-size:.85em;font-size:var(--fc-small-font-size,.85em);border-radius:3px}.fc-timegrid-event{margin-bottom:1px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size,.85em);margin-bottom:1px}.fc-timegrid-event-short .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-short .fc-event-time:after{content:'\00a0-\00a0'}.fc-timegrid-event-short .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-timegrid-more-link{position:absolute;z-index:9999;color:inherit;color:var(--fc-more-link-text-color,inherit);background:var(--fc-more-link-bg-color,#d0d0d0);cursor:pointer;margin-bottom:1px}.fc-timegrid-more-link-inner{padding:3px 2px;top:0}.fc-direction-ltr .fc-timegrid-more-link{right:0}.fc-direction-rtl .fc-timegrid-more-link{left:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red);border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-theme-standard .fc-list{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-list-empty{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:sticky;top:0;background:var(--fc-page-bg-color,#fff)}.fc .fc-list-table thead{position:absolute;left:-10000px}.fc .fc-list-table tbody>tr:first-child th{border-top:0}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:#f5f5f5;background-color:var(--fc-list-event-hover-bg-color,#f5f5f5)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;box-sizing:content-box;width:0;height:0;border:5px solid #3788d8;border:calc(var(--fc-list-event-dot-width,10px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:5px;border-radius:calc(var(--fc-list-event-dot-width,10px)/ 2)}.fc .fc-list-event-title a{color:inherit}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit} \ No newline at end of file diff --git a/public/static/assets/third_party/fullcalendar/main.min.js b/public/static/assets/third_party/fullcalendar/main.min.js new file mode 100644 index 0000000..59e8cc0 --- /dev/null +++ b/public/static/assets/third_party/fullcalendar/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar v5.10.1 +Docs & License: https://fullcalendar.io/ +(c) 2021 Adam Shaw +*/ +var FullCalendar=function(e){"use strict";var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,n)};function n(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}var r=function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n3)for(n=[n],i=3;i0?g(v.type,v.props,v.key,null,v.__v):v)){if(v.__=n,v.__b=n.__b+1,null===(h=D[p])||h&&v.key==h.key&&v.type===h.type)D[p]=void 0;else for(f=0;f3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),L(v(oe,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}(ne.prototype=new y).__e=function(e){var t=this,n=te(t.__v),r=t.o.get(e);return r[0]++,function(o){var i=function(){t.props.revealOrder?(r.push(o),re(t,e,r)):o()};n?n(i):i()}},ne.prototype.render=function(e){this.u=null,this.o=new Map;var t=R(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},ne.prototype.componentDidUpdate=ne.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){re(e,n,t)}))};var ae="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,se=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,le=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};y.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(y.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var ue=i.event;function ce(){}function de(){return this.cancelBubble}function pe(){return this.defaultPrevented}i.event=function(e){return ue&&(e=ue(e)),e.persist=ce,e.isPropagationStopped=de,e.isDefaultPrevented=pe,e.nativeEvent=e};var fe={configurable:!0,get:function(){return this.class}},he=i.vnode;i.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){for(var o in r={},n){var i=n[o];"value"===o&&"defaultValue"in n&&null==i||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===i?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!le(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():se.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():null===i&&(i=void 0),r[o]=i)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=R(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=R(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r}t&&n.class!=n.className&&(fe.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",fe)),e.$$typeof=ae,he&&he(e)};var ve=i.__r;i.__r=function(e){ve&&ve(e)},"object"==typeof performance&&"function"==typeof performance.now&&performance.now.bind(performance);var ge="undefined"!=typeof globalThis?globalThis:window;ge.FullCalendarVDom?console.warn("FullCalendar VDOM already loaded"):ge.FullCalendarVDom={Component:y,createElement:v,render:L,createRef:function(){return{current:null}},Fragment:m,createContext:function(e){var t=function(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some(b)},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}(e),n=t.Provider;return t.Provider=function(){var e=this,t=!this.getChildContext,r=n.apply(this,arguments);if(t){var o=[];this.shouldComponentUpdate=function(t){e.props.value!==t.value&&o.forEach((function(e){e.context=t.value,e.forceUpdate()}))},this.sub=function(e){o.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){o.splice(o.indexOf(e),1),t&&t.call(e)}}}return r},t},createPortal:function(e,t){return v(ie,{__v:e,i:t})},flushToDom:function(){var e=i.debounceRendering,t=[];function n(e){t.push(e)}i.debounceRendering=n,L(v(me,{}),document.createElement("div"));for(;t.length;)t.shift()();i.debounceRendering=e},unmountComponentAtNode:function(e){L(null,e)}};var me=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return v("div",{})},t.prototype.componentDidMount=function(){this.setState({})},t}(y);var ye=function(){function e(e,t){this.context=e,this.internalEventSource=t}return e.prototype.remove=function(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId],isRefetch:!0})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"format",{get:function(){return this.internalEventSource.meta.format},enumerable:!1,configurable:!0}),e}();function Ee(e){e.parentNode&&e.parentNode.removeChild(e)}function Se(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(be(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function be(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function De(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o=0;i-=1){var a=e[i][r];if("object"==typeof a&&a)o.unshift(a);else if(void 0!==a){n[r]=a;break}}o.length&&(n[r]=Et(o))}for(i=e.length-1;i>=0;i-=1){var s=e[i];for(var l in s)l in n||(n[l]=s[l])}return n}function St(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function bt(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Dt(e){for(var t={},n=0,r=e;n10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",jt(t,!0)))),r}function Bt(e){return e.toISOString().replace(/T.*$/,"")}function zt(e){return Ze(e.getUTCHours(),2)+":"+Ze(e.getUTCMinutes(),2)+":"+Ze(e.getUTCSeconds(),2)}function jt(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=Math.round(r%60);return t?n+Ze(o,2)+":"+Ze(i,2):"GMT"+n+o+(i?":"+Ze(i,2):"")}function Gt(e,t,n){if(e===t)return!0;var r,o=e.length;if(o!==t.length)return!1;for(r=0;r1)||"numeric"!==o.year&&"2-digit"!==o.year||"numeric"!==o.month&&"2-digit"!==o.month||"numeric"!==o.day&&"2-digit"!==o.day||(s=1);var l=this.format(e,n),u=this.format(t,n);if(l===u)return l;var c=nn(function(e,t){var n={};for(var r in e)(!(r in Xt)||Xt[r]<=t)&&(n[r]=e[r]);return n}(o,s),i,n),d=c(e),p=c(t),f=function(e,t,n,r){var o=0;for(;o=Ut(t)&&(r=tt(r,1))}return e.start&&(n=lt(e.start),r&&r<=n&&(r=tt(n,1))),{start:n,end:r}}function Vn(e){var t=Wn(e);return ot(t.start,t.end)>1}function Fn(e,t,n,r){return"year"===r?Nt(n.diffWholeYears(e,t),"year"):"month"===r?Nt(n.diffWholeMonths(e,t),"month"):it(e,t)}function Bn(e,t){var n,r,o=[],i=t.start;for(e.sort(zn),n=0;ni&&o.push({start:i,end:r.start}),r.end>i&&(i=r.end);return it.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Zn(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t=(n||t.end),isToday:t&&Zn(t,r.start)}}function lr(e){var t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function ur(e){return e.instance?e.instance.instanceId:e.def.defId+":"+e.range.start.toISOString()}function cr(e,t){var n=e.eventRange,r=n.def,o=n.instance,i=r.url;if(i)return{href:i};var a=t.emitter,s=t.options.eventInteractive;return null==s&&null==(s=r.interactive)&&(s=Boolean(a.hasHandlers("eventClick"))),s?Oe((function(e){a.trigger("eventClick",{el:e.target,event:new xr(t,r,o),jsEvent:e,view:t.viewApi})})):{}}var dr={start:yn,end:yn,allDay:Boolean};function pr(e,t,n){var o=function(e,t){var n=mn(e,dr),o=n.refined,i=n.extra,a=o.start?t.createMarkerMeta(o.start):null,s=o.end?t.createMarkerMeta(o.end):null,l=o.allDay;null==l&&(l=a&&a.isTimeUnspecified&&(!s||s.isTimeUnspecified));return r({range:{start:a?a.marker:null,end:s?s.marker:null},allDay:l},i)}(e,t),i=o.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return o}function fr(e,t){return Gn(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)}function hr(e,t,n){return r(r({},vr(e,t,n)),{timeZone:t.timeZone})}function vr(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function gr(e,t,n){var r=On({editable:!1},n),o=Ln(r.refined,r.extra,"",e.allDay,!0,n);return{def:o,ui:er(o,t),instance:mt(o.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function mr(e,t,n){n.emitter.trigger("select",r(r({},yr(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function yr(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.dateSpanTransforms;a=0;r-=1){var o=n[r].parseMeta(e);if(o)return{sourceDefId:r,meta:o}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:Le(),sourceDefId:s.sourceDefId,meta:s.meta,ui:kn(i,t),extendedProps:a}}return null}function _r(e){return r(r(r({},_n),wr),e.pluginHooks.eventSourceRefiners)}function Tr(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}var kr=function(){function e(){}return e.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},e.prototype.dispatch=function(e){return this.currentDataManager.dispatch(e)},Object.defineProperty(e.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),e.prototype.batchRendering=function(e){e()},e.prototype.updateSize=function(){this.trigger("_resize",!0)},e.prototype.setOption=function(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})},e.prototype.getOption=function(e){return this.currentDataManager.currentCalendarOptionsInput[e]},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},e.prototype.on=function(e,t){var n=this.currentDataManager;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn("Unknown listener name '"+e+"'")},e.prototype.off=function(e,t){this.currentDataManager.emitter.off(e,t)},e.prototype.trigger=function(e){for(var t,n=[],r=1;r=1?Math.min(o,i):o}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=nt(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Ft(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?ht(dt(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?ht(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-pt(ft(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(ft(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?pt(ft(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(ft(e))*60):new Date(e.valueOf()-(t||0))},e}(),Ur=[],Wr={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},Vr=r(r({},Wr),{buttonHints:{prev:"Previous $0",next:"Next $0",today:function(e,t){return"day"===t?"Today":"This "+e}},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:function(e){return"Show "+e+" more event"+(1===e?"":"s")}});function Fr(e){for(var t=e.length>0?e[0].code:"en",n=Ur.concat(e),r={en:Vr},o=0,i=n;o0;o-=1){var i=r.slice(0,o).join("-");if(t[i])return t[i]}return null}(n,t)||Vr;return zr(e,n,r)}(e,t):zr(e.code,[e.code],e)}function zr(e,t,n){var r=Et([Wr,n],["buttonText"]);delete r.code;var o=r.week;return delete r.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function jr(e){var t=Br(e.locale||"en",Fr([]).map);return new Lr(r(r({timeZone:cn.timeZone,calendarSystem:"gregory"},e),{locale:t}))}var Gr,qr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function Yr(e,t){return En(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return r(r({},qr),e)}))}(e),null,t)}function Zr(e,t){return e.left>=t.left&&e.left=t.top&&e.top
                            ",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);var t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),Gr}var eo={defs:{},instances:{}},to=function(){function e(){this.getKeysForEventDefs=qt(this._getKeysForEventDefs),this.splitDateSelection=qt(this._splitDateSpan),this.splitEventStore=qt(this._splitEventStore),this.splitIndividualUi=qt(this._splitIndividualUi),this.splitEventDrag=qt(this._splitInteraction),this.splitEventResize=qt(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),o=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),l=this.splitEventResize(e.eventResize),u={};for(var c in this.eventUiBuilders=bt(n,(function(e,n){return t.eventUiBuilders[n]||qt(no)})),n){var d=n[c],p=a[c]||eo,f=this.eventUiBuilders[c];u[c]={businessHours:d.businessHours||e.businessHours,dateSelection:o[c]||null,eventStore:p,eventUiBases:f(e.eventUiBases[""],d.ui,i[c]),eventSelection:p.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:l[c]||null}}return u},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);nn:!!t&&e>=t.end)}}function oo(e,t){var n=["fc-day","fc-day-"+Qe[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}var io=ln({year:"numeric",month:"long",day:"numeric"}),ao=ln({week:"long"});function so(e,t,n,o){void 0===n&&(n="day"),void 0===o&&(o=!0);var i=e.dateEnv,a=e.options,s=e.calendarApi,l=i.format(t,"week"===n?ao:io);if(a.navLinks){var u=i.toDate(t),c=function(e){var r="day"===n?a.navLinkDayClick:"week"===n?a.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return r({title:Xe(a.navLinkHint,[l,u],l),"data-navlink":""},o?He(c):{onClick:c})}return{"aria-label":l}}var lo,uo=null;function co(){return null===uo&&(uo=function(){var e=document.createElement("div");we(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
                            ",document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return Ee(e),t}()),uo}function po(){return lo||(lo=function(){var e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);var t=fo(e);return document.body.removeChild(e),t}()),lo}function fo(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function ho(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,o=parseInt(n.borderRightWidth,10)||0,i=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=fo(e),l=s.y-r-o,u={borderLeft:r,borderRight:o,borderTop:i,borderBottom:a,scrollbarBottom:s.x-i-a,scrollbarLeft:0,scrollbarRight:0};return co()&&"rtl"===n.direction?u.scrollbarLeft=l:u.scrollbarRight=l,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function vo(e,t,n){void 0===t&&(t=!1);var r=n?e.getBoundingClientRect():go(e),o=ho(e,t),i={left:r.left+o.borderLeft+o.scrollbarLeft,right:r.right-o.borderRight-o.scrollbarRight,top:r.top+o.borderTop,bottom:r.bottom-o.borderBottom-o.scrollbarBottom};return t&&(i.left+=o.paddingLeft,i.right-=o.paddingRight,i.top+=o.paddingTop,i.bottom-=o.paddingBottom),i}function go(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function mo(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function yo(e,t,n){var r=!1,o=function(){r||(r=!0,t.apply(this,arguments))},i=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(o,i);a&&"function"==typeof a.then&&a.then(o,i)}var Eo=function(){function e(){this.handlers={},this.thisContext=null}return e.prototype.setThisContext=function(e){this.thisContext=e},e.prototype.setOptions=function(e){this.options=e},e.prototype.on=function(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)},e.prototype.off=function(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}(this.handlers,e,t)},e.prototype.trigger=function(e){for(var t=[],n=1;n=n[t]&&e=n[t]&&e0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()0},e.prototype.canScrollRight=function(){return this.getScrollLeft()=c.end?new Date(c.end.valueOf()-1):u),o=this.buildCurrentRangeInfo(e,t),i=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.range),o.unit,i),s=a=this.trimHiddenDays(a),d.showNonCurrentDates||(s=jn(s,o.range)),s=jn(s=this.adjustActiveRange(s),r),l=qn(o.range,r),{validRange:r,currentRange:o.range,currentRangeUnit:o.unit,isRangeAllDay:i,activeRange:s,renderRange:a,slotMinTime:d.slotMinTime,slotMaxTime:d.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(o.duration)}},e.prototype.buildValidRange=function(){var e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.props,o=null,i=null,a=null;return r.duration?(o=r.duration,i=r.durationUnit,a=this.buildRangeFromDuration(e,t,o,i)):(n=this.props.dayCount)?(i="day",a=this.buildRangeFromDayCount(e,t,n)):(a=this.buildCustomVisibleRange(e))?i=r.dateEnv.greatestWholeUnit(a.start,a.end).unit:(i=Vt(o=this.getFallbackDuration()).unit,a=this.buildRangeFromDuration(e,t,o,i)),{duration:o,unit:i,range:a}},e.prototype.getFallbackDuration=function(){return Nt({day:1})},e.prototype.adjustActiveRange=function(e){var t=this.props,n=t.dateEnv,r=t.usesMinMaxTime,o=t.slotMinTime,i=t.slotMaxTime,a=e.start,s=e.end;return r&&(Lt(o)<0&&(a=lt(a),a=n.add(a,o)),Lt(i)>1&&(s=tt(s=lt(s),-1),s=n.add(s,i))),{start:a,end:s}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var o,i,a,s=this.props,l=s.dateEnv,u=s.dateAlignment;if(!u){var c=this.props.dateIncrement;u=c&&Ut(c)e.fetchRange.end}(e,t,n)})),t,!1,n)}function pi(e,t,n,r,o){var i={};for(var a in e){var s=e[a];t[a]?i[a]=fi(s,n,r,o):i[a]=s}return i}function fi(e,t,n,o){var i=o.options,a=o.calendarApi,s=o.pluginHooks.eventSourceDefs[e.sourceDefId],l=Le();return s.fetch({eventSource:e,range:t,isRefetch:n,context:o},(function(n){var r=n.rawEvents;i.eventSourceSuccess&&(r=i.eventSourceSuccess.call(a,r,n.xhr)||r),e.success&&(r=e.success.call(a,r,n.xhr)||r),o.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(function(n){console.warn(n.message,n),i.eventSourceFailure&&i.eventSourceFailure.call(a,n),e.failure&&e.failure(n),o.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),r(r({},e),{isFetching:!0,latestFetchId:l})}function hi(e,t){return St(e,(function(e){return vi(e,t)}))}function vi(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function gi(e,t,n,r,o){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,o,i){if(t&&n===t.latestFetchId){var a=En(function(e,t,n){var r=n.options.eventDataTransform,o=t?t.eventDataTransform:null;o&&(e=mi(e,o));r&&(e=mi(e,r));return e}(o,t,i),t,i);return r&&(a=xt(a,r,i)),Cn(yi(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,o);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=xt(t,n,r));return Cn(e,t)}(e,t.eventStore,r?r.activeRange:null,o);case"RESET_EVENTS":return t.eventStore;case"MERGE_EVENTS":return Cn(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?xt(e,r.activeRange,o):e;case"REMOVE_EVENTS":return function(e,t){var n=e.defs,r=e.instances,o={},i={};for(var a in n)t.defs[a]||(o[a]=n[a]);for(var s in r)!t.instances[s]&&o[r[s].defId]&&(i[s]=r[s]);return{defs:o,instances:i}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return yi(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return wn(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function mi(e,t){var n;if(t){n=[];for(var r=0,o=e;r=200&&a.status<400){var e=!1,t=void 0;try{t=JSON.parse(a.responseText),e=!0}catch(e){}e?r(t,a):o("Failure parsing JSON",a)}else o("Request failed",a)},a.onerror=function(){o("Request failed",a)},a.send(i)}function Ti(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function ki(e,t){for(var n=Ct(t.getCurrentData().eventSources),r=[],o=0,i=e;o1)return{year:"numeric",month:"short",day:"numeric"};return{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}var Ni=function(){function e(e){var t=this;this.computeOptionsData=qt(this._computeOptionsData),this.computeCurrentViewData=qt(this._computeCurrentViewData),this.organizeRawLocales=qt(Fr),this.buildLocale=qt(Br),this.buildPluginHooks=jo(),this.buildDateEnv=qt(Hi),this.buildTheme=qt(Oi),this.parseToolbars=qt(Ci),this.buildViewSpecs=qt(oi),this.buildDateProfileGenerator=Yt(Ai),this.buildViewApi=qt(Li),this.buildViewUiProps=Yt(Vi),this.buildEventUiBySource=qt(Ui,wt),this.buildEventUiBases=qt(Wi),this.parseContextBusinessHours=Yt(Bi),this.buildTitle=qt(Pi),this.emitter=new Eo,this.actionRunner=new Ii(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=function(){return t.data},this.dispatch=function(e){t.actionRunner.request(e)},this.props=e,this.actionRunner.pause();var n={},o=this.computeOptionsData(e.optionOverrides,n,e.calendarApi),i=o.calendarOptions.initialView||o.pluginHooks.initialView,a=this.computeCurrentViewData(i,o,e.optionOverrides,n);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(a.options);var s,l,u,c=(s=o.calendarOptions,l=o.dateEnv,null!=(u=s.initialDate)?l.createMarker(u):Tr(s.now,l)),d=a.dateProfileGenerator.build(c);Zn(d.activeRange,c)||(c=d.currentRange.start);for(var p={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f=0,h=o.pluginHooks.contextInit;fs.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:a.end}},i)),r?(n.push.apply(n,o([{index:e.index,thickness:e.thickness,span:$i(s,a)}],i)),r):(n.push(e),0)},e.prototype.insertEntryAt=function(e,t){var n=this.entriesByLevel,r=this.levelCoords;-1===t.lateral?(Ji(r,t.level,t.levelCoord),Ji(n,t.level,[e])):Ji(n[t.level],t.lateral,e),this.stackCnts[Zi(e)]=t.stackCnt},e.prototype.findInsertion=function(e){for(var t=this,n=t.levelCoords,r=t.entriesByLevel,o=t.strictOrder,i=t.stackCnts,a=n.length,s=0,l=-1,u=-1,c=null,d=0,p=0;p=s+e.thickness)break;for(var h=r[p],v=void 0,g=Qi(h,e.span.start,Yi),m=g[0]+g[1];(v=h[m])&&v.span.starts&&(s=y,c=v,l=p,u=m),y===s&&(d=Math.max(d,i[Zi(v)]+1)),m+=1}}var E=0;if(c)for(E=l+1;En(e[o-1]))return[o,0];for(;ra))return[i,1];r=i+1}}return[r,0]}var ea=function(){function e(e){this.component=e.component,this.isHitComboAllowed=e.isHitComboAllowed||null}return e.prototype.destroy=function(){},e}();function ta(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}}function na(e){var t;return(t={})[e.component.uid]=e,t}var ra={},oa=function(){function e(e,t){this.emitter=new Eo}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}(),ia={},aa={startTime:Nt,duration:Nt,create:Boolean,sourceId:String};function sa(e){var t=mn(e,aa),n=t.refined,r=t.extra;return{startTime:n.startTime||null,duration:n.duration||null,create:null==n.create||n.create,sourceId:n.sourceId,leftoverProps:r}}var la=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props.widgetGroups.map((function(t){return e.renderWidgetGroup(t)}));return _o.apply(void 0,o(["div",{className:"fc-toolbar-chunk"}],t))},t.prototype.renderWidgetGroup=function(e){for(var t=this.props,n=this.context.theme,r=[],i=!0,a=0,s=e;a1){var m=i&&n.getClass("buttonGroup")||"";return _o.apply(void 0,o(["div",{className:m}],r))}return r[0]},t}(Uo),ua=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.model,o=n.extraClassName,i=!1,a=r.sectionWidgets,s=a.center;return a.left?(i=!0,e=a.left):e=a.start,a.right?(i=!0,t=a.right):t=a.end,_o("div",{className:[o||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",s||[]),this.renderSection("end",t||[]))},t.prototype.renderSection=function(e,t){var n=this.props;return _o(la,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})},t}(Uo),ca=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={availableWidth:null},t.handleEl=function(e){t.el=e,Fo(t.props.elRef,e),t.updateAvailableWidth()},t.handleResize=function(){t.updateAvailableWidth()},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=e.aspectRatio,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],o="",i="";return n?null!==t.availableWidth?o=t.availableWidth/n:i=1/n*100+"%":o=e.height||"",_o("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:o,paddingBottom:i}},e.children)},t.prototype.componentDidMount=function(){this.context.addResizeHandler(this.handleResize)},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleResize)},t.prototype.updateAvailableWidth=function(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})},t}(Uo),da=function(e){function t(t){var n=e.call(this,t)||this;return n.handleSegClick=function(e,t){var r=n.component,o=r.context,i=Jn(t);if(i&&r.isValidSegDownEl(e.target)){var a=Se(e.target,".fc-event-forced-url"),s=a?a.querySelector("a[href]").href:"";o.emitter.trigger("eventClick",{el:t,event:new xr(r.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:o.viewApi}),s&&!e.defaultPrevented&&(window.location.href=s)}},n.destroy=Ie(t.el,"click",".fc-event",n.handleSegClick),n}return n(t,e),t}(ea),pa=function(e){function t(t){var n,r,o,i,a,s=e.call(this,t)||this;return s.handleEventElRemove=function(e){e===s.currentSegEl&&s.handleSegLeave(null,s.currentSegEl)},s.handleSegEnter=function(e,t){Jn(t)&&(s.currentSegEl=t,s.triggerEvent("eventMouseEnter",e,t))},s.handleSegLeave=function(e,t){s.currentSegEl&&(s.currentSegEl=null,s.triggerEvent("eventMouseLeave",e,t))},s.removeHoverListeners=(n=t.el,r=".fc-event",o=s.handleSegEnter,i=s.handleSegLeave,Ie(n,"mouseover",r,(function(e,t){if(t!==a){a=t,o(e,t);var n=function(e){a=null,i(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),s}return n(t,e),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(e,t,n){var r=this.component,o=r.context,i=Jn(n);t&&!r.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new xr(o,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:o.viewApi})},t}(ea),fa=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildViewContext=qt(Ao),t.buildViewPropTransformers=qt(va),t.buildToolbarProps=qt(ha),t.headerRef=ko(),t.footerRef=ko(),t.interactionsStore={},t.state={viewLabelId:xe()},t.registerInteractiveComponent=function(e,n){var r=ta(e,n),o=[da,pa].concat(t.props.pluginHooks.componentInteractions).map((function(e){return new e(r)}));t.interactionsStore[e.uid]=o,ra[e.uid]=r},t.unregisterInteractiveComponent=function(e){for(var n=0,r=t.interactionsStore[e.uid];n10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}var ya="fc-col-header-cell";function Ea(e){return e.text}var Sa=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.dateEnv,n=e.options,o=e.theme,i=e.viewApi,a=this.props,s=a.date,l=a.dateProfile,u=ro(s,a.todayRange,null,l),c=[ya].concat(oo(u,o)),d=t.format(s,a.dayHeaderFormat),p=!u.isDisabled&&a.colCnt>1?so(this.context,s):{},f=r(r(r({date:t.toDate(s),view:i},a.extraHookProps),{text:d}),u);return _o(Yo,{hookProps:f,classNames:n.dayHeaderClassNames,content:n.dayHeaderContent,defaultContent:Ea,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},(function(e,t,n,o){return _o("th",r({ref:e,role:"columnheader",className:c.concat(t).join(" "),"data-date":u.isDisabled?void 0:Bt(s),colSpan:a.colSpan},a.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},!u.isDisabled&&_o("a",r({ref:n,className:["fc-col-header-cell-cushion",a.isSticky?"fc-sticky":""].join(" ")},p),o)))}))},t}(Uo),ba=ln({weekday:"long"}),Da=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.theme,i=t.viewApi,a=t.options,s=tt(new Date(2592e5),e.dow),l={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},u=[ya].concat(oo(l,o),e.extraClassNames||[]),c=n.format(s,e.dayHeaderFormat),d=r(r(r(r({date:s},l),{view:i}),e.extraHookProps),{text:c});return _o(Yo,{hookProps:d,classNames:a.dayHeaderClassNames,content:a.dayHeaderContent,defaultContent:Ea,didMount:a.dayHeaderDidMount,willUnmount:a.dayHeaderWillUnmount},(function(t,o,i,a){return _o("th",r({ref:t,role:"columnheader",className:u.concat(o).join(" "),colSpan:e.colSpan},e.extraDataAttrs),_o("div",{className:"fc-scrollgrid-sync-inner"},_o("a",{"aria-label":n.format(s,ba),className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:i},a)))}))},t}(Uo),Ca=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.initialNowDate=Tr(n.options.now,n.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return e.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var e=this.props,t=this.context,n=nt(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),o=t.dateEnv.add(r,Nt(1,e.unit)),i=o.valueOf()-n.valueOf();return i=Math.min(864e5,i),{currentState:{nowDate:r,todayRange:wa(r)},nextState:{nowDate:o,todayRange:wa(o)},waitMs:i}},t.prototype.setTimeout=function(){var e=this,t=this.computeTiming(),n=t.nextState,r=t.waitMs;this.timeoutId=setTimeout((function(){e.setState(n,(function(){e.setTimeout()}))}),r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=Oo,t}(Ro);function wa(e){var t=lt(e);return{start:t,end:tt(t,1)}}var Ra=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.createDayHeaderFormatter=qt(_a),t}return n(t,e),t.prototype.render=function(){var e=this.context,t=this.props,n=t.dates,r=t.dateProfile,o=t.datesRepDistinctDays,i=t.renderIntro,a=this.createDayHeaderFormatter(e.options.dayHeaderFormat,o,n.length);return _o(Ca,{unit:"day"},(function(e,t){return _o("tr",{role:"row"},i&&i("day"),n.map((function(e){return o?_o(Sa,{key:e.toISOString(),date:e,dateProfile:r,todayRange:t,colCnt:n.length,dayHeaderFormat:a}):_o(Da,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:a})})))}))},t}(Uo);function _a(e,t,n){return e||ma(t,n)}var Ta=function(){function e(e,t){for(var n=e.start,r=e.end,o=[],i=[],a=-1;n=t.length?t[t.length-1]+1:t[n]},e}(),ka=function(){function e(e,t){var n,r,o,i=e.dates;if(t){for(r=i[0].getUTCDay(),n=1;nt)return!0}return!1},t.prototype.needsYScrolling=function(){if(Wa.test(this.props.overflowY))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),n=e.children,r=0;rt)return!0}return!1},t.prototype.getXScrollbarWidth=function(){return Wa.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},t.prototype.getYScrollbarWidth=function(){return Wa.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},t}(Uo),Fa=function(){function e(e){var t=this;this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=function(e,n){var r=t,o=r.depths,i=r.currentMap,a=!1,s=!1;null!==e?(a=n in i,i[n]=e,o[n]=(o[n]||0)+1,s=!0):(o[n]-=1,o[n]||(delete i[n],delete t.callbackMap[n],a=!0)),t.masterCallback&&(a&&t.masterCallback(null,String(n)),s&&t.masterCallback(e,String(n)))}}return e.prototype.createRef=function(e){var t=this,n=this.callbackMap[e];return n||(n=this.callbackMap[e]=function(n){t.handleValue(n,String(e))}),n},e.prototype.collect=function(e,t,n){return kt(this.currentMap,e,t,n)},e.prototype.getAll=function(){return Ct(this.currentMap)},e}();function Ba(e){for(var t=0,n=0,r=De(e,".fc-scrollgrid-shrink");n=0&&e=0&&tt.eventRange.range.end?e:t}var Cs=function(e){function t(t,n){void 0===n&&(n={});var o=e.call(this)||this;return o.isRendering=!1,o.isRendered=!1,o.currentClassNames=[],o.customContentRenderId=0,o.handleAction=function(e){switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":o.renderRunner.tryDrain()}},o.handleData=function(e){o.currentData=e,o.renderRunner.request(e.calendarOptions.rerenderDelay)},o.handleRenderRequest=function(){if(o.isRendering){o.isRendered=!0;var e=o.currentData;To(_o(ga,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(function(t,n,i,a){return o.setClassNames(t),o.setHeight(n),_o(Zo.Provider,{value:o.customContentRenderId},_o(fa,r({isHeightAuto:i,forPrint:a},e)))})),o.el)}else o.isRendered&&(o.isRendered=!1,No(o.el),o.setClassNames([]),o.setHeight(""));Po()},o.el=t,o.renderRunner=new Mi(o.handleRenderRequest),new Ni({optionOverrides:n,calendarApi:o,onAction:o.handleAction,onData:o.handleData}),o}return n(t,e),Object.defineProperty(t.prototype,"view",{get:function(){return this.currentData.viewApi},enumerable:!1,configurable:!0}),t.prototype.render=function(){var e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()},t.prototype.destroy=function(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())},t.prototype.updateSize=function(){e.prototype.updateSize.call(this),Po()},t.prototype.batchRendering=function(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")},t.prototype.pauseRendering=function(){this.renderRunner.pause("pauseRendering")},t.prototype.resumeRendering=function(){this.renderRunner.resume("pauseRendering",!0)},t.prototype.resetOptions=function(e,t){this.currentDataManager.resetOptions(e,t)},t.prototype.setClassNames=function(e){if(!Gt(e,this.currentClassNames)){for(var t=this.el.classList,n=0,r=this.currentClassNames;n0&&(this.everMovedDown=!0),i<0?this.everMovedLeft=!0:i>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(Ns()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e=0&&u>=0&&c>=0&&d>=0&&(c<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"top",distance:c}),d<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"bottom",distance:d}),l<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>l)&&(r={scrollCache:a,name:"left",distance:l}),u<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"right",distance:u}))}return r},e.prototype.buildCaches=function(e){return this.queryScrollEls(e).map((function(e){return e===window?new Ps(!1):new Is(e,!1)}))},e.prototype.queryScrollEls=function(e){for(var t=[],n=0,r=this.scrollQuery;n=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,Fe(document.body),ze(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var o=r.pointer=new Ts(t);return o.emitter.on("pointerdown",r.onPointerDown),o.emitter.on("pointermove",r.onPointerMove),o.emitter.on("pointerup",r.onPointerUp),n&&(o.selector=n),r.mirror=new xs,r.autoScroller=new Hs,r}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy(),this.onPointerUp({})},t.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},t.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},t.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},t.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},t.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},t.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},t.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},t.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},t.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},t}(oa),As=function(){function e(e){this.origRect=go(e),this.scrollCaches=mo(e).map((function(e){return new Is(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e=0&&c=0&&do.layer)&&(v.componentId=i,v.context=a.context,v.rect.left+=l,v.rect.right+=l,v.rect.top+=u,v.rect.bottom+=u,o=v)}}}return o},e}();function Us(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&fr(e.dateSpan,t.dateSpan)}function Ws(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.datePointTransforms;ar.start)return{endDelta:s};return null}(a,e,r.subjectEl.classList.contains("fc-event-resizer-start"),s.range)));l&&(u=Sr(i,o.getCurrentData().eventUiBases,l,o),d.mutatedEvents=u,Ia(d,e.dateProfile,o)||(c=!0,l=null,u=null,d.mutatedEvents=null)),u?o.dispatch({type:"SET_EVENT_RESIZE",state:d}):o.dispatch({type:"UNSET_EVENT_RESIZE"}),c?Ue():We(),t||(l&&Us(a,e)&&(l=null),n.validMutation=l,n.mutatedRelevantEvents=u)},n.handleDragEnd=function(e){var t=n.component.context,o=n.eventRange.def,i=n.eventRange.instance,a=new xr(t,o,i),s=n.relevantEvents,l=n.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:n.draggingSegEl,event:a,jsEvent:e.origEvent,view:t.viewApi}),n.validMutation){var u=new xr(t,l.defs[o.defId],i?l.instances[i.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:l});var c={oldEvent:a,event:u,relatedEvents:Ir(l,t,i),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",r(r({},c),{el:n.draggingSegEl,startDelta:n.validMutation.startDelta||Nt(0),endDelta:n.validMutation.endDelta||Nt(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");n.draggingSeg=null,n.relevantEvents=null,n.validMutation=null};var o=t.component,i=n.dragging=new Os(t.el);i.pointer.selector=".fc-event-resizer",i.touchScrollAllowed=!1,i.autoScroller.isEnabled=o.context.options.dragScroll;var a=n.hitDragging=new Ls(n.dragging,na(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.querySegEl=function(e){return Se(e.subjectEl,".fc-event")},t}(ea);var js=function(){function e(e){var t=this;this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=function(e){e.jsEvent&&(t.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=function(e){var n=t.context.options.unselectCancel,r=_e(e.origEvent);t.matchesCancel=!!Se(r,n),t.matchesEvent=!!Se(r,Bs.SELECTOR)},this.onDocumentPointerUp=function(e){var n=t.context,r=t.documentPointer,o=n.getCurrentData();if(!r.wasTouchScroll){if(o.dateSelection&&!t.isRecentPointerDateSelect){var i=n.options.unselectAuto;!i||i&&t.matchesCancel||n.calendarApi.unselect(e)}o.eventSelection&&!t.matchesEvent&&n.dispatch({type:"UNSELECT_EVENT"})}t.isRecentPointerDateSelect=!1};var n=this.documentPointer=new Ts(document);n.shouldIgnoreMove=!0,n.shouldWatchScroll=!1,n.emitter.on("pointerdown",this.onDocumentPointerDown),n.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}return e.prototype.destroy=function(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()},e}(),Gs={fixedMirrorParent:yn},qs={dateClick:yn,eventDragStart:yn,eventDragStop:yn,eventDrop:yn,eventResizeStart:yn,eventResizeStop:yn,eventResize:yn,drop:yn,eventReceive:yn,eventLeave:yn},Ys=function(){function e(e,t){var n=this;this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){n.dragMeta=n.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,t,o){var i=n.hitDragging.dragging,a=null,s=null,l=!1,u={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:n.dragMeta.create};e&&(a=e.context,n.canDropElOnCalendar(o.subjectEl,a)&&(s=function(e,t,n){for(var o=r({},t.leftoverProps),i=0,a=n.pluginHooks.externalDefTransforms;i1,S=y.span.start===s;d+=y.levelCoord-c,c=y.levelCoord+y.thickness,E?(d+=y.thickness,S&&v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:y.levelCoord,marginTop:0})):S&&(v.push({seg:hl(h,y.span.start,y.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:y.levelCoord,marginTop:d}),d=0)}o.push(u),i.push(v),a.push(d)}return{singleColPlacements:o,multiColPlacements:i,leftoverMargins:a}}(s.toRects(),e,a),h=f.singleColPlacements,v=f.multiColPlacements,g=f.leftoverMargins,m=[],y=[],E=0,S=u;E1,showWeekNumbers:t.showWeekNumbers,todayRange:h,dateProfile:n,cells:i,renderIntro:t.renderRowIntro,businessHourSegs:s[f],eventSelection:t.eventSelection,bgEventSegs:l[f].filter(yl),fgEventSegs:u[f],dateSelectionSegs:c[f],eventDrag:d[f],eventResize:p[f],dayMaxEvents:o,dayMaxEventRows:r,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:t.forPrint})})))))})))},t.prototype.prepareHits=function(){this.rowPositions=new So(this.rootEl,this.rowRefs.collect().map((function(e){return e.getCellEls()[0]})),!1,!0),this.colPositions=new So(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},t.prototype.queryHit=function(e,t){var n=this.colPositions,o=this.rowPositions,i=n.leftToIndex(e),a=o.topToIndex(t);if(null!=a&&null!=i){var s=this.props.cells[a][i];return{dateProfile:this.props.dateProfile,dateSpan:r({range:this.getCellRange(a,i),allDay:!0},s.extraDateSpan),dayEl:this.getCellEl(a,i),rect:{left:n.lefts[i],right:n.rights[i],top:o.tops[a],bottom:o.bottoms[a]},layer:0}}return null},t.prototype.getCellEl=function(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]},t.prototype.getCellRange=function(e,t){var n=this.props.cells[e][t].date;return{start:n,end:tt(n,1)}},t}(Bo);function yl(e){return e.eventRange.def.allDay}var El=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(xa),Sl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new El,t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return _o(ml,r({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))},t}(Bo),bl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayTableModel=qt(Dl),t.headerRef=ko(),t.tableRef=ko(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,r=t.dateProfileGenerator,o=this.props,i=this.buildDayTableModel(o.dateProfile,r),a=n.dayHeaders&&_o(Ra,{ref:this.headerRef,dateProfile:o.dateProfile,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt}),s=function(t){return _o(Sl,{ref:e.tableRef,dateProfile:o.dateProfile,dayTableModel:i,businessHours:o.businessHours,dateSelection:o.dateSelection,eventStore:o.eventStore,eventUiBases:o.eventUiBases,eventSelection:o.eventSelection,eventDrag:o.eventDrag,eventResize:o.eventResize,nextDayThreshold:n.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.weekNumbers,expandRows:!o.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:o.forPrint})};return n.dayMinWidth?this.renderHScrollLayout(a,s,i.colCnt,n.dayMinWidth):this.renderSimpleLayout(a,s)},t}(Js);function Dl(e,t){var n=new Ta(e.renderRange,t);return new ka(n,/year|month|week/.test(e.currentRangeUnit))}var Cl=zo({initialView:"dayGridMonth",views:{dayGrid:{component:bl,dateProfileGeneratorClass:function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.buildRenderRange=function(t,n,r){var o,i=this.props.dateEnv,a=e.prototype.buildRenderRange.call(this,t,n,r),s=a.start,l=a.end;(/^(year|month)$/.test(n)&&(s=i.startOfWeek(s),(o=i.startOfWeek(l)).valueOf()!==l.valueOf()&&(l=et(o,1))),this.props.monthMode&&this.props.fixedWeekCount)&&(l=et(l,6-Math.ceil(rt(s,l))));return{start:s,end:l}},t}(ai)},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),wl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(e){return e.allDay?Kn(e)?["timed","allDay"]:["allDay"]:["timed"]},t}(to),Rl=ln({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function _l(e){var t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return _o(Oo.Consumer,null,(function(n){if(!e.isLabeled)return _o("td",{className:t.join(" "),"data-time":e.isoTimeStr});var r=n.dateEnv,o=n.options,i=n.viewApi,a=null==o.slotLabelFormat?Rl:Array.isArray(o.slotLabelFormat)?ln(o.slotLabelFormat[0]):ln(o.slotLabelFormat),s={level:0,time:e.time,date:r.toDate(e.date),view:i,text:r.format(e.date,a)};return _o(Yo,{hookProps:s,classNames:o.slotLabelClassNames,content:o.slotLabelContent,defaultContent:Tl,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(n,r,o,i){return _o("td",{ref:n,className:t.concat(r).join(" "),"data-time":e.isoTimeStr},_o("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},_o("div",{className:"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",ref:o},i)))}))}))}function Tl(e){return e.text}var kl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return this.props.slatMetas.map((function(e){return _o("tr",{key:e.key},_o(_l,r({},e)))}))},t}(Uo),xl=ln({week:"short"}),Ml=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allDaySplitter=new wl,t.headerElRef=ko(),t.rootElRef=ko(),t.scrollerElRef=ko(),t.state={slatCoords:null},t.handleScrollTopRequest=function(e){var n=t.scrollerElRef.current;n&&(n.scrollTop=e)},t.renderHeadAxis=function(e,n){void 0===n&&(n="");var o=t.context.options,i=t.props.dateProfile.renderRange,a=1===ot(i.start,i.end)?so(t.context,i.start,"week"):{};return o.weekNumbers&&"day"===e?_o(fs,{date:i.start,defaultFormat:xl},(function(e,t,o,i){return _o("th",{ref:e,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(t).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:n}},_o("a",r({ref:o,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner"},a),i)))})):_o("th",{"aria-hidden":!0,className:"fc-timegrid-axis"},_o("div",{className:"fc-timegrid-axis-frame",style:{height:n}}))},t.renderTableRowAxis=function(e){var n=t.context,r=n.options,o=n.viewApi,i={text:r.allDayText,view:o};return _o(Yo,{hookProps:i,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:Il,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(t,n,r,o){return _o("td",{ref:t,"aria-hidden":!0,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},_o("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(null==e?" fc-timegrid-axis-frame-liquid":""),style:{height:e}},_o("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t,n){var r=this.context,o=this.props,i=[],a=Qa(r.options);return e&&i.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(i.push({type:"body",key:"all-day",chunk:{content:t}}),i.push({type:"body",key:"all-day-divider",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),i.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),_o(ti,{viewSpec:r.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(ts,{liquid:!o.isHeightAuto&&!o.forPrint,collapsibleWidth:o.forPrint,cols:[{width:"shrink"}],sections:i}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r,o,i,a){var s=this,l=this.context.pluginHooks.scrollGridImpl;if(!l)throw new Error("No ScrollGrid implementation");var u=this.context,c=this.props,d=!c.forPrint&&Qa(u.options),p=!c.forPrint&&es(u.options),f=[];e&&f.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderHeadAxis("day",e.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(f.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return _o("tr",{role:"presentation"},s.renderTableRowAxis(e.rowSyncHeights[0]))}},{key:"cols",content:t}]}),f.push({key:"all-day-divider",type:"body",outerContent:_o("tr",{role:"presentation",className:"fc-scrollgrid-section"},_o("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));var h=u.options.nowIndicator;return f.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:function(e){return _o("div",{className:"fc-timegrid-axis-chunk"},_o("table",{"aria-hidden":!0,style:{height:e.expandRows?e.clientHeight:""}},e.tableColGroupNode,_o("tbody",null,_o(kl,{slatMetas:i}))),_o("div",{className:"fc-timegrid-now-indicator-container"},_o(Ca,{unit:h?"minute":"day"},(function(e){var t=h&&a&&a.safeComputeTop(e);return"number"==typeof t?_o(is,{isAxis:!0,date:e},(function(e,n,r,o){return _o("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(n).join(" "),style:{top:t}},o)})):null}))))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&f.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:Ja},{key:"cols",content:Ja}]}),_o(ti,{viewSpec:u.viewSpec,elRef:this.rootElRef},(function(e,t){return _o("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},_o(l,{liquid:!c.isHeightAuto&&!c.forPrint,collapsibleWidth:!1,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:f}))}))},t.prototype.getAllDayMaxEventProps=function(){var e=this.context.options,t=e.dayMaxEvents,n=e.dayMaxEventRows;return!0!==t&&!0!==n||(t=void 0,n=5),{dayMaxEvents:t,dayMaxEventRows:n}},t}(Bo);function Il(e){return e.text}var Pl=function(){function e(e,t,n){this.positions=e,this.dateProfile=t,this.slotDuration=n}return e.prototype.safeComputeTop=function(e){var t=this.dateProfile;if(Zn(t.currentRange,e)){var n=lt(e),r=e.valueOf()-n.valueOf();if(r>=Ut(t.slotMinTime)&&r0,E=Boolean(l)&&l.span.end-l.span.start=0;t-=1)if(null!==(r=Wt(n=Nt(ru[t]),e))&&r>1)return n;return e}(r),u=[];Ut(a)0?e.renderSegList(s,i):e.renderEmptyMessage()))}))},t.prototype.renderEmptyMessage=function(){var e=this.context,t=e.options,n=e.viewApi,r={text:t.noEventsText,view:n};return _o(Yo,{hookProps:r,classNames:t.noEventsClassNames,content:t.noEventsContent,defaultContent:hu,didMount:t.noEventsDidMount,willUnmount:t.noEventsWillUnmount},(function(e,t,n,r){return _o("div",{className:["fc-list-empty"].concat(t).join(" "),ref:e},_o("div",{className:"fc-list-empty-cushion",ref:n},r))}))},t.prototype.renderSegList=function(e,t){var n=this.context,o=n.theme,i=n.options,a=this.state,s=a.timeHeaderId,l=a.eventHeaderId,u=a.dateHeaderIdRoot,c=function(e){var t,n,r=[];for(t=0;tcode[class*=language-],pre[class*=language-]{background:#f6f6f6}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} +pre[class*=language-].line-numbers{position:relative;padding-left:3.6em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.6em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right} +div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:.3em .8em;background:#666;border-radius:.2em; color:#fff; cursor:pointer;}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:#eee;text-decoration:none;} diff --git a/public/static/assets/third_party/prism/prism.js b/public/static/assets/third_party/prism/prism.js new file mode 100644 index 0000000..63ab994 --- /dev/null +++ b/public/static/assets/third_party/prism/prism.js @@ -0,0 +1,23 @@ +/* PrismJS 1.25.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+csharp+cpp+css-extras+java+markup-templating+php+plsql+powershell+python+sqf+sql+typescript&plugins=line-numbers+toolbar+copy-to-clipboard */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},M={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof W?new W(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=l.reach);y+=m.value.length,m=m.next){var k=m.value;if(t.length>n.length)return;if(!(k instanceof W)){var x,b=1;if(h){if(!(x=z(p,y,n,f))||x.index>=n.length)break;var w=x.index,A=x.index+x[0].length,P=y;for(P+=m.value.length;P<=w;)m=m.next,P+=m.value.length;if(P-=m.value.length,y=P,m.value instanceof W)continue;for(var E=m;E!==t.tail&&(Pl.reach&&(l.reach=j);var C=m.prev;S&&(C=I(t,C,S),y+=S.length),q(t,C,b);var N=new W(o,g?M.tokenize(L,g):L,d,L);if(m=I(t,C,N),O&&I(t,m,O),1l.reach&&(l.reach=_.reach)}}}}}}(e,a,n,a.head,0),function(e){var n=[],t=e.head.next;for(;t!==e.tail;)n.push(t.value),t=t.next;return n}(a)},hooks:{all:{},add:function(e,n){var t=M.hooks.all;t[e]=t[e]||[],t[e].push(n)},run:function(e,n){var t=M.hooks.all[e];if(t&&t.length)for(var r,a=0;r=t[a++];)r(n)}},Token:W};function W(e,n,t,r){this.type=e,this.content=n,this.alias=t,this.length=0|(r||"").length}function z(e,n,t,r){e.lastIndex=n;var a=e.exec(t);if(a&&r&&a[1]){var i=a[1].length;a.index+=i,a[0]=a[0].slice(i)}return a}function i(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function I(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function q(e,n,t){for(var r=n.next,a=0;a"+a.content+""},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var r=M.util.currentScript();function a(){M.manual||M.highlightAll()}if(r&&(M.filename=r.src,r.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var l=document.readyState;"loading"===l||"interactive"===l&&r&&r.defer?document.addEventListener("DOMContentLoaded",a):window.requestAnimationFrame?window.requestAnimationFrame(a):window.setTimeout(a,16)}return M}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var t={"included-cdata":{pattern://i,inside:s}};t["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var n={};n[a]={pattern:RegExp("(<__[^>]*>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:t},Prism.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(a,e){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp("(^|[\"'\\s])(?:"+a+")\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))","i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[e,"language-"+e],inside:Prism.languages[e]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(s){var e=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;s.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+e.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+e.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+e.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:e,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},s.languages.css.atrule.inside.rest=s.languages.css;var t=s.languages.markup;t&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp("(^|[^\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?|\\d+(?:_\\d+)*n|(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?)(?![\\w$])"),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)","javascript")),Prism.languages.js=Prism.languages.javascript; +Prism.languages.c=Prism.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean; +!function(s){function a(e,s){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+s[+n]+")"})}function t(e,n,s){return RegExp(a(e,n),s||"")}function e(e,n){for(var s=0;s>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var n="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var d=l(r),p=RegExp(l(n+" "+r+" "+i+" "+o)),c=l(r+" "+i+" "+o),u=l(n+" "+r+" "+o),g=e("<(?:[^<>;=+\\-*/%&|^]|<>)*>",2),b=e("\\((?:[^()]|<>)*\\)",2),h="@?\\b[A-Za-z_]\\w*\\b",f=a("<<0>>(?:\\s*<<1>>)?",[h,g]),m=a("(?!<<0>>)<<1>>(?:\\s*\\.\\s*<<1>>)*",[c,f]),k="\\[\\s*(?:,\\s*)*\\]",y=a("<<0>>(?:\\s*(?:\\?\\s*)?<<1>>)*(?:\\s*\\?)?",[m,k]),w=a("(?:<<0>>|<<1>>)(?:\\s*(?:\\?\\s*)?<<2>>)*(?:\\s*\\?)?",[a("\\(<<0>>+(?:,<<0>>+)+\\)",[a("[^,()<>[\\];=+\\-*/%&|^]|<<0>>|<<1>>|<<2>>",[g,b,k])]),m,k]),v={keyword:p,punctuation:/[<>()?,.:[\]]/},x="'(?:[^\r\n'\\\\]|\\\\.|\\\\[Uux][\\da-fA-F]{1,8})'",$='"(?:\\\\.|[^\\\\"\r\n])*"';s.languages.csharp=s.languages.extend("clike",{string:[{pattern:t("(^|[^$\\\\])<<0>>",['@"(?:""|\\\\[^]|[^\\\\"])*"(?!")']),lookbehind:!0,greedy:!0},{pattern:t("(^|[^@$\\\\])<<0>>",[$]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:t("(\\busing\\s+static\\s+)<<0>>(?=\\s*;)",[m]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+<<0>>\\s*=\\s*)<<1>>(?=\\s*;)",[h,w]),lookbehind:!0,inside:v},{pattern:t("(\\busing\\s+)<<0>>(?=\\s*=)",[h]),lookbehind:!0},{pattern:t("(\\b<<0>>\\s+)<<1>>",[d,f]),lookbehind:!0,inside:v},{pattern:t("(\\bcatch\\s*\\(\\s*)<<0>>",[m]),lookbehind:!0,inside:v},{pattern:t("(\\bwhere\\s+)<<0>>",[h]),lookbehind:!0},{pattern:t("(\\b(?:is(?:\\s+not)?|as)\\s+)<<0>>",[y]),lookbehind:!0,inside:v},{pattern:t("\\b<<0>>(?=\\s+(?!<<1>>|with\\s*\\{)<<2>>(?:\\s*[=,;:{)\\]]|\\s+(?:in|when)\\b))",[w,u,h]),inside:v}],keyword:p,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),s.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),s.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:t("([(,]\\s*)<<0>>(?=\\s*:)",[h]),lookbehind:!0,alias:"punctuation"}}),s.languages.insertBefore("csharp","class-name",{namespace:{pattern:t("(\\b(?:namespace|using)\\s+)<<0>>(?:\\s*\\.\\s*<<0>>)*(?=\\s*[;{])",[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:t("(\\b(?:default|sizeof|typeof)\\s*\\(\\s*(?!\\s))(?:[^()\\s]|\\s(?!\\s)|<<0>>)*(?=\\s*\\))",[b]),lookbehind:!0,alias:"class-name",inside:v},"return-type":{pattern:t("<<0>>(?=\\s+(?:<<1>>\\s*(?:=>|[({]|\\.\\s*this\\s*\\[)|this\\s*\\[))",[w,m]),inside:v,alias:"class-name"},"constructor-invocation":{pattern:t("(\\bnew\\s+)<<0>>(?=\\s*[[({])",[w]),lookbehind:!0,inside:v,alias:"class-name"},"generic-method":{pattern:t("<<0>>\\s*<<1>>(?=\\s*\\()",[h,g]),inside:{function:t("^<<0>>",[h]),generic:{pattern:RegExp(g),alias:"class-name",inside:v}}},"type-list":{pattern:t("\\b((?:<<0>>\\s+<<1>>|record\\s+<<1>>\\s*<<5>>|where\\s+<<2>>)\\s*:\\s*)(?:<<3>>|<<4>>|<<1>>\\s*<<5>>|<<6>>)(?:\\s*,\\s*(?:<<3>>|<<4>>|<<6>>))*(?=\\s*(?:where|[{;]|=>|$))",[d,f,h,w,p.source,b,"\\bnew\\s*\\(\\s*\\)"]),lookbehind:!0,inside:{"record-arguments":{pattern:t("(^(?!new\\s*\\()<<0>>\\s*)<<1>>",[f,b]),lookbehind:!0,greedy:!0,inside:s.languages.csharp},keyword:p,"class-name":{pattern:RegExp(w),greedy:!0,inside:v},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var _=$+"|"+x,B=a("/(?![*/])|//[^\r\n]*[\r\n]|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>",[_]),E=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),R="\\b(?:assembly|event|field|method|module|param|property|return|type)\\b",z=a("<<0>>(?:\\s*\\(<<1>>*\\))?",[m,E]);s.languages.insertBefore("csharp","class-name",{attribute:{pattern:t("((?:^|[^\\s\\w>)?])\\s*\\[\\s*)(?:<<0>>\\s*:\\s*)?<<1>>(?:\\s*,\\s*<<1>>)*(?=\\s*\\])",[R,z]),lookbehind:!0,greedy:!0,inside:{target:{pattern:t("^<<0>>(?=\\s*:)",[R]),alias:"keyword"},"attribute-arguments":{pattern:t("\\(<<0>>*\\)",[E]),inside:s.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var S=":[^}\r\n]+",j=e(a("[^\"'/()]|<<0>>|\\(<>*\\)",[B]),2),A=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[j,S]),F=e(a("[^\"'/()]|/(?!\\*)|/\\*(?:[^*]|\\*(?!/))*\\*/|<<0>>|\\(<>*\\)",[_]),2),P=a("\\{(?!\\{)(?:(?![}:])<<0>>)*<<1>>?\\}",[F,S]);function U(e,n){return{interpolation:{pattern:t("((?:^|[^{])(?:\\{\\{)*)<<0>>",[e]),lookbehind:!0,inside:{"format-string":{pattern:t("(^\\{(?:(?![}:])<<0>>)*)<<1>>(?=\\}$)",[n,S]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:s.languages.csharp}}},string:/[\s\S]+/}}s.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:t('(^|[^\\\\])(?:\\$@|@\\$)"(?:""|\\\\[^]|\\{\\{|<<0>>|[^\\\\{"])*"',[A]),lookbehind:!0,greedy:!0,inside:U(A,j)},{pattern:t('(^|[^@\\\\])\\$"(?:\\\\.|\\{\\{|<<0>>|[^\\\\"{])*"',[P]),lookbehind:!0,greedy:!0,inside:U(P,F)}],char:{pattern:RegExp(x),greedy:!0}}),s.languages.dotnet=s.languages.cs=s.languages.csharp}(Prism); +!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n="\\b(?!)\\w+(?:\\s*\\.\\s*\\w+)*\\b".replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp("(\\b(?:class|concept|enum|struct|typename)\\s+)(?!)\\w+".replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp('(\\b(?:import|module)\\s+)(?:"(?:\\\\(?:\r\n|[^])|[^"\\\\\r\n])*"|<[^<>\r\n]*>|'+"(?:\\s*:\\s*)?|:\\s*".replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism); +!function(e){var a,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:a={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=a,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},i={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:i,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:i})}(Prism); +!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n="(^|[^\\w.])(?:[a-z]\\w*\\s*\\.\\s*)*(?:[A-Z]\\w*\\s*\\.\\s*)*",a={pattern:RegExp(n+"[A-Z](?:[\\d_A-Z]*[a-z]\\w*)?\\b"),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(n+"[A-Z]\\w*(?=\\s+\\w+\\s*[;,=()])"),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},namespace:{pattern:RegExp("(\\b(?:exports|import(?:\\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\\s+)(?!)[a-z]\\w*(?:\\.[a-z]\\w*)*\\.?".replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism); +!function(h){function v(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(h.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,o){if(a.language===r){var c=a.tokenStack=[];a.code=a.code.replace(e,function(e){if("function"==typeof o&&!o(e))return e;for(var n,t=c.length;-1!==a.code.indexOf(n=v(r,t));)++t;return c[t]=e,n}),a.grammar=h.languages.markup}}},tokenizePlaceholders:{value:function(p,k){if(p.language===k&&p.tokenStack){p.grammar=h.languages[k];var m=0,d=Object.keys(p.tokenStack);!function e(n){for(var t=0;t=d.length);t++){var a=n[t];if("string"==typeof a||a.content&&"string"==typeof a.content){var r=d[m],o=p.tokenStack[r],c="string"==typeof a?a:a.content,i=v(k,r),u=c.indexOf(i);if(-1|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,s=/[{}\[\](),:;]/;a.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:e,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|new|or|parent|print|private|protected|public|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s+)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:i,operator:n,punctuation:s};var l={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:a.languages.php},r=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:l}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:l}}];a.languages.insertBefore("php","variable",{string:r,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:e,string:r,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:t,number:i,operator:n,punctuation:s}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),a.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){a.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}}),a.hooks.add("after-tokenize",function(e){a.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism); +Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; +Prism.languages.plsql=Prism.languages.extend("sql",{comment:{pattern:/\/\*[\s\S]*?\*\/|--.*/,greedy:!0},keyword:/\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,operator:/:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/}),Prism.languages.insertBefore("plsql","operator",{label:{pattern:/<<\s*\w+\s*>>/,alias:"symbol"}}); +!function(e){var i=Prism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\s\S]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.*/,lookbehind:!0}],string:[{pattern:/"(?:`[\s\S]|[^`"])*"/,greedy:!0,inside:{function:{pattern:/(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,lookbehind:!0,inside:{}}}},{pattern:/'(?:[^']|'')*'/,greedy:!0}],namespace:/\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,boolean:/\$(?:false|true)\b/i,variable:/\$\w+\b/,function:[/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i],keyword:/\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,operator:{pattern:/(\W?)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\];(),.]/},r=i.string[0].inside;r.boolean=i.boolean,r.variable=i.variable,r.function.inside=i}(); +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python; +Prism.languages.sqf=Prism.languages.extend("clike",{string:{pattern:/"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,greedy:!0},keyword:/\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,boolean:/\b(?:false|true)\b/i,function:/\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,number:/(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,operator:/##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,"magic-variable":{pattern:/\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,alias:"keyword"},constant:/\bDIK(?:_[a-z\d]+)+\b/i}),Prism.languages.insertBefore("sqf","string",{macro:{pattern:/(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{directive:{pattern:/#[a-z]+\b/i,alias:"keyword"},comment:Prism.languages.sqf.comment}}}),delete Prism.languages.sqf["class-name"]; +!function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var s=e.languages.extend("typescript",{});delete s["class-name"],e.languages.typescript["class-name"].inside=s,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:s}}}}),e.languages.ts=e.languages.typescript}(Prism); +!function(){if("undefined"!=typeof Prism&&"undefined"!=typeof document){var o="line-numbers",a=/\n(?!$)/g,e=Prism.plugins.lineNumbers={getLine:function(e,n){if("PRE"===e.tagName&&e.classList.contains(o)){var t=e.querySelector(".line-numbers-rows");if(t){var i=parseInt(e.getAttribute("data-start"),10)||1,r=i+(t.children.length-1);n");(i=document.createElement("span")).setAttribute("aria-hidden","true"),i.className="line-numbers-rows",i.innerHTML=l,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(i),u([t]),Prism.hooks.run("line-numbers",e)}}}),Prism.hooks.add("line-numbers",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0})}function u(e){if(0!=(e=e.filter(function(e){var n=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null}(e)["white-space"];return"pre-wrap"===n||"pre-line"===n})).length){var n=e.map(function(e){var n=e.querySelector("code"),t=e.querySelector(".line-numbers-rows");if(n&&t){var i=e.querySelector(".line-numbers-sizer"),r=n.textContent.split(a);i||((i=document.createElement("span")).className="line-numbers-sizer",n.appendChild(i)),i.innerHTML="0",i.style.display="block";var s=i.getBoundingClientRect().height;return i.innerHTML="",{element:e,lines:r,lineHeights:[],oneLinerHeight:s,sizer:i}}}).filter(Boolean);n.forEach(function(e){var i=e.sizer,n=e.lines,r=e.lineHeights,s=e.oneLinerHeight;r[n.length-1]=void 0,n.forEach(function(e,n){if(e&&1i,.auth-single .layui-form-checkbox>i{font-size:20px;} + .layui-select-tags{padding:10px 0;} + .layui-tags-span{padding:5px 8px; font-size:14px; border-radius:3px; margin-bottom:6px; margin-right:6px; border:1px solid #e6e6e6; display:inline-block;cursor:pointer;} + .layui-readonly{background-color: #f5f5f5; color:#999;} + .layui-tags-span:hover{border:1px solid #ddd; background-color:#f2f2f2;} + .layui-tags-span i{margin-left:5px; font-size:14px;} + .layui-tags-span i:hover{border-radius:2px;background-color:#FF6347;color:#fff} + .layui-letter-span{padding:10px 5px; font-size:15px; display:inline-block; cursor:pointer;} + .layui-letter-span.on{color:#FF6347; font-weight:800;} + .layui-letter-span:hover{color:#4285f4;} + .layui-tags-all{float: right; font-weight: 200px; background-color:#4285f4; color:#fff; border-radius: 3px; padding: 2px 6px; cursor: pointer; display: none;} + .layui-table-form{margin-top: 0;} + .layui-table-form tbody tr:hover{background-color: #fff;} + .layui-td-gray{color:#999; width:80px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray2{color:#999; width:100px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray3{color:#999; width:120px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray4{color:#999; width:150px; text-align:right; background-color:#f8f8f8;} + .layui-td-gray font,.layui-td-gray2 font,.layui-td-gray3 font{color:#FF6347; margin-left: 3px;} + .main-body{padding:12px;padding-bottom: 0; min-width: 868px;} + .body-content{background-color:#fff; padding:10px 12px;} + .body-table{background-color:#fff; margin-bottom:12px} + .h3-title{font-size:18px; height:39px; font-weight:800} + .h3-title2{font-size:18px; height:39px; font-weight:800; padding-top:20px} + .body-form-btn{padding:10px 0;} + .span-color--1{color:#999999;} + .span-color-0{color:#5FB878;} + .span-color-1{color:#FF6347;} + .span-color-2{color:#01AAED;} + .span-color-3{color:#d89d00;} + .span-color-4{color:#CC0033;} + .span-color-5{color:#CCCC00;} + .span-color-6{color:#FF33CC;} + .span-color-7{color:#6699FF;} + .span-color-8{color:#CC9933;} +.layui-tab-title .layui-this:after {width:calc(100% - 35px );left:12px; min-width:65px;} + +@keyframes layui-rl{ + from{transform:translateX(0px);}to{transform:translateX(-100%);} +} +@-webkit-keyframes layui-rl{ + from{transform:translateX(0px);}to{transform:translateX(-100%);} +} +.layui-anim { + -webkit-animation-duration: .3s; + animation-duration: .3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.layui-anim-rl { + -webkit-animation-name: layui-rl; + animation-name: layui-rl; +} +.layui-layer-admin-right { + box-shadow: 1px 1px 10px rgba(0,0,0,.1); + border-radius: 0!important; + overflow: auto; +} +.layui-anim-rl.layui-layer-iframe{ + overflow:initial!important; +} +.right-popup-close{position: absolute;width:24px;height:60px; padding:30px 6px; line-height:30px;text-align:center; left: -38px;right:0; top: 20%;background-color:#FF5722;color:#fff;border-radius:6px 0 0 6px; cursor:pointer; border:2px solid #fff; border-right:none; font-weight:600; font-size:14px;} +.right-popup-close:hover{opacity:0.88} +.page-content{background-color:#fff;} + + +@font-face { + font-family: "iconfont"; /* Project id 2936988 */ + src: url('/static/layui/font/extend/iconfont.woff2?t=1636884517050') format('woff2'), + url('/static/layui/font/extend/iconfont.woff?t=1636884517050') format('woff'), + url('/static/layui/font/extend/iconfont.ttf?t=1636884517050') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-xueshengyidong:before { + content: "\e6e9"; +} + +.icon-baokao:before { + content: "\e6ea"; +} + +.icon-chengji:before { + content: "\e6eb"; +} + +.icon-yuejuan:before { + content: "\e6ec"; +} + +.icon-kaoheshezhi:before { + content: "\e6ed"; +} + +.icon-lunwenguanli:before { + content: "\e6ee"; +} + +.icon-shenbao:before { + content: "\e6ef"; +} + +.icon-kecheng:before { + content: "\e6f0"; +} + +.icon-tiku:before { + content: "\e6f1"; +} + +.icon-jiaowushezhi:before { + content: "\e6f2"; +} + +.icon-zidingyishezhi:before { + content: "\e6f3"; +} + +.icon-chaojitongji:before { + content: "\e6f4"; +} + +.icon-zhaoshengtongji:before { + content: "\e6f5"; +} + +.icon-tuiguangtongji:before { + content: "\e6f6"; +} + +.icon-xuexitongji:before { + content: "\e6f7"; +} + +.icon-diqushujutongji:before { + content: "\e6f8"; +} + +.icon-shujudaoru:before { + content: "\e6f9"; +} + +.icon-chengkaoguanli:before { + content: "\e6fb"; +} + +.icon-yuanchengguanli:before { + content: "\e6fe"; +} + +.icon-shujiguanli:before { + content: "\e6ff"; +} + +.icon-guochengxingkaohe:before { + content: "\e700"; +} + +.icon-xuefenrending:before { + content: "\e701"; +} + +.icon-kechengdingdan:before { + content: "\e702"; +} + +.icon-wentifankui:before { + content: "\e703"; +} + +.icon-zichan:before { + content: "\e704"; +} + +.icon-KPIguanli:before { + content: "\e705"; +} + +.icon-xiangmuguanli:before { + content: "\e706"; +} + +.icon-weixingongzhonghao:before { + content: "\e707"; +} + +.icon-anquanshezhi:before { + content: "\e708"; +} + +.icon-fuwuzhongxin:before { + content: "\e709"; +} + +.icon-qiyefuwu:before { + content: "\e70a"; +} + +.icon-wangkefuwu:before { + content: "\e70b"; +} + +.icon-shoufeiguanli:before { + content: "\e70c"; +} + +.icon-quanxianshezhi:before { + content: "\e70d"; +} + +.icon-jiaowutongji:before { + content: "\e70f"; +} + +.icon-jiaoxuetongji:before { + content: "\e710"; +} + +.icon-shoufeitongji:before { + content: "\e711"; +} + +.icon-fuwutongji:before { + content: "\e713"; +} + +.icon-tongzhitongji:before { + content: "\e714"; +} + +.icon-kaohetongji:before { + content: "\e715"; +} + +.icon-yonghuhuoyuedu:before { + content: "\e716"; +} + +.icon-xueshengbaoming:before { + content: "\e717"; +} + +.icon-xueshengluqu:before { + content: "\e718"; +} + +.icon-xueshengzhuce:before { + content: "\e719"; +} + +.icon-zaijixuesheng:before { + content: "\e71a"; +} + +.icon-huamingce:before { + content: "\e71b"; +} + +.icon-fenleiguanli:before { + content: "\e71c"; +} + +.icon-fuwuliebiao:before { + content: "\e71d"; +} + +.icon-fenleiliebiao:before { + content: "\e71e"; +} + +.icon-tongzhiliebiao:before { + content: "\e71f"; +} + +.icon-jiaoxuejihua:before { + content: "\e720"; +} + +.icon-jiaoxueanpai:before { + content: "\e721"; +} + +.icon-chengjiguanli:before { + content: "\e722"; +} + +.icon-tupianguanli:before { + content: "\e723"; +} + +.icon-kaoshijihua:before { + content: "\e724"; +} + +.icon-kaoshipeizhi:before { + content: "\e725"; +} + +.icon-xuexizhongxinguanli:before { + content: "\e726"; +} + +.icon-kaoheguanli:before { + content: "\e728"; +} + +.icon-jiaoshiguanli:before { + content: "\e729"; +} + +.icon-wangkeguanli:before { + content: "\e72a"; +} + +.icon-bulujiesuan:before { + content: "\e72b"; +} + +.icon-biyeguanli:before { + content: "\e72c"; +} + +.icon-kaohezhibiao:before { + content: "\e72d"; +} + +.icon-qiyeguanli:before { + content: "\e77e"; +} + +.icon-chubuguanli:before { + content: "\e77f"; +} + +.icon-hujiaobaobiao:before { + content: "\e780"; +} + +.icon-saomiaodianjing:before { + content: "\e781"; +} + +.icon-jiezhang:before { + content: "\e782"; +} + +.icon-xiaoshoubaobiao:before { + content: "\e783"; +} + +.icon-pingzheng:before { + content: "\e784"; +} + +.icon-hetongyidong:before { + content: "\e785"; +} + +.icon-xiaoshoupin:before { + content: "\e787"; +} + +.icon-xueshuguanli:before { + content: "\e788"; +} + +.icon-yihaopin:before { + content: "\e789"; +} + +.icon-renwuguanli:before { + content: "\e78a"; +} + +.icon-dianshang:before { + content: "\e78b"; +} + +.icon-mingpianbaobiao_1:before { + content: "\e78c"; +} + +.icon-gudingzichan:before { + content: "\e78d"; +} + +.icon-dongtaiguanli:before { + content: "\e78e"; +} + +.icon-jichupeizhi:before { + content: "\e78f"; +} + +.icon-hujiaotongji:before { + content: "\e790"; +} + +.icon-xiaoshoubaobiao_1:before { + content: "\e791"; +} + +.icon-dashuju:before { + content: "\e792"; +} + +.icon-huodongguanli:before { + content: "\e793"; +} + +.icon-hujiaoshezhi:before { + content: "\e794"; +} + +.icon-fenxiaoshichang:before { + content: "\e795"; +} + +.icon-chengjitongji:before { + content: "\e796"; +} + +.icon-tuiguangshezhi:before { + content: "\e797"; +} + +.icon-kechengzhongxin:before { + content: "\e798"; +} + +.icon-hetongshezhi:before { + content: "\e799"; +} + +.icon-kechengbaoguanli:before { + content: "\e79a"; +} + +.icon-yonghuguanli:before { + content: "\e79b"; +} + +.icon-yonghuhuaxiang:before { + content: "\e79c"; +} + +.icon-zhanghaoguanli:before { + content: "\e79d"; +} + +.icon-SEMguanli:before { + content: "\e79e"; +} + +.icon-yusuan:before { + content: "\e79f"; +} + +.icon-mingpianbaobiao:before { + content: "\e7a0"; +} + +.icon-dingdanguanli:before { + content: "\e7a1"; +} + +.icon-tuiguangguanli:before { + content: "\e7a2"; +} + +.icon-zhuantiguanli:before { + content: "\e7a3"; +} + +.icon-xinxiliu:before { + content: "\e7a4"; +} + +.icon-xiaoshoushezhi:before { + content: "\e7a5"; +} + +.icon-sucaiguanli:before { + content: "\e7a9"; +} + +.icon-xueshengdaoru:before { + content: "\e7aa"; +} + +.icon-shangpinguanli:before { + content: "\e7ab"; +} + +.icon-paikeguanli:before { + content: "\e7ac"; +} + +.icon-xinxidaoru:before { + content: "\e7ad"; +} + +.icon-shoufeipeizhi:before { + content: "\e7ae"; +} + +.icon-yonghuquanxian:before { + content: "\e7af"; +} + +.icon-zaijixueshengguanli:before { + content: "\e7b0"; +} + +.icon-xuehaoguanli:before { + content: "\e7b1"; +} + +.icon-kechengziyuanguanli:before { + content: "\e7b2"; +} + +.icon-mianshoujiaoxueanpai:before { + content: "\e7b3"; +} + +.icon-zhangfang:before { + content: "\e7b4"; +} + +.icon-kaikeguanli:before { + content: "\e7b5"; +} + +.icon-biyetongji:before { + content: "\e7b6"; +} + +.icon-zhaoshengzhunbei:before { + content: "\e7b8"; +} + +.icon-paikeshezhi:before { + content: "\e7b9"; +} + +.icon-banjiguanli:before { + content: "\e7ba"; +} + +.icon-jingpinketang:before { + content: "\e7bb"; +} + +.icon-yuangongtidian:before { + content: "\e7bc"; +} + +.icon-kaoshianpai:before { + content: "\e7bd"; +} + +.icon-wangluojiaoxueanpai:before { + content: "\e7bf"; +} + +.icon-ruxuechengji:before { + content: "\e7c3"; +} + +.icon-mianshoujiaoxue:before { + content: "\e7c6"; +} + +.icon-jiaoshijiaoshiguanli:before { + content: "\e7c7"; +} + +.icon-luquguanli:before { + content: "\e7c8"; +} + +.icon-luquchengji:before { + content: "\e7c9"; +} + +.icon-ziyuan:before { + content: "\e7ca"; +} + +.icon-kejian:before { + content: "\e7cc"; +} + +.icon-waibukejian:before { + content: "\e7cd"; +} + +.icon-rizhiguanli:before { + content: "\e7ce"; +} + +.icon-mobanguanli:before { + content: "\e7cf"; +} + +.icon-xuelirenzheng:before { + content: "\e7d1"; +} + +.icon-yiyichuli:before { + content: "\e7d2"; +} + +.icon-lunwenshenbao:before { + content: "\e7d3"; +} + +.icon-lunwenshezhi:before { + content: "\e7d4"; +} + +.icon-jiaoxuedianshezhi:before { + content: "\e7d5"; +} + +.icon-buluchenjiang:before { + content: "\e7d6"; +} + +.icon-mokuaishezhi:before { + content: "\e7d7"; +} + +.icon-ziliaoguanli:before { + content: "\e7d8"; +} + +.icon-jituanguanli:before { + content: "\e7d9"; +} + +.icon-yingyongguanli:before { + content: "\e7da"; +} + +.icon-guanwangshijuan:before { + content: "\e7db"; +} + +.icon-wodewangke:before { + content: "\e7dc"; +} + +.icon-jiaobenguanli:before { + content: "\e7dd"; +} + +.icon-zhuanyeguanliyuan:before { + content: "\e7de"; +} + +.icon-xueshengchengji:before { + content: "\e7df"; +} + +.icon-fuwuguanli:before { + content: "\e7e2"; +} + +.icon-daijinquan:before { + content: "\e7e3"; +} + +.icon-hujiaozhongxin:before { + content: "\e7e4"; +} + +.icon-yinjinshoufei:before { + content: "\e7e5"; +} + +.icon-yingjiaoqingdan:before { + content: "\e7e6"; +} + +.icon-duizhangdan:before { + content: "\e7e7"; +} + +.icon-shangjiguanli:before { + content: "\e7e8"; +} + +.icon-qiyehuihuacundang:before { + content: "\e7e9"; +} + +.icon-yonghushezhi:before { + content: "\e7ea"; +} + +.icon-xiaoxishezhi:before { + content: "\e7ec"; +} + +.icon-yingxiaoshezhi:before { + content: "\e7ed"; +} + +.icon-fuwushichang:before { + content: "\e7ee"; +} + +.icon-sucaiziyuan:before { + content: "\e7ef"; +} + +.icon-yingxiaowanfa:before { + content: "\e7f0"; +} + +.icon-tuiguang:before { + content: "\e7f1"; +} + +.icon-yonghuliebiao:before { + content: "\e7f2"; +} + +.icon-ziyuanguanli:before { + content: "\e692"; +} + +.icon-kechengguanli:before { + content: "\e693"; +} + +.icon-kechengbao:before { + content: "\e694"; +} + +.icon-tikuguanli:before { + content: "\e695"; +} + +.icon-wangkeshichang:before { + content: "\e696"; +} + +.icon-gongdan:before { + content: "\e697"; +} + +.icon-fangkeguanli:before { + content: "\e698"; +} + +.icon-xiansuoguanli:before { + content: "\e699"; +} + +.icon-kehuguanli:before { + content: "\e69a"; +} + +.icon-jituankehu:before { + content: "\e69b"; +} + +.icon-genjinjilu:before { + content: "\e69c"; +} + +.icon-hujiaoguanli:before { + content: "\e69d"; +} + +.icon-gongzuotai:before { + content: "\e69e"; +} + +.icon-shujubaobiao:before { + content: "\e69f"; +} + +.icon-fangkebaobiao:before { + content: "\e6a0"; +} + +.icon-zhangbuguanli:before { + content: "\e6a1"; +} + +.icon-zhangbuguanli_zi:before { + content: "\e6a2"; +} + +.icon-zhangbuguanli_zixitong_A:before { + content: "\e6a3"; +} + +.icon-hetongguanli:before { + content: "\e6a4"; +} + +.icon-yunyingzheguanli:before { + content: "\e6a5"; +} + +.icon-zhaopinguanli:before { + content: "\e6a6"; +} + +.icon-gongziguanli:before { + content: "\e6a7"; +} + +.icon-wodeshenpi:before { + content: "\e6a8"; +} + +.icon-biaozhunmobanshezhi:before { + content: "\e6a9"; +} + +.icon-jichushezhi:before { + content: "\e6aa"; +} + +.icon-caiwushezhi:before { + content: "\e6ab"; +} + +.icon-chanpinshezhi:before { + content: "\e6ac"; +} + +.icon-shenpishezhi:before { + content: "\e6ad"; +} + +.icon-mubiaoguanli:before { + content: "\e6ae"; +} + +.icon-zhandianshezhi:before { + content: "\e6af"; +} + +.icon-renshishezhi:before { + content: "\e6b0"; +} + +.icon-CRMshezhi:before { + content: "\e6b1"; +} + +.icon-mingpianshezhi:before { + content: "\e6b2"; +} + +.icon-wangxiaoshezhi:before { + content: "\e6b3"; +} + +.icon-wodedianping:before { + content: "\e6b4"; +} + +.icon-wodexuesheng:before { + content: "\e6b5"; +} + +.icon-lianxijilu:before { + content: "\e6b8"; +} + +.icon-tousutiwen:before { + content: "\e6b9"; +} + +.icon-peixunjihua:before { + content: "\e6ba"; +} + +.icon-feiyongchaxun:before { + content: "\e6bb"; +} + +.icon-xueshengjiaofei:before { + content: "\e6bc"; +} + +.icon-jizhang:before { + content: "\e6bd"; +} + +.icon-chaxun:before { + content: "\e6be"; +} + +.icon-chazhang:before { + content: "\e6bf"; +} + +.icon-baobiao:before { + content: "\e6c0"; +} + +.icon-shezhi:before { + content: "\e6c2"; +} + +.icon-daqiajilu:before { + content: "\e6ce"; +} + +.icon-wangluobanji:before { + content: "\e6d3"; +} + +.icon-wangxiaoshezhi1:before { + content: "\e6d6"; +} + +.icon-houtaishezhi:before { + content: "\e6d8"; +} + +.icon-zhaoshengshezhi:before { + content: "\e6db"; +} + +.icon-xiaoxizhongxin:before { + content: "\e6df"; +} + +.icon-zhaoshengbaobiao:before { + content: "\e6e1"; +} + +.icon-caidanguanli:before { + content: "\e6e2"; +} + +.icon-jituanshezhi:before { + content: "\e6e3"; +} + +.icon-shichangguanli:before { + content: "\e6e4"; +} + +.icon-chuangjianxitong:before { + content: "\e6e5"; +} + +.icon-gongdanguanli:before { + content: "\e6e6"; +} + +.icon-duanxin:before { + content: "\e6e7"; +} + +.icon-bangzhuzhongxin:before { + content: "\e6e8"; +} \ No newline at end of file diff --git a/public/static/home/css/gougucms.css b/public/static/home/css/gougucms.css new file mode 100644 index 0000000..bef690e --- /dev/null +++ b/public/static/home/css/gougucms.css @@ -0,0 +1,77 @@ +.main-body{padding:0;min-width: 1220px; +-moz-user-select: none; /*火狐*/ +-webkit-user-select: none; /*webkit浏览器*/ +-ms-user-select: none; /*IE10*/ +-khtml-user-select: none; /*早期浏览器*/ +user-select: none;} +.layui-layout-admin .layui-header {height:49px;background-color:#fff;box-shadow: 0 2px 6px 0 rgb(5 32 96 / 10%);} +.layui-layout-admin .layui-logo {line-height:49px;cursor:pointer;font-size:16px;color:#fff;background:#001529;width:200px;border-bottom: 1px solid #001529;} +.layui-layout-admin .layui-side {top:50px;width:200px;border-right:1px solid #ddd;} +.layui-header .layui-nav-item {line-height:49px; height:49px; border-left: 1px solid #eee;position: relative;display: inline-block; *display: inline; *zoom: 1; vertical-align: middle;} +.layui-header .layui-nav-item a{padding: 0 12px; text-align: center; min-width: 24px;} +.layui-header.layui-layout-left {color:#333;margin-left:10px;} +.layui-header.layui-layout-left input {border:0;} +.layui-header .layui-nav-bar {display:none;} +.layui-layout-right{padding: 0 3px; background-color:#fff;} +.layui-header .layui-nav-item #ittab-refresh {color:#000;} +.layui-header .layui-nav-item #ittab-refresh i {font-size:16px;} +.layui-header .layui-nav-item #ittab-del-cache{color:#000} +.layui-header .layui-nav-item #ittab-del-cache i{font-size:16px} +.layui-header.layui-layout-right .layui-nav-bar {background-color: #fff;} +.layui-tab-brief>.layui-tab-more li.layui-this:after {border-bottom: 0;} +.layui-nav-img {width:25px;height:25px;margin-right:0;} +.layui-header .msg-num { min-width: 18px;height: 18px;position: absolute;top: -10px;right: 5px;display: none;} +.layui-header .msg-num a {min-width: 18px; height: 18px; margin: 0; padding: 0; display: inline-block; font-size: 11px;line-height: 18px;text-align: center; background-color: #FF5722; color: #fff;border-radius: 12px; cursor: pointer;} + + +.layui-layout-admin .layui-body {top:50px; z-index:1008; padding:0;padding-right:0;padding-bottom:0;bottom:0;left:200px;overflow:visible;right:0;background-color:#F5F8FA;} + +.menulist-bg-gray{background-color:#001529;} +.menulist {width:100%;height:100%; border-right:1px solid #ccc; font-size:14px; color:#aaaaaa;} +.layui-side.menulist-bg-gray::-webkit-scrollbar{width: 0; height: 0;} +.menulist-top {padding: 10px 12px; font-size:0; border-bottom: 1px solid #17232c; text-align:center;} +.menulist-top a {background-color:#34a853; opacity:1; width: 25%; margin:0; padding: 5px 0; display:inline-block;} +.menulist-top .layui-icon {color:#fff;font-size:16px;} +.menulist-top a:first-child {border-radius: 3px 0 0 3px;} +.menulist-top a:last-child {border-radius: 0 3px 3px 0;} +.menulist-top a:hover{opacity: .9;} +.menulist .layui-nav{background-color:#001529;} +.menulist .layui-nav-tree .layui-nav-bar{width:4px;background-color:#E94335} +.layui-nav-tree .layui-nav-child{padding:0;} +.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover{background-color:#131E25} +.layui-nav .layui-nav-item a{padding-left:12px;} +.layui-nav .layui-nav-item a.menu-b{padding-left:32px;} +.layui-nav .layui-nav-item a.menu-c{padding-left:45px;} +.layui-nav .layui-nav-item a.menu-d{padding-left:58px;} + +.gougu-admin-tab {margin:0;} +.gougu-admin-tab .layui-icon-prev,.gougu-admin-tab .layui-icon-next {position:absolute;top:-50px; width:39px; height:49px; line-height:49px; color: #999; text-align:center; cursor:pointer; background-color:#fff;} +.gougu-admin-tab .layui-icon-prev{left:0; border-right: 1px solid #eee;} +.gougu-admin-tab .layui-icon-next {right:152px; border-left: 1px solid #eee;} +.gougu-admin-tab .layui-icon-prev:hover,.gougu-admin-tab .layui-icon-next:hover{color: #333;} + +.gougu-admin-tab .layui-tab-title {position:absolute;top:-50px; z-index:58; height:49px;left:40px; border:0;max-width:calc(100% - 226px); overflow:hidden;} +.gougu-admin-tab .layui-tab-title li {min-width:36px; padding:0 24px 0 12px; color:#666;font-size:12px;line-height:48px;border-top:3px solid #fff; border-right: 1px solid #F5F8FA; background-color:#fff;} +.gougu-admin-tab .layui-tab-title li .gougu-tab-active {display: inline-block; background-color: #999; width: 8px; height: 8px; border-radius: 20px; margin-right: 6px;} +.gougu-admin-tab .layui-tab-title li .layui-tab-close {position:absolute;width:15px;height:15px;line-height:16px;top:16px;right:5px;font-size:10px;display:none;border-radius:50%;} + +.gougu-admin-tab .layui-tab-title li:hover {color:#333;background-color:#F5F8FA;border-top:3px solid #333;} +.gougu-admin-tab .layui-tab-title li:hover .gougu-tab-active {background-color:#333} +.gougu-admin-tab .layui-tab-title li:hover .layui-tab-close {display:inline-block;} + +.gougu-admin-tab .layui-tab-title li .layui-tab-close:hover {background-color:#E94335;color:#fff;} + +.gougu-admin-tab .layui-tab-title li.layui-this {color:#333;background-color:#F5F8FA;border-top:3px solid #E94335;} +.gougu-admin-tab .layui-tab-title li.layui-this .gougu-tab-active{background-color:#E94335;} +.gougu-admin-tab .layui-tab-title li.layui-this .layui-tab-close{display:inline-block;} + +.gougu-admin-tab .layui-tab-title li.ittab-tab-home{padding:0 16px;} +.gougu-admin-tab .layui-tab-title li.ittab-tab-home .layui-tab-close {display:none;} +.gougu-admin-tab .layui-tab-title li.ittab-tab-home:hover .layui-tab-close {display:none;} + +.gougu-admin-tab .layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after {border:0;} +.gougu-admin-tab .layui-tab-item {height:100%;} +.gougu-admin-tab .layui-tab-bar {height: 50px;border-width: 0;line-height: 50px;} + +.layui-layout-admin .layui-footer {left:200px;height:30px;line-height:30px;background-color:#f0f0f0;font-size:12px;} +.layui-tab-content {padding:0px;} \ No newline at end of file diff --git a/public/static/home/file/msg.mp3 b/public/static/home/file/msg.mp3 new file mode 100644 index 0000000..8d576b6 Binary files /dev/null and b/public/static/home/file/msg.mp3 differ diff --git a/public/static/home/file/oa_area.sql b/public/static/home/file/oa_area.sql new file mode 100644 index 0000000..2edcbc9 --- /dev/null +++ b/public/static/home/file/oa_area.sql @@ -0,0 +1,3683 @@ +-- ---------------------------- +-- Table structure for oa_area +-- ---------------------------- +DROP TABLE IF EXISTS `oa_area`; +CREATE TABLE `oa_area` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `pid` int(11) NOT NULL DEFAULT 0 COMMENT '父级', + `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称', + shortname varchar(30) NOT NULL DEFAULT '' COMMENT '简称', + longitude varchar(30) NOT NULL DEFAULT '' COMMENT '经度', + latitude varchar(30) NOT NULL DEFAULT '' COMMENT '纬度', + level smallint(6) NOT NULL DEFAULT 0 COMMENT '级别', + sort mediumint(9) NOT NULL DEFAULT 0 COMMENT '排序', + status tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:默认1有效', + PRIMARY KEY (id) +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '中国省市区数据表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of oa_area +-- ---------------------------- +INSERT INTO oa_area VALUES +(110000, 0, '北京市', '北京', '116.40529', '39.904987', 1, 0, 1), +(110100, 110000, '北京市', '北京', '116.40529', '39.904987', 2, 0, 1), +(110101, 110100, '东城区', '东城', '116.418755', '39.917545', 3, 0, 1), +(110102, 110100, '西城区', '西城', '116.36679', '39.91531', 3, 0, 1), +(110105, 110100, '朝阳区', '朝阳', '116.48641', '39.92149', 3, 0, 1), +(110106, 110100, '丰台区', '丰台', '116.286964', '39.863644', 3, 0, 1), +(110107, 110100, '石景山区', '石景山', '116.19544', '39.9146', 3, 0, 1), +(110108, 110100, '海淀区', '海淀', '116.31032', '39.956074', 3, 0, 1), +(110109, 110100, '门头沟区', '门头沟', '116.10538', '39.937183', 3, 0, 1), +(110111, 110100, '房山区', '房山', '116.13916', '39.735535', 3, 0, 1), +(110112, 110100, '通州区', '通州', '116.6586', '39.902485', 3, 0, 1), +(110113, 110100, '顺义区', '顺义', '116.65353', '40.128937', 3, 0, 1), +(110114, 110100, '昌平区', '昌平', '116.23591', '40.218086', 3, 0, 1), +(110115, 110100, '大兴区', '大兴', '116.338036', '39.72891', 3, 0, 1), +(110116, 110100, '怀柔区', '怀柔', '116.63712', '40.324272', 3, 0, 1), +(110117, 110100, '平谷区', '平谷', '117.112335', '40.144783', 3, 0, 1), +(110118, 110100, '密云区', '密云', '116.84317', '40.37625', 3, 0, 1), +(110119, 110100, '延庆区', '延庆', '115.97503', '40.45678', 3, 0, 1), +(120000, 0, '天津市', '天津', '117.190186', '39.125595', 1, 0, 1), +(120100, 120000, '天津市', '天津', '117.190186', '39.125595', 2, 0, 1), +(120101, 120100, '和平区', '和平', '117.19591', '39.11833', 3, 0, 1), +(120102, 120100, '河东区', '河东', '117.22657', '39.122124', 3, 0, 1), +(120103, 120100, '河西区', '河西', '117.21754', '39.1019', 3, 0, 1), +(120104, 120100, '南开区', '南开', '117.16415', '39.120476', 3, 0, 1), +(120105, 120100, '河北区', '河北', '117.20157', '39.15663', 3, 0, 1), +(120106, 120100, '红桥区', '红桥', '117.1633', '39.175068', 3, 0, 1), +(120110, 120100, '东丽区', '东丽', '117.313965', '39.087765', 3, 0, 1), +(120111, 120100, '西青区', '西青', '117.012245', '39.139446', 3, 0, 1), +(120112, 120100, '津南区', '津南', '117.382545', '38.98958', 3, 0, 1), +(120113, 120100, '北辰区', '北辰', '117.13482', '39.225555', 3, 0, 1), +(120114, 120100, '武清区', '武清', '117.05796', '39.376926', 3, 0, 1), +(120115, 120100, '宝坻区', '宝坻', '117.30809', '39.716965', 3, 0, 1), +(120116, 120100, '滨海新区', '滨海', '117.654175', '39.032845', 3, 0, 1), +(120117, 120100, '宁河区', '宁河', '117.82478', '39.33091', 3, 0, 1), +(120118, 120100, '静海区', '静海', '116.97428', '38.94737', 3, 0, 1), +(120119, 120100, '蓟州区', '蓟州', '117.40829', '40.04577', 3, 0, 1), +(130000, 0, '河北省', '河北', '114.502464', '38.045475', 1, 0, 1), +(130100, 130000, '石家庄市', '石家庄', '114.502464', '38.045475', 2, 0, 1), +(130102, 130100, '长安区', '长安', '114.54815', '38.0475', 3, 0, 1), +(130104, 130100, '桥西区', '桥西', '114.46293', '38.02838', 3, 0, 1), +(130105, 130100, '新华区', '新华', '114.46597', '38.067142', 3, 0, 1), +(130107, 130100, '井陉矿区', '井陉矿', '114.05818', '38.069748', 3, 0, 1), +(130108, 130100, '裕华区', '裕华', '114.53326', '38.027695', 3, 0, 1), +(130109, 130100, '藁城区', '藁城', '114.84676', '38.02166', 3, 0, 1), +(130110, 130100, '鹿泉区', '鹿泉', '114.31344', '38.08587', 3, 0, 1), +(130111, 130100, '栾城区', '栾城', '114.64839', '37.90025', 3, 0, 1), +(130121, 130100, '井陉县', '井陉', '114.144485', '38.033615', 3, 0, 1), +(130123, 130100, '正定县', '正定', '114.569885', '38.147835', 3, 0, 1), +(130125, 130100, '行唐县', '行唐', '114.552734', '38.437424', 3, 0, 1), +(130126, 130100, '灵寿县', '灵寿', '114.37946', '38.306545', 3, 0, 1), +(130127, 130100, '高邑县', '高邑', '114.6107', '37.605713', 3, 0, 1), +(130128, 130100, '深泽县', '深泽', '115.20021', '38.18454', 3, 0, 1), +(130129, 130100, '赞皇县', '赞皇', '114.38776', '37.6602', 3, 0, 1), +(130130, 130100, '无极县', '无极', '114.977844', '38.176376', 3, 0, 1), +(130131, 130100, '平山县', '平山', '114.18414', '38.25931', 3, 0, 1), +(130132, 130100, '元氏县', '元氏', '114.52618', '37.762512', 3, 0, 1), +(130133, 130100, '赵县', '赵县', '114.77536', '37.75434', 3, 0, 1), +(130181, 130100, '辛集市', '辛集', '115.21745', '37.92904', 3, 0, 1), +(130183, 130100, '晋州市', '晋州', '115.04488', '38.027477', 3, 0, 1), +(130184, 130100, '新乐市', '新乐', '114.68578', '38.34477', 3, 0, 1), +(130200, 130000, '唐山市', '唐山', '118.17539', '39.635113', 2, 0, 1), +(130202, 130200, '路南区', '路南', '118.21082', '39.61516', 3, 0, 1), +(130203, 130200, '路北区', '路北', '118.174736', '39.628536', 3, 0, 1), +(130204, 130200, '古冶区', '古冶', '118.45429', '39.715736', 3, 0, 1), +(130205, 130200, '开平区', '开平', '118.26443', '39.67617', 3, 0, 1), +(130207, 130200, '丰南区', '丰南', '118.110794', '39.56303', 3, 0, 1), +(130208, 130200, '丰润区', '丰润', '118.15578', '39.831364', 3, 0, 1), +(130209, 130200, '曹妃甸区', '曹妃甸', '118.46023', '39.27313', 3, 0, 1), +(130224, 130200, '滦南县', '滦南', '118.68155', '39.506203', 3, 0, 1), +(130225, 130200, '乐亭县', '乐亭', '118.90534', '39.42813', 3, 0, 1), +(130227, 130200, '迁西县', '迁西', '118.30514', '40.146236', 3, 0, 1), +(130229, 130200, '玉田县', '玉田', '117.75366', '39.88732', 3, 0, 1), +(130281, 130200, '遵化市', '遵化', '117.96587', '40.188618', 3, 0, 1), +(130283, 130200, '迁安市', '迁安', '118.701935', '40.012108', 3, 0, 1), +(130284, 130200, '滦州市', '滦州', '118.70351', '39.74058', 3, 0, 1), +(130300, 130000, '秦皇岛市', '秦皇岛', '119.58658', '39.94253', 2, 0, 1), +(130302, 130300, '海港区', '海港', '119.59622', '39.94346', 3, 0, 1), +(130303, 130300, '山海关区', '山海关', '119.75359', '39.998024', 3, 0, 1), +(130304, 130300, '北戴河区', '北戴河', '119.48628', '39.825123', 3, 0, 1), +(130306, 130300, '抚宁区', '抚宁', '119.24444', '39.87634', 3, 0, 1), +(130321, 130300, '青龙满族自治县', '青龙', '118.95455', '40.40602', 3, 0, 1), +(130322, 130300, '昌黎县', '昌黎', '119.16454', '39.70973', 3, 0, 1), +(130324, 130300, '卢龙县', '卢龙', '118.881805', '39.89164', 3, 0, 1), +(130400, 130000, '邯郸市', '邯郸', '114.490685', '36.612274', 2, 0, 1), +(130402, 130400, '邯山区', '邯山', '114.484985', '36.603195', 3, 0, 1), +(130403, 130400, '丛台区', '丛台', '114.494705', '36.61108', 3, 0, 1), +(130404, 130400, '复兴区', '复兴', '114.458244', '36.615482', 3, 0, 1), +(130406, 130400, '峰峰矿区', '峰峰矿', '114.20994', '36.420486', 3, 0, 1), +(130407, 130400, '肥乡区', '肥乡', '114.80002', '36.54811', 3, 0, 1), +(130408, 130400, '永年区', '永年', '114.49095', '36.77771', 3, 0, 1), +(130423, 130400, '临漳县', '临漳', '114.6107', '36.337605', 3, 0, 1), +(130424, 130400, '成安县', '成安', '114.68036', '36.443832', 3, 0, 1), +(130425, 130400, '大名县', '大名', '115.15259', '36.283318', 3, 0, 1), +(130426, 130400, '涉县', '涉县', '113.673294', '36.563145', 3, 0, 1), +(130427, 130400, '磁县', '磁县', '114.38208', '36.367672', 3, 0, 1), +(130430, 130400, '邱县', '邱县', '115.16859', '36.81325', 3, 0, 1), +(130431, 130400, '鸡泽县', '鸡泽', '114.87852', '36.91491', 3, 0, 1), +(130432, 130400, '广平县', '广平', '114.95086', '36.483604', 3, 0, 1), +(130433, 130400, '馆陶县', '馆陶', '115.289055', '36.53946', 3, 0, 1), +(130434, 130400, '魏县', '魏县', '114.93411', '36.354248', 3, 0, 1), +(130435, 130400, '曲周县', '曲周', '114.95759', '36.7734', 3, 0, 1), +(130481, 130400, '武安市', '武安', '114.19458', '36.696114', 3, 0, 1), +(130500, 130000, '邢台市', '邢台', '114.50885', '37.0682', 2, 0, 1), +(130502, 130500, '襄都区', '桥东', '114.50713', '37.064125', 3, 0, 1), +(130503, 130500, '信都区', '桥西', '114.47369', '37.06801', 3, 0, 1), +(130505, 130500, '任泽区', '任泽', '', '', 3, 0, 1), +(130506, 130500, '南和区', '南和', '', '', 3, 0, 1), +(130522, 130500, '临城县', '临城', '114.506874', '37.444008', 3, 0, 1), +(130523, 130500, '内丘县', '内丘', '114.51152', '37.287663', 3, 0, 1), +(130524, 130500, '柏乡县', '柏乡', '114.69338', '37.483597', 3, 0, 1), +(130525, 130500, '隆尧县', '隆尧', '114.776344', '37.350925', 3, 0, 1), +(130528, 130500, '宁晋县', '宁晋', '114.92103', '37.618958', 3, 0, 1), +(130529, 130500, '巨鹿县', '巨鹿', '115.03878', '37.21768', 3, 0, 1), +(130530, 130500, '新河县', '新河', '115.247536', '37.526215', 3, 0, 1), +(130531, 130500, '广宗县', '广宗', '115.1428', '37.075546', 3, 0, 1), +(130532, 130500, '平乡县', '平乡', '115.02922', '37.069405', 3, 0, 1), +(130533, 130500, '威县', '威县', '115.27275', '36.983273', 3, 0, 1), +(130534, 130500, '清河县', '清河', '115.669', '37.05999', 3, 0, 1), +(130535, 130500, '临西县', '临西', '115.49869', '36.8642', 3, 0, 1), +(130581, 130500, '南宫市', '南宫', '115.3981', '37.35967', 3, 0, 1), +(130582, 130500, '沙河市', '沙河', '114.504906', '36.861904', 3, 0, 1), +(130600, 130000, '保定市', '保定', '115.48233', '38.867657', 2, 0, 1), +(130602, 130600, '竞秀区', '新市', '115.47066', '38.88662', 3, 0, 1), +(130606, 130600, '莲池区', '莲池', '115.49715', '38.88353', 3, 0, 1), +(130607, 130600, '满城区', '满城', '115.32217', '38.94892', 3, 0, 1), +(130608, 130600, '清苑区', '清苑', '115.48989', '38.76526', 3, 0, 1), +(130609, 130600, '徐水区', '徐水', '115.65586', '39.01865', 3, 0, 1), +(130623, 130600, '涞水县', '涞水', '115.71198', '39.393147', 3, 0, 1), +(130624, 130600, '阜平县', '阜平', '114.1988', '38.847275', 3, 0, 1), +(130626, 130600, '定兴县', '定兴', '115.7969', '39.266193', 3, 0, 1), +(130627, 130600, '唐县', '唐县', '114.98124', '38.748543', 3, 0, 1), +(130628, 130600, '高阳县', '高阳', '115.77888', '38.69009', 3, 0, 1), +(130629, 130600, '容城县', '容城', '115.86625', '39.05282', 3, 0, 1), +(130630, 130600, '涞源县', '涞源', '114.692566', '39.35755', 3, 0, 1), +(130631, 130600, '望都县', '望都', '115.15401', '38.707447', 3, 0, 1), +(130632, 130600, '安新县', '安新', '115.93198', '38.929913', 3, 0, 1), +(130633, 130600, '易县', '易县', '115.501144', '39.35297', 3, 0, 1), +(130634, 130600, '曲阳县', '曲阳', '114.704056', '38.61999', 3, 0, 1), +(130635, 130600, '蠡县', '蠡县', '115.58363', '38.49643', 3, 0, 1), +(130636, 130600, '顺平县', '顺平', '115.13275', '38.845127', 3, 0, 1), +(130637, 130600, '博野县', '博野', '115.4618', '38.45827', 3, 0, 1), +(130638, 130600, '雄县', '雄县', '116.107475', '38.990818', 3, 0, 1), +(130681, 130600, '涿州市', '涿州', '115.97341', '39.485764', 3, 0, 1), +(130682, 130600, '定州市', '定州', '114.99139', '38.5176', 3, 0, 1), +(130683, 130600, '安国市', '安国', '115.33141', '38.421368', 3, 0, 1), +(130684, 130600, '高碑店市', '高碑店', '115.882706', '39.32769', 3, 0, 1), +(130700, 130000, '张家口市', '张家口', '114.884094', '40.8119', 2, 0, 1), +(130702, 130700, '桥东区', '桥东', '114.88566', '40.813873', 3, 0, 1), +(130703, 130700, '桥西区', '桥西', '114.882126', '40.824387', 3, 0, 1), +(130705, 130700, '宣化区', '宣化区', '115.0632', '40.609367', 3, 0, 1), +(130706, 130700, '下花园区', '下花园', '115.281', '40.488644', 3, 0, 1), +(130708, 130700, '万全区', '万全', '114.74055', '40.76699', 3, 0, 1), +(130709, 130700, '崇礼区', '崇礼', '115.282349', '40.974758', 3, 0, 1), +(130722, 130700, '张北县', '张北', '114.71595', '41.151714', 3, 0, 1), +(130723, 130700, '康保县', '康保', '114.61581', '41.850044', 3, 0, 1), +(130724, 130700, '沽源县', '沽源', '115.68484', '41.66742', 3, 0, 1), +(130725, 130700, '尚义县', '尚义', '113.977715', '41.08009', 3, 0, 1), +(130726, 130700, '蔚县', '蔚县', '114.582695', '39.83718', 3, 0, 1), +(130727, 130700, '阳原县', '阳原', '114.16734', '40.11342', 3, 0, 1), +(130728, 130700, '怀安县', '怀安', '114.42236', '40.671272', 3, 0, 1), +(130730, 130700, '怀来县', '怀来', '115.52084', '40.405403', 3, 0, 1), +(130731, 130700, '涿鹿县', '涿鹿', '115.219246', '40.3787', 3, 0, 1), +(130732, 130700, '赤城县', '赤城', '115.83271', '40.912083', 3, 0, 1), +(130800, 130000, '承德市', '承德', '117.939156', '40.976204', 2, 0, 1), +(130802, 130800, '双桥区', '双桥', '117.939156', '40.976204', 3, 0, 1), +(130803, 130800, '双滦区', '双滦', '117.797485', '40.959755', 3, 0, 1), +(130804, 130800, '鹰手营子矿区', '鹰手营子矿', '117.661156', '40.546955', 3, 0, 1), +(130821, 130800, '承德县', '承德', '118.17249', '40.76864', 3, 0, 1), +(130822, 130800, '兴隆县', '兴隆', '117.507095', '40.418526', 3, 0, 1), +(130824, 130800, '滦平县', '滦平', '117.33713', '40.936646', 3, 0, 1), +(130825, 130800, '隆化县', '隆化', '117.73634', '41.316666', 3, 0, 1), +(130826, 130800, '丰宁满族自治县', '丰宁', '116.65121', '41.209904', 3, 0, 1), +(130827, 130800, '宽城满族自治县', '宽城', '118.48864', '40.607983', 3, 0, 1), +(130828, 130800, '围场满族蒙古族自治县', '围场', '117.764084', '41.949406', 3, 0, 1), +(130881, 130800, '平泉市', '平泉', '118.70065', '41.01797', 3, 0, 1), +(130900, 130000, '沧州市', '沧州', '116.85746', '38.31058', 2, 0, 1), +(130902, 130900, '新华区', '新华', '116.87305', '38.308273', 3, 0, 1), +(130903, 130900, '运河区', '运河', '116.840065', '38.307404', 3, 0, 1), +(130921, 130900, '沧县', '沧县', '117.00748', '38.219856', 3, 0, 1), +(130922, 130900, '青县', '青县', '116.83839', '38.569645', 3, 0, 1), +(130923, 130900, '东光县', '东光', '116.54206', '37.88655', 3, 0, 1), +(130924, 130900, '海兴县', '海兴', '117.496605', '38.141582', 3, 0, 1), +(130925, 130900, '盐山县', '盐山', '117.22981', '38.05614', 3, 0, 1), +(130926, 130900, '肃宁县', '肃宁', '115.83585', '38.4271', 3, 0, 1), +(130927, 130900, '南皮县', '南皮', '116.70917', '38.04244', 3, 0, 1), +(130928, 130900, '吴桥县', '吴桥', '116.39151', '37.62818', 3, 0, 1), +(130929, 130900, '献县', '献县', '116.12384', '38.18966', 3, 0, 1), +(130930, 130900, '孟村回族自治县', '孟村', '117.1051', '38.057953', 3, 0, 1), +(130981, 130900, '泊头市', '泊头', '116.57016', '38.07348', 3, 0, 1), +(130982, 130900, '任丘市', '任丘', '116.106766', '38.706512', 3, 0, 1), +(130983, 130900, '黄骅市', '黄骅', '117.3438', '38.36924', 3, 0, 1), +(130984, 130900, '河间市', '河间', '116.089455', '38.44149', 3, 0, 1), +(131000, 130000, '廊坊市', '廊坊', '116.70444', '39.523926', 2, 0, 1), +(131002, 131000, '安次区', '安次', '116.69454', '39.502567', 3, 0, 1), +(131003, 131000, '广阳区', '广阳', '116.71371', '39.52193', 3, 0, 1), +(131022, 131000, '固安县', '固安', '116.2999', '39.436466', 3, 0, 1), +(131023, 131000, '永清县', '永清', '116.49809', '39.319717', 3, 0, 1), +(131024, 131000, '香河县', '香河', '117.007164', '39.757214', 3, 0, 1), +(131025, 131000, '大城县', '大城', '116.64073', '38.699215', 3, 0, 1), +(131026, 131000, '文安县', '文安', '116.460106', '38.866802', 3, 0, 1), +(131028, 131000, '大厂回族自治县', '大厂', '116.9865', '39.889267', 3, 0, 1), +(131081, 131000, '霸州市', '霸州', '116.39202', '39.117332', 3, 0, 1), +(131082, 131000, '三河市', '三河', '117.07702', '39.982777', 3, 0, 1), +(131100, 130000, '衡水市', '衡水', '115.66599', '37.735096', 2, 0, 1), +(131102, 131100, '桃城区', '桃城', '115.69495', '37.73224', 3, 0, 1), +(131103, 131100, '冀州区', '冀州', '115.57938', '37.55085', 3, 0, 1), +(131121, 131100, '枣强县', '枣强', '115.7265', '37.511513', 3, 0, 1), +(131122, 131100, '武邑县', '武邑', '115.89242', '37.803776', 3, 0, 1), +(131123, 131100, '武强县', '武强', '115.97024', '38.03698', 3, 0, 1), +(131124, 131100, '饶阳县', '饶阳', '115.72658', '38.23267', 3, 0, 1), +(131125, 131100, '安平县', '安平', '115.51963', '38.233513', 3, 0, 1), +(131126, 131100, '故城县', '故城', '115.96674', '37.350983', 3, 0, 1), +(131127, 131100, '景县', '景县', '116.258446', '37.686623', 3, 0, 1), +(131128, 131100, '阜城县', '阜城', '116.16473', '37.869946', 3, 0, 1), +(131182, 131100, '深州市', '深州', '115.554596', '38.00347', 3, 0, 1), +(140000, 0, '山西省', '山西', '112.54925', '37.857014', 1, 0, 1), +(140100, 140000, '太原市', '太原', '112.54925', '37.857014', 2, 0, 1), +(140105, 140100, '小店区', '小店', '112.56427', '37.817974', 3, 0, 1), +(140106, 140100, '迎泽区', '迎泽', '112.55885', '37.855804', 3, 0, 1), +(140107, 140100, '杏花岭区', '杏花岭', '112.560745', '37.87929', 3, 0, 1), +(140108, 140100, '尖草坪区', '尖草坪', '112.48712', '37.93989', 3, 0, 1), +(140109, 140100, '万柏林区', '万柏林', '112.522255', '37.86265', 3, 0, 1), +(140110, 140100, '晋源区', '晋源', '112.47785', '37.71562', 3, 0, 1), +(140121, 140100, '清徐县', '清徐', '112.35796', '37.60729', 3, 0, 1), +(140122, 140100, '阳曲县', '阳曲', '112.67382', '38.058796', 3, 0, 1), +(140123, 140100, '娄烦县', '娄烦', '111.7938', '38.066036', 3, 0, 1), +(140181, 140100, '古交市', '古交', '112.174355', '37.908535', 3, 0, 1), +(140200, 140000, '大同市', '大同', '113.29526', '40.09031', 2, 0, 1), +(140212, 140200, '新荣区', '新荣', '113.141045', '40.25827', 3, 0, 1), +(140213, 140200, '平城区', '平城', '113.29798', '40.07583', 3, 0, 1), +(140214, 140200, '云冈区', '云冈', '113.14952', '40.00543', 3, 0, 1), +(140215, 140200, '云州区', '云州', '113.61217', '40.04016', 3, 0, 1), +(140221, 140200, '阳高县', '阳高', '113.74987', '40.364925', 3, 0, 1), +(140222, 140200, '天镇县', '天镇', '114.09112', '40.421337', 3, 0, 1), +(140223, 140200, '广灵县', '广灵', '114.27925', '39.76305', 3, 0, 1), +(140224, 140200, '灵丘县', '灵丘', '114.23576', '39.438866', 3, 0, 1), +(140225, 140200, '浑源县', '浑源', '113.69809', '39.6991', 3, 0, 1), +(140226, 140200, '左云县', '左云', '112.70641', '40.012875', 3, 0, 1), +(140300, 140000, '阳泉市', '阳泉', '113.58328', '37.861187', 2, 0, 1), +(140302, 140300, '城区', '城区', '113.58651', '37.86094', 3, 0, 1), +(140303, 140300, '矿区', '矿区', '113.55907', '37.870087', 3, 0, 1), +(140311, 140300, '郊区', '郊区', '113.58328', '37.861187', 3, 0, 1), +(140321, 140300, '平定县', '平定', '113.63105', '37.80029', 3, 0, 1), +(140322, 140300, '盂县', '盂县', '113.41223', '38.086132', 3, 0, 1), +(140400, 140000, '长治市', '长治', '113.113556', '36.191113', 2, 0, 1), +(140403, 140400, '潞州区', '潞州', '113.12303', '36.20346', 3, 0, 1), +(140404, 140400, '上党区', '上党', '113.05135', '36.05312', 3, 0, 1), +(140405, 140400, '屯留区', '屯留', '112.89221', '36.31553', 3, 0, 1), +(140406, 140400, '潞城区', '潞城', '113.22893', '36.33418', 3, 0, 1), +(140423, 140400, '襄垣县', '襄垣', '113.050095', '36.532852', 3, 0, 1), +(140425, 140400, '平顺县', '平顺', '113.43879', '36.200203', 3, 0, 1), +(140426, 140400, '黎城县', '黎城', '113.38737', '36.50297', 3, 0, 1), +(140427, 140400, '壶关县', '壶关', '113.20614', '36.11094', 3, 0, 1), +(140428, 140400, '长子县', '长子', '112.88466', '36.119484', 3, 0, 1), +(140429, 140400, '武乡县', '武乡', '112.8653', '36.834316', 3, 0, 1), +(140430, 140400, '沁县', '沁县', '112.70138', '36.757122', 3, 0, 1), +(140431, 140400, '沁源县', '沁源', '112.34088', '36.50078', 3, 0, 1), +(140500, 140000, '晋城市', '晋城', '112.85127', '35.497555', 2, 0, 1), +(140502, 140500, '城区', '城区', '112.8531', '35.49664', 3, 0, 1), +(140521, 140500, '沁水县', '沁水', '112.18721', '35.689472', 3, 0, 1), +(140522, 140500, '阳城县', '阳城', '112.42201', '35.482178', 3, 0, 1), +(140524, 140500, '陵川县', '陵川', '113.27888', '35.775616', 3, 0, 1), +(140525, 140500, '泽州县', '泽州', '112.89914', '35.61722', 3, 0, 1), +(140581, 140500, '高平市', '高平', '112.930695', '35.791355', 3, 0, 1), +(140600, 140000, '朔州市', '朔州', '112.43339', '39.33126', 2, 0, 1), +(140602, 140600, '朔城区', '朔城', '112.42867', '39.324524', 3, 0, 1), +(140603, 140600, '平鲁区', '平鲁', '112.29523', '39.515602', 3, 0, 1), +(140621, 140600, '山阴县', '山阴', '112.8164', '39.52677', 3, 0, 1), +(140622, 140600, '应县', '应县', '113.18751', '39.55919', 3, 0, 1), +(140623, 140600, '右玉县', '右玉', '112.46559', '39.98881', 3, 0, 1), +(140681, 140600, '怀仁市', '怀仁', '113.10012', '39.82788', 3, 0, 1), +(140700, 140000, '晋中市', '晋中', '112.736465', '37.696495', 2, 0, 1), +(140702, 140700, '榆次区', '榆次', '112.74006', '37.6976', 3, 0, 1), +(140703, 140700, '太谷区', '太谷', '112.55126', '37.42119', 3, 0, 1), +(140721, 140700, '榆社县', '榆社', '112.97352', '37.06902', 3, 0, 1), +(140722, 140700, '左权县', '左权', '113.37783', '37.079674', 3, 0, 1), +(140723, 140700, '和顺县', '和顺', '113.57292', '37.327026', 3, 0, 1), +(140724, 140700, '昔阳县', '昔阳', '113.70617', '37.60437', 3, 0, 1), +(140725, 140700, '寿阳县', '寿阳', '113.17771', '37.891136', 3, 0, 1), +(140727, 140700, '祁县', '祁县', '112.33053', '37.358738', 3, 0, 1), +(140728, 140700, '平遥县', '平遥', '112.17406', '37.195473', 3, 0, 1), +(140729, 140700, '灵石县', '灵石', '111.77276', '36.84747', 3, 0, 1), +(140781, 140700, '介休市', '介休', '111.91386', '37.027615', 3, 0, 1), +(140800, 140000, '运城市', '运城', '111.00396', '35.022778', 2, 0, 1), +(140802, 140800, '盐湖区', '盐湖', '111.000626', '35.025642', 3, 0, 1), +(140821, 140800, '临猗县', '临猗', '110.77493', '35.141884', 3, 0, 1), +(140822, 140800, '万荣县', '万荣', '110.84356', '35.41704', 3, 0, 1), +(140823, 140800, '闻喜县', '闻喜', '111.22031', '35.35384', 3, 0, 1), +(140824, 140800, '稷山县', '稷山', '110.979', '35.60041', 3, 0, 1), +(140825, 140800, '新绛县', '新绛', '111.225204', '35.613697', 3, 0, 1), +(140826, 140800, '绛县', '绛县', '111.57618', '35.49045', 3, 0, 1), +(140827, 140800, '垣曲县', '垣曲', '111.67099', '35.298294', 3, 0, 1), +(140828, 140800, '夏县', '夏县', '111.223175', '35.14044', 3, 0, 1), +(140829, 140800, '平陆县', '平陆', '111.21238', '34.837257', 3, 0, 1), +(140830, 140800, '芮城县', '芮城', '110.69114', '34.69477', 3, 0, 1), +(140881, 140800, '永济市', '永济', '110.44798', '34.865124', 3, 0, 1), +(140882, 140800, '河津市', '河津', '110.710266', '35.59715', 3, 0, 1), +(140900, 140000, '忻州市', '忻州', '112.733536', '38.41769', 2, 0, 1), +(140902, 140900, '忻府区', '忻府', '112.734116', '38.417744', 3, 0, 1), +(140921, 140900, '定襄县', '定襄', '112.963234', '38.484947', 3, 0, 1), +(140922, 140900, '五台县', '五台', '113.25901', '38.72571', 3, 0, 1), +(140923, 140900, '代县', '代县', '112.96252', '39.06514', 3, 0, 1), +(140924, 140900, '繁峙县', '繁峙', '113.26771', '39.188103', 3, 0, 1), +(140925, 140900, '宁武县', '宁武', '112.30794', '39.001717', 3, 0, 1), +(140926, 140900, '静乐县', '静乐', '111.94023', '38.355946', 3, 0, 1), +(140927, 140900, '神池县', '神池', '112.20044', '39.088467', 3, 0, 1), +(140928, 140900, '五寨县', '五寨', '111.84102', '38.91276', 3, 0, 1), +(140929, 140900, '岢岚县', '岢岚', '111.56981', '38.705624', 3, 0, 1), +(140930, 140900, '河曲县', '河曲', '111.14661', '39.381893', 3, 0, 1), +(140931, 140900, '保德县', '保德', '111.085686', '39.022575', 3, 0, 1), +(140932, 140900, '偏关县', '偏关', '111.50048', '39.442154', 3, 0, 1), +(140981, 140900, '原平市', '原平', '112.713135', '38.729187', 3, 0, 1), +(141000, 140000, '临汾市', '临汾', '111.517975', '36.08415', 2, 0, 1), +(141002, 141000, '尧都区', '尧都', '111.52294', '36.080364', 3, 0, 1), +(141021, 141000, '曲沃县', '曲沃', '111.47553', '35.641388', 3, 0, 1), +(141022, 141000, '翼城县', '翼城', '111.71351', '35.73862', 3, 0, 1), +(141023, 141000, '襄汾县', '襄汾', '111.44293', '35.87614', 3, 0, 1), +(141024, 141000, '洪洞县', '洪洞', '111.67369', '36.25574', 3, 0, 1), +(141025, 141000, '古县', '古县', '111.920204', '36.26855', 3, 0, 1), +(141026, 141000, '安泽县', '安泽', '112.25137', '36.14603', 3, 0, 1), +(141027, 141000, '浮山县', '浮山', '111.85004', '35.97136', 3, 0, 1), +(141028, 141000, '吉县', '吉县', '110.68285', '36.099354', 3, 0, 1), +(141029, 141000, '乡宁县', '乡宁', '110.85737', '35.975403', 3, 0, 1), +(141030, 141000, '大宁县', '大宁', '110.75128', '36.46383', 3, 0, 1), +(141031, 141000, '隰县', '隰县', '110.93581', '36.692677', 3, 0, 1), +(141032, 141000, '永和县', '永和', '110.63128', '36.760612', 3, 0, 1), +(141033, 141000, '蒲县', '蒲县', '111.09733', '36.411682', 3, 0, 1), +(141034, 141000, '汾西县', '汾西', '111.56302', '36.65337', 3, 0, 1), +(141081, 141000, '侯马市', '侯马', '111.37127', '35.6203', 3, 0, 1), +(141082, 141000, '霍州市', '霍州', '111.72311', '36.57202', 3, 0, 1), +(141100, 140000, '吕梁市', '吕梁', '111.13434', '37.524364', 2, 0, 1), +(141102, 141100, '离石区', '离石', '111.13446', '37.524036', 3, 0, 1), +(141121, 141100, '文水县', '文水', '112.03259', '37.436314', 3, 0, 1), +(141122, 141100, '交城县', '交城', '112.15916', '37.555157', 3, 0, 1), +(141123, 141100, '兴县', '兴县', '111.12482', '38.464134', 3, 0, 1), +(141124, 141100, '临县', '临县', '110.995964', '37.960808', 3, 0, 1), +(141125, 141100, '柳林县', '柳林', '110.89613', '37.431664', 3, 0, 1), +(141126, 141100, '石楼县', '石楼', '110.83712', '36.999428', 3, 0, 1), +(141127, 141100, '岚县', '岚县', '111.671555', '38.278652', 3, 0, 1), +(141128, 141100, '方山县', '方山', '111.238884', '37.89263', 3, 0, 1), +(141129, 141100, '中阳县', '中阳', '111.19332', '37.342052', 3, 0, 1), +(141130, 141100, '交口县', '交口', '111.18319', '36.983067', 3, 0, 1), +(141181, 141100, '孝义市', '孝义', '111.78157', '37.144474', 3, 0, 1), +(141182, 141100, '汾阳市', '汾阳', '111.78527', '37.267742', 3, 0, 1), +(150000, 0, '内蒙古自治区', '内蒙古', '111.6708', '40.81831', 1, 0, 1), +(150100, 150000, '呼和浩特市', '呼和浩特', '111.6708', '40.81831', 2, 0, 1), +(150102, 150100, '新城区', '新城', '111.68597', '40.826225', 3, 0, 1), +(150103, 150100, '回民区', '回民', '111.66216', '40.815147', 3, 0, 1), +(150104, 150100, '玉泉区', '玉泉', '111.66543', '40.79942', 3, 0, 1), +(150105, 150100, '赛罕区', '赛罕', '111.69846', '40.807835', 3, 0, 1), +(150121, 150100, '土默特左旗', '土默特左', '111.13361', '40.720417', 3, 0, 1), +(150122, 150100, '托克托县', '托克托', '111.19732', '40.27673', 3, 0, 1), +(150123, 150100, '和林格尔县', '和林格尔', '111.82414', '40.380287', 3, 0, 1), +(150124, 150100, '清水河县', '清水河', '111.67222', '39.91248', 3, 0, 1), +(150125, 150100, '武川县', '武川', '111.456566', '41.094482', 3, 0, 1), +(150200, 150000, '包头市', '包头', '109.84041', '40.65817', 2, 0, 1), +(150202, 150200, '东河区', '东河', '110.02689', '40.587055', 3, 0, 1), +(150203, 150200, '昆都仑区', '昆都仑', '109.82293', '40.661346', 3, 0, 1), +(150204, 150200, '青山区', '青山', '109.88005', '40.668556', 3, 0, 1), +(150205, 150200, '石拐区', '石拐', '110.27257', '40.672092', 3, 0, 1), +(150206, 150200, '白云鄂博矿区', '白云矿区', '109.97016', '41.769245', 3, 0, 1), +(150207, 150200, '九原区', '九原', '109.968124', '40.600582', 3, 0, 1), +(150221, 150200, '土默特右旗', '土默特右', '110.526764', '40.566433', 3, 0, 1), +(150222, 150200, '固阳县', '固阳', '110.06342', '41.030003', 3, 0, 1), +(150223, 150200, '达尔罕茂明安联合旗', '达尔罕茂明安联合', '109.84041', '40.65817', 3, 0, 1), +(150300, 150000, '乌海市', '乌海', '106.82556', '39.673733', 2, 0, 1), +(150302, 150300, '海勃湾区', '海勃湾', '106.817764', '39.673527', 3, 0, 1), +(150303, 150300, '海南区', '海南', '106.88479', '39.44153', 3, 0, 1), +(150304, 150300, '乌达区', '乌达', '106.72271', '39.50229', 3, 0, 1), +(150400, 150000, '赤峰市', '赤峰', '118.9568', '42.27532', 2, 0, 1), +(150402, 150400, '红山区', '红山', '118.96109', '42.269733', 3, 0, 1), +(150403, 150400, '元宝山区', '元宝山', '119.28988', '42.04117', 3, 0, 1), +(150404, 150400, '松山区', '松山', '118.93896', '42.281048', 3, 0, 1), +(150421, 150400, '阿鲁科尔沁旗', '阿鲁科尔沁', '120.09497', '43.87877', 3, 0, 1), +(150422, 150400, '巴林左旗', '巴林左', '119.39174', '43.980717', 3, 0, 1), +(150423, 150400, '巴林右旗', '巴林右', '118.678345', '43.52896', 3, 0, 1), +(150424, 150400, '林西县', '林西', '118.05775', '43.605328', 3, 0, 1), +(150425, 150400, '克什克腾旗', '克什克腾', '117.542465', '43.256233', 3, 0, 1), +(150426, 150400, '翁牛特旗', '翁牛特', '119.02262', '42.937126', 3, 0, 1), +(150428, 150400, '喀喇沁旗', '喀喇沁', '118.70857', '41.92778', 3, 0, 1), +(150429, 150400, '宁城县', '宁城', '119.33924', '41.598694', 3, 0, 1), +(150430, 150400, '敖汉旗', '敖汉', '119.90649', '42.28701', 3, 0, 1), +(150500, 150000, '通辽市', '通辽', '122.26312', '43.617428', 2, 0, 1), +(150502, 150500, '科尔沁区', '科尔沁', '122.264046', '43.61742', 3, 0, 1), +(150521, 150500, '科尔沁左翼中旗', '科尔沁左翼中', '123.31387', '44.127167', 3, 0, 1), +(150522, 150500, '科尔沁左翼后旗', '科尔沁左翼后', '122.355156', '42.954563', 3, 0, 1), +(150523, 150500, '开鲁县', '开鲁', '121.3088', '43.602432', 3, 0, 1), +(150524, 150500, '库伦旗', '库伦', '121.77489', '42.73469', 3, 0, 1), +(150525, 150500, '奈曼旗', '奈曼', '120.662544', '42.84685', 3, 0, 1), +(150526, 150500, '扎鲁特旗', '扎鲁特', '120.90527', '44.555294', 3, 0, 1), +(150581, 150500, '霍林郭勒市', '霍林郭勒', '119.65786', '45.53236', 3, 0, 1), +(150600, 150000, '鄂尔多斯市', '鄂尔多斯', '109.99029', '39.81718', 2, 0, 1), +(150602, 150600, '东胜区', '东胜', '109.98945', '39.81788', 3, 0, 1), +(150603, 150600, '康巴什区', '康巴什', '109.85851', '39.60837', 3, 0, 1), +(150621, 150600, '达拉特旗', '达拉特', '110.04028', '40.404076', 3, 0, 1), +(150622, 150600, '准格尔旗', '准格尔', '111.238335', '39.86522', 3, 0, 1), +(150623, 150600, '鄂托克前旗', '鄂托克前', '107.48172', '38.183258', 3, 0, 1), +(150624, 150600, '鄂托克旗', '鄂托克', '107.982605', '39.095753', 3, 0, 1), +(150625, 150600, '杭锦旗', '杭锦', '108.73632', '39.831787', 3, 0, 1), +(150626, 150600, '乌审旗', '乌审', '108.84245', '38.59661', 3, 0, 1), +(150627, 150600, '伊金霍洛旗', '伊金霍洛', '109.7874', '39.604313', 3, 0, 1), +(150700, 150000, '呼伦贝尔市', '呼伦贝尔', '119.75817', '49.215332', 2, 0, 1), +(150702, 150700, '海拉尔区', '海拉尔', '119.76492', '49.21389', 3, 0, 1), +(150703, 150700, '扎赉诺尔区', '扎赉诺尔', '117.7927', '49.486942', 3, 0, 1), +(150721, 150700, '阿荣旗', '阿荣', '123.464615', '48.130505', 3, 0, 1), +(150722, 150700, '莫力达瓦达斡尔族自治旗', '莫力达瓦', '124.5074', '48.478386', 3, 0, 1), +(150723, 150700, '鄂伦春自治旗', '鄂伦春', '123.725685', '50.590176', 3, 0, 1), +(150724, 150700, '鄂温克族自治旗', '鄂温克', '119.75404', '49.14329', 3, 0, 1), +(150725, 150700, '陈巴尔虎旗', '陈巴尔虎', '119.43761', '49.328423', 3, 0, 1), +(150726, 150700, '新巴尔虎左旗', '新巴尔虎左', '118.267456', '48.21657', 3, 0, 1), +(150727, 150700, '新巴尔虎右旗', '新巴尔虎右', '116.82599', '48.669132', 3, 0, 1), +(150781, 150700, '满洲里市', '满洲里', '117.45556', '49.59079', 3, 0, 1), +(150782, 150700, '牙克石市', '牙克石', '120.729004', '49.287025', 3, 0, 1), +(150783, 150700, '扎兰屯市', '扎兰屯', '122.7444', '48.007412', 3, 0, 1), +(150784, 150700, '额尔古纳市', '额尔古纳', '120.178635', '50.2439', 3, 0, 1), +(150785, 150700, '根河市', '根河', '121.53272', '50.780453', 3, 0, 1), +(150800, 150000, '巴彦淖尔市', '巴彦淖尔', '107.41696', '40.7574', 2, 0, 1), +(150802, 150800, '临河区', '临河', '107.417015', '40.75709', 3, 0, 1), +(150821, 150800, '五原县', '五原', '108.27066', '41.097637', 3, 0, 1), +(150822, 150800, '磴口县', '磴口', '107.00606', '40.33048', 3, 0, 1), +(150823, 150800, '乌拉特前旗', '乌拉特前', '108.656815', '40.72521', 3, 0, 1), +(150824, 150800, '乌拉特中旗', '乌拉特中', '108.51526', '41.57254', 3, 0, 1), +(150825, 150800, '乌拉特后旗', '乌拉特后', '107.07494', '41.08431', 3, 0, 1), +(150826, 150800, '杭锦后旗', '杭锦后', '107.14768', '40.888798', 3, 0, 1), +(150900, 150000, '乌兰察布市', '乌兰察布', '113.11454', '41.034126', 2, 0, 1), +(150902, 150900, '集宁区', '集宁', '113.116455', '41.034134', 3, 0, 1), +(150921, 150900, '卓资县', '卓资', '112.577705', '40.89576', 3, 0, 1), +(150922, 150900, '化德县', '化德', '114.01008', '41.899334', 3, 0, 1), +(150923, 150900, '商都县', '商都', '113.560646', '41.56016', 3, 0, 1), +(150924, 150900, '兴和县', '兴和', '113.83401', '40.872437', 3, 0, 1), +(150925, 150900, '凉城县', '凉城', '112.50091', '40.531628', 3, 0, 1), +(150926, 150900, '察哈尔右翼前旗', '察哈尔右翼前', '113.21196', '40.786858', 3, 0, 1), +(150927, 150900, '察哈尔右翼中旗', '察哈尔右翼中', '112.63356', '41.27421', 3, 0, 1), +(150928, 150900, '察哈尔右翼后旗', '察哈尔右翼后', '113.1906', '41.447212', 3, 0, 1), +(150929, 150900, '四子王旗', '四子王', '111.70123', '41.528114', 3, 0, 1), +(150981, 150900, '丰镇市', '丰镇', '113.16346', '40.437534', 3, 0, 1), +(152200, 150000, '兴安盟', '兴安', '122.07032', '46.076267', 2, 0, 1), +(152201, 152200, '乌兰浩特市', '乌兰浩特', '122.06898', '46.077236', 3, 0, 1), +(152202, 152200, '阿尔山市', '阿尔山', '119.94366', '47.177', 3, 0, 1), +(152221, 152200, '科尔沁右翼前旗', '科尔沁右翼前', '121.95754', '46.076496', 3, 0, 1), +(152222, 152200, '科尔沁右翼中旗', '科尔沁右翼中', '121.47282', '45.059647', 3, 0, 1), +(152223, 152200, '扎赉特旗', '扎赉特', '122.90933', '46.725136', 3, 0, 1), +(152224, 152200, '突泉县', '突泉', '121.56486', '45.380985', 3, 0, 1), +(152500, 150000, '锡林郭勒盟', '锡林郭勒', '116.090996', '43.94402', 2, 0, 1), +(152501, 152500, '二连浩特市', '二连浩特', '111.97981', '43.652897', 3, 0, 1), +(152502, 152500, '锡林浩特市', '锡林浩特', '116.0919', '43.9443', 3, 0, 1), +(152522, 152500, '阿巴嘎旗', '阿巴嘎', '114.97062', '44.022728', 3, 0, 1), +(152523, 152500, '苏尼特左旗', '苏尼特左', '113.65341', '43.854107', 3, 0, 1), +(152524, 152500, '苏尼特右旗', '苏尼特右', '112.65539', '42.746662', 3, 0, 1), +(152525, 152500, '东乌珠穆沁旗', '东乌珠穆沁', '116.98002', '45.510307', 3, 0, 1), +(152526, 152500, '西乌珠穆沁旗', '西乌珠穆沁', '117.61525', '44.586147', 3, 0, 1), +(152527, 152500, '太仆寺旗', '太仆寺', '115.28728', '41.8952', 3, 0, 1), +(152528, 152500, '镶黄旗', '镶黄', '113.84387', '42.239227', 3, 0, 1), +(152529, 152500, '正镶白旗', '正镶白', '115.031425', '42.286808', 3, 0, 1), +(152530, 152500, '正蓝旗', '正蓝', '116.00331', '42.245895', 3, 0, 1), +(152531, 152500, '多伦县', '多伦', '116.47729', '42.197964', 3, 0, 1), +(152900, 150000, '阿拉善盟', '阿拉善', '105.70642', '38.844814', 2, 0, 1), +(152921, 152900, '阿拉善左旗', '阿拉善左', '105.70192', '38.84724', 3, 0, 1), +(152922, 152900, '阿拉善右旗', '阿拉善右', '101.67198', '39.21159', 3, 0, 1), +(152923, 152900, '额济纳旗', '额济纳', '101.06944', '41.958813', 3, 0, 1), +(210000, 0, '辽宁省', '辽宁', '123.42909', '41.79677', 1, 0, 1), +(210100, 210000, '沈阳市', '沈阳', '123.42909', '41.79677', 2, 0, 1), +(210102, 210100, '和平区', '和平', '123.40666', '41.788074', 3, 0, 1), +(210103, 210100, '沈河区', '沈河', '123.445694', '41.79559', 3, 0, 1), +(210104, 210100, '大东区', '大东', '123.469955', '41.808502', 3, 0, 1), +(210105, 210100, '皇姑区', '皇姑', '123.40568', '41.822334', 3, 0, 1), +(210106, 210100, '铁西区', '铁西', '123.35066', '41.787807', 3, 0, 1), +(210111, 210100, '苏家屯区', '苏家屯', '123.341606', '41.665905', 3, 0, 1), +(210112, 210100, '浑南区', '东陵', '123.458984', '41.741947', 3, 0, 1), +(210113, 210100, '沈北新区', '沈北新', '123.58424', '41.91303', 3, 0, 1), +(210114, 210100, '于洪区', '于洪', '123.31083', '41.795834', 3, 0, 1), +(210115, 210100, '辽中区', '辽中', '122.76549', '41.51685', 3, 0, 1), +(210123, 210100, '康平县', '康平', '123.3527', '42.74153', 3, 0, 1), +(210124, 210100, '法库县', '法库', '123.416725', '42.507046', 3, 0, 1), +(210181, 210100, '新民市', '新民', '122.828865', '41.99651', 3, 0, 1), +(210200, 210000, '大连市', '大连', '121.61862', '38.91459', 2, 0, 1), +(210202, 210200, '中山区', '中山', '121.64376', '38.921555', 3, 0, 1), +(210203, 210200, '西岗区', '西岗', '121.61611', '38.914265', 3, 0, 1), +(210204, 210200, '沙河口区', '沙河口', '121.593704', '38.91286', 3, 0, 1), +(210211, 210200, '甘井子区', '甘井子', '121.58261', '38.975147', 3, 0, 1), +(210212, 210200, '旅顺口区', '旅顺口', '121.26713', '38.812042', 3, 0, 1), +(210213, 210200, '金州区', '金州', '121.78941', '39.052746', 3, 0, 1), +(210214, 210200, '普兰店区', '普兰店', '121.96323', '39.39443', 3, 0, 1), +(210224, 210200, '长海县', '长海', '122.58782', '39.2724', 3, 0, 1), +(210281, 210200, '瓦房店市', '瓦房店', '122.002655', '39.63065', 3, 0, 1), +(210283, 210200, '庄河市', '庄河', '122.97061', '39.69829', 3, 0, 1), +(210300, 210000, '鞍山市', '鞍山', '122.99563', '41.110626', 2, 0, 1), +(210302, 210300, '铁东区', '铁东', '122.99448', '41.110344', 3, 0, 1), +(210303, 210300, '铁西区', '铁西', '122.97183', '41.11069', 3, 0, 1), +(210304, 210300, '立山区', '立山', '123.0248', '41.150623', 3, 0, 1), +(210311, 210300, '千山区', '千山', '122.95788', '41.07072', 3, 0, 1), +(210321, 210300, '台安县', '台安', '122.42973', '41.38686', 3, 0, 1), +(210323, 210300, '岫岩满族自治县', '岫岩', '123.28833', '40.28151', 3, 0, 1), +(210381, 210300, '海城市', '海城', '122.7522', '40.85253', 3, 0, 1), +(210400, 210000, '抚顺市', '抚顺', '123.92111', '41.875957', 2, 0, 1), +(210402, 210400, '新抚区', '新抚', '123.902855', '41.86082', 3, 0, 1), +(210403, 210400, '东洲区', '东洲', '124.04722', '41.86683', 3, 0, 1), +(210404, 210400, '望花区', '望花', '123.801506', '41.851803', 3, 0, 1), +(210411, 210400, '顺城区', '顺城', '123.91717', '41.88113', 3, 0, 1), +(210421, 210400, '抚顺县', '抚顺', '124.09798', '41.922646', 3, 0, 1), +(210422, 210400, '新宾满族自治县', '新宾', '125.037544', '41.732456', 3, 0, 1), +(210423, 210400, '清原满族自治县', '清原', '124.92719', '42.10135', 3, 0, 1), +(210500, 210000, '本溪市', '本溪', '123.770515', '41.29791', 2, 0, 1), +(210502, 210500, '平山区', '平山', '123.76123', '41.29158', 3, 0, 1), +(210503, 210500, '溪湖区', '溪湖', '123.76523', '41.330055', 3, 0, 1), +(210504, 210500, '明山区', '明山', '123.76329', '41.30243', 3, 0, 1), +(210505, 210500, '南芬区', '南芬', '123.74838', '41.10409', 3, 0, 1), +(210521, 210500, '本溪满族自治县', '本溪', '124.12616', '41.300343', 3, 0, 1), +(210522, 210500, '桓仁满族自治县', '桓仁', '125.35919', '41.268997', 3, 0, 1), +(210600, 210000, '丹东市', '丹东', '124.38304', '40.124294', 2, 0, 1), +(210602, 210600, '元宝区', '元宝', '124.39781', '40.136482', 3, 0, 1), +(210603, 210600, '振兴区', '振兴', '124.36115', '40.102802', 3, 0, 1), +(210604, 210600, '振安区', '振安', '124.42771', '40.158558', 3, 0, 1), +(210624, 210600, '宽甸满族自治县', '宽甸', '124.78487', '40.73041', 3, 0, 1), +(210681, 210600, '东港市', '东港', '124.14944', '39.88347', 3, 0, 1), +(210682, 210600, '凤城市', '凤城', '124.07107', '40.457565', 3, 0, 1), +(210700, 210000, '锦州市', '锦州', '121.13574', '41.11927', 2, 0, 1), +(210702, 210700, '古塔区', '古塔', '121.13009', '41.11572', 3, 0, 1), +(210703, 210700, '凌河区', '凌河', '121.151306', '41.114662', 3, 0, 1), +(210711, 210700, '太和区', '太和', '121.1073', '41.105377', 3, 0, 1), +(210726, 210700, '黑山县', '黑山', '122.11791', '41.691803', 3, 0, 1), +(210727, 210700, '义县', '义县', '121.24283', '41.537224', 3, 0, 1), +(210781, 210700, '凌海市', '凌海', '121.364235', '41.171738', 3, 0, 1), +(210782, 210700, '北镇市', '北镇', '121.79596', '41.598763', 3, 0, 1), +(210800, 210000, '营口市', '营口', '122.23515', '40.66743', 2, 0, 1), +(210802, 210800, '站前区', '站前', '122.253235', '40.66995', 3, 0, 1), +(210803, 210800, '西市区', '西市', '122.21007', '40.663086', 3, 0, 1), +(210804, 210800, '鲅鱼圈区', '鲅鱼圈', '122.12724', '40.263645', 3, 0, 1), +(210811, 210800, '老边区', '老边', '122.38258', '40.682724', 3, 0, 1), +(210881, 210800, '盖州市', '盖州', '122.35554', '40.405235', 3, 0, 1), +(210882, 210800, '大石桥市', '大石桥', '122.5059', '40.633972', 3, 0, 1), +(210900, 210000, '阜新市', '阜新', '121.648964', '42.011795', 2, 0, 1), +(210902, 210900, '海州区', '海州', '121.65764', '42.01116', 3, 0, 1), +(210903, 210900, '新邱区', '新邱', '121.79054', '42.0866', 3, 0, 1), +(210904, 210900, '太平区', '太平', '121.677574', '42.011147', 3, 0, 1), +(210905, 210900, '清河门区', '清河门', '121.42018', '41.780476', 3, 0, 1), +(210911, 210900, '细河区', '细河', '121.65479', '42.01922', 3, 0, 1), +(210921, 210900, '阜新蒙古族自治县', '阜新', '121.743126', '42.058605', 3, 0, 1), +(210922, 210900, '彰武县', '彰武', '122.537445', '42.384823', 3, 0, 1), +(211000, 210000, '辽阳市', '辽阳', '123.18152', '41.2694', 2, 0, 1), +(211002, 211000, '白塔区', '白塔', '123.17261', '41.26745', 3, 0, 1), +(211003, 211000, '文圣区', '文圣', '123.188225', '41.266766', 3, 0, 1), +(211004, 211000, '宏伟区', '宏伟', '123.20046', '41.205746', 3, 0, 1), +(211005, 211000, '弓长岭区', '弓长岭', '123.43163', '41.15783', 3, 0, 1), +(211011, 211000, '太子河区', '太子河', '123.18533', '41.251682', 3, 0, 1), +(211021, 211000, '辽阳县', '辽阳', '123.07967', '41.21648', 3, 0, 1), +(211081, 211000, '灯塔市', '灯塔', '123.32587', '41.427837', 3, 0, 1), +(211100, 210000, '盘锦市', '盘锦', '122.06957', '41.124485', 2, 0, 1), +(211102, 211100, '双台子区', '双台子', '122.05573', '41.190365', 3, 0, 1), +(211103, 211100, '兴隆台区', '兴隆台', '122.071625', '41.12242', 3, 0, 1), +(211104, 211100, '大洼区', '大洼', '122.08245', '41.00247', 3, 0, 1), +(211122, 211100, '盘山县', '盘山', '121.98528', '41.2407', 3, 0, 1), +(211200, 210000, '铁岭市', '铁岭', '123.84428', '42.290585', 2, 0, 1), +(211202, 211200, '银州区', '银州', '123.84488', '42.29228', 3, 0, 1), +(211204, 211200, '清河区', '清河', '124.14896', '42.542976', 3, 0, 1), +(211221, 211200, '铁岭县', '铁岭', '123.72567', '42.223316', 3, 0, 1), +(211223, 211200, '西丰县', '西丰', '124.72332', '42.73809', 3, 0, 1), +(211224, 211200, '昌图县', '昌图', '124.11017', '42.784443', 3, 0, 1), +(211281, 211200, '调兵山市', '调兵山', '123.545364', '42.450733', 3, 0, 1), +(211282, 211200, '开原市', '开原', '124.04555', '42.54214', 3, 0, 1), +(211300, 210000, '朝阳市', '朝阳', '120.45118', '41.57676', 2, 0, 1), +(211302, 211300, '双塔区', '双塔', '120.44877', '41.579388', 3, 0, 1), +(211303, 211300, '龙城区', '龙城', '120.413376', '41.576748', 3, 0, 1), +(211321, 211300, '朝阳县', '朝阳', '120.40422', '41.52634', 3, 0, 1), +(211322, 211300, '建平县', '建平', '119.642365', '41.402576', 3, 0, 1), +(211324, 211300, '喀喇沁左翼蒙古族自治县', '喀左', '119.74488', '41.125427', 3, 0, 1), +(211381, 211300, '北票市', '北票', '120.76695', '41.803288', 3, 0, 1), +(211382, 211300, '凌源市', '凌源', '119.40479', '41.243088', 3, 0, 1), +(211400, 210000, '葫芦岛市', '葫芦岛', '120.85639', '40.755573', 2, 0, 1), +(211402, 211400, '连山区', '连山', '120.85937', '40.755142', 3, 0, 1), +(211403, 211400, '龙港区', '龙港', '120.83857', '40.70999', 3, 0, 1), +(211404, 211400, '南票区', '南票', '120.75231', '41.098812', 3, 0, 1), +(211421, 211400, '绥中县', '绥中', '120.34211', '40.328407', 3, 0, 1), +(211422, 211400, '建昌县', '建昌', '119.80778', '40.81287', 3, 0, 1), +(211481, 211400, '兴城市', '兴城', '120.72936', '40.61941', 3, 0, 1), +(220000, 0, '吉林省', '吉林', '125.3245', '43.88684', 1, 0, 1), +(220100, 220000, '长春市', '长春', '125.3245', '43.88684', 2, 0, 1), +(220102, 220100, '南关区', '南关', '125.337234', '43.890236', 3, 0, 1), +(220103, 220100, '宽城区', '宽城', '125.34283', '43.903824', 3, 0, 1), +(220104, 220100, '朝阳区', '朝阳', '125.31804', '43.86491', 3, 0, 1), +(220105, 220100, '二道区', '二道', '125.38473', '43.870823', 3, 0, 1), +(220106, 220100, '绿园区', '绿园', '125.27247', '43.892178', 3, 0, 1), +(220112, 220100, '双阳区', '双阳', '125.65902', '43.52517', 3, 0, 1), +(220113, 220100, '九台区', '九台', '125.83949', '44.15174', 3, 0, 1), +(220122, 220100, '农安县', '农安', '125.175285', '44.43126', 3, 0, 1), +(220182, 220100, '榆树市', '榆树', '126.55011', '44.82764', 3, 0, 1), +(220183, 220100, '德惠市', '德惠', '125.70332', '44.53391', 3, 0, 1), +(220184, 220100, '公主岭市', '公主岭', '', '', 3, 0, 1), +(220200, 220000, '吉林市', '吉林', '126.55302', '43.84358', 2, 0, 1), +(220202, 220200, '昌邑区', '昌邑', '126.57076', '43.851116', 3, 0, 1), +(220203, 220200, '龙潭区', '龙潭', '126.56143', '43.909756', 3, 0, 1), +(220204, 220200, '船营区', '船营', '126.55239', '43.843803', 3, 0, 1), +(220211, 220200, '丰满区', '丰满', '126.56076', '43.816593', 3, 0, 1), +(220221, 220200, '永吉县', '永吉', '126.501625', '43.667416', 3, 0, 1), +(220281, 220200, '蛟河市', '蛟河', '127.342735', '43.720577', 3, 0, 1), +(220282, 220200, '桦甸市', '桦甸', '126.745445', '42.97209', 3, 0, 1), +(220283, 220200, '舒兰市', '舒兰', '126.947815', '44.410908', 3, 0, 1), +(220284, 220200, '磐石市', '磐石', '126.05993', '42.942474', 3, 0, 1), +(220300, 220000, '四平市', '四平', '124.37079', '43.170345', 2, 0, 1), +(220302, 220300, '铁西区', '铁西', '124.36089', '43.17626', 3, 0, 1), +(220303, 220300, '铁东区', '铁东', '124.388466', '43.16726', 3, 0, 1), +(220322, 220300, '梨树县', '梨树', '124.3358', '43.30831', 3, 0, 1), +(220323, 220300, '伊通满族自治县', '伊通', '125.30312', '43.345463', 3, 0, 1), +(220382, 220300, '双辽市', '双辽', '123.50528', '43.518276', 3, 0, 1), +(220400, 220000, '辽源市', '辽源', '125.14535', '42.90269', 2, 0, 1), +(220402, 220400, '龙山区', '龙山', '125.145164', '42.902702', 3, 0, 1), +(220403, 220400, '西安区', '西安', '125.15142', '42.920414', 3, 0, 1), +(220421, 220400, '东丰县', '东丰', '125.529625', '42.67523', 3, 0, 1), +(220422, 220400, '东辽县', '东辽', '124.992', '42.927723', 3, 0, 1), +(220500, 220000, '通化市', '通化', '125.9365', '41.721176', 2, 0, 1), +(220502, 220500, '东昌区', '东昌', '125.936714', '41.721233', 3, 0, 1), +(220503, 220500, '二道江区', '二道江', '126.04599', '41.777565', 3, 0, 1), +(220521, 220500, '通化县', '通化', '125.75312', '41.677917', 3, 0, 1), +(220523, 220500, '辉南县', '辉南', '126.04282', '42.68346', 3, 0, 1), +(220524, 220500, '柳河县', '柳河', '125.74054', '42.281483', 3, 0, 1), +(220581, 220500, '梅河口市', '梅河口', '125.68734', '42.530003', 3, 0, 1), +(220582, 220500, '集安市', '集安', '126.1862', '41.126274', 3, 0, 1), +(220600, 220000, '白山市', '白山', '126.42784', '41.942505', 2, 0, 1), +(220602, 220600, '浑江区', '浑江', '126.42803', '41.943066', 3, 0, 1), +(220605, 220600, '江源区', '江源', '126.59088', '42.05665', 3, 0, 1), +(220621, 220600, '抚松县', '抚松', '127.273796', '42.33264', 3, 0, 1), +(220622, 220600, '靖宇县', '靖宇', '126.80839', '42.38969', 3, 0, 1), +(220623, 220600, '长白朝鲜族自治县', '长白', '128.20338', '41.41936', 3, 0, 1), +(220681, 220600, '临江市', '临江', '126.9193', '41.810688', 3, 0, 1), +(220700, 220000, '松原市', '松原', '124.82361', '45.118244', 2, 0, 1), +(220702, 220700, '宁江区', '宁江', '124.82785', '45.1765', 3, 0, 1), +(220721, 220700, '前郭尔罗斯蒙古族自治县', '前郭', '124.826805', '45.116287', 3, 0, 1), +(220722, 220700, '长岭县', '长岭', '123.98518', '44.27658', 3, 0, 1), +(220723, 220700, '乾安县', '乾安', '124.02436', '45.006847', 3, 0, 1), +(220781, 220700, '扶余市', '扶余', '126.04972', '44.99014', 3, 0, 1), +(220800, 220000, '白城市', '白城', '122.84111', '45.619026', 2, 0, 1), +(220802, 220800, '洮北区', '洮北', '122.8425', '45.61925', 3, 0, 1), +(220821, 220800, '镇赉县', '镇赉', '123.20225', '45.84609', 3, 0, 1), +(220822, 220800, '通榆县', '通榆', '123.08855', '44.80915', 3, 0, 1), +(220881, 220800, '洮南市', '洮南', '122.783775', '45.33911', 3, 0, 1), +(220882, 220800, '大安市', '大安', '124.29151', '45.50765', 3, 0, 1), +(222400, 220000, '延边朝鲜族自治州', '延边朝鲜族', '129.51323', '42.904823', 2, 0, 1), +(222401, 222400, '延吉市', '延吉', '129.5158', '42.906963', 3, 0, 1), +(222402, 222400, '图们市', '图们', '129.8467', '42.96662', 3, 0, 1), +(222403, 222400, '敦化市', '敦化', '128.22986', '43.36692', 3, 0, 1), +(222404, 222400, '珲春市', '珲春', '130.36578', '42.871056', 3, 0, 1), +(222405, 222400, '龙井市', '龙井', '129.42575', '42.77103', 3, 0, 1), +(222406, 222400, '和龙市', '和龙', '129.00874', '42.547005', 3, 0, 1), +(222424, 222400, '汪清县', '汪清', '129.76616', '43.315426', 3, 0, 1), +(222426, 222400, '安图县', '安图', '128.90187', '43.110992', 3, 0, 1), +(230000, 0, '黑龙江省', '黑龙江', '126.64246', '45.756966', 1, 0, 1), +(230100, 230000, '哈尔滨市', '哈尔滨', '126.64246', '45.756966', 2, 0, 1), +(230102, 230100, '道里区', '道里', '126.61253', '45.762035', 3, 0, 1), +(230103, 230100, '南岗区', '南岗', '126.6521', '45.75597', 3, 0, 1), +(230104, 230100, '道外区', '道外', '126.648834', '45.78454', 3, 0, 1), +(230108, 230100, '平房区', '平房', '126.62926', '45.605568', 3, 0, 1), +(230109, 230100, '松北区', '松北', '126.563065', '45.814655', 3, 0, 1), +(230110, 230100, '香坊区', '香坊', '126.66287', '45.70847', 3, 0, 1), +(230111, 230100, '呼兰区', '呼兰', '126.6033', '45.98423', 3, 0, 1), +(230112, 230100, '阿城区', '阿城', '126.95717', '45.54774', 3, 0, 1), +(230113, 230100, '双城区', '双城', '126.31227', '45.38355', 3, 0, 1), +(230123, 230100, '依兰县', '依兰', '129.5656', '46.315105', 3, 0, 1), +(230124, 230100, '方正县', '方正', '128.83614', '45.839535', 3, 0, 1), +(230125, 230100, '宾县', '宾县', '127.48594', '45.75937', 3, 0, 1), +(230126, 230100, '巴彦县', '巴彦', '127.4036', '46.08189', 3, 0, 1), +(230127, 230100, '木兰县', '木兰', '128.04268', '45.949825', 3, 0, 1), +(230128, 230100, '通河县', '通河', '128.74779', '45.97762', 3, 0, 1), +(230129, 230100, '延寿县', '延寿', '128.33188', '45.455647', 3, 0, 1), +(230183, 230100, '尚志市', '尚志', '127.96854', '45.214954', 3, 0, 1), +(230184, 230100, '五常市', '五常', '127.15759', '44.91942', 3, 0, 1), +(230200, 230000, '齐齐哈尔市', '齐齐哈尔', '123.95792', '47.34208', 2, 0, 1), +(230202, 230200, '龙沙区', '龙沙', '123.95734', '47.341736', 3, 0, 1), +(230203, 230200, '建华区', '建华', '123.95589', '47.354492', 3, 0, 1), +(230204, 230200, '铁锋区', '铁锋', '123.97356', '47.3395', 3, 0, 1), +(230205, 230200, '昂昂溪区', '昂昂溪', '123.81318', '47.156868', 3, 0, 1), +(230206, 230200, '富拉尔基区', '富拉尔基', '123.63887', '47.20697', 3, 0, 1), +(230207, 230200, '碾子山区', '碾子山', '122.88797', '47.51401', 3, 0, 1), +(230208, 230200, '梅里斯达斡尔族区', '梅里斯达斡尔族', '123.7546', '47.31111', 3, 0, 1), +(230221, 230200, '龙江县', '龙江', '123.187225', '47.336388', 3, 0, 1), +(230223, 230200, '依安县', '依安', '125.30756', '47.8901', 3, 0, 1), +(230224, 230200, '泰来县', '泰来', '123.41953', '46.39233', 3, 0, 1), +(230225, 230200, '甘南县', '甘南', '123.506035', '47.91784', 3, 0, 1), +(230227, 230200, '富裕县', '富裕', '124.46911', '47.797173', 3, 0, 1), +(230229, 230200, '克山县', '克山', '125.87435', '48.034344', 3, 0, 1), +(230230, 230200, '克东县', '克东', '126.24909', '48.03732', 3, 0, 1), +(230231, 230200, '拜泉县', '拜泉', '126.09191', '47.607365', 3, 0, 1), +(230281, 230200, '讷河市', '讷河', '124.88217', '48.481133', 3, 0, 1), +(230300, 230000, '鸡西市', '鸡西', '130.97597', '45.300045', 2, 0, 1), +(230302, 230300, '鸡冠区', '鸡冠', '130.97438', '45.30034', 3, 0, 1), +(230303, 230300, '恒山区', '恒山', '130.91063', '45.21324', 3, 0, 1), +(230304, 230300, '滴道区', '滴道', '130.84682', '45.348812', 3, 0, 1), +(230305, 230300, '梨树区', '梨树', '130.69778', '45.092194', 3, 0, 1), +(230306, 230300, '城子河区', '城子河', '131.0105', '45.33825', 3, 0, 1), +(230307, 230300, '麻山区', '麻山', '130.48112', '45.209606', 3, 0, 1), +(230321, 230300, '鸡东县', '鸡东', '131.14891', '45.250893', 3, 0, 1), +(230381, 230300, '虎林市', '虎林', '132.97388', '45.767986', 3, 0, 1), +(230382, 230300, '密山市', '密山', '131.87413', '45.54725', 3, 0, 1), +(230400, 230000, '鹤岗市', '鹤岗', '130.27748', '47.332085', 2, 0, 1), +(230402, 230400, '向阳区', '向阳', '130.29248', '47.34537', 3, 0, 1), +(230403, 230400, '工农区', '工农', '130.27666', '47.331676', 3, 0, 1), +(230404, 230400, '南山区', '南山', '130.27553', '47.31324', 3, 0, 1), +(230405, 230400, '兴安区', '兴安', '130.23618', '47.25291', 3, 0, 1), +(230406, 230400, '东山区', '东山', '130.31714', '47.337383', 3, 0, 1), +(230407, 230400, '兴山区', '兴山', '130.30534', '47.35997', 3, 0, 1), +(230421, 230400, '萝北县', '萝北', '130.82909', '47.577576', 3, 0, 1), +(230422, 230400, '绥滨县', '绥滨', '131.86052', '47.28989', 3, 0, 1), +(230500, 230000, '双鸭山市', '双鸭山', '131.1573', '46.64344', 2, 0, 1), +(230502, 230500, '尖山区', '尖山', '131.15897', '46.64296', 3, 0, 1), +(230503, 230500, '岭东区', '岭东', '131.16368', '46.591076', 3, 0, 1), +(230505, 230500, '四方台区', '四方台', '131.33318', '46.594345', 3, 0, 1), +(230506, 230500, '宝山区', '宝山', '131.4043', '46.573364', 3, 0, 1), +(230521, 230500, '集贤县', '集贤', '131.13933', '46.72898', 3, 0, 1), +(230522, 230500, '友谊县', '友谊', '131.81062', '46.775158', 3, 0, 1), +(230523, 230500, '宝清县', '宝清', '132.20642', '46.32878', 3, 0, 1), +(230524, 230500, '饶河县', '饶河', '134.02116', '46.80129', 3, 0, 1), +(230600, 230000, '大庆市', '大庆', '125.11272', '46.590733', 2, 0, 1), +(230602, 230600, '萨尔图区', '萨尔图', '125.11464', '46.596355', 3, 0, 1), +(230603, 230600, '龙凤区', '龙凤', '125.1458', '46.573948', 3, 0, 1), +(230604, 230600, '让胡路区', '让胡路', '124.86834', '46.653255', 3, 0, 1), +(230605, 230600, '红岗区', '红岗', '124.88953', '46.40305', 3, 0, 1), +(230606, 230600, '大同区', '大同', '124.81851', '46.034306', 3, 0, 1), +(230621, 230600, '肇州县', '肇州', '125.273254', '45.708687', 3, 0, 1), +(230622, 230600, '肇源县', '肇源', '125.08197', '45.518833', 3, 0, 1), +(230623, 230600, '林甸县', '林甸', '124.87774', '47.186413', 3, 0, 1), +(230624, 230600, '杜尔伯特蒙古族自治县', '杜尔伯特', '124.44626', '46.865974', 3, 0, 1), +(230700, 230000, '伊春市', '伊春', '128.8994', '47.724773', 2, 0, 1), +(230717, 230700, '伊美区', '伊美', '128.907302', '47.728208', 3, 0, 1), +(230718, 230700, '乌翠区', '乌翠', '128.66945', '47.726495', 3, 0, 1), +(230719, 230700, '友好区', '友好', '128.84071', '47.8538', 3, 0, 1), +(230722, 230700, '嘉荫县', '嘉荫', '130.39769', '48.891376', 3, 0, 1), +(230723, 230700, '汤旺县', '汤旺', '129.570968', '48.454691', 3, 0, 1), +(230724, 230700, '丰林县', '丰林', '129.53362', '48.29045', 3, 0, 1), +(230725, 230700, '大箐山县', '大箐山', '129.02057', '47.02834', 3, 0, 1), +(230726, 230700, '南岔县', '南岔', '129.28365', '47.13799', 3, 0, 1), +(230751, 230700, '金林区', '金林', '129.42899', '47.41303', 3, 0, 1), +(230781, 230700, '铁力市', '铁力', '128.03056', '46.98577', 3, 0, 1), +(230800, 230000, '佳木斯市', '佳木斯', '130.36163', '46.809605', 2, 0, 1), +(230803, 230800, '向阳区', '向阳', '130.36179', '46.809647', 3, 0, 1), +(230804, 230800, '前进区', '前进', '130.37769', '46.812344', 3, 0, 1), +(230805, 230800, '东风区', '东风', '130.40329', '46.822475', 3, 0, 1), +(230811, 230800, '郊区', '郊区', '130.36163', '46.809605', 3, 0, 1), +(230822, 230800, '桦南县', '桦南', '130.57011', '46.240116', 3, 0, 1), +(230826, 230800, '桦川县', '桦川', '130.72371', '47.02304', 3, 0, 1), +(230828, 230800, '汤原县', '汤原', '129.90446', '46.73005', 3, 0, 1), +(230881, 230800, '同江市', '同江', '132.51012', '47.65113', 3, 0, 1), +(230882, 230800, '富锦市', '富锦', '132.03795', '47.250748', 3, 0, 1), +(230883, 230800, '抚远市', '抚远', '134.30795', '48.36485', 3, 0, 1), +(230900, 230000, '七台河市', '七台河', '131.01558', '45.771267', 2, 0, 1), +(230902, 230900, '新兴区', '新兴', '130.88948', '45.79426', 3, 0, 1), +(230903, 230900, '桃山区', '桃山', '131.01585', '45.771217', 3, 0, 1), +(230904, 230900, '茄子河区', '茄子河', '131.07156', '45.77659', 3, 0, 1), +(230921, 230900, '勃利县', '勃利', '130.57503', '45.75157', 3, 0, 1), +(231000, 230000, '牡丹江市', '牡丹江', '129.6186', '44.582962', 2, 0, 1), +(231002, 231000, '东安区', '东安', '129.62329', '44.582397', 3, 0, 1), +(231003, 231000, '阳明区', '阳明', '129.63464', '44.59633', 3, 0, 1), +(231004, 231000, '爱民区', '爱民', '129.60123', '44.595444', 3, 0, 1), +(231005, 231000, '西安区', '西安', '129.61311', '44.58103', 3, 0, 1), +(231025, 231000, '林口县', '林口', '130.2684', '45.286644', 3, 0, 1), +(231081, 231000, '绥芬河市', '绥芬河', '131.16486', '44.396866', 3, 0, 1), +(231083, 231000, '海林市', '海林', '129.38791', '44.57415', 3, 0, 1), +(231084, 231000, '宁安市', '宁安', '129.47002', '44.346836', 3, 0, 1), +(231085, 231000, '穆棱市', '穆棱', '130.52708', '44.91967', 3, 0, 1), +(231086, 231000, '东宁市', '东宁', '131.12463', '44.08694', 3, 0, 1), +(231100, 230000, '黑河市', '黑河', '127.49902', '50.249584', 2, 0, 1), +(231102, 231100, '爱辉区', '爱辉', '127.49764', '50.249027', 3, 0, 1), +(231123, 231100, '逊克县', '逊克', '128.47615', '49.582973', 3, 0, 1), +(231124, 231100, '孙吴县', '孙吴', '127.32732', '49.423943', 3, 0, 1), +(231181, 231100, '北安市', '北安', '126.508736', '48.245438', 3, 0, 1), +(231182, 231100, '五大连池市', '五大连池', '126.19769', '48.512688', 3, 0, 1), +(231183, 231100, '嫩江市', '嫩江', '125.22094', '49.18572', 3, 0, 1), +(231200, 230000, '绥化市', '绥化', '126.99293', '46.637394', 2, 0, 1), +(231202, 231200, '北林区', '北林', '126.99066', '46.63491', 3, 0, 1), +(231221, 231200, '望奎县', '望奎', '126.48419', '46.83352', 3, 0, 1), +(231222, 231200, '兰西县', '兰西', '126.289314', '46.259037', 3, 0, 1), +(231223, 231200, '青冈县', '青冈', '126.11227', '46.686596', 3, 0, 1), +(231224, 231200, '庆安县', '庆安', '127.510025', '46.879204', 3, 0, 1), +(231225, 231200, '明水县', '明水', '125.90755', '47.18353', 3, 0, 1), +(231226, 231200, '绥棱县', '绥棱', '127.11112', '47.247196', 3, 0, 1), +(231281, 231200, '安达市', '安达', '125.329926', '46.410614', 3, 0, 1), +(231282, 231200, '肇东市', '肇东', '125.9914', '46.06947', 3, 0, 1), +(231283, 231200, '海伦市', '海伦', '126.96938', '47.460426', 3, 0, 1), +(232700, 230000, '大兴安岭地区', '大兴安岭', '124.711525', '52.335262', 2, 0, 1), +(232701, 232700, '漠河市', '漠河', '122.53864', '52.97209', 3, 0, 1), +(232721, 232700, '呼玛县', '呼玛', '126.6621', '51.726997', 3, 0, 1), +(232722, 232700, '塔河县', '塔河', '124.71052', '52.335228', 3, 0, 1), +(310000, 0, '上海市', '上海', '121.47264', '31.231707', 1, 0, 1), +(310100, 310000, '上海市', '上海', '121.47264', '31.231707', 2, 0, 1), +(310101, 310100, '黄浦区', '黄浦', '121.49032', '31.22277', 3, 0, 1), +(310104, 310100, '徐汇区', '徐汇', '121.43752', '31.179974', 3, 0, 1), +(310105, 310100, '长宁区', '长宁', '121.4222', '31.218122', 3, 0, 1), +(310106, 310100, '静安区', '静安', '121.44823', '31.229004', 3, 0, 1), +(310107, 310100, '普陀区', '普陀', '121.3925', '31.241701', 3, 0, 1), +(310109, 310100, '虹口区', '虹口', '121.49183', '31.26097', 3, 0, 1), +(310110, 310100, '杨浦区', '杨浦', '121.5228', '31.270756', 3, 0, 1), +(310112, 310100, '闵行区', '闵行', '121.37597', '31.111658', 3, 0, 1), +(310113, 310100, '宝山区', '宝山', '121.48994', '31.398895', 3, 0, 1), +(310114, 310100, '嘉定区', '嘉定', '121.250336', '31.383524', 3, 0, 1), +(310115, 310100, '浦东新区', '浦东', '121.5677', '31.245943', 3, 0, 1), +(310116, 310100, '金山区', '金山', '121.330734', '30.724697', 3, 0, 1), +(310117, 310100, '松江区', '松江', '121.22354', '31.03047', 3, 0, 1), +(310118, 310100, '青浦区', '青浦', '121.11302', '31.151209', 3, 0, 1), +(310120, 310100, '奉贤区', '奉贤', '121.45847', '30.912346', 3, 0, 1), +(310151, 310100, '崇明区', '崇明', '121.3973', '31.6229', 3, 0, 1), +(320000, 0, '江苏省', '江苏', '118.76741', '32.041546', 1, 0, 1), +(320100, 320000, '南京市', '南京', '118.76741', '32.041546', 2, 0, 1), +(320102, 320100, '玄武区', '玄武', '118.7922', '32.05068', 3, 0, 1), +(320104, 320100, '秦淮区', '秦淮', '118.78609', '32.033817', 3, 0, 1), +(320105, 320100, '建邺区', '建邺', '118.73269', '32.00454', 3, 0, 1), +(320106, 320100, '鼓楼区', '鼓楼', '118.76974', '32.066967', 3, 0, 1), +(320111, 320100, '浦口区', '浦口', '118.625305', '32.05839', 3, 0, 1), +(320113, 320100, '栖霞区', '栖霞', '118.8087', '32.102146', 3, 0, 1), +(320114, 320100, '雨花台区', '雨花台', '118.77207', '31.995947', 3, 0, 1), +(320115, 320100, '江宁区', '江宁', '118.850624', '31.953419', 3, 0, 1), +(320116, 320100, '六合区', '六合', '118.85065', '32.340656', 3, 0, 1), +(320117, 320100, '溧水区', '溧水', '119.0284', '31.651', 3, 0, 1), +(320118, 320100, '高淳区', '高淳', '118.8921', '31.32751', 3, 0, 1), +(320200, 320000, '无锡市', '无锡', '120.30167', '31.57473', 2, 0, 1), +(320205, 320200, '锡山区', '锡山', '120.3573', '31.58556', 3, 0, 1), +(320206, 320200, '惠山区', '惠山', '120.30354', '31.681019', 3, 0, 1), +(320211, 320200, '滨湖区', '滨湖', '120.26605', '31.550228', 3, 0, 1), +(320213, 320200, '梁溪区', '梁溪', '120.30297', '31.56597', 3, 0, 1), +(320214, 320200, '新吴区', '新吴', '120.36434', '31.49055', 3, 0, 1), +(320281, 320200, '江阴市', '江阴', '120.275894', '31.910984', 3, 0, 1), +(320282, 320200, '宜兴市', '宜兴', '119.82054', '31.364384', 3, 0, 1), +(320300, 320000, '徐州市', '徐州', '117.184814', '34.26179', 2, 0, 1), +(320302, 320300, '鼓楼区', '鼓楼', '117.19294', '34.269398', 3, 0, 1), +(320303, 320300, '云龙区', '云龙', '117.19459', '34.254807', 3, 0, 1), +(320305, 320300, '贾汪区', '贾汪', '117.45021', '34.441643', 3, 0, 1), +(320311, 320300, '泉山区', '泉山', '117.18223', '34.26225', 3, 0, 1), +(320312, 320300, '铜山区', '铜山', '117.16898', '34.18044', 3, 0, 1), +(320321, 320300, '丰县', '丰县', '116.59289', '34.696945', 3, 0, 1), +(320322, 320300, '沛县', '沛县', '116.93718', '34.729046', 3, 0, 1), +(320324, 320300, '睢宁县', '睢宁', '117.95066', '33.899223', 3, 0, 1), +(320381, 320300, '新沂市', '新沂', '118.345825', '34.36878', 3, 0, 1), +(320382, 320300, '邳州市', '邳州', '117.96392', '34.31471', 3, 0, 1), +(320400, 320000, '常州市', '常州', '119.946976', '31.772753', 2, 0, 1), +(320402, 320400, '天宁区', '天宁', '119.96378', '31.779633', 3, 0, 1), +(320404, 320400, '钟楼区', '钟楼', '119.94839', '31.78096', 3, 0, 1), +(320411, 320400, '新北区', '新北', '119.974655', '31.824663', 3, 0, 1), +(320412, 320400, '武进区', '武进', '119.95877', '31.718567', 3, 0, 1), +(320413, 320400, '金坛区', '金坛', '119.59794', '31.72322', 3, 0, 1), +(320481, 320400, '溧阳市', '溧阳', '119.487816', '31.42708', 3, 0, 1), +(320500, 320000, '苏州市', '苏州', '120.61958', '31.29938', 2, 0, 1), +(320505, 320500, '虎丘区', '虎丘', '120.56683', '31.294846', 3, 0, 1), +(320506, 320500, '吴中区', '吴中', '120.62462', '31.27084', 3, 0, 1), +(320507, 320500, '相城区', '相城', '120.61896', '31.396685', 3, 0, 1), +(320508, 320500, '姑苏区', '姑苏', '120.622246', '31.311415', 3, 0, 1), +(320509, 320500, '吴江区', '吴江', '120.64517', '31.13914', 3, 0, 1), +(320581, 320500, '常熟市', '常熟', '120.74852', '31.658155', 3, 0, 1), +(320582, 320500, '张家港市', '张家港', '120.54344', '31.865553', 3, 0, 1), +(320583, 320500, '昆山市', '昆山', '120.95814', '31.381926', 3, 0, 1), +(320585, 320500, '太仓市', '太仓', '121.112274', '31.452568', 3, 0, 1), +(320600, 320000, '南通市', '南通', '120.86461', '32.016212', 2, 0, 1), +(320602, 320600, '崇川区', '崇川', '120.86635', '32.015278', 3, 0, 1), +(320611, 320600, '港闸区', '港闸', '120.8339', '32.0403', 3, 0, 1), +(320612, 320600, '通州区', '通州', '121.07317', '32.084286', 3, 0, 1), +(320623, 320600, '如东县', '如东', '121.18609', '32.311832', 3, 0, 1), +(320681, 320600, '启东市', '启东', '121.65972', '31.810158', 3, 0, 1), +(320682, 320600, '如皋市', '如皋', '120.56632', '32.39159', 3, 0, 1), +(320684, 320600, '海门市', '海门', '121.176605', '31.893528', 3, 0, 1), +(320685, 320600, '海安市', '海安', '120.46759', '32.53308', 3, 0, 1), +(320700, 320000, '连云港市', '连云港', '119.17882', '34.600018', 2, 0, 1), +(320703, 320700, '连云区', '连云', '119.366486', '34.73953', 3, 0, 1), +(320706, 320700, '海州区', '海州', '119.137146', '34.57129', 3, 0, 1), +(320707, 320700, '赣榆区', '赣榆', '119.1773', '34.84065', 3, 0, 1), +(320722, 320700, '东海县', '东海', '118.76649', '34.522858', 3, 0, 1), +(320723, 320700, '灌云县', '灌云', '119.25574', '34.298435', 3, 0, 1), +(320724, 320700, '灌南县', '灌南', '119.35233', '34.092552', 3, 0, 1), +(320800, 320000, '淮安市', '淮安', '119.02126', '33.597507', 2, 0, 1), +(320803, 320800, '淮安区', '淮安', '119.14634', '33.5075', 3, 0, 1), +(320804, 320800, '淮阴区', '淮阴', '119.02082', '33.62245', 3, 0, 1), +(320812, 320800, '清江浦区', '清江浦', '119.02662', '33.55308', 3, 0, 1), +(320813, 320800, '洪泽区', '洪泽', '118.8735', '33.29433', 3, 0, 1), +(320826, 320800, '涟水县', '涟水', '119.266075', '33.77131', 3, 0, 1), +(320830, 320800, '盱眙县', '盱眙', '118.49382', '33.00439', 3, 0, 1), +(320831, 320800, '金湖县', '金湖', '119.01694', '33.01816', 3, 0, 1), +(320900, 320000, '盐城市', '盐城', '120.14', '33.377632', 2, 0, 1), +(320902, 320900, '亭湖区', '亭湖', '120.13608', '33.38391', 3, 0, 1), +(320903, 320900, '盐都区', '盐都', '120.139755', '33.34129', 3, 0, 1), +(320904, 320900, '大丰区', '大丰', '120.50102', '33.20107', 3, 0, 1), +(320921, 320900, '响水县', '响水', '119.579575', '34.19996', 3, 0, 1), +(320922, 320900, '滨海县', '滨海', '119.82844', '33.989887', 3, 0, 1), +(320923, 320900, '阜宁县', '阜宁', '119.805336', '33.78573', 3, 0, 1), +(320924, 320900, '射阳县', '射阳', '120.25745', '33.77378', 3, 0, 1), +(320925, 320900, '建湖县', '建湖', '119.793106', '33.472622', 3, 0, 1), +(320981, 320900, '东台市', '东台', '120.3141', '32.853172', 3, 0, 1), +(321000, 320000, '扬州市', '扬州', '119.421005', '32.393158', 2, 0, 1), +(321002, 321000, '广陵区', '广陵', '119.44227', '32.392155', 3, 0, 1), +(321003, 321000, '邗江区', '邗江', '119.39777', '32.3779', 3, 0, 1), +(321012, 321000, '江都区', '江都', '119.57006', '32.43458', 3, 0, 1), +(321023, 321000, '宝应县', '宝应', '119.32128', '33.23694', 3, 0, 1), +(321081, 321000, '仪征市', '仪征', '119.18244', '32.271965', 3, 0, 1), +(321084, 321000, '高邮市', '高邮', '119.44384', '32.785164', 3, 0, 1), +(321100, 320000, '镇江市', '镇江', '119.45275', '32.204403', 2, 0, 1), +(321102, 321100, '京口区', '京口', '119.454575', '32.206192', 3, 0, 1), +(321111, 321100, '润州区', '润州', '119.41488', '32.2135', 3, 0, 1), +(321112, 321100, '丹徒区', '丹徒', '119.43388', '32.12897', 3, 0, 1), +(321181, 321100, '丹阳市', '丹阳', '119.58191', '31.991459', 3, 0, 1), +(321182, 321100, '扬中市', '扬中', '119.82806', '32.237267', 3, 0, 1), +(321183, 321100, '句容市', '句容', '119.16714', '31.947355', 3, 0, 1), +(321200, 320000, '泰州市', '泰州', '119.91518', '32.484882', 2, 0, 1), +(321202, 321200, '海陵区', '海陵', '119.92019', '32.488407', 3, 0, 1), +(321203, 321200, '高港区', '高港', '119.88166', '32.3157', 3, 0, 1), +(321204, 321200, '姜堰区', '姜堰', '120.12673', '32.50879', 3, 0, 1), +(321281, 321200, '兴化市', '兴化', '119.840164', '32.938065', 3, 0, 1), +(321282, 321200, '靖江市', '靖江', '120.26825', '32.01817', 3, 0, 1), +(321283, 321200, '泰兴市', '泰兴', '120.020226', '32.168785', 3, 0, 1), +(321300, 320000, '宿迁市', '宿迁', '118.27516', '33.96301', 2, 0, 1), +(321302, 321300, '宿城区', '宿城', '118.278984', '33.937725', 3, 0, 1), +(321311, 321300, '宿豫区', '宿豫', '118.33001', '33.94107', 3, 0, 1), +(321322, 321300, '沭阳县', '沭阳', '118.77589', '34.129097', 3, 0, 1), +(321323, 321300, '泗阳县', '泗阳', '118.68128', '33.711433', 3, 0, 1), +(321324, 321300, '泗洪县', '泗洪', '118.21182', '33.45654', 3, 0, 1), +(330000, 0, '浙江省', '浙江', '120.15358', '30.287458', 1, 0, 1), +(330100, 330000, '杭州市', '杭州', '120.15358', '30.287458', 2, 0, 1), +(330102, 330100, '上城区', '上城', '120.17146', '30.250237', 3, 0, 1), +(330103, 330100, '下城区', '下城', '120.17276', '30.276272', 3, 0, 1), +(330104, 330100, '江干区', '江干', '120.20264', '30.266603', 3, 0, 1), +(330105, 330100, '拱墅区', '拱墅', '120.150055', '30.314697', 3, 0, 1), +(330106, 330100, '西湖区', '西湖', '120.14738', '30.272934', 3, 0, 1), +(330108, 330100, '滨江区', '滨江', '120.21062', '30.206615', 3, 0, 1), +(330109, 330100, '萧山区', '萧山', '120.27069', '30.162931', 3, 0, 1), +(330110, 330100, '余杭区', '余杭', '120.301735', '30.421186', 3, 0, 1), +(330111, 330100, '富阳区', '富阳', '119.96043', '30.04885', 3, 0, 1), +(330112, 330100, '临安区', '临安', '119.7248', '30.23383', 3, 0, 1), +(330122, 330100, '桐庐县', '桐庐', '119.68504', '29.797438', 3, 0, 1), +(330127, 330100, '淳安县', '淳安', '119.04427', '29.604177', 3, 0, 1), +(330182, 330100, '建德市', '建德', '119.27909', '29.472284', 3, 0, 1), +(330200, 330000, '宁波市', '宁波', '121.54979', '29.868387', 2, 0, 1), +(330203, 330200, '海曙区', '海曙', '121.539696', '29.874453', 3, 0, 1), +(330205, 330200, '江北区', '江北', '121.55928', '29.888361', 3, 0, 1), +(330206, 330200, '北仑区', '北仑', '121.83131', '29.90944', 3, 0, 1), +(330211, 330200, '镇海区', '镇海', '121.713165', '29.952106', 3, 0, 1), +(330212, 330200, '鄞州区', '鄞州', '121.55843', '29.831661', 3, 0, 1), +(330213, 330200, '奉化区', '奉化', '121.40686', '29.65503', 3, 0, 1), +(330225, 330200, '象山县', '象山', '121.87709', '29.470205', 3, 0, 1), +(330226, 330200, '宁海县', '宁海', '121.43261', '29.299835', 3, 0, 1), +(330281, 330200, '余姚市', '余姚', '121.156296', '30.045404', 3, 0, 1), +(330282, 330200, '慈溪市', '慈溪', '121.248055', '30.177141', 3, 0, 1), +(330300, 330000, '温州市', '温州', '120.67211', '28.000574', 2, 0, 1), +(330302, 330300, '鹿城区', '鹿城', '120.67423', '28.003351', 3, 0, 1), +(330303, 330300, '龙湾区', '龙湾', '120.763466', '27.970255', 3, 0, 1), +(330304, 330300, '瓯海区', '瓯海', '120.637146', '28.006445', 3, 0, 1), +(330305, 330300, '洞头区', '洞头', '121.1572', '27.83616', 3, 0, 1), +(330324, 330300, '永嘉县', '永嘉', '120.69097', '28.153887', 3, 0, 1), +(330326, 330300, '平阳县', '平阳', '120.564384', '27.6693', 3, 0, 1), +(330327, 330300, '苍南县', '苍南', '120.40626', '27.507744', 3, 0, 1), +(330328, 330300, '文成县', '文成', '120.09245', '27.789133', 3, 0, 1), +(330329, 330300, '泰顺县', '泰顺', '119.71624', '27.557308', 3, 0, 1), +(330381, 330300, '瑞安市', '瑞安', '120.64617', '27.779322', 3, 0, 1), +(330382, 330300, '乐清市', '乐清', '120.96715', '28.116083', 3, 0, 1), +(330383, 330300, '龙港市', '龙港', '120.553102', '27.578205', 3, 0, 1), +(330400, 330000, '嘉兴市', '嘉兴', '120.75086', '30.762653', 2, 0, 1), +(330402, 330400, '南湖区', '南湖', '120.749954', '30.764652', 3, 0, 1), +(330411, 330400, '秀洲区', '秀洲', '120.72043', '30.763323', 3, 0, 1), +(330421, 330400, '嘉善县', '嘉善', '120.92187', '30.841352', 3, 0, 1), +(330424, 330400, '海盐县', '海盐', '120.94202', '30.522223', 3, 0, 1), +(330481, 330400, '海宁市', '海宁', '120.68882', '30.525543', 3, 0, 1), +(330482, 330400, '平湖市', '平湖', '121.01466', '30.698921', 3, 0, 1), +(330483, 330400, '桐乡市', '桐乡', '120.55109', '30.629065', 3, 0, 1), +(330500, 330000, '湖州市', '湖州', '120.1024', '30.867199', 2, 0, 1), +(330502, 330500, '吴兴区', '吴兴', '120.10142', '30.867252', 3, 0, 1), +(330503, 330500, '南浔区', '南浔', '120.4172', '30.872742', 3, 0, 1), +(330521, 330500, '德清县', '德清', '119.96766', '30.534927', 3, 0, 1), +(330522, 330500, '长兴县', '长兴', '119.910126', '31.00475', 3, 0, 1), +(330523, 330500, '安吉县', '安吉', '119.68789', '30.631973', 3, 0, 1), +(330600, 330000, '绍兴市', '绍兴', '120.582115', '29.997116', 2, 0, 1), +(330602, 330600, '越城区', '越城', '120.58531', '29.996992', 3, 0, 1), +(330603, 330600, '柯桥区', '柯桥', '120.49476', '30.08189', 3, 0, 1), +(330604, 330600, '上虞区', '上虞', '120.86858', '30.03227', 3, 0, 1), +(330624, 330600, '新昌县', '新昌', '120.90566', '29.501205', 3, 0, 1), +(330681, 330600, '诸暨市', '诸暨', '120.24432', '29.713661', 3, 0, 1), +(330683, 330600, '嵊州市', '嵊州', '120.82888', '29.586605', 3, 0, 1), +(330700, 330000, '金华市', '金华', '119.649506', '29.089523', 2, 0, 1), +(330702, 330700, '婺城区', '婺城', '119.65258', '29.082607', 3, 0, 1), +(330703, 330700, '金东区', '金东', '119.68127', '29.095835', 3, 0, 1), +(330723, 330700, '武义县', '武义', '119.81916', '28.896563', 3, 0, 1), +(330726, 330700, '浦江县', '浦江', '119.893364', '29.451254', 3, 0, 1), +(330727, 330700, '磐安县', '磐安', '120.44513', '29.052628', 3, 0, 1), +(330781, 330700, '兰溪市', '兰溪', '119.46052', '29.210066', 3, 0, 1), +(330782, 330700, '义乌市', '义乌', '120.07491', '29.306864', 3, 0, 1), +(330783, 330700, '东阳市', '东阳', '120.23334', '29.262547', 3, 0, 1), +(330784, 330700, '永康市', '永康', '120.03633', '28.895292', 3, 0, 1), +(330800, 330000, '衢州市', '衢州', '118.87263', '28.941708', 2, 0, 1), +(330802, 330800, '柯城区', '柯城', '118.87304', '28.944538', 3, 0, 1), +(330803, 330800, '衢江区', '衢江', '118.95768', '28.973194', 3, 0, 1), +(330822, 330800, '常山县', '常山', '118.52165', '28.90004', 3, 0, 1), +(330824, 330800, '开化县', '开化', '118.41444', '29.136503', 3, 0, 1), +(330825, 330800, '龙游县', '龙游', '119.17252', '29.031364', 3, 0, 1), +(330881, 330800, '江山市', '江山', '118.62788', '28.734674', 3, 0, 1), +(330900, 330000, '舟山市', '舟山', '122.106865', '30.016027', 2, 0, 1), +(330902, 330900, '定海区', '定海', '122.1085', '30.016422', 3, 0, 1), +(330903, 330900, '普陀区', '普陀', '122.301956', '29.945614', 3, 0, 1), +(330921, 330900, '岱山县', '岱山', '122.20113', '30.242865', 3, 0, 1), +(330922, 330900, '嵊泗县', '嵊泗', '122.45781', '30.727165', 3, 0, 1), +(331000, 330000, '台州市', '台州', '121.4286', '28.661379', 2, 0, 1), +(331002, 331000, '椒江区', '椒江', '121.431046', '28.67615', 3, 0, 1), +(331003, 331000, '黄岩区', '黄岩', '121.26214', '28.64488', 3, 0, 1), +(331004, 331000, '路桥区', '路桥', '121.37292', '28.581799', 3, 0, 1), +(331022, 331000, '三门县', '三门', '121.37643', '29.118956', 3, 0, 1), +(331023, 331000, '天台县', '天台', '121.03123', '29.141127', 3, 0, 1), +(331024, 331000, '仙居县', '仙居', '120.73508', '28.849213', 3, 0, 1), +(331081, 331000, '温岭市', '温岭', '121.37361', '28.36878', 3, 0, 1), +(331082, 331000, '临海市', '临海', '121.131226', '28.845442', 3, 0, 1), +(331083, 331000, '玉环市', '玉环', '121.23164', '28.13589', 3, 0, 1), +(331100, 330000, '丽水市', '丽水', '119.92178', '28.451994', 2, 0, 1), +(331102, 331100, '莲都区', '莲都', '119.922295', '28.451103', 3, 0, 1), +(331121, 331100, '青田县', '青田', '120.29194', '28.135246', 3, 0, 1), +(331122, 331100, '缙云县', '缙云', '120.078964', '28.654207', 3, 0, 1), +(331123, 331100, '遂昌县', '遂昌', '119.27589', '28.5924', 3, 0, 1), +(331124, 331100, '松阳县', '松阳', '119.48529', '28.449938', 3, 0, 1), +(331125, 331100, '云和县', '云和', '119.56946', '28.111076', 3, 0, 1), +(331126, 331100, '庆元县', '庆元', '119.06723', '27.61823', 3, 0, 1), +(331127, 331100, '景宁畲族自治县', '景宁', '119.63467', '27.977247', 3, 0, 1), +(331181, 331100, '龙泉市', '龙泉', '119.13232', '28.069178', 3, 0, 1), +(340000, 0, '安徽省', '安徽', '117.28304', '31.86119', 1, 0, 1), +(340100, 340000, '合肥市', '合肥', '117.28304', '31.86119', 2, 0, 1), +(340102, 340100, '瑶海区', '瑶海', '117.31536', '31.86961', 3, 0, 1), +(340103, 340100, '庐阳区', '庐阳', '117.283775', '31.86901', 3, 0, 1), +(340104, 340100, '蜀山区', '蜀山', '117.26207', '31.855867', 3, 0, 1), +(340111, 340100, '包河区', '包河', '117.28575', '31.82956', 3, 0, 1), +(340121, 340100, '长丰县', '长丰', '117.164696', '32.478546', 3, 0, 1), +(340122, 340100, '肥东县', '肥东', '117.46322', '31.883991', 3, 0, 1), +(340123, 340100, '肥西县', '肥西', '117.166115', '31.719646', 3, 0, 1), +(340124, 340100, '庐江县', '庐江', '117.28736', '31.25567', 3, 0, 1), +(340181, 340100, '巢湖市', '巢湖', '117.88937', '31.62329', 3, 0, 1), +(340200, 340000, '芜湖市', '芜湖', '118.37645', '31.326319', 2, 0, 1), +(340202, 340200, '镜湖区', '镜湖', '118.37634', '31.32559', 3, 0, 1), +(340207, 340200, '鸠江区', '鸠江', '118.40018', '31.362717', 3, 0, 1), +(340209, 340200, '弋江区', '弋江', '', '', 3, 0, 1), +(340210, 340200, '湾沚区', '湾沚', '', '', 3, 0, 1), +(340211, 340200, '繁昌区', '繁昌', '', '', 3, 0, 1), +(340223, 340200, '南陵县', '南陵', '118.337105', '30.919638', 3, 0, 1), +(340281, 340200, '无为市', '无为', '117.90224', '31.30317', 3, 0, 1), +(340300, 340000, '蚌埠市', '蚌埠', '117.36323', '32.939667', 2, 0, 1), +(340302, 340300, '龙子湖区', '龙子湖', '117.38231', '32.95045', 3, 0, 1), +(340303, 340300, '蚌山区', '蚌山', '117.35579', '32.938065', 3, 0, 1), +(340304, 340300, '禹会区', '禹会', '117.35259', '32.931934', 3, 0, 1), +(340311, 340300, '淮上区', '淮上', '117.34709', '32.963146', 3, 0, 1), +(340321, 340300, '怀远县', '怀远', '117.20017', '32.956936', 3, 0, 1), +(340322, 340300, '五河县', '五河', '117.88881', '33.146202', 3, 0, 1), +(340323, 340300, '固镇县', '固镇', '117.31596', '33.31868', 3, 0, 1), +(340400, 340000, '淮南市', '淮南', '117.018326', '32.647575', 2, 0, 1), +(340402, 340400, '大通区', '大通', '117.052925', '32.632065', 3, 0, 1), +(340403, 340400, '田家庵区', '田家庵', '117.01832', '32.64434', 3, 0, 1), +(340404, 340400, '谢家集区', '谢家集', '116.86536', '32.59829', 3, 0, 1), +(340405, 340400, '八公山区', '八公山', '116.84111', '32.628227', 3, 0, 1), +(340406, 340400, '潘集区', '潘集', '116.81688', '32.782116', 3, 0, 1), +(340421, 340400, '凤台县', '凤台', '116.72277', '32.705383', 3, 0, 1), +(340422, 340400, '寿县', '寿县', '116.78708', '32.57332', 3, 0, 1), +(340500, 340000, '马鞍山市', '马鞍山', '118.507904', '31.689362', 2, 0, 1), +(340503, 340500, '花山区', '花山', '118.51131', '31.69902', 3, 0, 1), +(340504, 340500, '雨山区', '雨山', '118.4931', '31.685911', 3, 0, 1), +(340506, 340500, '博望区', '博望', '118.84374', '31.56232', 3, 0, 1), +(340521, 340500, '当涂县', '当涂', '118.489876', '31.556168', 3, 0, 1), +(340522, 340500, '含山县', '含山', '118.10241', '31.73358', 3, 0, 1), +(340523, 340500, '和县', '和县', '118.35145', '31.74423', 3, 0, 1), +(340600, 340000, '淮北市', '淮北', '116.79466', '33.971706', 2, 0, 1), +(340602, 340600, '杜集区', '杜集', '116.83392', '33.99122', 3, 0, 1), +(340603, 340600, '相山区', '相山', '116.79077', '33.970917', 3, 0, 1), +(340604, 340600, '烈山区', '烈山', '116.80946', '33.88953', 3, 0, 1), +(340621, 340600, '濉溪县', '濉溪', '116.76743', '33.91641', 3, 0, 1), +(340700, 340000, '铜陵市', '铜陵', '117.816574', '30.929935', 2, 0, 1), +(340705, 340700, '铜官区', '铜官', '117.87431', '30.95614', 3, 0, 1), +(340706, 340700, '义安区', '义安', '117.79147', '30.95271', 3, 0, 1), +(340711, 340700, '郊区', '郊区', '117.816574', '30.929935', 3, 0, 1), +(340722, 340700, '枞阳县', '枞阳', '117.22019', '30.69961', 3, 0, 1), +(340800, 340000, '安庆市', '安庆', '117.04355', '30.50883', 2, 0, 1), +(340802, 340800, '迎江区', '迎江', '117.04497', '30.506374', 3, 0, 1), +(340803, 340800, '大观区', '大观', '117.034515', '30.505632', 3, 0, 1), +(340811, 340800, '宜秀区', '宜秀', '117.07', '30.541323', 3, 0, 1), +(340822, 340800, '怀宁县', '怀宁', '116.82867', '30.734995', 3, 0, 1), +(340825, 340800, '太湖县', '太湖', '116.30522', '30.451868', 3, 0, 1), +(340826, 340800, '宿松县', '宿松', '116.1202', '30.158327', 3, 0, 1), +(340827, 340800, '望江县', '望江', '116.690926', '30.12491', 3, 0, 1), +(340828, 340800, '岳西县', '岳西', '116.36048', '30.848501', 3, 0, 1), +(340881, 340800, '桐城市', '桐城', '116.959656', '31.050575', 3, 0, 1), +(340882, 340800, '潜山市', '潜山', '116.58133', '30.63107', 3, 0, 1), +(341000, 340000, '黄山市', '黄山', '118.31732', '29.709238', 2, 0, 1), +(341002, 341000, '屯溪区', '屯溪', '118.31735', '29.709187', 3, 0, 1), +(341003, 341000, '黄山区', '黄山', '118.13664', '30.294518', 3, 0, 1), +(341004, 341000, '徽州区', '徽州', '118.339745', '29.825201', 3, 0, 1), +(341021, 341000, '歙县', '歙县', '118.428024', '29.867748', 3, 0, 1), +(341022, 341000, '休宁县', '休宁', '118.18853', '29.788877', 3, 0, 1), +(341023, 341000, '黟县', '黟县', '117.94291', '29.923813', 3, 0, 1), +(341024, 341000, '祁门县', '祁门', '117.71724', '29.853472', 3, 0, 1), +(341100, 340000, '滁州市', '滁州', '118.31626', '32.303627', 2, 0, 1), +(341102, 341100, '琅琊区', '琅琊', '118.316475', '32.3038', 3, 0, 1), +(341103, 341100, '南谯区', '南谯', '118.29695', '32.32984', 3, 0, 1), +(341122, 341100, '来安县', '来安', '118.4333', '32.45023', 3, 0, 1), +(341124, 341100, '全椒县', '全椒', '118.26858', '32.09385', 3, 0, 1), +(341125, 341100, '定远县', '定远', '117.683716', '32.527103', 3, 0, 1), +(341126, 341100, '凤阳县', '凤阳', '117.56246', '32.867146', 3, 0, 1), +(341181, 341100, '天长市', '天长', '119.011215', '32.6815', 3, 0, 1), +(341182, 341100, '明光市', '明光', '117.99805', '32.781204', 3, 0, 1), +(341200, 340000, '阜阳市', '阜阳', '115.81973', '32.89697', 2, 0, 1), +(341202, 341200, '颍州区', '颍州', '115.81391', '32.89124', 3, 0, 1), +(341203, 341200, '颍东区', '颍东', '115.85875', '32.90886', 3, 0, 1), +(341204, 341200, '颍泉区', '颍泉', '115.80453', '32.924797', 3, 0, 1), +(341221, 341200, '临泉县', '临泉', '115.26169', '33.0627', 3, 0, 1), +(341222, 341200, '太和县', '太和', '115.62724', '33.16229', 3, 0, 1), +(341225, 341200, '阜南县', '阜南', '115.59053', '32.638103', 3, 0, 1), +(341226, 341200, '颍上县', '颍上', '116.259125', '32.637066', 3, 0, 1), +(341282, 341200, '界首市', '界首', '115.362114', '33.26153', 3, 0, 1), +(341300, 340000, '宿州市', '宿州', '116.984085', '33.633892', 2, 0, 1), +(341302, 341300, '埇桥区', '埇桥', '116.98331', '33.633854', 3, 0, 1), +(341321, 341300, '砀山县', '砀山', '116.35111', '34.426247', 3, 0, 1), +(341322, 341300, '萧县', '萧县', '116.9454', '34.183266', 3, 0, 1), +(341323, 341300, '灵璧县', '灵璧', '117.55149', '33.54063', 3, 0, 1), +(341324, 341300, '泗县', '泗县', '117.885445', '33.47758', 3, 0, 1), +(341500, 340000, '六安市', '六安', '116.507675', '31.75289', 2, 0, 1), +(341502, 341500, '金安区', '金安', '116.50329', '31.754492', 3, 0, 1), +(341503, 341500, '裕安区', '裕安', '116.494545', '31.750692', 3, 0, 1), +(341504, 341500, '叶集区', '叶集', '115.9133', '31.85122', 3, 0, 1), +(341522, 341500, '霍邱县', '霍邱', '116.27888', '32.341305', 3, 0, 1), +(341523, 341500, '舒城县', '舒城', '116.94409', '31.462849', 3, 0, 1), +(341524, 341500, '金寨县', '金寨', '115.87852', '31.681623', 3, 0, 1), +(341525, 341500, '霍山县', '霍山', '116.33308', '31.402456', 3, 0, 1), +(341600, 340000, '亳州市', '亳州', '115.782936', '33.86934', 2, 0, 1), +(341602, 341600, '谯城区', '谯城', '115.78121', '33.869286', 3, 0, 1), +(341621, 341600, '涡阳县', '涡阳', '116.21155', '33.50283', 3, 0, 1), +(341622, 341600, '蒙城县', '蒙城', '116.56033', '33.260815', 3, 0, 1), +(341623, 341600, '利辛县', '利辛', '116.20778', '33.1435', 3, 0, 1), +(341700, 340000, '池州市', '池州', '117.48916', '30.656036', 2, 0, 1), +(341702, 341700, '贵池区', '贵池', '117.48834', '30.657377', 3, 0, 1), +(341721, 341700, '东至县', '东至', '117.02148', '30.096567', 3, 0, 1), +(341722, 341700, '石台县', '石台', '117.48291', '30.210323', 3, 0, 1), +(341723, 341700, '青阳县', '青阳', '117.85739', '30.63818', 3, 0, 1), +(341800, 340000, '宣城市', '宣城', '118.757996', '30.945667', 2, 0, 1), +(341802, 341800, '宣州区', '宣州', '118.758415', '30.946003', 3, 0, 1), +(341821, 341800, '郎溪县', '郎溪', '119.18502', '31.127834', 3, 0, 1), +(341823, 341800, '泾县', '泾县', '118.4124', '30.685974', 3, 0, 1), +(341824, 341800, '绩溪县', '绩溪', '118.5947', '30.065268', 3, 0, 1), +(341825, 341800, '旌德县', '旌德', '118.54308', '30.288057', 3, 0, 1), +(341881, 341800, '宁国市', '宁国', '118.983406', '30.62653', 3, 0, 1), +(341882, 341800, '广德市', '广德', '119.41705', '30.8938', 3, 0, 1), +(350000, 0, '福建省', '福建', '119.30624', '26.075302', 1, 0, 1), +(350100, 350000, '福州市', '福州', '119.30624', '26.075302', 2, 0, 1), +(350102, 350100, '鼓楼区', '鼓楼', '119.29929', '26.082285', 3, 0, 1), +(350103, 350100, '台江区', '台江', '119.31016', '26.058617', 3, 0, 1), +(350104, 350100, '仓山区', '仓山', '119.32099', '26.038912', 3, 0, 1), +(350105, 350100, '马尾区', '马尾', '119.458725', '25.991976', 3, 0, 1), +(350111, 350100, '晋安区', '晋安', '119.3286', '26.078836', 3, 0, 1), +(350112, 350100, '长乐区', '长乐', '119.52324', '25.96283', 3, 0, 1), +(350121, 350100, '闽侯县', '闽侯', '119.14512', '26.148567', 3, 0, 1), +(350122, 350100, '连江县', '连江', '119.53837', '26.202108', 3, 0, 1), +(350123, 350100, '罗源县', '罗源', '119.55264', '26.487234', 3, 0, 1), +(350124, 350100, '闽清县', '闽清', '118.868416', '26.223793', 3, 0, 1), +(350125, 350100, '永泰县', '永泰', '118.93909', '25.864824', 3, 0, 1), +(350128, 350100, '平潭县', '平潭', '119.7912', '25.503672', 3, 0, 1), +(350181, 350100, '福清市', '福清', '119.37699', '25.720402', 3, 0, 1), +(350200, 350000, '厦门市', '厦门', '118.11022', '24.490475', 2, 0, 1), +(350203, 350200, '思明区', '思明', '118.08783', '24.462059', 3, 0, 1), +(350205, 350200, '海沧区', '海沧', '118.03636', '24.492512', 3, 0, 1), +(350206, 350200, '湖里区', '湖里', '118.10943', '24.512764', 3, 0, 1), +(350211, 350200, '集美区', '集美', '118.10087', '24.572874', 3, 0, 1), +(350212, 350200, '同安区', '同安', '118.15045', '24.729334', 3, 0, 1), +(350213, 350200, '翔安区', '翔安', '118.24281', '24.63748', 3, 0, 1), +(350300, 350000, '莆田市', '莆田', '119.00756', '25.431011', 2, 0, 1), +(350302, 350300, '城厢区', '城厢', '119.00103', '25.433737', 3, 0, 1), +(350303, 350300, '涵江区', '涵江', '119.1191', '25.459272', 3, 0, 1), +(350304, 350300, '荔城区', '荔城', '119.02005', '25.430046', 3, 0, 1), +(350305, 350300, '秀屿区', '秀屿', '119.092606', '25.316141', 3, 0, 1), +(350322, 350300, '仙游县', '仙游', '118.69433', '25.35653', 3, 0, 1), +(350400, 350000, '三明市', '三明', '117.635', '26.265444', 2, 0, 1), +(350402, 350400, '梅列区', '梅列', '117.63687', '26.269209', 3, 0, 1), +(350403, 350400, '三元区', '三元', '117.607414', '26.234192', 3, 0, 1), +(350421, 350400, '明溪县', '明溪', '117.20184', '26.357374', 3, 0, 1), +(350423, 350400, '清流县', '清流', '116.81582', '26.17761', 3, 0, 1), +(350424, 350400, '宁化县', '宁化', '116.65972', '26.259932', 3, 0, 1), +(350425, 350400, '大田县', '大田', '117.84936', '25.690804', 3, 0, 1), +(350426, 350400, '尤溪县', '尤溪', '118.188576', '26.169262', 3, 0, 1), +(350427, 350400, '沙县', '沙县', '117.78909', '26.397362', 3, 0, 1), +(350428, 350400, '将乐县', '将乐', '117.47356', '26.728666', 3, 0, 1), +(350429, 350400, '泰宁县', '泰宁', '117.17752', '26.897995', 3, 0, 1), +(350430, 350400, '建宁县', '建宁', '116.84583', '26.831398', 3, 0, 1), +(350481, 350400, '永安市', '永安', '117.36445', '25.974075', 3, 0, 1), +(350500, 350000, '泉州市', '泉州', '118.589424', '24.908854', 2, 0, 1), +(350502, 350500, '鲤城区', '鲤城', '118.58893', '24.907644', 3, 0, 1), +(350503, 350500, '丰泽区', '丰泽', '118.60515', '24.896042', 3, 0, 1), +(350504, 350500, '洛江区', '洛江', '118.67031', '24.941153', 3, 0, 1), +(350505, 350500, '泉港区', '泉港', '118.912285', '25.12686', 3, 0, 1), +(350521, 350500, '惠安县', '惠安', '118.79895', '25.028719', 3, 0, 1), +(350524, 350500, '安溪县', '安溪', '118.18601', '25.056824', 3, 0, 1), +(350525, 350500, '永春县', '永春', '118.29503', '25.32072', 3, 0, 1), +(350526, 350500, '德化县', '德化', '118.24299', '25.489004', 3, 0, 1), +(350527, 350500, '金门县', '金门', '118.32322', '24.436417', 3, 0, 1), +(350581, 350500, '石狮市', '石狮', '118.6284', '24.731977', 3, 0, 1), +(350582, 350500, '晋江市', '晋江', '118.57734', '24.807322', 3, 0, 1), +(350583, 350500, '南安市', '南安', '118.38703', '24.959494', 3, 0, 1), +(350600, 350000, '漳州市', '漳州', '117.661804', '24.510897', 2, 0, 1), +(350602, 350600, '芗城区', '芗城', '117.65646', '24.509954', 3, 0, 1), +(350603, 350600, '龙文区', '龙文', '117.67139', '24.515656', 3, 0, 1), +(350622, 350600, '云霄县', '云霄', '117.34094', '23.950485', 3, 0, 1), +(350623, 350600, '漳浦县', '漳浦', '117.61402', '24.117907', 3, 0, 1), +(350624, 350600, '诏安县', '诏安', '117.17609', '23.710835', 3, 0, 1), +(350625, 350600, '长泰县', '长泰', '117.75591', '24.621475', 3, 0, 1), +(350626, 350600, '东山县', '东山', '117.42768', '23.702845', 3, 0, 1), +(350627, 350600, '南靖县', '南靖', '117.36546', '24.516424', 3, 0, 1), +(350628, 350600, '平和县', '平和', '117.313545', '24.366158', 3, 0, 1), +(350629, 350600, '华安县', '华安', '117.53631', '25.001415', 3, 0, 1), +(350681, 350600, '龙海市', '龙海', '117.81729', '24.445341', 3, 0, 1), +(350700, 350000, '南平市', '南平', '118.17846', '26.635628', 2, 0, 1), +(350702, 350700, '延平区', '延平', '118.17892', '26.63608', 3, 0, 1), +(350703, 350700, '建阳区', '建阳', '118.120427', '27.331749', 3, 0, 1), +(350721, 350700, '顺昌县', '顺昌', '117.80771', '26.79285', 3, 0, 1), +(350722, 350700, '浦城县', '浦城', '118.53682', '27.920412', 3, 0, 1), +(350723, 350700, '光泽县', '光泽', '117.3379', '27.542803', 3, 0, 1), +(350724, 350700, '松溪县', '松溪', '118.78349', '27.525785', 3, 0, 1), +(350725, 350700, '政和县', '政和', '118.85866', '27.365398', 3, 0, 1), +(350781, 350700, '邵武市', '邵武', '117.49155', '27.337952', 3, 0, 1), +(350782, 350700, '武夷山市', '武夷山', '118.0328', '27.751734', 3, 0, 1), +(350783, 350700, '建瓯市', '建瓯', '118.32176', '27.03502', 3, 0, 1), +(350800, 350000, '龙岩市', '龙岩', '117.02978', '25.091602', 2, 0, 1), +(350802, 350800, '新罗区', '新罗', '117.03072', '25.0918', 3, 0, 1), +(350803, 350800, '永定区', '永定', '116.73202', '24.72303', 3, 0, 1), +(350821, 350800, '长汀县', '长汀', '116.36101', '25.842278', 3, 0, 1), +(350823, 350800, '上杭县', '上杭', '116.424774', '25.050018', 3, 0, 1), +(350824, 350800, '武平县', '武平', '116.10093', '25.08865', 3, 0, 1), +(350825, 350800, '连城县', '连城', '116.75668', '25.708506', 3, 0, 1), +(350881, 350800, '漳平市', '漳平', '117.42073', '25.291597', 3, 0, 1), +(350900, 350000, '宁德市', '宁德', '119.527084', '26.65924', 2, 0, 1), +(350902, 350900, '蕉城区', '蕉城', '119.52722', '26.659252', 3, 0, 1), +(350921, 350900, '霞浦县', '霞浦', '120.00521', '26.882069', 3, 0, 1), +(350922, 350900, '古田县', '古田', '118.74316', '26.577492', 3, 0, 1), +(350923, 350900, '屏南县', '屏南', '118.98754', '26.910826', 3, 0, 1), +(350924, 350900, '寿宁县', '寿宁', '119.50674', '27.457798', 3, 0, 1), +(350925, 350900, '周宁县', '周宁', '119.33824', '27.103106', 3, 0, 1), +(350926, 350900, '柘荣县', '柘荣', '119.898224', '27.236162', 3, 0, 1), +(350981, 350900, '福安市', '福安', '119.650795', '27.084246', 3, 0, 1), +(350982, 350900, '福鼎市', '福鼎', '120.219765', '27.318884', 3, 0, 1), +(360000, 0, '江西省', '江西', '115.89215', '28.676493', 1, 0, 1), +(360100, 360000, '南昌市', '南昌', '115.89215', '28.676493', 2, 0, 1), +(360102, 360100, '东湖区', '东湖', '115.88967', '28.682987', 3, 0, 1), +(360103, 360100, '西湖区', '西湖', '115.91065', '28.6629', 3, 0, 1), +(360104, 360100, '青云谱区', '青云谱', '115.907295', '28.635723', 3, 0, 1), +(360111, 360100, '青山湖区', '青山湖', '115.94904', '28.689293', 3, 0, 1), +(360112, 360100, '新建区', '新建', '115.81529', '28.6925', 3, 0, 1), +(360113, 360100, '红谷滩区', '红谷滩', '115.858393', '28.698314', 3, 0, 1), +(360121, 360100, '南昌县', '南昌', '115.94247', '28.543781', 3, 0, 1), +(360123, 360100, '安义县', '安义', '115.55311', '28.841333', 3, 0, 1), +(360124, 360100, '进贤县', '进贤', '116.26767', '28.36568', 3, 0, 1), +(360200, 360000, '景德镇市', '景德镇', '117.21466', '29.29256', 2, 0, 1), +(360202, 360200, '昌江区', '昌江', '117.19502', '29.288465', 3, 0, 1), +(360203, 360200, '珠山区', '珠山', '117.21481', '29.292812', 3, 0, 1), +(360222, 360200, '浮梁县', '浮梁', '117.21761', '29.352251', 3, 0, 1), +(360281, 360200, '乐平市', '乐平', '117.12938', '28.967361', 3, 0, 1), +(360300, 360000, '萍乡市', '萍乡', '113.85219', '27.622946', 2, 0, 1), +(360302, 360300, '安源区', '安源', '113.85504', '27.625826', 3, 0, 1), +(360313, 360300, '湘东区', '湘东', '113.7456', '27.639318', 3, 0, 1), +(360321, 360300, '莲花县', '莲花', '113.95558', '27.127808', 3, 0, 1), +(360322, 360300, '上栗县', '上栗', '113.80052', '27.87704', 3, 0, 1), +(360323, 360300, '芦溪县', '芦溪', '114.04121', '27.633633', 3, 0, 1), +(360400, 360000, '九江市', '九江', '115.99281', '29.712034', 2, 0, 1), +(360402, 360400, '濂溪区', '庐山', '115.99012', '29.676174', 3, 0, 1), +(360403, 360400, '浔阳区', '浔阳', '115.99595', '29.72465', 3, 0, 1), +(360404, 360400, '柴桑区', '柴桑', '115.91135', '29.60855', 3, 0, 1), +(360423, 360400, '武宁县', '武宁', '115.105644', '29.260181', 3, 0, 1), +(360424, 360400, '修水县', '修水', '114.573425', '29.032728', 3, 0, 1), +(360425, 360400, '永修县', '永修', '115.80905', '29.018211', 3, 0, 1), +(360426, 360400, '德安县', '德安', '115.76261', '29.327475', 3, 0, 1), +(360428, 360400, '都昌县', '都昌', '116.20512', '29.275105', 3, 0, 1), +(360429, 360400, '湖口县', '湖口', '116.244316', '29.7263', 3, 0, 1), +(360430, 360400, '彭泽县', '彭泽', '116.55584', '29.898865', 3, 0, 1), +(360481, 360400, '瑞昌市', '瑞昌', '115.66908', '29.6766', 3, 0, 1), +(360482, 360400, '共青城市', '共青城', '115.81477', '29.24955', 3, 0, 1), +(360483, 360400, '庐山市', '共青城', '115.80571', '29.247885', 3, 0, 1), +(360500, 360000, '新余市', '新余', '114.93083', '27.810835', 2, 0, 1), +(360502, 360500, '渝水区', '渝水', '114.92392', '27.819172', 3, 0, 1), +(360521, 360500, '分宜县', '分宜', '114.67526', '27.8113', 3, 0, 1), +(360600, 360000, '鹰潭市', '鹰潭', '117.03384', '28.238638', 2, 0, 1), +(360602, 360600, '月湖区', '月湖', '117.03411', '28.239077', 3, 0, 1), +(360603, 360600, '余江区', '余江', '116.81834', '28.20991', 3, 0, 1), +(360681, 360600, '贵溪市', '贵溪', '117.212105', '28.283693', 3, 0, 1), +(360700, 360000, '赣州市', '赣州', '114.94028', '25.85097', 2, 0, 1), +(360702, 360700, '章贡区', '章贡', '114.93872', '25.851368', 3, 0, 1), +(360703, 360700, '南康区', '南康', '114.76535', '25.66144', 3, 0, 1), +(360704, 360700, '赣县区', '赣县', '115.01161', '25.86076', 3, 0, 1), +(360722, 360700, '信丰县', '信丰', '114.93089', '25.38023', 3, 0, 1), +(360723, 360700, '大余县', '大余', '114.36224', '25.395937', 3, 0, 1), +(360724, 360700, '上犹县', '上犹', '114.540535', '25.794285', 3, 0, 1), +(360725, 360700, '崇义县', '崇义', '114.30735', '25.68791', 3, 0, 1), +(360726, 360700, '安远县', '安远', '115.39233', '25.13459', 3, 0, 1), +(360728, 360700, '定南县', '定南', '115.03267', '24.774277', 3, 0, 1), +(360729, 360700, '全南县', '全南', '114.531586', '24.742651', 3, 0, 1), +(360730, 360700, '宁都县', '宁都', '116.01878', '26.472054', 3, 0, 1), +(360731, 360700, '于都县', '于都', '115.4112', '25.955032', 3, 0, 1), +(360732, 360700, '兴国县', '兴国', '115.3519', '26.330488', 3, 0, 1), +(360733, 360700, '会昌县', '会昌', '115.79116', '25.599125', 3, 0, 1), +(360734, 360700, '寻乌县', '寻乌', '115.6514', '24.954136', 3, 0, 1), +(360735, 360700, '石城县', '石城', '116.34225', '26.326582', 3, 0, 1), +(360781, 360700, '瑞金市', '瑞金', '116.03485', '25.875278', 3, 0, 1), +(360783, 360700, '龙南市', '龙南', '', '', 3, 0, 1), +(360800, 360000, '吉安市', '吉安', '114.986374', '27.111698', 2, 0, 1), +(360802, 360800, '吉州区', '吉州', '114.98733', '27.112368', 3, 0, 1), +(360803, 360800, '青原区', '青原', '115.016304', '27.105879', 3, 0, 1), +(360821, 360800, '吉安县', '吉安', '114.90511', '27.040043', 3, 0, 1), +(360822, 360800, '吉水县', '吉水', '115.13457', '27.213446', 3, 0, 1), +(360823, 360800, '峡江县', '峡江', '115.31933', '27.580862', 3, 0, 1), +(360824, 360800, '新干县', '新干', '115.39929', '27.755758', 3, 0, 1), +(360825, 360800, '永丰县', '永丰', '115.43556', '27.321087', 3, 0, 1), +(360826, 360800, '泰和县', '泰和', '114.90139', '26.790165', 3, 0, 1), +(360827, 360800, '遂川县', '遂川', '114.51689', '26.323706', 3, 0, 1), +(360828, 360800, '万安县', '万安', '114.78469', '26.462086', 3, 0, 1), +(360829, 360800, '安福县', '安福', '114.61384', '27.382746', 3, 0, 1), +(360830, 360800, '永新县', '永新', '114.24253', '26.944721', 3, 0, 1), +(360881, 360800, '井冈山市', '井冈山', '114.284424', '26.745918', 3, 0, 1), +(360900, 360000, '宜春市', '宜春', '114.391136', '27.8043', 2, 0, 1), +(360902, 360900, '袁州区', '袁州', '114.38738', '27.800117', 3, 0, 1), +(360921, 360900, '奉新县', '奉新', '115.3899', '28.700672', 3, 0, 1), +(360922, 360900, '万载县', '万载', '114.44901', '28.104528', 3, 0, 1), +(360923, 360900, '上高县', '上高', '114.932655', '28.234789', 3, 0, 1), +(360924, 360900, '宜丰县', '宜丰', '114.787384', '28.388288', 3, 0, 1), +(360925, 360900, '靖安县', '靖安', '115.36175', '28.86054', 3, 0, 1), +(360926, 360900, '铜鼓县', '铜鼓', '114.37014', '28.520956', 3, 0, 1), +(360981, 360900, '丰城市', '丰城', '115.786', '28.191584', 3, 0, 1), +(360982, 360900, '樟树市', '樟树', '115.54339', '28.055899', 3, 0, 1), +(360983, 360900, '高安市', '高安', '115.38153', '28.420952', 3, 0, 1), +(361000, 360000, '抚州市', '抚州', '116.35835', '27.98385', 2, 0, 1), +(361002, 361000, '临川区', '临川', '116.361404', '27.981918', 3, 0, 1), +(361003, 361000, '东乡区', '东乡', '116.60334', '28.24771', 3, 0, 1), +(361021, 361000, '南城县', '南城', '116.63945', '27.55531', 3, 0, 1), +(361022, 361000, '黎川县', '黎川', '116.91457', '27.29256', 3, 0, 1), +(361023, 361000, '南丰县', '南丰', '116.533', '27.210133', 3, 0, 1), +(361024, 361000, '崇仁县', '崇仁', '116.05911', '27.760906', 3, 0, 1), +(361025, 361000, '乐安县', '乐安', '115.83843', '27.420101', 3, 0, 1), +(361026, 361000, '宜黄县', '宜黄', '116.22302', '27.546513', 3, 0, 1), +(361027, 361000, '金溪县', '金溪', '116.77875', '27.907387', 3, 0, 1), +(361028, 361000, '资溪县', '资溪', '117.06609', '27.70653', 3, 0, 1), +(361030, 361000, '广昌县', '广昌', '116.32729', '26.838427', 3, 0, 1), +(361100, 360000, '上饶市', '上饶', '117.97118', '28.44442', 2, 0, 1), +(361102, 361100, '信州区', '信州', '117.97052', '28.445377', 3, 0, 1), +(361103, 361100, '广丰区', '广丰', '118.19133', '28.43631', 3, 0, 1), +(361104, 361100, '广信区', '广信', '117.9096', '28.44923', 3, 0, 1), +(361123, 361100, '玉山县', '玉山', '118.24441', '28.67348', 3, 0, 1), +(361124, 361100, '铅山县', '铅山', '117.71191', '28.310892', 3, 0, 1), +(361125, 361100, '横峰县', '横峰', '117.608246', '28.415104', 3, 0, 1), +(361126, 361100, '弋阳县', '弋阳', '117.435005', '28.402391', 3, 0, 1), +(361127, 361100, '余干县', '余干', '116.69107', '28.69173', 3, 0, 1), +(361128, 361100, '鄱阳县', '鄱阳', '116.673744', '28.993374', 3, 0, 1), +(361129, 361100, '万年县', '万年', '117.07015', '28.692589', 3, 0, 1), +(361130, 361100, '婺源县', '婺源', '117.86219', '29.254015', 3, 0, 1), +(361181, 361100, '德兴市', '德兴', '117.578735', '28.945034', 3, 0, 1), +(370000, 0, '山东省', '山东', '117.00092', '36.675808', 1, 0, 1), +(370100, 370000, '济南市', '济南', '117.00092', '36.675808', 2, 0, 1), +(370102, 370100, '历下区', '历下', '117.03862', '36.66417', 3, 0, 1), +(370103, 370100, '市中区', '市中', '116.99898', '36.657352', 3, 0, 1), +(370104, 370100, '槐荫区', '槐荫', '116.94792', '36.668205', 3, 0, 1), +(370105, 370100, '天桥区', '天桥', '116.996086', '36.693375', 3, 0, 1), +(370112, 370100, '历城区', '历城', '117.06374', '36.681744', 3, 0, 1), +(370113, 370100, '长清区', '长清', '116.74588', '36.56105', 3, 0, 1), +(370114, 370100, '章丘区', '章丘', '117.52627', '36.68124', 3, 0, 1), +(370115, 370100, '济阳区', '济阳', '117.17333', '36.97847', 3, 0, 1), +(370116, 370100, '莱芜区', '莱芜', '117.65992', '36.20317', 3, 0, 1), +(370117, 370100, '钢城区', '钢城', '117.81107', '36.05866', 3, 0, 1), +(370124, 370100, '平阴县', '平阴', '116.455055', '36.286922', 3, 0, 1), +(370126, 370100, '商河县', '商河', '117.15637', '37.310543', 3, 0, 1), +(370200, 370000, '青岛市', '青岛', '120.35517', '36.08298', 2, 0, 1), +(370202, 370200, '市南区', '市南', '120.395966', '36.070892', 3, 0, 1), +(370203, 370200, '市北区', '市北', '120.35503', '36.08382', 3, 0, 1), +(370211, 370200, '黄岛区', '黄岛', '119.99552', '35.875137', 3, 0, 1), +(370212, 370200, '崂山区', '崂山', '120.46739', '36.10257', 3, 0, 1), +(370213, 370200, '李沧区', '李沧', '120.421234', '36.160023', 3, 0, 1), +(370214, 370200, '城阳区', '城阳', '120.38914', '36.30683', 3, 0, 1), +(370215, 370200, '即墨区', '即墨', '120.44715', '36.38932', 3, 0, 1), +(370281, 370200, '胶州市', '胶州', '120.0062', '36.285877', 3, 0, 1), +(370283, 370200, '平度市', '平度', '119.959015', '36.78883', 3, 0, 1), +(370285, 370200, '莱西市', '莱西', '120.52622', '36.86509', 3, 0, 1), +(370300, 370000, '淄博市', '淄博', '118.047646', '36.814938', 2, 0, 1), +(370302, 370300, '淄川区', '淄川', '117.9677', '36.64727', 3, 0, 1), +(370303, 370300, '张店区', '张店', '118.05352', '36.80705', 3, 0, 1), +(370304, 370300, '博山区', '博山', '117.85823', '36.497566', 3, 0, 1), +(370305, 370300, '临淄区', '临淄', '118.306015', '36.816658', 3, 0, 1), +(370306, 370300, '周村区', '周村', '117.851036', '36.8037', 3, 0, 1), +(370321, 370300, '桓台县', '桓台', '118.101555', '36.959774', 3, 0, 1), +(370322, 370300, '高青县', '高青', '117.82984', '37.169582', 3, 0, 1), +(370323, 370300, '沂源县', '沂源', '118.16616', '36.186283', 3, 0, 1), +(370400, 370000, '枣庄市', '枣庄', '117.55796', '34.856422', 2, 0, 1), +(370402, 370400, '市中区', '市中', '117.55728', '34.85665', 3, 0, 1), +(370403, 370400, '薛城区', '薛城', '117.26529', '34.79789', 3, 0, 1), +(370404, 370400, '峄城区', '峄城', '117.58632', '34.76771', 3, 0, 1), +(370405, 370400, '台儿庄区', '台儿庄', '117.73475', '34.564816', 3, 0, 1), +(370406, 370400, '山亭区', '山亭', '117.45897', '35.096077', 3, 0, 1), +(370481, 370400, '滕州市', '滕州', '117.1621', '35.088497', 3, 0, 1), +(370500, 370000, '东营市', '东营', '118.66471', '37.434563', 2, 0, 1), +(370502, 370500, '东营区', '东营', '118.507545', '37.461567', 3, 0, 1), +(370503, 370500, '河口区', '河口', '118.52961', '37.886017', 3, 0, 1), +(370505, 370500, '垦利区', '垦利', '118.54768', '37.58748', 3, 0, 1), +(370522, 370500, '利津县', '利津', '118.248856', '37.493366', 3, 0, 1), +(370523, 370500, '广饶县', '广饶', '118.407524', '37.05161', 3, 0, 1), +(370600, 370000, '烟台市', '烟台', '121.39138', '37.539295', 2, 0, 1), +(370602, 370600, '芝罘区', '芝罘', '121.38588', '37.540924', 3, 0, 1), +(370611, 370600, '福山区', '福山', '121.26474', '37.496876', 3, 0, 1), +(370612, 370600, '牟平区', '牟平', '121.60151', '37.388355', 3, 0, 1), +(370613, 370600, '莱山区', '莱山', '121.44887', '37.47355', 3, 0, 1), +(370614, 370600, '蓬莱区', '蓬莱', '', '', 3, 0, 1), +(370681, 370600, '龙口市', '龙口', '120.52833', '37.648445', 3, 0, 1), +(370682, 370600, '莱阳市', '莱阳', '120.71115', '36.977036', 3, 0, 1), +(370683, 370600, '莱州市', '莱州', '119.94214', '37.182724', 3, 0, 1), +(370685, 370600, '招远市', '招远', '120.403145', '37.364918', 3, 0, 1), +(370686, 370600, '栖霞市', '栖霞', '120.8341', '37.305855', 3, 0, 1), +(370687, 370600, '海阳市', '海阳', '121.16839', '36.78066', 3, 0, 1), +(370700, 370000, '潍坊市', '潍坊', '119.10708', '36.70925', 2, 0, 1), +(370702, 370700, '潍城区', '潍城', '119.10378', '36.71006', 3, 0, 1), +(370703, 370700, '寒亭区', '寒亭', '119.20786', '36.772102', 3, 0, 1), +(370704, 370700, '坊子区', '坊子', '119.16633', '36.654617', 3, 0, 1), +(370705, 370700, '奎文区', '奎文', '119.13736', '36.709496', 3, 0, 1), +(370724, 370700, '临朐县', '临朐', '118.53988', '36.516373', 3, 0, 1), +(370725, 370700, '昌乐县', '昌乐', '118.84', '36.703255', 3, 0, 1), +(370781, 370700, '青州市', '青州', '118.484695', '36.697857', 3, 0, 1), +(370782, 370700, '诸城市', '诸城', '119.40318', '35.997093', 3, 0, 1), +(370783, 370700, '寿光市', '寿光', '118.73645', '36.874413', 3, 0, 1), +(370784, 370700, '安丘市', '安丘', '119.20689', '36.427418', 3, 0, 1), +(370785, 370700, '高密市', '高密', '119.757034', '36.37754', 3, 0, 1), +(370786, 370700, '昌邑市', '昌邑', '119.3945', '36.85494', 3, 0, 1), +(370800, 370000, '济宁市', '济宁', '116.58724', '35.415394', 2, 0, 1), +(370811, 370800, '任城区', '任城', '116.63102', '35.431835', 3, 0, 1), +(370812, 370800, '兖州区', '兖州', '116.7857', '35.5526', 3, 0, 1), +(370826, 370800, '微山县', '微山', '117.12861', '34.809525', 3, 0, 1), +(370827, 370800, '鱼台县', '鱼台', '116.650024', '34.997707', 3, 0, 1), +(370828, 370800, '金乡县', '金乡', '116.31036', '35.06977', 3, 0, 1), +(370829, 370800, '嘉祥县', '嘉祥', '116.34289', '35.398098', 3, 0, 1), +(370830, 370800, '汶上县', '汶上', '116.487144', '35.721745', 3, 0, 1), +(370831, 370800, '泗水县', '泗水', '117.273605', '35.653217', 3, 0, 1), +(370832, 370800, '梁山县', '梁山', '116.08963', '35.80184', 3, 0, 1), +(370881, 370800, '曲阜市', '曲阜', '116.99188', '35.59279', 3, 0, 1), +(370883, 370800, '邹城市', '邹城', '116.96673', '35.40526', 3, 0, 1), +(370900, 370000, '泰安市', '泰安', '117.12907', '36.19497', 2, 0, 1), +(370902, 370900, '泰山区', '泰山', '117.12998', '36.189312', 3, 0, 1), +(370911, 370900, '岱岳区', '岱岳', '117.0418', '36.18752', 3, 0, 1), +(370921, 370900, '宁阳县', '宁阳', '116.79929', '35.76754', 3, 0, 1), +(370923, 370900, '东平县', '东平', '116.46105', '35.930466', 3, 0, 1), +(370982, 370900, '新泰市', '新泰', '117.76609', '35.910385', 3, 0, 1), +(370983, 370900, '肥城市', '肥城', '116.7637', '36.1856', 3, 0, 1), +(371000, 370000, '威海市', '威海', '122.116394', '37.50969', 2, 0, 1), +(371002, 371000, '环翠区', '环翠', '122.11619', '37.510754', 3, 0, 1), +(371003, 371000, '文登区', '文登', '122.0581', '37.19397', 3, 0, 1), +(371082, 371000, '荣成市', '荣成', '122.4229', '37.160133', 3, 0, 1), +(371083, 371000, '乳山市', '乳山', '121.53635', '36.91962', 3, 0, 1), +(371100, 370000, '日照市', '日照', '119.461205', '35.42859', 2, 0, 1), +(371102, 371100, '东港区', '东港', '119.4577', '35.42615', 3, 0, 1), +(371103, 371100, '岚山区', '岚山', '119.31584', '35.119793', 3, 0, 1), +(371121, 371100, '五莲县', '五莲', '119.20674', '35.751938', 3, 0, 1), +(371122, 371100, '莒县', '莒县', '118.832855', '35.588116', 3, 0, 1), +(371300, 370000, '临沂市', '临沂', '118.32645', '35.06528', 2, 0, 1), +(371302, 371300, '兰山区', '兰山', '118.32767', '35.06163', 3, 0, 1), +(371311, 371300, '罗庄区', '罗庄', '118.2848', '34.997204', 3, 0, 1), +(371312, 371300, '河东区', '河东', '118.39829', '35.085003', 3, 0, 1), +(371321, 371300, '沂南县', '沂南', '118.4554', '35.547', 3, 0, 1), +(371322, 371300, '郯城县', '郯城', '118.342964', '34.614742', 3, 0, 1), +(371323, 371300, '沂水县', '沂水', '118.634544', '35.78703', 3, 0, 1), +(371324, 371300, '兰陵县', '苍山', '118.32645', '35.06528', 3, 0, 1), +(371325, 371300, '费县', '费县', '117.96887', '35.269173', 3, 0, 1), +(371326, 371300, '平邑县', '平邑', '117.63188', '35.51152', 3, 0, 1), +(371327, 371300, '莒南县', '莒南', '118.838326', '35.17591', 3, 0, 1), +(371328, 371300, '蒙阴县', '蒙阴', '117.94327', '35.712437', 3, 0, 1), +(371329, 371300, '临沭县', '临沭', '118.64838', '34.91706', 3, 0, 1), +(371400, 370000, '德州市', '德州', '116.30743', '37.453968', 2, 0, 1), +(371402, 371400, '德城区', '德城', '116.307076', '37.453922', 3, 0, 1), +(371403, 371400, '陵城区', '陵城', '116.57634', '37.33566', 3, 0, 1), +(371422, 371400, '宁津县', '宁津', '116.79372', '37.64962', 3, 0, 1), +(371423, 371400, '庆云县', '庆云', '117.39051', '37.777725', 3, 0, 1), +(371424, 371400, '临邑县', '临邑', '116.86703', '37.192043', 3, 0, 1), +(371425, 371400, '齐河县', '齐河', '116.75839', '36.795498', 3, 0, 1), +(371426, 371400, '平原县', '平原', '116.43391', '37.164467', 3, 0, 1), +(371427, 371400, '夏津县', '夏津', '116.003815', '36.9505', 3, 0, 1), +(371428, 371400, '武城县', '武城', '116.07863', '37.209526', 3, 0, 1), +(371481, 371400, '乐陵市', '乐陵', '117.21666', '37.729115', 3, 0, 1), +(371482, 371400, '禹城市', '禹城', '116.642555', '36.934486', 3, 0, 1), +(371500, 370000, '聊城市', '聊城', '115.98037', '36.456013', 2, 0, 1), +(371502, 371500, '东昌府区', '东昌府', '115.98003', '36.45606', 3, 0, 1), +(371503, 371500, '茌平区', '茌平', '116.25522', '36.58068', 3, 0, 1), +(371521, 371500, '阳谷县', '阳谷', '115.78429', '36.11371', 3, 0, 1), +(371522, 371500, '莘县', '莘县', '115.66729', '36.2376', 3, 0, 1), +(371524, 371500, '东阿县', '东阿', '116.248856', '36.336002', 3, 0, 1), +(371525, 371500, '冠县', '冠县', '115.44481', '36.483753', 3, 0, 1), +(371526, 371500, '高唐县', '高唐', '116.22966', '36.859756', 3, 0, 1), +(371581, 371500, '临清市', '临清', '115.71346', '36.842598', 3, 0, 1), +(371600, 370000, '滨州市', '滨州', '118.016975', '37.38354', 2, 0, 1), +(371602, 371600, '滨城区', '滨城', '118.02015', '37.384842', 3, 0, 1), +(371603, 371600, '沾化区', '沾化', '118.09882', '37.70058', 3, 0, 1), +(371621, 371600, '惠民县', '惠民', '117.50894', '37.483875', 3, 0, 1), +(371622, 371600, '阳信县', '阳信', '117.58133', '37.64049', 3, 0, 1), +(371623, 371600, '无棣县', '无棣', '117.616325', '37.74085', 3, 0, 1), +(371625, 371600, '博兴县', '博兴', '118.12309', '37.147003', 3, 0, 1), +(371681, 371600, '邹平市', '邹平', '117.74309', '36.86299', 3, 0, 1), +(371700, 370000, '菏泽市', '菏泽', '115.46938', '35.246532', 2, 0, 1), +(371702, 371700, '牡丹区', '牡丹', '115.47095', '35.24311', 3, 0, 1), +(371703, 371700, '定陶区', '定陶', '115.57298', '35.07095', 3, 0, 1), +(371721, 371700, '曹县', '曹县', '115.549484', '34.823254', 3, 0, 1), +(371722, 371700, '单县', '单县', '116.08262', '34.79085', 3, 0, 1), +(371723, 371700, '成武县', '成武', '115.89735', '34.947365', 3, 0, 1), +(371724, 371700, '巨野县', '巨野', '116.08934', '35.391', 3, 0, 1), +(371725, 371700, '郓城县', '郓城', '115.93885', '35.594772', 3, 0, 1), +(371726, 371700, '鄄城县', '鄄城', '115.51434', '35.560257', 3, 0, 1), +(371728, 371700, '东明县', '东明', '115.09841', '35.28964', 3, 0, 1), +(410000, 0, '河南省', '河南', '113.66541', '34.757977', 1, 0, 1), +(410100, 410000, '郑州市', '郑州', '113.66541', '34.757977', 2, 0, 1), +(410102, 410100, '中原区', '中原', '113.61157', '34.748287', 3, 0, 1), +(410103, 410100, '二七区', '二七', '113.645424', '34.730934', 3, 0, 1), +(410104, 410100, '管城回族区', '管城回族', '113.68531', '34.746452', 3, 0, 1), +(410105, 410100, '金水区', '金水', '113.686035', '34.775837', 3, 0, 1), +(410106, 410100, '上街区', '上街', '113.29828', '34.80869', 3, 0, 1), +(410108, 410100, '惠济区', '惠济', '113.61836', '34.82859', 3, 0, 1), +(410122, 410100, '中牟县', '中牟', '114.02252', '34.721977', 3, 0, 1), +(410181, 410100, '巩义市', '巩义', '112.98283', '34.75218', 3, 0, 1), +(410182, 410100, '荥阳市', '荥阳', '113.391525', '34.789078', 3, 0, 1), +(410183, 410100, '新密市', '新密', '113.380615', '34.537846', 3, 0, 1), +(410184, 410100, '新郑市', '新郑', '113.73967', '34.39422', 3, 0, 1), +(410185, 410100, '登封市', '登封', '113.037766', '34.459938', 3, 0, 1), +(410200, 410000, '开封市', '开封', '114.341446', '34.79705', 2, 0, 1), +(410202, 410200, '龙亭区', '龙亭', '114.35335', '34.79983', 3, 0, 1), +(410203, 410200, '顺河回族区', '顺河回族', '114.364876', '34.80046', 3, 0, 1), +(410204, 410200, '鼓楼区', '鼓楼', '114.3485', '34.79238', 3, 0, 1), +(410205, 410200, '禹王台区', '禹王台', '114.35024', '34.779728', 3, 0, 1), +(410212, 410200, '祥符区', '祥符', '114.44136', '34.757', 3, 0, 1), +(410221, 410200, '杞县', '杞县', '114.77047', '34.554585', 3, 0, 1), +(410222, 410200, '通许县', '通许', '114.467735', '34.477303', 3, 0, 1), +(410223, 410200, '尉氏县', '尉氏', '114.193924', '34.412254', 3, 0, 1), +(410225, 410200, '兰考县', '兰考', '114.82057', '34.8299', 3, 0, 1), +(410300, 410000, '洛阳市', '洛阳', '112.43447', '34.66304', 2, 0, 1), +(410302, 410300, '老城区', '老城', '112.477295', '34.682945', 3, 0, 1), +(410303, 410300, '西工区', '西工', '112.44323', '34.667847', 3, 0, 1), +(410304, 410300, '瀍河回族区', '瀍河回族', '112.49162', '34.68474', 3, 0, 1), +(410305, 410300, '涧西区', '涧西', '112.39925', '34.65425', 3, 0, 1), +(410306, 410300, '吉利区', '吉利', '112.58479', '34.899094', 3, 0, 1), +(410311, 410300, '洛龙区', '洛龙', '112.4647', '34.6196', 3, 0, 1), +(410322, 410300, '孟津县', '孟津', '112.44389', '34.826485', 3, 0, 1), +(410323, 410300, '新安县', '新安', '112.1414', '34.72868', 3, 0, 1), +(410324, 410300, '栾川县', '栾川', '111.618385', '33.783195', 3, 0, 1), +(410325, 410300, '嵩县', '嵩县', '112.08777', '34.13156', 3, 0, 1), +(410326, 410300, '汝阳县', '汝阳', '112.473785', '34.15323', 3, 0, 1), +(410327, 410300, '宜阳县', '宜阳', '112.17999', '34.51648', 3, 0, 1), +(410328, 410300, '洛宁县', '洛宁', '111.655396', '34.38718', 3, 0, 1), +(410329, 410300, '伊川县', '伊川', '112.42938', '34.423416', 3, 0, 1), +(410381, 410300, '偃师市', '偃师', '112.78774', '34.72304', 3, 0, 1), +(410400, 410000, '平顶山市', '平顶山', '113.30772', '33.73524', 2, 0, 1), +(410402, 410400, '新华区', '新华', '113.299065', '33.73758', 3, 0, 1), +(410403, 410400, '卫东区', '卫东', '113.310326', '33.739285', 3, 0, 1), +(410404, 410400, '石龙区', '石龙', '112.889885', '33.90154', 3, 0, 1), +(410411, 410400, '湛河区', '湛河', '113.32087', '33.72568', 3, 0, 1), +(410421, 410400, '宝丰县', '宝丰', '113.06681', '33.86636', 3, 0, 1), +(410422, 410400, '叶县', '叶县', '113.3583', '33.62125', 3, 0, 1), +(410423, 410400, '鲁山县', '鲁山', '112.9067', '33.740326', 3, 0, 1), +(410425, 410400, '郏县', '郏县', '113.22045', '33.971992', 3, 0, 1), +(410481, 410400, '舞钢市', '舞钢', '113.52625', '33.302082', 3, 0, 1), +(410482, 410400, '汝州市', '汝州', '112.84534', '34.167408', 3, 0, 1), +(410500, 410000, '安阳市', '安阳', '114.352486', '36.103443', 2, 0, 1), +(410502, 410500, '文峰区', '文峰', '114.35256', '36.098103', 3, 0, 1), +(410503, 410500, '北关区', '北关', '114.352646', '36.10978', 3, 0, 1), +(410505, 410500, '殷都区', '殷都', '114.300095', '36.108974', 3, 0, 1), +(410506, 410500, '龙安区', '龙安', '114.323524', '36.09557', 3, 0, 1), +(410522, 410500, '安阳县', '安阳', '114.1302', '36.130585', 3, 0, 1), +(410523, 410500, '汤阴县', '汤阴', '114.36236', '35.922348', 3, 0, 1), +(410526, 410500, '滑县', '滑县', '114.524', '35.574627', 3, 0, 1), +(410527, 410500, '内黄县', '内黄', '114.90458', '35.9537', 3, 0, 1), +(410581, 410500, '林州市', '林州', '113.82377', '36.063404', 3, 0, 1), +(410600, 410000, '鹤壁市', '鹤壁', '114.29544', '35.748238', 2, 0, 1), +(410602, 410600, '鹤山区', '鹤山', '114.16655', '35.936127', 3, 0, 1), +(410603, 410600, '山城区', '山城', '114.184204', '35.896057', 3, 0, 1), +(410611, 410600, '淇滨区', '淇滨', '114.293915', '35.748383', 3, 0, 1), +(410621, 410600, '浚县', '浚县', '114.55016', '35.671284', 3, 0, 1), +(410622, 410600, '淇县', '淇县', '114.20038', '35.609478', 3, 0, 1), +(410700, 410000, '新乡市', '新乡', '113.88399', '35.302616', 2, 0, 1), +(410702, 410700, '红旗区', '红旗', '113.87816', '35.302685', 3, 0, 1), +(410703, 410700, '卫滨区', '卫滨', '113.866066', '35.304905', 3, 0, 1), +(410704, 410700, '凤泉区', '凤泉', '113.906715', '35.379856', 3, 0, 1), +(410711, 410700, '牧野区', '牧野', '113.89716', '35.312973', 3, 0, 1), +(410721, 410700, '新乡县', '新乡', '113.80618', '35.19002', 3, 0, 1), +(410724, 410700, '获嘉县', '获嘉', '113.65725', '35.261684', 3, 0, 1), +(410725, 410700, '原阳县', '原阳', '113.965965', '35.054', 3, 0, 1), +(410726, 410700, '延津县', '延津', '114.20098', '35.149513', 3, 0, 1), +(410727, 410700, '封丘县', '封丘', '114.42341', '35.04057', 3, 0, 1), +(410781, 410700, '卫辉市', '卫辉', '114.06586', '35.404297', 3, 0, 1), +(410782, 410700, '辉县市', '辉县', '113.80252', '35.46132', 3, 0, 1), +(410783, 410700, '长垣市', '长垣', '114.66886', '35.20049', 3, 0, 1), +(410800, 410000, '焦作市', '焦作', '113.238266', '35.23904', 2, 0, 1), +(410802, 410800, '解放区', '解放', '113.22613', '35.241352', 3, 0, 1), +(410803, 410800, '中站区', '中站', '113.17548', '35.236145', 3, 0, 1), +(410804, 410800, '马村区', '马村', '113.3217', '35.265453', 3, 0, 1), +(410811, 410800, '山阳区', '山阳', '113.26766', '35.21476', 3, 0, 1), +(410821, 410800, '修武县', '修武', '113.447464', '35.229923', 3, 0, 1), +(410822, 410800, '博爱县', '博爱', '113.06931', '35.17035', 3, 0, 1), +(410823, 410800, '武陟县', '武陟', '113.40833', '35.09885', 3, 0, 1), +(410825, 410800, '温县', '温县', '113.07912', '34.941235', 3, 0, 1), +(410882, 410800, '沁阳市', '沁阳', '112.93454', '35.08901', 3, 0, 1), +(410883, 410800, '孟州市', '孟州', '112.78708', '34.90963', 3, 0, 1), +(410900, 410000, '濮阳市', '濮阳', '115.0413', '35.768234', 2, 0, 1), +(410902, 410900, '华龙区', '华龙', '115.03184', '35.76047', 3, 0, 1), +(410922, 410900, '清丰县', '清丰', '115.107285', '35.902412', 3, 0, 1), +(410923, 410900, '南乐县', '南乐', '115.20434', '36.075203', 3, 0, 1), +(410926, 410900, '范县', '范县', '115.50421', '35.85198', 3, 0, 1), +(410927, 410900, '台前县', '台前', '115.85568', '35.996475', 3, 0, 1), +(410928, 410900, '濮阳县', '濮阳', '115.02384', '35.71035', 3, 0, 1), +(411000, 410000, '许昌市', '许昌', '113.826065', '34.022957', 2, 0, 1), +(411002, 411000, '魏都区', '魏都', '113.82831', '34.02711', 3, 0, 1), +(411003, 411000, '建安区', '建安', '', '', 3, 0, 1), +(411024, 411000, '鄢陵县', '鄢陵', '114.18851', '34.100502', 3, 0, 1), +(411025, 411000, '襄城县', '襄城', '113.493164', '33.85594', 3, 0, 1), +(411081, 411000, '禹州市', '禹州', '113.47131', '34.154404', 3, 0, 1), +(411082, 411000, '长葛市', '长葛', '113.76891', '34.219257', 3, 0, 1), +(411100, 410000, '漯河市', '漯河', '114.026405', '33.575855', 2, 0, 1), +(411102, 411100, '源汇区', '源汇', '114.017944', '33.56544', 3, 0, 1), +(411103, 411100, '郾城区', '郾城', '114.016815', '33.588898', 3, 0, 1), +(411104, 411100, '召陵区', '召陵', '114.05169', '33.567554', 3, 0, 1), +(411121, 411100, '舞阳县', '舞阳', '113.610565', '33.43628', 3, 0, 1), +(411122, 411100, '临颍县', '临颍', '113.93889', '33.80609', 3, 0, 1), +(411200, 410000, '三门峡市', '三门峡', '111.1941', '34.777336', 2, 0, 1), +(411202, 411200, '湖滨区', '湖滨', '111.19487', '34.77812', 3, 0, 1), +(411203, 411200, '陕州区', '陕州', '111.10338', '34.72054', 3, 0, 1), +(411221, 411200, '渑池县', '渑池', '111.76299', '34.76349', 3, 0, 1), +(411224, 411200, '卢氏县', '卢氏', '111.05265', '34.053993', 3, 0, 1), +(411281, 411200, '义马市', '义马', '111.869415', '34.74687', 3, 0, 1), +(411282, 411200, '灵宝市', '灵宝', '110.88577', '34.521263', 3, 0, 1), +(411300, 410000, '南阳市', '南阳', '112.54092', '32.99908', 2, 0, 1), +(411302, 411300, '宛城区', '宛城', '112.54459', '32.994858', 3, 0, 1), +(411303, 411300, '卧龙区', '卧龙', '112.528786', '32.989876', 3, 0, 1), +(411321, 411300, '南召县', '南召', '112.435585', '33.488617', 3, 0, 1), +(411322, 411300, '方城县', '方城', '113.01093', '33.25514', 3, 0, 1), +(411323, 411300, '西峡县', '西峡', '111.48577', '33.302982', 3, 0, 1), +(411324, 411300, '镇平县', '镇平', '112.23272', '33.03665', 3, 0, 1), +(411325, 411300, '内乡县', '内乡', '111.8438', '33.046356', 3, 0, 1), +(411326, 411300, '淅川县', '淅川', '111.48903', '33.136105', 3, 0, 1), +(411327, 411300, '社旗县', '社旗县', '112.93828', '33.056126', 3, 0, 1), +(411328, 411300, '唐河县', '唐河', '112.83849', '32.687893', 3, 0, 1), +(411329, 411300, '新野县', '新野', '112.36562', '32.524006', 3, 0, 1), +(411330, 411300, '桐柏县', '桐柏', '113.40606', '32.367153', 3, 0, 1), +(411381, 411300, '邓州市', '邓州', '112.09271', '32.68164', 3, 0, 1), +(411400, 410000, '商丘市', '商丘', '115.6505', '34.437054', 2, 0, 1), +(411402, 411400, '梁园区', '梁园', '115.65459', '34.436554', 3, 0, 1), +(411403, 411400, '睢阳区', '睢阳', '115.65382', '34.390537', 3, 0, 1), +(411421, 411400, '民权县', '民权', '115.14815', '34.648457', 3, 0, 1), +(411422, 411400, '睢县', '睢县', '115.07011', '34.428432', 3, 0, 1), +(411423, 411400, '宁陵县', '宁陵', '115.32005', '34.4493', 3, 0, 1), +(411424, 411400, '柘城县', '柘城', '115.307434', '34.075275', 3, 0, 1), +(411425, 411400, '虞城县', '虞城', '115.86381', '34.399635', 3, 0, 1), +(411426, 411400, '夏邑县', '夏邑', '116.13989', '34.240894', 3, 0, 1), +(411481, 411400, '永城市', '永城', '116.44967', '33.931316', 3, 0, 1), +(411500, 410000, '信阳市', '信阳', '114.07503', '32.123276', 2, 0, 1), +(411502, 411500, '浉河区', '浉河', '114.07503', '32.123276', 3, 0, 1), +(411503, 411500, '平桥区', '平桥', '114.12603', '32.098396', 3, 0, 1), +(411521, 411500, '罗山县', '罗山', '114.53342', '32.203205', 3, 0, 1), +(411522, 411500, '光山县', '光山', '114.90358', '32.0104', 3, 0, 1), +(411523, 411500, '新县', '新县', '114.87705', '31.63515', 3, 0, 1), +(411524, 411500, '商城县', '商城', '115.406296', '31.799982', 3, 0, 1), +(411525, 411500, '固始县', '固始', '115.66733', '32.183075', 3, 0, 1), +(411526, 411500, '潢川县', '潢川', '115.050125', '32.134026', 3, 0, 1), +(411527, 411500, '淮滨县', '淮滨', '115.41545', '32.45264', 3, 0, 1), +(411528, 411500, '息县', '息县', '114.740715', '32.344746', 3, 0, 1), +(411600, 410000, '周口市', '周口', '114.64965', '33.620358', 2, 0, 1), +(411602, 411600, '川汇区', '川汇', '114.65214', '33.614838', 3, 0, 1), +(411603, 411600, '淮阳区', '淮阳', '114.88614', '33.7315', 3, 0, 1), +(411621, 411600, '扶沟县', '扶沟', '114.392006', '34.05406', 3, 0, 1), +(411622, 411600, '西华县', '西华', '114.53007', '33.784378', 3, 0, 1), +(411623, 411600, '商水县', '商水', '114.60927', '33.543846', 3, 0, 1), +(411624, 411600, '沈丘县', '沈丘', '115.07838', '33.395515', 3, 0, 1), +(411625, 411600, '郸城县', '郸城', '115.189', '33.643852', 3, 0, 1), +(411627, 411600, '太康县', '太康', '114.853836', '34.06531', 3, 0, 1), +(411628, 411600, '鹿邑县', '鹿邑', '115.48639', '33.86107', 3, 0, 1), +(411681, 411600, '项城市', '项城', '114.89952', '33.443085', 3, 0, 1), +(411700, 410000, '驻马店市', '驻马店', '114.024734', '32.980167', 2, 0, 1), +(411702, 411700, '驿城区', '驿城', '114.02915', '32.97756', 3, 0, 1), +(411721, 411700, '西平县', '西平', '114.02686', '33.382317', 3, 0, 1), +(411722, 411700, '上蔡县', '上蔡', '114.26689', '33.264717', 3, 0, 1), +(411723, 411700, '平舆县', '平舆', '114.63711', '32.955627', 3, 0, 1), +(411724, 411700, '正阳县', '正阳', '114.38948', '32.601826', 3, 0, 1), +(411725, 411700, '确山县', '确山', '114.02668', '32.801537', 3, 0, 1), +(411726, 411700, '泌阳县', '泌阳', '113.32605', '32.72513', 3, 0, 1), +(411727, 411700, '汝南县', '汝南', '114.3595', '33.004536', 3, 0, 1), +(411728, 411700, '遂平县', '遂平', '114.00371', '33.14698', 3, 0, 1), +(411729, 411700, '新蔡县', '新蔡', '114.97524', '32.749947', 3, 0, 1), +(411800, 410000, '济源市', '济源', '112.60273', '35.06707', 2, 0, 1), +(411802, 411800, '沁园街道', '沁园', '114.02915', '32.97756', 3, 0, 1), +(411821, 411800, '济水街道', '济水', '114.02686', '33.382317', 3, 0, 1), +(411822, 411800, '北海街道', '北海', '114.26689', '33.264717', 3, 0, 1), +(411823, 411800, '天坛街道', '天坛', '114.63711', '32.955627', 3, 0, 1), +(411824, 411800, '玉泉街道', '玉泉', '114.38948', '32.601826', 3, 0, 1), +(411825, 411800, '克井镇', '克井', '114.02668', '32.801537', 3, 0, 1), +(411826, 411800, '五龙口镇', '五龙口', '113.32605', '32.72513', 3, 0, 1), +(411827, 411800, '轵城镇', '轵城', '114.3595', '33.004536', 3, 0, 1), +(411828, 411800, '承留镇', '承留', '114.00371', '33.14698', 3, 0, 1), +(411829, 411800, '邵原镇', '邵原', '114.97524', '32.749947', 3, 0, 1), +(411831, 411800, '坡头镇', '坡头', '114.97524', '32.749947', 3, 0, 1), +(411832, 411800, '梨林镇', '梨林', '114.97524', '32.749947', 3, 0, 1), +(411833, 411800, '大峪镇', '大峪', '114.97524', '32.749947', 3, 0, 1), +(411834, 411800, '思礼镇', '思礼', '114.97524', '32.749947', 3, 0, 1), +(411835, 411800, '王屋镇', '王屋', '114.97524', '32.749947', 3, 0, 1), +(411836, 411800, '下冶镇', '下冶', '114.97524', '32.749947', 3, 0, 1), +(420000, 0, '湖北省', '湖北', '114.29857', '30.584354', 1, 0, 1), +(420100, 420000, '武汉市', '武汉', '114.29857', '30.584354', 2, 0, 1), +(420102, 420100, '江岸区', '江岸', '114.30304', '30.594912', 3, 0, 1), +(420103, 420100, '江汉区', '江汉', '114.28311', '30.578772', 3, 0, 1), +(420104, 420100, '硚口区', '硚口', '114.264565', '30.57061', 3, 0, 1), +(420105, 420100, '汉阳区', '汉阳', '114.26581', '30.549326', 3, 0, 1), +(420106, 420100, '武昌区', '武昌', '114.30734', '30.546535', 3, 0, 1), +(420107, 420100, '青山区', '青山', '114.39707', '30.634214', 3, 0, 1), +(420111, 420100, '洪山区', '洪山', '114.40072', '30.50426', 3, 0, 1), +(420112, 420100, '东西湖区', '东西湖', '114.14249', '30.622467', 3, 0, 1), +(420113, 420100, '汉南区', '汉南', '114.08124', '30.309637', 3, 0, 1), +(420114, 420100, '蔡甸区', '蔡甸', '114.02934', '30.582186', 3, 0, 1), +(420115, 420100, '江夏区', '江夏', '114.31396', '30.349045', 3, 0, 1), +(420116, 420100, '黄陂区', '黄陂', '114.37402', '30.874155', 3, 0, 1), +(420117, 420100, '新洲区', '新洲', '114.80211', '30.84215', 3, 0, 1), +(420200, 420000, '黄石市', '黄石', '115.07705', '30.220074', 2, 0, 1), +(420202, 420200, '黄石港区', '黄石港', '115.090164', '30.212086', 3, 0, 1), +(420203, 420200, '西塞山区', '西塞山', '115.09335', '30.205364', 3, 0, 1), +(420204, 420200, '下陆区', '下陆', '114.97575', '30.177845', 3, 0, 1), +(420205, 420200, '铁山区', '铁山', '114.90137', '30.20601', 3, 0, 1), +(420222, 420200, '阳新县', '阳新', '115.21288', '29.841572', 3, 0, 1), +(420281, 420200, '大冶市', '大冶', '114.97484', '30.098804', 3, 0, 1), +(420300, 420000, '十堰市', '十堰', '110.78792', '32.646908', 2, 0, 1), +(420302, 420300, '茅箭区', '茅箭', '110.78621', '32.644463', 3, 0, 1), +(420303, 420300, '张湾区', '张湾', '110.77236', '32.652515', 3, 0, 1), +(420304, 420300, '郧阳区', '郧阳', '110.81197', '32.83488', 3, 0, 1), +(420322, 420300, '郧西县', '郧西', '110.426476', '32.99146', 3, 0, 1), +(420323, 420300, '竹山县', '竹山', '110.2296', '32.22586', 3, 0, 1), +(420324, 420300, '竹溪县', '竹溪', '109.71719', '32.315342', 3, 0, 1), +(420325, 420300, '房县', '房县', '110.74197', '32.055', 3, 0, 1), +(420381, 420300, '丹江口市', '丹江口', '111.513794', '32.538837', 3, 0, 1), +(420500, 420000, '宜昌市', '宜昌', '111.29084', '30.702637', 2, 0, 1), +(420502, 420500, '西陵区', '西陵', '111.29547', '30.702477', 3, 0, 1), +(420503, 420500, '伍家岗区', '伍家岗', '111.30721', '30.679052', 3, 0, 1), +(420504, 420500, '点军区', '点军', '111.268166', '30.692322', 3, 0, 1), +(420505, 420500, '猇亭区', '猇亭', '111.29084', '30.702637', 3, 0, 1), +(420506, 420500, '夷陵区', '夷陵', '111.326744', '30.770199', 3, 0, 1), +(420525, 420500, '远安县', '远安', '111.64331', '31.059626', 3, 0, 1), +(420526, 420500, '兴山县', '兴山', '110.7545', '31.34795', 3, 0, 1), +(420527, 420500, '秭归县', '秭归', '110.97678', '30.823908', 3, 0, 1), +(420528, 420500, '长阳土家族自治县', '长阳', '111.19848', '30.466534', 3, 0, 1), +(420529, 420500, '五峰土家族自治县', '五峰', '110.674934', '30.199251', 3, 0, 1), +(420581, 420500, '宜都市', '宜都', '111.45437', '30.387234', 3, 0, 1), +(420582, 420500, '当阳市', '当阳', '111.79342', '30.824492', 3, 0, 1), +(420583, 420500, '枝江市', '枝江', '111.7518', '30.425364', 3, 0, 1), +(420600, 420000, '襄阳市', '襄阳', '112.14415', '32.042427', 2, 0, 1), +(420602, 420600, '襄城区', '襄城', '112.15033', '32.015087', 3, 0, 1), +(420606, 420600, '樊城区', '樊城', '112.13957', '32.05859', 3, 0, 1), +(420607, 420600, '襄州区', '襄州', '112.19738', '32.085518', 3, 0, 1), +(420624, 420600, '南漳县', '南漳', '111.84442', '31.77692', 3, 0, 1), +(420625, 420600, '谷城县', '谷城', '111.640144', '32.262676', 3, 0, 1), +(420626, 420600, '保康县', '保康', '111.26224', '31.873507', 3, 0, 1), +(420682, 420600, '老河口市', '老河口', '111.675735', '32.385437', 3, 0, 1), +(420683, 420600, '枣阳市', '枣阳', '112.76527', '32.12308', 3, 0, 1), +(420684, 420600, '宜城市', '宜城', '112.261444', '31.709204', 3, 0, 1), +(420700, 420000, '鄂州市', '鄂州', '114.890594', '30.396536', 2, 0, 1), +(420702, 420700, '梁子湖区', '梁子湖', '114.68197', '30.09819', 3, 0, 1), +(420703, 420700, '华容区', '华容', '114.74148', '30.534468', 3, 0, 1), +(420704, 420700, '鄂城区', '鄂城', '114.890015', '30.39669', 3, 0, 1), +(420800, 420000, '荆门市', '荆门', '112.204254', '31.03542', 2, 0, 1), +(420802, 420800, '东宝区', '东宝', '112.2048', '31.03346', 3, 0, 1), +(420804, 420800, '掇刀区', '掇刀', '112.19841', '30.980799', 3, 0, 1), +(420822, 420800, '沙洋县', '沙洋', '112.595215', '30.70359', 3, 0, 1), +(420881, 420800, '钟祥市', '钟祥', '112.587265', '31.165573', 3, 0, 1), +(420882, 420800, '京山市', '京山', '113.11953', '31.01848', 3, 0, 1), +(420900, 420000, '孝感市', '孝感', '113.92666', '30.926422', 2, 0, 1), +(420902, 420900, '孝南区', '孝南', '113.92585', '30.925966', 3, 0, 1), +(420921, 420900, '孝昌县', '孝昌', '113.98896', '31.251617', 3, 0, 1), +(420922, 420900, '大悟县', '大悟', '114.12625', '31.565483', 3, 0, 1), +(420923, 420900, '云梦县', '云梦', '113.75062', '31.02169', 3, 0, 1), +(420981, 420900, '应城市', '应城', '113.573845', '30.939037', 3, 0, 1), +(420982, 420900, '安陆市', '安陆', '113.6904', '31.26174', 3, 0, 1), +(420984, 420900, '汉川市', '汉川', '113.835304', '30.652164', 3, 0, 1), +(421000, 420000, '荆州市', '荆州', '112.23813', '30.326857', 2, 0, 1), +(421002, 421000, '沙市区', '沙市', '112.25743', '30.315895', 3, 0, 1), +(421003, 421000, '荆州区', '荆州', '112.19535', '30.350674', 3, 0, 1), +(421022, 421000, '公安县', '公安', '112.23018', '30.059065', 3, 0, 1), +(421023, 421000, '监利县', '监利', '112.90434', '29.82008', 3, 0, 1), +(421024, 421000, '江陵县', '江陵', '112.41735', '30.033918', 3, 0, 1), +(421081, 421000, '石首市', '石首', '112.40887', '29.716436', 3, 0, 1), +(421083, 421000, '洪湖市', '洪湖', '113.47031', '29.81297', 3, 0, 1), +(421087, 421000, '松滋市', '松滋', '111.77818', '30.176037', 3, 0, 1), +(421100, 420000, '黄冈市', '黄冈', '114.879364', '30.447712', 2, 0, 1), +(421102, 421100, '黄州区', '黄州', '114.87894', '30.447435', 3, 0, 1), +(421121, 421100, '团风县', '团风', '114.87203', '30.63569', 3, 0, 1), +(421122, 421100, '红安县', '红安', '114.6151', '31.284777', 3, 0, 1), +(421123, 421100, '罗田县', '罗田', '115.39899', '30.78168', 3, 0, 1), +(421124, 421100, '英山县', '英山', '115.67753', '30.735794', 3, 0, 1), +(421125, 421100, '浠水县', '浠水', '115.26344', '30.454838', 3, 0, 1), +(421126, 421100, '蕲春县', '蕲春', '115.43397', '30.234926', 3, 0, 1), +(421127, 421100, '黄梅县', '黄梅', '115.94255', '30.075113', 3, 0, 1), +(421181, 421100, '麻城市', '麻城', '115.02541', '31.177906', 3, 0, 1), +(421182, 421100, '武穴市', '武穴', '115.56242', '29.849342', 3, 0, 1), +(421200, 420000, '咸宁市', '咸宁', '114.328964', '29.832798', 2, 0, 1), +(421202, 421200, '咸安区', '咸安', '114.33389', '29.824717', 3, 0, 1), +(421221, 421200, '嘉鱼县', '嘉鱼', '113.92155', '29.973364', 3, 0, 1), +(421222, 421200, '通城县', '通城', '113.81413', '29.246077', 3, 0, 1), +(421223, 421200, '崇阳县', '崇阳', '114.04996', '29.54101', 3, 0, 1), +(421224, 421200, '通山县', '通山', '114.493164', '29.604456', 3, 0, 1), +(421281, 421200, '赤壁市', '赤壁', '113.88366', '29.716879', 3, 0, 1), +(421300, 420000, '随州市', '随州', '113.37377', '31.717497', 2, 0, 1), +(421303, 421300, '曾都区', '曾都', '113.3712', '31.71615', 3, 0, 1), +(421321, 421300, '随县', '随县', '113.301384', '31.854246', 3, 0, 1), +(421381, 421300, '广水市', '广水', '113.8266', '31.617731', 3, 0, 1), +(422800, 420000, '恩施土家族苗族自治州', '恩施', '109.48699', '30.283113', 2, 0, 1), +(422801, 422800, '恩施市', '恩施', '109.48676', '30.282406', 3, 0, 1), +(422802, 422800, '利川市', '利川', '108.94349', '30.294247', 3, 0, 1), +(422822, 422800, '建始县', '建始', '109.72382', '30.601631', 3, 0, 1), +(422823, 422800, '巴东县', '巴东', '110.33666', '31.041403', 3, 0, 1), +(422825, 422800, '宣恩县', '宣恩', '109.48282', '29.98867', 3, 0, 1), +(422826, 422800, '咸丰县', '咸丰', '109.15041', '29.678967', 3, 0, 1), +(422827, 422800, '来凤县', '来凤', '109.408325', '29.506945', 3, 0, 1), +(422828, 422800, '鹤峰县', '鹤峰', '110.0337', '29.887299', 3, 0, 1), +(429004, 420000, '仙桃市', '仙桃', '113.45397', '30.364952', 3, 0, 1), +(429005, 420000, '潜江市', '潜江', '112.896866', '30.421215', 3, 0, 1), +(429006, 420000, '天门市', '天门', '113.16586', '30.65306', 3, 0, 1), +(429021, 420000, '神农架林区', '神农架', '114.29857', '30.584354', 3, 0, 1), +(430000, 0, '湖南省', '湖南', '112.98228', '28.19409', 1, 0, 1), +(430100, 430000, '长沙市', '长沙', '112.98228', '28.19409', 2, 0, 1), +(430102, 430100, '芙蓉区', '芙蓉', '112.98809', '28.193106', 3, 0, 1), +(430103, 430100, '天心区', '天心', '112.97307', '28.192375', 3, 0, 1), +(430104, 430100, '岳麓区', '岳麓', '112.91159', '28.213043', 3, 0, 1), +(430105, 430100, '开福区', '开福', '112.98553', '28.201336', 3, 0, 1), +(430111, 430100, '雨花区', '雨花', '113.016335', '28.109938', 3, 0, 1), +(430112, 430100, '望城区', '望城', '112.8179', '28.36121', 3, 0, 1), +(430121, 430100, '长沙县', '长沙', '113.0801', '28.237888', 3, 0, 1), +(430181, 430100, '浏阳市', '浏阳', '113.6333', '28.141111', 3, 0, 1), +(430182, 430100, '宁乡市', '宁乡', '112.55183', '28.27741', 3, 0, 1), +(430200, 430000, '株洲市', '株洲', '113.15173', '27.835806', 2, 0, 1), +(430202, 430200, '荷塘区', '荷塘', '113.162544', '27.833036', 3, 0, 1), +(430203, 430200, '芦淞区', '芦淞', '113.15517', '27.827246', 3, 0, 1), +(430204, 430200, '石峰区', '石峰', '113.11295', '27.871944', 3, 0, 1), +(430211, 430200, '天元区', '天元', '113.13625', '27.826908', 3, 0, 1), +(430212, 430200, '渌口区', '渌口', '113.14398', '27.69938', 3, 0, 1), +(430223, 430200, '攸县', '攸县', '113.34577', '27.00007', 3, 0, 1), +(430224, 430200, '茶陵县', '茶陵', '113.54651', '26.789534', 3, 0, 1), +(430225, 430200, '炎陵县', '炎陵', '113.776886', '26.489458', 3, 0, 1), +(430281, 430200, '醴陵市', '醴陵', '113.50716', '27.657873', 3, 0, 1), +(430300, 430000, '湘潭市', '湘潭', '112.94405', '27.82973', 2, 0, 1), +(430302, 430300, '雨湖区', '雨湖', '112.907425', '27.86077', 3, 0, 1), +(430304, 430300, '岳塘区', '岳塘', '112.927704', '27.828854', 3, 0, 1), +(430321, 430300, '湘潭县', '湘潭', '112.95283', '27.7786', 3, 0, 1), +(430381, 430300, '湘乡市', '湘乡', '112.525215', '27.734919', 3, 0, 1), +(430382, 430300, '韶山市', '韶山', '112.52848', '27.922682', 3, 0, 1), +(430400, 430000, '衡阳市', '衡阳', '112.6077', '26.900358', 2, 0, 1), +(430405, 430400, '珠晖区', '珠晖', '112.62633', '26.891064', 3, 0, 1), +(430406, 430400, '雁峰区', '雁峰', '112.61224', '26.893694', 3, 0, 1), +(430407, 430400, '石鼓区', '石鼓', '112.607635', '26.903908', 3, 0, 1), +(430408, 430400, '蒸湘区', '蒸湘', '112.57061', '26.89087', 3, 0, 1), +(430412, 430400, '南岳区', '南岳', '112.734146', '27.240536', 3, 0, 1), +(430421, 430400, '衡阳县', '衡阳', '112.37965', '26.962387', 3, 0, 1), +(430422, 430400, '衡南县', '衡南', '112.67746', '26.739973', 3, 0, 1), +(430423, 430400, '衡山县', '衡山', '112.86971', '27.234808', 3, 0, 1), +(430424, 430400, '衡东县', '衡东', '112.95041', '27.08353', 3, 0, 1), +(430426, 430400, '祁东县', '祁东', '112.11119', '26.78711', 3, 0, 1), +(430481, 430400, '耒阳市', '耒阳', '112.84721', '26.414162', 3, 0, 1), +(430482, 430400, '常宁市', '常宁', '112.39682', '26.406773', 3, 0, 1), +(430500, 430000, '邵阳市', '邵阳', '111.46923', '27.237843', 2, 0, 1), +(430502, 430500, '双清区', '双清', '111.47976', '27.240002', 3, 0, 1), +(430503, 430500, '大祥区', '大祥', '111.46297', '27.233593', 3, 0, 1), +(430511, 430500, '北塔区', '北塔', '111.45232', '27.245687', 3, 0, 1), +(430522, 430500, '新邵县', '新邵', '111.45976', '27.311428', 3, 0, 1), +(430523, 430500, '邵阳县', '邵阳', '111.2757', '26.989714', 3, 0, 1), +(430524, 430500, '隆回县', '隆回', '111.03879', '27.116001', 3, 0, 1), +(430525, 430500, '洞口县', '洞口', '110.57921', '27.062286', 3, 0, 1), +(430527, 430500, '绥宁县', '绥宁', '110.155075', '26.580622', 3, 0, 1), +(430528, 430500, '新宁县', '新宁', '110.859116', '26.438911', 3, 0, 1), +(430529, 430500, '城步苗族自治县', '城步', '110.313225', '26.363575', 3, 0, 1), +(430581, 430500, '武冈市', '武冈', '110.6368', '26.732086', 3, 0, 1), +(430582, 430500, '邵东市', '邵东', '111.74446', '27.25844', 3, 0, 1), +(430600, 430000, '岳阳市', '岳阳', '113.13286', '29.37029', 2, 0, 1), +(430602, 430600, '岳阳楼区', '岳阳楼', '113.12075', '29.366783', 3, 0, 1), +(430603, 430600, '云溪区', '云溪', '113.27387', '29.473394', 3, 0, 1), +(430611, 430600, '君山区', '君山', '113.00408', '29.438063', 3, 0, 1), +(430621, 430600, '岳阳县', '岳阳', '113.11607', '29.144842', 3, 0, 1), +(430623, 430600, '华容县', '华容', '112.55937', '29.524107', 3, 0, 1), +(430624, 430600, '湘阴县', '湘阴', '112.88975', '28.677498', 3, 0, 1), +(430626, 430600, '平江县', '平江', '113.59375', '28.701523', 3, 0, 1), +(430681, 430600, '汨罗市', '汨罗', '113.07942', '28.803148', 3, 0, 1), +(430682, 430600, '临湘市', '临湘', '113.450806', '29.471594', 3, 0, 1), +(430700, 430000, '常德市', '常德', '111.691345', '29.040224', 2, 0, 1), +(430702, 430700, '武陵区', '武陵', '111.69072', '29.040478', 3, 0, 1), +(430703, 430700, '鼎城区', '鼎城', '111.685326', '29.014425', 3, 0, 1), +(430721, 430700, '安乡县', '安乡', '112.17229', '29.414482', 3, 0, 1), +(430722, 430700, '汉寿县', '汉寿', '111.968506', '28.907318', 3, 0, 1), +(430723, 430700, '澧县', '澧县', '111.76168', '29.64264', 3, 0, 1), +(430724, 430700, '临澧县', '临澧', '111.6456', '29.443216', 3, 0, 1), +(430725, 430700, '桃源县', '桃源', '111.484505', '28.902735', 3, 0, 1), +(430726, 430700, '石门县', '石门', '111.37909', '29.584703', 3, 0, 1), +(430781, 430700, '津市市', '津市', '111.87961', '29.630867', 3, 0, 1), +(430800, 430000, '张家界市', '张家界', '110.47992', '29.127401', 2, 0, 1), +(430802, 430800, '永定区', '永定', '110.48456', '29.125961', 3, 0, 1), +(430811, 430800, '武陵源区', '武陵源', '110.54758', '29.347828', 3, 0, 1), +(430821, 430800, '慈利县', '慈利', '111.132706', '29.423876', 3, 0, 1), +(430822, 430800, '桑植县', '桑植', '110.16404', '29.399939', 3, 0, 1), +(430900, 430000, '益阳市', '益阳', '112.35504', '28.570066', 2, 0, 1), +(430902, 430900, '资阳区', '资阳', '112.33084', '28.592772', 3, 0, 1), +(430903, 430900, '赫山区', '赫山', '112.36095', '28.568327', 3, 0, 1), +(430921, 430900, '南县', '南县', '112.4104', '29.37218', 3, 0, 1), +(430922, 430900, '桃江县', '桃江', '112.13973', '28.520992', 3, 0, 1), +(430923, 430900, '安化县', '安化', '111.221825', '28.37742', 3, 0, 1), +(430981, 430900, '沅江市', '沅江', '112.36109', '28.839712', 3, 0, 1), +(431000, 430000, '郴州市', '郴州', '113.03207', '25.793589', 2, 0, 1), +(431002, 431000, '北湖区', '北湖', '113.03221', '25.792627', 3, 0, 1), +(431003, 431000, '苏仙区', '苏仙', '113.0387', '25.793158', 3, 0, 1), +(431021, 431000, '桂阳县', '桂阳', '112.73447', '25.737448', 3, 0, 1), +(431022, 431000, '宜章县', '宜章', '112.94788', '25.394344', 3, 0, 1), +(431023, 431000, '永兴县', '永兴', '113.11482', '26.129393', 3, 0, 1), +(431024, 431000, '嘉禾县', '嘉禾', '112.37062', '25.587309', 3, 0, 1), +(431025, 431000, '临武县', '临武', '112.56459', '25.27912', 3, 0, 1), +(431026, 431000, '汝城县', '汝城', '113.685684', '25.553759', 3, 0, 1), +(431027, 431000, '桂东县', '桂东', '113.94588', '26.073917', 3, 0, 1), +(431028, 431000, '安仁县', '安仁', '113.27217', '26.708626', 3, 0, 1), +(431081, 431000, '资兴市', '资兴', '113.23682', '25.974152', 3, 0, 1), +(431100, 430000, '永州市', '永州', '111.60802', '26.434517', 2, 0, 1), +(431102, 431100, '零陵区', '零陵', '111.62635', '26.223347', 3, 0, 1), +(431103, 431100, '冷水滩区', '冷水滩', '111.607155', '26.434364', 3, 0, 1), +(431121, 431100, '祁阳县', '祁阳', '111.85734', '26.58593', 3, 0, 1), +(431122, 431100, '东安县', '东安', '111.313034', '26.397278', 3, 0, 1), +(431123, 431100, '双牌县', '双牌', '111.66215', '25.959396', 3, 0, 1), +(431124, 431100, '道县', '道县', '111.59161', '25.518444', 3, 0, 1), +(431125, 431100, '江永县', '江永', '111.3468', '25.268154', 3, 0, 1), +(431126, 431100, '宁远县', '宁远', '111.94453', '25.584112', 3, 0, 1), +(431127, 431100, '蓝山县', '蓝山', '112.1942', '25.375256', 3, 0, 1), +(431128, 431100, '新田县', '新田', '112.220345', '25.906927', 3, 0, 1), +(431129, 431100, '江华瑶族自治县', '江华', '111.57728', '25.182596', 3, 0, 1), +(431200, 430000, '怀化市', '怀化', '109.97824', '27.550081', 2, 0, 1), +(431202, 431200, '鹤城区', '鹤城', '109.98224', '27.548473', 3, 0, 1), +(431221, 431200, '中方县', '中方', '109.94806', '27.43736', 3, 0, 1), +(431222, 431200, '沅陵县', '沅陵', '110.39916', '28.455553', 3, 0, 1), +(431223, 431200, '辰溪县', '辰溪', '110.19695', '28.005474', 3, 0, 1), +(431224, 431200, '溆浦县', '溆浦', '110.593376', '27.903803', 3, 0, 1), +(431225, 431200, '会同县', '会同', '109.72079', '26.870789', 3, 0, 1), +(431226, 431200, '麻阳苗族自治县', '麻阳', '109.80281', '27.865992', 3, 0, 1), +(431227, 431200, '新晃侗族自治县', '新晃', '109.174446', '27.359898', 3, 0, 1), +(431228, 431200, '芷江侗族自治县', '芷江', '109.687775', '27.437996', 3, 0, 1), +(431229, 431200, '靖州苗族侗族自治县', '靖州', '109.69116', '26.573511', 3, 0, 1), +(431230, 431200, '通道侗族自治县', '通道', '109.783356', '26.158348', 3, 0, 1), +(431281, 431200, '洪江市', '洪江', '109.831764', '27.201876', 3, 0, 1), +(431300, 430000, '娄底市', '娄底', '112.0085', '27.728136', 2, 0, 1), +(431302, 431300, '娄星区', '娄星', '112.008484', '27.726643', 3, 0, 1), +(431321, 431300, '双峰县', '双峰', '112.19824', '27.459126', 3, 0, 1), +(431322, 431300, '新化县', '新化', '111.30675', '27.737455', 3, 0, 1), +(431381, 431300, '冷水江市', '冷水江', '111.43468', '27.685759', 3, 0, 1), +(431382, 431300, '涟源市', '涟源', '111.670845', '27.6923', 3, 0, 1), +(433100, 430000, '湘西土家族苗族自治州', '湘西', '109.73974', '28.314297', 2, 0, 1), +(433101, 433100, '吉首市', '吉首', '109.73827', '28.314827', 3, 0, 1), +(433122, 433100, '泸溪县', '泸溪', '110.21443', '28.214516', 3, 0, 1), +(433123, 433100, '凤凰县', '凤凰', '109.59919', '27.948309', 3, 0, 1), +(433124, 433100, '花垣县', '花垣', '109.479065', '28.581352', 3, 0, 1), +(433125, 433100, '保靖县', '保靖', '109.65144', '28.709604', 3, 0, 1), +(433126, 433100, '古丈县', '古丈', '109.94959', '28.616974', 3, 0, 1), +(433127, 433100, '永顺县', '永顺', '109.853294', '28.998068', 3, 0, 1), +(433130, 433100, '龙山县', '龙山', '109.44119', '29.453438', 3, 0, 1), +(440000, 0, '广东省', '广东', '113.28064', '23.125177', 1, 0, 1), +(440100, 440000, '广州市', '广州', '113.28064', '23.125177', 2, 0, 1), +(440103, 440100, '荔湾区', '荔湾', '113.243034', '23.124943', 3, 0, 1), +(440104, 440100, '越秀区', '越秀', '113.280716', '23.125624', 3, 0, 1), +(440105, 440100, '海珠区', '海珠', '113.26201', '23.10313', 3, 0, 1), +(440106, 440100, '天河区', '天河', '113.335365', '23.13559', 3, 0, 1), +(440111, 440100, '白云区', '白云', '113.26283', '23.162281', 3, 0, 1), +(440112, 440100, '黄埔区', '黄埔', '113.45076', '23.10324', 3, 0, 1), +(440113, 440100, '番禺区', '番禺', '113.36462', '22.938581', 3, 0, 1), +(440114, 440100, '花都区', '花都', '113.21118', '23.39205', 3, 0, 1), +(440115, 440100, '南沙区', '南沙', '113.53738', '22.79453', 3, 0, 1), +(440117, 440100, '从化区', '从化', '113.58646', '23.54835', 3, 0, 1), +(440118, 440100, '增城区', '增城', '113.8109', '23.26093', 3, 0, 1), +(440200, 440000, '韶关市', '韶关', '113.591545', '24.801323', 2, 0, 1), +(440203, 440200, '武江区', '武江', '113.58829', '24.80016', 3, 0, 1), +(440204, 440200, '浈江区', '浈江', '113.59922', '24.803976', 3, 0, 1), +(440205, 440200, '曲江区', '曲江', '113.60558', '24.680195', 3, 0, 1), +(440222, 440200, '始兴县', '始兴', '114.06721', '24.948364', 3, 0, 1), +(440224, 440200, '仁化县', '仁化', '113.74863', '25.088226', 3, 0, 1), +(440229, 440200, '翁源县', '翁源', '114.13129', '24.353888', 3, 0, 1), +(440232, 440200, '乳源瑶族自治县', '乳源', '113.27842', '24.77611', 3, 0, 1), +(440233, 440200, '新丰县', '新丰', '114.20703', '24.055412', 3, 0, 1), +(440281, 440200, '乐昌市', '乐昌', '113.35241', '25.128445', 3, 0, 1), +(440282, 440200, '南雄市', '南雄', '114.31123', '25.115328', 3, 0, 1), +(440300, 440000, '深圳市', '深圳', '114.085945', '22.547', 2, 0, 1), +(440303, 440300, '罗湖区', '罗湖', '114.123886', '22.555342', 3, 0, 1), +(440304, 440300, '福田区', '福田', '114.05096', '22.54101', 3, 0, 1), +(440305, 440300, '南山区', '南山', '113.92943', '22.531221', 3, 0, 1), +(440306, 440300, '宝安区', '宝安', '113.828674', '22.754742', 3, 0, 1), +(440307, 440300, '龙岗区', '龙岗', '114.25137', '22.721512', 3, 0, 1), +(440308, 440300, '盐田区', '盐田', '114.23537', '22.555069', 3, 0, 1), +(440309, 440300, '龙华区', '龙华', '114.06031', '22.72174', 3, 0, 1), +(440310, 440300, '坪山区', '坪山', '114.34632', '22.69084', 3, 0, 1), +(440311, 440300, '光明区', '光明', '113.93588', '22.74894', 3, 0, 1), +(440400, 440000, '珠海市', '珠海', '113.553986', '22.22498', 2, 0, 1), +(440402, 440400, '香洲区', '香洲', '113.55027', '22.27125', 3, 0, 1), +(440403, 440400, '斗门区', '斗门', '113.29774', '22.209118', 3, 0, 1), +(440404, 440400, '金湾区', '金湾', '113.34507', '22.139122', 3, 0, 1), +(440500, 440000, '汕头市', '汕头', '116.708466', '23.37102', 2, 0, 1), +(440507, 440500, '龙湖区', '龙湖', '116.73202', '23.373755', 3, 0, 1), +(440511, 440500, '金平区', '金平', '116.70358', '23.367071', 3, 0, 1), +(440512, 440500, '濠江区', '濠江', '116.72953', '23.279345', 3, 0, 1), +(440513, 440500, '潮阳区', '潮阳', '116.6026', '23.262337', 3, 0, 1), +(440514, 440500, '潮南区', '潮南', '116.42361', '23.249798', 3, 0, 1), +(440515, 440500, '澄海区', '澄海', '116.76336', '23.46844', 3, 0, 1), +(440523, 440500, '南澳县', '南澳', '117.02711', '23.419561', 3, 0, 1), +(440600, 440000, '佛山市', '佛山', '113.12272', '23.028763', 2, 0, 1), +(440604, 440600, '禅城区', '禅城', '113.11241', '23.019644', 3, 0, 1), +(440605, 440600, '南海区', '南海', '113.14558', '23.031563', 3, 0, 1), +(440606, 440600, '顺德区', '顺德', '113.28182', '22.75851', 3, 0, 1), +(440607, 440600, '三水区', '三水', '112.899414', '23.16504', 3, 0, 1), +(440608, 440600, '高明区', '高明', '112.882126', '22.893854', 3, 0, 1), +(440700, 440000, '江门市', '江门', '113.09494', '22.590431', 2, 0, 1), +(440703, 440700, '蓬江区', '蓬江', '113.07859', '22.59677', 3, 0, 1), +(440704, 440700, '江海区', '江海', '113.1206', '22.57221', 3, 0, 1), +(440705, 440700, '新会区', '新会', '113.03858', '22.520247', 3, 0, 1), +(440781, 440700, '台山市', '台山', '112.79341', '22.250713', 3, 0, 1), +(440783, 440700, '开平市', '开平', '112.69226', '22.366285', 3, 0, 1), +(440784, 440700, '鹤山市', '鹤山', '112.96179', '22.768105', 3, 0, 1), +(440785, 440700, '恩平市', '恩平', '112.31405', '22.182957', 3, 0, 1), +(440800, 440000, '湛江市', '湛江', '110.364975', '21.274899', 2, 0, 1), +(440802, 440800, '赤坎区', '赤坎', '110.36163', '21.273365', 3, 0, 1), +(440803, 440800, '霞山区', '霞山', '110.40638', '21.19423', 3, 0, 1), +(440804, 440800, '坡头区', '坡头', '110.455635', '21.24441', 3, 0, 1), +(440811, 440800, '麻章区', '麻章', '110.32917', '21.265997', 3, 0, 1), +(440823, 440800, '遂溪县', '遂溪', '110.25532', '21.376915', 3, 0, 1), +(440825, 440800, '徐闻县', '徐闻', '110.17572', '20.326082', 3, 0, 1), +(440881, 440800, '廉江市', '廉江', '110.28496', '21.61128', 3, 0, 1), +(440882, 440800, '雷州市', '雷州', '110.08827', '20.908524', 3, 0, 1), +(440883, 440800, '吴川市', '吴川', '110.78051', '21.428453', 3, 0, 1), +(440900, 440000, '茂名市', '茂名', '110.91923', '21.659752', 2, 0, 1), +(440902, 440900, '茂南区', '茂南', '110.92054', '21.660425', 3, 0, 1), +(440904, 440900, '电白区', '电白', '111.01636', '21.51428', 3, 0, 1), +(440981, 440900, '高州市', '高州', '110.85325', '21.915154', 3, 0, 1), +(440982, 440900, '化州市', '化州', '110.63839', '21.654953', 3, 0, 1), +(440983, 440900, '信宜市', '信宜', '110.94166', '22.35268', 3, 0, 1), +(441200, 440000, '肇庆市', '肇庆', '112.47253', '23.051546', 2, 0, 1), +(441202, 441200, '端州区', '端州', '112.47233', '23.052662', 3, 0, 1), +(441203, 441200, '鼎湖区', '鼎湖', '112.56525', '23.155823', 3, 0, 1), +(441204, 441200, '高要区', '高要', '112.45839', '23.02581', 3, 0, 1), +(441223, 441200, '广宁县', '广宁', '112.44042', '23.631487', 3, 0, 1), +(441224, 441200, '怀集县', '怀集', '112.182465', '23.913073', 3, 0, 1), +(441225, 441200, '封开县', '封开', '111.502975', '23.43473', 3, 0, 1), +(441226, 441200, '德庆县', '德庆', '111.78156', '23.14171', 3, 0, 1), +(441284, 441200, '四会市', '四会', '112.69503', '23.340324', 3, 0, 1), +(441300, 440000, '惠州市', '惠州', '114.4126', '23.079405', 2, 0, 1), +(441302, 441300, '惠城区', '惠城', '114.41398', '23.079884', 3, 0, 1), +(441303, 441300, '惠阳区', '惠阳', '114.469444', '22.78851', 3, 0, 1), +(441322, 441300, '博罗县', '博罗', '114.284256', '23.167576', 3, 0, 1), +(441323, 441300, '惠东县', '惠东', '114.72309', '22.983036', 3, 0, 1), +(441324, 441300, '龙门县', '龙门', '114.25999', '23.723894', 3, 0, 1), +(441400, 440000, '梅州市', '梅州', '116.117584', '24.299112', 2, 0, 1), +(441402, 441400, '梅江区', '梅江', '116.12116', '24.302593', 3, 0, 1), +(441403, 441400, '梅县区', '梅县', '116.08245', '24.26539', 3, 0, 1), +(441422, 441400, '大埔县', '大埔', '116.69552', '24.351587', 3, 0, 1), +(441423, 441400, '丰顺县', '丰顺', '116.18442', '23.752771', 3, 0, 1), +(441424, 441400, '五华县', '五华', '115.775', '23.925425', 3, 0, 1), +(441426, 441400, '平远县', '平远', '115.89173', '24.56965', 3, 0, 1), +(441427, 441400, '蕉岭县', '蕉岭', '116.17053', '24.653313', 3, 0, 1), +(441481, 441400, '兴宁市', '兴宁', '115.73165', '24.138077', 3, 0, 1), +(441500, 440000, '汕尾市', '汕尾', '115.364235', '22.774485', 2, 0, 1), +(441502, 441500, '城区', '城区', '115.36367', '22.776228', 3, 0, 1), +(441521, 441500, '海丰县', '海丰', '115.337326', '22.971043', 3, 0, 1), +(441523, 441500, '陆河县', '陆河', '115.65756', '23.302683', 3, 0, 1), +(441581, 441500, '陆丰市', '陆丰', '115.6442', '22.946104', 3, 0, 1), +(441600, 440000, '河源市', '河源', '114.6978', '23.746265', 2, 0, 1), +(441602, 441600, '源城区', '源城', '114.69683', '23.746256', 3, 0, 1), +(441621, 441600, '紫金县', '紫金', '115.18438', '23.633743', 3, 0, 1), +(441622, 441600, '龙川县', '龙川', '115.25642', '24.101173', 3, 0, 1), +(441623, 441600, '连平县', '连平', '114.49595', '24.364227', 3, 0, 1), +(441624, 441600, '和平县', '和平', '114.941475', '24.44318', 3, 0, 1), +(441625, 441600, '东源县', '东源', '114.742714', '23.789093', 3, 0, 1), +(441700, 440000, '阳江市', '阳江', '111.975105', '21.859222', 2, 0, 1), +(441702, 441700, '江城区', '江城', '111.96891', '21.859182', 3, 0, 1), +(441704, 441700, '阳东区', '阳东', '112.0067', '21.86829', 3, 0, 1), +(441721, 441700, '阳西县', '阳西', '111.61755', '21.75367', 3, 0, 1), +(441781, 441700, '阳春市', '阳春', '111.7905', '22.169598', 3, 0, 1), +(441800, 440000, '清远市', '清远', '113.05122', '23.685022', 2, 0, 1), +(441802, 441800, '清城区', '清城', '113.0487', '23.688976', 3, 0, 1), +(441803, 441800, '清新区', '清新', '113.01658', '23.73474', 3, 0, 1), +(441821, 441800, '佛冈县', '佛冈', '113.534096', '23.86674', 3, 0, 1), +(441823, 441800, '阳山县', '阳山', '112.63402', '24.470285', 3, 0, 1), +(441825, 441800, '连山壮族瑶族自治县', '连山', '112.086555', '24.56727', 3, 0, 1), +(441826, 441800, '连南瑶族自治县', '连南', '112.29081', '24.719097', 3, 0, 1), +(441881, 441800, '英德市', '英德', '113.4054', '24.18612', 3, 0, 1), +(441882, 441800, '连州市', '连州', '112.37927', '24.783966', 3, 0, 1), +(441900, 440000, '东莞市', '东莞', '113.74626', '23.046238', 2, 0, 1), +(442000, 440000, '中山市', '中山', '113.38239', '22.521112', 2, 0, 1), +(445100, 440000, '潮州市', '潮州', '116.6323', '23.661701', 2, 0, 1), +(445102, 445100, '湘桥区', '湘桥', '116.63365', '23.664675', 3, 0, 1), +(445103, 445100, '潮安区', '潮安', '116.67809', '23.46244', 3, 0, 1), +(445122, 445100, '饶平县', '饶平', '117.00205', '23.66817', 3, 0, 1), +(445200, 440000, '揭阳市', '揭阳', '116.355736', '23.543777', 2, 0, 1), +(445202, 445200, '榕城区', '榕城', '116.35705', '23.535524', 3, 0, 1), +(445203, 445200, '揭东区', '揭东', '116.41211', '23.56606', 3, 0, 1), +(445222, 445200, '揭西县', '揭西', '115.83871', '23.4273', 3, 0, 1), +(445224, 445200, '惠来县', '惠来', '116.29583', '23.029835', 3, 0, 1), +(445281, 445200, '普宁市', '普宁', '116.165085', '23.29788', 3, 0, 1), +(445300, 440000, '云浮市', '云浮', '112.04444', '22.929802', 2, 0, 1), +(445302, 445300, '云城区', '云城', '112.04471', '22.930826', 3, 0, 1), +(445303, 445300, '云安区', '云安', '112.00324', '23.07101', 3, 0, 1), +(445321, 445300, '新兴县', '新兴', '112.23083', '22.703203', 3, 0, 1), +(445322, 445300, '郁南县', '郁南', '111.53592', '23.237709', 3, 0, 1), +(445381, 445300, '罗定市', '罗定', '111.5782', '22.765415', 3, 0, 1), +(450000, 0, '广西壮族自治区', '广西', '108.32001', '22.82402', 1, 0, 1), +(450100, 450000, '南宁市', '南宁', '108.32001', '22.82402', 2, 0, 1), +(450102, 450100, '兴宁区', '兴宁', '108.32019', '22.819511', 3, 0, 1), +(450103, 450100, '青秀区', '青秀', '108.346115', '22.816614', 3, 0, 1), +(450105, 450100, '江南区', '江南', '108.31048', '22.799593', 3, 0, 1), +(450107, 450100, '西乡塘区', '西乡塘', '108.3069', '22.832779', 3, 0, 1), +(450108, 450100, '良庆区', '良庆', '108.322105', '22.75909', 3, 0, 1), +(450109, 450100, '邕宁区', '邕宁', '108.48425', '22.756598', 3, 0, 1), +(450110, 450100, '武鸣区', '武鸣', '108.27461', '23.15866', 3, 0, 1), +(450123, 450100, '隆安县', '隆安', '107.68866', '23.174763', 3, 0, 1), +(450124, 450100, '马山县', '马山', '108.172905', '23.711758', 3, 0, 1), +(450125, 450100, '上林县', '上林', '108.603935', '23.431768', 3, 0, 1), +(450126, 450100, '宾阳县', '宾阳', '108.816734', '23.216885', 3, 0, 1), +(450127, 450100, '横县', '横县', '109.27099', '22.68743', 3, 0, 1), +(450200, 450000, '柳州市', '柳州', '109.411705', '24.314617', 2, 0, 1), +(450202, 450200, '城中区', '城中', '109.41175', '24.312325', 3, 0, 1), +(450203, 450200, '鱼峰区', '鱼峰', '109.41537', '24.303848', 3, 0, 1), +(450204, 450200, '柳南区', '柳南', '109.395935', '24.287012', 3, 0, 1), +(450205, 450200, '柳北区', '柳北', '109.40658', '24.359144', 3, 0, 1), +(450206, 450200, '柳江区', '柳江', '109.32672', '24.25465', 3, 0, 1), +(450222, 450200, '柳城县', '柳城', '109.24581', '24.65512', 3, 0, 1), +(450223, 450200, '鹿寨县', '鹿寨', '109.74081', '24.483404', 3, 0, 1), +(450224, 450200, '融安县', '融安', '109.40362', '25.214703', 3, 0, 1), +(450225, 450200, '融水苗族自治县', '融水', '109.25275', '25.068811', 3, 0, 1), +(450226, 450200, '三江侗族自治县', '三江', '109.614845', '25.78553', 3, 0, 1), +(450300, 450000, '桂林市', '桂林', '110.29912', '25.274216', 2, 0, 1), +(450302, 450300, '秀峰区', '秀峰', '110.29244', '25.278543', 3, 0, 1), +(450303, 450300, '叠彩区', '叠彩', '110.30078', '25.301334', 3, 0, 1), +(450304, 450300, '象山区', '象山', '110.28488', '25.261986', 3, 0, 1), +(450305, 450300, '七星区', '七星', '110.31757', '25.25434', 3, 0, 1), +(450311, 450300, '雁山区', '雁山', '110.305664', '25.077646', 3, 0, 1), +(450312, 450300, '临桂区', '临桂', '110.2124', '25.23868', 3, 0, 1), +(450321, 450300, '阳朔县', '阳朔', '110.4947', '24.77534', 3, 0, 1), +(450323, 450300, '灵川县', '灵川', '110.325714', '25.40854', 3, 0, 1), +(450324, 450300, '全州县', '全州', '111.07299', '25.929897', 3, 0, 1), +(450325, 450300, '兴安县', '兴安', '110.670784', '25.609554', 3, 0, 1), +(450326, 450300, '永福县', '永福', '109.989204', '24.986692', 3, 0, 1), +(450327, 450300, '灌阳县', '灌阳', '111.16025', '25.489098', 3, 0, 1), +(450328, 450300, '龙胜各族自治县', '龙胜', '110.00942', '25.796429', 3, 0, 1), +(450329, 450300, '资源县', '资源', '110.642586', '26.0342', 3, 0, 1), +(450330, 450300, '平乐县', '平乐', '110.64282', '24.632215', 3, 0, 1), +(450332, 450300, '恭城瑶族自治县', '恭城', '110.82952', '24.833612', 3, 0, 1), +(450381, 450300, '荔浦市', '荔浦', '110.39517', '24.48887', 3, 0, 1), +(450400, 450000, '梧州市', '梧州', '111.29761', '23.474804', 2, 0, 1), +(450403, 450400, '万秀区', '万秀', '111.31582', '23.471317', 3, 0, 1), +(450405, 450400, '长洲区', '长洲', '111.27568', '23.4777', 3, 0, 1), +(450406, 450400, '龙圩区', '龙圩', '111.24603', '23.40996', 3, 0, 1), +(450421, 450400, '苍梧县', '苍梧', '111.54401', '23.845097', 3, 0, 1), +(450422, 450400, '藤县', '藤县', '110.93182', '23.373962', 3, 0, 1), +(450423, 450400, '蒙山县', '蒙山', '110.5226', '24.19983', 3, 0, 1), +(450481, 450400, '岑溪市', '岑溪', '110.998116', '22.918406', 3, 0, 1), +(450500, 450000, '北海市', '北海', '109.119255', '21.473343', 2, 0, 1), +(450502, 450500, '海城区', '海城', '109.10753', '21.468443', 3, 0, 1), +(450503, 450500, '银海区', '银海', '109.118706', '21.444908', 3, 0, 1), +(450512, 450500, '铁山港区', '铁山港', '109.45058', '21.5928', 3, 0, 1), +(450521, 450500, '合浦县', '合浦', '109.20069', '21.663553', 3, 0, 1), +(450600, 450000, '防城港市', '防城港', '108.345474', '21.614632', 2, 0, 1), +(450602, 450600, '港口区', '港口', '108.34628', '21.614407', 3, 0, 1), +(450603, 450600, '防城区', '防城', '108.35843', '21.764757', 3, 0, 1), +(450621, 450600, '上思县', '上思', '107.98214', '22.151423', 3, 0, 1), +(450681, 450600, '东兴市', '东兴', '107.97017', '21.541172', 3, 0, 1), +(450700, 450000, '钦州市', '钦州', '108.624176', '21.967127', 2, 0, 1), +(450702, 450700, '钦南区', '钦南', '108.62663', '21.966808', 3, 0, 1), +(450703, 450700, '钦北区', '钦北', '108.44911', '22.132761', 3, 0, 1), +(450721, 450700, '灵山县', '灵山', '109.293465', '22.418041', 3, 0, 1), +(450722, 450700, '浦北县', '浦北', '109.55634', '22.268335', 3, 0, 1), +(450800, 450000, '贵港市', '贵港', '109.60214', '23.0936', 2, 0, 1), +(450802, 450800, '港北区', '港北', '109.59481', '23.107677', 3, 0, 1), +(450803, 450800, '港南区', '港南', '109.60467', '23.067516', 3, 0, 1), +(450804, 450800, '覃塘区', '覃塘', '109.415695', '23.132814', 3, 0, 1), +(450821, 450800, '平南县', '平南', '110.397484', '23.544546', 3, 0, 1), +(450881, 450800, '桂平市', '桂平', '110.07467', '23.382473', 3, 0, 1), +(450900, 450000, '玉林市', '玉林', '110.154396', '22.63136', 2, 0, 1), +(450902, 450900, '玉州区', '玉州', '110.154915', '22.632132', 3, 0, 1), +(450903, 450900, '福绵区', '福绵', '110.05143', '22.579947', 3, 0, 1), +(450921, 450900, '容县', '容县', '110.55247', '22.856436', 3, 0, 1), +(450922, 450900, '陆川县', '陆川', '110.26484', '22.321054', 3, 0, 1), +(450923, 450900, '博白县', '博白', '109.98', '22.271284', 3, 0, 1), +(450924, 450900, '兴业县', '兴业', '109.87777', '22.74187', 3, 0, 1), +(450981, 450900, '北流市', '北流', '110.34805', '22.701649', 3, 0, 1), +(451000, 450000, '百色市', '百色', '106.61629', '23.897741', 2, 0, 1), +(451002, 451000, '右江区', '右江', '106.61573', '23.897675', 3, 0, 1), +(451003, 451000, '田阳区', '田阳', '106.91567', '23.73567', 3, 0, 1), +(451022, 451000, '田东县', '田东', '107.12426', '23.600445', 3, 0, 1), +(451024, 451000, '德保县', '德保', '106.618164', '23.321465', 3, 0, 1), +(451026, 451000, '那坡县', '那坡', '105.83355', '23.400785', 3, 0, 1), +(451027, 451000, '凌云县', '凌云', '106.56487', '24.345642', 3, 0, 1), +(451028, 451000, '乐业县', '乐业', '106.55964', '24.782204', 3, 0, 1), +(451029, 451000, '田林县', '田林', '106.23505', '24.290262', 3, 0, 1), +(451030, 451000, '西林县', '西林', '105.095024', '24.49204', 3, 0, 1), +(451031, 451000, '隆林各族自治县', '隆林', '105.34236', '24.774319', 3, 0, 1), +(451081, 451000, '靖西市', '靖西', '106.41769', '23.13402', 3, 0, 1), +(451082, 451000, '平果市', '平果', '107.58988', '23.32934', 3, 0, 1), +(451100, 450000, '贺州市', '贺州', '111.552055', '24.41414', 2, 0, 1), +(451102, 451100, '八步区', '八步', '111.551994', '24.412445', 3, 0, 1), +(451103, 451100, '平桂区', '平桂', '111.47971', '24.45296', 3, 0, 1), +(451121, 451100, '昭平县', '昭平', '110.81087', '24.172958', 3, 0, 1), +(451122, 451100, '钟山县', '钟山', '111.30363', '24.528566', 3, 0, 1), +(451123, 451100, '富川瑶族自治县', '富川', '111.27723', '24.81896', 3, 0, 1), +(451200, 450000, '河池市', '河池', '108.0621', '24.695898', 2, 0, 1), +(451202, 451200, '金城江区', '金城江', '108.06213', '24.695625', 3, 0, 1), +(451203, 451200, '宜州区', '宜州', '108.63656', '24.48513', 3, 0, 1), +(451221, 451200, '南丹县', '南丹', '107.54661', '24.983192', 3, 0, 1), +(451222, 451200, '天峨县', '天峨', '107.17494', '24.985964', 3, 0, 1), +(451223, 451200, '凤山县', '凤山', '107.04459', '24.544561', 3, 0, 1), +(451224, 451200, '东兰县', '东兰', '107.373695', '24.509367', 3, 0, 1), +(451225, 451200, '罗城仫佬族自治县', '罗城', '108.90245', '24.779327', 3, 0, 1), +(451226, 451200, '环江毛南族自治县', '环江', '108.25867', '24.827627', 3, 0, 1), +(451227, 451200, '巴马瑶族自治县', '巴马', '107.25313', '24.139538', 3, 0, 1), +(451228, 451200, '都安瑶族自治县', '都安', '108.10276', '23.934963', 3, 0, 1), +(451229, 451200, '大化瑶族自治县', '大化', '107.9945', '23.739595', 3, 0, 1), +(451300, 450000, '来宾市', '来宾', '109.229774', '23.733767', 2, 0, 1), +(451302, 451300, '兴宾区', '兴宾', '109.23054', '23.732925', 3, 0, 1), +(451321, 451300, '忻城县', '忻城', '108.66736', '24.06478', 3, 0, 1), +(451322, 451300, '象州县', '象州', '109.684555', '23.959824', 3, 0, 1), +(451323, 451300, '武宣县', '武宣', '109.66287', '23.604162', 3, 0, 1), +(451324, 451300, '金秀瑶族自治县', '金秀', '110.18855', '24.134941', 3, 0, 1), +(451381, 451300, '合山市', '合山', '108.88858', '23.81311', 3, 0, 1), +(451400, 450000, '崇左市', '崇左', '107.35393', '22.404108', 2, 0, 1), +(451402, 451400, '江州区', '江州', '107.35445', '22.40469', 3, 0, 1), +(451421, 451400, '扶绥县', '扶绥', '107.91153', '22.63582', 3, 0, 1), +(451422, 451400, '宁明县', '宁明', '107.06762', '22.131353', 3, 0, 1), +(451423, 451400, '龙州县', '龙州', '106.857506', '22.343716', 3, 0, 1), +(451424, 451400, '大新县', '大新', '107.200806', '22.833368', 3, 0, 1), +(451425, 451400, '天等县', '天等', '107.14244', '23.082483', 3, 0, 1), +(451481, 451400, '凭祥市', '凭祥', '106.75904', '22.108883', 3, 0, 1), +(460000, 0, '海南省', '海南', '110.33119', '20.031971', 1, 0, 1), +(460100, 460000, '海口市', '海口', '110.33119', '20.031971', 2, 0, 1), +(460105, 460100, '秀英区', '秀英', '110.282394', '20.008144', 3, 0, 1), +(460106, 460100, '龙华区', '龙华', '110.330376', '20.031027', 3, 0, 1), +(460107, 460100, '琼山区', '琼山', '110.35472', '20.00105', 3, 0, 1), +(460108, 460100, '美兰区', '美兰', '110.35657', '20.03074', 3, 0, 1), +(460200, 460000, '三亚市', '三亚', '109.50827', '18.247871', 2, 0, 1), +(460202, 460200, '海棠区', '海棠', '109.7525', '18.40005', 3, 0, 1), +(460203, 460200, '吉阳区', '吉阳', '109.57841', '18.28225', 3, 0, 1), +(460204, 460200, '天涯区', '天涯', '109.45263', '18.29921', 3, 0, 1), +(460205, 460200, '崖州区', '崖州', '109.17186', '18.35753', 3, 0, 1), +(460300, 460000, '三沙市', '三沙', '112.34882', '16.83104', 2, 0, 1), +(460321, 460300, '西沙群岛', '西沙群岛', '112.338695', '16.831839', 3, 0, 1), +(460322, 460300, '南沙群岛', '南沙群岛', '112.338695', '16.831839', 3, 0, 1), +(460323, 460300, '中沙群岛的岛礁及其海域', '中沙群岛的岛礁及其海域', '112.338695', '16.831839', 3, 0, 1), +(460400, 460000, '儋州市', '儋州', '109.58069', '19.52093', 2, 0, 1), +(469001, 469000, '五指山市', '五指山', '109.51666', '18.77692', 3, 0, 1), +(469002, 469000, '琼海市', '琼海', '110.46678', '19.246012', 3, 0, 1), +(469005, 469000, '文昌市', '文昌', '110.753975', '19.612986', 3, 0, 1), +(469006, 469000, '万宁市', '万宁', '110.388794', '18.796215', 3, 0, 1), +(469007, 469000, '东方市', '东方', '108.653786', '19.10198', 3, 0, 1), +(469021, 469000, '定安县', '定安', '110.3593', '19.68121', 3, 0, 1), +(469022, 469000, '屯昌县', '屯昌', '110.10347', '19.35182', 3, 0, 1), +(469023, 469000, '澄迈县', '澄迈', '110.00487', '19.73849', 3, 0, 1), +(469024, 469000, '临高县', '临高', '109.69077', '19.91243', 3, 0, 1), +(469025, 469000, '白沙黎族自治县', '定安', '110.349236', '19.684965', 3, 0, 1), +(469026, 469000, '昌江黎族自治县', '屯昌', '110.102776', '19.362917', 3, 0, 1), +(469027, 469000, '乐东黎族自治县', '澄迈', '110.00715', '19.737095', 3, 0, 1), +(469028, 469000, '陵水黎族自治县', '临高', '109.6877', '19.908293', 3, 0, 1), +(469029, 469000, '保亭黎族苗族自治县', '保亭黎族苗族自治县', '109.70259', '18.63905', 3, 0, 1), +(469030, 469000, '琼中黎族苗族自治县', '白沙', '109.45261', '19.224585', 3, 0, 1), +(500000, 0, '重庆市', '重庆', '106.50496', '29.533155', 1, 0, 1), +(500100, 500000, '重庆市', '重庆', '106.50496', '29.533155', 2, 0, 1), +(500101, 500100, '万州区', '万州', '108.38025', '30.807808', 3, 0, 1), +(500102, 500100, '涪陵区', '涪陵', '107.394905', '29.703651', 3, 0, 1), +(500103, 500100, '渝中区', '渝中', '106.56288', '29.556742', 3, 0, 1), +(500104, 500100, '大渡口区', '大渡口', '106.48613', '29.481003', 3, 0, 1), +(500105, 500100, '江北区', '江北', '106.532845', '29.575352', 3, 0, 1), +(500106, 500100, '沙坪坝区', '沙坪坝', '106.4542', '29.541224', 3, 0, 1), +(500107, 500100, '九龙坡区', '九龙坡', '106.48099', '29.523493', 3, 0, 1), +(500108, 500100, '南岸区', '南岸', '106.560814', '29.523993', 3, 0, 1), +(500109, 500100, '北碚区', '北碚', '106.43787', '29.82543', 3, 0, 1), +(500110, 500100, '綦江区', '綦江', '106.92852', '28.96463', 3, 0, 1), +(500111, 500100, '大足区', '大足', '105.78017', '29.48604', 3, 0, 1), +(500112, 500100, '渝北区', '渝北', '106.51285', '29.601452', 3, 0, 1), +(500113, 500100, '巴南区', '巴南', '106.519424', '29.38192', 3, 0, 1), +(500114, 500100, '黔江区', '黔江', '108.78258', '29.527548', 3, 0, 1), +(500115, 500100, '长寿区', '长寿', '107.07485', '29.833672', 3, 0, 1), +(500116, 500100, '江津区', '江津', '106.25936', '29.29014', 3, 0, 1), +(500117, 500100, '合川区', '合川', '106.27679', '29.97288', 3, 0, 1), +(500118, 500100, '永川区', '永川', '105.92709', '29.356', 3, 0, 1), +(500119, 500100, '南川区', '南川', '107.09896', '29.15788', 3, 0, 1), +(500120, 500100, '璧山区', '璧山', '106.22742', '29.59202', 3, 0, 1), +(500151, 500100, '铜梁区', '铜梁', '106.05638', '29.84475', 3, 0, 1), +(500152, 500100, '潼南区', '潼南', '105.83952', '30.19054', 3, 0, 1), +(500153, 500100, '荣昌区', '荣昌', '105.61188', '29.41671', 3, 0, 1), +(500154, 500100, '开州区', '开州', '108.39311', '31.16098', 3, 0, 1), +(500155, 500100, '梁平区', '梁平', '107.80235', '30.67373', 3, 0, 1), +(500156, 500100, '武隆区', '武隆', '107.75993', '29.32543', 3, 0, 1), +(500229, 500100, '城口县', '城口', '108.6649', '31.946293', 3, 0, 1), +(500230, 500100, '丰都县', '丰都', '107.73248', '29.866425', 3, 0, 1), +(500231, 500100, '垫江县', '垫江', '107.348694', '30.330011', 3, 0, 1), +(500233, 500100, '忠县', '忠县', '108.03752', '30.291536', 3, 0, 1), +(500235, 500100, '云阳县', '云阳', '108.6977', '30.930529', 3, 0, 1), +(500236, 500100, '奉节县', '奉节', '109.465775', '31.019966', 3, 0, 1), +(500237, 500100, '巫山县', '巫山', '109.87893', '31.074842', 3, 0, 1), +(500238, 500100, '巫溪县', '巫溪', '109.628914', '31.3966', 3, 0, 1), +(500240, 500100, '石柱土家族自治县', '石柱', '108.11245', '29.99853', 3, 0, 1), +(500241, 500100, '秀山土家族苗族自治县', '秀山', '108.99604', '28.444773', 3, 0, 1), +(500242, 500100, '酉阳土家族苗族自治县', '酉阳', '108.767204', '28.839828', 3, 0, 1), +(500243, 500100, '彭水苗族土家族自治县', '彭水', '108.16655', '29.293856', 3, 0, 1), +(510000, 0, '四川省', '四川', '104.065735', '30.659462', 1, 0, 1), +(510100, 510000, '成都市', '成都', '104.065735', '30.659462', 2, 0, 1), +(510104, 510100, '锦江区', '锦江', '104.080986', '30.657688', 3, 0, 1), +(510105, 510100, '青羊区', '青羊', '104.05573', '30.667648', 3, 0, 1), +(510106, 510100, '金牛区', '金牛', '104.04349', '30.692059', 3, 0, 1), +(510107, 510100, '武侯区', '武侯', '104.05167', '30.630861', 3, 0, 1), +(510108, 510100, '成华区', '成华', '104.10308', '30.660275', 3, 0, 1), +(510112, 510100, '龙泉驿区', '龙泉驿', '104.26918', '30.56065', 3, 0, 1), +(510113, 510100, '青白江区', '青白江', '104.25494', '30.883438', 3, 0, 1), +(510114, 510100, '新都区', '新都', '104.16022', '30.824223', 3, 0, 1), +(510115, 510100, '温江区', '温江', '103.83678', '30.697996', 3, 0, 1), +(510116, 510100, '双流区', '双流', '103.92377', '30.57447', 3, 0, 1), +(510117, 510100, '郫都区', '郫都', '103.90256', '30.79589', 3, 0, 1), +(510118, 510100, '新津区', '新津', '', '', 3, 0, 1), +(510121, 510100, '金堂县', '金堂', '104.4156', '30.858418', 3, 0, 1), +(510129, 510100, '大邑县', '大邑', '103.5224', '30.586601', 3, 0, 1), +(510131, 510100, '蒲江县', '蒲江', '103.51154', '30.194359', 3, 0, 1), +(510181, 510100, '都江堰市', '都江堰', '103.6279', '30.99114', 3, 0, 1), +(510182, 510100, '彭州市', '彭州', '103.94117', '30.98516', 3, 0, 1), +(510183, 510100, '邛崃市', '邛崃', '103.46143', '30.41327', 3, 0, 1), +(510184, 510100, '崇州市', '崇州', '103.67105', '30.631477', 3, 0, 1), +(510185, 510100, '简阳市', '简阳', '104.54733', '30.41133', 3, 0, 1), +(510300, 510000, '自贡市', '自贡', '104.773445', '29.352764', 2, 0, 1), +(510302, 510300, '自流井区', '自流井', '104.77819', '29.343231', 3, 0, 1), +(510303, 510300, '贡井区', '贡井', '104.71437', '29.345675', 3, 0, 1), +(510304, 510300, '大安区', '大安', '104.783226', '29.367136', 3, 0, 1), +(510311, 510300, '沿滩区', '沿滩', '104.87642', '29.27252', 3, 0, 1), +(510321, 510300, '荣县', '荣县', '104.423935', '29.454851', 3, 0, 1), +(510322, 510300, '富顺县', '富顺', '104.98425', '29.181282', 3, 0, 1), +(510400, 510000, '攀枝花市', '攀枝花', '101.716', '26.580446', 2, 0, 1), +(510402, 510400, '东区', '东区', '101.71513', '26.580887', 3, 0, 1), +(510403, 510400, '西区', '西区', '101.63797', '26.596775', 3, 0, 1), +(510411, 510400, '仁和区', '仁和', '101.737915', '26.497185', 3, 0, 1), +(510421, 510400, '米易县', '米易', '102.10988', '26.887474', 3, 0, 1), +(510422, 510400, '盐边县', '盐边', '101.851845', '26.67762', 3, 0, 1), +(510500, 510000, '泸州市', '泸州', '105.44335', '28.889137', 2, 0, 1), +(510502, 510500, '江阳区', '江阳', '105.44513', '28.882889', 3, 0, 1), +(510503, 510500, '纳溪区', '纳溪', '105.37721', '28.77631', 3, 0, 1), +(510504, 510500, '龙马潭区', '龙马潭', '105.43523', '28.897572', 3, 0, 1), +(510521, 510500, '泸县', '泸县', '105.376335', '29.151287', 3, 0, 1), +(510522, 510500, '合江县', '合江', '105.8341', '28.810326', 3, 0, 1), +(510524, 510500, '叙永县', '叙永', '105.437775', '28.16792', 3, 0, 1), +(510525, 510500, '古蔺县', '古蔺', '105.81336', '28.03948', 3, 0, 1), +(510600, 510000, '德阳市', '德阳', '104.39865', '31.12799', 2, 0, 1), +(510603, 510600, '旌阳区', '旌阳', '104.38965', '31.130428', 3, 0, 1), +(510604, 510600, '罗江区', '罗江', '104.51021', '31.31681', 3, 0, 1), +(510623, 510600, '中江县', '中江', '104.67783', '31.03681', 3, 0, 1), +(510681, 510600, '广汉市', '广汉', '104.281906', '30.97715', 3, 0, 1), +(510682, 510600, '什邡市', '什邡', '104.17365', '31.12688', 3, 0, 1), +(510683, 510600, '绵竹市', '绵竹', '104.200165', '31.343084', 3, 0, 1), +(510700, 510000, '绵阳市', '绵阳', '104.74172', '31.46402', 2, 0, 1), +(510703, 510700, '涪城区', '涪城', '104.740974', '31.463556', 3, 0, 1), +(510704, 510700, '游仙区', '游仙', '104.770004', '31.484772', 3, 0, 1), +(510705, 510700, '安州区', '安州', '104.56735', '31.53465', 3, 0, 1), +(510722, 510700, '三台县', '三台', '105.09032', '31.090908', 3, 0, 1), +(510723, 510700, '盐亭县', '盐亭', '105.39199', '31.22318', 3, 0, 1), +(510725, 510700, '梓潼县', '梓潼', '105.16353', '31.635225', 3, 0, 1), +(510726, 510700, '北川羌族自治县', '北川', '104.46807', '31.615864', 3, 0, 1), +(510727, 510700, '平武县', '平武', '104.530556', '32.40759', 3, 0, 1), +(510781, 510700, '江油市', '江油', '104.74443', '31.776386', 3, 0, 1), +(510800, 510000, '广元市', '广元', '105.82976', '32.433666', 2, 0, 1), +(510802, 510800, '利州区', '利州', '105.826195', '32.432278', 3, 0, 1), +(510811, 510800, '昭化区', '昭化', '105.96412', '32.32279', 3, 0, 1), +(510812, 510800, '朝天区', '朝天', '105.88917', '32.64263', 3, 0, 1), +(510821, 510800, '旺苍县', '旺苍', '106.29043', '32.22833', 3, 0, 1), +(510822, 510800, '青川县', '青川', '105.238846', '32.585655', 3, 0, 1), +(510823, 510800, '剑阁县', '剑阁', '105.52704', '32.28652', 3, 0, 1), +(510824, 510800, '苍溪县', '苍溪', '105.939705', '31.73225', 3, 0, 1), +(510900, 510000, '遂宁市', '遂宁', '105.57133', '30.513311', 2, 0, 1), +(510903, 510900, '船山区', '船山', '105.582214', '30.502647', 3, 0, 1), +(510904, 510900, '安居区', '安居', '105.45938', '30.34612', 3, 0, 1), +(510921, 510900, '蓬溪县', '蓬溪', '105.7137', '30.774883', 3, 0, 1), +(510923, 510900, '大英县', '大英', '105.25219', '30.581572', 3, 0, 1), +(510981, 510900, '射洪市', '射洪', '105.38836', '30.87113', 3, 0, 1), +(511000, 510000, '内江市', '内江', '105.06614', '29.58708', 2, 0, 1), +(511002, 511000, '市中区', '市中', '105.06547', '29.585264', 3, 0, 1), +(511011, 511000, '东兴区', '东兴', '105.0672', '29.600107', 3, 0, 1), +(511024, 511000, '威远县', '威远', '104.66833', '29.52686', 3, 0, 1), +(511025, 511000, '资中县', '资中', '104.85246', '29.775295', 3, 0, 1), +(511083, 511000, '隆昌市', '隆昌', '105.28773', '29.33948', 3, 0, 1), +(511100, 510000, '乐山市', '乐山', '103.76126', '29.582024', 2, 0, 1), +(511102, 511100, '市中区', '市中', '103.75539', '29.588327', 3, 0, 1), +(511111, 511100, '沙湾区', '沙湾', '103.54996', '29.416536', 3, 0, 1), +(511112, 511100, '五通桥区', '五通桥', '103.81683', '29.406185', 3, 0, 1), +(511113, 511100, '金口河区', '金口河', '103.07783', '29.24602', 3, 0, 1), +(511123, 511100, '犍为县', '犍为', '103.94427', '29.209782', 3, 0, 1), +(511124, 511100, '井研县', '井研', '104.06885', '29.651646', 3, 0, 1), +(511126, 511100, '夹江县', '夹江', '103.578865', '29.741018', 3, 0, 1), +(511129, 511100, '沐川县', '沐川', '103.90211', '28.956339', 3, 0, 1), +(511132, 511100, '峨边彝族自治县', '峨边', '103.262146', '29.23027', 3, 0, 1), +(511133, 511100, '马边彝族自治县', '马边', '103.54685', '28.838934', 3, 0, 1), +(511181, 511100, '峨眉山市', '峨眉山', '103.492485', '29.597479', 3, 0, 1), +(511300, 510000, '南充市', '南充', '106.08298', '30.79528', 2, 0, 1), +(511302, 511300, '顺庆区', '顺庆', '106.08409', '30.795572', 3, 0, 1), +(511303, 511300, '高坪区', '高坪', '106.10899', '30.781809', 3, 0, 1), +(511304, 511300, '嘉陵区', '嘉陵', '106.067024', '30.762976', 3, 0, 1), +(511321, 511300, '南部县', '南部', '106.061134', '31.349407', 3, 0, 1), +(511322, 511300, '营山县', '营山', '106.564896', '31.075907', 3, 0, 1), +(511323, 511300, '蓬安县', '蓬安', '106.41349', '31.027979', 3, 0, 1), +(511324, 511300, '仪陇县', '仪陇', '106.29708', '31.271261', 3, 0, 1), +(511325, 511300, '西充县', '西充', '105.89302', '30.994616', 3, 0, 1), +(511381, 511300, '阆中市', '阆中', '105.975266', '31.580465', 3, 0, 1), +(511400, 510000, '眉山市', '眉山', '103.83179', '30.048319', 2, 0, 1), +(511402, 511400, '东坡区', '东坡', '103.83155', '30.048128', 3, 0, 1), +(511403, 511400, '彭山区', '彭山', '103.87283', '30.19299', 3, 0, 1), +(511421, 511400, '仁寿县', '仁寿', '104.147644', '29.996721', 3, 0, 1), +(511423, 511400, '洪雅县', '洪雅', '103.37501', '29.904867', 3, 0, 1), +(511424, 511400, '丹棱县', '丹棱', '103.51833', '30.01275', 3, 0, 1), +(511425, 511400, '青神县', '青神', '103.84613', '29.831469', 3, 0, 1), +(511500, 510000, '宜宾市', '宜宾', '104.63082', '28.76019', 2, 0, 1), +(511502, 511500, '翠屏区', '翠屏', '104.63023', '28.76018', 3, 0, 1), +(511503, 511500, '南溪区', '南溪', '104.96953', '28.84548', 3, 0, 1), +(511504, 511500, '叙州区', '叙州', '104.53316', '28.68998', 3, 0, 1), +(511523, 511500, '江安县', '江安', '105.068695', '28.728102', 3, 0, 1), +(511524, 511500, '长宁县', '长宁', '104.92112', '28.57727', 3, 0, 1), +(511525, 511500, '高县', '高县', '104.51919', '28.435677', 3, 0, 1), +(511526, 511500, '珙县', '珙县', '104.712265', '28.449041', 3, 0, 1), +(511527, 511500, '筠连县', '筠连', '104.50785', '28.162018', 3, 0, 1), +(511528, 511500, '兴文县', '兴文', '105.23655', '28.302988', 3, 0, 1), +(511529, 511500, '屏山县', '屏山', '104.16262', '28.64237', 3, 0, 1), +(511600, 510000, '广安市', '广安', '106.63337', '30.456398', 2, 0, 1), +(511602, 511600, '广安区', '广安', '106.632904', '30.456463', 3, 0, 1), +(511603, 511600, '前锋区', '前锋', '106.89328', '30.4963', 3, 0, 1), +(511621, 511600, '岳池县', '岳池', '106.44445', '30.533539', 3, 0, 1), +(511622, 511600, '武胜县', '武胜', '106.29247', '30.344292', 3, 0, 1), +(511623, 511600, '邻水县', '邻水', '106.93497', '30.334324', 3, 0, 1), +(511681, 511600, '华蓥市', '华蓥', '106.777885', '30.380573', 3, 0, 1), +(511700, 510000, '达州市', '达州', '107.50226', '31.209484', 2, 0, 1), +(511702, 511700, '通川区', '通川', '107.50106', '31.213522', 3, 0, 1), +(511703, 511700, '达川区', '达川', '107.51177', '31.19603', 3, 0, 1), +(511722, 511700, '宣汉县', '宣汉', '107.72225', '31.355024', 3, 0, 1), +(511723, 511700, '开江县', '开江', '107.864136', '31.085537', 3, 0, 1), +(511724, 511700, '大竹县', '大竹', '107.20742', '30.736288', 3, 0, 1), +(511725, 511700, '渠县', '渠县', '106.97075', '30.836348', 3, 0, 1), +(511781, 511700, '万源市', '万源', '108.037544', '32.06777', 3, 0, 1), +(511800, 510000, '雅安市', '雅安', '103.00103', '29.987722', 2, 0, 1), +(511802, 511800, '雨城区', '雨城', '103.003395', '29.98183', 3, 0, 1), +(511803, 511800, '名山区', '名山', '103.10954', '30.06982', 3, 0, 1), +(511822, 511800, '荥经县', '荥经', '102.84467', '29.795528', 3, 0, 1), +(511823, 511800, '汉源县', '汉源', '102.67715', '29.349915', 3, 0, 1), +(511824, 511800, '石棉县', '石棉', '102.35962', '29.234062', 3, 0, 1), +(511825, 511800, '天全县', '天全', '102.76346', '30.059956', 3, 0, 1), +(511826, 511800, '芦山县', '芦山', '102.92402', '30.152906', 3, 0, 1), +(511827, 511800, '宝兴县', '宝兴', '102.81338', '30.369026', 3, 0, 1), +(511900, 510000, '巴中市', '巴中', '106.75367', '31.858809', 2, 0, 1), +(511902, 511900, '巴州区', '巴州', '106.75367', '31.858366', 3, 0, 1), +(511903, 511900, '恩阳区', '恩阳', '106.63608', '31.789442', 3, 0, 1), +(511921, 511900, '通江县', '通江', '107.24762', '31.91212', 3, 0, 1), +(511922, 511900, '南江县', '南江', '106.843414', '32.353165', 3, 0, 1), +(511923, 511900, '平昌县', '平昌', '107.10194', '31.562815', 3, 0, 1), +(512000, 510000, '资阳市', '资阳', '104.641914', '30.122211', 2, 0, 1), +(512002, 512000, '雁江区', '雁江', '104.64234', '30.121687', 3, 0, 1), +(512021, 512000, '安岳县', '安岳', '105.33676', '30.099207', 3, 0, 1), +(512022, 512000, '乐至县', '乐至', '105.03114', '30.27562', 3, 0, 1), +(513200, 510000, '阿坝藏族羌族自治州', '阿坝', '102.221375', '31.899792', 2, 0, 1), +(513201, 513200, '马尔康市', '马尔康', '102.20644', '31.90585', 3, 0, 1), +(513221, 513200, '汶川县', '汶川', '103.58067', '31.47463', 3, 0, 1), +(513222, 513200, '理县', '理县', '103.16549', '31.436764', 3, 0, 1), +(513223, 513200, '茂县', '茂县', '103.850685', '31.680407', 3, 0, 1), +(513224, 513200, '松潘县', '松潘', '103.599174', '32.63838', 3, 0, 1), +(513225, 513200, '九寨沟县', '九寨沟', '104.23634', '33.262096', 3, 0, 1), +(513226, 513200, '金川县', '金川', '102.064644', '31.476357', 3, 0, 1), +(513227, 513200, '小金县', '小金', '102.36319', '30.999016', 3, 0, 1), +(513228, 513200, '黑水县', '黑水', '102.99081', '32.06172', 3, 0, 1), +(513230, 513200, '壤塘县', '壤塘', '100.97913', '32.26489', 3, 0, 1), +(513231, 513200, '阿坝县', '阿坝', '101.70099', '32.904224', 3, 0, 1), +(513232, 513200, '若尔盖县', '若尔盖', '102.96372', '33.575935', 3, 0, 1), +(513233, 513200, '红原县', '红原', '102.54491', '32.793903', 3, 0, 1), +(513300, 510000, '甘孜藏族自治州', '甘孜', '101.96381', '30.050663', 2, 0, 1), +(513301, 513300, '康定市', '康定', '101.96308', '30.05441', 3, 0, 1), +(513322, 513300, '泸定县', '泸定', '102.23322', '29.912481', 3, 0, 1), +(513323, 513300, '丹巴县', '丹巴', '101.88612', '30.877083', 3, 0, 1), +(513324, 513300, '九龙县', '九龙', '101.50694', '29.001974', 3, 0, 1), +(513325, 513300, '雅江县', '雅江', '101.01573', '30.03225', 3, 0, 1), +(513326, 513300, '道孚县', '道孚', '101.12333', '30.978767', 3, 0, 1), +(513327, 513300, '炉霍县', '炉霍', '100.6795', '31.392673', 3, 0, 1), +(513328, 513300, '甘孜县', '甘孜', '99.99175', '31.61975', 3, 0, 1), +(513329, 513300, '新龙县', '新龙', '100.312096', '30.93896', 3, 0, 1), +(513330, 513300, '德格县', '德格', '98.57999', '31.806728', 3, 0, 1), +(513331, 513300, '白玉县', '白玉', '98.82434', '31.208805', 3, 0, 1), +(513332, 513300, '石渠县', '石渠', '98.10088', '32.975304', 3, 0, 1), +(513333, 513300, '色达县', '色达', '100.33166', '32.268776', 3, 0, 1), +(513334, 513300, '理塘县', '理塘', '100.26986', '29.991808', 3, 0, 1), +(513335, 513300, '巴塘县', '巴塘', '99.10904', '30.005724', 3, 0, 1), +(513336, 513300, '乡城县', '乡城', '99.79994', '28.930855', 3, 0, 1), +(513337, 513300, '稻城县', '稻城', '100.29669', '29.037544', 3, 0, 1), +(513338, 513300, '得荣县', '得荣', '99.28803', '28.71134', 3, 0, 1), +(513400, 510000, '凉山彝族自治州', '凉山', '102.25874', '27.886763', 2, 0, 1), +(513401, 513400, '西昌市', '西昌', '102.25876', '27.885786', 3, 0, 1), +(513422, 513400, '木里藏族自治县', '木里', '101.28018', '27.926859', 3, 0, 1), +(513423, 513400, '盐源县', '盐源', '101.50891', '27.423414', 3, 0, 1), +(513424, 513400, '德昌县', '德昌', '102.17885', '27.403828', 3, 0, 1), +(513425, 513400, '会理县', '会理', '102.24955', '26.658703', 3, 0, 1), +(513426, 513400, '会东县', '会东', '102.57899', '26.630713', 3, 0, 1), +(513427, 513400, '宁南县', '宁南', '102.75738', '27.065205', 3, 0, 1), +(513428, 513400, '普格县', '普格', '102.541084', '27.376827', 3, 0, 1), +(513429, 513400, '布拖县', '布拖', '102.8088', '27.709063', 3, 0, 1), +(513430, 513400, '金阳县', '金阳', '103.2487', '27.695915', 3, 0, 1), +(513431, 513400, '昭觉县', '昭觉', '102.843994', '28.010553', 3, 0, 1), +(513432, 513400, '喜德县', '喜德', '102.41234', '28.305487', 3, 0, 1), +(513433, 513400, '冕宁县', '冕宁', '102.170044', '28.550844', 3, 0, 1), +(513434, 513400, '越西县', '越西', '102.50887', '28.639631', 3, 0, 1), +(513435, 513400, '甘洛县', '甘洛', '102.775925', '28.977095', 3, 0, 1), +(513436, 513400, '美姑县', '美姑', '103.132', '28.327946', 3, 0, 1), +(513437, 513400, '雷波县', '雷波', '103.57159', '28.262945', 3, 0, 1), +(520000, 0, '贵州省', '贵州', '106.71348', '26.578342', 1, 0, 1), +(520100, 520000, '贵阳市', '贵阳', '106.71348', '26.578342', 2, 0, 1), +(520102, 520100, '南明区', '南明', '106.715965', '26.573744', 3, 0, 1), +(520103, 520100, '云岩区', '云岩', '106.713394', '26.58301', 3, 0, 1), +(520111, 520100, '花溪区', '花溪', '106.67079', '26.410463', 3, 0, 1), +(520112, 520100, '乌当区', '乌当', '106.76212', '26.630928', 3, 0, 1), +(520113, 520100, '白云区', '白云', '106.63303', '26.67685', 3, 0, 1), +(520115, 520100, '观山湖区', '观山湖', '106.62254', '26.6015', 3, 0, 1), +(520121, 520100, '开阳县', '开阳', '106.96944', '27.056793', 3, 0, 1), +(520122, 520100, '息烽县', '息烽', '106.73769', '27.092665', 3, 0, 1), +(520123, 520100, '修文县', '修文', '106.59922', '26.840672', 3, 0, 1), +(520181, 520100, '清镇市', '清镇', '106.470276', '26.551289', 3, 0, 1), +(520200, 520000, '六盘水市', '六盘水', '104.84674', '26.584642', 2, 0, 1), +(520201, 520200, '钟山区', '钟山', '104.846245', '26.584805', 3, 0, 1), +(520203, 520200, '六枝特区', '六枝特', '105.474236', '26.210663', 3, 0, 1), +(520221, 520200, '水城县', '水城', '104.95685', '26.540478', 3, 0, 1), +(520281, 520200, '盘州市', '盘州', '104.47158', '25.70993', 3, 0, 1), +(520300, 520000, '遵义市', '遵义', '106.93726', '27.706627', 2, 0, 1), +(520302, 520300, '红花岗区', '红花岗', '106.94379', '27.694395', 3, 0, 1), +(520303, 520300, '汇川区', '汇川', '106.93726', '27.706627', 3, 0, 1), +(520304, 520300, '播州区', '播州', '106.82922', '27.53625', 3, 0, 1), +(520322, 520300, '桐梓县', '桐梓', '106.82659', '28.13156', 3, 0, 1), +(520323, 520300, '绥阳县', '绥阳', '107.191025', '27.951342', 3, 0, 1), +(520324, 520300, '正安县', '正安', '107.44187', '28.550337', 3, 0, 1), +(520325, 520300, '道真仡佬族苗族自治县', '道真', '107.60534', '28.880089', 3, 0, 1), +(520326, 520300, '务川仡佬族苗族自治县', '务川', '107.887856', '28.521566', 3, 0, 1), +(520327, 520300, '凤冈县', '凤冈', '107.72202', '27.960857', 3, 0, 1), +(520328, 520300, '湄潭县', '湄潭', '107.485725', '27.765839', 3, 0, 1), +(520329, 520300, '余庆县', '余庆', '107.89256', '27.221552', 3, 0, 1), +(520330, 520300, '习水县', '习水', '106.20095', '28.327826', 3, 0, 1), +(520381, 520300, '赤水市', '赤水', '105.69811', '28.587057', 3, 0, 1), +(520382, 520300, '仁怀市', '仁怀', '106.412476', '27.803377', 3, 0, 1), +(520400, 520000, '安顺市', '安顺', '105.93219', '26.245544', 2, 0, 1), +(520402, 520400, '西秀区', '西秀', '105.94617', '26.248323', 3, 0, 1), +(520403, 520400, '平坝区', '平坝', '106.2553', '26.40574', 3, 0, 1), +(520422, 520400, '普定县', '普定', '105.745605', '26.305794', 3, 0, 1), +(520423, 520400, '镇宁布依族苗族自治县', '镇宁', '105.768654', '26.056095', 3, 0, 1), +(520424, 520400, '关岭布依族苗族自治县', '关岭', '105.618454', '25.944248', 3, 0, 1), +(520425, 520400, '紫云苗族布依族自治县', '紫云', '106.08452', '25.751568', 3, 0, 1), +(520500, 520000, '毕节市', '毕节', '', '', 2, 0, 1), +(520502, 520500, '七星关区', '七星关', '105.30504', '27.29847', 3, 0, 1), +(520521, 520500, '大方县', '大方', '105.613', '27.14161', 3, 0, 1), +(520522, 520500, '黔西县', '黔西', '106.0323', '27.00866', 3, 0, 1), +(520523, 520500, '金沙县', '金沙', '106.22014', '27.45922', 3, 0, 1), +(520524, 520500, '织金县', '织金', '105.77488', '26.66301', 3, 0, 1), +(520525, 520500, '纳雍县', '纳雍', '105.38269', '26.7777', 3, 0, 1), +(520526, 520500, '威宁彝族回族苗族自治县', '威宁彝族回族苗族自治县', '104.27872', '26.85641', 3, 0, 1), +(520527, 520500, '赫章县', '赫章', '104.7274', '27.12328', 3, 0, 1), +(520600, 520000, '铜仁市', '铜仁', '', '', 2, 0, 1), +(520602, 520600, '碧江区', '碧江', '109.26433', '27.81621', 3, 0, 1), +(520603, 520600, '万山区', '万山', '109.21369', '27.51796', 3, 0, 1), +(520621, 520600, '江口县', '江口', '108.83967', '27.69956', 3, 0, 1), +(520622, 520600, '玉屏侗族自治县', '玉屏侗族自治县', '108.91212', '27.23637', 3, 0, 1), +(520623, 520600, '石阡县', '石阡', '108.2233', '27.51382', 3, 0, 1), +(520624, 520600, '思南县', '思南', '108.2528', '27.93886', 3, 0, 1), +(520625, 520600, '印江土家族苗族自治县', '印江土家族苗族自治县', '108.40958', '27.9941', 3, 0, 1), +(520626, 520600, '德江县', '德江', '108.11987', '28.26408', 3, 0, 1), +(520627, 520600, '沿河土家族自治县', '沿河土家族自治县', '108.50301', '28.56397', 3, 0, 1), +(520628, 520600, '松桃苗族自治县', '松桃苗族自治县', '109.20316', '28.15414', 3, 0, 1), +(522300, 520000, '黔西南布依族苗族自治州', '黔西南', '104.89797', '25.08812', 2, 0, 1), +(522301, 522300, '兴义市', '兴义', '104.89798', '25.088598', 3, 0, 1), +(522302, 522300, '兴仁市', '兴仁', '105.18639', '25.43511', 3, 0, 1), +(522323, 522300, '普安县', '普安', '104.955345', '25.786404', 3, 0, 1), +(522324, 522300, '晴隆县', '晴隆', '105.21877', '25.832882', 3, 0, 1), +(522325, 522300, '贞丰县', '贞丰', '105.65013', '25.385752', 3, 0, 1), +(522326, 522300, '望谟县', '望谟', '106.09156', '25.166668', 3, 0, 1), +(522327, 522300, '册亨县', '册亨', '105.81241', '24.983337', 3, 0, 1), +(522328, 522300, '安龙县', '安龙', '105.4715', '25.10896', 3, 0, 1), +(522600, 520000, '黔东南苗族侗族自治州', '黔东南', '107.977486', '26.583351', 2, 0, 1), +(522601, 522600, '凯里市', '凯里', '107.97754', '26.582964', 3, 0, 1), +(522622, 522600, '黄平县', '黄平', '107.90134', '26.896973', 3, 0, 1), +(522623, 522600, '施秉县', '施秉', '108.12678', '27.034657', 3, 0, 1), +(522624, 522600, '三穗县', '三穗', '108.68112', '26.959885', 3, 0, 1), +(522625, 522600, '镇远县', '镇远', '108.42365', '27.050234', 3, 0, 1), +(522626, 522600, '岑巩县', '岑巩', '108.81646', '27.173244', 3, 0, 1), +(522627, 522600, '天柱县', '天柱', '109.2128', '26.909683', 3, 0, 1), +(522628, 522600, '锦屏县', '锦屏', '109.20252', '26.680626', 3, 0, 1), +(522629, 522600, '剑河县', '剑河', '108.4405', '26.727348', 3, 0, 1), +(522630, 522600, '台江县', '台江', '108.31464', '26.669138', 3, 0, 1), +(522631, 522600, '黎平县', '黎平', '109.136505', '26.230637', 3, 0, 1), +(522632, 522600, '榕江县', '榕江', '108.52103', '25.931086', 3, 0, 1), +(522633, 522600, '从江县', '从江', '108.91265', '25.747059', 3, 0, 1), +(522634, 522600, '雷山县', '雷山', '108.07961', '26.381027', 3, 0, 1), +(522635, 522600, '麻江县', '麻江', '107.59317', '26.494802', 3, 0, 1), +(522636, 522600, '丹寨县', '丹寨', '107.79481', '26.199497', 3, 0, 1), +(522700, 520000, '黔南布依族苗族自治州', '黔南', '107.51716', '26.258219', 2, 0, 1), +(522701, 522700, '都匀市', '都匀', '107.51702', '26.258205', 3, 0, 1), +(522702, 522700, '福泉市', '福泉', '107.51351', '26.702509', 3, 0, 1), +(522722, 522700, '荔波县', '荔波', '107.8838', '25.41224', 3, 0, 1), +(522723, 522700, '贵定县', '贵定', '107.23359', '26.580807', 3, 0, 1), +(522725, 522700, '瓮安县', '瓮安', '107.47842', '27.06634', 3, 0, 1), +(522726, 522700, '独山县', '独山', '107.542755', '25.826283', 3, 0, 1), +(522727, 522700, '平塘县', '平塘', '107.32405', '25.831802', 3, 0, 1), +(522728, 522700, '罗甸县', '罗甸', '106.75001', '25.429893', 3, 0, 1), +(522729, 522700, '长顺县', '长顺', '106.44737', '26.022116', 3, 0, 1), +(522730, 522700, '龙里县', '龙里', '106.97773', '26.448809', 3, 0, 1), +(522731, 522700, '惠水县', '惠水', '106.657845', '26.128637', 3, 0, 1), +(522732, 522700, '三都水族自治县', '三都', '107.87747', '25.985184', 3, 0, 1), +(530000, 0, '云南省', '云南', '102.71225', '25.04061', 1, 0, 1), +(530100, 530000, '昆明市', '昆明', '102.71225', '25.04061', 2, 0, 1), +(530102, 530100, '五华区', '五华', '102.704414', '25.042166', 3, 0, 1), +(530103, 530100, '盘龙区', '盘龙', '102.72904', '25.070238', 3, 0, 1), +(530111, 530100, '官渡区', '官渡', '102.723434', '25.021212', 3, 0, 1), +(530112, 530100, '西山区', '西山', '102.7059', '25.02436', 3, 0, 1), +(530113, 530100, '东川区', '东川', '103.182', '26.08349', 3, 0, 1), +(530114, 530100, '呈贡区', '呈贡', '102.82147', '24.88554', 3, 0, 1), +(530115, 530100, '晋宁区', '晋宁', '102.59559', '24.66982', 3, 0, 1), +(530124, 530100, '富民县', '富民', '102.49789', '25.219667', 3, 0, 1), +(530125, 530100, '宜良县', '宜良', '103.14599', '24.918215', 3, 0, 1), +(530126, 530100, '石林彝族自治县', '石林', '103.271965', '24.754545', 3, 0, 1), +(530127, 530100, '嵩明县', '嵩明', '103.03878', '25.335087', 3, 0, 1), +(530128, 530100, '禄劝彝族苗族自治县', '禄劝', '102.46905', '25.556534', 3, 0, 1), +(530129, 530100, '寻甸回族彝族自治县', '寻甸', '103.25759', '25.559475', 3, 0, 1), +(530181, 530100, '安宁市', '安宁', '102.48554', '24.921785', 3, 0, 1), +(530300, 530000, '曲靖市', '曲靖', '103.79785', '25.501556', 2, 0, 1), +(530302, 530300, '麒麟区', '麒麟', '103.79806', '25.501268', 3, 0, 1), +(530303, 530300, '沾益区', '沾益', '103.82183', '25.60167', 3, 0, 1), +(530304, 530300, '马龙区', '马龙', '103.57834', '25.42807', 3, 0, 1), +(530322, 530300, '陆良县', '陆良', '103.655235', '25.022879', 3, 0, 1), +(530323, 530300, '师宗县', '师宗', '103.993805', '24.825682', 3, 0, 1), +(530324, 530300, '罗平县', '罗平', '104.309265', '24.885708', 3, 0, 1), +(530325, 530300, '富源县', '富源', '104.25692', '25.67064', 3, 0, 1), +(530326, 530300, '会泽县', '会泽', '103.30004', '26.41286', 3, 0, 1), +(530381, 530300, '宣威市', '宣威', '104.09554', '26.227777', 3, 0, 1), +(530400, 530000, '玉溪市', '玉溪', '102.54391', '24.35046', 2, 0, 1), +(530402, 530400, '红塔区', '红塔', '102.543465', '24.350754', 3, 0, 1), +(530403, 530400, '江川区', '江川', '102.75376', '24.28744', 3, 0, 1), +(530423, 530400, '通海县', '通海', '102.76004', '24.112206', 3, 0, 1), +(530424, 530400, '华宁县', '华宁', '102.928986', '24.189808', 3, 0, 1), +(530425, 530400, '易门县', '易门', '102.16211', '24.669598', 3, 0, 1), +(530426, 530400, '峨山彝族自治县', '峨山', '102.40436', '24.173256', 3, 0, 1), +(530427, 530400, '新平彝族傣族自治县', '新平', '101.990906', '24.0664', 3, 0, 1), +(530428, 530400, '元江哈尼族彝族傣族自治县', '元江', '101.99966', '23.597618', 3, 0, 1), +(530481, 530400, '澄江市', '澄江', '102.90819', '24.67379', 3, 0, 1), +(530500, 530000, '保山市', '保山', '99.16713', '25.111801', 2, 0, 1), +(530502, 530500, '隆阳区', '隆阳', '99.165825', '25.112144', 3, 0, 1), +(530521, 530500, '施甸县', '施甸', '99.18376', '24.730846', 3, 0, 1), +(530523, 530500, '龙陵县', '龙陵', '98.693565', '24.591911', 3, 0, 1), +(530524, 530500, '昌宁县', '昌宁', '99.61234', '24.823662', 3, 0, 1), +(530581, 530500, '腾冲市', '腾冲', '98.49097', '25.02053', 3, 0, 1), +(530600, 530000, '昭通市', '昭通', '103.71722', '27.337', 2, 0, 1), +(530602, 530600, '昭阳区', '昭阳', '103.71727', '27.336636', 3, 0, 1), +(530621, 530600, '鲁甸县', '鲁甸', '103.54933', '27.191637', 3, 0, 1), +(530622, 530600, '巧家县', '巧家', '102.92928', '26.9117', 3, 0, 1), +(530623, 530600, '盐津县', '盐津', '104.23506', '28.106922', 3, 0, 1), +(530624, 530600, '大关县', '大关', '103.89161', '27.747114', 3, 0, 1), +(530625, 530600, '永善县', '永善', '103.63732', '28.231525', 3, 0, 1), +(530626, 530600, '绥江县', '绥江', '103.9611', '28.599953', 3, 0, 1), +(530627, 530600, '镇雄县', '镇雄', '104.873055', '27.436268', 3, 0, 1), +(530628, 530600, '彝良县', '彝良', '104.04849', '27.627424', 3, 0, 1), +(530629, 530600, '威信县', '威信', '105.04869', '27.843382', 3, 0, 1), +(530681, 530600, '水富市', '水富', '104.41562', '28.63002', 3, 0, 1), +(530700, 530000, '丽江市', '丽江', '100.233025', '26.872108', 2, 0, 1), +(530702, 530700, '古城区', '古城', '100.23441', '26.872229', 3, 0, 1), +(530721, 530700, '玉龙纳西族自治县', '玉龙', '100.23831', '26.830593', 3, 0, 1), +(530722, 530700, '永胜县', '永胜', '100.7509', '26.685623', 3, 0, 1), +(530723, 530700, '华坪县', '华坪', '101.2678', '26.628834', 3, 0, 1), +(530724, 530700, '宁蒗彝族自治县', '宁蒗', '100.852425', '27.281109', 3, 0, 1), +(530800, 530000, '普洱市', '普洱', '100.97234', '22.77732', 2, 0, 1), +(530802, 530800, '思茅区', '思茅', '100.97323', '22.776594', 3, 0, 1), +(530821, 530800, '宁洱哈尼族彝族自治县', '宁洱', '101.04524', '23.062508', 3, 0, 1), +(530822, 530800, '墨江哈尼族自治县', '墨江', '101.68761', '23.428165', 3, 0, 1), +(530823, 530800, '景东彝族自治县', '景东', '100.84001', '24.448523', 3, 0, 1), +(530824, 530800, '景谷傣族彝族自治县', '景谷', '100.70142', '23.500278', 3, 0, 1), +(530825, 530800, '镇沅彝族哈尼族拉祜族自治县', '镇沅', '101.10851', '24.005713', 3, 0, 1), +(530826, 530800, '江城哈尼族彝族自治县', '江城', '101.859146', '22.58336', 3, 0, 1), +(530827, 530800, '孟连傣族拉祜族佤族自治县', '孟连', '99.5854', '22.325924', 3, 0, 1), +(530828, 530800, '澜沧拉祜族自治县', '澜沧', '99.9312', '22.553083', 3, 0, 1), +(530829, 530800, '西盟佤族自治县', '西盟', '99.594376', '22.644423', 3, 0, 1), +(530900, 530000, '临沧市', '临沧', '100.08697', '23.886566', 2, 0, 1), +(530902, 530900, '临翔区', '临翔', '100.08649', '23.886562', 3, 0, 1), +(530921, 530900, '凤庆县', '凤庆', '99.91871', '24.592737', 3, 0, 1), +(530922, 530900, '云县', '云县', '100.12563', '24.439026', 3, 0, 1), +(530923, 530900, '永德县', '永德', '99.25368', '24.028158', 3, 0, 1), +(530924, 530900, '镇康县', '镇康', '98.82743', '23.761415', 3, 0, 1), +(530925, 530900, '双江拉祜族佤族布朗族傣族自治县', '双江', '99.82442', '23.477476', 3, 0, 1), +(530926, 530900, '耿马傣族佤族自治县', '耿马', '99.4025', '23.534578', 3, 0, 1), +(530927, 530900, '沧源佤族自治县', '沧源', '99.2474', '23.146887', 3, 0, 1), +(532300, 530000, '楚雄彝族自治州', '楚雄', '101.54604', '25.041988', 2, 0, 1), +(532301, 532300, '楚雄市', '楚雄', '101.54614', '25.040913', 3, 0, 1), +(532322, 532300, '双柏县', '双柏', '101.63824', '24.685095', 3, 0, 1), +(532323, 532300, '牟定县', '牟定', '101.543045', '25.31211', 3, 0, 1), +(532324, 532300, '南华县', '南华', '101.274994', '25.192408', 3, 0, 1), +(532325, 532300, '姚安县', '姚安', '101.238396', '25.505404', 3, 0, 1), +(532326, 532300, '大姚县', '大姚', '101.3236', '25.722347', 3, 0, 1), +(532327, 532300, '永仁县', '永仁', '101.67117', '26.056316', 3, 0, 1), +(532328, 532300, '元谋县', '元谋', '101.870834', '25.703314', 3, 0, 1), +(532329, 532300, '武定县', '武定', '102.406784', '25.5301', 3, 0, 1), +(532331, 532300, '禄丰县', '禄丰', '102.07569', '25.14327', 3, 0, 1), +(532500, 530000, '红河哈尼族彝族自治州', '红河', '103.384186', '23.366776', 2, 0, 1), +(532501, 532500, '个旧市', '个旧', '103.154755', '23.360382', 3, 0, 1), +(532502, 532500, '开远市', '开远', '103.25868', '23.713833', 3, 0, 1), +(532503, 532500, '蒙自市', '蒙自', '103.36481', '23.39622', 3, 0, 1), +(532504, 532500, '弥勒市', '弥勒', '103.41499', '24.41059', 3, 0, 1), +(532523, 532500, '屏边苗族自治县', '屏边', '103.687225', '22.987013', 3, 0, 1), +(532524, 532500, '建水县', '建水', '102.820496', '23.618387', 3, 0, 1), +(532525, 532500, '石屏县', '石屏', '102.48447', '23.712568', 3, 0, 1), +(532527, 532500, '泸西县', '泸西', '103.75962', '24.532368', 3, 0, 1), +(532528, 532500, '元阳县', '元阳', '102.83706', '23.219772', 3, 0, 1), +(532529, 532500, '红河县', '红河', '102.42121', '23.36919', 3, 0, 1), +(532530, 532500, '金平苗族瑶族傣族自治县', '金平', '103.228355', '22.779982', 3, 0, 1), +(532531, 532500, '绿春县', '绿春', '102.39286', '22.99352', 3, 0, 1), +(532532, 532500, '河口瑶族自治县', '河口', '103.96159', '22.507563', 3, 0, 1), +(532600, 530000, '文山壮族苗族自治州', '文山', '104.24401', '23.36951', 2, 0, 1), +(532601, 532600, '文山市', '文山', '104.233', '23.38678', 3, 0, 1), +(532622, 532600, '砚山县', '砚山', '104.34399', '23.6123', 3, 0, 1), +(532623, 532600, '西畴县', '西畴', '104.67571', '23.437439', 3, 0, 1), +(532624, 532600, '麻栗坡县', '麻栗坡', '104.7019', '23.124203', 3, 0, 1), +(532625, 532600, '马关县', '马关', '104.39862', '23.011723', 3, 0, 1), +(532626, 532600, '丘北县', '丘北', '104.19437', '24.040981', 3, 0, 1), +(532627, 532600, '广南县', '广南', '105.05669', '24.050272', 3, 0, 1), +(532628, 532600, '富宁县', '富宁', '105.62856', '23.626493', 3, 0, 1), +(532800, 530000, '西双版纳傣族自治州', '西双版纳', '100.79794', '22.001724', 2, 0, 1), +(532801, 532800, '景洪市', '景洪', '100.79795', '22.002087', 3, 0, 1), +(532822, 532800, '勐海县', '勐海', '100.44829', '21.955866', 3, 0, 1), +(532823, 532800, '勐腊县', '勐腊', '101.567055', '21.479448', 3, 0, 1), +(532900, 530000, '大理白族自治州', '大理', '100.22567', '25.589449', 2, 0, 1), +(532901, 532900, '大理市', '大理', '100.24137', '25.593067', 3, 0, 1), +(532922, 532900, '漾濞彝族自治县', '漾濞', '99.95797', '25.669542', 3, 0, 1), +(532923, 532900, '祥云县', '祥云', '100.55402', '25.477072', 3, 0, 1), +(532924, 532900, '宾川县', '宾川', '100.57896', '25.825905', 3, 0, 1), +(532925, 532900, '弥渡县', '弥渡', '100.49067', '25.342594', 3, 0, 1), +(532926, 532900, '南涧彝族自治县', '南涧', '100.518684', '25.041279', 3, 0, 1), +(532927, 532900, '巍山彝族回族自治县', '巍山', '100.30793', '25.23091', 3, 0, 1), +(532928, 532900, '永平县', '永平', '99.53354', '25.46128', 3, 0, 1), +(532929, 532900, '云龙县', '云龙', '99.3694', '25.884954', 3, 0, 1), +(532930, 532900, '洱源县', '洱源', '99.951706', '26.111183', 3, 0, 1), +(532931, 532900, '剑川县', '剑川', '99.90588', '26.530066', 3, 0, 1), +(532932, 532900, '鹤庆县', '鹤庆', '100.17338', '26.55839', 3, 0, 1), +(533100, 530000, '德宏傣族景颇族自治州', '德宏', '98.57836', '24.436693', 2, 0, 1), +(533102, 533100, '瑞丽市', '瑞丽', '97.85588', '24.010735', 3, 0, 1), +(533103, 533100, '芒市', '芒市', '98.57761', '24.436699', 3, 0, 1), +(533122, 533100, '梁河县', '梁河', '98.298195', '24.80742', 3, 0, 1), +(533123, 533100, '盈江县', '盈江', '97.93393', '24.709541', 3, 0, 1), +(533124, 533100, '陇川县', '陇川', '97.79444', '24.184065', 3, 0, 1), +(533300, 530000, '怒江傈僳族自治州', '怒江', '98.8543', '25.850948', 2, 0, 1), +(533301, 533300, '泸水市', '泸水', '98.85804', '25.82306', 3, 0, 1), +(533323, 533300, '福贡县', '福贡', '98.86742', '26.902739', 3, 0, 1), +(533324, 533300, '贡山独龙族怒族自治县', '贡山', '98.66614', '27.738054', 3, 0, 1), +(533325, 533300, '兰坪白族普米族自治县', '兰坪', '99.42138', '26.453838', 3, 0, 1), +(533400, 530000, '迪庆藏族自治州', '迪庆', '99.70647', '27.826853', 2, 0, 1), +(533401, 533400, '香格里拉市', '香格里拉', '99.74317', '27.84254', 3, 0, 1), +(533422, 533400, '德钦县', '德钦', '98.91506', '28.483273', 3, 0, 1), +(533423, 533400, '维西傈僳族自治县', '维西', '99.286354', '27.180948', 3, 0, 1), +(540000, 0, '西藏自治区', '西藏', '91.13221', '29.66036', 1, 0, 1), +(540100, 540000, '拉萨市', '拉萨', '91.13221', '29.66036', 2, 0, 1), +(540102, 540100, '城关区', '城关', '91.13291', '29.659472', 3, 0, 1), +(540103, 540100, '堆龙德庆区', '堆龙德庆', '91.00338', '29.64602', 3, 0, 1), +(540104, 540100, '达孜区', '达孜', '91.34979', '29.66933', 3, 0, 1), +(540121, 540100, '林周县', '林周', '91.26184', '29.895754', 3, 0, 1), +(540122, 540100, '当雄县', '当雄', '91.10355', '30.47482', 3, 0, 1), +(540123, 540100, '尼木县', '尼木', '90.16554', '29.431347', 3, 0, 1), +(540124, 540100, '曲水县', '曲水', '90.73805', '29.349895', 3, 0, 1), +(540127, 540100, '墨竹工卡县', '墨竹工卡', '91.731155', '29.834658', 3, 0, 1), +(540200, 540000, '日喀则市', '日喀则', '', '', 2, 0, 1), +(540202, 540200, '桑珠孜区', '桑珠孜', '88.88697', '29.26969', 3, 0, 1), +(540221, 540200, '南木林县', '南木林', '89.09936', '29.68224', 3, 0, 1), +(540222, 540200, '江孜县', '江孜', '89.60558', '28.91152', 3, 0, 1), +(540223, 540200, '定日县', '定日', '87.12607', '28.65874', 3, 0, 1), +(540224, 540200, '萨迦县', '萨迦', '88.02172', '28.89919', 3, 0, 1), +(540225, 540200, '拉孜县', '拉孜', '87.63718', '29.08164', 3, 0, 1), +(540226, 540200, '昂仁县', '昂仁', '87.23617', '29.29482', 3, 0, 1), +(540227, 540200, '谢通门县', '谢通门', '88.26166', '29.43234', 3, 0, 1), +(540228, 540200, '白朗县', '白朗', '89.26156', '29.10919', 3, 0, 1), +(540229, 540200, '仁布县', '仁布', '89.842', '29.23089', 3, 0, 1), +(540230, 540200, '康马县', '康马', '89.68169', '28.55567', 3, 0, 1), +(540231, 540200, '定结县', '定结', '87.76606', '28.36408', 3, 0, 1), +(540232, 540200, '仲巴县', '仲巴', '84.02454', '29.72419', 3, 0, 1), +(540233, 540200, '亚东县', '亚东', '88.90708', '27.48592', 3, 0, 1), +(540234, 540200, '吉隆县', '吉隆', '85.29737', '28.85254', 3, 0, 1), +(540235, 540200, '聂拉木县', '聂拉木', '85.98232', '28.15499', 3, 0, 1), +(540236, 540200, '萨嘎县', '萨嘎', '85.23421', '29.32943', 3, 0, 1), +(540237, 540200, '岗巴县', '岗巴', '88.52015', '28.2746', 3, 0, 1), +(540300, 540000, '昌都市', '昌都', '', '', 2, 0, 1), +(540302, 540300, '卡若区', '卡若', '97.18039', '31.13831', 3, 0, 1), +(540321, 540300, '江达县', '江达', '98.21822', '31.49968', 3, 0, 1), +(540322, 540300, '贡觉县', '贡觉', '98.2708', '30.86016', 3, 0, 1), +(540323, 540300, '类乌齐县', '类乌齐', '96.6002', '31.21155', 3, 0, 1), +(540324, 540300, '丁青县', '丁青', '95.59572', '31.4125', 3, 0, 1), +(540325, 540300, '察雅县', '察雅', '97.56877', '30.65363', 3, 0, 1), +(540326, 540300, '八宿县', '八宿', '96.91785', '30.0532', 3, 0, 1), +(540327, 540300, '左贡县', '左贡', '97.84085', '29.67091', 3, 0, 1), +(540328, 540300, '芒康县', '芒康', '98.59312', '29.68008', 3, 0, 1), +(540329, 540300, '洛隆县', '洛隆', '95.82482', '30.74181', 3, 0, 1), +(540330, 540300, '边坝县', '边坝', '94.7079', '30.93345', 3, 0, 1), +(540400, 540000, '林芝市', '林芝', '', '', 2, 0, 1), +(540402, 540400, '巴宜区', '巴宜', '94.36119', '29.63654', 3, 0, 1), +(540421, 540400, '工布江达县', '工布江达', '93.24611', '29.88531', 3, 0, 1), +(540422, 540400, '米林县', '米林', '94.21315', '29.21607', 3, 0, 1), +(540423, 540400, '墨脱县', '墨脱', '95.33304', '29.32521', 3, 0, 1), +(540424, 540400, '波密县', '波密', '95.76761', '29.85903', 3, 0, 1), +(540425, 540400, '察隅县', '察隅', '97.46687', '28.66154', 3, 0, 1), +(540426, 540400, '朗县', '朗县', '93.07482', '29.04607', 3, 0, 1), +(540500, 540000, '山南市', '山南', '', '', 2, 0, 1), +(540502, 540500, '乃东区', '乃东', '91.76141', '29.22484', 3, 0, 1), +(540521, 540500, '扎囊县', '扎囊', '91.33735', '29.245', 3, 0, 1), +(540522, 540500, '贡嘎县', '贡嘎', '90.98421', '29.28947', 3, 0, 1), +(540523, 540500, '桑日县', '桑日', '92.01579', '29.25906', 3, 0, 1), +(540524, 540500, '琼结县', '琼结', '91.68385', '29.02464', 3, 0, 1), +(540525, 540500, '曲松县', '曲松', '92.20222', '29.06277', 3, 0, 1), +(540526, 540500, '措美县', '措美', '91.43361', '28.43793', 3, 0, 1), +(540527, 540500, '洛扎县', '洛扎', '90.85998', '28.38569', 3, 0, 1), +(540528, 540500, '加查县', '加查', '92.59387', '29.14023', 3, 0, 1), +(540529, 540500, '隆子县', '隆子', '92.46177', '28.40681', 3, 0, 1), +(540530, 540500, '错那县', '错那', '91.9571', '27.99099', 3, 0, 1), +(540531, 540500, '浪卡子县', '浪卡子', '90.40011', '28.96768', 3, 0, 1), +(540600, 540000, '那曲市', '那曲', '', '', 2, 0, 1), +(540602, 540600, '色尼区', '色尼', '92.05355', '31.46988', 3, 0, 1), +(540621, 540600, '嘉黎县', '嘉黎', '93.23236', '30.64087', 3, 0, 1), +(540622, 540600, '比如县', '比如', '93.6813', '31.47785', 3, 0, 1), +(540623, 540600, '聂荣县', '聂荣', '92.30327', '32.10784', 3, 0, 1), +(540624, 540600, '安多县', '安多', '91.68258', '32.265', 3, 0, 1), +(540625, 540600, '申扎县', '申扎', '88.70982', '30.93043', 3, 0, 1), +(540626, 540600, '索县', '索县', '93.78556', '31.88673', 3, 0, 1), +(540627, 540600, '班戈县', '班戈', '90.00987', '31.39199', 3, 0, 1), +(540628, 540600, '巴青县', '巴青', '94.05345', '31.9184', 3, 0, 1), +(540629, 540600, '尼玛县', '尼玛', '87.23691', '31.78448', 3, 0, 1), +(540630, 540600, '双湖县', '双湖', '88.83691', '33.18763', 3, 0, 1), +(542500, 540000, '阿里地区', '阿里', '80.1055', '32.503185', 2, 0, 1), +(542521, 542500, '普兰县', '普兰', '81.17759', '30.291897', 3, 0, 1), +(542522, 542500, '札达县', '札达', '79.80319', '31.478586', 3, 0, 1), +(542523, 542500, '噶尔县', '噶尔', '80.105', '32.503372', 3, 0, 1), +(542524, 542500, '日土县', '日土', '79.73193', '33.382454', 3, 0, 1), +(542525, 542500, '革吉县', '革吉', '81.1429', '32.38919', 3, 0, 1), +(542526, 542500, '改则县', '改则', '84.062386', '32.302074', 3, 0, 1), +(542527, 542500, '措勤县', '措勤', '85.159256', '31.016773', 3, 0, 1), +(610000, 0, '陕西省', '陕西', '108.94802', '34.26316', 1, 0, 1), +(610100, 610000, '西安市', '西安', '108.94802', '34.26316', 2, 0, 1), +(610102, 610100, '新城区', '新城', '108.9599', '34.26927', 3, 0, 1), +(610103, 610100, '碑林区', '碑林', '108.94699', '34.25106', 3, 0, 1), +(610104, 610100, '莲湖区', '莲湖', '108.9332', '34.2656', 3, 0, 1), +(610111, 610100, '灞桥区', '灞桥', '109.06726', '34.267452', 3, 0, 1), +(610112, 610100, '未央区', '未央', '108.94602', '34.30823', 3, 0, 1), +(610113, 610100, '雁塔区', '雁塔', '108.92659', '34.21339', 3, 0, 1), +(610114, 610100, '阎良区', '阎良', '109.22802', '34.66214', 3, 0, 1), +(610115, 610100, '临潼区', '临潼', '109.21399', '34.372066', 3, 0, 1), +(610116, 610100, '长安区', '长安', '108.94158', '34.157097', 3, 0, 1), +(610117, 610100, '高陵区', '高陵', '109.08822', '34.53487', 3, 0, 1), +(610118, 610100, '鄠邑区', '鄠邑', '108.60494', '34.10847', 3, 0, 1), +(610122, 610100, '蓝田县', '蓝田', '109.317635', '34.15619', 3, 0, 1), +(610124, 610100, '周至县', '周至', '108.21647', '34.161533', 3, 0, 1), +(610200, 610000, '铜川市', '铜川', '108.97961', '34.91658', 2, 0, 1), +(610202, 610200, '王益区', '王益', '109.07586', '35.0691', 3, 0, 1), +(610203, 610200, '印台区', '印台', '109.100815', '35.111927', 3, 0, 1), +(610204, 610200, '耀州区', '耀州', '108.96254', '34.910206', 3, 0, 1), +(610222, 610200, '宜君县', '宜君', '109.11828', '35.398766', 3, 0, 1), +(610300, 610000, '宝鸡市', '宝鸡', '107.14487', '34.369316', 2, 0, 1), +(610302, 610300, '渭滨区', '渭滨', '107.14447', '34.37101', 3, 0, 1), +(610303, 610300, '金台区', '金台', '107.14994', '34.37519', 3, 0, 1), +(610304, 610300, '陈仓区', '陈仓', '107.383644', '34.35275', 3, 0, 1), +(610322, 610300, '凤翔县', '凤翔', '107.40057', '34.521667', 3, 0, 1), +(610323, 610300, '岐山县', '岐山', '107.624466', '34.44296', 3, 0, 1), +(610324, 610300, '扶风县', '扶风', '107.89142', '34.375496', 3, 0, 1), +(610326, 610300, '眉县', '眉县', '107.75237', '34.272137', 3, 0, 1), +(610327, 610300, '陇县', '陇县', '106.85706', '34.89326', 3, 0, 1), +(610328, 610300, '千阳县', '千阳', '107.13299', '34.642586', 3, 0, 1), +(610329, 610300, '麟游县', '麟游', '107.79661', '34.677715', 3, 0, 1), +(610330, 610300, '凤县', '凤县', '106.525215', '33.912464', 3, 0, 1), +(610331, 610300, '太白县', '太白', '107.316536', '34.059216', 3, 0, 1), +(610400, 610000, '咸阳市', '咸阳', '108.70512', '34.33344', 2, 0, 1), +(610402, 610400, '秦都区', '秦都', '108.69864', '34.3298', 3, 0, 1), +(610403, 610400, '杨陵区', '杨陵', '108.08635', '34.27135', 3, 0, 1), +(610404, 610400, '渭城区', '渭城', '108.73096', '34.336845', 3, 0, 1), +(610422, 610400, '三原县', '三原', '108.94348', '34.613995', 3, 0, 1), +(610423, 610400, '泾阳县', '泾阳', '108.83784', '34.528492', 3, 0, 1), +(610424, 610400, '乾县', '乾县', '108.247406', '34.52726', 3, 0, 1), +(610425, 610400, '礼泉县', '礼泉', '108.428314', '34.482582', 3, 0, 1), +(610426, 610400, '永寿县', '永寿', '108.14313', '34.69262', 3, 0, 1), +(610428, 610400, '长武县', '长武', '107.79584', '35.206123', 3, 0, 1), +(610429, 610400, '旬邑县', '旬邑', '108.337234', '35.112232', 3, 0, 1), +(610430, 610400, '淳化县', '淳化', '108.58118', '34.79797', 3, 0, 1), +(610431, 610400, '武功县', '武功', '108.21286', '34.25973', 3, 0, 1), +(610481, 610400, '兴平市', '兴平', '108.488495', '34.297134', 3, 0, 1), +(610482, 610400, '彬州市', '彬州', '108.08108', '35.03565', 3, 0, 1), +(610500, 610000, '渭南市', '渭南', '109.502884', '34.499382', 2, 0, 1), +(610502, 610500, '临渭区', '临渭', '109.503296', '34.50127', 3, 0, 1), +(610503, 610500, '华州区', '华州', '109.7719', '34.51259', 3, 0, 1), +(610522, 610500, '潼关县', '潼关', '110.24726', '34.544514', 3, 0, 1), +(610523, 610500, '大荔县', '大荔', '109.94312', '34.79501', 3, 0, 1), +(610524, 610500, '合阳县', '合阳', '110.14798', '35.2371', 3, 0, 1), +(610525, 610500, '澄城县', '澄城', '109.93761', '35.184', 3, 0, 1), +(610526, 610500, '蒲城县', '蒲城', '109.58965', '34.956036', 3, 0, 1), +(610527, 610500, '白水县', '白水', '109.59431', '35.17729', 3, 0, 1), +(610528, 610500, '富平县', '富平', '109.18717', '34.746677', 3, 0, 1), +(610581, 610500, '韩城市', '韩城', '110.45239', '35.47524', 3, 0, 1), +(610582, 610500, '华阴市', '华阴', '110.08952', '34.565357', 3, 0, 1), +(610600, 610000, '延安市', '延安', '109.49081', '36.59654', 2, 0, 1), +(610602, 610600, '宝塔区', '宝塔', '109.49069', '36.59629', 3, 0, 1), +(610603, 610600, '安塞区', '安塞', '109.32897', '36.86373', 3, 0, 1), +(610621, 610600, '延长县', '延长', '110.01296', '36.578304', 3, 0, 1), +(610622, 610600, '延川县', '延川', '110.190315', '36.882065', 3, 0, 1), +(610625, 610600, '志丹县', '志丹', '108.7689', '36.823032', 3, 0, 1), +(610626, 610600, '吴起县', '吴起', '108.17698', '36.92485', 3, 0, 1), +(610627, 610600, '甘泉县', '甘泉', '109.34961', '36.27773', 3, 0, 1), +(610628, 610600, '富县', '富县', '109.38413', '35.996494', 3, 0, 1), +(610629, 610600, '洛川县', '洛川', '109.435715', '35.762135', 3, 0, 1), +(610630, 610600, '宜川县', '宜川', '110.17554', '36.050392', 3, 0, 1), +(610631, 610600, '黄龙县', '黄龙', '109.83502', '35.583275', 3, 0, 1), +(610632, 610600, '黄陵县', '黄陵', '109.26247', '35.580166', 3, 0, 1), +(610681, 610600, '子长市', '子长', '109.67538', '37.14258', 3, 0, 1), +(610700, 610000, '汉中市', '汉中', '107.02862', '33.077667', 2, 0, 1), +(610702, 610700, '汉台区', '汉台', '107.02824', '33.077675', 3, 0, 1), +(610703, 610700, '南郑区', '南郑', '106.93624', '32.99932', 3, 0, 1), +(610722, 610700, '城固县', '城固', '107.32989', '33.1531', 3, 0, 1), +(610723, 610700, '洋县', '洋县', '107.549965', '33.22328', 3, 0, 1), +(610724, 610700, '西乡县', '西乡', '107.76586', '32.98796', 3, 0, 1), +(610725, 610700, '勉县', '勉县', '106.680176', '33.155617', 3, 0, 1), +(610726, 610700, '宁强县', '宁强', '106.25739', '32.830807', 3, 0, 1), +(610727, 610700, '略阳县', '略阳', '106.1539', '33.32964', 3, 0, 1), +(610728, 610700, '镇巴县', '镇巴', '107.89531', '32.535854', 3, 0, 1), +(610729, 610700, '留坝县', '留坝', '106.92438', '33.61334', 3, 0, 1), +(610730, 610700, '佛坪县', '佛坪', '107.98858', '33.520744', 3, 0, 1), +(610800, 610000, '榆林市', '榆林', '109.741196', '38.29016', 2, 0, 1), +(610802, 610800, '榆阳区', '榆阳', '109.74791', '38.299267', 3, 0, 1), +(610803, 610800, '横山区', '横山', '109.29315', '37.95871', 3, 0, 1), +(610822, 610800, '府谷县', '府谷', '111.06965', '39.029243', 3, 0, 1), +(610824, 610800, '靖边县', '靖边', '108.80567', '37.596085', 3, 0, 1), +(610825, 610800, '定边县', '定边', '107.60128', '37.59523', 3, 0, 1), +(610826, 610800, '绥德县', '绥德', '110.26537', '37.5077', 3, 0, 1), +(610827, 610800, '米脂县', '米脂', '110.17868', '37.759083', 3, 0, 1), +(610828, 610800, '佳县', '佳县', '110.49337', '38.0216', 3, 0, 1), +(610829, 610800, '吴堡县', '吴堡', '110.73931', '37.451923', 3, 0, 1), +(610830, 610800, '清涧县', '清涧', '110.12146', '37.087704', 3, 0, 1), +(610831, 610800, '子洲县', '子洲', '110.03457', '37.611572', 3, 0, 1), +(610881, 610800, '神木市', '神木', '110.49896', '38.84239', 3, 0, 1), +(610900, 610000, '安康市', '安康', '109.029274', '32.6903', 2, 0, 1), +(610902, 610900, '汉滨区', '汉滨', '109.0291', '32.69082', 3, 0, 1), +(610921, 610900, '汉阴县', '汉阴', '108.51095', '32.89112', 3, 0, 1), +(610922, 610900, '石泉县', '石泉', '108.25051', '33.038513', 3, 0, 1), +(610923, 610900, '宁陕县', '宁陕', '108.31371', '33.312183', 3, 0, 1), +(610924, 610900, '紫阳县', '紫阳', '108.53779', '32.520176', 3, 0, 1), +(610925, 610900, '岚皋县', '岚皋', '108.900665', '32.31069', 3, 0, 1), +(610926, 610900, '平利县', '平利', '109.36186', '32.38793', 3, 0, 1), +(610927, 610900, '镇坪县', '镇坪', '109.526436', '31.883394', 3, 0, 1), +(610928, 610900, '旬阳县', '旬阳', '109.36815', '32.83357', 3, 0, 1), +(610929, 610900, '白河县', '白河', '110.11419', '32.809483', 3, 0, 1), +(611000, 610000, '商洛市', '商洛', '109.93977', '33.86832', 2, 0, 1), +(611002, 611000, '商州区', '商州', '109.93768', '33.86921', 3, 0, 1), +(611021, 611000, '洛南县', '洛南', '110.14571', '34.0885', 3, 0, 1), +(611022, 611000, '丹凤县', '丹凤', '110.33191', '33.69471', 3, 0, 1), +(611023, 611000, '商南县', '商南', '110.88544', '33.526367', 3, 0, 1), +(611024, 611000, '山阳县', '山阳', '109.88043', '33.53041', 3, 0, 1), +(611025, 611000, '镇安县', '镇安', '109.15108', '33.42398', 3, 0, 1), +(611026, 611000, '柞水县', '柞水', '109.11125', '33.682774', 3, 0, 1), +(620000, 0, '甘肃省', '甘肃', '103.823555', '36.05804', 1, 0, 1), +(620100, 620000, '兰州市', '兰州', '103.823555', '36.05804', 2, 0, 1), +(620102, 620100, '城关区', '城关', '103.841034', '36.049114', 3, 0, 1), +(620103, 620100, '七里河区', '七里河', '103.784325', '36.06673', 3, 0, 1), +(620104, 620100, '西固区', '西固', '103.62233', '36.10037', 3, 0, 1), +(620105, 620100, '安宁区', '安宁', '103.72404', '36.10329', 3, 0, 1), +(620111, 620100, '红古区', '红古', '102.86182', '36.344177', 3, 0, 1), +(620121, 620100, '永登县', '永登', '103.2622', '36.73443', 3, 0, 1), +(620122, 620100, '皋兰县', '皋兰', '103.94933', '36.331253', 3, 0, 1), +(620123, 620100, '榆中县', '榆中', '104.114975', '35.84443', 3, 0, 1), +(620200, 620000, '嘉峪关市', '嘉峪关', '98.277306', '39.78653', 2, 0, 1), +(620300, 620000, '金昌市', '金昌', '102.18789', '38.514236', 2, 0, 1), +(620302, 620300, '金川区', '金川', '102.18768', '38.513794', 3, 0, 1), +(620321, 620300, '永昌县', '永昌', '101.971954', '38.247353', 3, 0, 1), +(620400, 620000, '白银市', '白银', '104.17361', '36.54568', 2, 0, 1), +(620402, 620400, '白银区', '白银', '104.17425', '36.54565', 3, 0, 1), +(620403, 620400, '平川区', '平川', '104.81921', '36.72921', 3, 0, 1), +(620421, 620400, '靖远县', '靖远', '104.68697', '36.561424', 3, 0, 1), +(620422, 620400, '会宁县', '会宁', '105.05434', '35.692486', 3, 0, 1), +(620423, 620400, '景泰县', '景泰', '104.06639', '37.19352', 3, 0, 1), +(620500, 620000, '天水市', '天水', '105.725', '34.57853', 2, 0, 1), +(620502, 620500, '秦州区', '秦州', '105.72448', '34.578644', 3, 0, 1), +(620503, 620500, '麦积区', '麦积', '105.89763', '34.563503', 3, 0, 1), +(620521, 620500, '清水县', '清水', '106.13988', '34.75287', 3, 0, 1), +(620522, 620500, '秦安县', '秦安', '105.6733', '34.862354', 3, 0, 1), +(620523, 620500, '甘谷县', '甘谷', '105.332344', '34.747326', 3, 0, 1), +(620524, 620500, '武山县', '武山', '104.89169', '34.721954', 3, 0, 1), +(620525, 620500, '张家川回族自治县', '张家川', '106.21242', '34.993237', 3, 0, 1), +(620600, 620000, '武威市', '武威', '102.6347', '37.929996', 2, 0, 1), +(620602, 620600, '凉州区', '凉州', '102.63449', '37.93025', 3, 0, 1), +(620621, 620600, '民勤县', '民勤', '103.09065', '38.624622', 3, 0, 1), +(620622, 620600, '古浪县', '古浪', '102.89805', '37.47057', 3, 0, 1), +(620623, 620600, '天祝藏族自治县', '天祝', '103.14204', '36.97168', 3, 0, 1), +(620700, 620000, '张掖市', '张掖', '100.455475', '38.932896', 2, 0, 1), +(620702, 620700, '甘州区', '甘州', '100.454865', '38.931774', 3, 0, 1), +(620721, 620700, '肃南裕固族自治县', '肃南', '99.61709', '38.83727', 3, 0, 1), +(620722, 620700, '民乐县', '民乐', '100.81662', '38.434456', 3, 0, 1), +(620723, 620700, '临泽县', '临泽', '100.166336', '39.15215', 3, 0, 1), +(620724, 620700, '高台县', '高台', '99.81665', '39.37631', 3, 0, 1), +(620725, 620700, '山丹县', '山丹', '101.08844', '38.78484', 3, 0, 1), +(620800, 620000, '平凉市', '平凉', '106.68469', '35.54279', 2, 0, 1), +(620802, 620800, '崆峒区', '崆峒', '106.68422', '35.54173', 3, 0, 1), +(620821, 620800, '泾川县', '泾川', '107.36522', '35.33528', 3, 0, 1), +(620822, 620800, '灵台县', '灵台', '107.62059', '35.06401', 3, 0, 1), +(620823, 620800, '崇信县', '崇信', '107.03125', '35.30453', 3, 0, 1), +(620825, 620800, '庄浪县', '庄浪', '106.04198', '35.203426', 3, 0, 1), +(620826, 620800, '静宁县', '静宁', '105.73349', '35.52524', 3, 0, 1), +(620881, 620800, '华亭市', '华亭', '106.65352', '35.21756', 3, 0, 1), +(620900, 620000, '酒泉市', '酒泉', '98.510796', '39.744022', 2, 0, 1), +(620902, 620900, '肃州区', '肃州', '98.511154', '39.74386', 3, 0, 1), +(620921, 620900, '金塔县', '金塔', '98.90296', '39.983036', 3, 0, 1), +(620922, 620900, '瓜州县', '瓜州', '95.780594', '40.516525', 3, 0, 1), +(620923, 620900, '肃北蒙古族自治县', '肃北', '94.87728', '39.51224', 3, 0, 1), +(620924, 620900, '阿克塞哈萨克族自治县', '阿克塞', '94.33764', '39.63164', 3, 0, 1), +(620981, 620900, '玉门市', '玉门', '97.03721', '40.28682', 3, 0, 1), +(620982, 620900, '敦煌市', '敦煌', '94.664276', '40.141117', 3, 0, 1), +(621000, 620000, '庆阳市', '庆阳', '107.638374', '35.73422', 2, 0, 1), +(621002, 621000, '西峰区', '西峰', '107.638824', '35.73371', 3, 0, 1), +(621021, 621000, '庆城县', '庆城', '107.885666', '36.013504', 3, 0, 1), +(621022, 621000, '环县', '环县', '107.308754', '36.56932', 3, 0, 1), +(621023, 621000, '华池县', '华池', '107.98629', '36.457302', 3, 0, 1), +(621024, 621000, '合水县', '合水', '108.01987', '35.819004', 3, 0, 1), +(621025, 621000, '正宁县', '正宁', '108.36107', '35.490643', 3, 0, 1), +(621026, 621000, '宁县', '宁县', '107.92118', '35.50201', 3, 0, 1), +(621027, 621000, '镇原县', '镇原', '107.19571', '35.677807', 3, 0, 1), +(621100, 620000, '定西市', '定西', '104.6263', '35.57958', 2, 0, 1), +(621102, 621100, '安定区', '安定', '104.62577', '35.579765', 3, 0, 1), +(621121, 621100, '通渭县', '通渭', '105.2501', '35.208923', 3, 0, 1), +(621122, 621100, '陇西县', '陇西', '104.63755', '35.00341', 3, 0, 1), +(621123, 621100, '渭源县', '渭源', '104.21174', '35.133022', 3, 0, 1), +(621124, 621100, '临洮县', '临洮', '103.86218', '35.376232', 3, 0, 1), +(621125, 621100, '漳县', '漳县', '104.46676', '34.84864', 3, 0, 1), +(621126, 621100, '岷县', '岷县', '104.03988', '34.439106', 3, 0, 1), +(621200, 620000, '陇南市', '陇南', '104.92938', '33.3886', 2, 0, 1), +(621202, 621200, '武都区', '武都', '104.92986', '33.388157', 3, 0, 1), +(621221, 621200, '成县', '成县', '105.734436', '33.739864', 3, 0, 1), +(621222, 621200, '文县', '文县', '104.68245', '32.94217', 3, 0, 1), +(621223, 621200, '宕昌县', '宕昌', '104.39448', '34.042656', 3, 0, 1), +(621224, 621200, '康县', '康县', '105.609535', '33.328266', 3, 0, 1), +(621225, 621200, '西和县', '西和', '105.299736', '34.013718', 3, 0, 1), +(621226, 621200, '礼县', '礼县', '105.18162', '34.18939', 3, 0, 1), +(621227, 621200, '徽县', '徽县', '106.08563', '33.767784', 3, 0, 1), +(621228, 621200, '两当县', '两当', '106.30696', '33.91073', 3, 0, 1), +(622900, 620000, '临夏回族自治州', '临夏', '103.212006', '35.599445', 2, 0, 1), +(622901, 622900, '临夏市', '临夏市', '103.21163', '35.59941', 3, 0, 1), +(622921, 622900, '临夏县', '临夏县', '102.99387', '35.49236', 3, 0, 1), +(622922, 622900, '康乐县', '康乐', '103.709854', '35.371906', 3, 0, 1), +(622923, 622900, '永靖县', '永靖', '103.31987', '35.938934', 3, 0, 1), +(622924, 622900, '广河县', '广河', '103.57619', '35.48169', 3, 0, 1), +(622925, 622900, '和政县', '和政', '103.35036', '35.425972', 3, 0, 1), +(622926, 622900, '东乡族自治县', '东乡', '103.389565', '35.66383', 3, 0, 1), +(622927, 622900, '积石山保安族东乡族撒拉族自治县', '积石山', '102.87747', '35.712906', 3, 0, 1), +(623000, 620000, '甘南藏族自治州', '甘南', '102.91101', '34.986355', 2, 0, 1), +(623001, 623000, '合作市', '合作', '102.91149', '34.985973', 3, 0, 1), +(623021, 623000, '临潭县', '临潭', '103.35305', '34.69164', 3, 0, 1), +(623022, 623000, '卓尼县', '卓尼', '103.50851', '34.588165', 3, 0, 1), +(623023, 623000, '舟曲县', '舟曲', '104.37027', '33.782963', 3, 0, 1), +(623024, 623000, '迭部县', '迭部', '103.22101', '34.055347', 3, 0, 1), +(623025, 623000, '玛曲县', '玛曲', '102.07577', '33.99807', 3, 0, 1), +(623026, 623000, '碌曲县', '碌曲', '102.488495', '34.589592', 3, 0, 1), +(623027, 623000, '夏河县', '夏河', '102.520744', '35.20085', 3, 0, 1), +(630000, 0, '青海省', '青海', '101.778915', '36.623177', 1, 0, 1), +(630100, 630000, '西宁市', '西宁', '101.778915', '36.623177', 2, 0, 1), +(630102, 630100, '城东区', '城东', '101.7961', '36.616043', 3, 0, 1), +(630103, 630100, '城中区', '城中', '101.78455', '36.62118', 3, 0, 1), +(630104, 630100, '城西区', '城西', '101.76365', '36.628323', 3, 0, 1), +(630105, 630100, '城北区', '城北', '101.7613', '36.64845', 3, 0, 1), +(630106, 630100, '湟中区', '湟中', '101.57164', '36.50087', 3, 0, 1), +(630121, 630100, '大通回族土族自治县', '大通', '101.68418', '36.931343', 3, 0, 1), +(630123, 630100, '湟源县', '湟源', '101.263435', '36.68482', 3, 0, 1), +(630200, 630000, '海东市', '海东', '', '', 2, 0, 1), +(630202, 630200, '乐都区', '乐都', '102.40173', '36.48209', 3, 0, 1), +(630203, 630200, '平安区', '平安', '102.10848', '36.50029', 3, 0, 1), +(630222, 630200, '民和回族土族自治县', '民和回族土族自治县', '102.83087', '36.32026', 3, 0, 1), +(630223, 630200, '互助土族自治县', '互助土族自治县', '101.95842', '36.84412', 3, 0, 1), +(630224, 630200, '化隆回族自治县', '化隆回族自治县', '102.26404', '36.09493', 3, 0, 1), +(630225, 630200, '循化撒拉族自治县', '循化撒拉族自治县', '102.4891', '35.8508', 3, 0, 1), +(632200, 630000, '海北藏族自治州', '海北', '100.90106', '36.959435', 2, 0, 1), +(632221, 632200, '门源回族自治县', '门源', '101.61846', '37.37663', 3, 0, 1), +(632222, 632200, '祁连县', '祁连', '100.24978', '38.175407', 3, 0, 1), +(632223, 632200, '海晏县', '海晏', '100.90049', '36.95954', 3, 0, 1), +(632224, 632200, '刚察县', '刚察', '100.13842', '37.326263', 3, 0, 1), +(632300, 630000, '黄南藏族自治州', '黄南', '102.01999', '35.517742', 2, 0, 1), +(632301, 632300, '同仁市', '同仁', '', '', 3, 0, 1), +(632322, 632300, '尖扎县', '尖扎', '102.03195', '35.938206', 3, 0, 1), +(632323, 632300, '泽库县', '泽库', '101.469345', '35.036842', 3, 0, 1), +(632324, 632300, '河南蒙古族自治县', '河南', '101.61188', '34.734524', 3, 0, 1), +(632500, 630000, '海南藏族自治州', '海南藏族', '100.619545', '36.280354', 2, 0, 1), +(632521, 632500, '共和县', '共和', '100.6196', '36.280285', 3, 0, 1), +(632522, 632500, '同德县', '同德', '100.57947', '35.254494', 3, 0, 1), +(632523, 632500, '贵德县', '贵德', '101.431854', '36.040455', 3, 0, 1), +(632524, 632500, '兴海县', '兴海', '99.98696', '35.58909', 3, 0, 1), +(632525, 632500, '贵南县', '贵南', '100.74792', '35.587086', 3, 0, 1), +(632600, 630000, '果洛藏族自治州', '果洛', '100.24214', '34.4736', 2, 0, 1), +(632621, 632600, '玛沁县', '玛沁', '100.24353', '34.473385', 3, 0, 1), +(632622, 632600, '班玛县', '班玛', '100.73795', '32.931587', 3, 0, 1), +(632623, 632600, '甘德县', '甘德', '99.90259', '33.966988', 3, 0, 1), +(632624, 632600, '达日县', '达日', '99.65172', '33.753258', 3, 0, 1), +(632625, 632600, '久治县', '久治', '101.484886', '33.430218', 3, 0, 1), +(632626, 632600, '玛多县', '玛多', '98.21134', '34.91528', 3, 0, 1), +(632700, 630000, '玉树藏族自治州', '玉树', '97.00852', '33.004047', 2, 0, 1), +(632701, 632700, '玉树市', '玉树', '97.00862', '32.99336', 3, 0, 1), +(632722, 632700, '杂多县', '杂多', '95.29343', '32.891888', 3, 0, 1), +(632723, 632700, '称多县', '称多', '97.11089', '33.367886', 3, 0, 1), +(632724, 632700, '治多县', '治多', '95.616844', '33.85232', 3, 0, 1), +(632725, 632700, '囊谦县', '囊谦', '96.4798', '32.203205', 3, 0, 1), +(632726, 632700, '曲麻莱县', '曲麻莱', '95.800674', '34.12654', 3, 0, 1), +(632800, 630000, '海西蒙古族藏族自治州', '海西', '97.37079', '37.374664', 2, 0, 1), +(632801, 632800, '格尔木市', '格尔木', '94.90578', '36.401543', 3, 0, 1), +(632802, 632800, '德令哈市', '德令哈', '97.37014', '37.374554', 3, 0, 1), +(632803, 632800, '茫崖市', '茫崖', '90.85616', '38.24763', 3, 0, 1), +(632821, 632800, '乌兰县', '乌兰', '98.47985', '36.93039', 3, 0, 1), +(632822, 632800, '都兰县', '都兰', '98.089165', '36.298553', 3, 0, 1), +(632823, 632800, '天峻县', '天峻', '99.02078', '37.29906', 3, 0, 1), +(640000, 0, '宁夏回族自治区', '宁夏', '106.278175', '38.46637', 1, 0, 1), +(640100, 640000, '银川市', '银川', '106.278175', '38.46637', 2, 0, 1), +(640104, 640100, '兴庆区', '兴庆', '106.2784', '38.46747', 3, 0, 1), +(640105, 640100, '西夏区', '西夏', '106.13212', '38.492424', 3, 0, 1), +(640106, 640100, '金凤区', '金凤', '106.228485', '38.477352', 3, 0, 1), +(640121, 640100, '永宁县', '永宁', '106.253784', '38.28043', 3, 0, 1), +(640122, 640100, '贺兰县', '贺兰', '106.3459', '38.55456', 3, 0, 1), +(640181, 640100, '灵武市', '灵武', '106.3347', '38.09406', 3, 0, 1), +(640200, 640000, '石嘴山市', '石嘴山', '106.376175', '39.01333', 2, 0, 1), +(640202, 640200, '大武口区', '大武口', '106.37665', '39.014156', 3, 0, 1), +(640205, 640200, '惠农区', '惠农', '106.77551', '39.230095', 3, 0, 1), +(640221, 640200, '平罗县', '平罗', '106.54489', '38.90674', 3, 0, 1), +(640300, 640000, '吴忠市', '吴忠', '106.19941', '37.986164', 2, 0, 1), +(640302, 640300, '利通区', '利通', '106.19942', '37.985966', 3, 0, 1), +(640303, 640300, '红寺堡区', '红寺堡', '106.067314', '37.421616', 3, 0, 1), +(640323, 640300, '盐池县', '盐池', '107.40541', '37.78422', 3, 0, 1), +(640324, 640300, '同心县', '同心', '105.914764', '36.9829', 3, 0, 1), +(640381, 640300, '青铜峡市', '青铜峡', '106.07539', '38.021507', 3, 0, 1), +(640400, 640000, '固原市', '固原', '106.28524', '36.004562', 2, 0, 1), +(640402, 640400, '原州区', '原州', '106.28477', '36.005337', 3, 0, 1), +(640422, 640400, '西吉县', '西吉', '105.731804', '35.965385', 3, 0, 1), +(640423, 640400, '隆德县', '隆德', '106.12344', '35.618233', 3, 0, 1), +(640424, 640400, '泾源县', '泾源', '106.33868', '35.49344', 3, 0, 1), +(640425, 640400, '彭阳县', '彭阳', '106.64151', '35.849976', 3, 0, 1), +(640500, 640000, '中卫市', '中卫', '105.18957', '37.51495', 2, 0, 1), +(640502, 640500, '沙坡头区', '沙坡头', '105.19054', '37.514565', 3, 0, 1), +(640521, 640500, '中宁县', '中宁', '105.67578', '37.489735', 3, 0, 1), +(640522, 640500, '海原县', '海原', '105.64732', '36.562008', 3, 0, 1), +(650000, 0, '新疆维吾尔自治区', '新疆', '87.61773', '43.792816', 1, 0, 1), +(650100, 650000, '乌鲁木齐市', '乌鲁木齐', '87.61773', '43.792816', 2, 0, 1), +(650102, 650100, '天山区', '天山', '87.62012', '43.79643', 3, 0, 1), +(650103, 650100, '沙依巴克区', '沙依巴克', '87.59664', '43.78887', 3, 0, 1), +(650104, 650100, '新市区', '新市', '87.56065', '43.87088', 3, 0, 1), +(650105, 650100, '水磨沟区', '水磨沟', '87.61309', '43.816746', 3, 0, 1), +(650106, 650100, '头屯河区', '头屯河', '87.42582', '43.876053', 3, 0, 1), +(650107, 650100, '达坂城区', '达坂城', '88.30994', '43.36181', 3, 0, 1), +(650109, 650100, '米东区', '米东', '87.6918', '43.960983', 3, 0, 1), +(650121, 650100, '乌鲁木齐县', '乌鲁木齐', '1.0', '0.0', 3, 0, 1), +(650200, 650000, '克拉玛依市', '克拉玛依', '84.87395', '45.595886', 2, 0, 1), +(650202, 650200, '独山子区', '独山子', '84.88227', '44.327206', 3, 0, 1), +(650203, 650200, '克拉玛依区', '克拉玛依', '84.86892', '45.600475', 3, 0, 1), +(650204, 650200, '白碱滩区', '白碱滩', '85.12988', '45.689022', 3, 0, 1), +(650205, 650200, '乌尔禾区', '乌尔禾', '85.69777', '46.08776', 3, 0, 1), +(650400, 650000, '吐鲁番市', '吐鲁番', '', '', 2, 0, 1), +(650402, 650400, '高昌区', '高昌', '89.18596', '42.94244', 3, 0, 1), +(650421, 650400, '鄯善县', '鄯善', '90.21341', '42.86887', 3, 0, 1), +(650422, 650400, '托克逊县', '托克逊', '88.65384', '42.79181', 3, 0, 1), +(650500, 650000, '哈密市', '哈密', '', '', 2, 0, 1), +(650502, 650500, '伊州区', '伊州', '93.51465', '42.82699', 3, 0, 1), +(650521, 650500, '巴里坤哈萨克自治县', '巴里坤哈萨克自治县', '93.01654', '43.59873', 3, 0, 1), +(650522, 650500, '伊吾县', '伊吾', '94.69741', '43.25451', 3, 0, 1), +(652300, 650000, '昌吉回族自治州', '昌吉', '87.30401', '44.014576', 2, 0, 1), +(652301, 652300, '昌吉市', '昌吉', '87.304115', '44.013184', 3, 0, 1), +(652302, 652300, '阜康市', '阜康', '87.98384', '44.152153', 3, 0, 1), +(652323, 652300, '呼图壁县', '呼图壁', '86.88861', '44.189342', 3, 0, 1), +(652324, 652300, '玛纳斯县', '玛纳斯', '86.21769', '44.305626', 3, 0, 1), +(652325, 652300, '奇台县', '奇台', '89.59144', '44.021996', 3, 0, 1), +(652327, 652300, '吉木萨尔县', '吉木萨尔', '89.18129', '43.99716', 3, 0, 1), +(652328, 652300, '木垒哈萨克自治县', '木垒', '90.28283', '43.832443', 3, 0, 1), +(652700, 650000, '博尔塔拉蒙古自治州', '博尔塔拉', '82.074776', '44.90326', 2, 0, 1), +(652701, 652700, '博乐市', '博乐', '82.072235', '44.903088', 3, 0, 1), +(652702, 652700, '阿拉山口市', '阿拉山口', '82.074776', '44.90326', 3, 0, 1), +(652722, 652700, '精河县', '精河', '82.89294', '44.605644', 3, 0, 1), +(652723, 652700, '温泉县', '温泉', '81.03099', '44.97375', 3, 0, 1), +(652800, 650000, '巴音郭楞蒙古自治州', '巴音郭楞', '86.15097', '41.76855', 2, 0, 1), +(652801, 652800, '库尔勒市', '库尔勒', '86.14595', '41.763123', 3, 0, 1), +(652822, 652800, '轮台县', '轮台', '84.24854', '41.781265', 3, 0, 1), +(652823, 652800, '尉犁县', '尉犁', '86.26341', '41.33743', 3, 0, 1), +(652824, 652800, '若羌县', '若羌', '88.16881', '39.023808', 3, 0, 1), +(652825, 652800, '且末县', '且末', '85.53263', '38.13856', 3, 0, 1), +(652826, 652800, '焉耆回族自治县', '焉耆', '86.5698', '42.06435', 3, 0, 1), +(652827, 652800, '和静县', '和静', '86.39107', '42.31716', 3, 0, 1), +(652828, 652800, '和硕县', '和硕', '86.864944', '42.268864', 3, 0, 1), +(652829, 652800, '博湖县', '博湖', '86.63158', '41.980167', 3, 0, 1), +(652900, 650000, '阿克苏地区', '阿克苏', '80.26507', '41.17071', 2, 0, 1), +(652901, 652900, '阿克苏市', '阿克苏', '80.2629', '41.171272', 3, 0, 1), +(652902, 652900, '库车市', '库车', '82.96212', '41.71741', 3, 0, 1), +(652922, 652900, '温宿县', '温宿', '80.24327', '41.272995', 3, 0, 1), +(652924, 652900, '沙雅县', '沙雅', '82.78077', '41.22627', 3, 0, 1), +(652925, 652900, '新和县', '新和', '82.610825', '41.551174', 3, 0, 1), +(652926, 652900, '拜城县', '拜城', '81.86988', '41.7961', 3, 0, 1), +(652927, 652900, '乌什县', '乌什', '79.230804', '41.21587', 3, 0, 1), +(652928, 652900, '阿瓦提县', '阿瓦提', '80.378426', '40.63842', 3, 0, 1), +(652929, 652900, '柯坪县', '柯坪', '79.04785', '40.50624', 3, 0, 1), +(653000, 650000, '克孜勒苏柯尔克孜自治州', '克孜勒苏柯尔克孜', '76.17283', '39.713432', 2, 0, 1), +(653001, 653000, '阿图什市', '阿图什', '76.17394', '39.7129', 3, 0, 1), +(653022, 653000, '阿克陶县', '阿克陶', '75.94516', '39.14708', 3, 0, 1), +(653023, 653000, '阿合奇县', '阿合奇', '78.450165', '40.93757', 3, 0, 1), +(653024, 653000, '乌恰县', '乌恰', '75.25969', '39.716633', 3, 0, 1), +(653100, 650000, '喀什地区', '喀什', '75.989136', '39.467663', 2, 0, 1), +(653101, 653100, '喀什市', '喀什', '75.98838', '39.46786', 3, 0, 1), +(653121, 653100, '疏附县', '疏附', '75.863075', '39.378307', 3, 0, 1), +(653122, 653100, '疏勒县', '疏勒', '76.05365', '39.39946', 3, 0, 1), +(653123, 653100, '英吉沙县', '英吉沙', '76.17429', '38.92984', 3, 0, 1), +(653124, 653100, '泽普县', '泽普', '77.27359', '38.191216', 3, 0, 1), +(653125, 653100, '莎车县', '莎车', '77.248886', '38.414497', 3, 0, 1), +(653126, 653100, '叶城县', '叶城', '77.42036', '37.884678', 3, 0, 1), +(653127, 653100, '麦盖提县', '麦盖提', '77.651535', '38.903385', 3, 0, 1), +(653128, 653100, '岳普湖县', '岳普湖', '76.7724', '39.23525', 3, 0, 1), +(653129, 653100, '伽师县', '伽师', '76.74198', '39.494324', 3, 0, 1), +(653130, 653100, '巴楚县', '巴楚', '78.55041', '39.783478', 3, 0, 1), +(653131, 653100, '塔什库尔干塔吉克自治县', '塔什库尔干', '75.228065', '37.775436', 3, 0, 1), +(653200, 650000, '和田地区', '和田', '79.92533', '37.110687', 2, 0, 1), +(653201, 653200, '和田市', '和田市', '79.92754', '37.108944', 3, 0, 1), +(653221, 653200, '和田县', '和田县', '79.81907', '37.12003', 3, 0, 1), +(653222, 653200, '墨玉县', '墨玉', '79.736626', '37.27151', 3, 0, 1), +(653223, 653200, '皮山县', '皮山', '78.2823', '37.616333', 3, 0, 1), +(653224, 653200, '洛浦县', '洛浦', '80.18404', '37.074375', 3, 0, 1), +(653225, 653200, '策勒县', '策勒', '80.80357', '37.00167', 3, 0, 1), +(653226, 653200, '于田县', '于田', '81.66785', '36.85463', 3, 0, 1), +(653227, 653200, '民丰县', '民丰', '82.69235', '37.06491', 3, 0, 1), +(654000, 650000, '伊犁哈萨克自治州', '伊犁', '81.31795', '43.92186', 2, 0, 1), +(654002, 654000, '伊宁市', '伊宁市', '81.316345', '43.92221', 3, 0, 1), +(654003, 654000, '奎屯市', '奎屯', '84.9016', '44.423447', 3, 0, 1), +(654004, 654000, '霍尔果斯市', '霍尔果斯', '80.41317', '44.19865', 3, 0, 1), +(654021, 654000, '伊宁县', '伊宁县', '81.52467', '43.977875', 3, 0, 1), +(654022, 654000, '察布查尔锡伯自治县', '察布查尔', '81.15087', '43.838882', 3, 0, 1), +(654023, 654000, '霍城县', '霍城', '80.872505', '44.04991', 3, 0, 1), +(654024, 654000, '巩留县', '巩留', '82.22704', '43.481617', 3, 0, 1), +(654025, 654000, '新源县', '新源', '83.25849', '43.43425', 3, 0, 1), +(654026, 654000, '昭苏县', '昭苏', '81.12603', '43.157764', 3, 0, 1), +(654027, 654000, '特克斯县', '特克斯', '81.84006', '43.214863', 3, 0, 1), +(654028, 654000, '尼勒克县', '尼勒克', '82.50412', '43.789738', 3, 0, 1), +(654200, 650000, '塔城地区', '塔城', '82.98573', '46.7463', 2, 0, 1), +(654201, 654200, '塔城市', '塔城', '82.983986', '46.74628', 3, 0, 1), +(654202, 654200, '乌苏市', '乌苏', '84.67763', '44.430115', 3, 0, 1), +(654221, 654200, '额敏县', '额敏', '83.622116', '46.522556', 3, 0, 1), +(654223, 654200, '沙湾县', '沙湾', '85.622505', '44.329544', 3, 0, 1), +(654224, 654200, '托里县', '托里', '83.60469', '45.935863', 3, 0, 1), +(654225, 654200, '裕民县', '裕民', '82.982155', '46.20278', 3, 0, 1), +(654226, 654200, '和布克赛尔蒙古自治县', '和布克赛尔', '85.73355', '46.793', 3, 0, 1), +(654300, 650000, '阿勒泰地区', '阿勒泰', '88.13963', '47.848392', 2, 0, 1), +(654301, 654300, '阿勒泰市', '阿勒泰', '88.13874', '47.84891', 3, 0, 1), +(654321, 654300, '布尔津县', '布尔津', '86.86186', '47.70453', 3, 0, 1), +(654322, 654300, '富蕴县', '富蕴', '89.524994', '46.993107', 3, 0, 1), +(654323, 654300, '福海县', '福海', '87.49457', '47.11313', 3, 0, 1), +(654324, 654300, '哈巴河县', '哈巴河', '86.41896', '48.059284', 3, 0, 1), +(654325, 654300, '青河县', '青河', '90.38156', '46.672447', 3, 0, 1), +(654326, 654300, '吉木乃县', '吉木乃', '85.87606', '47.43463', 3, 0, 1), +(659000, 650000, '直辖县级行政区', '直辖县级行政区', '', '', 2, 0, 1), +(659001, 659000, '石河子市', '石河子', '86.04108', '44.305885', 3, 0, 1), +(659002, 659000, '阿拉尔市', '阿拉尔', '81.28588', '40.541916', 3, 0, 1), +(659003, 659000, '图木舒克市', '图木舒克', '79.07798', '39.867317', 3, 0, 1), +(659004, 659000, '五家渠市', '五家渠', '87.526886', '44.1674', 3, 0, 1), +(659005, 659000, '北屯市', '北屯', '87.80014', '47.36327', 3, 0, 1), +(659006, 659000, '铁门关市', '铁门关', '85.67583', '41.86868', 3, 0, 1), +(659007, 659000, '双河市', '双河', '82.35501', '44.84418', 3, 0, 1), +(659008, 659000, '可克达拉市', '可克达拉', '81.04476', '43.94799', 3, 0, 1), +(659009, 659000, '昆玉市', '昆玉', '79.29133', '37.20948', 3, 0, 1), +(659010, 659000, '胡杨河市', '胡杨河', '84.827387', '44.69295', 3, 0, 1), +(714368, 0, '香港特别行政区', '香港', '114.173355', '22.320048', 1, 0, 1), +(714390, 0, '澳门特别行政区', '澳门', '113.549090', '22.198951', 1, 0, 1), +(714401, 0, '台湾省', '台湾', '121.509062', '25.044332', 1, 0, 1), +(714402, 714401, '彰化县', '彰化县', '120.416000', '24.000000', 2, 0, 1), +(714403, 714402, '芳苑乡', '芳苑乡', '120.416000', '24.000000', 3, 0, 1), +(714632, 714402, '芬园乡', '芬园乡', '120.416000', '24.000000', 3, 0, 1), +(714701, 714402, '福兴乡', '福兴乡', '120.416000', '24.000000', 3, 0, 1), +(714777, 714402, '和美镇', '和美镇', '120.416000', '24.000000', 3, 0, 1), +(715055, 714402, '花坛乡', '花坛乡', '120.416000', '24.000000', 3, 0, 1), +(715172, 714402, '鹿港镇', '鹿港镇', '120.416000', '24.000000', 3, 0, 1), +(715490, 714402, '埤头乡', '埤头乡', '120.464542', '23.890392', 3, 0, 1), +(715602, 714402, '埔心乡', '埔心乡', '120.416000', '24.000000', 3, 0, 1), +(715745, 714402, '埔盐乡', '埔盐乡', '120.416000', '24.000000', 3, 0, 1), +(715795, 714402, '伸港乡', '伸港乡', '120.416000', '24.000000', 3, 0, 1), +(715960, 714402, '社头乡', '社头乡', '120.416000', '24.000000', 3, 0, 1), +(716105, 714402, '田尾乡', '田尾乡', '120.416000', '24.000000', 3, 0, 1), +(716202, 714402, '田中镇', '田中镇', '120.416000', '24.000000', 3, 0, 1), +(716341, 714402, '线西乡', '线西乡', '120.416000', '24.000000', 3, 0, 1), +(716421, 714402, '溪湖镇', '溪湖镇', '120.416000', '24.000000', 3, 0, 1), +(716750, 714402, '秀水乡', '秀水乡', '120.416000', '24.000000', 3, 0, 1), +(716874, 714402, '溪州乡', '溪州乡', '120.492906', '23.853578', 3, 0, 1), +(717107, 714402, '永靖乡', '永靖乡', '120.416000', '24.000000', 3, 0, 1), +(717238, 714402, '员林市', '员林市', '120.416000', '24.000000', 3, 0, 1), +(717447, 714402, '竹塘乡', '竹塘乡', '120.416000', '24.000000', 3, 0, 1), +(717531, 714401, '新北市', '新北市', '121.465746', '25.012366', 2, 0, 1), +(717532, 717531, '八里区', '八里区', '121.465746', '25.012366', 3, 0, 1), +(717645, 717531, '板桥区', '板桥区', '121.465746', '25.012366', 3, 0, 1), +(717902, 717531, '贡寮区', '贡寮区', '121.465746', '25.012366', 3, 0, 1), +(717955, 717531, '金山区', '金山区', '121.465746', '25.012366', 3, 0, 1), +(718036, 717531, '林口区', '林口区', '121.465746', '25.012366', 3, 0, 1), +(718195, 717531, '芦洲区', '芦洲区', '121.465746', '25.012366', 3, 0, 1), +(718266, 717531, '坪林区', '坪林区', '121.465746', '25.012366', 3, 0, 1), +(718327, 717531, '平溪区', '平溪区', '121.465746', '25.012366', 3, 0, 1), +(718375, 717531, '瑞芳区', '瑞芳区', '121.465746', '25.012366', 3, 0, 1), +(718490, 717531, '三重区', '三重区', '121.465746', '25.012366', 3, 0, 1), +(718786, 717531, '三峡区', '三峡区', '121.465746', '25.012366', 3, 0, 1), +(718879, 717531, '三芝区', '三芝区', '121.465746', '25.012366', 3, 0, 1), +(718980, 717531, '深坑区', '深坑区', '121.465746', '25.012366', 3, 0, 1), +(719023, 717531, '石碇区', '石碇区', '121.465746', '25.012366', 3, 0, 1), +(719115, 717531, '石门区', '石门区', '121.465746', '25.012366', 3, 0, 1), +(719155, 717531, '双溪区', '双溪区', '121.465746', '25.012366', 3, 0, 1), +(719243, 717531, '树林区', '树林区', '121.465746', '25.012366', 3, 0, 1), +(719382, 717531, '泰山区', '泰山区', '121.465746', '25.012366', 3, 0, 1), +(719498, 717531, '淡水区', '淡水区', '121.465746', '25.012366', 3, 0, 1), +(719731, 717531, '土城区', '土城区', '121.465746', '25.012366', 3, 0, 1), +(719868, 714401, '澎湖县', '澎湖县', '119.566417', '23.569733', 2, 0, 1), +(719869, 719868, '白沙乡', '白沙乡', '119.566417', '23.569733', 3, 0, 1), +(719890, 719868, '湖西乡', '湖西乡', '119.566417', '23.569733', 3, 0, 1), +(719916, 719868, '马公市', '马公市', '119.566417', '23.569733', 3, 0, 1), +(720065, 719868, '七美乡', '七美乡', '119.566417', '23.569733', 3, 0, 1), +(720090, 719868, '望安乡', '望安乡', '119.566417', '23.569733', 3, 0, 1), +(720102, 719868, '西屿乡', '西屿乡', '119.566417', '23.569733', 3, 0, 1), +(720118, 714401, '屏东县', '屏东县', '120.487928', '22.682802', 2, 0, 1), +(720119, 720118, '三地门乡', '三地门乡', '120.487928', '22.682802', 3, 0, 1), +(720142, 720118, '狮子乡', '狮子乡', '120.487928', '22.682802', 3, 0, 1), +(720163, 720118, '泰武乡', '泰武乡', '120.626012', '22.591307', 3, 0, 1), +(720186, 720118, '万丹乡', '万丹乡', '120.486423', '22.588123', 3, 0, 1), +(720415, 720118, '万峦乡', '万峦乡', '120.566478', '22.571966', 3, 0, 1), +(720480, 720118, '雾臺乡', '雾臺乡', '120.727653', '22.743675', 3, 0, 1), +(720502, 720118, '新埤乡', '新埤乡', '120.545190', '22.465998', 3, 0, 1), +(720553, 720118, '新园乡', '新园乡', '120.459758', '22.544147', 3, 0, 1), +(720649, 720118, '盐埔乡', '盐埔乡', '120.487928', '22.682802', 3, 0, 1), +(720748, 720118, '竹田乡', '竹田乡', '120.487928', '22.682802', 3, 0, 1), +(720835, 720118, '长治乡', '长治乡', '120.487928', '22.682802', 3, 0, 1), +(720975, 720118, '潮州镇', '潮州镇', '120.487928', '22.682802', 3, 0, 1), +(721293, 720118, '车城乡', '车城乡', '120.707694', '22.072115', 3, 0, 1), +(721335, 720118, '春日乡', '春日乡', '120.622000', '22.368284', 3, 0, 1), +(721344, 720118, '东港镇', '东港镇', '120.487928', '22.682802', 3, 0, 1), +(721490, 720118, '枋寮乡', '枋寮乡', '120.487928', '22.682802', 3, 0, 1), +(721617, 720118, '枋山乡', '枋山乡', '120.647762', '22.262550', 3, 0, 1), +(721638, 720118, '高树乡', '高树乡', '120.595945', '22.825131', 3, 0, 1), +(721805, 720118, '恆春镇', '恆春镇', '120.487928', '22.682802', 3, 0, 1), +(721930, 720118, '佳冬乡', '佳冬乡', '120.545370', '22.417786', 3, 0, 1), +(722024, 714401, '臺中市', '臺中市', '0.000000', '0.000000', 2, 0, 1), +(722025, 722024, '梧栖区', '梧栖区', '0.000000', '0.000000', 3, 0, 1), +(722212, 722024, '乌日区', '乌日区', '0.000000', '0.000000', 3, 0, 1), +(722402, 722024, '新社区', '新社区', '0.000000', '0.000000', 3, 0, 1), +(722474, 722024, '西屯区', '西屯区', '0.000000', '0.000000', 3, 0, 1), +(722699, 722024, '北屯区', '北屯区', '0.000000', '0.000000', 3, 0, 1), +(722879, 722024, '中区', '中区', '0.000000', '0.000000', 3, 0, 1), +(722923, 722024, '大肚区', '大肚区', '0.000000', '0.000000', 3, 0, 1), +(723021, 722024, '大甲区', '大甲区', '0.000000', '0.000000', 3, 0, 1), +(723211, 722024, '大里区', '大里区', '0.000000', '0.000000', 3, 0, 1), +(723592, 722024, '大雅区', '大雅区', '0.000000', '0.000000', 3, 0, 1), +(723756, 722024, '大安区', '大安区', '0.000000', '0.000000', 3, 0, 1), +(723802, 722024, '东势区', '东势区', '0.000000', '0.000000', 3, 0, 1), +(723966, 722024, '东区', '东区', '0.000000', '0.000000', 3, 0, 1), +(724148, 722024, '丰原区', '丰原区', '0.000000', '0.000000', 3, 0, 1), +(724424, 722024, '和平区', '和平区', '0.000000', '0.000000', 3, 0, 1), +(724504, 722024, '后里区', '后里区', '0.000000', '0.000000', 3, 0, 1), +(724656, 722024, '龙井区', '龙井区', '0.000000', '0.000000', 3, 0, 1), +(724797, 722024, '南屯区', '南屯区', '0.000000', '0.000000', 3, 0, 1), +(724872, 722024, '北区', '北区', '0.000000', '0.000000', 3, 0, 1), +(725199, 722024, '清水区', '清水区', '0.000000', '0.000000', 3, 0, 1), +(725488, 714401, '臺南市', '臺南市', '0.000000', '0.000000', 2, 0, 1), +(725489, 725488, '佳里区', '佳里区', '0.000000', '0.000000', 3, 0, 1), +(725588, 725488, '将军区', '将军区', '0.000000', '0.000000', 3, 0, 1), +(725620, 725488, '六甲区', '六甲区', '0.000000', '0.000000', 3, 0, 1), +(725679, 725488, '柳营区', '柳营区', '0.000000', '0.000000', 3, 0, 1), +(725795, 725488, '龙崎区', '龙崎区', '0.000000', '0.000000', 3, 0, 1), +(725841, 725488, '麻豆区', '麻豆区', '0.000000', '0.000000', 3, 0, 1), +(725927, 725488, '南化区', '南化区', '0.000000', '0.000000', 3, 0, 1), +(725938, 725488, '楠西区', '楠西区', '0.000000', '0.000000', 3, 0, 1), +(725973, 725488, '北区', '北区', '0.000000', '0.000000', 3, 0, 1), +(726300, 725488, '七股区', '七股区', '0.000000', '0.000000', 3, 0, 1), +(726338, 725488, '仁德区', '仁德区', '0.000000', '0.000000', 3, 0, 1), +(726539, 725488, '善化区', '善化区', '0.000000', '0.000000', 3, 0, 1), +(726675, 725488, '山上区', '山上区', '0.000000', '0.000000', 3, 0, 1), +(726691, 725488, '南区', '南区', '120.679305', '24.133453', 3, 0, 1), +(727041, 725488, '中西区', '中西区', '0.000000', '0.000000', 3, 0, 1), +(727251, 725488, '下营区', '下营区', '0.000000', '0.000000', 3, 0, 1), +(727339, 725488, '西港区', '西港区', '0.000000', '0.000000', 3, 0, 1), +(727375, 725488, '新化区', '新化区', '0.000000', '0.000000', 3, 0, 1), +(727425, 725488, '新市区', '新市区', '0.000000', '0.000000', 3, 0, 1), +(727529, 725488, '新营区', '新营区', '0.000000', '0.000000', 3, 0, 1), +(727730, 714401, '臺北市', '臺北市', '121.517057', '25.048074', 2, 0, 1), +(727731, 727730, '北投区', '北投区', '121.517057', '25.048074', 3, 0, 1), +(727897, 727730, '大同区', '大同区', '121.517057', '25.048074', 3, 0, 1), +(728070, 727730, '大安区', '大安区', '121.517057', '25.048074', 3, 0, 1), +(728116, 727730, '南港区', '南港区', '121.517057', '25.048074', 3, 0, 1), +(728220, 727730, '内湖区', '内湖区', '121.517057', '25.048074', 3, 0, 1), +(728340, 727730, '士林区', '士林区', '121.517057', '25.048074', 3, 0, 1), +(728550, 727730, '松山区', '松山区', '121.517057', '25.048074', 3, 0, 1), +(728713, 727730, '万华区', '万华区', '121.517057', '25.048074', 3, 0, 1), +(728920, 727730, '文山区', '文山区', '121.517057', '25.048074', 3, 0, 1), +(729073, 727730, '信义区', '信义区', '121.517057', '25.048074', 3, 0, 1), +(729277, 727730, '中山区', '中山区', '121.517057', '25.048074', 3, 0, 1), +(729583, 727730, '中正区', '中正区', '121.517057', '25.048074', 3, 0, 1), +(729928, 714401, '臺东县', '臺东县', '0.000000', '0.000000', 2, 0, 1), +(729929, 729928, '卑南乡', '卑南乡', '121.117213', '22.781744', 3, 0, 1), +(729994, 729928, '长滨乡', '长滨乡', '0.000000', '0.000000', 3, 0, 1), +(730033, 729928, '成功镇', '成功镇', '0.000000', '0.000000', 3, 0, 1), +(730107, 729928, '池上乡', '池上乡', '121.212999', '23.123275', 3, 0, 1), +(730196, 729928, '达仁乡', '达仁乡', '120.878316', '22.296142', 3, 0, 1), +(730219, 729928, '大武乡', '大武乡', '0.000000', '0.000000', 3, 0, 1), +(730268, 729928, '东河乡', '东河乡', '0.000000', '0.000000', 3, 0, 1), +(730308, 729928, '关山镇', '关山镇', '121.158084', '23.047483', 3, 0, 1), +(730384, 729928, '海端乡', '海端乡', '121.172009', '23.101079', 3, 0, 1), +(730409, 729928, '金峰乡', '金峰乡', '0.000000', '0.000000', 3, 0, 1), +(730416, 729928, '兰屿乡', '兰屿乡', '0.000000', '0.000000', 3, 0, 1), +(730423, 729928, '绿岛乡', '绿岛乡', '0.000000', '0.000000', 3, 0, 1), +(730438, 729928, '鹿野乡', '鹿野乡', '0.000000', '0.000000', 3, 0, 1), +(730510, 729928, '太麻里乡', '太麻里乡', '120.999365', '22.610919', 3, 0, 1), +(730565, 729928, '臺东市', '臺东市', '0.000000', '0.000000', 3, 0, 1), +(730832, 729928, '延平乡', '延平乡', '0.000000', '0.000000', 3, 0, 1), +(730843, 714401, '桃园市', '桃园市', '121.083000', '25.000000', 2, 0, 1), +(730844, 730843, '八德区', '八德区', '121.083000', '25.000000', 3, 0, 1), +(731212, 730843, '大溪区', '大溪区', '121.083000', '25.000000', 3, 0, 1), +(731471, 730843, '大园区', '大园区', '121.083000', '25.000000', 3, 0, 1), +(731767, 730843, '復兴区', '復兴区', '121.083000', '25.000000', 3, 0, 1), +(731835, 730843, '观音区', '观音区', '121.083000', '25.000000', 3, 0, 1), +(732079, 730843, '龟山区', '龟山区', '121.083000', '25.000000', 3, 0, 1), +(732469, 730843, '龙潭区', '龙潭区', '121.083000', '25.000000', 3, 0, 1), +(732800, 730843, '芦竹区', '芦竹区', '121.083000', '25.000000', 3, 0, 1), +(733144, 730843, '平镇区', '平镇区', '121.083000', '25.000000', 3, 0, 1), +(733179, 730843, '桃园区', '桃园区', '121.083000', '25.000000', 3, 0, 1), +(733390, 730843, '新屋区', '新屋区', '121.083000', '25.000000', 3, 0, 1), +(733537, 730843, '杨梅区', '杨梅区', '121.083000', '25.000000', 3, 0, 1), +(733876, 730843, '中坜区', '中坜区', '121.083000', '25.000000', 3, 0, 1), +(734179, 714401, '宜兰县', '宜兰县', '121.500000', '24.600000', 2, 0, 1), +(734180, 734179, '大同乡', '大同乡', '121.500000', '24.600000', 3, 0, 1), +(734246, 734179, '钓鱼臺', '钓鱼臺', '121.500000', '24.600000', 3, 0, 1), +(734248, 734179, '冬山乡', '冬山乡', '121.500000', '24.600000', 3, 0, 1), +(734579, 734179, '礁溪乡', '礁溪乡', '121.500000', '24.600000', 3, 0, 1), +(734681, 734179, '罗东镇', '罗东镇', '121.500000', '24.600000', 3, 0, 1), +(734842, 734179, '南澳乡', '南澳乡', '121.500000', '24.600000', 3, 0, 1), +(734865, 734179, '三星乡', '三星乡', '121.500000', '24.600000', 3, 0, 1), +(735104, 734179, '苏澳镇', '苏澳镇', '121.500000', '24.600000', 3, 0, 1), +(735319, 734179, '头城镇', '头城镇', '121.500000', '24.600000', 3, 0, 1), +(735419, 734179, '五结乡', '五结乡', '121.796468', '24.685615', 3, 0, 1), +(735620, 734179, '宜兰市', '宜兰市', '121.500000', '24.600000', 3, 0, 1), +(735851, 734179, '员山乡', '员山乡', '121.500000', '24.600000', 3, 0, 1), +(735970, 734179, '壮围乡', '壮围乡', '121.500000', '24.600000', 3, 0, 1), +(736051, 714401, '南投县', '南投县', '120.830000', '23.830000', 2, 0, 1), +(736052, 736051, '草屯镇', '草屯镇', '120.830000', '23.830000', 3, 0, 1), +(736305, 736051, '国姓乡', '国姓乡', '120.830000', '23.830000', 3, 0, 1), +(736356, 736051, '集集镇', '集集镇', '120.830000', '23.830000', 3, 0, 1), +(736449, 736051, '鹿谷乡', '鹿谷乡', '120.830000', '23.830000', 3, 0, 1), +(736522, 736051, '名间乡', '名间乡', '120.830000', '23.830000', 3, 0, 1), +(736622, 736051, '南投市', '南投市', '120.830000', '23.830000', 3, 0, 1), +(736887, 736051, '埔里镇', '埔里镇', '120.830000', '23.830000', 3, 0, 1), +(737266, 736051, '仁爱乡', '仁爱乡', '120.830000', '23.830000', 3, 0, 1), +(737337, 736051, '水里乡', '水里乡', '120.830000', '23.830000', 3, 0, 1), +(737496, 736051, '信义乡', '信义乡', '120.830000', '23.830000', 3, 0, 1), +(737533, 736051, '鱼池乡', '鱼池乡', '120.830000', '23.830000', 3, 0, 1), +(737591, 736051, '中寮乡', '中寮乡', '120.830000', '23.830000', 3, 0, 1), +(737625, 736051, '竹山镇', '竹山镇', '120.830000', '23.830000', 3, 0, 1), +(737856, 714401, '南海岛', '南海岛', '0.000000', '0.000000', 2, 0, 1), +(737857, 737856, '东沙群岛', '东沙群岛', '0.000000', '0.000000', 3, 0, 1), +(737859, 737856, '南沙群岛', '南沙群岛', '0.000000', '0.000000', 3, 0, 1), +(737861, 714401, '苗栗县', '苗栗县', '120.818985', '24.561601', 2, 0, 1), +(737862, 737861, '头屋乡', '头屋乡', '120.818985', '24.561601', 3, 0, 1), +(737894, 737861, '西湖乡', '西湖乡', '120.743700', '24.556610', 3, 0, 1), +(737948, 737861, '苑里镇', '苑里镇', '120.818985', '24.561601', 3, 0, 1), +(738050, 737861, '造桥乡', '造桥乡', '120.818985', '24.561601', 3, 0, 1), +(738158, 737861, '竹南镇', '竹南镇', '120.872636', '24.685510', 3, 0, 1), +(738454, 737861, '卓兰镇', '卓兰镇', '120.823440', '24.309510', 3, 0, 1), +(738528, 737861, '大湖乡', '大湖乡', '120.863640', '24.422548', 3, 0, 1), +(738619, 737861, '公馆乡', '公馆乡', '120.818985', '24.561601', 3, 0, 1), +(738695, 737861, '后龙镇', '后龙镇', '120.786474', '24.612613', 3, 0, 1), +(738882, 737861, '苗栗市', '苗栗市', '120.819288', '24.561582', 3, 0, 1), +(739250, 737861, '南庄乡', '南庄乡', '120.818985', '24.561601', 3, 0, 1), +(739302, 737861, '三湾乡', '三湾乡', '120.818985', '24.561601', 3, 0, 1), +(739369, 737861, '三义乡', '三义乡', '120.765515', '24.413037', 3, 0, 1), +(739419, 737861, '狮潭乡', '狮潭乡', '120.918024', '24.540004', 3, 0, 1), +(739465, 737861, '泰安乡', '泰安乡', '120.818985', '24.561601', 3, 0, 1), +(739487, 737861, '铜锣乡', '铜锣乡', '120.786475', '24.489502', 3, 0, 1), +(739564, 737861, '通霄镇', '通霄镇', '120.676696', '24.489084', 3, 0, 1), +(739642, 737861, '头份市', '头份市', '120.818985', '24.561601', 3, 0, 1), +(739957, 714401, '嘉义市', '嘉义市', '120.452538', '23.481568', 2, 0, 1), +(739958, 739957, '东区', '东区', '120.452538', '23.481568', 3, 0, 1), +(740140, 739957, '西区', '西区', '120.452538', '23.481568', 3, 0, 1), +(740510, 714401, '嘉义县', '嘉义县', '120.452538', '23.481568', 2, 0, 1), +(740511, 740510, '阿里山乡', '阿里山乡', '120.452538', '23.481568', 3, 0, 1), +(740536, 740510, '布袋镇', '布袋镇', '120.452538', '23.481568', 3, 0, 1), +(740625, 740510, '大林镇', '大林镇', '120.452538', '23.481568', 3, 0, 1), +(740746, 740510, '大埔乡', '大埔乡', '120.452538', '23.481568', 3, 0, 1), +(740792, 740510, '东石乡', '东石乡', '120.452538', '23.481568', 3, 0, 1), +(740845, 740510, '番路乡', '番路乡', '120.452538', '23.481568', 3, 0, 1), +(740943, 740510, '六脚乡', '六脚乡', '120.452538', '23.481568', 3, 0, 1), +(740975, 740510, '鹿草乡', '鹿草乡', '120.452538', '23.481568', 3, 0, 1), +(741010, 740510, '梅山乡', '梅山乡', '120.452538', '23.481568', 3, 0, 1), +(741137, 740510, '民雄乡', '民雄乡', '120.452538', '23.481568', 3, 0, 1), +(741312, 740510, '朴子市', '朴子市', '120.452538', '23.481568', 3, 0, 1), +(741451, 740510, '水上乡', '水上乡', '120.452538', '23.481568', 3, 0, 1), +(741550, 740510, '太保市', '太保市', '120.332737', '23.459115', 3, 0, 1), +(741646, 740510, '溪口乡', '溪口乡', '120.452538', '23.481568', 3, 0, 1), +(741688, 740510, '新港乡', '新港乡', '120.452538', '23.481568', 3, 0, 1), +(741750, 740510, '义竹乡', '义竹乡', '120.452538', '23.481568', 3, 0, 1), +(741785, 740510, '中埔乡', '中埔乡', '120.452538', '23.481568', 3, 0, 1), +(741936, 740510, '竹崎乡', '竹崎乡', '120.452538', '23.481568', 3, 0, 1), +(742126, 714401, '新竹市', '新竹市', '120.968798', '24.806738', 2, 0, 1), +(742127, 742126, '东区', '东区', '120.973544', '24.805226', 3, 0, 1), +(742309, 742126, '北区', '北区', '120.968798', '24.806738', 3, 0, 1), +(742636, 714401, '新竹县', '新竹县', '120.968798', '24.806738', 2, 0, 1), +(742637, 742636, '峨眉乡', '峨眉乡', '120.968798', '24.806738', 3, 0, 1), +(742674, 742636, '关西镇', '关西镇', '120.968798', '24.806738', 3, 0, 1), +(742797, 742636, '横山乡', '横山乡', '120.968798', '24.806738', 3, 0, 1), +(742852, 742636, '湖口乡', '湖口乡', '120.968798', '24.806738', 3, 0, 1), +(743201, 742636, '尖石乡', '尖石乡', '120.968798', '24.806738', 3, 0, 1), +(743246, 742636, '芎林乡', '芎林乡', '120.968798', '24.806738', 3, 0, 1), +(743298, 742636, '五峰乡', '五峰乡', '120.968798', '24.806738', 3, 0, 1), +(743319, 742636, '新丰乡', '新丰乡', '120.968798', '24.806738', 3, 0, 1), +(743414, 742636, '新埔镇', '新埔镇', '120.968798', '24.806738', 3, 0, 1), +(743527, 742636, '竹北市', '竹北市', '120.968798', '24.806738', 3, 0, 1), +(743565, 742636, '竹东镇', '竹东镇', '120.968798', '24.806738', 3, 0, 1), +(743725, 742636, '宝山乡', '宝山乡', '120.968798', '24.806738', 3, 0, 1), +(743888, 742636, '北埔乡', '北埔乡', '120.968798', '24.806738', 3, 0, 1), +(743938, 714401, '花莲县', '花莲县', '121.300000', '23.830000', 2, 0, 1), +(743939, 743938, '卓溪乡', '卓溪乡', '121.301890', '23.344908', 3, 0, 1), +(743956, 743938, '丰滨乡', '丰滨乡', '121.300000', '23.830000', 3, 0, 1), +(743993, 743938, '凤林镇', '凤林镇', '121.300000', '23.830000', 3, 0, 1), +(744128, 743938, '富里乡', '富里乡', '121.244694', '23.175468', 3, 0, 1), +(744185, 743938, '光復乡', '光復乡', '121.300000', '23.830000', 3, 0, 1), +(744246, 743938, '花莲市', '花莲市', '121.606927', '23.981993', 3, 0, 1), +(744625, 743938, '吉安乡', '吉安乡', '121.300000', '23.830000', 3, 0, 1), +(745050, 743938, '瑞穗乡', '瑞穗乡', '121.373373', '23.496080', 3, 0, 1), +(745196, 743938, '寿丰乡', '寿丰乡', '121.506030', '23.869774', 3, 0, 1), +(745354, 743938, '万荣乡', '万荣乡', '121.300000', '23.830000', 3, 0, 1), +(745363, 743938, '新城乡', '新城乡', '121.604120', '24.039243', 3, 0, 1), +(745486, 743938, '秀林乡', '秀林乡', '121.300000', '23.830000', 3, 0, 1), +(745532, 743938, '玉里镇', '玉里镇', '121.312109', '23.334236', 3, 0, 1), +(745674, 714401, '高雄市', '高雄市', '120.311922', '22.620856', 2, 0, 1), +(745675, 745674, '阿莲区', '阿莲区', '120.311922', '22.620856', 3, 0, 1), +(745715, 745674, '大寮区', '大寮区', '120.311922', '22.620856', 3, 0, 1), +(746083, 745674, '大社区', '大社区', '120.311922', '22.620856', 3, 0, 1), +(746199, 745674, '大树区', '大树区', '120.311922', '22.620856', 3, 0, 1), +(746294, 745674, '凤山区', '凤山区', '120.311922', '22.620856', 3, 0, 1), +(746624, 745674, '冈山区', '冈山区', '120.311922', '22.620856', 3, 0, 1), +(746906, 745674, '鼓山区', '鼓山区', '120.311922', '22.620856', 3, 0, 1), +(747053, 745674, '湖内区', '湖内区', '120.311922', '22.620856', 3, 0, 1), +(747108, 745674, '甲仙区', '甲仙区', '120.587980', '23.083957', 3, 0, 1), +(747150, 745674, '苓雅区', '苓雅区', '120.311922', '22.620856', 3, 0, 1), +(747342, 745674, '林园区', '林园区', '120.311922', '22.620856', 3, 0, 1), +(747481, 745674, '六龟区', '六龟区', '120.311922', '22.620856', 3, 0, 1), +(747536, 745674, '路竹区', '路竹区', '120.311922', '22.620856', 3, 0, 1), +(747643, 745674, '茂林区', '茂林区', '120.311922', '22.620856', 3, 0, 1), +(747647, 745674, '美浓区', '美浓区', '120.542419', '22.894882', 3, 0, 1), +(747764, 745674, '弥陀区', '弥陀区', '120.250672', '22.781561', 3, 0, 1), +(747894, 745674, '那玛夏区', '那玛夏区', '120.311922', '22.620856', 3, 0, 1), +(747902, 745674, '楠梓区', '楠梓区', '120.311922', '22.620856', 3, 0, 1), +(748258, 745674, '内门区', '内门区', '120.311922', '22.620856', 3, 0, 1), +(748344, 745674, '鸟松区', '鸟松区', '120.311922', '22.620856', 3, 0, 1), +(748553, 714401, '基隆市', '基隆市', '121.746248', '25.130741', 2, 0, 1), +(748554, 748553, '安乐区', '安乐区', '121.746248', '25.130741', 3, 0, 1), +(748581, 748553, '暖暖区', '暖暖区', '121.746248', '25.130741', 3, 0, 1), +(748599, 748553, '七堵区', '七堵区', '121.746248', '25.130741', 3, 0, 1), +(748670, 748553, '仁爱区', '仁爱区', '121.746248', '25.130741', 3, 0, 1), +(748716, 748553, '信义区', '信义区', '121.746248', '25.130741', 3, 0, 1), +(748920, 748553, '中山区', '中山区', '121.746248', '25.130741', 3, 0, 1), +(749226, 748553, '中正区', '中正区', '121.768000', '25.151647', 3, 0, 1), +(749571, 714401, '金门县', '金门县', '118.317089', '24.432706', 2, 0, 1), +(749572, 749571, '金城镇', '金城镇', '118.317089', '24.432706', 3, 0, 1), +(749647, 749571, '金湖镇', '金湖镇', '118.317089', '24.432706', 3, 0, 1), +(749752, 749571, '金宁乡', '金宁乡', '118.317089', '24.432706', 3, 0, 1), +(749810, 749571, '金沙镇', '金沙镇', '118.317089', '24.432706', 3, 0, 1), +(749894, 749571, '烈屿乡', '烈屿乡', '118.317089', '24.432706', 3, 0, 1), +(749928, 749571, '乌坵乡', '乌坵乡', '118.317089', '24.432706', 3, 0, 1), +(749930, 714401, '连江县', '连江县', '119.539704', '26.197364', 2, 0, 1), +(749931, 749930, '北竿乡', '北竿乡', '119.539704', '26.197364', 3, 0, 1), +(749938, 749930, '东引乡', '东引乡', '119.539704', '26.197364', 3, 0, 1), +(749941, 749930, '莒光乡', '莒光乡', '119.539704', '26.197364', 3, 0, 1), +(749947, 749930, '南竿乡', '南竿乡', '119.539704', '26.197364', 3, 0, 1), +(749957, 714401, '云林县', '云林县', '120.527173', '23.696887', 2, 0, 1), +(749958, 749957, '褒忠乡', '褒忠乡', '120.309069', '23.695652', 3, 0, 1), +(749991, 749957, '北港镇', '北港镇', '120.296759', '23.572428', 3, 0, 1), +(750170, 749957, '莿桐乡', '莿桐乡', '120.497033', '23.757251', 3, 0, 1), +(750218, 749957, '大埤乡', '大埤乡', '120.527173', '23.696887', 3, 0, 1), +(750291, 749957, '东势乡', '东势乡', '120.527173', '23.696887', 3, 0, 1), +(750363, 749957, '斗六市', '斗六市', '120.527173', '23.696887', 3, 0, 1), +(750795, 749957, '斗南镇', '斗南镇', '120.527173', '23.696887', 3, 0, 1), +(751009, 749957, '二崙乡', '二崙乡', '120.527173', '23.696887', 3, 0, 1), +(751071, 749957, '古坑乡', '古坑乡', '120.558553', '23.644734', 3, 0, 1), +(751147, 749957, '虎尾镇', '虎尾镇', '120.429231', '23.707796', 3, 0, 1), +(751400, 749957, '口湖乡', '口湖乡', '120.178640', '23.585506', 3, 0, 1), +(751493, 749957, '林内乡', '林内乡', '120.527173', '23.696887', 3, 0, 1), +(751555, 749957, '崙背乡', '崙背乡', '120.527173', '23.696887', 3, 0, 1), +(751674, 749957, '麦寮乡', '麦寮乡', '120.527173', '23.696887', 3, 0, 1), +(751764, 749957, '水林乡', '水林乡', '120.241228', '23.571067', 3, 0, 1), +(751832, 749957, '四湖乡', '四湖乡', '120.220781', '23.635426', 3, 0, 1), +(751907, 749957, '臺西乡', '臺西乡', '120.196139', '23.702821', 3, 0, 1), +(751956, 749957, '土库镇', '土库镇', '120.527173', '23.696887', 3, 0, 1), +(752034, 749957, '西螺镇', '西螺镇', '120.457123', '23.797412', 3, 0, 1), +(752149, 749957, '元长乡', '元长乡', '120.311052', '23.649577', 3, 0, 1), +(752150, 714368, '香港特别行政区', '香港', '', '', 2, 0, 1), +(752151, 752150, '中西区', '中西区', '', '', 3, 0, 1), +(752152, 752150, '东区', '东区', '', '', 3, 0, 1), +(752153, 752150, '九龙城区', '九龙城区', '', '', 3, 0, 1), +(752154, 752150, '观塘区', '观塘区', '114.231268', '22.309430', 3, 0, 1), +(752155, 752150, '南区', '南区', '114.174134', '22.246760', 3, 0, 1), +(752156, 752150, '深水埗区', '深水埗区', '', '', 3, 0, 1), +(752157, 752150, '湾仔区', '湾仔区', '', '', 3, 0, 1), +(752158, 752150, '黄大仙区', '黄大仙区', '', '', 3, 0, 1), +(752159, 752150, '油尖旺区', '油尖旺区', '', '', 3, 0, 1), +(752160, 752150, '离岛区', '离岛区', '', '', 3, 0, 1), +(752161, 752150, '葵青区', '葵青区', '', '', 3, 0, 1), +(752162, 752150, '北区', '北区', '', '', 3, 0, 1), +(752163, 752150, '西贡区', '西贡区', '', '', 3, 0, 1), +(752164, 752150, '沙田区', '沙田区', '', '', 3, 0, 1), +(752165, 752150, '屯门区', '屯门区', '', '', 3, 0, 1), +(752166, 752150, '大埔区', '大埔区', '', '', 3, 0, 1), +(752167, 752150, '荃湾区', '荃湾区', '', '', 3, 0, 1), +(752168, 752150, '元朗区', '元朗区', '', '', 3, 0, 1), +(752169, 714390, '澳门特别行政区', '澳门', '', '', 2, 0, 1), +(752170, 752169, '澳门半岛', '澳门半岛', '', '', 3, 0, 1), +(752171, 752169, '凼仔', '凼仔', '', '', 3, 0, 1), +(752172, 752169, '路凼城', '路凼城', '', '', 3, 0, 1), +(752173, 752169, '路环', '路环', '', '', 3, 0, 1), +(752177, 440300, '龙华区', '龙华区', '', '', 3, 0, 1), +(441900003, 441900, '东城街道办事处', '东城街道办事处', '113.754635', '23.002896', 3, 0, 1), +(441900004, 441900, '南城街道办事处', '南城街道办事处', '113.753133', '22.987560', 3, 0, 1), +(441900005, 441900, '万江街道办事处', '万江街道办事处', '113.740409', '23.052146', 3, 0, 1), +(441900006, 441900, '莞城街道办事处', '莞城街道办事处', '113.751050', '23.053413', 3, 0, 1), +(441900101, 441900, '石碣镇', '石碣镇', '113.802109', '23.094111', 3, 0, 1), +(441900102, 441900, '石龙镇', '石龙镇', '113.751765', '23.020536', 3, 0, 1), +(441900103, 441900, '茶山镇', '茶山镇', '113.751765', '23.020536', 3, 0, 1), +(441900104, 441900, '石排镇', '石排镇', '113.751765', '23.020536', 3, 0, 1), +(441900105, 441900, '企石镇', '企石镇', '113.751765', '23.020536', 3, 0, 1), +(441900106, 441900, '横沥镇', '横沥镇', '113.751765', '23.020536', 3, 0, 1), +(441900107, 441900, '桥头镇', '桥头镇', '113.751765', '23.020536', 3, 0, 1), +(441900108, 441900, '谢岗镇', '谢岗镇', '114.141456', '22.972083', 3, 0, 1), +(441900109, 441900, '东坑镇', '东坑镇', '113.948089', '22.989033', 3, 0, 1), +(441900110, 441900, '常平镇', '常平镇', '113.992186', '22.975601', 3, 0, 1), +(441900111, 441900, '寮步镇', '寮步镇', '113.818996', '23.025373', 3, 0, 1), +(441900112, 441900, '樟木头镇', '樟木头镇', '114.083278', '22.914909', 3, 0, 1), +(441900113, 441900, '大朗镇', '大朗镇', '113.915820', '22.915996', 3, 0, 1), +(441900114, 441900, '黄江镇', '黄江镇', '113.996039', '22.877840', 3, 0, 1), +(441900115, 441900, '清溪镇', '清溪镇', '114.164330', '22.844557', 3, 0, 1), +(441900116, 441900, '塘厦镇', '塘厦镇', '113.774481', '22.791051', 3, 0, 1), +(441900117, 441900, '凤岗镇', '凤岗镇', '113.751765', '23.020536', 3, 0, 1), +(441900118, 441900, '大岭山镇', '大岭山镇', '113.842223', '22.899965', 3, 0, 1), +(441900119, 441900, '长安镇', '长安镇', '113.794060', '22.803590', 3, 0, 1), +(441900121, 441900, '虎门镇', '虎门镇', '113.672560', '22.814835', 3, 0, 1), +(441900122, 441900, '厚街镇', '厚街镇', '113.751765', '23.020536', 3, 0, 1), +(441900123, 441900, '沙田镇', '沙田镇', '113.751765', '23.020536', 3, 0, 1), +(441900124, 441900, '道滘镇', '道滘镇', '113.751765', '23.020536', 3, 0, 1), +(441900125, 441900, '洪梅镇', '洪梅镇', '113.608903', '22.994717', 3, 0, 1), +(441900126, 441900, '麻涌镇', '麻涌镇', '113.751765', '23.020536', 3, 0, 1), +(441900127, 441900, '望牛墩镇', '望牛墩镇', '113.656243', '23.055331', 3, 0, 1), +(441900128, 441900, '中堂镇', '中堂镇', '113.751765', '23.020536', 3, 0, 1), +(441900129, 441900, '高埗镇', '高埗镇', '113.722126', '23.078713', 3, 0, 1), +(441900401, 441900, '松山湖管委会', '松山湖管委会', '113.909208', '22.960541', 3, 0, 1), +(441900402, 441900, '虎门港管委会', '虎门港管委会', '113.583070', '22.864175', 3, 0, 1), +(441900403, 441900, '东莞生态园', '东莞生态园', '113.927452', '23.063210', 3, 0, 1), +(442000001, 442000, '石岐区街道办事处', '石岐区街道办事处', '113.384930', '22.532046', 3, 0, 1), +(442000002, 442000, '东区街道办事处', '东区街道办事处', '113.392782', '22.517645', 3, 0, 1), +(442000003, 442000, '火炬开发区街道办事处', '火炬开发区街道办事处', '113.480528', '22.566086', 3, 0, 1), +(442000004, 442000, '西区街道办事处', '西区街道办事处', '113.392782', '22.517645', 3, 0, 1), +(442000005, 442000, '南区街道办事处', '南区街道办事处', '113.358509', '22.472530', 3, 0, 1), +(442000006, 442000, '五桂山街道办事处', '五桂山街道办事处', '113.463397', '22.421549', 3, 0, 1), +(442000100, 442000, '小榄镇', '小榄镇', '113.250897', '22.672099', 3, 0, 1), +(442000101, 442000, '黄圃镇', '黄圃镇', '113.335242', '22.709897', 3, 0, 1), +(442000102, 442000, '民众镇', '民众镇', '113.392782', '22.517645', 3, 0, 1), +(442000103, 442000, '东凤镇', '东凤镇', '113.392782', '22.517645', 3, 0, 1), +(442000104, 442000, '东升镇', '东升镇', '113.294393', '22.616908', 3, 0, 1), +(442000105, 442000, '古镇镇', '古镇镇', '113.190869', '22.613406', 3, 0, 1), +(442000106, 442000, '沙溪镇', '沙溪镇', '113.392782', '22.517645', 3, 0, 1), +(442000107, 442000, '坦洲镇', '坦洲镇', '113.460373', '22.265182', 3, 0, 1), +(442000108, 442000, '港口镇', '港口镇', '113.247148', '22.683616', 3, 0, 1), +(442000109, 442000, '三角镇', '三角镇', '113.422371', '22.684688', 3, 0, 1), +(442000110, 442000, '横栏镇', '横栏镇', '113.265845', '22.523201', 3, 0, 1), +(442000111, 442000, '南头镇', '南头镇', '113.392782', '22.517645', 3, 0, 1), +(442000112, 442000, '阜沙镇', '阜沙镇', '113.392782', '22.517645', 3, 0, 1), +(442000113, 442000, '南朗镇', '南朗镇', '113.392782', '22.517645', 3, 0, 1), +(442000114, 442000, '三乡镇', '三乡镇', '113.441614', '22.357754', 3, 0, 1), +(442000115, 442000, '板芙镇', '板芙镇', '113.392782', '22.517645', 3, 0, 1), +(442000116, 442000, '大涌镇', '大涌镇', '113.392782', '22.517645', 3, 0, 1), +(442000117, 442000, '神湾镇', '神湾镇', '113.392782', '22.517645', 3, 0, 1), +(460400100, 460400, '那大镇', '那大镇', '110.349228', '20.017377', 3, 0, 1), +(460400101, 460400, '和庆镇', '和庆镇', '109.640856', '19.525399', 3, 0, 1), +(460400102, 460400, '南丰镇', '南丰镇', '110.349228', '20.017377', 3, 0, 1), +(460400103, 460400, '大成镇', '大成镇', '110.349228', '20.017377', 3, 0, 1), +(460400104, 460400, '雅星镇', '雅星镇', '110.349228', '20.017377', 3, 0, 1), +(460400105, 460400, '兰洋镇', '兰洋镇', '110.349228', '20.017377', 3, 0, 1), +(460400106, 460400, '光村镇', '光村镇', '110.349228', '20.017377', 3, 0, 1), +(460400107, 460400, '木棠镇', '木棠镇', '110.349228', '20.017377', 3, 0, 1), +(460400108, 460400, '海头镇', '海头镇', '110.349228', '20.017377', 3, 0, 1), +(460400109, 460400, '峨蔓镇', '峨蔓镇', '110.349228', '20.017377', 3, 0, 1), +(460400110, 460400, '三都镇', '三都镇', '110.349228', '20.017377', 3, 0, 1), +(460400111, 460400, '王五镇', '王五镇', '110.349228', '20.017377', 3, 0, 1), +(460400112, 460400, '白马井镇', '白马井镇', '109.218734', '19.696407', 3, 0, 1), +(460400113, 460400, '中和镇', '中和镇', '110.349228', '20.017377', 3, 0, 1), +(460400114, 460400, '排浦镇', '排浦镇', '110.349228', '20.017377', 3, 0, 1), +(460400115, 460400, '东成镇', '东成镇', '110.349228', '20.017377', 3, 0, 1), +(460400116, 460400, '新州镇', '新州镇', '110.349228', '20.017377', 3, 0, 1), +(460400400, 460400, '国营西培农场', '国营西培农场', '109.455554', '19.476422', 3, 0, 1), +(460400404, 460400, '国营西联农场', '国营西联农场', '109.539074', '19.673015', 3, 0, 1), +(460400405, 460400, '国营蓝洋农场', '国营蓝洋农场', '109.670723', '19.458984', 3, 0, 1), +(460400407, 460400, '国营八一农场', '国营八一农场', '109.364519', '19.413460', 3, 0, 1), +(460400499, 460400, '洋浦经济开发区', '洋浦经济开发区', '109.202064', '19.736941', 3, 0, 1), +(460400500, 460400, '华南热作学院', '华南热作学院', '109.494073', '19.505382', 3, 0, 1); \ No newline at end of file diff --git a/public/static/home/file/勾股OA员工导入模板.xlsx b/public/static/home/file/勾股OA员工导入模板.xlsx new file mode 100644 index 0000000..53cacf9 Binary files /dev/null and b/public/static/home/file/勾股OA员工导入模板.xlsx differ diff --git a/public/static/home/file/勾股OA客户导入模板.xlsx b/public/static/home/file/勾股OA客户导入模板.xlsx new file mode 100644 index 0000000..217b1e8 Binary files /dev/null and b/public/static/home/file/勾股OA客户导入模板.xlsx differ diff --git a/public/static/home/images/404.gif b/public/static/home/images/404.gif new file mode 100644 index 0000000..dd9a44b Binary files /dev/null and b/public/static/home/images/404.gif differ diff --git a/public/static/home/images/bg.png b/public/static/home/images/bg.png new file mode 100644 index 0000000..1d5015e Binary files /dev/null and b/public/static/home/images/bg.png differ diff --git a/public/static/home/images/bg_pattern.png b/public/static/home/images/bg_pattern.png new file mode 100644 index 0000000..cfd7911 Binary files /dev/null and b/public/static/home/images/bg_pattern.png differ diff --git a/public/static/home/images/bgm.png b/public/static/home/images/bgm.png new file mode 100644 index 0000000..403e270 Binary files /dev/null and b/public/static/home/images/bgm.png differ diff --git a/public/static/home/images/bumen.png b/public/static/home/images/bumen.png new file mode 100644 index 0000000..6551777 Binary files /dev/null and b/public/static/home/images/bumen.png differ diff --git a/public/static/home/images/icon.png b/public/static/home/images/icon.png new file mode 100644 index 0000000..9a516e4 Binary files /dev/null and b/public/static/home/images/icon.png differ diff --git a/public/static/home/images/icon/article.png b/public/static/home/images/icon/article.png new file mode 100644 index 0000000..deabb18 Binary files /dev/null and b/public/static/home/images/icon/article.png differ diff --git a/public/static/home/images/icon/audio.png b/public/static/home/images/icon/audio.png new file mode 100644 index 0000000..d71f256 Binary files /dev/null and b/public/static/home/images/icon/audio.png differ diff --git a/public/static/home/images/icon/doc.png b/public/static/home/images/icon/doc.png new file mode 100644 index 0000000..fa3e0a9 Binary files /dev/null and b/public/static/home/images/icon/doc.png differ diff --git a/public/static/home/images/icon/docx.png b/public/static/home/images/icon/docx.png new file mode 100644 index 0000000..fa3e0a9 Binary files /dev/null and b/public/static/home/images/icon/docx.png differ diff --git a/public/static/home/images/icon/file.png b/public/static/home/images/icon/file.png new file mode 100644 index 0000000..808f5e6 Binary files /dev/null and b/public/static/home/images/icon/file.png differ diff --git a/public/static/home/images/icon/folder.png b/public/static/home/images/icon/folder.png new file mode 100644 index 0000000..9653717 Binary files /dev/null and b/public/static/home/images/icon/folder.png differ diff --git a/public/static/home/images/icon/img.png b/public/static/home/images/icon/img.png new file mode 100644 index 0000000..322f75e Binary files /dev/null and b/public/static/home/images/icon/img.png differ diff --git a/public/static/home/images/icon/pdf.png b/public/static/home/images/icon/pdf.png new file mode 100644 index 0000000..dfac208 Binary files /dev/null and b/public/static/home/images/icon/pdf.png differ diff --git a/public/static/home/images/icon/ppt.png b/public/static/home/images/icon/ppt.png new file mode 100644 index 0000000..2ea671f Binary files /dev/null and b/public/static/home/images/icon/ppt.png differ diff --git a/public/static/home/images/icon/pptx.png b/public/static/home/images/icon/pptx.png new file mode 100644 index 0000000..2ea671f Binary files /dev/null and b/public/static/home/images/icon/pptx.png differ diff --git a/public/static/home/images/icon/rar.png b/public/static/home/images/icon/rar.png new file mode 100644 index 0000000..6872c03 Binary files /dev/null and b/public/static/home/images/icon/rar.png differ diff --git a/public/static/home/images/icon/txt.png b/public/static/home/images/icon/txt.png new file mode 100644 index 0000000..25ae87a Binary files /dev/null and b/public/static/home/images/icon/txt.png differ diff --git a/public/static/home/images/icon/video.png b/public/static/home/images/icon/video.png new file mode 100644 index 0000000..32b6437 Binary files /dev/null and b/public/static/home/images/icon/video.png differ diff --git a/public/static/home/images/icon/xls.png b/public/static/home/images/icon/xls.png new file mode 100644 index 0000000..6517401 Binary files /dev/null and b/public/static/home/images/icon/xls.png differ diff --git a/public/static/home/images/icon/xlsx.png b/public/static/home/images/icon/xlsx.png new file mode 100644 index 0000000..6517401 Binary files /dev/null and b/public/static/home/images/icon/xlsx.png differ diff --git a/public/static/home/images/icon/zip.png b/public/static/home/images/icon/zip.png new file mode 100644 index 0000000..6872c03 Binary files /dev/null and b/public/static/home/images/icon/zip.png differ diff --git a/public/static/home/images/lock_bg.svg b/public/static/home/images/lock_bg.svg new file mode 100644 index 0000000..86d3800 --- /dev/null +++ b/public/static/home/images/lock_bg.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/home/images/login.jpg b/public/static/home/images/login.jpg new file mode 100644 index 0000000..5a2b431 Binary files /dev/null and b/public/static/home/images/login.jpg differ diff --git a/public/static/home/images/logo.png b/public/static/home/images/logo.png new file mode 100644 index 0000000..02e37e7 Binary files /dev/null and b/public/static/home/images/logo.png differ diff --git a/public/static/home/images/nonepic360x360.jpg b/public/static/home/images/nonepic360x360.jpg new file mode 100644 index 0000000..1bad1ba Binary files /dev/null and b/public/static/home/images/nonepic360x360.jpg differ diff --git a/public/static/home/images/nonepic600x360.jpg b/public/static/home/images/nonepic600x360.jpg new file mode 100644 index 0000000..d15f7d1 Binary files /dev/null and b/public/static/home/images/nonepic600x360.jpg differ diff --git a/public/static/home/images/nonepic600x600.jpg b/public/static/home/images/nonepic600x600.jpg new file mode 100644 index 0000000..da1f697 Binary files /dev/null and b/public/static/home/images/nonepic600x600.jpg differ diff --git a/public/static/home/images/syslogo.png b/public/static/home/images/syslogo.png new file mode 100644 index 0000000..08cce71 Binary files /dev/null and b/public/static/home/images/syslogo.png differ diff --git a/public/static/home/images/syslogo_small.png b/public/static/home/images/syslogo_small.png new file mode 100644 index 0000000..82e9893 Binary files /dev/null and b/public/static/home/images/syslogo_small.png differ diff --git a/public/static/jquery.min.js b/public/static/jquery.min.js new file mode 100644 index 0000000..798cc8b --- /dev/null +++ b/public/static/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
                            "],col:[2,"","
                            "],tr:[2,"","
                            "],td:[3,"","
                            "],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
                            ",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0 + + + + + + + + 登录失败 + + + + +
                            +
                            +
                            +
                            4
                            😔
                            1
                            +
                            +
                            哎呀!getMessage(); ?>
                            +
                            + +
                            + + + \ No newline at end of file diff --git a/public/tpl/402.html b/public/tpl/402.html new file mode 100644 index 0000000..2d4fee3 --- /dev/null +++ b/public/tpl/402.html @@ -0,0 +1,38 @@ + + + + + + + + + 出错啦 + + + + +
                            +
                            +
                            +
                            4
                            😔
                            2
                            +
                            +
                            哎呀!getMessage(); ?>
                            +
                            + +
                            + + + \ No newline at end of file diff --git a/public/tpl/403.html b/public/tpl/403.html new file mode 100644 index 0000000..e241d34 --- /dev/null +++ b/public/tpl/403.html @@ -0,0 +1,38 @@ + + + + + + + + + 禁止访问 + + + + +
                            +
                            +
                            +
                            4
                            😔
                            3
                            +
                            +
                            哎呀!getMessage(); ?>
                            +
                            + +
                            + + + \ No newline at end of file diff --git a/public/tpl/404.html b/public/tpl/404.html new file mode 100644 index 0000000..271ff2a --- /dev/null +++ b/public/tpl/404.html @@ -0,0 +1,38 @@ + + + + + + + + + 找不到页面 + + + + +
                            +
                            +
                            +
                            4
                            😔
                            4
                            +
                            +
                            哎呀!getMessage(); ?>
                            +
                            + +
                            + + + \ No newline at end of file diff --git a/public/tpl/405.html b/public/tpl/405.html new file mode 100644 index 0000000..78cfcd7 --- /dev/null +++ b/public/tpl/405.html @@ -0,0 +1,38 @@ + + + + + + + + + 无权限访问 + + + + +
                            +
                            +
                            +
                            4
                            😔
                            5
                            +
                            +
                            哎呀!getMessage(); ?>
                            +
                            + +
                            + + + \ No newline at end of file diff --git a/public/tpl/406.html b/public/tpl/406.html new file mode 100644 index 0000000..f52094d --- /dev/null +++ b/public/tpl/406.html @@ -0,0 +1,37 @@ + + + + + + + + + 找不到相关记录 + + + + +
                            +
                            +
                            +
                            4
                            😔
                            6
                            +
                            +
                            哎呀!getMessage(); ?>
                            +
                            + +
                            + + \ No newline at end of file diff --git a/public/tpl/500.html b/public/tpl/500.html new file mode 100644 index 0000000..a597537 --- /dev/null +++ b/public/tpl/500.html @@ -0,0 +1,38 @@ + + + + + + + + + 页面错误 + + + + +
                            +
                            +
                            +
                            5
                            😔
                            0
                            +
                            +
                            哎呀!页面错误
                            +
                            + +
                            + + + \ No newline at end of file diff --git a/public/tpl/default_index.tpl b/public/tpl/default_index.tpl new file mode 100644 index 0000000..931c964 --- /dev/null +++ b/public/tpl/default_index.tpl @@ -0,0 +1,42 @@ + + + + + + + + 系统提示 + + + +
                            +
                            +
                            5
                            😔
                            😔
                            +
                            哎呀!出错啦,请开启debug模式调试,开启debug
                            +
                            + +
                            + +'; + } +} diff --git a/public/tpl/dispatch_jump.tpl b/public/tpl/dispatch_jump.tpl new file mode 100644 index 0000000..f59fef2 --- /dev/null +++ b/public/tpl/dispatch_jump.tpl @@ -0,0 +1,69 @@ + + + + + + + + 跳转提示 + + + + + + + + +
                            + + +
                            + + +
                            + + +
                            +
                            + 页面自动 跳转,等待时间: +
                            +
                            + + + diff --git a/public/tpl/error.html b/public/tpl/error.html new file mode 100644 index 0000000..1aa9cdc --- /dev/null +++ b/public/tpl/error.html @@ -0,0 +1,42 @@ + + + + + + + + + 系统提示 + + + + +
                            +
                            +
                            4
                            😔
                            1
                            +
                            4
                            😔
                            2
                            +
                            4
                            😔
                            3
                            +
                            4
                            😔
                            4
                            +
                            4
                            😔
                            5
                            +
                            4
                            😔
                            6
                            +
                            5
                            😔
                            😔
                            +
                            哎呀!{$warning|default="出错啦!"}
                            +
                            + +
                            + + + \ No newline at end of file diff --git a/public/tpl/page_trace.tpl b/public/tpl/page_trace.tpl new file mode 100644 index 0000000..7c5df6f --- /dev/null +++ b/public/tpl/page_trace.tpl @@ -0,0 +1,71 @@ +
                            + + +
                            +
                            +
                            + +
                            + + diff --git a/public/tpl/think_exception.tpl b/public/tpl/think_exception.tpl new file mode 100644 index 0000000..9b9b2cb --- /dev/null +++ b/public/tpl/think_exception.tpl @@ -0,0 +1,500 @@ +'.end($names).''; + } +} + +if (!function_exists('parse_file')) { + function parse_file($file, $line) + { + return ''.basename($file)." line {$line}".''; + } +} + +if (!function_exists('parse_args')) { + function parse_args($args) + { + $result = []; + foreach ($args as $key => $item) { + switch (true) { + case is_object($item): + $value = sprintf('object(%s)', parse_class(get_class($item))); + break; + case is_array($item): + if (count($item) > 3) { + $value = sprintf('[%s, ...]', parse_args(array_slice($item, 0, 3))); + } else { + $value = sprintf('[%s]', parse_args($item)); + } + break; + case is_string($item): + if (strlen($item) > 20) { + $value = sprintf( + '\'%s...\'', + htmlentities($item), + htmlentities(substr($item, 0, 20)) + ); + } else { + $value = sprintf("'%s'", htmlentities($item)); + } + break; + case is_int($item): + case is_float($item): + $value = $item; + break; + case is_null($item): + $value = 'null'; + break; + case is_bool($item): + $value = '' . ($item ? 'true' : 'false') . ''; + break; + case is_resource($item): + $value = 'resource'; + break; + default: + $value = htmlentities(str_replace("\n", '', var_export(strval($item), true))); + break; + } + + $result[] = is_int($key) ? $value : "'{$key}' => {$value}"; + } + + return implode(', ', $result); + } +} +if (!function_exists('echo_value')) { + function echo_value($val) + { + if (is_array($val) || is_object($val)) { + echo htmlentities(json_encode($val, JSON_PRETTY_PRINT)); + } elseif (is_bool($val)) { + echo $val ? 'true' : 'false'; + } elseif (is_scalar($val)) { + echo htmlentities($val); + } else { + echo 'Resource'; + } + } +} +?> + + + + + 错误 + + + + + + $trace) { ?> +
                            +
                            +
                            +
                            +

                            +
                            +

                            +
                            +
                            + +
                            +
                              $value) { ?>
                            1. ">
                            +
                            + +
                            +

                            Call Stack

                            +
                              +
                            1. + +
                            2. + +
                            3. + +
                            +
                            +
                            + + +
                            +

                            +
                            + + + +
                            +

                            Exception Datas

                            + $value) { ?> + + + + + + + $val) { ?> + + + + + + + +
                            empty
                            + +
                            + + + +
                            +

                            Environment Variables

                            + $value) { ?> + + + + + + + $val) { ?> + + + + + + + +
                            empty
                            + +
                            + + + + + + + + diff --git a/route/app.php b/route/app.php new file mode 100644 index 0000000..d8e09e3 --- /dev/null +++ b/route/app.php @@ -0,0 +1,17 @@ + +// +---------------------------------------------------------------------- +use think\facade\Route; + +Route::get('think', function () { + return 'hello,ThinkPHP6!'; +}); + +Route::get('hello/:name', 'index/hello'); diff --git a/runtime/.gitignore b/runtime/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/runtime/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/think b/think new file mode 100644 index 0000000..2429d22 --- /dev/null +++ b/think @@ -0,0 +1,10 @@ +#!/usr/bin/env php +console->run(); \ No newline at end of file diff --git a/update_sql/v5.0升级到v5.5.sql b/update_sql/v5.0升级到v5.5.sql new file mode 100644 index 0000000..e562a3d --- /dev/null +++ b/update_sql/v5.0升级到v5.5.sql @@ -0,0 +1,833 @@ +ALTER TABLE `oa_admin` +ADD COLUMN `auth_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '可见部门数据' AFTER `auth_did`; + +ALTER TABLE `oa_admin` +ADD COLUMN `son_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '可见子部门数据' AFTER `auth_dids`; + +ALTER TABLE `oa_admin_group` +ADD COLUMN `mobile_bar` mediumtext NULL COMMENT '手机端Bar' AFTER `layouts`; + +ALTER TABLE `oa_admin_group` +ADD COLUMN `mobile_menu` mediumtext NULL COMMENT '手机端工作台' AFTER `mobile_bar`; + +ALTER TABLE `oa_project` +ADD COLUMN `code` varchar(255) NOT NULL DEFAULT '' COMMENT '项目编号' AFTER `name`; + +ALTER TABLE `oa_project` +ADD COLUMN `amount` decimal(15, 2) NULL DEFAULT 0.00 COMMENT '项目金额' AFTER `code`; + +ALTER TABLE `oa_project_task` +ADD COLUMN `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门' AFTER `director_uid`; + +ALTER TABLE `oa_project_document` +ADD COLUMN `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属部门' AFTER `title`; + +-- ---------------------------- +-- Table structure for oa_comment +-- ---------------------------- +DROP TABLE IF EXISTS `oa_comment`; +CREATE TABLE `oa_comment` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `module` varchar(100) NOT NULL DEFAULT '' COMMENT '模块', + `topic_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联主题id', + `pid` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复内容id', + `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人', + `to_uids` varchar(100) NOT NULL DEFAULT '' COMMENT '@用户id', + `content` mediumtext NULL COMMENT '评论内容', + `md_content` mediumtext NULL COMMENT 'markdown评论内容', + `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '修改时间', + `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '评论表'; + +-- ---------------------------- +-- Table structure for oa_comment_read +-- ---------------------------- +DROP TABLE IF EXISTS `oa_comment_read`; +CREATE TABLE `oa_comment_read` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `comment_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联评论id', + `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '已读人', + `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '评论已读回执表'; + +-- ---------------------------- +-- Table structure for oa_edit_log +-- ---------------------------- +DROP TABLE IF EXISTS `oa_edit_log`; +CREATE TABLE `oa_edit_log` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '标识', + `field` varchar(100) NOT NULL DEFAULT '' COMMENT '字段', + `action_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联id', + `second_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '第二关联id', + `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作人', + `old_content` mediumtext NULL COMMENT '修改前的内容', + `new_content` mediumtext NULL COMMENT '修改后的内容', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '编辑数据记录表'; + +-- ---------------------------- +-- Table structure for oa_mobile_bar +-- ---------------------------- +DROP TABLE IF EXISTS `oa_mobile_bar`; +CREATE TABLE `oa_mobile_bar` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称', + `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标', + `url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接', + `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序:越大越靠前', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:-1删除 0禁用 1启用', + `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端Bar表'; + +-- ---------------------------- +-- Records of oa_mobile_bar +-- ---------------------------- +INSERT INTO `oa_mobile_bar` VALUES (1, '工作台', 'icon-gongzuotai1', '/qiye/index/index', 0, 1, 1723277311, 1733147213); +INSERT INTO `oa_mobile_bar` VALUES (2, '客户', 'icon-kehu', '/qiye/customer/index', 0, 1, 1723277311, 1733147238); +INSERT INTO `oa_mobile_bar` VALUES (3, '合同', 'icon-hetong2', '/qiye/contract/index', 0, 1, 1723277351, 1733147266); +INSERT INTO `oa_mobile_bar` VALUES (4, '项目', 'icon-xiangmu1', '/qiye/project/index', 0, 1, 1723277356, 1733147298); +INSERT INTO `oa_mobile_bar` VALUES (5, '消息', 'icon-xiaoxi1', '/qiye/msg/index', 0, 1, 1723277368, 1733147331); + +-- ---------------------------- +-- Table structure for oa_mobile_types +-- ---------------------------- +DROP TABLE IF EXISTS `oa_mobile_types`; +CREATE TABLE `oa_mobile_types` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称', + `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标', + `bgcolor` varchar(255) NOT NULL DEFAULT '' COMMENT '背景颜色', + `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序:越大越靠前', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:-1删除 0禁用 1启用', + `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端工作台菜单类型表'; + +-- ---------------------------- +-- Records of oa_mobile_types +-- ---------------------------- +INSERT INTO `oa_mobile_types` VALUES (1, '办公审批', '', 'blue', 0, 1, 1723277311, 0); +INSERT INTO `oa_mobile_types` VALUES (2, '效率工具', '', 'green', 0, 1, 1723277311, 0); +INSERT INTO `oa_mobile_types` VALUES (3, '内部管理', '', 'yellow', 0, 1, 1723277351, 0); +INSERT INTO `oa_mobile_types` VALUES (4, '财务管理', '', 'purple', 0, 1, 1723277356, 0); + +-- ---------------------------- +-- Table structure for oa_mobile_menu +-- ---------------------------- +DROP TABLE IF EXISTS `oa_mobile_menu`; +CREATE TABLE `oa_mobile_menu` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '名称', + `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标', + `bgcolor` varchar(255) NOT NULL DEFAULT '' COMMENT '背景颜色', + `url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接', + `types` int(11) NOT NULL DEFAULT 0 COMMENT '关联菜单类型', + `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序:越大越靠前', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:-1删除 0禁用 1启用', + `create_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '手机端菜单表'; + +-- ---------------------------- +-- Records of oa_mobile_menu +-- ---------------------------- +INSERT INTO `oa_mobile_menu` VALUES (1, '审批申请', 'icon-shenpi','blue', '/qiye/approve/apply', 1, 0, 1, 1733146294, 1733152760, 0); +INSERT INTO `oa_mobile_menu` VALUES (2, '我申请的', 'icon-wodeshenpi1','blue', '/qiye/approve/mylist', 1, 0, 1, 1733152749, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (3, '我处理的', 'icon-chulishenpi','blue', '/qiye/approve/checklist', 1, 0, 1, 1733152798, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (4, '抄送给我', 'icon-chaosong','blue', '/qiye/approve/copylist', 1, 0, 1, 1733152823, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (5, '日程安排', 'icon-richeng','green', '/qiye/index/calendar', 2, 0, 1, 1733152855, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (6, '工作记录', 'icon-jilu','green', '/qiye/index/schedule', 2, 0, 1, 1733152878, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (7, '工作汇报', 'icon-huibao','green', '/qiye/index/work', 2, 0, 1, 1733152906, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (8, '公告通知', 'icon-gonggaotongzhi','yellow', '/qiye/index/note', 3, 0, 1, 1733152965, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (9, '公司新闻', 'icon-gongsixinwen','yellow', '/qiye/index/news', 3, 0, 1, 1733152993, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (10, '会议纪要', 'icon-huiyijiyao','yellow', '/qiye/index/meeting', 3, 0, 1, 1733152993, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (11, '报销管理', 'icon-a-baoxiao3','purple', '/qiye/finance/expense', 4, 0, 1, 1733153019, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (12, '开票管理', 'icon-kaipiao','purple', '/qiye/finance/invoice', 4, 0, 1, 1733153047, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (13, '收票管理', 'icon-shoupiao','purple', '/qiye/finance/ticket', 4, 0, 1, 1733153077, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (14, '回款管理', 'icon-huikuan','purple', '/qiye/finance/income', 4, 0, 1, 1733153106, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (15, '付款管理', 'icon-fukuan','purple', '/qiye/finance/payment', 4, 0, 1, 1733153131, 0, 0); + + +-- ---------------------------- +-- Table structure for oa_admin_rule +-- ---------------------------- +DROP TABLE IF EXISTS `oa_admin_rule`; +CREATE TABLE `oa_admin_rule` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `pid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父id', + `src` varchar(255) NOT NULL DEFAULT '' COMMENT 'url链接', + `title` varchar(255) NOT NULL DEFAULT '' COMMENT '名称', + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '日志操作名称', + `module` varchar(255) NOT NULL DEFAULT '' COMMENT '所属模块', + `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标', + `menu` int(1) NOT NULL DEFAULT 0 COMMENT '是否是菜单,1是,2不是', + `sort` int(11) NOT NULL DEFAULT 1 COMMENT '越小越靠前', + `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态,0禁用,1正常', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '菜单及权限表'; + +-- ---------------------------- +-- Records of oa_admin_rule +-- ---------------------------- +INSERT INTO `oa_admin_rule` VALUES (1, 0, '', '系统管理', '系统管理', 'home', 'icon-jichupeizhi', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (2, 0, '', '基础数据', '基础数据', 'base', 'icon-hetongshezhi', 1, 2, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (3, 0, '', '人事管理', '人事管理', 'user', 'icon-renshishezhi', 1, 3, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (4, 0, '', '行政办公', '行政办公', 'adm', 'icon-banjiguanli', 1, 4, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (5, 0, '', '个人办公', '个人办公', 'office', 'icon-kaoshijihua', 1, 5, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (6, 0, '', '财务管理', '财务管理', 'finance', 'icon-yuangongtidian', 1, 6, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (7, 0, '', '客户管理', '客户管理', 'customer', 'icon-kehuguanli', 1, 7, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (8, 0, '', '合同管理', '合同管理', 'contract', 'icon-hetongyidong', 1, 8, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (9, 0, '', '项目管理', '项目管理', 'project', 'icon-xiangmuguanli', 1, 9, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (10, 0, '', '知识网盘', '知识网盘', 'disk', 'icon-tikuguanli', 1, 10, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (11, 1, 'home/conf/index', '系统配置', '系统配置', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (12, 11, 'home/conf/add', '新建/编辑', '配置项', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (13, 11, 'home/conf/delete', '删除', '配置项', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (14, 11, 'home/conf/edit', '编辑', '配置详情', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (15, 1, 'home/module/index', '功能模块', '功能模块', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (16, 15, 'home/module/add', '新建/编辑', '功能模块', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (17, 15, 'home/module/del', '删除', '功能模块', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (18, 15, 'home/module/recovery', '恢复', '功能模块', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (19, 15, 'home/module/install', '安装', '功能模块', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (20, 1, 'home/dataauth/index', '模块配置', '模块配置', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (21, 20, 'home/dataauth/edit', '编辑', '模块配置', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (22, 1, 'home/rule/index', '功能节点', '功能节点', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (23, 22, 'home/rule/add', '新建/编辑', '功能节点', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (24, 22, 'home/rule/delete', '删除', '功能节点', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (25, 1, 'mobile/bar/datalist', '移动端配置', '移动端配置', 'home', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (26, 25, 'mobile/bar/datalist', 'BAR菜单', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (27, 26, 'mobile/bar/add', '新建/编辑', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (28, 26, 'mobile/bar/set', '设置', 'BAR菜单', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (29, 25, 'mobile/types/datalist', '工作台菜单类型', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (30, 29, 'mobile/types/add', '新建/编辑', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (31, 29, 'mobile/types/del', '删除', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (32, 29, 'mobile/types/set', '设置', '工作台菜单类型', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (33, 25, 'mobile/menu/datalist', '工作台菜单', '工作台菜单', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (34, 33, 'mobile/menu/add', '新建/编辑', '工作台菜单', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (35, 33, 'mobile/menu/del', '删除', '工作台菜单', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (36, 33, 'mobile/menu/set', '设置', '工作台菜单', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (37, 1, 'home/role/index', '角色权限', '角色权限', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (38, 37, 'home/role/add', '新建/编辑', '角色权限', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (39, 37, 'home/role/delete', '删除', '角色权限', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (40, 1, 'home/log/index', '操作日志', '操作日志', 'home', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (41, 1, 'home/files/index', '附件管理','附件管理', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (42, 41, 'home/files/edit', '编辑附件','附件', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (43, 41, 'home/files/move', '移动附件','附件', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (44, 41, 'home/files/delete', '删除附件','附件', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (45, 41, 'home/files/get_group', '附件分组','附件分组', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (46, 41, 'home/files/add_group', '新建/编辑','附件分组', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (47, 41, 'home/files/del_group', '删除附件分组','附件分组', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (48, 1, 'home/database/database', '备份数据', '数据备份', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (49, 48, 'home/database/backup', '备份数据表', '数据', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (50, 48, 'home/database/optimize', '优化数据表', '数据表', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (51, 48, 'home/database/repair', '修复数据表', '数据表', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (52, 1, 'home/database/backuplist', '还原数据', '数据还原', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (53, 52, 'home/database/import', '还原数据表', '数据', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (54, 52, 'home/database/downfile', '下载备份数据', '备份数据', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (55, 52, 'home/database/del', '删除备份数据', '备份数据', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (56, 1, 'home/task/index', '定时任务', '定时任务', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (57, 56, 'home/task/add', '新建/编辑', '定时任务', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (58, 56, 'home/task/delete', '删除', '定时任务', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (59, 2, '', '公共模块', '公共模块', 'home', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (60, 59, 'home/template/datalist', '消息模板', '消息模板', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (61, 60, 'home/template/add', '新建/编辑', '消息模板', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (62, 60, 'home/template/set', '设置', '消息模板', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (63, 60, 'home/template/view', '查看', '消息模板', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (64, 59, 'adm/flow/modulelist', '审批模块', '审批模块', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (65, 64, 'adm/flow/module_add', '新建/编辑', '审批模块', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (66, 64, 'adm/flow/module_check', '设置', '审批模块', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (67, 59, 'adm/flow/catelist', '审批类型', '审批类型', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (68, 67, 'adm/flow/cate_add', '新建/编辑', '审批类型', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (69, 67, 'adm/flow/cate_check', '设置', '审批类型', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (70, 59, 'adm/flow/datalist', '审批流程', '审批流程', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (71, 70, 'adm/flow/add', '新建/编辑', '审批流程', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (72, 70, 'adm/flow/del', '删除', '审批流程', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (73, 70, 'adm/flow/check', '设置', '审批流程', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (74, 59, 'home/cate/enterprise', '企业主体', '企业主体', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (75, 74, 'home/cate/enterprise_add', '新建/编辑', '企业主体', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (76, 74, 'home/cate/enterprise_set', '设置', '企业主体', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (77, 59, 'home/area/datalist', '全国省市', '全国省市', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (78, 77, 'home/area/add', '新建/编辑', '全国省市', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (79, 77, 'home/area/set', '设置', '全国省市', 'home', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (80, 2, '', '人事模块', '人事模块', 'user', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (81, 80, 'user/rewardscate/datalist', '奖罚项目', '奖罚项目', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (82, 81, 'user/rewardscate/add', '新建/编辑', '奖罚项目', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (83, 81, 'user/rewardscate/set', '设置', '奖罚项目', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (84, 80, 'user/carecate/datalist', '关怀项目', '关怀项目', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (85, 84, 'user/carecate/add', '新建/编辑', '关怀项目', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (86, 84, 'user/carecate/set', '设置', '关怀项目', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (87, 80, 'user/basic/datalist', '常规数据', '常规数据', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (88, 87, 'user/basic/add', '新建/编辑', '常规数据', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (89, 87, 'user/basic/set', '设置', '常规数据', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (90, 3, 'user/department/index', '部门架构', '部门', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (91, 90, 'user/department/add', '新建/编辑', '部门', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (92, 90, 'user/department/delete', '删除', '部门', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (93, 3, 'user/position/index', '岗位职称', '岗位职称', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (94, 93, 'user/position/add', '新建/编辑', '岗位职称', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (95, 93, 'user/position/delete', '删除', '岗位职称', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (96, 93, 'user/position/view', '查看', '岗位职称', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (97, 3, 'user/user/index', '企业员工', '员工', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (98, 97, 'user/user/add', '新建/编辑', '员工', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (99, 97, 'user/user/view', '查看', '员工信息', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (100, 97, 'user/user/set', '设置', '员工状态', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (101, 97, 'user/user/reset_psw', '重设密码', '员工密码', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (102, 3, 'user/files/datalist', '员工档案', '员工档案', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (103, 102, 'user/files/add', '编辑', '员工档案', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (104, 102, 'user/files/view', '查看', '员工档案', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (105, 102, 'user/files/set', '设置', '员工档案', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (106, 3, 'user/personal/change', '人事调动', '人事调动', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (107, 106, 'user/personal/change_add', '新建/编辑', '人事调动', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (108, 3, 'user/personal/leave', '离职档案', '离职档案', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (109, 108, 'user/personal/leave_add', '新建/编辑', '离职档案', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (110, 108, 'user/personal/leave_delete', '删除', '离职档案', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (111, 108, 'user/personal/leave_check', '资料交接', '离职资料', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (112, 3, 'user/rewards/datalist', '奖罚管理', '奖罚管理', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (113, 112, 'user/rewards/add', '新建/编辑', '奖罚管理', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (114, 112, 'user/rewards/view', '查看', '奖罚管理', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (115, 112, 'user/rewards/del', '删除', '奖罚管理', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (116, 3, 'user/care/datalist', '员工关怀', '员工关怀', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (117, 116, 'user/care/add', '新建/编辑', '员工关怀', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (118, 116, 'user/care/view', '查看', '员工关怀', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (119, 116, 'user/care/del', '删除', '员工关怀', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (120, 3, 'user/laborcontract/datalist', '员工合同', '员工合同', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (121, 120, 'user/laborcontract/add', '新建/编辑', '员工合同', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (122, 120, 'user/laborcontract/add_renewal', '续签', '员工合同', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (123, 120, 'user/laborcontract/add_change', '变更', '员工合同', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (124, 120, 'user/laborcontract/view', '查看', '员工合同', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (125, 120, 'user/laborcontract/del', '删除', '员工合同', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (126, 120, 'user/laborcontract/set', '设置', '员工合同', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (127, 2, '', '行政模块', '行政模块', 'adm', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (128, 127, 'adm/propertycate/datalist', '资产分类', '资产分类', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (129, 128, 'adm/propertycate/add', '新建/编辑', '资产分类', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (130, 128, 'adm/propertycate/del', '删除', '资产分类', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (131, 127, 'adm/propertybrand/datalist', '资产品牌', '资产品牌', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (132, 131, 'adm/propertybrand/add', '新建/编辑', '资产品牌', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (133, 131, 'adm/propertybrand/check', '设置', '资产品牌', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (134, 127, 'adm/propertyunit/datalist', '资产单位', '资产单位', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (135, 134, 'adm/propertyunit/add', '新建/编辑', '资产单位', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (136, 134, 'adm/propertyunit/check', '设置', '资产单位', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (137, 127, 'adm/sealcate/datalist', '印章管理', '印章', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (138, 137, 'adm/sealcate/add', '新建/编辑', '印章', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (139, 137, 'adm/sealcate/check', '设置', '印章', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (140, 127, 'adm/basic/datalist', '常规数据', '常规数据', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (141, 140, 'adm/basic/add', '新建/编辑', '常规数据', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (142, 140, 'adm/basic/set', '设置', '常规数据', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (143, 4, '', '固定资产', '固定资产', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (144, 143, 'adm/property/datalist', '资产信息', '固定资产', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (145, 144, 'adm/property/add', '新建/编辑', '固定资产', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (146, 144, 'adm/property/check', '设置', '固定资产', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (147, 144, 'adm/property/view', '查看', '固定资产', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (148, 143, 'adm/property/repair_list', '报修记录', '资产报修记录', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (149, 148, 'adm/property/repair_add', '新建/编辑', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (150, 148, 'adm/property/repair_view', '查看', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (151, 148, 'adm/property/repair_del', '删除', '资产报修记录', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (152, 4, '', '车辆管理', '车辆', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (153, 152, 'adm/car/datalist', '车辆信息', '车辆', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (154, 153, 'adm/car/add', '新建/编辑', '车辆', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (155, 153, 'adm/car/check', '设置', '车辆', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (156, 153, 'adm/car/view', '查看', '车辆', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (157, 152, 'adm/car/repair_list', '车辆维修', '车辆维修记录', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (158, 157, 'adm/car/repair_add', '新建/编辑', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (159, 157, 'adm/car/repair_view', '查看', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (160, 157, 'adm/car/repair_del', '删除', '车辆维修记录', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (161, 152, 'adm/car/protect_list', '车辆保养', '车辆保养记录', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (162, 161, 'adm/car/protect_add', '新建/编辑', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (163, 161, 'adm/car/protect_view', '查看', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (164, 161, 'adm/car/protect_del', '删除', '车辆保养记录', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (165, 152, 'adm/car/mileage_list', '车辆里程', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (166, 165, 'adm/car/mileage_add', '新建/编辑', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (167, 165, 'adm/car/mileage_del', '删除', '车辆里程记录', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (168, 152, 'adm/car/fee_list', '车辆费用', '车辆费用记录', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (169, 168, 'adm/car/fee_add', '新建/编辑', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (170, 168, 'adm/car/fee_view', '查看', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (171, 168, 'adm/car/fee_del', '删除', '车辆费用记录', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (172, 4, '', '会议管理', '会议管理', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (173, 172, 'adm/meeting/room', '会议室管理', '会议室', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (174, 173, 'adm/meeting/room_add', '新建/编辑', '会议室', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (175, 173, 'adm/meeting/room_view', '查看', '会议纪要', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (176, 173, 'adm/meeting/room_check', '设置', '会议室', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (177, 172, 'adm/meeting/records', '会议记录', '会议记录', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (178, 177, 'adm/meeting/records_add', '新建/编辑', '会议记录', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (179, 177, 'adm/meeting/records_view', '查看', '会议纪要', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (180, 177, 'adm/meeting/records_del', '删除', '会议纪要', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (181, 4, '', '公文管理', '公文管理', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (182, 181, 'adm/official/datalist', '公文列表', '公文管理', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (183, 182, 'adm/official/add', '新建/编辑', '公文管理', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (184, 182, 'adm/official/view', '查看', '公文管理', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (185, 182, 'adm/official/del', '删除', '公文管理', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (186, 181, 'adm/official/pending', '待审公文', '公文管理', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (187, 181, 'adm/official/reviewed', '已审公文', '公文管理', 'adm', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (188, 4, '', '用章管理', '用章管理', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (189, 188, 'adm/seal/datalist', '用章申请', '用章申请', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (190, 189, 'adm/seal/add', '新建/编辑', '用章申请', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (191, 189, 'adm/seal/view', '查看', '用章申请', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (192, 189, 'adm/seal/del', '删除', '用章申请', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (193, 188, 'adm/seal/record', '用章记录', '用章记录', 'adm', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (194, 127, 'adm/notecate/datalist', '公告类型', '公告类型', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (195, 194, 'adm/notecate/add', '新建/编辑', '公告类型', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (196, 194, 'adm/notecate/set', '设置', '公告类型', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (197, 4, 'adm/note/datalist', '公告列表', '公告', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (198, 197, 'adm/note/add', '新建/编辑', '公告', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (199, 197, 'adm/note/del', '删除', '公告', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (200, 197, 'adm/note/view', '查看', '公告', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (201, 4, 'adm/news/datalist', '公司新闻', '公司新闻', 'adm', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (202, 201, 'adm/news/add', '新建/编辑', '公司新闻', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (203, 201, 'adm/news/del', '删除', '公司新闻', 'adm', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (204, 201, 'adm/news/view', '查看', '公司新闻', 'adm', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (205, 5, 'oa/plan/datalist', '日程安排', '日程安排', 'oa', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (206, 205, 'oa/plan/add', '新建/编辑', '日程安排', 'oa', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (207, 205, 'oa/plan/view', '查看', '日程安排', 'oa', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (208, 205, 'oa/plan/del', '删除', '日程安排', 'oa', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (209, 5, 'oa/plan/calendar', '日程日历', '日程安排', 'oa', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (210, 5, 'oa/schedule/datalist', '工作记录', '工作记录', 'oa', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (211, 210, 'oa/schedule/add', '新建/编辑', '工作记录', 'oa', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (212, 210, 'oa/schedule/view', '查看', '工作记录', 'oa', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (213, 210, 'oa/schedule/del', '删除', '工作记录', 'oa', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (214, 5, 'oa/schedule/calendar', '工作日历', '工作日历', 'oa', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (215, 5, 'oa/work/datalist', '工作汇报', '工作汇报', 'oa', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (216, 215, 'oa/work/add', '新建/编辑', '工作汇报', 'oa', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (217, 215, 'oa/work/send', '发送', '工作汇报', 'oa', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (218, 215, 'oa/work/view', '查看', '工作汇报', 'oa', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (219, 215, 'oa/work/del', '删除', '工作汇报', 'oa', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (220, 5, 'oa/note/datalist', '公告通知', '公告通知', 'oa', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (221, 220, 'oa/note/view', '查看', '公告通知', 'oa', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (222, 5, 'oa/news/datalist', '公司新闻', '公司新闻', 'oa', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (223, 222, 'oa/news/view', '查看', '公司新闻', 'oa', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (224, 5, 'oa/meeting/datalist', '会议纪要', '会议纪要', 'oa', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (225, 224, 'oa/meeting/view', '查看', '会议纪要', 'oa', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (226, 2, '', '财务模块', '财务模块', 'finance', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (227, 226, 'finance/expensecate/datalist', '报销类型', '报销类型', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (228, 227, 'finance/expensecate/add', '新建/编辑', '报销类型', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (229, 227, 'finance/expensecate/set', '设置', '报销类型', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (230, 226, 'finance/costcate/datalist', '费用类型', '费用类型', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (231, 230, 'finance/costcate/add', '新建/编辑', '费用类型', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (233, 230, 'finance/costcate/set', '设置', '费用类型', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (234, 6, 'finance/expense/datalist', '报销管理', '报销', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (235, 234, 'finance/expense/add', '新建/编辑', '报销', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (236, 234, 'finance/expense/del', '删除', '报销', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (237, 234, 'finance/expense/view', '查看', '报销', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (238, 6, 'finance/invoice/datalist', '开票管理', '发票', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (239, 238, 'finance/invoice/add', '新建/编辑', '发票', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (240, 238, 'finance/invoice/del', '删除', '发票', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (241, 238, 'finance/invoice/view', '查看', '发票', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (242, 6, 'finance/ticket/datalist', '收票管理', '发票', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (243, 242, 'finance/ticket/add', '新建/编辑', '发票', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (244, 242, 'finance/ticket/delete', '删除', '发票', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (245, 242, 'finance/ticket/view', '查看', '发票', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (246, 6, 'finance/income/datalist', '回款管理', '回款记录', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (247, 246, 'finance/income/add', '新建/编辑', '回款记录', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (248, 246, 'finance/income/view', '查看', '回款记录', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (249, 246, 'finance/income/del', '删除', '回款记录', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (250, 6, 'finance/invoice/datalist_a', '无发票回款', '无发票回款', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (251, 250, 'finance/invoice/add_a', '新建/编辑', '无发票回款', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (252, 250, 'finance/invoice/del_a', '删除', '无发票回款', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (253, 250, 'finance/invoice/view_a', '查看', '无发票回款', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (254, 6, 'finance/payment/datalist', '付款管理', '付款记录', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (255, 254, 'finance/payment/add', '新建/编辑', '付款记录', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (256, 254, 'finance/payment/view', '查看', '付款记录', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (257, 254, 'finance/payment/del', '删除', '付款记录', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (258, 6, 'finance/ticket/datalist_a', '无发票付款', '无发票付款', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (259, 258, 'finance/ticket/add_a', '新建/编辑', '无发票付款', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (260, 258, 'finance/ticket/del_a', '删除', '无发票付款', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (261, 258, 'finance/ticket/view_a', '查看', '无发票付款', 'finance', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (262, 6, '', '财务统计', '财务统计', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (263, 262, 'finance/expense/record', '报销记录', '报销记录', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (264, 262, 'finance/invoice/record', '开票记录', '开票记录', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (265, 262, 'finance/ticket/record', '收票记录', '收票记录', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (266, 262, 'finance/income/record', '回款记录', '回款记录', 'finance', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (267, 262, 'finance/payment/record', '付款记录', '付款记录', 'finance', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (268, 2, '', '客户模块', '客户模块', 'customer', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (269, 268, 'customer/industry/datalist', '行业类型', '行业类型', 'home', '', 1, 0, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (270, 269, 'customer/industry/add', '新建/编辑', '行业类型', 'home', '', 2, 0, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (271, 269, 'customer/industry/set', '设置', '行业类型', 'home', '', 2, 0, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (272, 268, 'customer/grade/datalist', '客户等级', '客户等级', 'customer', '', 1, 0, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (273, 272, 'customer/grade/add', '新建/编辑', '客户等级', 'customer', '', 2, 0, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (274, 272, 'customer/grade/set', '设置', '客户等级', 'customer', '', 2,0, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (275, 268, 'customer/source/datalist', '客户渠道', '客户渠道', 'customer', '', 1, 0, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (276, 275, 'customer/source/add', '新建/编辑', '客户渠道', 'customer', '', 2, 0, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (277, 275, 'customer/source/set', '设置', '客户渠道', 'customer', '', 2,0, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (278, 268, 'customer/basic/datalist', '常规数据', '常规数据', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (279, 278, 'customer/basic/add', '新建/编辑', '常规数据', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (280, 278, 'customer/basic/set', '设置', '常规数据', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (281, 7, 'customer/customer/datalist', '客户列表', '客户列表', 'customer', '', 1, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (282, 281, 'customer/customer/add', '新建/编辑', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (283, 281, 'customer/customer/view', '查看', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (284, 281, 'customer/customer/del', '删除', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (285, 7, 'customer/index/rush', '抢 客 宝', '抢客宝', 'customer', '', 1, 0, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (286, 7, 'customer/index/sea', '公海客户', '客户', 'customer', '', 1, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (287, 286, 'customer/index/to_get', '获取', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (288, 286, 'customer/index/to_divide', '分配客户', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (289, 286, 'customer/index/to_sea', '转入公海', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (290, 286, 'customer/index/to_trash', '转入废弃池', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); +INSERT INTO `oa_admin_rule` VALUES (291, 286, 'customer/index/to_revert', '恢复客户', '客户', 'customer', '', 2, 0, 1, 1556143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (292, 7, 'customer/index/trash', '废弃客户', '客户', 'customer', '', 1, 0, 1, 1556143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (293, 7, 'customer/contact/datalist', '客户联系人', '联系人', 'customer', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (294, 286, 'customer/contact/add', '新建/编辑', '联系人', 'customer', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (295, 286, 'customer/contact/del', '删除', '联系人', 'customer', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (296, 286, 'customer/contact/view', '查看', '客户联系人', 'customer', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (297, 7, 'customer/chance/datalist', '机会线索', '机会线索', 'customer', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (298, 297, 'customer/chance/add', '新建/编辑', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (299, 297, 'customer/chance/view', '查看', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (300, 297, 'customer/chance/del', '删除', '机会线索', 'customer', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (301, 7, 'customer/trace/datalist', '跟进记录', '跟进记录', 'customer', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (302, 301, 'customer/trace/add', '新建/编辑', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (303, 301, 'customer/trace/view', '查看', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (304, 301, 'customer/trace/del', '删除', '跟进记录', 'customer', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (305, 2, '', '合同模块', '合同模块', 'contract', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (306, 305, 'contract/cate/datalist', '合同分类', '合同分类', 'contract', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (307, 306, 'contract/cate/add', '新建/编辑', '合同分类', 'contract', '', 2, 1, 1, 0, 1656143065); +INSERT INTO `oa_admin_rule` VALUES (308, 306, 'contract/cate/set', '设置', '合同分类', 'contract', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (309, 305, 'contract/productcate/datalist', '产品分类', '产品分类', 'contract', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (310, 309, 'contract/productcate/add', '新建/编辑', '产品分类', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (311, 309, 'contract/productcate/del', '删除', '产品分类', 'contract', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (312, 305, 'contract/product/datalist', '产品列表', '产品', 'contract', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (313, 312, 'contract/product/add', '新建/编辑', '产品', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (314, 312, 'contract/product/view', '查看', '产品', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (315, 312, 'contract/product/del', '删除', '产品', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (316, 312, 'contract/product/set', '设置', '产品', 'contract', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (317, 305, 'contract/services/datalist', '服务内容', '服务内容', 'contract', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (318, 317, 'contract/services/add', '新建/编辑', '服务内容', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (319, 317, 'contract/services/set', '设置', '服务内容', 'contract', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (320, 305, 'contract/supplier/datalist', '供应商列表', '供应商', 'contract', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (321, 320, 'contract/supplier/add', '新建/编辑', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (322, 320, 'contract/supplier/set', '设置', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (323, 320, 'contract/supplier/view', '查看', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (324, 320, 'contract/supplier/del', '删除', '供应商', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (325, 320, 'contract/supplier/contact_add', '新建/编辑', '供应商联系人', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (326, 320, 'contract/supplier/contact_del', '删除', '供应商联系人', 'contract', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (327, 305, 'contract/purchasedcate/datalist', '采购品分类', '采购品分类', 'contract', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (328, 327, 'contract/purchasedcate/add', '新建/编辑', '采购品分类', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (329, 327, 'contract/purchasedcate/del', '删除', '采购品分类', 'contract', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (330, 305, 'contract/purchased/datalist', '采购品列表', '采购品', 'contract', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (331, 330, 'contract/purchased/add', '新建/编辑', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (332, 330, 'contract/purchased/view', '查看', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (333, 330, 'contract/purchased/del', '删除', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (334, 330, 'contract/purchased/set', '设置', '采购品', 'contract', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (335, 8, 'contract/contract/datalist', '销售合同', '销售合同', 'contract', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (336, 335, 'contract/contract/add', '新建/编辑', '合同', 'contract', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (337, 335, 'contract/contract/view', '查看', '合同', 'contract', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (338, 335, 'contract/contract/del', '删除', '合同', 'contract', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (339, 8, 'contract/purchase/datalist', '采购合同', '采购合同', 'contract', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (340, 339, 'contract/purchase/add', '新建/编辑', '合同', 'contract', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (341, 339, 'contract/purchase/view', '查看', '合同', 'contract', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (342, 339, 'contract/purchase/del', '删除', '合同', 'contract', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (343, 8, 'contract/contract/archivelist', '合同归档', '合同归档', 'contract', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (344, 343, 'contract/purchase/archivelist', '采购合同归档', '采购合同归档', 'contract', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (345, 8, 'contract/contract/stoplist', '中止合同', '中止合同', 'contract', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (346, 345, 'contract/purchase/stoplist', '中止采购合同', '中止采购合同', 'contract', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (347, 8, 'contract/contract/voidlist', '作废合同', '作废合同', 'contract', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (348, 347, 'contract/purchase/voidlist', '作废合同归档', '作废采购合同', 'contract', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (349, 2, '', '项目模块', '项目模块', 'project', '', 1, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (350, 349, 'project/step/datalist', '项目阶段', '项目阶段', 'project', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (351, 350, 'project/step/add', '新建/编辑', '项目阶段', 'project', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (352, 350, 'project/step/set', '设置', '项目阶段', 'project', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (353, 349, 'project/cate/datalist', '项目分类', '项目分类', 'project', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (354, 353, 'project/cate/add', '新建/编辑', '项目分类', 'project', '', 2, 1, 1, 0, 1656143065); +INSERT INTO `oa_admin_rule` VALUES (355, 353, 'project/cate/set', '设置', '项目分类', 'project', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (356, 349, 'project/work/datalist', '工作类别', '工作类别', 'project', '', 1, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (357, 356, 'project/work/add', '新建/编辑', '工作类别', 'project', '', 2, 1, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (358, 356, 'project/work/set', '设置', '工作类别', 'project', '', 2, 1, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (359, 9, 'project/index/datalist', '项目列表', '项目', 'project', '', 1, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (360, 359, 'project/index/add', '新建', '项目', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (361, 359, 'project/index/edit', '编辑', '项目', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (362, 359, 'project/index/view', '查看', '项目', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (363, 359, 'project/index/del', '删除', '项目', 'project', '', 2, 0, 1, 1656142368, 0); + +INSERT INTO `oa_admin_rule` VALUES (364, 9, 'project/task/datalist', '任务列表', '任务', 'project', '', 1, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (365, 364, 'project/task/add', '新建', '任务', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (366, 364, 'project/task/edit', '编辑', '任务', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (367, 364, 'project/task/view', '查看', '任务', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (368, 364, 'project/task/del', '删除', '任务', 'project', '', 2, 0, 1, 1656142368, 0); + +INSERT INTO `oa_admin_rule` VALUES (369, 9, 'project/task/hour', '任务工时', '工时', 'project', '', 1, 0, 1, 1656142368, 0); + +INSERT INTO `oa_admin_rule` VALUES (370, 9, 'project/document/datalist', '文档列表', '文档', 'project', '', 1, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (371, 370, 'project/document/add', '新建/编辑', '文档', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (372, 370, 'project/document/view', '查看', '文档', 'project', '', 2, 0, 1, 1656142368, 0); +INSERT INTO `oa_admin_rule` VALUES (373, 370, 'project/document/delete', '删除', '文档', 'project', '', 2, 0, 1, 1656142368, 0); + +INSERT INTO `oa_admin_rule` VALUES (374, 10, 'disk/index/datalist', '个人文件', '个人文件', 'disk', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (375, 374, 'disk/index/add_upload', '新增', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (376, 374, 'disk/index/add_folder', '新增', '文件夹', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (377, 374, 'disk/index/add_article', '新增/编辑', '在线文档', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (378, 374, 'disk/index/view_article', '查看', '在线文档', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (379, 374, 'disk/index/del', '删除', '文件/文件夹/在线文档', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (380, 374, 'disk/index/rename', '重命名', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (381, 374, 'disk/index/move', '移动', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (382, 374, 'disk/index/share', '分享', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (383, 374, 'disk/index/unshare', '取消分享', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (384, 374, 'disk/index/star', '标星', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (385, 374, 'disk/index/unstar', '取消标星', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (386, 374, 'disk/index/back', '还原', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (387, 374, 'disk/index/clear', '清除', '文件', 'disk', '', 2, 0, 1, 1656143065, 0); + +INSERT INTO `oa_admin_rule` VALUES (388, 10, 'disk/index/sharelist', '共享文件', '共享文件', 'disk', '', 1, 0, 1, 1656143065, 0); +INSERT INTO `oa_admin_rule` VALUES (389, 10, 'disk/index/clearlist', '回 收 站', '回收站文件', 'disk', '', 1, 0, 1, 1656143065, 0); + + +-- ---------------------------- +-- Table structure for oa_admin_group +-- ---------------------------- +DROP TABLE IF EXISTS `oa_admin_group`; +CREATE TABLE `oa_admin_group` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL DEFAULT '', + `status` int(1) NOT NULL DEFAULT 1, + `rules` mediumtext NULL COMMENT '用户组拥有的规则id', + `layouts` mediumtext NULL COMMENT '首页展示模块', + `mobile_bar` mediumtext NULL COMMENT '手机端Bar', + `mobile_menu` mediumtext NULL COMMENT '手机端工作台', + `desc` mediumtext NULL COMMENT '备注', + `create_time` bigint(11) NOT NULL DEFAULT 0, + `update_time` bigint(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id`(`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '员工权限分组表'; + +-- ---------------------------- +-- Records of oa_admin_group +-- ---------------------------- +INSERT INTO `oa_admin_group` VALUES (1, '超级权限角色', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389', '1,2,3,4,5,6,7,8,9,10,11,12','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16','超级权限角色,拥有系统的最高权限,主要用于系统初始化数据而设,不可修改,不可删除。', 0, 0); +INSERT INTO `oa_admin_group` VALUES (2, '管理岗角色', 1, '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389','1,2,3,4,5,6,7,8,9,10,11,12','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', '管理岗角色权限,可根据公司的具体需求调整。', 0, 0); +INSERT INTO `oa_admin_group` VALUES (3, '业务岗角色', 1, '4,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,197,198,199,200,201,202,203,204,5,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,6,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,7,281,282,283,284,285,286,287,288,289,290,291,294,295,296,292,293,297,298,299,300,301,302,303,304,8,335,336,337,338,339,340,341,342,343,344,345,346,347,348,9,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,10,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16','1,2,3,4,5','1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16', '业务岗角色权限,可根据公司的具体需求调整。', 0, 0); + +-- ---------------------------- +-- Table structure for oa_template +-- ---------------------------- +DROP TABLE IF EXISTS `oa_template`; +CREATE TABLE `oa_template` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板名称', + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '权限标识唯一,字母', + `types` tinyint(1) NOT NULL DEFAULT 1 COMMENT '类型:1普通消息,2审批消息', + `check_types` int(11) NOT NULL DEFAULT 0 COMMENT '审批类型:0', + `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注描述,使用场景等', + `msg_link` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板链接(审批申请)', + `msg_title_0` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批申请)', + `msg_content_0` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批申请)', + `msg_title_1` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批通过)', + `msg_content_1` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批通过)', + `msg_title_2` varchar(255) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批拒绝)', + `msg_content_2` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批拒绝)', + `email_link` varchar(255) NOT NULL DEFAULT '' COMMENT '邮箱消息模板链接', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:-1删除 0禁用 1启用', + `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '消息模板表'; + +-- ---------------------------- +-- Records of oa_template +-- ---------------------------- +INSERT INTO `oa_template` VALUES (1, '公告通知', 'note', 1, 0, '', '/adm/note/view/id/{action_id}', '{from_user}发了一个新『公告』,请及时查看', '您有一个新公告:{title}。', '', '', '', '', '', 1, 1, 1733312491, 1733314809, 0); +INSERT INTO `oa_template` VALUES (2, '请假审批', 'leaves', 2, 0, '', '/home/leaves/view/id/{action_id}', '{from_user}提交了一个『请假申请』,请及时审批', '您有一个新的『请假申请』需要处理。', '您提交的『请假申请』已被审批通过。', '您在{create_time}提交的『请假申请』已于{date}被审批通过。', '您提交的『请假申请』已被驳回拒绝。', '您在{create_time}提交的『请假申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312616, 1733314814, 0); +INSERT INTO `oa_template` VALUES (3, '出差审批', 'trips', 2, 0, '', '/home/trips/view/id/{action_id}', '{from_user}提交了一个『出差申请』,请及时审批', '您有一个新的『出差申请』需要处理。', '您提交的『出差申请』已被审批通过。', '您在{create_time}提交的『出差申请』已于{date}被审批通过。', '您提交的『出差申请』已被驳回拒绝。', '您在{create_time}提交的『出差申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312725, 1733314819, 0); +INSERT INTO `oa_template` VALUES (4, '外出审批', 'outs', 2, 0, '', '/home/outs/view/id/{action_id}', '{from_user}提交了一个『外出申请』,请及时审批', '您有一个新的『外出申请』需要处理。', '您提交的『外出申请』已被审批通过。', '您在{create_time}提交的『外出申请』已于{date}被审批通过。', '您提交的『外出申请』已被驳回拒绝。', '您在{create_time}提交的『外出申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312801, 1733314824, 0); +INSERT INTO `oa_template` VALUES (5, '加班审批', 'overtimes', 2, 0, '', '/home/overtimes/view/id/{action_id}', '{from_user}提交了一个『加班申请』,请及时审批', '您有一个新的『加班申请』需要处理。', '您提交的『加班申请』已被审批通过。', '您在{create_time}提交的『加班申请』已于{date}被审批通过。', '您提交的『加班申请』已被驳回拒绝。', '您在{create_time}提交的『加班申请』已于{date}被驳回拒绝。', '', 1, 1, 1733312801, 1733314828, 0); +INSERT INTO `oa_template` VALUES (6, '用章审批', 'seal', 2, 0, '', '/adm/seal/view/id/{action_id}', '{from_user}提交了一个『用章申请』,请及时审批', '您有一个新的『用章申请』需要处理。', '您提交的『公文申请』已被审批通过。', '您在{create_time}提交的『公文申请』已于{date}被审批通过。', '您提交的『用章申请』已被驳回拒绝。', '您在{create_time}提交的『用章申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313018, 1733314834, 0); +INSERT INTO `oa_template` VALUES (7, '公文审批', 'official', 2, 0, '', '/adm/official/view/id/{action_id}', '{from_user}提交了一个『公文申请』,请及时审批', '您有一个新的『公文申请』需要处理。', '您提交的『公文申请』已被审批通过', '您在{create_time}提交的『公文申请』已于{date}被审批通过。', '您提交的『公文申请』已被驳回拒绝', '您在{create_time}提交的『公文申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313078, 1733313262, 0); +INSERT INTO `oa_template` VALUES (8, '报销审批', 'expense', 2, 0, '', '/finance/expense/view/id/{action_id}', '{from_user}提交了一个『报销申请』,请及时审批', '您有一个新的『报销申请』需要处理。', '您提交的『报销申请』已被审批通过', '您在{create_time}提交的『报销申请』已于{date}被审批通过。', '您提交的『报销申请』已被驳回拒绝', '您在{create_time}提交的『报销申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313169, 1733313253, 0); +INSERT INTO `oa_template` VALUES (9, '发票审批', 'invoice', 2, 0, '', '/finance/invoice/view/id/{action_id}', '{from_user}提交了一个『发票申请』,请及时审批', '您有一个新的『发票申请』需要处理。', '您提交的『发票申请』已被审批通过', '您在{create_time}提交的『发票申请』已于{date}被审批通过。', '您提交的『发票申请』已被驳回拒绝', '您在{create_time}提交的『发票申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313245, 0, 0); +INSERT INTO `oa_template` VALUES (10, '收票审批', 'ticket', 2, 0, '', '/finance/ticket/view/id/{action_id}', '{from_user}提交了一个『收票申请』,请及时审批', '您有一个新的『收票申请』需要处理。', '您提交的『收票申请』已被审批通过', '您在{create_time}提交的『收票申请』已于{date}被审批通过。', '您提交的『收票申请』已被驳回拒绝', '您在{create_time}提交的『收票申请』已于{date}被驳回拒绝。', '', 1, 1, 1733313341, 0, 0); +INSERT INTO `oa_template` VALUES (11, '无发票回款审批', 'invoicea', 2, 0, '', '/finance/invoice/view_a/id/{action_id}', '{from_user}提交了一个『无发票回款申请』,请及时审批', '您有一个新的『无发票回款申请』需要处理。', '您提交的『无发票回款申请』已被审批通过', '您在{create_time}提交的『无发票回款申请』已于{date}被审批通过。', '您提交的『无发票回款申请』已被驳回拒绝', '您在{create_time}提交的『无发票回款申请』已于{date}被驳回拒绝。', '', 1, 1, 1733314549, 0, 0); +INSERT INTO `oa_template` VALUES (12, '无发票付款审批', 'ticketa', 2, 0, '', '/finance/ticket/view_a/id/{action_id}', '{from_user}提交了一个『无发票付款申请』,请及时审批', '您有一个新的『无发票付款申请』需要处理。', '您提交的『无发票付款申请』已被审批通过', '您在{create_time}提交的『无发票付款申请』已于{date}被审批通过。', '您提交的『无发票付款申请』已被驳回拒绝', '您在{create_time}提交的『无发票付款申请』已于{date}被驳回拒绝。', '', 1, 1, 1733314607, 0, 0); +INSERT INTO `oa_template` VALUES (13, '销售合同审批', 'contract', 2, 0, '', '/contract/contract/view/id/{action_id}', '{from_user}提交了一个『销售合同审批』,请及时审批', '您有一个新的『销售合同审批』需要处理。', '您提交的『销售合同审批』已被审批通过', '您在{create_time}提交的『销售合同审批』已于{date}被审批通过。', '您提交的『销售合同审批』已被驳回拒绝', '您在{create_time}提交的『销售合同审批』已于{date}被驳回拒绝。', '', 1, 1, 1733314701, 0, 0); +INSERT INTO `oa_template` VALUES (14, '采购合同审批', 'purchase', 2, 0, '', '/contract/purchase/view/id/{action_id}', '{from_user}提交了一个『采购合同审批』,请及时审批', '您有一个新的『采购合同审批』需要处理。', '您提交的『采购合同审批』已被审批通过', '您在{create_time}提交的『采购合同审批』已于{date}被审批通过。', '您提交的『采购合同审批』已被驳回拒绝', '您在{create_time}提交的『采购合同审批』已于{date}被驳回拒绝。', '', 1, 1, 1733314789, 0, 0); + +-- ---------------------------- +-- Table structure for oa_flow_cate +-- ---------------------------- +DROP TABLE IF EXISTS `oa_flow_cate`; +CREATE TABLE `oa_flow_cate` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(100) NOT NULL DEFAULT '' COMMENT '审批类型名称', + `name` varchar(100) NOT NULL COMMENT '审批类型标识,唯一', + `module_id` int(11) NOT NULL DEFAULT 0 COMMENT '关联审批模块id', + `check_table` varchar(100) NOT NULL DEFAULT '' COMMENT '关联数据库表名', + `icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标', + `department_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '应用部门ID(空为全部)1,2,3', + `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序:越大越靠前', + `form` tinyint(1) NOT NULL DEFAULT 1 COMMENT '预设字段,表单模式:1固定表单,2自定义表单', + `add_url` varchar(255) NOT NULL DEFAULT '' COMMENT '新建链接:固定表单模式必填', + `view_url` varchar(255) NOT NULL DEFAULT '' COMMENT '查看链接:固定表单模式必填', + `form_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '表单id:自定义表单模式必填', + `is_list` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否列表页显示:0不显示 1显示', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:-1删除 0禁用 1启用', + `template_id` int(11) NOT NULL DEFAULT 0 COMMENT '审批消息模板id', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批类型'; + +-- ---------------------------- +-- Records of oa_flow_cate +-- ---------------------------- +INSERT INTO `oa_flow_cate` VALUES (1, '请假', 'leaves', 1, 'leaves', 'icon-kechengziyuanguanli', '', 0, 1, '/home/leaves/add', '/home/leaves/view', 0, 1, 1, 2, 1723604674, 0); +INSERT INTO `oa_flow_cate` VALUES (2, '出差', 'trips', 1, 'trips', 'icon-jiaoshiguanli', '', 0, 1, '/home/trips/add', '/home/trips/view', 0, 1, 1, 3, 1723799422, 1724138037); +INSERT INTO `oa_flow_cate` VALUES (3, '外出', 'outs', 1, 'outs', 'icon-tuiguangguanli', '', 0, 1, '/home/outs/add', '/home/outs/view', 0, 1, 1, 4,1723800336, 1724138021); +INSERT INTO `oa_flow_cate` VALUES (4, '加班', 'overtimes', 1, 'overtimes', 'icon-xueshengchengji', '', 0, 1, '/home/overtimes/add', '/home/overtimes/view', 0, 1, 1, 5, 1723800393, 1724138004); +INSERT INTO `oa_flow_cate` VALUES (5, '用章', 'seal', 2, 'seal', 'icon-shenpishezhi', '', 0, 1, '/adm/seal/add', '/adm/seal/view', 0, 1, 1, 6, 1723469451, 1724138203); +INSERT INTO `oa_flow_cate` VALUES (6, '公文', 'official_docs', 2, 'official_docs', 'icon-lunwenguanli', '', 0, 1, '/adm/official/add', '/adm/official/view', 0, 1, 1, 7, 1723469614, 1724138182); +INSERT INTO `oa_flow_cate` VALUES (7, '报销', 'expense', 4, 'expense', 'icon-jizhang', '', 0, 1, '/finance/expense/add', '/finance/expense/view', 0, 1, 1, 8, 1723469732, 1724138154); +INSERT INTO `oa_flow_cate` VALUES (8, '发票', 'invoice', 4, 'invoice', 'icon-duizhangdan', '', 0, 1, '/finance/invoice/add', '/finance/invoice/view', 0, 1, 1, 9,1723469814, 1724138127); +INSERT INTO `oa_flow_cate` VALUES (9, '收票', 'ticket', 4, 'ticket', 'icon-yingjiaoqingdan', '', 0, 1, '/finance/ticket/add', '/finance/ticket/view', 0, 1, 1, 10, 1724749856, 1724828690); +INSERT INTO `oa_flow_cate` VALUES (10, '无发票回款', 'invoicea', 4, 'invoice', 'icon-shoufeipeizhi', '', 0, 1, '/finance/invoice/add_a', '/finance/invoice/view_a', 0, 1, 1, 11,1725856435, 1725935194); +INSERT INTO `oa_flow_cate` VALUES (11, '无发票付款', 'ticketa', 4, 'ticket', 'icon-bulujiesuan', '', 0, 1, '/finance/ticket/add_a', '/finance/ticket/view_a', 0, 1, 1, 12,1725856613, 1725935703); +INSERT INTO `oa_flow_cate` VALUES (12, '销售合同', 'contract', 3, 'contract', 'icon-hetongguanli', '', 0, 1, '/contract/contract/add', '/contract/contract/view', 0, 0, 1, 13,1723469917, 1724828537); +INSERT INTO `oa_flow_cate` VALUES (13, '采购合同', 'purchase', 3, 'purchase', 'icon-dianshang', '', 0, 1, '/contract/purchase/add', '/contract/purchase/view', 0, 0, 1, 14,1723470017, 1724828575); + +-- ---------------------------- +-- Table structure for oa_flow +-- ---------------------------- +DROP TABLE IF EXISTS `oa_flow`; +CREATE TABLE `oa_flow` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(50) NOT NULL DEFAULT '' COMMENT '审批流程名称', + `cate_id` tinyint(11) NOT NULL DEFAULT 0 COMMENT '关联审批类型id', + `check_type` tinyint(4) NOT NULL COMMENT '1自由审批流,2固定审批流,3固定可回退的审批流,4固定条件审批流', + `department_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '应用部门ID(0为全部)1,2,3', + `copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID', + `flow_list` varchar(1000) NULL DEFAULT '' COMMENT '流程数据序列化', + `status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态 1启用,0禁用', + `remark` varchar(500) NOT NULL DEFAULT '' COMMENT '流程说明', + `admin_id` int(11) NOT NULL COMMENT '创建人ID', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '审批流程表'; + +-- ---------------------------- +-- Records of oa_flow_cate +-- ---------------------------- +INSERT INTO `oa_flow` VALUES (1, '请假审批', 1, 1, '', '', '', 1, '', 1, 1723791655, 0, 0); +INSERT INTO `oa_flow` VALUES (2, '出差审批', 2, 1, '', '', '', 1, '', 1, 1723799665, 0, 0); +INSERT INTO `oa_flow` VALUES (3, '外出审批', 3, 1, '', '', '', 1, '', 1, 1723800434, 0, 0); +INSERT INTO `oa_flow` VALUES (4, '加班审批', 4, 1, '', '', '', 1, '', 1, 1723800446, 0, 0); +INSERT INTO `oa_flow` VALUES (5, '用章审批', 5, 1, '', '', '', 1, '', 1, 1723470400, 0, 0); +INSERT INTO `oa_flow` VALUES (6, '公文审批', 6, 1, '', '', '', 1, '', 1, 1723470419, 0, 0); +INSERT INTO `oa_flow` VALUES (7, '报销审批', 7, 1, '', '', '', 1, '', 1, 1723470468, 0, 0); +INSERT INTO `oa_flow` VALUES (8, '发票审批', 8, 1, '', '', '', 1, '', 1, 1723470482, 0, 0); +INSERT INTO `oa_flow` VALUES (9, '收票审批', 9, 1, '', '', '', 1, '', 1, 1723470482, 0, 0); +INSERT INTO `oa_flow` VALUES (10, '无发票回款', 10, 1, '', '', '', 1, '', 1, 1725935073, 0, 0); +INSERT INTO `oa_flow` VALUES (11, '无发票付款', 11, 1, '', '', '', 1, '', 1, 1725935159, 1725935232, 0); +INSERT INTO `oa_flow` VALUES (12, '销售合同审批', 12, 1, '', '', '', 1, '', 1, 1723470490, 0, 0); +INSERT INTO `oa_flow` VALUES (13, '采购合同审批', 13, 1, '', '', '', 1, '', 1, 1723470501, 0, 0); \ No newline at end of file diff --git a/update_sql/v5.5升级到v5.6.sql b/update_sql/v5.5升级到v5.6.sql new file mode 100644 index 0000000..5cbfebe --- /dev/null +++ b/update_sql/v5.5升级到v5.6.sql @@ -0,0 +1,5 @@ +ALTER TABLE `oa_expense` +ADD COLUMN `subject_id` int(11) NOT NULL DEFAULT 0 COMMENT '报销企业主体' AFTER `id`; + +ALTER TABLE `oa_ticket` +ADD COLUMN `cash_type` int(11) UNSIGNED NULL DEFAULT 1 COMMENT '付款类型:1银行,2支付宝,3微信,4现金,5汇票,6支票,7托收,8其他' AFTER `pay_amount`; \ No newline at end of file diff --git a/update_sql/v5.7.5升级到v5.7.6.sql b/update_sql/v5.7.5升级到v5.7.6.sql new file mode 100644 index 0000000..4adb28b --- /dev/null +++ b/update_sql/v5.7.5升级到v5.7.6.sql @@ -0,0 +1,37 @@ +ALTER TABLE `oa_disk` ADD COLUMN `group_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '分享空间id' AFTER `action_id`; + +DROP TABLE IF EXISTS `oa_disk_group`; +CREATE TABLE `oa_disk_group` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL DEFAULT '' COMMENT '分享空间名称', + `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人', + `director_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '管理人员', + `group_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '群组成员', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '网盘分享空间表'; + +INSERT INTO `oa_disk_group` VALUES (1000, '入职培训', 1, '', '', 1749030795, 1749031338, 0); +INSERT INTO `oa_disk_group` VALUES (1001, '项目文件', 1, '', '', 1749030795, 1749031338, 0); +INSERT INTO `oa_disk_group` VALUES (1002, '常用软件', 1, '', '', 1749030795, 1749031338, 0); +INSERT INTO `oa_disk_group` VALUES (1003, '团建照片', 1, '', '', 1749030795, 1749031338, 0); + +UPDATE `oa_admin_rule` SET `pid` = 74, `src` = 'home/cate/enterprise_check', `title` = '设置', `name` = '企业主体', `module` = 'home', `icon` = '', `menu` = 2, `sort` = 1, `status` = 1, `create_time` = 0, `update_time` = 0 WHERE `id` = 76; + +UPDATE `oa_admin_rule` SET `pid` = 10, `src` = 'disk/index/datalist', `title` = '我的空间', `name` = '我的空间', `module` = 'disk', `icon` = '', `menu` = 1, `sort` = 0, `status` = 1, `create_time` = 1656143065, `update_time` = 0 WHERE `id` = 374; + +UPDATE `oa_admin_rule` SET `pid` = 374, `src` = 'disk/index/star', `title` = '标星', `name` = '文件', `module` = 'disk', `icon` = '', `menu` = 2, `sort` = 0, `status` = 1, `create_time` = 1656143065, `update_time` = 0 WHERE `id` = 382; + +UPDATE `oa_admin_rule` SET `pid` = 374, `src` = 'disk/index/unstar', `title` = '取消标星', `name` = '文件', `module` = 'disk', `icon` = '', `menu` = 2, `sort` = 0, `status` = 1, `create_time` = 1656143065, `update_time` = 0 WHERE `id` = 383; + +UPDATE `oa_admin_rule` SET `pid` = 374, `src` = 'disk/index/back', `title` = '还原', `name` = '文件', `module` = 'disk', `icon` = '', `menu` = 2, `sort` = 0, `status` = 1, `create_time` = 1656143065, `update_time` = 0 WHERE `id` = 384; + +UPDATE `oa_admin_rule` SET `pid` = 374, `src` = 'disk/index/clear', `title` = '清除', `name` = '文件', `module` = 'disk', `icon` = '', `menu` = 2, `sort` = 0, `status` = 1, `create_time` = 1656143065, `update_time` = 0 WHERE `id` = 385; + +UPDATE `oa_admin_rule` SET `pid` = 10, `src` = 'disk/index/sharelist', `title` = '共享空间', `name` = '共享空间', `module` = 'disk', `icon` = '', `menu` = 1, `sort` = 0, `status` = 1, `create_time` = 1656143065, `update_time` = 0 WHERE `id` = 386; + +UPDATE `oa_admin_rule` SET `pid` = 386, `src` = 'disk/index/add_group', `title` = '新建/编辑', `name` = '共享空间', `module` = 'disk', `icon` = '', `menu` = 2, `sort` = 1, `status` = 1, `create_time` = 0, `update_time` = 0 WHERE `id` = 387; + +UPDATE `oa_admin_rule` SET `pid` = 386, `src` = 'disk/index/del_group', `title` = '删除', `name` = '共享空间', `module` = 'disk', `icon` = '', `menu` = 2, `sort` = 1, `status` = 1, `create_time` = 0, `update_time` = 0 WHERE `id` = 388; \ No newline at end of file diff --git a/update_sql/v5.7.6升级到v5.8.sql b/update_sql/v5.7.6升级到v5.8.sql new file mode 100644 index 0000000..10c25a2 --- /dev/null +++ b/update_sql/v5.7.6升级到v5.8.sql @@ -0,0 +1,17 @@ +ALTER TABLE `oa_flow_record` +ADD COLUMN `check_files` varchar(500) NOT NULL DEFAULT '' COMMENT '审批附件' AFTER `step_id`; + +ALTER TABLE `oa_flow_cate` +ADD COLUMN `is_copy` int(11) NOT NULL DEFAULT 1 COMMENT '是否支持抄送人' AFTER `sort`; + +ALTER TABLE `oa_flow_cate` +ADD COLUMN `is_file` int(11) NOT NULL DEFAULT 0 COMMENT '审批过程是否支持上传附件' AFTER `is_copy`; + +ALTER TABLE `oa_flow_cate` +ADD COLUMN `is_export` int(11) NOT NULL DEFAULT 0 COMMENT '审批通过后是否支持导出PDF打印' AFTER `is_file`; + +ALTER TABLE `oa_flow_cate` +ADD COLUMN `is_back` int(11) NOT NULL DEFAULT 1 COMMENT '是否支持撤回' AFTER `is_export`; + +ALTER TABLE `oa_flow_cate` +ADD COLUMN `is_reversed` int(11) NOT NULL DEFAULT 0 COMMENT '是否支持反确认' AFTER `is_back`; \ No newline at end of file diff --git a/update_sql/v5.8升级到v5.9.sql b/update_sql/v5.8升级到v5.9.sql new file mode 100644 index 0000000..1b48f94 --- /dev/null +++ b/update_sql/v5.8升级到v5.9.sql @@ -0,0 +1,295 @@ +ALTER TABLE `oa_admin` +ADD COLUMN `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间' AFTER `update_time`; + +ALTER TABLE `oa_admin` +ADD COLUMN `talent_id` int(11) NOT NULL DEFAULT 0 COMMENT '入职申请id' AFTER `delete_time`; + +ALTER TABLE `oa_admin` +MODIFY COLUMN `birthday` varchar(255) NOT NULL DEFAULT '' COMMENT '生日' AFTER `job_number`; + +ALTER TABLE `oa_admin` +MODIFY COLUMN `work_date` varchar(255) NOT NULL DEFAULT '' COMMENT '开始工作时间' AFTER `age`; + +ALTER TABLE `oa_admin` +MODIFY COLUMN `graduate_day` varchar(255) NOT NULL DEFAULT '毕业日期' AFTER `graduate_school`; + +UPDATE `oa_admin_rule` SET `pid` = 97, `src` = 'user/user/del', `title` = '删除', `name` = '员工' WHERE `id` = 105; +UPDATE `oa_admin_rule` SET `pid` = 3, `src` = 'user/personal/leave', `title` = '离职申请', `name` = '离职申请' WHERE `id` = 108; +UPDATE `oa_admin_rule` SET `pid` = 108, `src` = 'user/personal/leave_view', `title` = '查看', `name` = '离职申请' WHERE `id` = 111; + +ALTER TABLE `oa_template` +ADD COLUMN `msg_title_3` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板标题(审批通过抄送)' AFTER `msg_content_2`, +ADD COLUMN `msg_content_3` varchar(500) NOT NULL DEFAULT '' COMMENT '消息模板内容(审批通过抄送)' AFTER `msg_title_3`; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『请假审批』已被审批通过并抄送给你' WHERE `id` = 2; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『请假审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 2; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『出差审批』已被审批通过并抄送给你' WHERE `id` = 3; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『出差审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 3; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『外出审批』已被审批通过并抄送给你' WHERE `id` = 4; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『外出审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 4; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『加班审批』已被审批通过并抄送给你' WHERE `id` = 5; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『加班审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 5; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『用章审批』已被审批通过并抄送给你' WHERE `id` = 6; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『用章审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 6; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『公文审批』已被审批通过并抄送给你' WHERE `id` = 7; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『公文审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 7; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『报销审批』已被审批通过并抄送给你' WHERE `id` = 8; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『报销审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 8; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『发票审批』已被审批通过并抄送给你' WHERE `id` = 9; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『发票审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 9; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『收票审批』已被审批通过并抄送给你' WHERE `id` = 10; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『收票审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 10; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『无发票回款审批』已被审批通过并抄送给你' WHERE `id` = 11; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『无发票回款审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 11; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『无发票付款审批』已被审批通过并抄送给你' WHERE `id` = 12; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『无发票付款审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 12; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『销售合同审批』已被审批通过并抄送给你' WHERE `id` = 13; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『销售合同审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 13; + +UPDATE `oa_template` SET `msg_title_3` = '{from_user}提交的『采购合同审批』已被审批通过并抄送给你' WHERE `id` = 14; +UPDATE `oa_template` SET `msg_content_3` = '{from_user}在{create_time}提交的『采购合同审批』已被审批通过并抄送给你,请及时查看详情。' WHERE `id` = 14; + +INSERT INTO `oa_template` VALUES (15, '借支审批', 'loan', 2, 0, '', '/finance/loan/view/id/{action_id}', '{from_user}提交了一个『借支审批』,请及时审批', '您有一个新的『借支审批』需要处理。', '您提交的『借支审批』已被审批通过', '您在{create_time}提交的『借支审批』已于{date}被审批通过。', '您提交的『借支审批』已被驳回拒绝', '您在{create_time}提交的『借支审批』已于{date}被驳回拒绝。', '{from_user}提交的『借支审批』已被审批通过并抄送给你', '{from_user}在{create_time}提交的『借支审批』已被审批通过并抄送给你,请及时查看详情。', '', 1, 1, 1733314789, 1753284351, 0); +INSERT INTO `oa_template` VALUES (16, '入职审批', 'talent', 2, 0, '', '/user/talent/view/id/{action_id}', '{from_user}提交了一个『入职审批』,请及时审批', '您有一个新的『入职审批』需要处理。', '您提交的『入职审批』已被审批通过', '您在{create_time}提交的『入职审批』已于{date}被审批通过。', '您提交的『入职审批』已被驳回拒绝', '您在{create_time}提交的『入职审批』已于{date}被驳回拒绝。', '{from_user}提交的『入职审批』已被审批通过并抄送给你', '{from_user}在{create_time}提交的『入职审批』已被审批通过并抄送给你,请及时查看详情。', '', 1, 1, 1733314789, 1753284351, 0); +INSERT INTO `oa_template` VALUES (17, '离职审批', 'personal_quit', 2, 0, '', '/user/personal/leave_view/id/{action_id}', '{from_user}提交了一个『离职审批』,请及时审批', '您有一个新的『离职审批』需要处理。', '您提交的『离职审批』已被审批通过', '您在{create_time}提交的『离职审批』已于{date}被审批通过。', '您提交的『离职审批』已被驳回拒绝', '您在{create_time}提交的『离职审批』已于{date}被驳回拒绝。', '{from_user}提交的『离职审批』已被审批通过并抄送给你', '{from_user}在{create_time}提交的『离职审批』已被审批通过并抄送给你,请及时查看详情。', '', 1, 1, 1733314789, 1753284351, 0); +INSERT INTO `oa_template` VALUES (18, '人事调动审批', 'department_change', 2, 0, '', '/user/personal/change_view/id/{action_id}', '{from_user}提交了一个『人事调动审批』,请及时审批', '您有一个新的『人事调动审批』需要处理。', '您提交的『人事调动审批』已被审批通过', '您在{create_time}提交的『人事调动审批』已于{date}被审批通过。', '您提交的『人事调动审批』已被驳回拒绝', '您在{create_time}提交的『人事调动审批』已于{date}被驳回拒绝。', '{from_user}提交的『人事调动审批』已被审批通过并抄送给你', '{from_user}在{create_time}提交的『人事调动审批』已被审批通过并抄送给你,请及时查看详情。', '', 1, 1, 1733314789, 1753284351, 0); + +INSERT INTO `oa_flow_cate` VALUES (14, '借支', 'loan', 4, 'loan', 'icon-zhangbuguanli', '', 0, 1, 0, 1, 1, 0, 1, '/finance/loan/add', '/finance/loan/view', 0, 1, 1, 15, 1723470017, 1753582624); +INSERT INTO `oa_flow_cate` VALUES (15, '入职', 'talent', 5, 'talent', 'icon-yuangongdaoru', '', 0, 1, 0, 1, 1, 0, 1, '/user/talent/add', '/user/talent/view', 0, 1, 1, 16, 1729490152, 1753585631); +INSERT INTO `oa_flow_cate` VALUES (16, '离职', 'personal_quit', 5, 'personal_quit', 'icon-yuangongtongji2', '', 0, 1, 0, 1, 1, 0, 1, '/user/personal/leave_add', '/user/personal/leave_view', 0, 1, 1, 17, 1729490152, 1753585604); +INSERT INTO `oa_flow_cate` VALUES (17, '人事调动', 'department_change', 5, 'department_change', 'icon-yuangongbiandong', '', 0, 1, 0, 1, 1, 0, 1, '/user/personal/change_add', '/user/personal/change_view', 0, 1, 1, 18, 1729490152, 1753585614); + +INSERT INTO `oa_flow` VALUES (14, '借支审批', 14, 1, '', '', '', 1, '', 1, 1723470501, 0, 0); +INSERT INTO `oa_flow` VALUES (15, '入职审批', 15, 1, '', '', '', 1, '', 1, 1723470501, 0, 0); +INSERT INTO `oa_flow` VALUES (16, '离职审批', 16, 1, '', '', '', 1, '', 1, 1723470501, 0, 0); +INSERT INTO `oa_flow` VALUES (17, '人事调动审批', 17, 1, '', '', '', 1, '', 1, 1723470501, 0, 0); + +INSERT INTO `oa_mobile_menu` VALUES (16, '借支管理', 'icon-a-baoxiao2','purple', '/qiye/finance/loan', 4, 0, 1, 1733153131, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (390, 6, 'finance/loan/datalist', '借支管理', '借支', 'finance', '', 1, 0, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (391, 390, 'finance/loan/add', '新建/编辑', '借支', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (392, 390, 'finance/loan/del', '删除', '借支', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (393, 390, 'finance/loan/view', '查看', '借支', 'finance', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (394, 262, 'finance/loan/record', '借支记录', '借支记录', 'finance', '', 1, 0, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (395, 3, 'user/talent/datalist', '入职申请', '入职申请', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (396, 395, 'user/talent/add', '新增/编辑', '入职申请', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (397, 395, 'user/talent/view', '查看', '入职申请', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (398, 395, 'user/talent/del', '删除', '入职申请', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (399, 395, 'user/talent/set', '入职', '新员工', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (400, 3, 'user/blacklist/datalist', '人员黑名单', '黑名单', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (401, 400, 'user/blacklist/add', '编辑', '黑名单', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (402, 400, 'user/blacklist/del', '删除', '黑名单', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (403, 106, 'user/personal/change_view', '查看', '人事调动', 'user', '', 2, 1, 1, 0, 0); + +UPDATE `oa_admin_group` SET `rules` = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403' WHERE `id` = 1; + +ALTER TABLE `oa_expense` +ADD COLUMN `loan_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联借支ID' AFTER `did`; + +ALTER TABLE `oa_expense` +ADD COLUMN `balance_cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '冲账金额' AFTER `loan_id`; + +ALTER TABLE `oa_expense` +ADD COLUMN `pay_amount` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '需打款金额' AFTER `balance_cost`; + +-- ---------------------------- +-- Table structure for oa_loan +-- ---------------------------- +DROP TABLE IF EXISTS `oa_loan`; +CREATE TABLE `oa_loan` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `subject_id` int(11) NOT NULL DEFAULT 0 COMMENT '借支企业主体', + `code` varchar(100) NOT NULL DEFAULT '' COMMENT '借支编码', + `title` varchar(500) NOT NULL DEFAULT '' COMMENT '借款主题', + `cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '借支金额', + `types` tinyint(4) NOT NULL DEFAULT 1 COMMENT '借支类型:1日常备用金,2项目预支款', + `loan_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预期借支日期', + `plan_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '预计还款日期', + `content` varchar(1000) NULL DEFAULT '' COMMENT '借支理由', + `admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '借支人', + `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '借支部门ID', + `balance_cost` decimal(15, 2) NOT NULL DEFAULT 0.00 COMMENT '已冲账金额', + `balance_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '冲账状态 0待冲账,1部分冲账,2已冲账', + `project_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联项目ID', + `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '附件ID,如:1,2,3', + `pay_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '打款状态 0待打款,1已打款', + `pay_admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '打款人ID', + `pay_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后打款时间', + `back_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '还款状态 0待还款,1已还款', + `back_admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '还款操作人ID', + `back_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后还款时间', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核', + `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id', + `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤', + `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID,如:1,2,3', + `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人', + `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID,如:1,2,3', + `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID,如:1,2,3', + `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '借支表'; + +-- ---------------------------- +-- Table structure for oa_talent +-- ---------------------------- +DROP TABLE IF EXISTS `oa_talent`; +CREATE TABLE `oa_talent` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名', + `email` varchar(255) NOT NULL DEFAULT '' COMMENT '电子邮箱', + `mobile` bigint(11) NOT NULL DEFAULT 0 COMMENT '手机号码', + `sex` int(255) NOT NULL DEFAULT 0 COMMENT '性别:1男,2女', + `to_did` int(11) NOT NULL DEFAULT 0 COMMENT '所属部门', + `to_dids` varchar(500) NOT NULL DEFAULT '' COMMENT '次部门', + `thumb` varchar(255) NOT NULL COMMENT '头像', + `position_id` int(11) NOT NULL DEFAULT 0 COMMENT '职位id', + `type` int(1) NOT NULL DEFAULT 0 COMMENT '员工类型:0未设置,1正式,2试用,3实习', + `position_name` int(11) NOT NULL DEFAULT 0 COMMENT '应聘职务', + `position_rank` int(11) NOT NULL DEFAULT 0 COMMENT '应聘职级', + `birthday` varchar(255) NOT NULL DEFAULT '' COMMENT '生日', + `job_number` varchar(255) NOT NULL DEFAULT '' COMMENT '工号', + `pid` int(11) NOT NULL DEFAULT 0 COMMENT '上级领导', + `work_date` varchar(255) NOT NULL DEFAULT '' COMMENT '开始工作时间', + `work_location` int(11) NOT NULL DEFAULT 0 COMMENT '工作地点', + `native_place` varchar(255) NOT NULL DEFAULT '' COMMENT '籍贯', + `nation` varchar(255) NOT NULL DEFAULT '' COMMENT '民族', + `home_address` varchar(255) NOT NULL DEFAULT '' COMMENT '家庭地址', + `current_address` varchar(255) NOT NULL DEFAULT '' COMMENT '现居地址', + `contact` varchar(255) NOT NULL DEFAULT '' COMMENT '紧急联系人', + `contact_mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '紧急联系人电话', + `resident_type` int(1) NOT NULL DEFAULT 0 COMMENT '户口性质:1农村户口,2城镇户口', + `resident_place` varchar(255) NOT NULL DEFAULT '' COMMENT '户口所在地', + `graduate_school` varchar(255) NOT NULL DEFAULT '' COMMENT '毕业学校', + `graduate_day` varchar(255) NOT NULL DEFAULT '毕业日期', + `political` int(1) NOT NULL DEFAULT 1 COMMENT '政治面貌:1中共党员,2团员', + `marital_status` int(1) NOT NULL DEFAULT 1 COMMENT '婚姻状况:1未婚,2已婚,3离异', + `idcard` varchar(255) NOT NULL DEFAULT '' COMMENT '身份证', + `education` varchar(255) NOT NULL DEFAULT '' COMMENT '学位', + `speciality` varchar(255) NOT NULL DEFAULT '' COMMENT '专业', + `bank_account` varchar(255) NOT NULL DEFAULT '' COMMENT '银行卡号', + `social_account` varchar(255) NOT NULL DEFAULT '' COMMENT '社保账号', + `salary` int(11) NOT NULL DEFAULT 0 COMMENT '期望薪资', + `salary_remark` varchar(255) NOT NULL DEFAULT '' COMMENT '薪资备注', + `reference_name` varchar(255) NOT NULL DEFAULT '' COMMENT '推荐人姓名', + `reference_rel` varchar(255) NOT NULL DEFAULT '' COMMENT '推荐人关系', + `reference_mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '推荐人联系方式', + `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '档案附件', + `desc` mediumtext NULL COMMENT '个人简介', + `remark` varchar(1000) NULL DEFAULT '' COMMENT '入职评语', + `entry_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '入职时间', + `is_staff` int(1) NOT NULL DEFAULT 1 COMMENT '身份类型:1普通员工,2劳务派遣', + `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态:1正常,2已入职', + `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人', + `did` int(11) NOT NULL DEFAULT 0 COMMENT '创建部门', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '申请时间', + `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核', + `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id', + `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤', + `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID,如:1,2,3', + `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人', + `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID,如:1,2,3', + `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID,如:1,2,3', + `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新信息时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id`(`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '入职申请表'; + +-- ---------------------------- +-- Table structure for oa_personal_quit +-- ---------------------------- +DROP TABLE IF EXISTS `oa_personal_quit`; +CREATE TABLE `oa_personal_quit` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户ID', + `lead_admin_id` int(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '上级领导', + `connect_id` int(11) NOT NULL DEFAULT 0 COMMENT '资料交接人', + `connect_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '资料交接时间', + `connect_uids` varchar(100) NOT NULL DEFAULT '' COMMENT '参与交接人,可多个', + `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '档案附件', + `quit_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '离职时间', + `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态:1未交接,2已交接离职', + `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注信息', + `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人', + `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人所在部门', + `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核', + `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id', + `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤', + `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID,如:1,2,3', + `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人', + `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID,如:1,2,3', + `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID,如:1,2,3', + `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '离职申请表'; + +-- ---------------------------- +-- Table structure for oa_department_change +-- ---------------------------- +DROP TABLE IF EXISTS `oa_department_change`; +CREATE TABLE `oa_department_change` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `uid` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '员工ID', + `from_did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '原部门id', + `to_did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '调到部门id', + `connect_id` int(11) NOT NULL DEFAULT 0 COMMENT '资料交接人', + `connect_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '资料交接时间', + `connect_uids` varchar(100) NOT NULL DEFAULT '' COMMENT '参与交接人,可多个', + `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '档案附件', + `move_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '调动时间', + `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态:1未调动,2已交接调动', + `remark` varchar(1000) NULL DEFAULT '' COMMENT '备注信息', + `admin_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人', + `did` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建人所在部门', + `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核', + `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id', + `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤', + `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID,如:1,2,3', + `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人', + `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID,如:1,2,3', + `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID,如:1,2,3', + `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '人事调动申请表'; + +-- ---------------------------- +-- Table structure for oa_blacklist +-- ---------------------------- +DROP TABLE IF EXISTS `oa_blacklist`; +CREATE TABLE `oa_blacklist` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '' COMMENT '姓名', + `mobile` varchar(255) NOT NULL DEFAULT '' COMMENT '手机号码', + `idcard` varchar(255) NOT NULL DEFAULT '' COMMENT '身份证', + `remark` text NULL COMMENT '备注信息', + `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '创建人', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '申请时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新信息时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `id`(`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COMMENT = '黑名单表'; diff --git a/update_sql/v5.9.0升级到v5.9.2.sql b/update_sql/v5.9.0升级到v5.9.2.sql new file mode 100644 index 0000000..2e1f9c3 --- /dev/null +++ b/update_sql/v5.9.0升级到v5.9.2.sql @@ -0,0 +1,11 @@ +INSERT INTO `oa_mobile_types` VALUES (5, '人事管理', '', '', 0, 1, 1754539327, 1754539333); + +INSERT INTO `oa_mobile_menu` VALUES (17, '企业人员', 'icon-kehu', 'cyan', '/qiye/index/admin', 5, 0, 1, 1754539422, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (18, '入职管理', 'icon-wodeshenpi1', 'cyan', '/qiye/approve/talentlist', 5, 0, 1, 1754539501, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (19, '离职管理', 'icon-zuofeibaoming', 'cyan', '/qiye/approve/leavelist', 5, 0, 1, 1754539544, 0, 0); +INSERT INTO `oa_mobile_menu` VALUES (20, '人事调动', 'icon-qiangke', 'cyan', '/qiye/approve/changelist', 5, 0, 1, 1754539578, 0, 0); + +UPDATE `oa_admin_group` SET `mobile_menu` = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,5,17,18,19,20' WHERE `id` = 1; +UPDATE `oa_admin_group` SET `mobile_menu` = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,5,17,18,19,20' WHERE `id` = 2; +UPDATE `oa_admin_group` SET `mobile_menu` = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,5,17,18,19,20' WHERE `id` = 3; + diff --git a/update_sql/v5.9.2升级到v5.9.3.sql b/update_sql/v5.9.2升级到v5.9.3.sql new file mode 100644 index 0000000..8843702 --- /dev/null +++ b/update_sql/v5.9.2升级到v5.9.3.sql @@ -0,0 +1,9 @@ +ALTER TABLE `oa_contract` +ADD COLUMN `chance_id` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联销售机会id' AFTER `customer_id`; + +ALTER TABLE `oa_contract` +ADD COLUMN `seal_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '盖章合同附件,如:1,2,3' AFTER `file_ids`; + +ALTER TABLE `oa_purchase` +ADD COLUMN `seal_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '盖章合同附件,如:1,2,3' AFTER `file_ids`; + diff --git a/update_sql/v5.9.3升级到v5.9.5.sql b/update_sql/v5.9.3升级到v5.9.5.sql new file mode 100644 index 0000000..696b29c --- /dev/null +++ b/update_sql/v5.9.3升级到v5.9.5.sql @@ -0,0 +1,3 @@ +ALTER TABLE `oa_note` +ADD COLUMN `sourse` tinyint(1) NOT NULL DEFAULT 1 COMMENT '发布平台:1PC,2手机' AFTER `cate_id`; + diff --git a/update_sql/v5.9.5升级到v5.9.6.sql b/update_sql/v5.9.5升级到v5.9.6.sql new file mode 100644 index 0000000..e51c26a --- /dev/null +++ b/update_sql/v5.9.5升级到v5.9.6.sql @@ -0,0 +1,95 @@ +-- ---------------------------- +-- Table structure for oa_admin_log_count +-- ---------------------------- +DROP TABLE IF EXISTS `oa_admin_log_count`; +CREATE TABLE `oa_admin_log_count` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `year` int(4) NOT NULL COMMENT '年份', + `date` date NOT NULL COMMENT '日期', + `num` int(11) NOT NULL DEFAULT 1 COMMENT '统计数', + `create_time` bigint(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '员工操作日志统计表'; + +INSERT INTO `oa_admin_rule` VALUES (404, 172, 'adm/meeting/datalist', '会议室预定', '会议室预定', 'user', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (405, 404, 'adm/meeting/add', '新增/编辑', '会议室预定', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (406, 404, 'adm/meeting/view', '查看', '会议室预定', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (407, 404, 'adm/meeting/del', '删除', '会议室预定', 'user', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (408, 404, 'adm/meeting/room_use', '会议室使用情况', '会议室预定', 'user', '', 2, 1, 1, 0, 0); + +INSERT INTO `oa_admin_rule` VALUES (409, 59, 'home/cate/links', '办公工具', '办公工具', 'home', '', 1, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (410, 409, 'home/cate/links_add', '新建/编辑', '办公工具', 'home', '', 2, 1, 1, 0, 0); +INSERT INTO `oa_admin_rule` VALUES (411, 409, 'home/cate/links_del', '删除', '办公工具', 'home', '', 2, 1, 1, 0, 0); + +UPDATE `oa_admin_group` SET `rules` = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411' ,`layouts` = '1,2,3,4,5,6,7,8,9,10,11,12,13' WHERE `id` = 1; + +INSERT INTO `oa_template` VALUES (19, '会议室预定审批', 'meeting_order', 2, 0, '', '/adm/meeting/view/id/{action_id}', '{from_user}提交了一个『会议室预定审批』,请及时审批', '您有一个新的『会议室预定审批』需要处理。', '您提交的『会议室预定审批』已被审批通过', '您在{create_time}提交的『会议室预定审批』已于{date}被审批通过。', '您提交的『会议室预定审批』已被驳回拒绝', '您在{create_time}提交的『会议室预定审批』已于{date}被驳回拒绝。', '{from_user}提交的『会议室预定审批』已被审批通过并抄送给你', '{from_user}在{create_time}提交的『会议室预定审批』已被审批通过并抄送给你,请及时查看详情。', '', 1, 1, 1758550842, 1758582833, 0); +INSERT INTO `oa_flow_cate` VALUES (18, '会议室预定审批', 'meeting_order', 2, 'meeting_order', 'icon-xuetangguanli', '', 0, 1, 0, 1, 1, 0, 1, '/adm/meeting/add', '/adm/meeting/view', 0, 1, 1, 19, 1758544152, 1758582877); +INSERT INTO `oa_flow` VALUES (18, '会议室预定审批', 18, 1, '', '', '', 1, '', 1, 1758550919, 0, 0); + +-- ---------------------------- +-- Table structure for oa_meeting_order +-- ---------------------------- +DROP TABLE IF EXISTS `oa_meeting_order`; +CREATE TABLE `oa_meeting_order` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(225) NULL DEFAULT NULL COMMENT '会议主题', + `start_date` int(11) NOT NULL DEFAULT 0 COMMENT '会议开始时间', + `end_date` int(11) NOT NULL DEFAULT 0 COMMENT '会议结束时间', + `requirements` varchar(500) NOT NULL DEFAULT '' COMMENT '会议需求', + `room_id` int(11) NOT NULL DEFAULT 0 COMMENT '会议室', + `num` int(11) NOT NULL DEFAULT 0 COMMENT '人数', + `remark` varchar(225) NULL DEFAULT NULL COMMENT '备注信息', + `file_ids` varchar(500) NOT NULL DEFAULT '' COMMENT '相关附件', + `join_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '与会人员', + `anchor_id` int(11) NOT NULL DEFAULT 0 COMMENT '主持人id', + `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '发布人id', + `did` int(11) NOT NULL DEFAULT 0 COMMENT '主办部门', + `create_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '申请时间', + `check_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '审核状态:0待审核,1审核中,2审核通过,3审核不通过,4撤销审核', + `check_flow_id` int(11) NOT NULL DEFAULT 0 COMMENT '审核流程id', + `check_step_sort` int(11) NOT NULL DEFAULT 0 COMMENT '当前审批步骤', + `check_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '当前审批人ID,如:1,2,3', + `check_last_uid` varchar(500) NOT NULL DEFAULT '' COMMENT '上一审批人', + `check_history_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '历史审批人ID,如:1,2,3', + `check_copy_uids` varchar(500) NOT NULL DEFAULT '' COMMENT '抄送人ID,如:1,2,3', + `check_time` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '审核通过时间', + `update_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '更新信息时间', + `delete_time` bigint(11) NOT NULL DEFAULT 0 COMMENT '删除时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1000 CHARACTER SET = utf8mb4 COMMENT = '会议室预定'; + + +INSERT INTO `oa_basic_adm` VALUES (13, '2', '电子屏', 1, 1758584244, 0); +INSERT INTO `oa_basic_adm` VALUES (14, '2', '投影背景', 1, 1758584263, 0); +INSERT INTO `oa_basic_adm` VALUES (15, '2', '电脑', 1, 1758584272, 0); +INSERT INTO `oa_basic_adm` VALUES (16, '2', '视频', 1, 1758584287, 1758584291); +INSERT INTO `oa_basic_adm` VALUES (17, '2', '购买水果', 1, 1758584305, 0); +INSERT INTO `oa_basic_adm` VALUES (18, '2', '订餐', 1, 1758584312, 0); + +-- ---------------------------- +-- Table structure for oa_links +-- ---------------------------- +DROP TABLE IF EXISTS `oa_links`; +CREATE TABLE `oa_links` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL DEFAULT '' COMMENT '小工具名称', + `logo` int(11) NOT NULL DEFAULT 0 COMMENT 'logo', + `url` varchar(255) NULL DEFAULT NULL COMMENT '链接', + `target` int(1) NOT NULL DEFAULT 1 COMMENT '是否新窗口打开,1是,0否', + `sort` int(11) NOT NULL DEFAULT 0 COMMENT '排序', + `create_time` int(11) NOT NULL DEFAULT 0, + `update_time` int(11) NOT NULL DEFAULT 0, + `delete_time` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COMMENT = '办公工具'; + +INSERT INTO `oa_links` VALUES (1, 'DeepSeek', 0, 'https://chat.deepseek.com/', 1, 0, 1757759036, 1760144979, 0); +INSERT INTO `oa_links` VALUES (2, '豆包', 0, 'https://www.doubao.com/chat/', 1, 0, 1757759226, 1760141689, 0); +INSERT INTO `oa_links` VALUES (3, '文心一言', 0, 'https://yiyan.baidu.com/', 1, 0, 1760141394, 0, 0); +INSERT INTO `oa_links` VALUES (4, '通义千问', 0, 'https://www.tongyi.com/', 1, 0, 1760141705, 0, 0); +INSERT INTO `oa_links` VALUES (5, 'AIPPT', 0, 'https://www.aippt.cn/', 1, 0, 1760144331, 0, 0); +INSERT INTO `oa_links` VALUES (6, 'ProcessOn', 0, 'https://www.processon.com/', 1, 0, 1760144601, 0, 0); + + + diff --git a/update_sql/v5.9.6升级到v5.9.8.sql b/update_sql/v5.9.6升级到v5.9.8.sql new file mode 100644 index 0000000..6977b08 --- /dev/null +++ b/update_sql/v5.9.6升级到v5.9.8.sql @@ -0,0 +1 @@ +ALTER TABLE `oa_seal_cate` ADD COLUMN `dids` varchar(255) NOT NULL DEFAULT '' COMMENT '应用部门' AFTER `title`; \ No newline at end of file diff --git a/update_sql/v5.9.8升级到v5.9.9.sql b/update_sql/v5.9.8升级到v5.9.9.sql new file mode 100644 index 0000000..ec7e6fe --- /dev/null +++ b/update_sql/v5.9.8升级到v5.9.9.sql @@ -0,0 +1,2 @@ +ALTER TABLE `oa_file` +ADD COLUMN `thumbpath` varchar(255) NOT NULL DEFAULT '' COMMENT '缩略图路径' AFTER `filepath`; \ No newline at end of file diff --git a/vendor/.gitignore b/vendor/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/vendor/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file