diff --git a/.gitignore b/.gitignore index f283882fdb9f46c428d2e49a7e177f4eaae15ea5..fafad524546e211f6f012e4809952006158662ad 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ target/ .project .settings/ -.classpath \ No newline at end of file +.classpath +ace-modules/ace-tool/src/main/resources/application-dev.yml diff --git a/LICENSE b/LICENSE index 63748b12bdbdf3f48216cb674e3e3c5fe1b32800..ee7063040a8e1c2c3dac073faacb558aa601307d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,191 @@ - 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 2017 wanghaobin +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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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 2017 WangHaoBin 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 + 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. + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md index 30d68a55afe6a7ea3b94a0b1b84221ec210ac21b..db76ff4d855f83cecc170e6b1ffb1d277868d3e9 100644 --- a/README.md +++ b/README.md @@ -1,172 +1,221 @@ -# AG-Admin -AG-Admin是国内首个基于`Spring Cloud`微`服务`化`开发平台`,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用Eureka、Fegin、Ribbon、Zuul、Hystrix、Security、JWT Token、Mybatis等主要框架和中间件,前端采用Layui组件。 - -QQ群号:169824183(已满)、661605461(2) - -访问地址: http://120.77.133.155/ - -账号/密码:admin/admin - -# 推荐🌧 -考虑许多码友对于Spring Cloud的前后端分离和微服务实战有较多的疑问。老A专门录制课程如下,便于对AG-Admin更深入的了解 - -【基础+进阶】课程地址: http://edu.csdn.net/course/detail/5840 - -【直接进阶】课程地址: http://edu.csdn.net/course/detail/5914 - - - -![Markdown](http://i1.buimg.com/1949/39fbe8cbf5fd961f.png) - - - -# AG-Admin-v2 -相对于1.0的layui,2.0采用了前后端分离的部署方式,前端采用vue-element-admin。[AG-Admin-v2](http://git.oschina.net/geek_qi/AG-Admin-v2.0) - ---------- - -# 模块说明 -![img](http://ofsc32t59.bkt.clouddn.com/17-09-10/1504972862852.jpg) - -### 架构详解 -#### 监控 -利用Spring Boot Admin 来监控各个独立Service的运行状态;利用Hystrix Dashboard来实时查看接口的运行状态和调用频率等。 -#### 负载均衡 -将服务保留的rest进行代理和网关控制,除了平常经常使用的node.js、nginx外,Spring Cloud系列的zuul和rebbion,可以帮我们进行正常的网关管控和负载均衡。 -#### 服务注册与调用 -基于Eureka来实现的服务注册与调用,在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。 -#### 熔断机智 -因为采取了服务的分布,为了避免服务之间的调用“雪蹦”,我采用了Hystrix的作为熔断器,避免了服务之间的“雪蹦”。 - ------- - -# 项目结构 -``` -├─ace-security -│ │ -│ ├─ace-admin----------------管理端服务层 -│ │ -│ ├─ace-gate-----------------网关负载中心 -│ │ -│ ├─ace-ui-------------------前端UI层面 -│ │ -│ ├─ace-center---------------服务注册中心 -│ │ -│ ├─ace-monitor--------------统一监控中心 -│ │ -│ ├─ace-config---------------统一配置中心 -│ │ -│ └─ace-api------------------公共服务接口包 -│ -``` - ------------- -# 功能简介 -1. 用户管理 -2. 角色管理 -3. 部门管理(待完善) -4. 菜单管理 -5. 字典管理 -6. 操作日志 -8. 监控管理 -9. 消息管理(待完善) -10. 代码生成(待完善) - ------ - -# 启动指南 -## 部署须知 -- mysql数据库一个,redis数据库一个 -- jdk1.8 -- IDE插件一个,lombok插件,具体百度即可 - -## 运行步骤 -- 运行数据库脚本:依次运行数据库:ace-admin/db/init.sql -- 修改配置数据库配置:ace-admin/src/main/resources/application.yml、ace-gate/src/main/resources/application.yml -- 依次运行main类:CenterBootstrap(ace-center)、ConfigServerBootstrap(ace-config)、GateBootstrap(ace-gate)、AdminBootstrap(ace-admin)、UIBootstrap(ace-ui) -- 访问地址: http://localhost:8765/admin/index 账号/密码:admin/admin - -## 运行博客 -- 运行数据脚本:ace-blog-admin/db/init.sql -- 除了上述需要运行的main类外,依次运行BlogUIBootstrap、BlogAdminBootstrap -- 前端访问地址:http://localhost:9700/home -- 后端访问地址:http://localhost:8765/admin/index 账号/密码:blog/blog -# 开发指南 -[AG-Admin开发手手册_v1.1](https://github.com/wxiaoqi/ace-admin/wiki/AG-Admin%E5%BC%80%E5%8F%91%E6%89%8B%E6%89%8B%E5%86%8C_v1.1) - ---------- -### 2017年7月29日 Config-Server引入 -![img](http://ofsc32t59.bkt.clouddn.com/17-07-29/1501301221475.jpg) -- 增加`Spring cloud config`,默认配置地址:http://git.oschina.net/geek_qi/AG-Config -- ace-gate中关于网关配置抽离至config git服务器 -- 修改spring cloud config 服务地址:ace-config/src/main/resources/application.yml中git地址 -- 相对于携程的apollo的配置中心,spring cloud config不是很好用 - -### 2017年7月19日 后端内容管理和前端博客demo -![img](http://ofsc32t59.bkt.clouddn.com/17-07-19/1500425312816.jpg) -![img](http://ofsc32t59.bkt.clouddn.com/17-07-19/1500425915328.jpg) -- 完成用户浏览前端和后端管理的demo - -### 2017年7月7日 用户无状态登陆 -- 完成用户基于token方式登陆 -- 增加用户jwt认证 - -### 2017年6月25日 完成资源权限管控 -![img](http://ofsc32t59.bkt.clouddn.com/17-06-24/1498313864701.jpg) -![img](http://ofsc32t59.bkt.clouddn.com/17-06-24/1498313774449.jpg) -- 集成spring session -- 完成服务无状态权限拦截 -- 完成前端和后端权限拦截 -- 页面按钮权限显示和隐藏(待完成) - -### 2017年6月24日 完善监控模块 -![img](http://ofsc32t59.bkt.clouddn.com/17-06-24/1498313933332.jpg) -![img](http://ofsc32t59.bkt.clouddn.com/17-06-24/1498314057039.jpg) -![img](http://ofsc32t59.bkt.clouddn.com/17-06-24/1498314097360.jpg) -- druid监控集成 -- spring boot监控集成 -- hystrix监控集成 - -### 2017年6月20日 完成角色和部门模块 -![img](http://ofsc32t59.bkt.clouddn.com/17-06-17/1497698348097.jpg) -- 完成动态用户组设计 -- 完成动态角色、部门组功能 -- 完成角色与用户的关联 -- 完成角色与菜单的关联 - -### 2017年6月17日 完成菜单管理模块 -![img](http://ofsc32t59.bkt.clouddn.com/17-06-15/1497540870148.jpg) -- 引入boostrap table -- 抽象基础Controller类 -- 完成菜单的增删改查和树状 -- 多系统菜单切换 - - -### 2017年6月13日 完成登录统一拦截 -![img](http://ofsc32t59.bkt.clouddn.com/17-06-15/1497541226023.jpg?imageView2/2/w/800) -- spring security进行统一登录拦截 - -### 2017年6月10日 用户管理增删改查 -![Markdown](http://i1.buimg.com/1949/39fbe8cbf5fd961f.png) -- 完成后端的UI的选型 -- 完成首页改进 -- 完成用户模块的增删该查 -- 完成前后端分离的模块联通 -- 完成监控模块 - -# 版本日志 -### 2017年6月6日 初步架构搭建 -- 完成spring cloud相关核心组件整合和搭建 -- 完成Hello World服务的调用和负载 -- 完成网关的初步代理 -- 完成监控中心的搭建 - - - - - - - -# 欢迎交流 -![img](http://ofsc32t59.bkt.clouddn.com/17-06-16/1497595760484.jpg) - +# AG-Admin(`开源项目`) +AG-Admin是国内首个基于`Spring Cloud`微`服务`化`开发平台`,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用`Spring Boot2`以及`Spring Cloud (Finchley.M8)`相关核心组件,前端采用`vue-element-admin`组件。 + +### 开源用户登记,宣传用:[点击打开](https://gitee.com/geek_qi/ace-security/issues/II9SP) +### QQ群号:169824183 +### 联系QQ:2014314038(由于老A个人工作原因,该项目暂时转交维护) +### 更新日志,查看[点击打开](https://gitee.com/geek_qi/ace-security/blob/master/README.md#%E5%BC%80%E6%BA%90%E7%89%88%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97) + +# AG-Enterprise(`企业效率`) + +体验地址:http://118.126.104.133:81/ + +- 提供`开箱即用的服务Cli`,减少开发人员的项目搭建成本,只需关注业务的开发实现,企业项目的开发利器; +- 减少人员技术学习成本(会`spring+myabtis+mvc`即可),由专人管控平台,非常适合`单体项目转型`、`语言转型`的项目团队; +- 提供完善的`架构部署指南`,从单机部署到集群落地,减少部署弯路,让服务群更加稳定; +- 提供各种`开发中间件`示例教程,包括:消息总线、增删改查脚手架和生成器; +- 提供`分布式事务`解决方案和中间件,解决服务拆分后的事物控制问题; +- 提供`服务运维`基础部署,监控服务的状态、服务的链路调用。 + +#### 一期功能 +功能清单 | 开源版 | 企业版 +---|---|--- +用户管理|√|√ +角色管理|√|√ +菜单管理|√|√ +权限管理|√|√ +操作日志|√|√ +服务运维监控| √|`√` +服务管理模块|√|`√` +分布式事务|×|`√` +数据字典|×|`√` +新版UI|×|`√` +快速工程Cli|×|`√` +跨服务数据聚合|×|`√` +服务动态路由|×|`√` +部门岗位|×|`√` +多租户模块|×|`√` +数据权限|×|`√` +分级授权|x|`√` +定时任务|×|`√` + +#### 二期功能(同步推出Spring Boot+vue版本) + +功能清单 | 开源版 | 企业版 | Spring Boot版 +---|---|---|--- +附件服务|`√`|`Doing`|`TODO` +搜索服务|`√`|`Doing`|`TODO` +单点登录|x|`Design`|`TODO` +消息服务|x|`Design`|`TODO` +工作流|x|`Design`|`TODO` + +# 开源版更新日志 + +### 2018.03.18 重大更新 +- 网关模块全面升级`Spring Cloud Gateway`,性能提升、保留Zuul网关(端口迁移8766) + +### 2018.03.08 重大更新 +- 全面升级`Spring Boot 2.0.0.Release`&`Spring Cloud Finchley.M8` +- 调整目录结构,移除ace-demo模块 +- zipkin链路模块升级 +- monitor监控模块优化 +- 增加Lucense全文搜索模块 +- 增加OSS附件服务模块 + +![img](http://geek_qi.gitee.io/ag-admin/img/adminMonitor.png) + +### 2018.02.25 +- 增加服务管理模块 + +![img](http://geek_qi.gitee.io/ag-admin/img/serviceManager.png) + +- 增加运维监控模块 + +![img](http://geek_qi.gitee.io/ag-admin/img/zipkinManager.png) +![img](http://geek_qi.gitee.io/ag-admin/img/eurekaManager.png) +![img](http://geek_qi.gitee.io/ag-admin/img/monitorManager.png) + +# 模块说明 +![image.png](http://upload-images.jianshu.io/upload_images/5700335-8d69f4e885a4ec85.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +### 架构详解 +#### 服务鉴权 +老A独有的通过`JWT`的方式来加强服务之间调度的权限验证,保证内部服务的安全性。 +#### 监控 +利用Spring Boot Admin 来监控各个独立Service的运行状态;利用Hystrix Dashboard来实时查看接口的运行状态和调用频率等。 +#### 负载均衡 +将服务保留的rest进行代理和网关控制,除了平常经常使用的node.js、nginx外,Spring Cloud系列的zuul和ribbon,可以帮我们进行正常的网关管控和负载均衡。其中扩展和借鉴国外项目的扩展基于JWT的`Zuul限流插件`,方面进行限流。 +#### 服务注册与调用 +基于Eureka来实现的服务注册与调用,在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。 +#### 熔断机制 +因为采取了服务的分布,为了避免服务之间的调用“雪崩”,采用了`Hystrix`的作为熔断器,避免了服务之间的“雪崩”。 + +------ + +# `启动指南` + +![img](http://upload-images.jianshu.io/upload_images/5700335-002735d1727ec11b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +## 须知 +因为AG-Admin是一个`前后端分离`的项目,所以后端的服务必须先启动,在后端服务启动完成后,再启动前端的工程。 +## 最多人问:代码有漏 +下载完后端代码后,记得先安装`lombok插件`,否则你的IDE会报代码缺失。 +## 后端工程启动 +### 环境须知 +- mysql一个,redis一个,rabbitmq一个 +- jdk1.8 +- IDE插件一个,`lombok插件`,具体百度即可 + +### 运行步骤 +- 运行数据库脚本:依次运行数据库:ace-admin/db/init.sql、ace-auth-server/db/init.sql、ace-trace +- 修改配置数据库配置:ace-admin/src/main/resources/application.yml、ace-gate/src/main/resources/application.yml +- 按`顺序`运行main类:CenterBootstrap(ace-center)、AuthBootstrap(ace-auth-server)、AdminBootstrap(ace-admin)、GatewayServerBootstrap(ace-gateway-v2) + +### 项目结构 +``` +├─ace-security +│ │ +│ ├─ace-modules--------------公共服务模块(基础系统、搜索、OSS) +│ │ +│ ├─ace-auth-----------------鉴权中心 +│ │ +│ ├─ace-gate-----------------网关负载中心 +│ │ +│ ├─ace-common---------------通用脚手架 +│ │ +│ ├─ace-center---------------服务注册中心 +│ │ +│ ├─ace-control--------------运维中心(监控、链路) +│ │ +│ └─ace-sidebar--------------调用第三方语言 +│ +``` +---- + +## 前端工程启动[AG-Admin-UI][地址](https://gitee.com/geek_qi/AG-Admin-v2.0) +### 环境搭建 +``` +node 版本:v6.11.2 +npm 版本:3.10.10 +``` +### 开发 + +```bash + + # 安装依赖 + npm install +    //or # 建议不要用cnpm  安装有各种诡异的bug 可以通过如下操作解决npm速度慢的问题 + npm install --registry=https://registry.npm.taobao.org + + # 本地开发 开启服务 + npm run dev +``` +浏览器访问 http://localhost:9527 + +### 发布 +```bash + # 发布测试环境 带webpack ananalyzer + npm run build:sit-preview + + # 构建生成环境 + npm run build:prod +``` + +### 目录结构 +```shell +├── build // 构建相关   +├── config // 配置相关 +├── src // 源代码 +│   ├── api // 所有请求 +│   ├── assets // 主题 字体等静态资源 +│   ├── components // 全局公用组件 +│   ├── directive // 全局指令 +│   ├── filtres // 全局filter +│   ├── mock // mock数据 +│   ├── router // 路由 +│   ├── store // 全局store管理 +│   ├── styles // 全局样式 +│   ├── utils // 全局公用方法 +│   ├── view // view +│   ├── App.vue // 入口页面 +│   └── main.js // 入口 加载组件 初始化等 +├── static // 第三方不打包资源 +│   └── Tinymce // 富文本 +├── .babelrc // babel-loader 配置 +├── eslintrc.js // eslint 配置项 +├── .gitignore // git 忽略项 +├── favicon.ico // favicon图标 +├── index.html // html模板 +└── package.json // package.json + +``` +------------ + +## 功能截图 +### 基本功能 +![img](http://upload-images.jianshu.io/upload_images/5700335-e5e56924aaeacf1e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![img](http://upload-images.jianshu.io/upload_images/5700335-b3044673b4a55203.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![img](http://upload-images.jianshu.io/upload_images/5700335-75151a17ae4319cf.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![img](http://upload-images.jianshu.io/upload_images/5700335-ab942829c130389e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![img](http://upload-images.jianshu.io/upload_images/5700335-30e6df679695f150.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![img](http://upload-images.jianshu.io/upload_images/5700335-347e3e761188a824.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + +![img](http://upload-images.jianshu.io/upload_images/5700335-569696e4e70e5ad2.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) + + + + +## License + +Apache License Version 2.0 + + + +# 郑重声明 +## 虽然本产品是开源产品,但未经本人允许擅自申请专利,将公开追究法律责任。 + diff --git a/ace-admin/db/init.sql b/ace-admin/db/init.sql deleted file mode 100644 index 56d517990fc123b4a292a0f6be3eeaf0036c6598..0000000000000000000000000000000000000000 --- a/ace-admin/db/init.sql +++ /dev/null @@ -1,348 +0,0 @@ - -CREATE DATABASE ag_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -Use ag_admin; -/* - Navicat Premium Data Transfer - - Source Server : ag-admin - Source Server Type : MySQL - Source Server Version : 50718 - Source Host : localhost - Source Database : ag_admin - - Target Server Type : MySQL - Target Server Version : 50718 - File Encoding : utf-8 - - Date: 07/25/2017 19:38:40 PM -*/ - -SET NAMES utf8; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for `base_element` --- ---------------------------- -DROP TABLE IF EXISTS `base_element`; -CREATE TABLE `base_element` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `type` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `uri` varchar(255) DEFAULT NULL, - `menu_id` varchar(255) DEFAULT NULL, - `parent_id` varchar(255) DEFAULT NULL, - `path` varchar(2000) DEFAULT NULL, - `method` varchar(10) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_element` --- ---------------------------- -BEGIN; -INSERT INTO `base_element` VALUES ('3', 'userManager:btn_add', 'button', '新增', '/back/user', '1', null, null, 'POST', '', null, null, null, null, null, null, null, null, null, null, null, null), ('4', 'userManager:btn_edit', 'button', '编辑', '/back/user', '1', null, null, 'PUT', '', null, null, null, null, null, null, null, null, null, null, null, null), ('5', 'userManager:btn_del ', 'button', '删除', '/back/user', '1', null, null, 'DELETE', '', null, null, null, null, null, null, null, null, null, null, null, null), ('9', 'menuManager:element', 'uri', '按钮页面', '/admin/element', '6', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null), ('10', 'menuManager:btn_add', 'button', '新增', '/back/menu', '6', null, null, 'POST', '', null, null, null, null, null, null, null, null, null, null, null, null), ('11', 'menuManager:btn_edit', 'button', '编辑', '/back/menu', '6', '', '', 'PUT', '', '2017-06-24 00:00:00', '', '', '', '', '', '', '', '', '', '', ''), ('12', 'menuManager:btn_del ', 'button', '删除', '/back/menu', '6', '', '', 'DELETE', '', '2017-06-24 00:00:00', '', '', '', '', '', '', '', '', '', '', ''), ('13', 'menuManager:btn_element_add', 'button', '新增元素', '/back/element', '6', null, null, 'POST', '', null, null, null, null, null, null, null, null, null, null, null, null), ('14', 'menuManager:btn_element_edit', 'button', '编辑元素', '/back/element', '6', null, null, 'PUT', '', null, null, null, null, null, null, null, null, null, null, null, null), ('15', 'btn_element_del', 'button', '删除元素', '/back/element', '6', null, null, 'DELETE', '', null, null, null, null, null, null, null, null, null, null, null, null), ('16', 'groupManager:btn_add', 'button', '新增', '/back/group', '7', null, null, 'POST', '', null, null, null, null, null, null, null, null, null, null, null, null), ('17', 'groupManager:btn_edit', 'button', '编辑', '/back/group', '7', null, null, 'PUT', '', null, null, null, null, null, null, null, null, null, null, null, null), ('18', 'groupManager:btn_del', 'button', '删除', '/back/group', '7', null, null, 'DELETE', '', null, null, null, null, null, null, null, null, null, null, null, null), ('19', 'groupManager:btn_userManager', 'button', '分配用户', '/back/group/{*}/user', '7', null, null, 'PUT', '', null, null, null, null, null, null, null, null, null, null, null, null), ('20', 'groupManager:btn_resourceManager', 'button', '分配权限', '/back/group/{*}/authority', '7', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null), ('21', 'groupManager:menu', 'uri', '分配菜单', '/back/group/{*}/authority/menu', '7', null, null, 'POST', '', null, null, null, null, null, null, null, null, null, null, null, null), ('22', 'groupManager:element', 'uri', '分配资源', '/back/group/{*}/authority/element', '7', null, null, 'POST', '', null, null, null, null, null, null, null, null, null, null, null, null), ('23', 'userManager:view ', 'uri', '查看', '/back/user', '1', '', '', 'GET', '', '2017-06-26 00:00:00', '', '', '', '', '', '', '', '', '', '', ''), ('24', 'menuManager:view', 'uri', '查看', '/back/menu', '6', '', '', 'GET', '', '2017-06-26 00:00:00', '', '', '', '', '', '', '', '', '', '', ''), ('27', 'menuManager:element_view', 'uri', '查看', '/back/element', '6', null, null, 'GET', null, null, null, null, null, null, null, null, null, null, null, null, null), ('28', 'groupManager:view', 'uri', '查看', '/back/group', '7', null, null, 'GET', null, null, null, null, null, null, null, null, null, null, null, null, null), ('30', 'adminAPI:view', 'uri', '查看', '/back/swagger', '23', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null), ('31', 'adminAPI:swagger', 'uri', '查看', '/back/v2', '23', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null), ('32', 'groupTypeManager:view', 'uri', '查看', '/back/groupType', '8', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null), ('33', 'groupTypeManager:btn_add', 'button', '新增', '/back/groupType', '8', null, null, 'POST', null, null, null, null, null, null, null, null, null, null, null, null, null), ('34', 'groupTypeManager:btn_edit', 'button', '编辑', '/back/groupType', '8', null, null, 'PUT', null, null, null, null, null, null, null, null, null, null, null, null, null), ('35', 'groupTypeManager:btn_del', 'button', '删除', '/back/groupType', '8', null, null, 'DELETE', null, null, null, null, null, null, null, null, null, null, null, null, null), ('40', 'adminAPI:swagger_resources', 'uri', '查看', '/back/swagger-resources', '23', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null), ('41', 'gateLogManager:view', 'button', '查看', '/back/gateLog', '27', null, null, 'GET', '', '2017-07-01 00:00:00', '1', 'admin', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('42', 'blogArticle:view', 'uri', '查看', '/blog/article', '17', null, null, 'GET', '', null, null, null, null, null, null, null, null, null, null, null, null), ('43', 'blogArticle:edit', 'button', '编辑', '/blog/article', '17', null, null, 'PUT', '', '2017-07-15 23:52:01', '1', '管理员', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('44', 'blogArticle:del', 'button', '删除', '/blog/article', '17', null, null, 'DELETE', '', '2017-07-15 23:52:38', '1', '管理员', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('45', 'blogArticle:add', 'button', '新增', '/blog/article', '17', null, null, 'POST', '', '2017-07-15 23:53:06', '1', '管理员', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `base_group` --- ---------------------------- -DROP TABLE IF EXISTS `base_group`; -CREATE TABLE `base_group` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `parent_id` int(11) NOT NULL, - `path` varchar(2000) DEFAULT NULL, - `type` char(1) DEFAULT NULL, - `group_type` int(11) NOT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_group` --- ---------------------------- -BEGIN; -INSERT INTO `base_group` VALUES ('1', 'adminRole', '管理员', '-1', '/adminRole', null, '1', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('3', 'testGroup', '体验组', '-1', '/testGroup', null, '1', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('4', 'visitorRole', '游客', '3', '/testGroup/visitorRole', null, '1', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('6', 'company', 'AG集团', '-1', '/company', null, '2', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('7', 'financeDepart', '财务部', '6', '/company/financeDepart', null, '2', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('8', 'hrDepart', '人力资源部', '6', '/company/hrDepart', null, '2', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('9', 'blogAdmin', '博客管理员', '-1', '/blogAdmin', null, '1', '', '2017-07-16 16:59:30', '1', 'Mr.AG', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `base_group_leader` --- ---------------------------- -DROP TABLE IF EXISTS `base_group_leader`; -CREATE TABLE `base_group_leader` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `group_id` varchar(255) DEFAULT NULL, - `user_id` varchar(255) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_group_leader` --- ---------------------------- -BEGIN; -INSERT INTO `base_group_leader` VALUES ('4', '1', '1', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('6', '9', '4', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `base_group_member` --- ---------------------------- -DROP TABLE IF EXISTS `base_group_member`; -CREATE TABLE `base_group_member` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `group_id` varchar(255) DEFAULT NULL, - `user_id` varchar(255) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_group_member` --- ---------------------------- -BEGIN; -INSERT INTO `base_group_member` VALUES ('2', '4', '2', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('6', '1', '1', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('7', '1', '3', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('9', '9', '4', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `base_group_type` --- ---------------------------- -DROP TABLE IF EXISTS `base_group_type`; -CREATE TABLE `base_group_type` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_group_type` --- ---------------------------- -BEGIN; -INSERT INTO `base_group_type` VALUES ('1', null, '角色类型', '', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('2', 'depart', '部门类型', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('3', null, '自定义类型', '123', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `base_menu` --- ---------------------------- -DROP TABLE IF EXISTS `base_menu`; -CREATE TABLE `base_menu` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `code` varchar(255) DEFAULT NULL, - `title` varchar(255) DEFAULT NULL, - `parent_id` int(11) NOT NULL, - `href` varchar(255) DEFAULT NULL, - `icon` varchar(255) DEFAULT NULL, - `type` char(1) DEFAULT NULL, - `order_num` int(11) NOT NULL DEFAULT '0', - `description` varchar(255) DEFAULT NULL, - `path` varchar(500) DEFAULT NULL, - `enabled` char(1) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_menu` --- ---------------------------- -BEGIN; -INSERT INTO `base_menu` VALUES ('1', 'userManager', '用户管理', '5', '/admin/user', 'fa fa-user', null, '0', '', '/adminSys/baseManager/userManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('5', 'baseManager', '基础配置管理', '13', '', 'fa fa-cog fa-spin', null, '0', '用户', '/adminSys/baseManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('6', 'menuManager', '菜单管理', '5', '/admin/menu', 'fa fa-list', null, '0', '', '/adminSys/baseManager/menuManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('7', 'groupManager', '角色组管理', '5', '/admin/group', 'fa fa-users', null, '0', '', '/adminSys/baseManager/groupManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('8', 'groupTypeManager', '角色类型管理', '5', '/admin/groupType', 'fa fa-address-card-o', null, '0', '', '/adminSys/baseManager/groupTypeManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('9', 'monitorManager', '系统监控', '13', '', 'fa fa-area-chart', null, '0', '', '/adminSys/monitorManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('10', 'bootMonitor', 'Spring-Boot监控', '9', 'http://localhost:8764', 'fa fa-line-chart', null, '0', '', '/adminSys/monitorManager/bootMonitor', null, null, null, null, null, '2017-07-25 19:38:11', '1', 'Mr.AG', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('11', 'hystrixMonitor', 'Hystrix监控', '9', 'http://localhost:8764/hystrix', 'fa fa-bar-chart', null, '0', '', '/adminSys/monitorManager/hystrixMonitor', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('13', 'adminSys', '权限管理系统', '-1', '', 'fa fa-terminal', null, '0', '', '/adminSys', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('14', 'contentSys', '内容管理系统', '-1', '', 'fa-newspaper-o', null, '0', '', '/contentSys', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('17', 'articleManger', '文章管理', '20', '/admin/blog/article', 'fa fa-book', null, '0', '', '/contentSys/artComManger/articleManger', null, null, null, null, null, '2017-07-15 23:45:24', '1', '管理员', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('18', 'commentManager', '评论管理', '20', '', '', null, '0', '', '/contentSys/artComManger/commentManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('20', 'artComManger', '文章评论管理', '14', '', 'fa fa-bookmark', null, '0', '', '/contentSys/artComManger', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('21', 'dictManager', '数据字典', '5', '', 'fa fa-book', null, '0', '', '/adminSys/baseManager/dictManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('22', 'apiManager', '服务端api文档', '13', '', 'fa fa-folder', null, '0', '', '/adminSys/apiManager', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('23', 'adminAPI', 'Admin Rest API', '22', '/back/swagger-ui.html', 'fa fa-file-code-o', null, '0', '', '/adminSys/apiManager/adminAPI', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('24', 'druidMonitor', 'Admin Druid数据监控', '9', '/back/druid/datasource.html', 'fa fa-line-chart', null, '0', '', '/adminSys/monitorManager/druidMonitor', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('27', 'gateLogManager', '操作日志', '5', '/admin/gateLog', 'fa fa-book', null, '0', '', '/adminSys/baseManager/gateLogManager', null, '2017-07-01 00:00:00', '1', 'admin', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `base_resource_authority` --- ---------------------------- -DROP TABLE IF EXISTS `base_resource_authority`; -CREATE TABLE `base_resource_authority` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `authority_id` varchar(255) DEFAULT NULL, - `authority_type` varchar(255) DEFAULT NULL, - `resource_id` varchar(255) DEFAULT NULL, - `resource_type` varchar(255) DEFAULT NULL, - `parent_id` varchar(255) DEFAULT NULL, - `path` varchar(2000) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=722 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_resource_authority` --- ---------------------------- -BEGIN; -INSERT INTO `base_resource_authority` VALUES ('285', '1', 'group', '3', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('286', '1', 'group', '4', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('287', '1', 'group', '5', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('288', '1', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('289', '1', 'group', '10', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('290', '1', 'group', '11', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('291', '1', 'group', '12', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('292', '1', 'group', '3', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('293', '1', 'group', '4', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('294', '1', 'group', '5', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('295', '1', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('296', '1', 'group', '10', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('297', '1', 'group', '11', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('298', '1', 'group', '12', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('299', '1', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('300', '1', 'group', '12', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('301', '1', 'group', '10', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('302', '1', 'group', '11', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('303', '1', 'group', '13', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('304', '1', 'group', '14', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('305', '1', 'group', '15', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('306', '1', 'group', '10', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('307', '1', 'group', '11', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('308', '1', 'group', '12', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('309', '1', 'group', '13', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('310', '1', 'group', '14', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('311', '1', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('312', '1', 'group', '15', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('313', '1', 'group', '16', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('314', '1', 'group', '17', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('315', '1', 'group', '18', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('316', '1', 'group', '19', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('317', '1', 'group', '20', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('318', '1', 'group', '21', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('319', '1', 'group', '22', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('349', '4', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('371', '1', 'group', '23', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('372', '1', 'group', '24', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('373', '1', 'group', '27', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('374', '1', 'group', '28', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('375', '1', 'group', '23', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('376', '1', 'group', '3', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('377', '1', 'group', '4', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('378', '1', 'group', '5', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('379', '1', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('380', '1', 'group', '11', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('381', '1', 'group', '14', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('382', '1', 'group', '13', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('383', '1', 'group', '15', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('384', '1', 'group', '12', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('385', '1', 'group', '24', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('386', '1', 'group', '10', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('387', '1', 'group', '27', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('388', '1', 'group', '16', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('389', '1', 'group', '18', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('390', '1', 'group', '17', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('391', '1', 'group', '19', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('392', '1', 'group', '20', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('393', '1', 'group', '28', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('394', '1', 'group', '22', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('395', '1', 'group', '21', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('396', '4', 'group', '23', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('397', '4', 'group', '9', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('398', '4', 'group', '27', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('399', '4', 'group', '24', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('400', '4', 'group', '28', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('401', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('402', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('403', '1', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('421', '1', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('422', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('423', '4', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('424', '4', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('436', '1', 'group', '32', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('437', '1', 'group', '33', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('438', '1', 'group', '34', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('439', '1', 'group', '35', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('440', '4', 'group', '32', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('464', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('465', '1', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('466', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('467', '1', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('468', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('469', '1', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('470', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('471', '1', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('472', '1', 'group', '40', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('492', '1', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('493', '1', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('494', '1', 'group', '40', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('516', '4', 'group', '41', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('517', '4', 'group', '30', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('518', '4', 'group', '31', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('519', '4', 'group', '40', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('611', '4', 'group', '42', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('612', '4', 'group', '36', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('628', '4', 'group', '13', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('629', '4', 'group', '5', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('630', '4', 'group', '1', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('631', '4', 'group', '6', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('632', '4', 'group', '7', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('633', '4', 'group', '8', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('634', '4', 'group', '27', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('635', '4', 'group', '9', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('636', '4', 'group', '24', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('637', '4', 'group', '22', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('638', '4', 'group', '23', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('639', '4', 'group', '25', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('640', '4', 'group', '26', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('641', '4', 'group', '28', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('666', '1', 'group', '41', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('689', '1', 'group', '43', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('690', '1', 'group', '42', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('691', '1', 'group', '44', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('692', '1', 'group', '45', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('693', '1', 'group', '13', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('694', '1', 'group', '5', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('695', '1', 'group', '1', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('696', '1', 'group', '6', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('697', '1', 'group', '7', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('698', '1', 'group', '8', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('699', '1', 'group', '27', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('700', '1', 'group', '9', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('701', '1', 'group', '10', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('702', '1', 'group', '11', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('703', '1', 'group', '24', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('704', '1', 'group', '22', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('705', '1', 'group', '23', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('706', '1', 'group', '14', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('707', '1', 'group', '20', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('708', '1', 'group', '17', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('709', '1', 'group', '18', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('710', '9', 'group', '42', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('711', '9', 'group', '43', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('712', '9', 'group', '44', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('713', '9', 'group', '45', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('714', '9', 'group', '14', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('715', '9', 'group', '20', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('716', '9', 'group', '17', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('717', '9', 'group', '18', 'menu', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('718', '9', 'group', '42', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('719', '9', 'group', '44', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('720', '9', 'group', '45', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('721', '9', 'group', '43', 'button', '-1', null, null, null, null, null, null, null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `base_user` --- ---------------------------- -DROP TABLE IF EXISTS `base_user`; -CREATE TABLE `base_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `username` varchar(255) DEFAULT NULL, - `password` varchar(255) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `birthday` varchar(255) DEFAULT NULL, - `address` varchar(255) DEFAULT NULL, - `mobile_phone` varchar(255) DEFAULT NULL, - `tel_phone` varchar(255) DEFAULT NULL, - `email` varchar(255) DEFAULT NULL, - `sex` char(1) DEFAULT NULL, - `type` char(1) DEFAULT NULL, - `status` char(1) DEFAULT NULL, - `description` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `base_user` --- ---------------------------- -BEGIN; -INSERT INTO `base_user` VALUES ('1', 'admin', '$2a$12$S/yLlj9kzi5Dgsz97H4rAekxrPlk/10eXp1lUJcAVAx.2M9tOpWie', 'Mr.AG', '', null, '', null, '', '男', null, null, '', null, null, null, null, '2017-07-25 14:54:21', '1', 'Mr.AG', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('2', 'test', '$2a$12$zWe6knO6rGp15UVfdWTTxu.Ykt.k3QnD5FPoj6a1cnL63csHY2A1S', '测试账户', '', null, '', null, '', '男', null, null, '', null, null, null, null, '2017-07-15 19:18:07', '1', '管理员', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('4', 'blog', '$2a$12$0oITP2RIK26gu.BUf6Rjkucu/PASDAbLoUvjtHgCLFRX0EAPR6AhS', 'Mr.AG', '', null, '', null, '', '男', null, null, '', null, null, null, null, '2017-07-16 17:12:28', '1', 'Mr.AG', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null); -COMMIT; - --- ---------------------------- --- Table structure for `gate_log` --- ---------------------------- -DROP TABLE IF EXISTS `gate_log`; -CREATE TABLE `gate_log` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `menu` varchar(255) DEFAULT NULL, - `opt` varchar(255) DEFAULT NULL, - `uri` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=216 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `gate_log` --- ---------------------------- -BEGIN; -INSERT INTO `gate_log` VALUES ('11', '用户管理', '编辑', '/back/user', '2017-07-01 21:13:09', '1', 'admin', '0:0:0:0:0:0:0:1'), ('12', '客户端管理', '新增', '/back/gateClient', '2017-07-02 16:54:22', '1', '管理员', '0:0:0:0:0:0:0:1'), ('13', '客户端管理', '新增', '/back/gateClient', '2017-07-02 22:31:47', '1', '管理员', '0:0:0:0:0:0:0:1'), ('14', '客户端管理', '新增', '/back/gateClient', '2017-07-02 22:32:08', '1', '管理员', '0:0:0:0:0:0:0:1'), ('15', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 13:35:45', '1', '管理员', '0:0:0:0:0:0:0:1'), ('16', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 13:35:57', '1', '管理员', '0:0:0:0:0:0:0:1'), ('17', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 05:38:12', '1', '管理员', '0:0:0:0:0:0:0:1'), ('18', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 05:38:23', '1', '管理员', '0:0:0:0:0:0:0:1'), ('19', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 05:38:42', '1', '管理员', '0:0:0:0:0:0:0:1'), ('20', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 05:39:14', '1', '管理员', '0:0:0:0:0:0:0:1'), ('21', '菜单管理', '新增', '/back/menu', '2017-07-03 12:43:01', '1', '管理员', '0:0:0:0:0:0:0:1'), ('22', '角色组管理', '新增', '/back/group', '2017-07-03 12:43:29', '1', '管理员', '0:0:0:0:0:0:0:1'), ('23', '菜单管理', '新增元素', '/back/element', '2017-07-03 13:39:43', '1', '管理员', '0:0:0:0:0:0:0:1'), ('24', '菜单管理', '新增元素', '/back/element', '2017-07-03 13:43:17', '1', '管理员', '0:0:0:0:0:0:0:1'), ('25', '菜单管理', '新增元素', '/back/element', '2017-07-03 13:49:11', '1', '管理员', '0:0:0:0:0:0:0:1'), ('26', '角色组管理', '新增', '/back/group', '2017-07-03 13:52:00', '1', '管理员', '0:0:0:0:0:0:0:1'), ('27', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 14:08:58', '1', '管理员', '0:0:0:0:0:0:0:1'), ('28', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 14:56:28', '1', '管理员', '0:0:0:0:0:0:0:1'), ('29', '客户端管理', '编辑', '/back/gateClient', '2017-07-03 14:56:30', '1', '管理员', '0:0:0:0:0:0:0:1'), ('30', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:14:47', '1', '管理员', '0:0:0:0:0:0:0:1'), ('31', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:14:49', '1', '管理员', '0:0:0:0:0:0:0:1'), ('32', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:17:50', '1', '管理员', '0:0:0:0:0:0:0:1'), ('33', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:17:51', '1', '管理员', '0:0:0:0:0:0:0:1'), ('34', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:35:58', '1', '管理员', '0:0:0:0:0:0:0:1'), ('35', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:36:16', '1', '管理员', '0:0:0:0:0:0:0:1'), ('36', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:43:08', '1', '管理员', '0:0:0:0:0:0:0:1'), ('37', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:47:31', '1', '管理员', '0:0:0:0:0:0:0:1'), ('38', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:47:34', '1', '管理员', '0:0:0:0:0:0:0:1'), ('39', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:47:44', '1', '管理员', '0:0:0:0:0:0:0:1'), ('40', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:48:24', '1', '管理员', '0:0:0:0:0:0:0:1'), ('41', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:49:00', '1', '管理员', '0:0:0:0:0:0:0:1'), ('42', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:52:04', '1', '管理员', '0:0:0:0:0:0:0:1'), ('43', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 00:52:58', '1', '管理员', '0:0:0:0:0:0:0:1'), ('44', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:16:24', '1', '管理员', '0:0:0:0:0:0:0:1'), ('45', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:16:40', '1', '管理员', '0:0:0:0:0:0:0:1'), ('46', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:17:11', '1', '管理员', '0:0:0:0:0:0:0:1'), ('47', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:20:39', '1', '管理员', '0:0:0:0:0:0:0:1'), ('48', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:21:52', '1', '管理员', '0:0:0:0:0:0:0:1'), ('49', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:21:55', '1', '管理员', '0:0:0:0:0:0:0:1'), ('50', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:25:19', '1', '管理员', '0:0:0:0:0:0:0:1'), ('51', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:26:02', '1', '管理员', '0:0:0:0:0:0:0:1'), ('52', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:26:12', '1', '管理员', '0:0:0:0:0:0:0:1'), ('53', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:26:38', '1', '管理员', '0:0:0:0:0:0:0:1'), ('54', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:26:51', '1', '管理员', '0:0:0:0:0:0:0:1'), ('55', '客户端管理', '编辑', '/back/gateClient', '2017-07-04 05:29:01', '1', '管理员', '0:0:0:0:0:0:0:1'), ('56', '客户端管理', '编辑', '/back/gateClient', '2017-07-05 05:25:31', '1', '管理员', '0:0:0:0:0:0:0:1'), ('57', '客户端管理', '编辑', '/back/gateClient', '2017-07-05 05:30:13', '1', '管理员', '0:0:0:0:0:0:0:1'), ('58', '菜单管理', '编辑元素', '/back/element', '2017-07-05 05:33:39', '1', '管理员', '0:0:0:0:0:0:0:1'), ('59', '菜单管理', '编辑元素', '/back/element', '2017-07-05 05:38:10', '1', '管理员', '0:0:0:0:0:0:0:1'), ('60', '客户端管理', '编辑', '/back/gateClient', '2017-07-05 05:38:48', '1', '管理员', '0:0:0:0:0:0:0:1'), ('61', '菜单管理', '新增元素', '/back/element', '2017-07-05 05:42:16', '1', '管理员', '0:0:0:0:0:0:0:1'), ('62', '菜单管理', '删除元素', '/back/element', '2017-07-05 05:45:47', '1', '管理员', '0:0:0:0:0:0:0:1'), ('63', '菜单管理', '新增元素', '/back/element', '2017-07-06 05:46:26', '1', '管理员', '0:0:0:0:0:0:0:1'), ('64', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 05:47:28', '1', '管理员', '0:0:0:0:0:0:0:1'), ('65', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 13:40:16', '1', '管理员', '0:0:0:0:0:0:0:1'), ('66', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 13:42:04', '1', '管理员', '0:0:0:0:0:0:0:1'), ('67', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 13:42:13', '1', '管理员', '0:0:0:0:0:0:0:1'), ('68', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 13:42:16', '1', '管理员', '0:0:0:0:0:0:0:1'), ('69', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 13:43:28', '1', '管理员', '0:0:0:0:0:0:0:1'), ('70', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 13:43:39', '1', '管理员', '0:0:0:0:0:0:0:1'), ('71', '客户端管理', '删除', '/back/gateClient', '2017-07-06 13:44:25', '1', '管理员', '0:0:0:0:0:0:0:1'), ('72', '菜单管理', '编辑元素', '/back/element', '2017-07-06 15:13:12', '1', '管理员', '0:0:0:0:0:0:0:1'), ('73', '菜单管理', '编辑元素', '/back/element', '2017-07-06 15:13:33', '1', '管理员', '0:0:0:0:0:0:0:1'), ('74', '菜单管理', '编辑元素', '/back/element', '2017-07-06 15:13:40', '1', '管理员', '0:0:0:0:0:0:0:1'), ('75', '客户端管理', '编辑', '/back/gateClient', '2017-07-06 15:14:11', '1', '管理员', '0:0:0:0:0:0:0:1'), ('76', '角色组管理', '新增', '/back/group', '2017-07-07 01:43:24', '1', '管理员', '0:0:0:0:0:0:0:1'), ('77', '角色组管理', '新增', '/back/group', '2017-07-07 01:43:24', '1', '管理员', '0:0:0:0:0:0:0:1'), ('78', '角色组管理', '新增', '/back/group', '2017-07-07 01:43:26', '1', '管理员', '0:0:0:0:0:0:0:1'), ('79', '角色组管理', '新增', '/back/group', '2017-07-07 01:43:26', '1', '管理员', '0:0:0:0:0:0:0:1'), ('80', '角色组管理', '新增', '/back/group', '2017-07-07 01:43:28', '1', '管理员', '0:0:0:0:0:0:0:1'), ('81', '角色组管理', '新增', '/back/group', '2017-07-07 01:43:28', '1', '管理员', '0:0:0:0:0:0:0:1'), ('82', '客户端管理', '编辑', '/gate/client', '2017-07-07 02:37:27', '1', '管理员', '0:0:0:0:0:0:0:1'), ('83', '客户端管理', '编辑', '/gate/client', '2017-07-07 02:40:04', '1', '管理员', '0:0:0:0:0:0:0:1'), ('84', '客户端管理', '新增', '/gate/client', '2017-07-07 02:40:11', '1', '管理员', '0:0:0:0:0:0:0:1'), ('85', '客户端管理', '编辑', '/gate/client', '2017-07-07 02:40:16', '1', '管理员', '0:0:0:0:0:0:0:1'), ('86', '客户端管理', '编辑', '/gate/client', '2017-07-07 02:40:18', '1', '管理员', '0:0:0:0:0:0:0:1'), ('87', '客户端管理', '编辑', '/gate/client', '2017-07-07 02:40:19', '1', '管理员', '0:0:0:0:0:0:0:1'), ('88', '客户端管理', '编辑', '/gate/client', '2017-07-07 02:40:34', '1', '管理员', '0:0:0:0:0:0:0:1'), ('89', '客户端管理', '编辑', '/gate/client', '2017-07-07 02:42:18', '1', '管理员', '0:0:0:0:0:0:0:1'), ('90', '客户端管理', '编辑', '/gate/client', '2017-07-07 03:26:47', '1', '管理员', '0:0:0:0:0:0:0:1'), ('91', '客户端管理', '编辑', '/gate/client', '2017-07-07 03:32:18', '1', '管理员', '0:0:0:0:0:0:0:1'), ('92', '客户端管理', '编辑', '/gate/client', '2017-07-07 03:32:23', '1', '管理员', '0:0:0:0:0:0:0:1'), ('93', '菜单管理', '新增元素', '/back/element', '2017-07-07 04:04:36', '1', '管理员', '0:0:0:0:0:0:0:1'), ('94', '菜单管理', '新增元素', '/back/element', '2017-07-07 04:06:20', '1', '管理员', '0:0:0:0:0:0:0:1'), ('95', '菜单管理', '新增元素', '/back/element', '2017-07-07 04:06:45', '1', '管理员', '0:0:0:0:0:0:0:1'), ('96', '菜单管理', '新增元素', '/back/element', '2017-07-07 04:07:07', '1', '管理员', '0:0:0:0:0:0:0:1'), ('97', '角色组管理', '新增', '/back/group', '2017-07-07 04:08:19', '1', '管理员', '0:0:0:0:0:0:0:1'), ('98', '角色组管理', '新增', '/back/group', '2017-07-07 04:08:19', '1', '管理员', '0:0:0:0:0:0:0:1'), ('99', '角色组管理', '新增', '/back/group', '2017-07-07 04:08:21', '1', '管理员', '0:0:0:0:0:0:0:1'), ('100', '服务注册', '编辑', '/gate/service', '2017-07-07 04:09:12', '1', '管理员', '0:0:0:0:0:0:0:1'), ('101', '服务注册', '编辑', '/gate/service', '2017-07-07 04:09:13', '1', '管理员', '0:0:0:0:0:0:0:1'), ('102', '服务注册', '编辑', '/gate/service', '2017-07-07 04:12:39', '1', '管理员', '0:0:0:0:0:0:0:1'), ('103', '角色组管理', '新增', '/back/group', '2017-07-07 04:13:04', '1', '管理员', '0:0:0:0:0:0:0:1'), ('104', '角色组管理', '新增', '/back/group', '2017-07-07 04:13:04', '1', '管理员', '0:0:0:0:0:0:0:1'), ('105', '客户端管理', '编辑', '/gate/client', '2017-07-07 05:48:42', '1', '管理员', '0:0:0:0:0:0:0:1'), ('106', '客户端管理', '编辑', '/gate/client', '2017-07-07 05:50:12', '1', '管理员', '0:0:0:0:0:0:0:1'), ('107', '客户端管理', '编辑', '/gate/client', '2017-07-07 05:51:27', '1', '管理员', '0:0:0:0:0:0:0:1'), ('108', '客户端管理', '编辑', '/gate/client', '2017-07-07 09:29:55', '1', '管理员', '0:0:0:0:0:0:0:1'), ('109', '客户端管理', '编辑', '/gate/client', '2017-07-07 09:30:01', '1', '管理员', '0:0:0:0:0:0:0:1'), ('110', '服务注册', '删除', '/gate/service', '2017-07-07 09:30:09', '1', '管理员', '0:0:0:0:0:0:0:1'), ('111', '服务注册', '删除', '/gate/service', '2017-07-07 09:30:15', '1', '管理员', '0:0:0:0:0:0:0:1'), ('112', '服务注册', '删除', '/gate/service', '2017-07-07 09:30:20', '1', '管理员', '0:0:0:0:0:0:0:1'), ('113', '服务注册', '删除', '/gate/service', '2017-07-07 09:30:27', '1', '管理员', '0:0:0:0:0:0:0:1'), ('114', '客户端管理', '编辑', '/gate/client', '2017-07-07 20:59:07', '1', '管理员', '0:0:0:0:0:0:0:1'), ('115', '客户端管理', '编辑', '/gate/client', '2017-07-07 20:59:10', '1', '管理员', '0:0:0:0:0:0:0:1'), ('116', '客户端管理', '编辑', '/gate/client', '2017-07-07 20:59:13', '1', '管理员', '0:0:0:0:0:0:0:1'), ('117', '角色组管理', '新增', '/back/group', '2017-07-07 21:11:40', '1', '管理员', '0:0:0:0:0:0:0:1'), ('118', '角色组管理', '新增', '/back/group', '2017-07-07 21:11:46', '1', '管理员', '0:0:0:0:0:0:0:1'), ('119', '角色组管理', '新增', '/back/group', '2017-07-07 21:11:48', '1', '管理员', '0:0:0:0:0:0:0:1'), ('120', '角色组管理', '新增', '/back/group', '2017-07-07 21:13:39', '1', '管理员', '0:0:0:0:0:0:0:1'), ('121', '客户端管理', '编辑', '/gate/client', '2017-07-07 21:51:24', '1', '管理员', '0:0:0:0:0:0:0:1'), ('122', '客户端管理', '编辑', '/gate/client', '2017-07-07 21:51:31', '1', '管理员', '0:0:0:0:0:0:0:1'), ('123', '服务注册', '编辑', '/gate/service', '2017-07-07 22:22:18', '1', '管理员', '0:0:0:0:0:0:0:1'), ('124', '服务注册', '删除', '/gate/service', '2017-07-07 22:22:28', '1', '管理员', '0:0:0:0:0:0:0:1'), ('125', '服务注册', '删除', '/gate/service', '2017-07-07 22:22:34', '1', '管理员', '0:0:0:0:0:0:0:1'), ('126', '服务注册', '删除', '/gate/service', '2017-07-07 22:22:39', '1', '管理员', '0:0:0:0:0:0:0:1'), ('127', '客户端管理', '编辑', '/gate/client', '2017-07-07 22:22:49', '1', '管理员', '0:0:0:0:0:0:0:1'), ('128', '用户管理', '新增', '/back/user', '2017-07-15 18:32:12', '1', '管理员', '0:0:0:0:0:0:0:1'), ('129', '角色组管理', '编辑', '/back/group', '2017-07-15 18:32:27', '1', '管理员', '0:0:0:0:0:0:0:1'), ('130', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:16', '1', '管理员', '0:0:0:0:0:0:0:1'), ('131', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:16', '1', '管理员', '0:0:0:0:0:0:0:1'), ('132', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:19', '1', '管理员', '0:0:0:0:0:0:0:1'), ('133', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:20', '1', '管理员', '0:0:0:0:0:0:0:1'), ('134', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:21', '1', '管理员', '0:0:0:0:0:0:0:1'), ('135', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:25', '1', '管理员', '0:0:0:0:0:0:0:1'), ('136', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:29', '1', '管理员', '0:0:0:0:0:0:0:1'), ('137', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:30', '1', '管理员', '0:0:0:0:0:0:0:1'), ('138', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:33', '1', '管理员', '0:0:0:0:0:0:0:1'), ('139', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:35', '1', '管理员', '0:0:0:0:0:0:0:1'), ('140', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:35', '1', '管理员', '0:0:0:0:0:0:0:1'), ('141', '角色组管理', '新增', '/back/group', '2017-07-15 18:36:37', '1', '管理员', '0:0:0:0:0:0:0:1'), ('142', '角色组管理', '新增', '/back/group', '2017-07-15 18:37:03', '1', '管理员', '0:0:0:0:0:0:0:1'), ('143', '角色组管理', '新增', '/back/group', '2017-07-15 18:37:03', '1', '管理员', '0:0:0:0:0:0:0:1'), ('144', '角色组管理', '新增', '/back/group', '2017-07-15 18:37:04', '1', '管理员', '0:0:0:0:0:0:0:1'), ('145', '角色组管理', '新增', '/back/group', '2017-07-15 18:37:09', '1', '管理员', '0:0:0:0:0:0:0:1'), ('146', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:37:36', '1', '管理员', '0:0:0:0:0:0:0:1'), ('147', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:37:42', '1', '管理员', '0:0:0:0:0:0:0:1'), ('148', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:37:48', '1', '管理员', '0:0:0:0:0:0:0:1'), ('149', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:37:53', '1', '管理员', '0:0:0:0:0:0:0:1'), ('150', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:38:02', '1', '管理员', '0:0:0:0:0:0:0:1'), ('151', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:38:07', '1', '管理员', '0:0:0:0:0:0:0:1'), ('152', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:38:13', '1', '管理员', '0:0:0:0:0:0:0:1'), ('153', '菜单管理', '删除元素', '/back/element', '2017-07-15 18:38:20', '1', '管理员', '0:0:0:0:0:0:0:1'), ('154', '菜单管理', '删除', '/back/menu', '2017-07-15 18:38:28', '1', '管理员', '0:0:0:0:0:0:0:1'), ('155', '菜单管理', '删除', '/back/menu', '2017-07-15 18:38:33', '1', '管理员', '0:0:0:0:0:0:0:1'), ('156', '菜单管理', '删除', '/back/menu', '2017-07-15 18:38:39', '1', '管理员', '0:0:0:0:0:0:0:1'), ('157', '用户管理', '删除', '/back/user', '2017-07-15 19:15:00', '1', '管理员', '0:0:0:0:0:0:0:1'), ('158', '用户管理', '编辑', '/back/user', '2017-07-15 19:18:06', '1', '管理员', '0:0:0:0:0:0:0:1'), ('159', '角色组管理', '删除', '/back/group', '2017-07-15 19:22:38', '1', '管理员', '0:0:0:0:0:0:0:1'), ('160', '菜单管理', '编辑', '/back/menu', '2017-07-15 23:45:24', '1', '管理员', '0:0:0:0:0:0:0:1'), ('161', '菜单管理', '新增元素', '/back/element', '2017-07-15 23:51:07', '1', '管理员', '0:0:0:0:0:0:0:1'), ('162', '菜单管理', '新增元素', '/back/element', '2017-07-15 23:52:00', '1', '管理员', '0:0:0:0:0:0:0:1'), ('163', '菜单管理', '编辑元素', '/back/element', '2017-07-15 23:52:07', '1', '管理员', '0:0:0:0:0:0:0:1'), ('164', '菜单管理', '新增元素', '/back/element', '2017-07-15 23:52:37', '1', '管理员', '0:0:0:0:0:0:0:1'), ('165', '菜单管理', '新增元素', '/back/element', '2017-07-15 23:53:06', '1', '管理员', '0:0:0:0:0:0:0:1'), ('166', '角色组管理', '新增', '/back/group', '2017-07-15 23:53:20', '1', '管理员', '0:0:0:0:0:0:0:1'), ('167', '角色组管理', '新增', '/back/group', '2017-07-15 23:53:20', '1', '管理员', '0:0:0:0:0:0:0:1'), ('168', '角色组管理', '新增', '/back/group', '2017-07-15 23:53:21', '1', '管理员', '0:0:0:0:0:0:0:1'), ('169', '角色组管理', '新增', '/back/group', '2017-07-15 23:53:21', '1', '管理员', '0:0:0:0:0:0:0:1'), ('170', '角色组管理', '新增', '/back/group', '2017-07-15 23:53:22', '1', '管理员', '0:0:0:0:0:0:0:1'), ('171', '角色组管理', '新增', '/back/group', '2017-07-15 23:53:22', '1', '管理员', '0:0:0:0:0:0:0:1'), ('172', '角色组管理', '新增', '/back/group', '2017-07-15 23:53:29', '1', '管理员', '0:0:0:0:0:0:0:1'), ('173', '文章管理', '新增', '/blog/article', '2017-07-15 23:54:51', '1', '管理员', '0:0:0:0:0:0:0:1'), ('174', '文章管理', '编辑', '/blog/article', '2017-07-16 12:59:56', '1', '管理员', '0:0:0:0:0:0:0:1'), ('175', '文章管理', '编辑', '/blog/article', '2017-07-16 13:04:02', '1', '管理员', '0:0:0:0:0:0:0:1'), ('176', '文章管理', '编辑', '/blog/article', '2017-07-16 13:04:56', '1', '管理员', '0:0:0:0:0:0:0:1'), ('177', '文章管理', '编辑', '/blog/article', '2017-07-16 13:05:15', '1', '管理员', '0:0:0:0:0:0:0:1'), ('178', '文章管理', '编辑', '/blog/article', '2017-07-16 13:06:58', '1', '管理员', '0:0:0:0:0:0:0:1'), ('179', '文章管理', '编辑', '/blog/article', '2017-07-16 13:07:47', '1', '管理员', '0:0:0:0:0:0:0:1'), ('180', '用户管理', '编辑', '/back/user', '2017-07-16 13:09:03', '1', '管理员', '0:0:0:0:0:0:0:1'), ('181', '文章管理', '新增', '/blog/article', '2017-07-16 16:40:59', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('182', '文章管理', '编辑', '/blog/article', '2017-07-16 16:55:49', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('183', '文章管理', '编辑', '/blog/article', '2017-07-16 16:56:21', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('184', '文章管理', '删除', '/blog/article', '2017-07-16 16:57:24', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('185', '文章管理', '删除', '/blog/article', '2017-07-16 16:57:27', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('186', '用户管理', '新增', '/back/user', '2017-07-16 16:58:49', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('187', '角色组管理', '新增', '/back/group', '2017-07-16 16:59:30', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('188', '角色组管理', '新增', '/back/group', '2017-07-16 16:59:41', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('189', '角色组管理', '新增', '/back/group', '2017-07-16 16:59:41', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('190', '角色组管理', '新增', '/back/group', '2017-07-16 16:59:42', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('191', '角色组管理', '新增', '/back/group', '2017-07-16 16:59:42', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('192', '角色组管理', '新增', '/back/group', '2017-07-16 16:59:44', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('193', '角色组管理', '编辑', '/back/group', '2017-07-16 16:59:55', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('194', '角色组管理', '新增', '/back/group', '2017-07-16 17:00:23', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('195', '角色组管理', '新增', '/back/group', '2017-07-16 17:00:23', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('196', '角色组管理', '新增', '/back/group', '2017-07-16 17:00:23', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('197', '角色组管理', '新增', '/back/group', '2017-07-16 17:00:23', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('198', '角色组管理', '编辑', '/back/group', '2017-07-16 17:00:30', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('199', '文章管理', '新增', '/blog/article', '2017-07-16 17:11:28', '4', 'blog', '0:0:0:0:0:0:0:1'), ('200', '用户管理', '编辑', '/back/user', '2017-07-16 17:12:27', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('201', '文章管理', '新增', '/blog/article', '2017-07-17 08:29:19', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('202', '文章管理', '编辑', '/blog/article', '2017-07-17 08:52:01', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('203', '文章管理', '编辑', '/blog/article', '2017-07-17 09:02:49', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('204', '文章管理', '编辑', '/blog/article', '2017-07-17 09:03:20', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('205', '文章管理', '编辑', '/blog/article', '2017-07-17 09:03:55', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('206', '文章管理', '编辑', '/blog/article', '2017-07-17 09:04:59', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('207', '文章管理', '编辑', '/blog/article', '2017-07-17 09:05:05', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('208', '文章管理', '编辑', '/blog/article', '2017-07-17 09:05:56', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('209', '文章管理', '编辑', '/blog/article', '2017-07-17 09:06:52', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('210', '文章管理', '编辑', '/blog/article', '2017-07-17 12:02:25', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('211', '文章管理', '编辑', '/blog/article', '2017-07-17 12:08:03', '4', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('212', '用户管理', '编辑', '/back/user', '2017-07-19 15:34:14', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('213', '用户管理', '编辑', '/back/user', '2017-07-25 14:50:07', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('214', '用户管理', '编辑', '/back/user', '2017-07-25 14:54:20', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'), ('215', '菜单管理', '编辑', '/back/menu', '2017-07-25 19:38:10', '1', 'Mr.AG', '0:0:0:0:0:0:0:1'); -COMMIT; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/HystrixConfig.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/HystrixConfig.java deleted file mode 100644 index 6ab9fa100978c759375e2e05b0f446e36d31240c..0000000000000000000000000000000000000000 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/HystrixConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.wxiaoqi.security.admin.config; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-01 8:12 - */ - -import org.springframework.boot.context.embedded.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; - -//@Configuration -public class HystrixConfig { - -// @Bean - public HystrixMetricsStreamServlet hystrixMetricsStreamServlet(){ - return new HystrixMetricsStreamServlet(); - } - -// @Bean - public ServletRegistrationBean registration(HystrixMetricsStreamServlet servlet){ - ServletRegistrationBean registrationBean = new ServletRegistrationBean(); - registrationBean.setServlet(servlet); - registrationBean.setEnabled(true);//是否启用该registrationBean - registrationBean.addUrlMappings("/hystrix.stream"); - return registrationBean; - } -} diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/MapperConfiguration.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/MapperConfiguration.java deleted file mode 100644 index dbd7dc3904391f2003bcef7ccb6c680273629735..0000000000000000000000000000000000000000 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/MapperConfiguration.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.wxiaoqi.security.admin.config; - - -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.bind.RelaxedPropertyResolver; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import tk.mybatis.spring.mapper.MapperScannerConfigurer; - -/** - * mybatis mapper 扫描配置类 - * - * @author wanghaobin - * @date 2016年12月15日 - * @since 1.7 - */ -@Configuration -@AutoConfigureAfter(MybatisConfiguration.class) -public class MapperConfiguration implements EnvironmentAware { - - private RelaxedPropertyResolver propertyResolver; - - private String basePackage; - - @Bean - public MapperScannerConfigurer mapperScannerConfigurer(Environment environment){ - - MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); - mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); - mapperScannerConfigurer.setBasePackage(basePackage); - return mapperScannerConfigurer; - } - - - public void setEnvironment(Environment environment) { - this.propertyResolver = new RelaxedPropertyResolver(environment, null); - this.basePackage = propertyResolver.getProperty("mybatis.basepackage"); - } -} \ No newline at end of file diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/MybatisConfiguration.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/MybatisConfiguration.java deleted file mode 100644 index b0b7a095faf72bfdbc0d4407cf51f949fac0b935..0000000000000000000000000000000000000000 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/MybatisConfiguration.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.github.wxiaoqi.security.admin.config; - - -import com.alibaba.druid.pool.DruidDataSource; -import com.github.pagehelper.PageHelper; -import org.apache.commons.lang3.StringUtils; -import org.apache.ibatis.plugin.Interceptor; -import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.SqlSessionTemplate; -import org.springframework.boot.bind.RelaxedPropertyResolver; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.sql.DataSource; -import java.sql.SQLException; -import java.util.Properties; - -/** - * mybatis 配置数据源类 - * - * @author wanghaobin - * @date 2016年12月15日 - * @since 1.7 - */ -@Configuration -@EnableTransactionManagement -public class MybatisConfiguration implements EnvironmentAware { - - - private RelaxedPropertyResolver propertyResolver; - - private String driveClassName; - private String url; - private String userName; - private String password; - private String xmlLocation; - private String typeAliasesPackage; - /////////////////////druid参数/////////////////////////////////////////////////// - private String filters; - private String maxActive; - private String initialSize; - private String maxWait; - private String minIdle; - private String timeBetweenEvictionRunsMillis; - private String minEvictableIdleTimeMillis; - private String validationQuery; - private String testWhileIdle; - private String testOnBorrow; - private String testOnReturn; - private String poolPreparedStatements; - private String maxOpenPreparedStatements; - ////////////////////////////////////////////////////////////////////////// - - @Bean - public DataSource druidDataSource() { - DruidDataSource druidDataSource = new DruidDataSource(); - druidDataSource.setUrl(url); - druidDataSource.setUsername(userName); - druidDataSource.setPassword(password); - druidDataSource.setDriverClassName(StringUtils.isNotBlank(driveClassName)?driveClassName:"com.mysql.jdbc.Driver"); - druidDataSource.setMaxActive(StringUtils.isNotBlank(maxActive)? Integer.parseInt(maxActive):10); - druidDataSource.setInitialSize(StringUtils.isNotBlank(initialSize)? Integer.parseInt(initialSize):1); - druidDataSource.setMaxWait(StringUtils.isNotBlank(maxWait)? Integer.parseInt(maxWait):60000); - druidDataSource.setMinIdle(StringUtils.isNotBlank(minIdle)? Integer.parseInt(minIdle):3); - druidDataSource.setTimeBetweenEvictionRunsMillis(StringUtils.isNotBlank(timeBetweenEvictionRunsMillis)? - Integer.parseInt(timeBetweenEvictionRunsMillis):60000); - druidDataSource.setMinEvictableIdleTimeMillis(StringUtils.isNotBlank(minEvictableIdleTimeMillis)? - Integer.parseInt(minEvictableIdleTimeMillis):300000); - druidDataSource.setValidationQuery(StringUtils.isNotBlank(validationQuery)?validationQuery:"select 'x'"); - druidDataSource.setTestWhileIdle(StringUtils.isNotBlank(testWhileIdle)? Boolean.parseBoolean(testWhileIdle):true); - druidDataSource.setTestOnBorrow(StringUtils.isNotBlank(testOnBorrow)? Boolean.parseBoolean(testOnBorrow):false); - druidDataSource.setTestOnReturn(StringUtils.isNotBlank(testOnReturn)? Boolean.parseBoolean(testOnReturn):false); - druidDataSource.setPoolPreparedStatements(StringUtils.isNotBlank(poolPreparedStatements)? Boolean.parseBoolean(poolPreparedStatements):true); - druidDataSource.setMaxOpenPreparedStatements(StringUtils.isNotBlank(maxOpenPreparedStatements)? Integer.parseInt(maxOpenPreparedStatements):20); - - try { - druidDataSource.setFilters(StringUtils.isNotBlank(filters)?filters:"stat, wall"); - } catch (SQLException e) { - e.printStackTrace(); - } - return druidDataSource; - } - - @Bean(name = "sqlSessionFactory") - public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) { - SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); - bean.setDataSource(dataSource); - if(StringUtils.isNotBlank(typeAliasesPackage)){ - bean.setTypeAliasesPackage(typeAliasesPackage); - } - //分页插件 - PageHelper pageHelper = new PageHelper(); - Properties properties = new Properties(); - properties.setProperty("reasonable", "true"); - properties.setProperty("supportMethodsArguments", "true"); - properties.setProperty("returnPageInfo", "check"); - properties.setProperty("params", "count=countSql"); - pageHelper.setProperties(properties); - //添加XML目录 - ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - Interceptor[] plugins = new Interceptor[]{pageHelper}; - bean.setPlugins(plugins); - try { - bean.setMapperLocations(resolver.getResources(xmlLocation)); - return bean.getObject(); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - @Bean - public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { - return new SqlSessionTemplate(sqlSessionFactory); - } - - public void setEnvironment(Environment environment) { - this.propertyResolver = new RelaxedPropertyResolver(environment, null); - this.url = propertyResolver.getProperty("spring.datasource.url"); - this.userName= propertyResolver.getProperty("spring.datasource.username"); - this.password = propertyResolver.getProperty("spring.datasource.password"); - this.driveClassName = propertyResolver.getProperty("spring.datasource.driver-class-name"); - this.filters = propertyResolver.getProperty("spring.datasource.filters"); - this.maxActive = propertyResolver.getProperty("spring.datasource.maxActive"); - this.initialSize = propertyResolver.getProperty("spring.datasource.initialSize"); - this.maxWait = propertyResolver.getProperty("spring.datasource.maxWait"); - this.minIdle = propertyResolver.getProperty("spring.datasource.minIdle"); - this.timeBetweenEvictionRunsMillis = propertyResolver.getProperty("spring.datasource.timeBetweenEvictionRunsMillis"); - this.minEvictableIdleTimeMillis = propertyResolver.getProperty("spring.datasource.minEvictableIdleTimeMillis"); - this.validationQuery = propertyResolver.getProperty("spring.datasource.validationQuery"); - this.testWhileIdle = propertyResolver.getProperty("spring.datasource.testWhileIdle"); - this.testOnBorrow = propertyResolver.getProperty("spring.datasource.testOnBorrow"); - this.testOnReturn = propertyResolver.getProperty("spring.datasource.testOnReturn"); - this.poolPreparedStatements = propertyResolver.getProperty("spring.datasource.poolPreparedStatements"); - this.maxOpenPreparedStatements = propertyResolver.getProperty("spring.datasource.maxOpenPreparedStatements"); - this.typeAliasesPackage = propertyResolver.getProperty("mybatis.typeAliasesPackage"); - this.xmlLocation = propertyResolver.getProperty("mybatis.xmlLocation"); - } - - @Bean - public DataSourceTransactionManager transactionManager(DataSource dataSource) { - return new DataSourceTransactionManager(dataSource); - } - -} diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/SwaggerConfiguration.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/SwaggerConfiguration.java deleted file mode 100644 index fe4f78c89123df63ae829e20c42e8707d06f7674..0000000000000000000000000000000000000000 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/SwaggerConfiguration.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.github.wxiaoqi.security.admin.config; - -import static com.google.common.base.Predicates.or; -import static springfox.documentation.builders.PathSelectors.regex; - -import org.springframework.boot.bind.RelaxedPropertyResolver; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.web.context.request.async.DeferredResult; - -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - * swagger配置项 - * - * @description - * @author wanghaobin - * @date 2017年6月20日 - * @since 1.7 - */ -@Configuration -@EnableSwagger2 -public class SwaggerConfiguration extends WebMvcConfigurerAdapter implements EnvironmentAware { - private String basePackage; - private String creatName; - private String serviceName; - private RelaxedPropertyResolver propertyResolver; - private String description; - /** - * 这个地方要重新注入一下资源文件,不然不会注入资源的,也没有注入requestHandlerMappping,相当于xml配置的 - * - * - * - * 不知道为什么,这也是spring boot的一个缺点(菜鸟觉得的) - * @param registry - */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("swagger-ui.html") - .addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars*") - .addResourceLocations("classpath:/META-INF/resources/webjars/"); - } - - - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(this.basePackage)) - .paths(PathSelectors.any()).build(); - } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title(this.serviceName+" Restful APIs") - .description(this.description) - .contact(this.creatName).version("1.0").build(); - } - - @Override - public void setEnvironment(Environment environment) { - this.propertyResolver = new RelaxedPropertyResolver(environment, null); - this.basePackage = propertyResolver.getProperty("swagger.basepackage"); - this.creatName = propertyResolver.getProperty("swagger.service.developer"); - this.serviceName = propertyResolver.getProperty("swagger.service.name"); - this.description = propertyResolver.getProperty("swagger.service.description"); - } -} diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/druid/DruidStatFilter.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/druid/DruidStatFilter.java deleted file mode 100644 index d303a4f5bd91d022957ae1f53bff9a4bd5f8c22e..0000000000000000000000000000000000000000 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/druid/DruidStatFilter.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.wxiaoqi.security.admin.config.druid; - -import com.alibaba.druid.support.http.WebStatFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.annotation.WebInitParam; -import java.io.IOException; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-20 21:34 - */ -@WebFilter(filterName="druidWebStatFilter",urlPatterns="/druid/*", - initParams={ - @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源 - }) -public class DruidStatFilter extends WebStatFilter { - - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - response.setContentType("text/html"); - super.doFilter(request, response, chain); - } -} diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/druid/DruidStatViewServlet.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/druid/DruidStatViewServlet.java deleted file mode 100644 index 577e790fdbe68984acc61ec4dad6f50d419072a2..0000000000000000000000000000000000000000 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/druid/DruidStatViewServlet.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.wxiaoqi.security.admin.config.druid; - -import com.alibaba.druid.support.http.StatViewServlet; - -import javax.servlet.annotation.WebInitParam; -import javax.servlet.annotation.WebServlet; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-20 21:34 - */ -@SuppressWarnings("serial") -@WebServlet(urlPatterns = "/druid/*", - initParams={ -// @WebInitParam(name="allow",value="127.0.0.1,192.168.1.188"),// IP白名单 (没有配置或者为空,则允许所有访问) -// @WebInitParam(name="deny",value="192.168.1.111"),// IP黑名单 (存在共同时,deny优先于allow) -// @WebInitParam(name="loginUsername",value="admin"),// 用户名 -// @WebInitParam(name="loginPassword",value="123456"),// 密码 -// @WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能 - }) -public class DruidStatViewServlet extends StatViewServlet { - - -} diff --git a/ace-admin/src/main/resources/builder/generatorConfig.xml b/ace-admin/src/main/resources/builder/generatorConfig.xml deleted file mode 100644 index 0f7b16cc10b09283c16240dec6f52027983bf804..0000000000000000000000000000000000000000 --- a/ace-admin/src/main/resources/builder/generatorConfig.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
\ No newline at end of file diff --git a/ace-api/src/main/java/com/github/wxiaoqi/security/api/vo/gate/ClientInfo.java b/ace-api/src/main/java/com/github/wxiaoqi/security/api/vo/gate/ClientInfo.java deleted file mode 100644 index 1f292735282aa9c5454789fd4a1745755975c96d..0000000000000000000000000000000000000000 --- a/ace-api/src/main/java/com/github/wxiaoqi/security/api/vo/gate/ClientInfo.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.github.wxiaoqi.security.api.vo.gate; - -import java.io.Serializable; -import java.util.Date; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-07-02 19:11 - */ -public class ClientInfo implements Serializable{ - private Integer id; - - private String code; - - private String secret; - - private String name; - - private boolean isLocked; - - private String description; - - private Date crtTime; - - private String crtUser; - - private String crtName; - - private String crtHost; - - private Date updTime; - - private String updUser; - - private String updName; - - private String updHost; - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getSecret() { - return secret; - } - - public void setSecret(String secret) { - this.secret = secret; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public boolean isLocked() { - return isLocked; - } - - public void setLocked(boolean isLocked) { - this.isLocked = isLocked; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Date getCrtTime() { - return crtTime; - } - - public void setCrtTime(Date crtTime) { - this.crtTime = crtTime; - } - - public String getCrtUser() { - return crtUser; - } - - public void setCrtUser(String crtUser) { - this.crtUser = crtUser; - } - - public String getCrtName() { - return crtName; - } - - public void setCrtName(String crtName) { - this.crtName = crtName; - } - - public String getCrtHost() { - return crtHost; - } - - public void setCrtHost(String crtHost) { - this.crtHost = crtHost; - } - - public Date getUpdTime() { - return updTime; - } - - public void setUpdTime(Date updTime) { - this.updTime = updTime; - } - - public String getUpdUser() { - return updUser; - } - - public void setUpdUser(String updUser) { - this.updUser = updUser; - } - - public String getUpdName() { - return updName; - } - - public void setUpdName(String updName) { - this.updName = updName; - } - - public String getUpdHost() { - return updHost; - } - - public void setUpdHost(String updHost) { - this.updHost = updHost; - } -} diff --git a/ace-auth/ace-auth-client/pom.xml b/ace-auth/ace-auth-client/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e9e0fe86e0c8c950e0e6212722acc1301a87411 --- /dev/null +++ b/ace-auth/ace-auth-client/pom.xml @@ -0,0 +1,44 @@ + + + + ace-auth + com.github.wxiaoqi + 2.0-SNAPSHOT + + 4.0.0 + + ace-auth-client + + + com.github.wxiaoqi + ace-common + 2.0-SNAPSHOT + provided + + + com.github.wxiaoqi + ace-auth-common + 2.0-SNAPSHOT + + + io.github.openfeign + feign-okhttp + + + org.springframework.cloud + spring-cloud-openfeign-core + 2.0.0.M1 + provided + + + org.springframework + spring-webmvc + 5.0.4.RELEASE + provided + + + + + \ No newline at end of file diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/EnableAceAuthClient.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/EnableAceAuthClient.java new file mode 100644 index 0000000000000000000000000000000000000000..f555192dd418aea78da6ac36234cfb8f931f218d --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/EnableAceAuthClient.java @@ -0,0 +1,18 @@ +package com.github.wxiaoqi.security.auth.client; + +import com.github.wxiaoqi.security.auth.client.configuration.AutoConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * Created by ace on 2017/9/15. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Import(AutoConfiguration.class) +@Documented +@Inherited +public @interface EnableAceAuthClient { +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/annotation/IgnoreClientToken.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/annotation/IgnoreClientToken.java new file mode 100644 index 0000000000000000000000000000000000000000..95db1e7ff27305e1ff8b1ea3e8119ef7e55db31f --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/annotation/IgnoreClientToken.java @@ -0,0 +1,15 @@ +package com.github.wxiaoqi.security.auth.client.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 忽略服务鉴权 + * Created by ace on 2017/9/27. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value={ElementType.METHOD,ElementType.TYPE}) +public @interface IgnoreClientToken { +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/annotation/IgnoreUserToken.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/annotation/IgnoreUserToken.java new file mode 100644 index 0000000000000000000000000000000000000000..e1cfabbca65c5abdebfe2c683b236681e5836c1d --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/annotation/IgnoreUserToken.java @@ -0,0 +1,15 @@ +package com.github.wxiaoqi.security.auth.client.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 忽略用户鉴权 + * Created by ace on 2017/9/27. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value={ElementType.METHOD,ElementType.TYPE}) +public @interface IgnoreUserToken { +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/FeignOkHttpConfig.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/FeignOkHttpConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..af08a25a476c9d0fc273884ba14ba9e9b734cb02 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/FeignOkHttpConfig.java @@ -0,0 +1,34 @@ +package com.github.wxiaoqi.security.auth.client.config; + +import com.github.wxiaoqi.security.auth.client.interceptor.OkHttpTokenInterceptor; +import feign.Feign; +import okhttp3.ConnectionPool; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.cloud.openfeign.FeignAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.TimeUnit; + +@AutoConfigureBefore(FeignAutoConfiguration.class) +@Configuration +@ConditionalOnClass(Feign.class) +public class FeignOkHttpConfig { + + @Autowired + OkHttpTokenInterceptor okHttpLoggingInterceptor; + + private int feignOkHttpReadTimeout = 60; + private int feignConnectTimeout = 60; + private int feignWriteTimeout = 120; + + @Bean + public okhttp3.OkHttpClient okHttpClient() { + return new okhttp3.OkHttpClient.Builder().readTimeout(feignOkHttpReadTimeout, TimeUnit.SECONDS).connectTimeout(feignConnectTimeout, TimeUnit.SECONDS) + .writeTimeout(feignWriteTimeout, TimeUnit.SECONDS).connectionPool(new ConnectionPool()) + .addInterceptor(okHttpLoggingInterceptor) + .build(); + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/ServiceAuthConfig.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/ServiceAuthConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..2dac0b572de2bf19b27427e28b55e384eb31a6dc --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/ServiceAuthConfig.java @@ -0,0 +1,57 @@ +package com.github.wxiaoqi.security.auth.client.config; + +import org.springframework.beans.factory.annotation.Value; + +import javax.servlet.http.HttpServletRequest; + +/** + * Created by ace on 2017/9/15. + */ + +public class ServiceAuthConfig { + private byte[] pubKeyByte; + @Value("${auth.client.id:null}") + private String clientId; + @Value("${auth.client.secret}") + private String clientSecret; + @Value("${auth.client.token-header}") + private String tokenHeader; + @Value("${spring.application.name}") + private String applicationName; + + public String getTokenHeader() { + return tokenHeader; + } + + public void setTokenHeader(String tokenHeader) { + this.tokenHeader = tokenHeader; + } + + public String getClientId() { + return "null".equals(clientId)?applicationName:clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public String getToken(HttpServletRequest request){ + return request.getHeader(this.getTokenHeader()); + } + + public byte[] getPubKeyByte() { + return pubKeyByte; + } + + public void setPubKeyByte(byte[] pubKeyByte) { + this.pubKeyByte = pubKeyByte; + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/UserAuthConfig.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/UserAuthConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..09c52ccaba59950aa604b966c0a598786a71ced6 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/config/UserAuthConfig.java @@ -0,0 +1,36 @@ +package com.github.wxiaoqi.security.auth.client.config; + +import org.springframework.beans.factory.annotation.Value; + +import javax.servlet.http.HttpServletRequest; + +/** + * Created by ace on 2017/9/15. + */ +public class UserAuthConfig { + + @Value("${auth.user.token-header}") + private String tokenHeader; + + private byte[] pubKeyByte; + + public String getTokenHeader() { + return tokenHeader; + } + + public void setTokenHeader(String tokenHeader) { + this.tokenHeader = tokenHeader; + } + + public String getToken(HttpServletRequest request){ + return request.getHeader(this.getTokenHeader()); + } + + public byte[] getPubKeyByte() { + return pubKeyByte; + } + + public void setPubKeyByte(byte[] pubKeyByte) { + this.pubKeyByte = pubKeyByte; + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/configuration/AutoConfiguration.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/configuration/AutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..87d491ff18f3a594e6c858b9514a70f0790637a6 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/configuration/AutoConfiguration.java @@ -0,0 +1,27 @@ +package com.github.wxiaoqi.security.auth.client.configuration; + +import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * Created by ace on 2017/9/15. + */ +@Configuration +@ComponentScan({"com.github.wxiaoqi.security.auth.client","com.github.wxiaoqi.security.auth.common.event"}) +@RemoteApplicationEventScan(basePackages = "com.github.wxiaoqi.security.auth.common.event") +public class AutoConfiguration { + @Bean + ServiceAuthConfig getServiceAuthConfig(){ + return new ServiceAuthConfig(); + } + + @Bean + UserAuthConfig getUserAuthConfig(){ + return new UserAuthConfig(); + } + +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtIllegalArgumentException.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtIllegalArgumentException.java new file mode 100644 index 0000000000000000000000000000000000000000..b6f244ebb7b2d28c043c71580e30d4ea3f7bbd98 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtIllegalArgumentException.java @@ -0,0 +1,10 @@ +package com.github.wxiaoqi.security.auth.client.exception; + +/** + * Created by ace on 2017/9/15. + */ +public class JwtIllegalArgumentException extends Exception { + public JwtIllegalArgumentException(String s) { + super(s); + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtSignatureException.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtSignatureException.java new file mode 100644 index 0000000000000000000000000000000000000000..90e441ca2c762547dfa8cd4130f968bf16086577 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtSignatureException.java @@ -0,0 +1,12 @@ +package com.github.wxiaoqi.security.auth.client.exception; + +/** + * + * @author ace + * @date 2017/9/15 + */ +public class JwtSignatureException extends Exception { + public JwtSignatureException(String s) { + super(s); + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtTokenExpiredException.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtTokenExpiredException.java new file mode 100644 index 0000000000000000000000000000000000000000..c3bfc463930655660878ebb83d10931eb4a4d637 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/exception/JwtTokenExpiredException.java @@ -0,0 +1,10 @@ +package com.github.wxiaoqi.security.auth.client.exception; + +/** + * Created by ace on 2017/9/15. + */ +public class JwtTokenExpiredException extends Exception { + public JwtTokenExpiredException(String s) { + super(s); + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/feign/ServiceAuthFeign.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/feign/ServiceAuthFeign.java new file mode 100644 index 0000000000000000000000000000000000000000..75cb894b97b68ee77011be2d4b4022c000c17959 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/feign/ServiceAuthFeign.java @@ -0,0 +1,25 @@ +package com.github.wxiaoqi.security.auth.client.feign; + +import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * Created by ace on 2017/9/15. + */ +@FeignClient(value = "${auth.serviceId}",configuration = {}) +public interface ServiceAuthFeign { + @RequestMapping(value = "/client/myClient") + public ObjectRestResponse> getAllowedClient(@RequestParam("serviceId") String serviceId, @RequestParam("secret") String secret); + @RequestMapping(value = "/client/token",method = RequestMethod.POST) + public ObjectRestResponse getAccessToken(@RequestParam("clientId") String clientId, @RequestParam("secret") String secret); + @RequestMapping(value = "/client/servicePubKey",method = RequestMethod.POST) + public ObjectRestResponse getServicePublicKey(@RequestParam("clientId") String clientId, @RequestParam("secret") String secret); + @RequestMapping(value = "/client/userPubKey",method = RequestMethod.POST) + public ObjectRestResponse getUserPublicKey(@RequestParam("clientId") String clientId, @RequestParam("secret") String secret); + +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/OkHttpTokenInterceptor.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/OkHttpTokenInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..f66ad77e4b69ee08078aee248e9d2e791c25f3be --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/OkHttpTokenInterceptor.java @@ -0,0 +1,67 @@ +package com.github.wxiaoqi.security.auth.client.interceptor; + +import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.client.jwt.ServiceAuthUtil; +import com.github.wxiaoqi.security.common.constant.CommonConstants; +import com.github.wxiaoqi.security.common.context.BaseContextHandler; +import lombok.extern.java.Log; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; + +import java.io.IOException; + + +/** + * @author ace + */ +@Component +@Log +public class OkHttpTokenInterceptor implements Interceptor { + @Autowired + @Lazy + private ServiceAuthUtil serviceAuthUtil; + @Autowired + @Lazy + private ServiceAuthConfig serviceAuthConfig; + @Autowired + @Lazy + private UserAuthConfig userAuthConfig; + + + @Override + public Response intercept(Chain chain) throws IOException { + Request newRequest = null; + if (chain.request().url().toString().contains("client/token")) { + newRequest = chain.request() + .newBuilder() + .header(userAuthConfig.getTokenHeader(), BaseContextHandler.getToken()) + .build(); + } else { + newRequest = chain.request() + .newBuilder() + .header(userAuthConfig.getTokenHeader(), BaseContextHandler.getToken()) + .header(serviceAuthConfig.getTokenHeader(), serviceAuthUtil.getClientToken()) + .build(); + } + Response response = chain.proceed(newRequest); + if (HttpStatus.FORBIDDEN.value() == response.code()) { + if (response.body().string().contains(String.valueOf(CommonConstants.EX_CLIENT_INVALID_CODE))) { + log.info("Client Token Expire,Retry to request..."); + serviceAuthUtil.refreshClientToken(); + newRequest = chain.request() + .newBuilder() + .header(userAuthConfig.getTokenHeader(), BaseContextHandler.getToken()) + .header(serviceAuthConfig.getTokenHeader(), serviceAuthUtil.getClientToken()) + .build(); + response = chain.proceed(newRequest); + } + } + return response; + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/ServiceAuthRestInterceptor.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/ServiceAuthRestInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..aab22d5c9aa243112470d567ab4365ee79fe2845 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/ServiceAuthRestInterceptor.java @@ -0,0 +1,55 @@ +package com.github.wxiaoqi.security.auth.client.interceptor; + +import com.github.wxiaoqi.security.auth.client.annotation.IgnoreClientToken; +import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; +import com.github.wxiaoqi.security.auth.client.jwt.ServiceAuthUtil; +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.common.exception.auth.ClientForbiddenException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * Created by ace on 2017/9/12. + */ +@SuppressWarnings("ALL") +public class ServiceAuthRestInterceptor extends HandlerInterceptorAdapter { + private Logger logger = LoggerFactory.getLogger(ServiceAuthRestInterceptor.class); + + @Autowired + private ServiceAuthUtil serviceAuthUtil; + + @Autowired + private ServiceAuthConfig serviceAuthConfig; + + private List allowedClient; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + HandlerMethod handlerMethod = (HandlerMethod) handler; + // 配置该注解,说明不进行服务拦截 + IgnoreClientToken annotation = handlerMethod.getBeanType().getAnnotation(IgnoreClientToken.class); + if (annotation == null) { + annotation = handlerMethod.getMethodAnnotation(IgnoreClientToken.class); + } + if(annotation!=null) { + return super.preHandle(request, response, handler); + } + + String token = request.getHeader(serviceAuthConfig.getTokenHeader()); + IJWTInfo infoFromToken = serviceAuthUtil.getInfoFromToken(token); + String uniqueName = infoFromToken.getUniqueName(); + for(String client:serviceAuthUtil.getAllowedClient()){ + if(client.equals(uniqueName)){ + return super.preHandle(request, response, handler); + } + } + throw new ClientForbiddenException("Client is Forbidden!"); + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/UserAuthRestInterceptor.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/UserAuthRestInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..581f09a36c12275a7948ccbb1d13b3cf8c82c99e --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/UserAuthRestInterceptor.java @@ -0,0 +1,64 @@ +package com.github.wxiaoqi.security.auth.client.interceptor; + +import com.github.wxiaoqi.security.auth.client.annotation.IgnoreUserToken; +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil; +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.common.context.BaseContextHandler; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created by ace on 2017/9/10. + */ +public class UserAuthRestInterceptor extends HandlerInterceptorAdapter { + private Logger logger = LoggerFactory.getLogger(UserAuthRestInterceptor.class); + + @Autowired + private UserAuthUtil userAuthUtil; + + @Autowired + private UserAuthConfig userAuthConfig; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + HandlerMethod handlerMethod = (HandlerMethod) handler; + // 配置该注解,说明不进行用户拦截 + IgnoreUserToken annotation = handlerMethod.getBeanType().getAnnotation(IgnoreUserToken.class); + if (annotation == null) { + annotation = handlerMethod.getMethodAnnotation(IgnoreUserToken.class); + } + if (annotation != null) { + return super.preHandle(request, response, handler); + } + String token = request.getHeader(userAuthConfig.getTokenHeader()); + if (StringUtils.isEmpty(token)) { + if (request.getCookies() != null) { + for (Cookie cookie : request.getCookies()) { + if (cookie.getName().equals(userAuthConfig.getTokenHeader())) { + token = cookie.getValue(); + } + } + } + } + IJWTInfo infoFromToken = userAuthUtil.getInfoFromToken(token); + BaseContextHandler.setUsername(infoFromToken.getUniqueName()); + BaseContextHandler.setName(infoFromToken.getName()); + BaseContextHandler.setUserID(infoFromToken.getId()); + return super.preHandle(request, response, handler); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + BaseContextHandler.remove(); + super.afterCompletion(request, response, handler, ex); + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/jwt/ServiceAuthUtil.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/jwt/ServiceAuthUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..22683a64a4d7a99dd07d75c21f4a5b22d7699478 --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/jwt/ServiceAuthUtil.java @@ -0,0 +1,85 @@ + +package com.github.wxiaoqi.security.auth.client.jwt; + +import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; +import com.github.wxiaoqi.security.auth.client.feign.ServiceAuthFeign; +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.auth.common.util.jwt.JWTHelper; +import com.github.wxiaoqi.security.common.exception.auth.ClientTokenException; +import com.github.wxiaoqi.security.common.msg.BaseResponse; +import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.SignatureException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; + +import java.util.List; + +/** + * Created by ace on 2017/9/15. + */ +@Configuration +@Slf4j +@EnableScheduling +public class ServiceAuthUtil{ + @Autowired + private ServiceAuthConfig serviceAuthConfig; + + @Autowired + private ServiceAuthFeign serviceAuthFeign; + + private List allowedClient; + private String clientToken; + + + public IJWTInfo getInfoFromToken(String token) throws Exception { + try { + return JWTHelper.getInfoFromToken(token, serviceAuthConfig.getPubKeyByte()); + } catch (ExpiredJwtException ex) { + throw new ClientTokenException("Client token expired!"); + } catch (SignatureException ex) { + throw new ClientTokenException("Client token signature error!"); + } catch (IllegalArgumentException ex) { + throw new ClientTokenException("Client token is null or empty!"); + } + } + + @Scheduled(cron = "0/30 * * * * ?") + public void refreshAllowedClient() { + log.debug("refresh allowedClient....."); + BaseResponse resp = serviceAuthFeign.getAllowedClient(serviceAuthConfig.getClientId(), serviceAuthConfig.getClientSecret()); + if (resp.getStatus() == 200) { + ObjectRestResponse> allowedClient = (ObjectRestResponse>) resp; + this.allowedClient = allowedClient.getData(); + } + } + + @Scheduled(cron = "0 0/10 * * * ?") + public void refreshClientToken() { + log.debug("refresh client token....."); + BaseResponse resp = serviceAuthFeign.getAccessToken(serviceAuthConfig.getClientId(), serviceAuthConfig.getClientSecret()); + if (resp.getStatus() == 200) { + ObjectRestResponse clientToken = (ObjectRestResponse) resp; + this.clientToken = clientToken.getData(); + } + } + + + public String getClientToken() { + if (this.clientToken == null) { + this.refreshClientToken(); + } + return clientToken; + } + + public List getAllowedClient() { + if (this.allowedClient == null) { + this.refreshAllowedClient(); + } + return allowedClient; + } +} \ No newline at end of file diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/jwt/UserAuthUtil.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/jwt/UserAuthUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..7212b5ea895fd9497fc8b72fcc8c2a6f37ee587d --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/jwt/UserAuthUtil.java @@ -0,0 +1,30 @@ +package com.github.wxiaoqi.security.auth.client.jwt; + +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.auth.common.util.jwt.JWTHelper; +import com.github.wxiaoqi.security.common.exception.auth.UserTokenException; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.SignatureException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; + +/** + * Created by ace on 2017/9/15. + */ +@Configuration +public class UserAuthUtil { + @Autowired + private UserAuthConfig userAuthConfig; + public IJWTInfo getInfoFromToken(String token) throws Exception { + try { + return JWTHelper.getInfoFromToken(token, userAuthConfig.getPubKeyByte()); + }catch (ExpiredJwtException ex){ + throw new UserTokenException("User token expired!"); + }catch (SignatureException ex){ + throw new UserTokenException("User token signature error!"); + }catch (IllegalArgumentException ex){ + throw new UserTokenException("User token is null or empty!"); + } + } +} diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/runner/AuthClientRunner.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/runner/AuthClientRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..730be67a49dbdab103bfe5abbe947af60ba8d51e --- /dev/null +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/runner/AuthClientRunner.java @@ -0,0 +1,64 @@ +package com.github.wxiaoqi.security.auth.client.runner; + +import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.client.feign.ServiceAuthFeign; +import com.github.wxiaoqi.security.common.msg.BaseResponse; +import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpStatus; +import org.springframework.scheduling.annotation.Scheduled; + +/** + * 监听完成时触发 + * + * @author ace + * @create 2017/11/29. + */ +@Configuration +@Slf4j +public class AuthClientRunner implements CommandLineRunner { + + @Autowired + private ServiceAuthConfig serviceAuthConfig; + @Autowired + private UserAuthConfig userAuthConfig; + @Autowired + private ServiceAuthFeign serviceAuthFeign; + + @Override + public void run(String... args) throws Exception { + log.info("初始化加载用户pubKey"); + try { + refreshUserPubKey(); + }catch(Exception e){ + log.error("初始化加载用户pubKey失败,1分钟后自动重试!",e); + } + log.info("初始化加载客户pubKey"); + try { + refreshServicePubKey(); + }catch(Exception e){ + log.error("初始化加载客户pubKey失败,1分钟后自动重试!",e); + } + } + @Scheduled(cron = "0 0/1 * * * ?") + public void refreshUserPubKey(){ + BaseResponse resp = serviceAuthFeign.getUserPublicKey(serviceAuthConfig.getClientId(), serviceAuthConfig.getClientSecret()); + if (resp.getStatus() == HttpStatus.OK.value()) { + ObjectRestResponse userResponse = (ObjectRestResponse) resp; + this.userAuthConfig.setPubKeyByte(userResponse.getData()); + } + } + @Scheduled(cron = "0 0/1 * * * ?") + public void refreshServicePubKey(){ + BaseResponse resp = serviceAuthFeign.getServicePublicKey(serviceAuthConfig.getClientId(), serviceAuthConfig.getClientSecret()); + if (resp.getStatus() == HttpStatus.OK.value()) { + ObjectRestResponse userResponse = (ObjectRestResponse) resp; + this.serviceAuthConfig.setPubKeyByte(userResponse.getData()); + } + } + +} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/pom.xml b/ace-auth/ace-auth-common/pom.xml similarity index 41% rename from ace-blog-parent/ace-blog-ui/pom.xml rename to ace-auth/ace-auth-common/pom.xml index d1d2a0d438b23150a0d5fd4107ea4301166ebdef..be760010c4d05c98532589f05545b6b9d27e8887 100644 --- a/ace-blog-parent/ace-blog-ui/pom.xml +++ b/ace-auth/ace-auth-common/pom.xml @@ -3,31 +3,29 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - ace-blog-parent - org.springframework.boot - 1.4.2.RELEASE + ace-auth + com.github.wxiaoqi + 2.0-SNAPSHOT 4.0.0 - ace-blog-ui - + ace-auth-common - org.springframework.boot - spring-boot-starter-undertow - - - org.springframework.boot - spring-boot-starter-actuator + io.jsonwebtoken + jjwt + 0.7.0 - org.springframework.boot - spring-boot-starter-thymeleaf + joda-time + joda-time + 2.9.5 - net.sourceforge.nekohtml - nekohtml - 1.9.22 + org.springframework.cloud + spring-cloud-starter-bus-amqp + + \ No newline at end of file diff --git a/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/constatns/CommonConstants.java b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/constatns/CommonConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..2550a71f12911fff2bff892b3b1ccd506c5a35ab --- /dev/null +++ b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/constatns/CommonConstants.java @@ -0,0 +1,22 @@ +package com.github.wxiaoqi.security.auth.common.constatns; + +/** + * Created by ace on 2017/8/29. + */ +public class CommonConstants { + public final static String RESOURCE_TYPE_MENU = "menu"; + public final static String RESOURCE_TYPE_BTN = "button"; + public static final Integer EX_TOKEN_ERROR_CODE = 40101; + // 用户token异常 + public static final Integer EX_USER_INVALID_CODE = 40102; + // 客户端token异常 + public static final Integer EX_CLIENT_INVALID_CODE = 40131; + public static final Integer EX_CLIENT_FORBIDDEN_CODE = 40331; + public static final Integer EX_OTHER_CODE = 500; + public static final String CONTEXT_KEY_USER_ID = "currentUserId"; + public static final String CONTEXT_KEY_USERNAME = "currentUserName"; + public static final String CONTEXT_KEY_USER_NAME = "currentUser"; + public static final String CONTEXT_KEY_USER_TOKEN = "currentUserToken"; + public static final String JWT_KEY_USER_ID = "userId"; + public static final String JWT_KEY_NAME = "name"; +} diff --git a/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/StringHelper.java b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/StringHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..db7e9a7657e26d5beec0d2f6a7f57c43ab85a326 --- /dev/null +++ b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/StringHelper.java @@ -0,0 +1,10 @@ +package com.github.wxiaoqi.security.auth.common.util; + +/** + * Created by ace on 2017/9/10. + */ +public class StringHelper { + public static String getObjectValue(Object obj){ + return obj==null?"":obj.toString(); + } +} diff --git a/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/IJWTInfo.java b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/IJWTInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..8ff2ab9d20d7bd3898a1025ab8242b8659c7c070 --- /dev/null +++ b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/IJWTInfo.java @@ -0,0 +1,24 @@ +package com.github.wxiaoqi.security.auth.common.util.jwt; + +/** + * Created by ace on 2017/9/10. + */ +public interface IJWTInfo { + /** + * 获取用户名 + * @return + */ + String getUniqueName(); + + /** + * 获取用户ID + * @return + */ + String getId(); + + /** + * 获取名称 + * @return + */ + String getName(); +} diff --git a/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/JWTHelper.java b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/JWTHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..0f11e21e349b7a570a753795505f5f5c0acc1423 --- /dev/null +++ b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/JWTHelper.java @@ -0,0 +1,104 @@ +package com.github.wxiaoqi.security.auth.common.util.jwt; + +import com.github.wxiaoqi.security.auth.common.constatns.CommonConstants; +import com.github.wxiaoqi.security.auth.common.util.StringHelper; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.joda.time.DateTime; + +/** + * Created by ace on 2017/9/10. + */ +public class JWTHelper { + private static RsaKeyHelper rsaKeyHelper = new RsaKeyHelper(); + /** + * 密钥加密token + * + * @param jwtInfo + * @param priKeyPath + * @param expire + * @return + * @throws Exception + */ + public static String generateToken(IJWTInfo jwtInfo, String priKeyPath, int expire) throws Exception { + String compactJws = Jwts.builder() + .setSubject(jwtInfo.getUniqueName()) + .claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId()) + .claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName()) + .setExpiration(DateTime.now().plusSeconds(expire).toDate()) + .signWith(SignatureAlgorithm.RS256, rsaKeyHelper.getPrivateKey(priKeyPath)) + .compact(); + return compactJws; + } + + /** + * 密钥加密token + * + * @param jwtInfo + * @param priKey + * @param expire + * @return + * @throws Exception + */ + public static String generateToken(IJWTInfo jwtInfo, byte priKey[], int expire) throws Exception { + String compactJws = Jwts.builder() + .setSubject(jwtInfo.getUniqueName()) + .claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId()) + .claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName()) + .setExpiration(DateTime.now().plusSeconds(expire).toDate()) + .signWith(SignatureAlgorithm.RS256, rsaKeyHelper.getPrivateKey(priKey)) + .compact(); + return compactJws; + } + + /** + * 公钥解析token + * + * @param token + * @return + * @throws Exception + */ + public static Jws parserToken(String token, String pubKeyPath) throws Exception { + Jws claimsJws = Jwts.parser().setSigningKey(rsaKeyHelper.getPublicKey(pubKeyPath)).parseClaimsJws(token); + return claimsJws; + } + /** + * 公钥解析token + * + * @param token + * @return + * @throws Exception + */ + public static Jws parserToken(String token, byte[] pubKey) throws Exception { + Jws claimsJws = Jwts.parser().setSigningKey(rsaKeyHelper.getPublicKey(pubKey)).parseClaimsJws(token); + return claimsJws; + } + /** + * 获取token中的用户信息 + * + * @param token + * @param pubKeyPath + * @return + * @throws Exception + */ + public static IJWTInfo getInfoFromToken(String token, String pubKeyPath) throws Exception { + Jws claimsJws = parserToken(token, pubKeyPath); + Claims body = claimsJws.getBody(); + return new JWTInfo(body.getSubject(), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME))); + } + /** + * 获取token中的用户信息 + * + * @param token + * @param pubKey + * @return + * @throws Exception + */ + public static IJWTInfo getInfoFromToken(String token, byte[] pubKey) throws Exception { + Jws claimsJws = parserToken(token, pubKey); + Claims body = claimsJws.getBody(); + return new JWTInfo(body.getSubject(), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME))); + } +} diff --git a/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/JWTInfo.java b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/JWTInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..ad55f8e65a2e5e01f2d92e70ec0125d9ed3967ac --- /dev/null +++ b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/JWTInfo.java @@ -0,0 +1,70 @@ +package com.github.wxiaoqi.security.auth.common.util.jwt; + +import java.io.Serializable; + +/** + * Created by ace on 2017/9/10. + */ +public class JWTInfo implements Serializable,IJWTInfo { + private String username; + private String userId; + private String name; + + public JWTInfo(String username, String userId, String name) { + this.username = username; + this.userId = userId; + this.name = name; + } + + @Override + public String getUniqueName() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String getId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + JWTInfo jwtInfo = (JWTInfo) o; + + if (username != null ? !username.equals(jwtInfo.username) : jwtInfo.username != null) { + return false; + } + return userId != null ? userId.equals(jwtInfo.userId) : jwtInfo.userId == null; + + } + + @Override + public int hashCode() { + int result = username != null ? username.hashCode() : 0; + result = 31 * result + (userId != null ? userId.hashCode() : 0); + return result; + } +} diff --git a/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/RsaKeyHelper.java b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/RsaKeyHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..2a8c58270d390af7aa7be3c4dee5e597925dc769 --- /dev/null +++ b/ace-auth/ace-auth-common/src/main/java/com/github/wxiaoqi/security/auth/common/util/jwt/RsaKeyHelper.java @@ -0,0 +1,166 @@ +package com.github.wxiaoqi.security.auth.common.util.jwt; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import java.io.DataInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by ace on 2017/9/10. + */ +public class RsaKeyHelper { + /** + * 获取公钥 + * + * @param filename + * @return + * @throws Exception + */ + public PublicKey getPublicKey(String filename) throws Exception { + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(filename); + DataInputStream dis = new DataInputStream(resourceAsStream); + byte[] keyBytes = new byte[resourceAsStream.available()]; + dis.readFully(keyBytes); + dis.close(); + X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePublic(spec); + } + + /** + * 获取密钥 + * + * @param filename + * @return + * @throws Exception + */ + public PrivateKey getPrivateKey(String filename) throws Exception { + InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(filename); + DataInputStream dis = new DataInputStream(resourceAsStream); + byte[] keyBytes = new byte[resourceAsStream.available()]; + dis.readFully(keyBytes); + dis.close(); + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePrivate(spec); + } + + /** + * 获取公钥 + * + * @param publicKey + * @return + * @throws Exception + */ + public PublicKey getPublicKey(byte[] publicKey) throws Exception { + X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKey); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePublic(spec); + } + + /** + * 获取密钥 + * + * @param privateKey + * @return + * @throws Exception + */ + public PrivateKey getPrivateKey(byte[] privateKey) throws Exception { + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKey); + KeyFactory kf = KeyFactory.getInstance("RSA"); + return kf.generatePrivate(spec); + } + + /** + * 生存rsa公钥和密钥 + * + * @param publicKeyFilename + * @param privateKeyFilename + * @param password + * @throws IOException + * @throws NoSuchAlgorithmException + */ + public void generateKey(String publicKeyFilename, String privateKeyFilename, String password) throws IOException, NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + SecureRandom secureRandom = new SecureRandom(password.getBytes()); + keyPairGenerator.initialize(1024, secureRandom); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + byte[] publicKeyBytes = keyPair.getPublic().getEncoded(); + FileOutputStream fos = new FileOutputStream(publicKeyFilename); + fos.write(publicKeyBytes); + fos.close(); + byte[] privateKeyBytes = keyPair.getPrivate().getEncoded(); + fos = new FileOutputStream(privateKeyFilename); + fos.write(privateKeyBytes); + fos.close(); + } + + /** + * 生存rsa公钥 + * + * @param password + * @throws IOException + * @throws NoSuchAlgorithmException + */ + public static byte[] generatePublicKey(String password) throws IOException, NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + SecureRandom secureRandom = new SecureRandom(password.getBytes()); + keyPairGenerator.initialize(1024, secureRandom); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + return keyPair.getPublic().getEncoded(); + } + + /** + * 生存rsa公钥 + * + * @param password + * @throws IOException + * @throws NoSuchAlgorithmException + */ + public static byte[] generatePrivateKey(String password) throws IOException, NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + SecureRandom secureRandom = new SecureRandom(password.getBytes()); + keyPairGenerator.initialize(1024, secureRandom); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + return keyPair.getPrivate().getEncoded(); + } + + public static Map generateKey(String password) throws IOException, NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + SecureRandom secureRandom = new SecureRandom(password.getBytes()); + keyPairGenerator.initialize(1024, secureRandom); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + byte[] publicKeyBytes = keyPair.getPublic().getEncoded(); + byte[] privateKeyBytes = keyPair.getPrivate().getEncoded(); + Map map = new HashMap(); + map.put("pub", publicKeyBytes); + map.put("pri", privateKeyBytes); + return map; + } + + public static String toHexString(byte[] b) { + return (new BASE64Encoder()).encodeBuffer(b); + } + + public static final byte[] toBytes(String s) throws IOException { + return (new BASE64Decoder()).decodeBuffer(s); + } + + public static void main(String[] args) throws NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); + SecureRandom secureRandom = new SecureRandom("123".getBytes()); + keyPairGenerator.initialize(1024, secureRandom); + KeyPair keyPair = keyPairGenerator.genKeyPair(); + System.out.println(keyPair.getPublic().getEncoded()); + } + +} + diff --git a/ace-blog-parent/ace-blog-admin/pom.xml b/ace-auth/ace-auth-server/pom.xml similarity index 37% rename from ace-blog-parent/ace-blog-admin/pom.xml rename to ace-auth/ace-auth-server/pom.xml index d1a712041f685face951e53e7706735de2d4baf8..74814f846fb0a80a66a95df7f7f3499455683f9e 100644 --- a/ace-blog-parent/ace-blog-admin/pom.xml +++ b/ace-auth/ace-auth-server/pom.xml @@ -3,186 +3,174 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - ace-blog-parent - org.springframework.boot - 1.4.2.RELEASE + ace-auth + com.github.wxiaoqi + 2.0-SNAPSHOT 4.0.0 - ace-blog-admin - - 1.5.12 - - - ${basedir}/src/main/java - com.github.wxiaoqi.blog.admin.mapper - com.github.wxiaoqi.blog.admin.entity - - ${basedir}/src/main/resources - mapper - - 3.4.0 - 3.3.1 - 1.2.4 - 4.1.1 - + + ace-auth-server + - com.github.wxiaoqi - ace-common - 1.0-SNAPSHOT + org.springframework.boot + spring-boot-starter-undertow + org.springframework.boot - spring-boot-starter-jdbc + spring-boot-starter-web + org.springframework.boot - spring-boot-starter-undertow + spring-boot-starter-actuator + org.springframework.cloud - spring-cloud-starter-feign + spring-cloud-starter-openfeign - + org.springframework.cloud - spring-cloud-starter-eureka + spring-cloud-starter-netflix-eureka-client + + + + + + org.springframework.cloud - spring-cloud-starter-hystrix + spring-cloud-sleuth-zipkin + - de.codecentric - spring-boot-admin-starter-client - 1.3.2 + org.springframework.amqp + spring-rabbit - + org.springframework.boot - spring-boot-starter-test - test + spring-boot-starter-data-redis + + org.springframework.boot - spring-boot-starter-actuator - - - com.github.wxiaoqi - ace-api - 1.0-SNAPSHOT - - - - com.alibaba - druid - 1.0.11 + spring-boot-starter-jdbc + mysql mysql-connector-java - 5.1.30 - - - - org.mybatis - mybatis - ${mybatis.version} - + - org.mybatis - mybatis-spring - ${mybatis.spring.version} + com.alibaba + druid-spring-boot-starter + 1.1.0 - + - org.mybatis.generator - mybatis-generator-core - 1.3.2 - compile - true + tk.mybatis + mapper-spring-boot-starter + 1.1.2 - com.github.pagehelper - pagehelper - ${pagehelper.version} + pagehelper-spring-boot-starter + 1.2.3 - - - tk.mybatis - mapper - ${mapper.version} - + - org.apache.commons - commons-lang3 - 3.4 + com.alibaba + druid - + + com.alibaba fastjson - 1.2.33 + + + joda-time + joda-time + + + - io.springfox - springfox-swagger2 - 2.6.1 + com.github.wxiaoqi + ace-interface + 2.0-SNAPSHOT - io.springfox - springfox-swagger-ui - 2.6.1 + com.github.wxiaoqi + ace-common + 2.0-SNAPSHOT + - javax.servlet - javax.servlet-api - 3.1.0 + com.github.wxiaoqi + ace-auth-common + 2.0-SNAPSHOT + - com.google.guava - guava - 20.0 + com.github.wxiaoqi + ace-auth-common + 2.0-SNAPSHOT + + - blog-admin + ace-auth - - - org.mybatis.generator - mybatis-generator-maven-plugin - 1.3.2 - - ${basedir}/src/main/resources/builder/generatorConfig.xml - true - true - - - - mysql - mysql-connector-java - 5.1.30 - runtime - - - tk.mybatis - mapper - ${mapper.version} - - - org.springframework.boot spring-boot-maven-plugin + + + + + + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + \ No newline at end of file diff --git a/ace-auth/ace-auth-server/src/db/init.sql b/ace-auth/ace-auth-server/src/db/init.sql new file mode 100644 index 0000000000000000000000000000000000000000..490ad8c7bff463f937521f9f505dea6d74e73700 --- /dev/null +++ b/ace-auth/ace-auth-server/src/db/init.sql @@ -0,0 +1,91 @@ + +CREATE DATABASE ag_auth_v1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +Use ag_auth_v1; +/* + Navicat Premium Data Transfer + + Source Server : ag-admin + Source Server Type : MySQL + Source Server Version : 50718 + Source Host : localhost + Source Database : ag_auth + + Target Server Type : MySQL + Target Server Version : 50718 + File Encoding : utf-8 + + Date: 01/03/2018 19:13:21 PM +*/ + +SET NAMES utf8; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for `auth_client` +-- ---------------------------- +DROP TABLE IF EXISTS `auth_client`; +CREATE TABLE `auth_client` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `code` varchar(255) DEFAULT NULL COMMENT '服务编码', + `secret` varchar(255) DEFAULT NULL COMMENT '服务密钥', + `name` varchar(255) DEFAULT NULL COMMENT '服务名', + `locked` char(1) DEFAULT NULL COMMENT '是否锁定', + `description` varchar(255) DEFAULT NULL COMMENT '描述', + `crt_time` datetime DEFAULT NULL COMMENT '创建时间', + `crt_user` varchar(255) DEFAULT NULL COMMENT '创建人', + `crt_name` varchar(255) DEFAULT NULL COMMENT '创建人姓名', + `crt_host` varchar(255) DEFAULT NULL COMMENT '创建主机', + `upd_time` datetime DEFAULT NULL COMMENT '更新时间', + `upd_user` varchar(255) DEFAULT NULL COMMENT '更新人', + `upd_name` varchar(255) DEFAULT NULL COMMENT '更新姓名', + `upd_host` varchar(255) DEFAULT NULL COMMENT '更新主机', + `attr1` varchar(255) DEFAULT NULL, + `attr2` varchar(255) DEFAULT NULL, + `attr3` varchar(255) DEFAULT NULL, + `attr4` varchar(255) DEFAULT NULL, + `attr5` varchar(255) DEFAULT NULL, + `attr6` varchar(255) DEFAULT NULL, + `attr7` varchar(255) DEFAULT NULL, + `attr8` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of `auth_client` +-- ---------------------------- +BEGIN; +INSERT INTO `auth_client` VALUES ('1', 'ace-gate', '123456', 'ace-gate', '0', '', null, '', '', '', '2017-07-07 21:51:32', '1', '管理员', '0:0:0:0:0:0:0:1', '', '', '', '', '', '', '', ''), ('3', 'ace-admin', '123456', 'ace-admin', '0', '', null, null, null, null, '2017-07-06 21:42:17', '1', '管理员', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null), ('6', 'ace-auth', '123456', 'ace-auth', '0', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('11', 'ace-config', 'fXHsssa2', 'ace-config', '0', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('12', 'ace-demo-mybatis', 'bZf8yvj9', 'ace-demo-mybatis', '0', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null), ('13', 'ace-template', 'bZf8yvj8', 'ace-template', '0', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); +COMMIT; + +-- ---------------------------- +-- Table structure for `auth_client_service` +-- ---------------------------- +DROP TABLE IF EXISTS `auth_client_service`; +CREATE TABLE `auth_client_service` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `service_id` varchar(255) DEFAULT NULL, + `client_id` varchar(255) DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `crt_time` datetime DEFAULT NULL, + `crt_user` varchar(255) DEFAULT NULL, + `crt_name` varchar(255) DEFAULT NULL, + `crt_host` varchar(255) DEFAULT NULL, + `attr1` varchar(255) DEFAULT NULL, + `attr2` varchar(255) DEFAULT NULL, + `attr3` varchar(255) DEFAULT NULL, + `attr4` varchar(255) DEFAULT NULL, + `attr5` varchar(255) DEFAULT NULL, + `attr6` varchar(255) DEFAULT NULL, + `attr7` varchar(255) DEFAULT NULL, + `attr8` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4; + +-- ---------------------------- +-- Records of `auth_client_service` +-- ---------------------------- +BEGIN; +INSERT INTO `auth_client_service` VALUES ('21', '4', '5', null, null, null, null, null, null, null, null, null, null, null, null, null), ('23', '3', '6', null, null, null, null, null, null, null, null, null, null, null, null, null), ('41', '3', '1', null, '2017-12-31 08:58:03', 'null', 'null', 'null', null, null, null, null, null, null, null, null), ('42', '6', '1', null, '2017-12-31 08:58:03', 'null', 'null', 'null', null, null, null, null, null, null, null, null); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/ace-gate/src/main/docker/Dockerfile b/ace-auth/ace-auth-server/src/main/docker/Dockerfile similarity index 85% rename from ace-gate/src/main/docker/Dockerfile rename to ace-auth/ace-auth-server/src/main/docker/Dockerfile index 99c28b7271114903c15ef2c506da4464898e3b32..05c55fa0a57de31484fbf305d7df72c6031084c3 100644 --- a/ace-gate/src/main/docker/Dockerfile +++ b/ace-auth/ace-auth-server/src/main/docker/Dockerfile @@ -1,5 +1,5 @@ FROM livingobjects/jre8 VOLUME /tmp -ADD ace-gate.jar app.jar +ADD ace-auth.jar app.jar RUN bash -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/AuthBootstrap.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/AuthBootstrap.java new file mode 100644 index 0000000000000000000000000000000000000000..069878d251ed10ec453866e6519ffcfc60fa9525 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/AuthBootstrap.java @@ -0,0 +1,25 @@ +package com.github.wxiaoqi.security.auth; + + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +/** + * Created by Ace on 2017/6/2. + */ +@SpringBootApplication +@EnableEurekaClient +@EnableFeignClients +@MapperScan("com.github.wxiaoqi.security.auth.mapper") +@RemoteApplicationEventScan(basePackages = "com.github.wxiaoqi.security.auth.common.event") +@EnableAutoConfiguration +public class AuthBootstrap { + public static void main(String[] args) { + SpringApplication.run(AuthBootstrap.class, args); + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/bean/ClientInfo.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/bean/ClientInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..70a95b7636384d66e728415034870f1747f4751b --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/bean/ClientInfo.java @@ -0,0 +1,50 @@ +package com.github.wxiaoqi.security.auth.bean; + + +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; + +/** + * Created by ace on 2017/9/10. + */ +public class ClientInfo implements IJWTInfo { + String clientId; + String name; + + public ClientInfo(String clientId, String name, String id) { + this.clientId = clientId; + this.name = name; + this.id = id; + } + + public void setId(String id) { + this.id = id; + } + + String id; + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getUniqueName() { + return clientId; + } + + @Override + public String getId() { + return id; + } + + @Override + public String getName() { + return name; + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/biz/ClientBiz.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/biz/ClientBiz.java new file mode 100755 index 0000000000000000000000000000000000000000..cfc9dbd3ac4ec95290a978a327f18cc3d7d11d94 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/biz/ClientBiz.java @@ -0,0 +1,44 @@ +package com.github.wxiaoqi.security.auth.biz; + +import com.github.wxiaoqi.security.auth.entity.Client; +import com.github.wxiaoqi.security.auth.entity.ClientService; +import com.github.wxiaoqi.security.auth.mapper.ClientMapper; +import com.github.wxiaoqi.security.auth.mapper.ClientServiceMapper; +import com.github.wxiaoqi.security.common.biz.BaseBiz; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + * + * + * @author Mr.AG + * @email 463540703@qq.com + * @date 2017-12-26 19:43:46 + */ +@Service +public class ClientBiz extends BaseBiz { + @Autowired + private ClientServiceMapper clientServiceMapper; + @Autowired + private ClientServiceBiz clientServiceBiz; + + public List getClientServices(int id) { + return mapper.selectAuthorityServiceInfo(id); + } + + public void modifyClientServices(int id, String clients) { + clientServiceMapper.deleteByServiceId(id); + if (!StringUtils.isEmpty(clients)) { + String[] mem = clients.split(","); + for (String m : mem) { + ClientService clientService = new ClientService(); + clientService.setServiceId(m); + clientService.setClientId(id+""); + clientServiceBiz.insertSelective(clientService); + } + } + } +} \ No newline at end of file diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/biz/ClientServiceBiz.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/biz/ClientServiceBiz.java new file mode 100644 index 0000000000000000000000000000000000000000..e3f2c32b79894b9da72bb75e4c701481c38deadd --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/biz/ClientServiceBiz.java @@ -0,0 +1,14 @@ +package com.github.wxiaoqi.security.auth.biz; + +import com.github.wxiaoqi.security.auth.entity.ClientService; +import com.github.wxiaoqi.security.auth.mapper.ClientServiceMapper; +import com.github.wxiaoqi.security.common.biz.BaseBiz; +import org.springframework.stereotype.Service; + +/** + * @author ace + * @create 2017/12/30. + */ +@Service +public class ClientServiceBiz extends BaseBiz { +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/AuthConfiguration.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/AuthConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..6d1781d7d18180ca375889dd3e0470be81254cba --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/AuthConfiguration.java @@ -0,0 +1,16 @@ +package com.github.wxiaoqi.security.auth.configuration; + +import com.github.wxiaoqi.security.common.handler.GlobalExceptionHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Created by ace on 2017/9/10. + */ +@Configuration +public class AuthConfiguration { + @Bean + public GlobalExceptionHandler getGlobalExceptionHandler(){ + return new GlobalExceptionHandler(); + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/ClientConfiguration.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/ClientConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..bfcd6883868235edf9d6752d66ce8a9dcbfcef37 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/ClientConfiguration.java @@ -0,0 +1,31 @@ +package com.github.wxiaoqi.security.auth.configuration; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * Created by ace on 2017/9/12. + */ +@Configuration +public class ClientConfiguration { + @Value("${client.id}") + private String clientId; + @Value("${client.secret}") + private String clientSecret; + @Value("${client.token-header}") + private String clientTokenHeader; + + public String getClientTokenHeader() { + return clientTokenHeader; + } + + public String getClientSecret() { + return clientSecret; + } + + public String getClientId() { + return clientId; + } + + +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/FeignConfiguration.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/FeignConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..3a4cd2b09bb12a3d87a182ea02513629f0f60643 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/FeignConfiguration.java @@ -0,0 +1,16 @@ +package com.github.wxiaoqi.security.auth.configuration; + +import com.github.wxiaoqi.security.auth.interceptor.ClientTokenInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Created by ace on 2017/9/12. + */ +@Configuration +public class FeignConfiguration { + @Bean + ClientTokenInterceptor getClientTokenInterceptor(){ + return new ClientTokenInterceptor(); + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/KeyConfiguration.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/KeyConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..b8b091c0104504f3415598203e26fc5c61fd0dc5 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/KeyConfiguration.java @@ -0,0 +1,22 @@ +package com.github.wxiaoqi.security.auth.configuration; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * @author ace + * @create 2017/12/17. + */ +@Configuration +@Data +public class KeyConfiguration { + @Value("${jwt.rsa-secret}") + private String userSecret; + @Value("${client.rsa-secret}") + private String serviceSecret; + private byte[] userPubKey; + private byte[] userPriKey; + private byte[] servicePriKey; + private byte[] servicePubKey; +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/RedisConfiguration.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/RedisConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..aae9ceb07e933cc5d3fc1696076ffaefb3dc2a61 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/RedisConfiguration.java @@ -0,0 +1,36 @@ +package com.github.wxiaoqi.security.auth.configuration; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; + +/** + * ${DESCRIPTION} + * + * @author wanghaobin + * @create 2017-06-21 8:39 + */ + +@Configuration +public class RedisConfiguration { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(factory); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + template.setValueSerializer(jackson2JsonRedisSerializer); + template.afterPropertiesSet(); + return template; + } + +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/UserConfiguration.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/UserConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..71fa6e334628c4fe89c05cae70921ced2f3c5d77 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/UserConfiguration.java @@ -0,0 +1,16 @@ +package com.github.wxiaoqi.security.auth.configuration; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * @author ace + * @create 2017/12/26. + */ +@Configuration +@Data +public class UserConfiguration { + @Value("${jwt.token-header}") + private String userTokenHeader; +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/WebConfiguration.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/WebConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..3a18b1d6f9a5eb63d8deea3ff735e25047979806 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/configuration/WebConfiguration.java @@ -0,0 +1,41 @@ +package com.github.wxiaoqi.security.auth.configuration; + +import com.github.wxiaoqi.security.auth.interceptor.ServiceAuthRestInterceptor; +import com.github.wxiaoqi.security.auth.interceptor.UserAuthRestInterceptor; +import com.github.wxiaoqi.security.common.handler.GlobalExceptionHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * + * @author ace + * @date 2017/9/8 + */ +@Configuration("admimWebConfig") +@Primary +public class WebConfiguration implements WebMvcConfigurer { + @Bean + GlobalExceptionHandler getGlobalExceptionHandler() { + return new GlobalExceptionHandler(); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(getServiceAuthRestInterceptor()).addPathPatterns("/service/**"); + registry.addInterceptor(getUserAuthRestInterceptor()).addPathPatterns("/service/**"); + } + + @Bean + ServiceAuthRestInterceptor getServiceAuthRestInterceptor() { + return new ServiceAuthRestInterceptor(); + } + + @Bean + UserAuthRestInterceptor getUserAuthRestInterceptor() { + return new UserAuthRestInterceptor(); + } + +} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/controller/AuthController.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/AuthController.java similarity index 49% rename from ace-gate/src/main/java/com/github/wxiaoqi/security/gate/controller/AuthController.java rename to ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/AuthController.java index 0bcc8339865b10d9f09861fa010bcc9eecf78796..d213e077b550c212383bb9fff60479e92f590439 100755 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/controller/AuthController.java +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/AuthController.java @@ -1,29 +1,31 @@ -package com.github.wxiaoqi.security.gate.controller; +package com.github.wxiaoqi.security.auth.controller; -import com.github.wxiaoqi.security.gate.service.AuthService; -import com.github.wxiaoqi.security.gate.jwt.JwtAuthenticationResponse; +import com.github.wxiaoqi.security.auth.service.AuthService; +import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationRequest; +import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationResponse; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @RestController -@RequestMapping("/api/jwt") +@RequestMapping("jwt") +@Slf4j public class AuthController { - @Value("${gate.jwt.header}") + @Value("${jwt.token-header}") private String tokenHeader; @Autowired private AuthService authService; - @RequestMapping(value = "auth", method = RequestMethod.POST) + @RequestMapping(value = "token", method = RequestMethod.POST) public ResponseEntity createAuthenticationToken( - String username,String password) { - final String token = authService.login(username, password); + @RequestBody JwtAuthenticationRequest authenticationRequest) throws Exception { + log.info(authenticationRequest.getUsername()+" require logging..."); + final String token = authService.login(authenticationRequest); return ResponseEntity.ok(new JwtAuthenticationResponse(token)); } @@ -40,11 +42,14 @@ public class AuthController { } @RequestMapping(value = "verify", method = RequestMethod.GET) - public ResponseEntity verify(String token,String resource){ - if(authService.validate(token,resource)) - return ResponseEntity.ok(true); - else - return ResponseEntity.status(401).body(false); + public ResponseEntity verify(String token) throws Exception { + authService.validate(token); + return ResponseEntity.ok(true); } + @RequestMapping(value = "invalid", method = RequestMethod.POST) + public ResponseEntity invalid(String token){ + authService.invalid(token); + return ResponseEntity.ok(true); + } } diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/ClientController.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/ClientController.java new file mode 100644 index 0000000000000000000000000000000000000000..a2e355e3144270e70f366b1727fc8b448367ed45 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/ClientController.java @@ -0,0 +1,48 @@ +package com.github.wxiaoqi.security.auth.controller; + +import com.github.wxiaoqi.security.auth.configuration.KeyConfiguration; +import com.github.wxiaoqi.security.auth.service.AuthClientService; +import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * Created by ace on 2017/9/10. + */ +@RestController +@RequestMapping("client") +public class ClientController{ + @Autowired + private AuthClientService authClientService; + @Autowired + private KeyConfiguration keyConfiguration; + + @RequestMapping(value = "/token", method = RequestMethod.POST) + public ObjectRestResponse getAccessToken(String clientId, String secret) throws Exception { + return new ObjectRestResponse().data(authClientService.apply(clientId, secret)); + } + + @RequestMapping(value = "/myClient") + public ObjectRestResponse getAllowedClient(String serviceId, String secret) { + return new ObjectRestResponse>().data(authClientService.getAllowedClient(serviceId, secret)); + } + + @RequestMapping(value = "/servicePubKey",method = RequestMethod.POST) + public ObjectRestResponse getServicePublicKey(@RequestParam("clientId") String clientId, @RequestParam("secret") String secret) throws Exception { + authClientService.validate(clientId, secret); + return new ObjectRestResponse().data(keyConfiguration.getServicePubKey()); + } + + @RequestMapping(value = "/userPubKey",method = RequestMethod.POST) + public ObjectRestResponse getUserPublicKey(@RequestParam("clientId") String clientId, @RequestParam("secret") String secret) throws Exception { + authClientService.validate(clientId, secret); + return new ObjectRestResponse().data(keyConfiguration.getUserPubKey()); + } + + +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/ServiceController.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/ServiceController.java new file mode 100644 index 0000000000000000000000000000000000000000..75d4c10d0cd7df0113a16cbdc297340cf524e89d --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/ServiceController.java @@ -0,0 +1,30 @@ +package com.github.wxiaoqi.security.auth.controller; + +import com.github.wxiaoqi.security.auth.biz.ClientBiz; +import com.github.wxiaoqi.security.auth.entity.Client; +import com.github.wxiaoqi.security.auth.entity.ClientService; +import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; +import com.github.wxiaoqi.security.common.rest.BaseController; +import org.springframework.web.bind.annotation.*; + +/** + * @author ace + * @create 2017/12/26. + */ +@RestController +@RequestMapping("service") +public class ServiceController extends BaseController{ + + @RequestMapping(value = "/{id}/client", method = RequestMethod.PUT) + @ResponseBody + public ObjectRestResponse modifyUsers(@PathVariable int id, String clients){ + baseBiz.modifyClientServices(id, clients); + return new ObjectRestResponse().rel(true); + } + + @RequestMapping(value = "/{id}/client", method = RequestMethod.GET) + @ResponseBody + public ObjectRestResponse getUsers(@PathVariable int id){ + return new ObjectRestResponse().rel(true).data(baseBiz.getClientServices(id)); + } +} diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/entity/Article.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/entity/Client.java similarity index 73% rename from ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/entity/Article.java rename to ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/entity/Client.java index 39183061de21fcdec9c3cdca57f318c9abeae75b..6969039bf22c2e7fec4ee68996a0a1d3cc3c1c9d 100644 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/entity/Article.java +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/entity/Client.java @@ -1,28 +1,24 @@ -package com.github.wxiaoqi.blog.admin.entity; +package com.github.wxiaoqi.security.auth.entity; +import javax.persistence.Column; +import javax.persistence.Id; +import javax.persistence.Table; import java.util.Date; -import javax.persistence.*; -@Table(name = "blog_article") -public class Article { +@Table(name = "auth_client") +public class Client { @Id private Integer id; - private String title; + private String code; - private String content; + private String secret; - private String remark; + private String name; - private String tag; + private String locked = "0"; - @Column(name = "is_del") - private String isDel; - - @Column(name = "page_view") - private Integer pageView; - - private String cover; + private String description; @Column(name = "crt_time") private Date crtTime; @@ -79,101 +75,73 @@ public class Article { } /** - * @return title - */ - public String getTitle() { - return title; - } - - /** - * @param title - */ - public void setTitle(String title) { - this.title = title; - } - - /** - * @return content - */ - public String getContent() { - return content; - } - - /** - * @param content - */ - public void setContent(String content) { - this.content = content; - } - - /** - * @return remark + * @return code */ - public String getRemark() { - return remark; + public String getCode() { + return code; } /** - * @param remark + * @param code */ - public void setRemark(String remark) { - this.remark = remark; + public void setCode(String code) { + this.code = code; } /** - * @return tag + * @return secret */ - public String getTag() { - return tag; + public String getSecret() { + return secret; } /** - * @param tag + * @param secret */ - public void setTag(String tag) { - this.tag = tag; + public void setSecret(String secret) { + this.secret = secret; } /** - * @return is_del + * @return name */ - public String getIsDel() { - return isDel; + public String getName() { + return name; } /** - * @param isDel + * @param name */ - public void setIsDel(String isDel) { - this.isDel = isDel; + public void setName(String name) { + this.name = name; } /** - * @return page_view + * @return locked */ - public Integer getPageView() { - return pageView; + public String getLocked() { + return locked; } /** - * @param pageView + * @param locked */ - public void setPageView(Integer pageView) { - this.pageView = pageView; + public void setLocked(String locked) { + this.locked = locked; } /** - * @return cover + * @return description */ - public String getCover() { - return cover; + public String getDescription() { + return description; } /** - * @param cover + * @param description */ - public void setCover(String cover) { - this.cover = cover; + public void setDescription(String description) { + this.description = description; } /** diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/entity/ClientService.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/entity/ClientService.java new file mode 100644 index 0000000000000000000000000000000000000000..15dc975e6430b4c5a34e1c285f6d218820286d6b --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/entity/ClientService.java @@ -0,0 +1,272 @@ +package com.github.wxiaoqi.security.auth.entity; + +import javax.persistence.Column; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +@Table(name = "auth_client_service") +public class ClientService { + @Id + private Integer id; + + @Column(name = "service_id") + private String serviceId; + + @Column(name = "client_id") + private String clientId; + + private String description; + + @Column(name = "crt_time") + private Date crtTime; + + @Column(name = "crt_user") + private String crtUser; + + @Column(name = "crt_name") + private String crtName; + + @Column(name = "crt_host") + private String crtHost; + + private String attr1; + + private String attr2; + + private String attr3; + + private String attr4; + + private String attr5; + + private String attr6; + + private String attr7; + + private String attr8; + + /** + * @return id + */ + public Integer getId() { + return id; + } + + /** + * @param id + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * @return service_id + */ + public String getServiceId() { + return serviceId; + } + + /** + * @param serviceId + */ + public void setServiceId(String serviceId) { + this.serviceId = serviceId; + } + + /** + * @return client_id + */ + public String getClientId() { + return clientId; + } + + /** + * @param clientId + */ + public void setClientId(String clientId) { + this.clientId = clientId; + } + + /** + * @return description + */ + public String getDescription() { + return description; + } + + /** + * @param description + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * @return crt_time + */ + public Date getCrtTime() { + return crtTime; + } + + /** + * @param crtTime + */ + public void setCrtTime(Date crtTime) { + this.crtTime = crtTime; + } + + /** + * @return crt_user + */ + public String getCrtUser() { + return crtUser; + } + + /** + * @param crtUser + */ + public void setCrtUser(String crtUser) { + this.crtUser = crtUser; + } + + /** + * @return crt_name + */ + public String getCrtName() { + return crtName; + } + + /** + * @param crtName + */ + public void setCrtName(String crtName) { + this.crtName = crtName; + } + + /** + * @return crt_host + */ + public String getCrtHost() { + return crtHost; + } + + /** + * @param crtHost + */ + public void setCrtHost(String crtHost) { + this.crtHost = crtHost; + } + + /** + * @return attr1 + */ + public String getAttr1() { + return attr1; + } + + /** + * @param attr1 + */ + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + /** + * @return attr2 + */ + public String getAttr2() { + return attr2; + } + + /** + * @param attr2 + */ + public void setAttr2(String attr2) { + this.attr2 = attr2; + } + + /** + * @return attr3 + */ + public String getAttr3() { + return attr3; + } + + /** + * @param attr3 + */ + public void setAttr3(String attr3) { + this.attr3 = attr3; + } + + /** + * @return attr4 + */ + public String getAttr4() { + return attr4; + } + + /** + * @param attr4 + */ + public void setAttr4(String attr4) { + this.attr4 = attr4; + } + + /** + * @return attr5 + */ + public String getAttr5() { + return attr5; + } + + /** + * @param attr5 + */ + public void setAttr5(String attr5) { + this.attr5 = attr5; + } + + /** + * @return attr6 + */ + public String getAttr6() { + return attr6; + } + + /** + * @param attr6 + */ + public void setAttr6(String attr6) { + this.attr6 = attr6; + } + + /** + * @return attr7 + */ + public String getAttr7() { + return attr7; + } + + /** + * @param attr7 + */ + public void setAttr7(String attr7) { + this.attr7 = attr7; + } + + /** + * @return attr8 + */ + public String getAttr8() { + return attr8; + } + + /** + * @param attr8 + */ + public void setAttr8(String attr8) { + this.attr8 = attr8; + } +} \ No newline at end of file diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/feign/IUserService.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/feign/IUserService.java new file mode 100644 index 0000000000000000000000000000000000000000..759ac3550829cefb13add4a7152d053bea7a0bda --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/feign/IUserService.java @@ -0,0 +1,22 @@ +package com.github.wxiaoqi.security.auth.feign; + +import com.github.wxiaoqi.security.api.vo.user.UserInfo; +import com.github.wxiaoqi.security.auth.configuration.FeignConfiguration; +import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationRequest; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + + +/** + * ${DESCRIPTION} + * + * @author wanghaobin + * @create 2017-06-21 8:11 + */ +@FeignClient(value = "ace-admin",configuration = FeignConfiguration.class) +public interface IUserService { + @RequestMapping(value = "/api/user/validate", method = RequestMethod.POST) + public UserInfo validate(@RequestBody JwtAuthenticationRequest authenticationRequest); +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/ClientTokenInterceptor.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/ClientTokenInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..f6a4f1628734aa1dc2ce98742fd5b893fb60792f --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/ClientTokenInterceptor.java @@ -0,0 +1,29 @@ +package com.github.wxiaoqi.security.auth.interceptor; + +import com.github.wxiaoqi.security.auth.configuration.ClientConfiguration; +import com.github.wxiaoqi.security.auth.service.AuthClientService; +import feign.RequestInterceptor; +import feign.RequestTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Created by ace on 2017/9/12. + */ +public class ClientTokenInterceptor implements RequestInterceptor { + private Logger logger = LoggerFactory.getLogger(ClientTokenInterceptor.class); + @Autowired + private ClientConfiguration clientConfiguration; + @Autowired + private AuthClientService authClientService; + + @Override + public void apply(RequestTemplate requestTemplate) { + try { + requestTemplate.header(clientConfiguration.getClientTokenHeader(), authClientService.apply(clientConfiguration.getClientId(), clientConfiguration.getClientSecret())); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/ServiceAuthRestInterceptor.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/ServiceAuthRestInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..bd004f079c003722666434ff9e2e19506d708834 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/ServiceAuthRestInterceptor.java @@ -0,0 +1,43 @@ +package com.github.wxiaoqi.security.auth.interceptor; + +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.auth.configuration.ClientConfiguration; +import com.github.wxiaoqi.security.auth.service.AuthClientService; +import com.github.wxiaoqi.security.auth.util.client.ClientTokenUtil; +import com.github.wxiaoqi.security.common.exception.auth.ClientForbiddenException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created by ace on 2017/9/12. + */ +@SuppressWarnings("ALL") +public class ServiceAuthRestInterceptor extends HandlerInterceptorAdapter { + private Logger logger = LoggerFactory.getLogger(ServiceAuthRestInterceptor.class); + + @Autowired + private ClientTokenUtil clientTokenUtil; + @Autowired + private AuthClientService authClientService; + @Autowired + private ClientConfiguration clientConfiguration; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + HandlerMethod handlerMethod = (HandlerMethod) handler; + String token = request.getHeader(clientConfiguration.getClientTokenHeader()); + IJWTInfo infoFromToken = clientTokenUtil.getInfoFromToken(token); + String uniqueName = infoFromToken.getUniqueName(); + for(String client: authClientService.getAllowedClient(clientConfiguration.getClientId())){ + if(client.equals(uniqueName)){ + return super.preHandle(request, response, handler); + } + } + throw new ClientForbiddenException("Client is Forbidden!"); + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/UserAuthRestInterceptor.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/UserAuthRestInterceptor.java new file mode 100644 index 0000000000000000000000000000000000000000..3d53890a80a65d21977dc36e263bff59a04fc49e --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/interceptor/UserAuthRestInterceptor.java @@ -0,0 +1,42 @@ +package com.github.wxiaoqi.security.auth.interceptor; + +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.auth.configuration.UserConfiguration; +import com.github.wxiaoqi.security.auth.util.user.JwtTokenUtil; +import com.github.wxiaoqi.security.common.context.BaseContextHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created by ace on 2017/9/10. + */ +public class UserAuthRestInterceptor extends HandlerInterceptorAdapter { + private Logger logger = LoggerFactory.getLogger(UserAuthRestInterceptor.class); + @Autowired + private JwtTokenUtil jwtTokenUtil; + @Autowired + private UserConfiguration userConfiguration; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + HandlerMethod handlerMethod = (HandlerMethod) handler; + String token = request.getHeader(userConfiguration.getUserTokenHeader()); + IJWTInfo infoFromToken = jwtTokenUtil.getInfoFromToken(token); + BaseContextHandler.setUsername(infoFromToken.getUniqueName()); + BaseContextHandler.setName(infoFromToken.getName()); + BaseContextHandler.setUserID(infoFromToken.getId()); + return super.preHandle(request, response, handler); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + BaseContextHandler.remove(); + super.afterCompletion(request, response, handler, ex); + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/mapper/ClientMapper.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/mapper/ClientMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..eea1c455601a22cbd47905ca4f309b60ed2401e7 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/mapper/ClientMapper.java @@ -0,0 +1,20 @@ +package com.github.wxiaoqi.security.auth.mapper; + +import com.github.wxiaoqi.security.auth.entity.Client; +import tk.mybatis.mapper.common.Mapper; + +import java.util.List; + +public interface ClientMapper extends Mapper { +// @Select(" SELECT\n" + +// " client.CODE\n" + +// " FROM\n" + +// " auth_client client\n" + +// " INNER JOIN auth_client_service gcs ON gcs.client_id = client.id\n" + +// " WHERE\n" + +// " gcs.service_id = #{serviceId}") +// @ResultType(String.class) + List selectAllowedClient(String serviceId); + + List selectAuthorityServiceInfo(int clientId); +} \ No newline at end of file diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/mapper/ClientServiceMapper.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/mapper/ClientServiceMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..2c81461497ace334c6826d01245ff363ed1eb68a --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/mapper/ClientServiceMapper.java @@ -0,0 +1,8 @@ +package com.github.wxiaoqi.security.auth.mapper; + +import com.github.wxiaoqi.security.auth.entity.ClientService; +import tk.mybatis.mapper.common.Mapper; + +public interface ClientServiceMapper extends Mapper { + void deleteByServiceId(int id); +} \ No newline at end of file diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/runner/AuthServerRunner.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/runner/AuthServerRunner.java new file mode 100644 index 0000000000000000000000000000000000000000..315536e4d6920a9ba631e3d7ea050154c89aa04a --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/runner/AuthServerRunner.java @@ -0,0 +1,49 @@ +package com.github.wxiaoqi.security.auth.runner; + +import com.github.wxiaoqi.security.auth.common.util.jwt.RsaKeyHelper; +import com.github.wxiaoqi.security.auth.configuration.KeyConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.Map; + +/** + * @author ace + * @create 2017/12/17. + */ +@Configuration +public class AuthServerRunner implements CommandLineRunner { + @Autowired + private RedisTemplate redisTemplate; + private static final String REDIS_USER_PRI_KEY = "AG:AUTH:JWT:PRI"; + private static final String REDIS_USER_PUB_KEY = "AG:AUTH:JWT:PUB"; + private static final String REDIS_SERVICE_PRI_KEY = "AG:AUTH:CLIENT:PRI"; + private static final String REDIS_SERVICE_PUB_KEY = "AG:AUTH:CLIENT:PUB"; + + @Autowired + private KeyConfiguration keyConfiguration; + + @Override + public void run(String... args) throws Exception { + if (redisTemplate.hasKey(REDIS_USER_PRI_KEY)&&redisTemplate.hasKey(REDIS_USER_PUB_KEY)&&redisTemplate.hasKey(REDIS_SERVICE_PRI_KEY)&&redisTemplate.hasKey(REDIS_SERVICE_PUB_KEY)) { + keyConfiguration.setUserPriKey(RsaKeyHelper.toBytes(redisTemplate.opsForValue().get(REDIS_USER_PRI_KEY).toString())); + keyConfiguration.setUserPubKey(RsaKeyHelper.toBytes(redisTemplate.opsForValue().get(REDIS_USER_PUB_KEY).toString())); + keyConfiguration.setServicePriKey(RsaKeyHelper.toBytes(redisTemplate.opsForValue().get(REDIS_SERVICE_PRI_KEY).toString())); + keyConfiguration.setServicePubKey(RsaKeyHelper.toBytes(redisTemplate.opsForValue().get(REDIS_SERVICE_PUB_KEY).toString())); + } else { + Map keyMap = RsaKeyHelper.generateKey(keyConfiguration.getUserSecret()); + keyConfiguration.setUserPriKey(keyMap.get("pri")); + keyConfiguration.setUserPubKey(keyMap.get("pub")); + redisTemplate.opsForValue().set(REDIS_USER_PRI_KEY, RsaKeyHelper.toHexString(keyMap.get("pri"))); + redisTemplate.opsForValue().set(REDIS_USER_PUB_KEY, RsaKeyHelper.toHexString(keyMap.get("pub"))); + keyMap = RsaKeyHelper.generateKey(keyConfiguration.getServiceSecret()); + keyConfiguration.setServicePriKey(keyMap.get("pri")); + keyConfiguration.setServicePubKey(keyMap.get("pub")); + redisTemplate.opsForValue().set(REDIS_SERVICE_PRI_KEY, RsaKeyHelper.toHexString(keyMap.get("pri"))); + redisTemplate.opsForValue().set(REDIS_SERVICE_PUB_KEY, RsaKeyHelper.toHexString(keyMap.get("pub"))); + + } + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/AuthClientService.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/AuthClientService.java new file mode 100644 index 0000000000000000000000000000000000000000..10b4c71d8f703b82e1da2d86e7b43a4e5a88b63e --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/AuthClientService.java @@ -0,0 +1,30 @@ +package com.github.wxiaoqi.security.auth.service; + + +import java.util.List; + +/** + * Created by ace on 2017/9/10. + */ +public interface AuthClientService { + public String apply(String clientId, String secret) throws Exception; + + /** + * 获取授权的客户端列表 + * @param serviceId + * @param secret + * @return + */ + public List getAllowedClient(String serviceId, String secret); + + /** + * 获取服务授权的客户端列表 + * @param serviceId + * @return + */ + public List getAllowedClient(String serviceId); + + public void registryClient(); + + public void validate(String clientId, String secret) throws Exception; +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/AuthService.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/AuthService.java new file mode 100755 index 0000000000000000000000000000000000000000..36376d1014c55d7fbfee59cbdbad1d3102ed83a9 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/AuthService.java @@ -0,0 +1,11 @@ +package com.github.wxiaoqi.security.auth.service; + + +import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationRequest; + +public interface AuthService { + String login(JwtAuthenticationRequest authenticationRequest) throws Exception; + String refresh(String oldToken); + void validate(String token) throws Exception; + Boolean invalid(String token); +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/AuthServiceImpl.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/AuthServiceImpl.java new file mode 100755 index 0000000000000000000000000000000000000000..80aeea38ed769259ec1fbabfb1bfbb394145ad53 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/AuthServiceImpl.java @@ -0,0 +1,54 @@ +package com.github.wxiaoqi.security.auth.service.impl; + +import com.github.wxiaoqi.security.api.vo.user.UserInfo; +import com.github.wxiaoqi.security.auth.common.util.jwt.JWTInfo; +import com.github.wxiaoqi.security.auth.feign.IUserService; +import com.github.wxiaoqi.security.auth.service.AuthService; +import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationRequest; +import com.github.wxiaoqi.security.auth.util.user.JwtTokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.RequestBody; + +@Service +public class AuthServiceImpl implements AuthService { + + private JwtTokenUtil jwtTokenUtil; + private IUserService userService; + + @Autowired + public AuthServiceImpl( + JwtTokenUtil jwtTokenUtil, + IUserService userService) { + this.jwtTokenUtil = jwtTokenUtil; + this.userService = userService; + } + + @Override + public String login(JwtAuthenticationRequest authenticationRequest) throws Exception { + UserInfo info = userService.validate(authenticationRequest); + String token = ""; + if (!StringUtils.isEmpty(info.getId())) { + token = jwtTokenUtil.generateToken(new JWTInfo(info.getUsername(), info.getId() + "", info.getName())); + } + return token; + } + + @Override + public void validate(String token) throws Exception { + jwtTokenUtil.getInfoFromToken(token); + } + + @Override + public Boolean invalid(String token) { + // TODO: 2017/9/11 注销token + return null; + } + + @Override + public String refresh(String oldToken) { + // TODO: 2017/9/11 刷新token + return null; + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/DBAuthClientService.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/DBAuthClientService.java new file mode 100644 index 0000000000000000000000000000000000000000..8858f47b63b66c2b7b70e666787252622af59b4f --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/DBAuthClientService.java @@ -0,0 +1,105 @@ +package com.github.wxiaoqi.security.auth.service.impl; + +import com.github.wxiaoqi.security.auth.bean.ClientInfo; +import com.github.wxiaoqi.security.auth.entity.Client; +import com.github.wxiaoqi.security.auth.mapper.ClientMapper; +import com.github.wxiaoqi.security.auth.service.AuthClientService; +import com.github.wxiaoqi.security.auth.util.client.ClientTokenUtil; +import com.github.wxiaoqi.security.common.exception.auth.ClientInvalidException; +import com.github.wxiaoqi.security.common.util.UUIDUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.context.ApplicationContext; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by ace on 2017/9/10. + */ +@Service +public class DBAuthClientService implements AuthClientService { + @Autowired + private ClientMapper clientMapper; + @Autowired + private ClientTokenUtil clientTokenUtil; + @Autowired + private DiscoveryClient discovery; + private ApplicationContext context; + + @Autowired + public DBAuthClientService(ApplicationContext context) { + this.context = context; + } + + @Override + public String apply(String clientId, String secret) throws Exception { + Client client = getClient(clientId, secret); + return clientTokenUtil.generateToken(new ClientInfo(client.getCode(),client.getName(),client.getId().toString())); + } + + private Client getClient(String clientId, String secret) { + Client client = new Client(); + client.setCode(clientId); + client = clientMapper.selectOne(client); + if(client==null||!client.getSecret().equals(secret)){ + throw new ClientInvalidException("Client not found or Client secret is error!"); + } + return client; + } + + @Override + public void validate(String clientId, String secret) throws Exception { + Client client = new Client(); + client.setCode(clientId); + client = clientMapper.selectOne(client); + if(client==null||!client.getSecret().equals(secret)){ + throw new ClientInvalidException("Client not found or Client secret is error!"); + } + } + + @Override + public List getAllowedClient(String clientId, String secret) { + Client info = this.getClient(clientId, secret); + List clients = clientMapper.selectAllowedClient(info.getId() + ""); + if(clients==null) { + new ArrayList(); + } + return clients; + } + + @Override + public List getAllowedClient(String serviceId) { + Client info = getClient(serviceId); + List clients = clientMapper.selectAllowedClient(info.getId() + ""); + if(clients==null) { + new ArrayList(); + } + return clients; + } + + private Client getClient(String clientId) { + Client client = new Client(); + client.setCode(clientId); + client = clientMapper.selectOne(client); + return client; + } + + @Override + @Scheduled(cron = "0 0/1 * * * ?") + public void registryClient() { + // 自动注册节点 + discovery.getServices().forEach((name) ->{ + Client client = new Client(); + client.setName(name); + client.setCode(name); + Client dbClient = clientMapper.selectOne(client); + if(dbClient==null) { + client.setSecret(UUIDUtils.generateShortUuid()); + clientMapper.insert(client); + } + }); + } +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/client/ClientTokenUtil.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/client/ClientTokenUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..ff649ea0d976ff82aeaec6f8d7458bb11b79885f --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/client/ClientTokenUtil.java @@ -0,0 +1,32 @@ +package com.github.wxiaoqi.security.auth.util.client; + +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.auth.common.util.jwt.JWTHelper; +import com.github.wxiaoqi.security.auth.configuration.KeyConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * Created by ace on 2017/9/10. + */ +@Configuration +public class ClientTokenUtil { + private Logger logger = LoggerFactory.getLogger(ClientTokenUtil.class); + + @Value("${client.expire}") + private int expire; + @Autowired + private KeyConfiguration keyConfiguration; + + public String generateToken(IJWTInfo jwtInfo) throws Exception { + return JWTHelper.generateToken(jwtInfo, keyConfiguration.getServicePriKey(), expire); + } + + public IJWTInfo getInfoFromToken(String token) throws Exception { + return JWTHelper.getInfoFromToken(token, keyConfiguration.getServicePubKey()); + } + +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtAuthenticationRequest.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtAuthenticationRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..32d3e0f2e5237e6f8788c34cb45fb82575fb94f8 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtAuthenticationRequest.java @@ -0,0 +1,36 @@ +package com.github.wxiaoqi.security.auth.util.user; + +import java.io.Serializable; + +public class JwtAuthenticationRequest implements Serializable { + + private static final long serialVersionUID = -8445943548965154778L; + + private String username; + private String password; + + + public JwtAuthenticationRequest(String username, String password) { + this.username = username; + this.password = password; + } + + public JwtAuthenticationRequest() { + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } +} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtAuthenticationResponse.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtAuthenticationResponse.java similarity index 87% rename from ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtAuthenticationResponse.java rename to ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtAuthenticationResponse.java index 2e24ddecfcf5b5ad940eb665666df8cdfb791d3a..8138d97a6623076377e8053f406cb4a3964b9973 100755 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtAuthenticationResponse.java +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtAuthenticationResponse.java @@ -1,4 +1,4 @@ -package com.github.wxiaoqi.security.gate.jwt; +package com.github.wxiaoqi.security.auth.util.user; import java.io.Serializable; diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtTokenUtil.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtTokenUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..8056cfdec58fc48888d5513d50537f150a828214 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/util/user/JwtTokenUtil.java @@ -0,0 +1,34 @@ +package com.github.wxiaoqi.security.auth.util.user; + +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.auth.common.util.jwt.JWTHelper; +import com.github.wxiaoqi.security.auth.configuration.KeyConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +/** + * Created by ace on 2017/9/10. + */ +@Component +public class JwtTokenUtil { + + @Value("${jwt.expire}") + private int expire; + @Autowired + private KeyConfiguration keyConfiguration; + + @Autowired + private RedisTemplate redisTemplate; + + public String generateToken(IJWTInfo jwtInfo) throws Exception { + return JWTHelper.generateToken(jwtInfo, keyConfiguration.getUserPriKey(),expire); + } + + public IJWTInfo getInfoFromToken(String token) throws Exception { + return JWTHelper.getInfoFromToken(token, keyConfiguration.getUserPubKey()); + } + + +} diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/vo/FrontUser.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/vo/FrontUser.java new file mode 100644 index 0000000000000000000000000000000000000000..75a2d91f373fe8180e7ce6cab16ab54dcf8ee654 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/vo/FrontUser.java @@ -0,0 +1,74 @@ +package com.github.wxiaoqi.security.auth.vo; + +import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; + +import java.util.List; + +/** + * Created by ace on 2017/8/22. + */ +public class FrontUser { + public String id; + public String username; + public String name; + private String description; + private String image; + private List menus; + private List elements; + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public List getElements() { + return elements; + } + + public void setElements(List elements) { + this.elements = elements; + } +} diff --git a/ace-auth/ace-auth-server/src/main/resources/application.yml b/ace-auth/ace-auth-server/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..bc5d37c9215b9b09961b784cc63cb53828aa8446 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/resources/application.yml @@ -0,0 +1,112 @@ +spring: + application: + name: ace-auth + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + default-property-inclusion: non_null + redis: + database: 1 + host: ${REDIS_HOST:localhost} + port: ${REDIS_PORT:6379} + pool: + max-active: 20 + datasource: + name: test + url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/ag_auth_v1?useUnicode=true&characterEncoding=UTF8 + username: root + password: 123456 + # 使用druid数据源 + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.jdbc.Driver + filters: stat + maxActive: 20 + initialSize: 1 + maxWait: 60000 + minIdle: 1 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: select 'x' + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + poolPreparedStatements: true + maxOpenPreparedStatements: 20 + rabbitmq: + host: ${RABBIT_MQ_HOST:localhost} + port: ${RABBIT_MQ_PORT:5672} + username: guest + password: guest + sleuth: + enabled: true + http: + legacy: + enabled: true + +mybatis: + basepackage: com.github.wxiaoqi.security.auth.mapper + xmlLocation: classpath:mapper/**/*.xml + mapper-locations: "classpath*:mapper/*.xml" + +server: + port: 9777 #启动端口 + +feign: + httpclient: + enabled: false + okhttp: + enabled: true + +ribbon: + eureka: + enabled: true + ReadTimeout: 60000 + ConnectTimeout: 60000 + MaxAutoRetries: 0 + MaxAutoRetriesNextServer: 1 + OkToRetryOnAllOperations: false + +hystrix: + threadpool: + default: + coreSize: 1000 ##并发执行的最大线程数,默认10 + maxQueueSize: 1000 ##BlockingQueue的最大队列数 + queueSizeRejectionThreshold: 500 ##即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝 + command: + default: + execution: + isolation: + thread: + timeoutInMilliseconds: 10000 + +eureka: + instance: + statusPageUrlPath: /actuator/info + healthCheckUrlPath: /actuator/health + # docker 部署开启 + prefer-ip-address: true + ip-address: 127.0.0.1 + client: + serviceUrl: +# defaultZone: http://localhost:8761/eureka/ + # docker 部署开启 + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ + + + +jwt: + token-header: Authorization + expire: 14400 + rsa-secret: xx1WET12^%3^(WE45 + +client: + id: ace-auth + secret: 123456 + token-header: x-client-token + expire: 14400 + rsa-secret: x2318^^(*WRYQWR(QW&T + +logging: + level: +# tk.mybatis: DEBUG + com.github.wxiaoqi.security.auth: DEBUG \ No newline at end of file diff --git a/ace-auth/ace-auth-server/src/main/resources/mapper/ClientMapper.xml b/ace-auth/ace-auth-server/src/main/resources/mapper/ClientMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..7f479049ce3c5bcf0d94a3b80c55b5b3cd702c94 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/resources/mapper/ClientMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ace-auth/ace-auth-server/src/main/resources/mapper/ClientServiceMapper.xml b/ace-auth/ace-auth-server/src/main/resources/mapper/ClientServiceMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..1bb1b7795f37fd8789e896ab4d5876d8bc7982af --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/resources/mapper/ClientServiceMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + delete from auth_client_service where client_id = #{id} + + + \ No newline at end of file diff --git a/ace-auth/pom.xml b/ace-auth/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..df6a095b9f8f541d6a2ad92b49781c9badc53979 --- /dev/null +++ b/ace-auth/pom.xml @@ -0,0 +1,21 @@ + + + + ace-security + com.github.wxiaoqi + 2.0-SNAPSHOT + + 4.0.0 + + ace-auth + pom + + + ace-auth-client + ace-auth-server + ace-auth-common + + + \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-admin/db/init.sql b/ace-blog-parent/ace-blog-admin/db/init.sql deleted file mode 100644 index 68189de24f78f678e871a0d8e553d73968ec239d..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/db/init.sql +++ /dev/null @@ -1,62 +0,0 @@ - -CREATE DATABASE ag_blog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -Use ag_blog; -/* - Navicat Premium Data Transfer - - Source Server : ag-admin - Source Server Type : MySQL - Source Server Version : 50718 - Source Host : localhost - Source Database : ag_blog - - Target Server Type : MySQL - Target Server Version : 50718 - File Encoding : utf-8 - - Date: 07/19/2017 09:03:12 AM -*/ - -SET NAMES utf8; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for `blog_article` --- ---------------------------- -DROP TABLE IF EXISTS `blog_article`; -CREATE TABLE `blog_article` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `title` varchar(255) DEFAULT NULL, - `content` longtext, - `remark` varchar(1000) DEFAULT NULL, - `tag` varchar(255) DEFAULT NULL, - `is_del` char(1) DEFAULT NULL, - `page_view` int(11) DEFAULT '1', - `cover` varchar(255) DEFAULT NULL, - `crt_time` datetime DEFAULT NULL, - `crt_user` varchar(255) DEFAULT NULL, - `crt_name` varchar(255) DEFAULT NULL, - `crt_host` varchar(255) DEFAULT NULL, - `upd_time` datetime DEFAULT NULL, - `upd_user` varchar(255) DEFAULT NULL, - `upd_name` varchar(255) DEFAULT NULL, - `upd_host` varchar(255) DEFAULT NULL, - `attr1` varchar(255) DEFAULT NULL, - `attr2` varchar(255) DEFAULT NULL, - `attr3` varchar(255) DEFAULT NULL, - `attr4` varchar(255) DEFAULT NULL, - `attr5` varchar(255) DEFAULT NULL, - `attr6` varchar(255) DEFAULT NULL, - `attr7` varchar(255) DEFAULT NULL, - `attr8` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4; - --- ---------------------------- --- Records of `blog_article` --- ---------------------------- -BEGIN; -INSERT INTO `blog_article` VALUES ('44', 'Hello World', '# Hello World', 'Hello World', null, null, '1', null, '2017-07-16 17:11:29', '4', 'blog', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null, null, null, null, null), ('45', 'Spring cloud实战-Zuul如何动态负载和服务发现扩容', '

# Zuul、Fegin、Rebbion、Eureka一条龙

很多人都自然而然把zuul当成nginx那样来在配置写死节点配置来。实际上zuul和eureka的是可以完美配合,完全可以基于`服务名`的注册和发现,来动态的实现服务的`动态负载`和`动态注册`,从而达到`不需要重启zuul即可达到动态扩容的`。下文将介绍静态配置路由表和从Eureka发现服务的方式来加强Zuul的使用。

# 项目地址:

AG-Admin:http://git.oschina.net/geek_qi/ace-security


# GateWay搭建

![img](http://ofsc32t59.bkt.clouddn.com/17-06-27/1498551569658.jpg)

## Maven依赖

```

<dpendency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-zuul</artifactId>

</dependency>

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-feign</artifactId>

</dependency>

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

<dependency>

    <groupId>org.springframework.session</groupId>

    <artifactId>spring-session</artifactId>

    <version>1.2.2.RELEASE</version>

</dependency>

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-redis</artifactId>

</dependency>

```


## 基于Eureka的application.yml(关键)

```

spring:

    application:

        name: ace-gate

    thymeleaf:

        mode: LEGACYHTML5

        cache: false

    redis:

        database: 1

        host: 127.0.0.1

        pool:

            max-active: 20

server:

    port: 8765 #启动端口


#开启动态网关服务发现

ribbon:

  eureka:

    enabled: true 

    

#配置zuul路由表,静态路由

#zuul:

#  #prefix: /techouse #为zuul设置一个公共的前缀

#  #ignoredServices: \'*\'

#  routes:

#    ace-admin: #随便定义,当不存在serviceId时,默认该值为serviceId(就是注册服务的名称,属性spring.application.name)

#      path: /test/** #匹配/test/** 均路由到cloud-client

      

#基于静态路由节点的ribbon负载均衡配置

#ace-admin:

#  ribbon:

#    listOfServers: 127.0.0.1:8767 

    

eureka:

    instance:

        statusPageUrlPath: ${management.context-path}/info

        healthCheckUrlPath: ${management.context-path}/health

    client:

        serviceUrl:

            defaultZone: http://localhost:8761/eureka/

security:

    user:

        name: admin

        password: admin

        role: USER

#避免第一次调用失败

hystrix:

  command:

    default:

      execution:

        isolation:

          thread:

            timeoutInMilliseconds: 5000


#请求和响应GZIP压缩支持

feign:

  compression:

    request:

      enabled: true

      mime-types: text/xml,application/xml,application/json

      min-request-size: 2048

    response:

      enabled: true


```

## 启用Zuul、Fegin、Eureka注解

```

@SpringBootApplication

@EnableEurekaClient

@EnableDiscoveryClient

@EnableFeignClients

@EnableZuulProxy

@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)

public class GateBootstrap {

    public static void main(String[] args) {

        SpringApplication.run(GateBootstrap.class, args);

    }

}

```


## Zuul filter拦截示例代码

```

@Component

public class SessionAccessFilter extends ZuulFilter {

  private final Logger log = LoggerFactory.getLogger(SessionAccessFilter.class);


  @Autowired

  private SessionRepository<?> repository;

  @Autowired

  private IUserService userService;


  @Override

  public String filterType() {

    return \"pre\";

  }


  @Override

  public int filterOrder() {

    return 1;

  }


  @Override

  public boolean shouldFilter() {

    return true;

  }


  @Override

  public Object run() {

    RequestContext ctx = RequestContext.getCurrentContext();

    HttpSession httpSession = ctx.getRequest().getSession();

    if (不符合权限){

      setFailedRequest(\"<h1>Forbidden!</h1>\",403);

    }

    return null;

  }


  /**

   * 路由重定向

   *

   * @param body

   * @param code

   */

  private void setFailedRequest(String body, int code) {

    log.debug(\"Reporting error ({}): {}\", code, body);

    RequestContext ctx = RequestContext.getCurrentContext();

    ctx.setResponseStatusCode(code);

    if (ctx.getResponseBody() == null) {

      ctx.setResponseBody(body);

      ctx.setSendZuulResponse(false);

      throw new RuntimeException(\"Code: \" + code + \", \" + body); //optional

    }

  }

}

```


## 访问网关地址示例

```

[ip]:[zuul port]/[Eureak 注册服务]/[资源路径]

```


# Zuul兼容动态注册和静态路由表

## 核心思路

基于Eureka上注册另一个zuul,通过主的zuul gate way来分流到另外一个zuul,从而兼容静态路由的情况。

![img](http://ofsc32t59.bkt.clouddn.com/17-06-28/1498633239736.jpg)


 


', '很多人都自然而然把zuul当成nginx那样来在配置写死节点配置来。实际上zuul和eureka的是可以完美配合,完全可以基于`服务名`的注册和发现,来动态的实现服务的`动态负载`和`动态注册`,从而达到`不需要重启zuul即可达到动态扩容的`。下文将介绍静态配置路由表和从Eureka发现服务的方式来加强Zuul的使用。', null, null, '1', null, '2017-07-17 08:29:20', '4', 'Mr.AG', '0:0:0:0:0:0:0:1', '2017-07-17 12:08:03', '4', 'Mr.AG', '0:0:0:0:0:0:0:1', null, null, null, null, null, null, null, null); -COMMIT; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/api/ArticleRest.java b/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/api/ArticleRest.java deleted file mode 100644 index a86006073f85308a2b35040ae51c0db87997b214..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/api/ArticleRest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.wxiaoqi.blog.admin.api; - -import com.fasterxml.jackson.databind.util.JSONPObject; -import com.github.pagehelper.Page; -import com.github.pagehelper.PageHelper; -import com.github.wxiaoqi.blog.admin.biz.ArticleBiz; -import com.github.wxiaoqi.blog.admin.entity.Article; -import com.github.wxiaoqi.security.common.msg.ListRestResponse; -import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; -import com.github.wxiaoqi.security.common.msg.TableResultResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * Created by ace on 2017/7/16. - */ -@RestController -@RequestMapping("api/article") -public class ArticleRest { - @Autowired - private ArticleBiz articleBiz; - @RequestMapping(value = "/{id}",method = RequestMethod.GET) - public JSONPObject get(@PathVariable int id, String callback){ - return new JSONPObject(callback,new ObjectRestResponse
().rel(true).result(articleBiz.selectById(id))); - } - @RequestMapping(value = "/page",method = RequestMethod.GET, produces = "application/json;charset=UTF-8") - public JSONPObject get(int pageIndex, int pageSize, String callback){ - Page
objects = PageHelper.startPage(pageIndex, pageSize); - articleBiz.selectListAll(); - return new JSONPObject(callback, new ListRestResponse
().rel(true).count(objects.getTotal()).result(objects.getResult())); - } -} diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/biz/ArticleBiz.java b/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/biz/ArticleBiz.java deleted file mode 100644 index 06b8d04595400d8392eef9af75d644ef00989e88..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/biz/ArticleBiz.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.github.wxiaoqi.blog.admin.biz; - -import com.github.wxiaoqi.blog.admin.entity.Article; -import com.github.wxiaoqi.blog.admin.mapper.ArticleMapper; -import com.github.wxiaoqi.security.common.biz.BaseBiz; -import org.springframework.stereotype.Service; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-12 8:48 - */ -@Service -public class ArticleBiz extends BaseBiz { -} diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/MapperConfiguration.java b/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/MapperConfiguration.java deleted file mode 100644 index 86a3fcf8f4f44f1d8830931365dc5a1635270ff6..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/MapperConfiguration.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.wxiaoqi.blog.admin.config; - - -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.bind.RelaxedPropertyResolver; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import tk.mybatis.spring.mapper.MapperScannerConfigurer; - -/** - * mybatis mapper 扫描配置类 - * - * @author wanghaobin - * @date 2016年12月15日 - * @since 1.7 - */ -@Configuration -@AutoConfigureAfter(MybatisConfiguration.class) -public class MapperConfiguration implements EnvironmentAware { - - private RelaxedPropertyResolver propertyResolver; - - private String basePackage; - - @Bean - public MapperScannerConfigurer mapperScannerConfigurer(Environment environment){ - - MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); - mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); - mapperScannerConfigurer.setBasePackage(basePackage); - return mapperScannerConfigurer; - } - - - public void setEnvironment(Environment environment) { - this.propertyResolver = new RelaxedPropertyResolver(environment, null); - this.basePackage = propertyResolver.getProperty("mybatis.basepackage"); - } -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/MybatisConfiguration.java b/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/MybatisConfiguration.java deleted file mode 100644 index a458a1bcb51cdcb09a9cd6df9b53965b0f727a0d..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/MybatisConfiguration.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.github.wxiaoqi.blog.admin.config; - - -import com.alibaba.druid.pool.DruidDataSource; -import com.github.pagehelper.PageHelper; -import org.apache.commons.lang3.StringUtils; -import org.apache.ibatis.plugin.Interceptor; -import org.apache.ibatis.session.SqlSessionFactory; -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.SqlSessionTemplate; -import org.springframework.boot.bind.RelaxedPropertyResolver; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.sql.DataSource; -import java.sql.SQLException; -import java.util.Properties; - -/** - * mybatis 配置数据源类 - * - * @author wanghaobin - * @date 2016年12月15日 - * @since 1.7 - */ -@Configuration -@EnableTransactionManagement -public class MybatisConfiguration implements EnvironmentAware { - - - private RelaxedPropertyResolver propertyResolver; - - private String driveClassName; - private String url; - private String userName; - private String password; - private String xmlLocation; - private String typeAliasesPackage; - /////////////////////druid参数/////////////////////////////////////////////////// - private String filters; - private String maxActive; - private String initialSize; - private String maxWait; - private String minIdle; - private String timeBetweenEvictionRunsMillis; - private String minEvictableIdleTimeMillis; - private String validationQuery; - private String testWhileIdle; - private String testOnBorrow; - private String testOnReturn; - private String poolPreparedStatements; - private String maxOpenPreparedStatements; - ////////////////////////////////////////////////////////////////////////// - - @Bean - public DataSource druidDataSource() { - DruidDataSource druidDataSource = new DruidDataSource(); - druidDataSource.setUrl(url); - druidDataSource.setUsername(userName); - druidDataSource.setPassword(password); - druidDataSource.setDriverClassName(StringUtils.isNotBlank(driveClassName)?driveClassName:"com.mysql.jdbc.Driver"); - druidDataSource.setMaxActive(StringUtils.isNotBlank(maxActive)? Integer.parseInt(maxActive):10); - druidDataSource.setInitialSize(StringUtils.isNotBlank(initialSize)? Integer.parseInt(initialSize):1); - druidDataSource.setMaxWait(StringUtils.isNotBlank(maxWait)? Integer.parseInt(maxWait):60000); - druidDataSource.setMinIdle(StringUtils.isNotBlank(minIdle)? Integer.parseInt(minIdle):3); - druidDataSource.setTimeBetweenEvictionRunsMillis(StringUtils.isNotBlank(timeBetweenEvictionRunsMillis)? - Integer.parseInt(timeBetweenEvictionRunsMillis):60000); - druidDataSource.setMinEvictableIdleTimeMillis(StringUtils.isNotBlank(minEvictableIdleTimeMillis)? - Integer.parseInt(minEvictableIdleTimeMillis):300000); - druidDataSource.setValidationQuery(StringUtils.isNotBlank(validationQuery)?validationQuery:"select 'x'"); - druidDataSource.setTestWhileIdle(StringUtils.isNotBlank(testWhileIdle)? Boolean.parseBoolean(testWhileIdle):true); - druidDataSource.setTestOnBorrow(StringUtils.isNotBlank(testOnBorrow)? Boolean.parseBoolean(testOnBorrow):false); - druidDataSource.setTestOnReturn(StringUtils.isNotBlank(testOnReturn)? Boolean.parseBoolean(testOnReturn):false); - druidDataSource.setPoolPreparedStatements(StringUtils.isNotBlank(poolPreparedStatements)? Boolean.parseBoolean(poolPreparedStatements):true); - druidDataSource.setMaxOpenPreparedStatements(StringUtils.isNotBlank(maxOpenPreparedStatements)? Integer.parseInt(maxOpenPreparedStatements):20); - - try { - druidDataSource.setFilters(StringUtils.isNotBlank(filters)?filters:"stat, wall"); - } catch (SQLException e) { - e.printStackTrace(); - } - return druidDataSource; - } - - @Bean(name = "sqlSessionFactory") - public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) { - SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); - bean.setDataSource(dataSource); - if(StringUtils.isNotBlank(typeAliasesPackage)){ - bean.setTypeAliasesPackage(typeAliasesPackage); - } - //分页插件 - PageHelper pageHelper = new PageHelper(); - Properties properties = new Properties(); - properties.setProperty("reasonable", "true"); - properties.setProperty("supportMethodsArguments", "true"); - properties.setProperty("returnPageInfo", "check"); - properties.setProperty("params", "count=countSql"); - pageHelper.setProperties(properties); - //添加XML目录 - ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - Interceptor[] plugins = new Interceptor[]{pageHelper}; - bean.setPlugins(plugins); - try { - bean.setMapperLocations(resolver.getResources(xmlLocation)); - return bean.getObject(); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - @Bean - public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { - return new SqlSessionTemplate(sqlSessionFactory); - } - - public void setEnvironment(Environment environment) { - this.propertyResolver = new RelaxedPropertyResolver(environment, null); - this.url = propertyResolver.getProperty("spring.datasource.url"); - this.userName= propertyResolver.getProperty("spring.datasource.username"); - this.password = propertyResolver.getProperty("spring.datasource.password"); - this.driveClassName = propertyResolver.getProperty("spring.datasource.driver-class-name"); - this.filters = propertyResolver.getProperty("spring.datasource.filters"); - this.maxActive = propertyResolver.getProperty("spring.datasource.maxActive"); - this.initialSize = propertyResolver.getProperty("spring.datasource.initialSize"); - this.maxWait = propertyResolver.getProperty("spring.datasource.maxWait"); - this.minIdle = propertyResolver.getProperty("spring.datasource.minIdle"); - this.timeBetweenEvictionRunsMillis = propertyResolver.getProperty("spring.datasource.timeBetweenEvictionRunsMillis"); - this.minEvictableIdleTimeMillis = propertyResolver.getProperty("spring.datasource.minEvictableIdleTimeMillis"); - this.validationQuery = propertyResolver.getProperty("spring.datasource.validationQuery"); - this.testWhileIdle = propertyResolver.getProperty("spring.datasource.testWhileIdle"); - this.testOnBorrow = propertyResolver.getProperty("spring.datasource.testOnBorrow"); - this.testOnReturn = propertyResolver.getProperty("spring.datasource.testOnReturn"); - this.poolPreparedStatements = propertyResolver.getProperty("spring.datasource.poolPreparedStatements"); - this.maxOpenPreparedStatements = propertyResolver.getProperty("spring.datasource.maxOpenPreparedStatements"); - this.typeAliasesPackage = propertyResolver.getProperty("mybatis.typeAliasesPackage"); - this.xmlLocation = propertyResolver.getProperty("mybatis.xmlLocation"); - } - - @Bean - public DataSourceTransactionManager transactionManager(DataSource dataSource) { - return new DataSourceTransactionManager(dataSource); - } - -} diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/SwaggerConfiguration.java b/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/SwaggerConfiguration.java deleted file mode 100644 index 3b4b00e1f45b7b0146474b3a7e61896dbad4fc48..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/config/SwaggerConfiguration.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.github.wxiaoqi.blog.admin.config; - -import org.springframework.boot.bind.RelaxedPropertyResolver; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - * swagger配置项 - * - * @description - * @author wanghaobin - * @date 2017年6月20日 - * @since 1.7 - */ -@Configuration -@EnableSwagger2 -public class SwaggerConfiguration extends WebMvcConfigurerAdapter implements EnvironmentAware { - private String basePackage; - private String creatName; - private String serviceName; - private RelaxedPropertyResolver propertyResolver; - private String description; - /** - * 这个地方要重新注入一下资源文件,不然不会注入资源的,也没有注入requestHandlerMappping,相当于xml配置的 - * - * - * - * 不知道为什么,这也是spring boot的一个缺点(菜鸟觉得的) - * @param registry - */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("swagger-ui.html") - .addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars*") - .addResourceLocations("classpath:/META-INF/resources/webjars/"); - } - - - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) - .select() - .apis(RequestHandlerSelectors.basePackage(this.basePackage)) - .paths(PathSelectors.any()).build(); - } - - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title(this.serviceName+" Restful APIs") - .description(this.description) - .contact(this.creatName).version("1.0").build(); - } - - @Override - public void setEnvironment(Environment environment) { - this.propertyResolver = new RelaxedPropertyResolver(environment, null); - this.basePackage = propertyResolver.getProperty("swagger.basepackage"); - this.creatName = propertyResolver.getProperty("swagger.service.developer"); - this.serviceName = propertyResolver.getProperty("swagger.service.name"); - this.description = propertyResolver.getProperty("swagger.service.description"); - } -} diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/mapper/ArticleMapper.java b/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/mapper/ArticleMapper.java deleted file mode 100644 index fab5e35a6cb7bd9e3ed4c6cee50a2378cdc9911c..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/mapper/ArticleMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.wxiaoqi.blog.admin.mapper; - -import com.github.wxiaoqi.blog.admin.entity.Article; -import tk.mybatis.mapper.common.Mapper; - -public interface ArticleMapper extends Mapper
{ -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/rest/ArticleController.java b/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/rest/ArticleController.java deleted file mode 100644 index a360c2604768c6920cb9da99b578d6886aac95fe..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/rest/ArticleController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.github.wxiaoqi.blog.admin.rest; - -import com.github.pagehelper.PageHelper; -import com.github.wxiaoqi.blog.admin.biz.ArticleBiz; -import com.github.wxiaoqi.blog.admin.entity.Article; -import com.github.wxiaoqi.security.common.msg.TableResultResponse; -import com.github.wxiaoqi.security.common.rest.BaseController; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import tk.mybatis.mapper.entity.Example; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-08 11:51 - */ -@Controller -@RequestMapping("article") -public class ArticleController extends BaseController { - - @RequestMapping(value = "/page",method = RequestMethod.GET) - @ResponseBody - public TableResultResponse
page(int limit, int offset, String title){ - Example example = new Example(Article.class); - if(StringUtils.isNotBlank(title)) - example.createCriteria().andLike("title", "%" + title + "%"); - int count = baseBiz.selectCountByExample(example); - PageHelper.startPage(offset, limit); - return new TableResultResponse
(count,baseBiz.selectByExample(example)); - } - -} diff --git a/ace-blog-parent/ace-blog-admin/src/main/resources/application.yml b/ace-blog-parent/ace-blog-admin/src/main/resources/application.yml deleted file mode 100644 index a1e7dbcd80eefcd35bee3884361b3d59f8043ee6..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/resources/application.yml +++ /dev/null @@ -1,57 +0,0 @@ -logging: - level: - tk.mybatis: DEBUG - com.github.wxiaoqi.blog.admin: DEBUG - # config: classpath:logback.xml - # path: /ag/admin -spring: - application: - name: blog-admin - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: GMT+8 - default-property-inclusion: non_null -# boot: -# admin: -# url: http://localhost:8764 - datasource: - name: test - url: jdbc:mysql://localhost:3306/ag_blog?useUnicode=true&characterEncoding=UTF8 - username: root - password: 123456 - # 使用druid数据源 - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver - filters: stat - maxActive: 20 - initialSize: 1 - maxWait: 60000 - minIdle: 1 - timeBetweenEvictionRunsMillis: 60000 - minEvictableIdleTimeMillis: 300000 - validationQuery: select 'x' - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - poolPreparedStatements: true - maxOpenPreparedStatements: 20 -mybatis: - basepackage: com.github.wxiaoqi.blog.admin.mapper - xmlLocation: classpath:mapper/**/*.xml - -server: - port: 9701 - -eureka: - instance: - statusPageUrlPath: /info - healthCheckUrlPath: /health - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ -swagger: - basepackage: com.github.wxiaoqi.blog.admin - service: - name: Blog Admin - description: Blog Admin后端服务 - developer: 老A \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-admin/src/main/resources/mapper/ArticleMapper.xml b/ace-blog-parent/ace-blog-admin/src/main/resources/mapper/ArticleMapper.xml deleted file mode 100644 index 6eab0b0f30a88891c707368a3cabaa4fb5042d86..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-admin/src/main/resources/mapper/ArticleMapper.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/java/com/github/wxiaoqi/blog/ui/controller/HomeController.java b/ace-blog-parent/ace-blog-ui/src/main/java/com/github/wxiaoqi/blog/ui/controller/HomeController.java deleted file mode 100644 index 6179f66c3b2277146f4d1e36eb35a5a2234c6d61..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/java/com/github/wxiaoqi/blog/ui/controller/HomeController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.wxiaoqi.blog.ui.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; - -import java.util.Map; - -/** - * Created by ace on 2017/7/15. - */ -@Controller -public class HomeController { - @RequestMapping("/home") - public String home(){ - return "home"; - } - @RequestMapping("/about") - public String about(){ - return "about"; - } - @RequestMapping("/article") - public String article(){ - return "article"; - } - @RequestMapping("/detail/{id}") - public String detail(@PathVariable String id, Map map){ - map.put("articleId",id); - return "detail"; - } - @RequestMapping("/resource") - public String resource(){ - return "resource"; - } - @RequestMapping("/timeline") - public String timeline(){ - return "timeline"; - } - -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/application.yml b/ace-blog-parent/ace-blog-ui/src/main/resources/application.yml deleted file mode 100644 index ed6b841e15ade7f8822189a27c505e83394c10e2..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/application.yml +++ /dev/null @@ -1,17 +0,0 @@ -spring: - application: - name: blog-ui - thymeleaf: - mode: LEGACYHTML5 - cache: false - -server: - port: 9700 - -#eureka: -# instance: -# statusPageUrlPath: /info -# healthCheckUrlPath: /health -# client: -# serviceUrl: -# defaultZone: http://localhost:8761/eureka/ \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/about.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/about.css deleted file mode 100644 index 5a967ae2b3542f7bbec9229015d33c1463e5d278..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/about.css +++ /dev/null @@ -1,163 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ -.layui-tab-brief { - background: #fff; - min-height: 100vh; -} - - .layui-tab-brief .layui-tab-title { - text-align: center; - border-bottom: 1px solid #5FB878; - } - - .layui-tab-brief .layui-tab-title li { - font-size: 12px; - } - - .layui-tab-brief .layui-tab-content { - padding: 0; - } - -.aboutinfo { - text-align: center; - padding: 0 15px; -} - -.aboutinfo-figure { - display: inline-block; - margin: 20px auto; -} - - .aboutinfo-figure img { - border-radius: 50px; - } - -.aboutinfo-nickname { - font-size: 32px; - font-weight: bold; - margin: 0 0 15px 0; -} - -.aboutinfo-introduce { - margin: 20px auto; - font-size: 18px; - width: 90%; -} - -.aboutinfo-location { - color: #808080; - margin: 15px; -} - -.aboutinfo-contact { - margin: 15px; -} - - .aboutinfo-contact > a { - padding: 0 10px; - } - -.aboutinfo-abstract { - width: 90%; - margin: 0 auto; -} - - .aboutinfo-abstract > h1 { - font-weight: bold; - font-size: 16px; - text-align: left; - margin-top: 25px; - } - - .aboutinfo-abstract > p { - margin: 5px 0; - font-size: 14px; - text-align: left; - text-indent: 2em; - } - -#frinedlink { - display: none; /*手机端不显示友情链接,样式没写好,会乱*/ -} - -.friendlink { - padding: 0 15px; -} - - .friendlink li { - width: 30%; - margin: 0 1%; - margin-top: 10px; - float: left; - } - -.friendlink-item { - box-shadow: inset 0 0 2px #5FB878; - width: 100%; - display: block; - padding: 10px 0; - text-align: left; - min-height: 45px; - position: relative; -} - - .friendlink-item:hover { - box-shadow: 0 0 2px #5FB878; - } - -.friendlink-item-pic { - display: inline-block; - position: absolute; - left: 10%; - margin: 0 10px; -} - - .friendlink-item-pic img { - width: 45px; - height: 45px; - position: relative; - left: 0px; - border-radius: 50px; - } - -.friendlink-item-title { - font-size: 17px; - margin-left: 65px; - text-align: center; - line-height: 20px; -} - -.friendlink-item-domain { - font-size: 13px; - margin-left: 65px; - text-align: center; - line-height: 20px; - margin-top: 5px; -} - -.leavemessage .blog-comment li:first-child { - border-top: 1px dotted #01AAED; -} - -/* 小屏幕(平板,大于等于 768px) */ -@media (min-width: 768px) { - .layui-tab-brief .layui-tab-title li { - font-size: 14px; - } - - #frinedlink { - display: inline-block; - } -} - -/* 中等屏幕(桌面显示器,大于等于 992px) */ -@media (min-width: 992px) { - .blog-container { - width: 962px; - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/animate.min.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/animate.min.css deleted file mode 100644 index b84c3c1296905bcfdcac1b5341bade5399976a5e..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/animate.min.css +++ /dev/null @@ -1,6 +0,0 @@ -@charset "UTF-8";/*! -Animate.css - http://daneden.me/animate -Licensed under the MIT license - http://opensource.org/licenses/MIT - -Copyright (c) 2013 Daniel Eden -*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);-ms-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);-ms-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);-ms-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);-ms-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);-ms-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);-ms-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);-ms-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);-ms-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);-ms-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);-ms-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);-ms-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);-ms-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);-ms-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);-ms-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;-ms-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);-ms-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);-ms-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);-ms-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);-ms-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);-ms-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);-ms-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);-ms-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);-ms-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);-ms-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);-ms-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);-ms-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);-ms-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);-ms-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);-ms-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);-ms-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);-ms-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);-ms-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);-ms-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);-ms-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);-ms-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);-ms-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);-ms-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;-ms-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);-ms-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);-ms-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);-ms-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);-ms-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);-ms-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);-ms-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);-ms-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);-ms-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);-ms-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);-ms-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);-ms-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);-ms-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);-ms-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);-ms-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);-ms-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);-ms-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);-ms-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/article.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/article.css deleted file mode 100644 index 36b18b0aecd80812f4f95243443f1aba19ba95ea..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/article.css +++ /dev/null @@ -1,60 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -/*搜索(移动端不提供此功能)*/ -.search-keywords, -.search-submit { - display: none; -} - -@media (min-width: 992px) { - .blog-search { - margin-bottom: 15px; - } - - .search-keywords, - .search-submit { - display: inline-block; - } - - .search-keywords { - width: 85%; - float: left; - } - - .search-keywords > input { - border-radius: 0; - } - - .search-submit { - width: 14%; - float: right; - } - - .search-submit > .search-btn { - display: block; - width: 100%; - height: 36px; - background: #fff; - cursor: pointer; - float: right; - border-radius: 1px; - border: 1px solid #e2e2e2; - } - - .search-submit > .search-btn:hover { - border: 1px solid #d2d2d2; - } - - .search-submit > .search-btn i { - width: 13px; - line-height: 38px; - display: block; - margin: 0 auto; - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/detail.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/detail.css deleted file mode 100644 index df1d575efdc898819f98c4bdea8ddbd74005f95c..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/detail.css +++ /dev/null @@ -1,49 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -.article-detail { - background: #fff; - padding: 15px; - box-shadow: 0 1px 8px #a6a6a6; - margin-bottom: 15px; -} - -.article-detail-title { - text-align: center; - margin: 20px 0px; - color: #1AA094; - font-weight: 700; - text-shadow: 0 0 8px white; - font-size: 28px; -} - -.article-detail-info { - border: 1px dashed #808080; - font-size: 13px; - color: #808080; - padding: 5px 0; - font-family: SimSun; - text-align: center; - margin: 0 0 10px; -} - -.article-detail-info span { - margin: 0 5px; -} - -.article-detail-content { - padding: 10px 5px; -} - -/*代码区域*/ -pre { - background-color: #f5f5f5 !important; - border-radius: 0px !important; - border: 1px solid #ccc !important; - font-size: 13px !important; -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/global.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/global.css deleted file mode 100644 index 0ccec77c302fa239de40924226b26fd0836f61a1..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/global.css +++ /dev/null @@ -1,1119 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -/*全局样式*/ -body { - background: #eee; - color: #444; -} - -.shadow { - box-shadow: 0 2px 10px 0 rgba(0,0,0,.1); -} - -.clear { - clear: both; -} - -.blog-body { - margin-top: 65px; -} - -.blog-container { - margin: 0 15px; - position: relative; -} - -.blog-main { - margin-top: 15px; - width: 100%; - position: relative; - min-height: 100vh; -} - - .blog-main > .home-tips { - padding: 10px 10px; - background: #fff; - font-size: 13px; - margin-bottom: 15px; - } - - .blog-main > .home-tips > i { - color: #009688; - font-size: 15px; - } - - .blog-main > .home-tips > .home-tips-container { - margin-left: 20px; - height: 17px; - overflow: hidden; - } - - .blog-main > .home-tips > .home-tips-container > span { - display: block; - } - - .blog-main > .blog-main-left { - width: 100%; - float: left; - } - - .blog-main > .blog-main-right { - width: 100%; - float: right; - } - -/* 小屏幕(平板,大于等于 768px) */ -@media (min-width: 768px) { - .blog-container { - width: 738px; - margin: 0 auto; - } - - .blog-main > .blog-main-right > .blog-module { - width: 45%; - margin-bottom: 15px; - } - - .blog-main > .blog-main-right > .blog-module:nth-child(odd) { - float: left; - clear: left; - } - - .blog-main > .blog-main-right > .blog-module:nth-child(odd).blog-module:last-child { - width: auto; - float: none; - clear: both; - } - - .blog-main > .blog-main-right > .blog-module:nth-child(even) { - float: right; - clear: right; - } -} - -/* 中等屏幕(桌面显示器,大于等于 992px) */ -@media (min-width: 992px) { - .blog-container { - width: 962px; - } - - .blog-main > .blog-main-left { - width: 66%; - } - - .blog-main > .blog-main-right { - width: 32%; - } - - .blog-main > .blog-main-right > .blog-module { - width: auto; - float: none !important; - } -} - -/* 大屏幕(大桌面显示器,大于等于 1200px) */ -@media (min-width: 1200px) { - .blog-container { - width: 1170px; - } -} -/*全局样式END*/ - -/*面包屑导航*/ -.sitemap { - background: #fff; - margin-top: 79px; - padding: 5px 15px; - line-height: normal; - border-radius: 0 !important; -} - - .sitemap a { - font-size: 12px; - } - -@media (min-width: 768px) { - .sitemap { - padding: 6px 15px; - } - - .sitemap a { - font-size: 13px; - } -} - -@media (min-width: 992px) { - .sitemap { - padding: 8px 15px; - } - - .sitemap a { - font-size: 14px; - } -} -/*面包屑导航END*/ - -/*顶部导航*/ -.blog-nav { - width: 100%; - height: 64px; - position: fixed; - top: 0; - background-color: #393D49; - border-bottom: 1px solid #5FB878; -} - - .blog-nav .layui-nav { - position: absolute; - top: 0; - left: 15%; - width: 85%; - background: none; - display: none; - text-align: center; - } - - .blog-nav .layui-nav .layui-nav-item { - line-height: 64px; - margin: 0 5px; - } - - .blog-nav .layui-nav .layui-nav-item a { - padding: 0 15px; - } - - .blog-nav .blog-user { - line-height: 64px; - position: absolute; - z-index: 10; - } - - .blog-nav .blog-user img { - width: 40px; - height: 40px; - border-radius: 50px; - } - - .blog-nav .blog-user img:hover { - opacity: .5; - } - - .blog-nav .blog-user .fa-qq { - line-height: 64px; - font-size: 24px; - color: #c2c2c2; - } - - .blog-nav .blog-user .fa-qq:hover { - color: #fff; - } - - - .blog-nav .blog-logo { - position: absolute; - top: 0px; - left: 25%; - width: 50%; - text-align: center; - margin: 0 auto; - line-height: 64px; - font-size: 30px; - color: white; - font-weight: bold; - font-family: KaiTi; - display: inline-block; - z-index: 10; - } - - .blog-nav .blog-navicon { - position: absolute; - right: 0; - padding: 10px 12px; - color: white; - border: 1px solid #009688; - margin-top: 13px; - } - - .blog-nav .blog-navicon:hover { - border: 1px solid #5FB878; - } - -@media (min-width: 992px) { - .blog-nav .layui-nav { - display: block; - } - - .blog-nav .blog-user { - right: 0; - } - - .blog-nav .blog-logo { - position: absolute; - left: 10%; - width: auto; - } - - .blog-nav .blog-navicon { - display: none; - } - - .blog-nav-left { - display: none !important; - } -} -/* 顶部导航End */ - -/*网站底部*/ -.blog-footer { - text-align: center; - border-top: 1px solid #009688; - margin-top: 15px; - background: #2F4056; - padding: 5px 0; - color: #d3d2d2; -} - - .blog-footer a { - color: #d2d2d2; - } - - .blog-footer a:hover { - color: #fbfbfb; - } - - .blog-footer > p { - margin: 2px 0; - } - - .blog-footer > p a, - .blog-footer > p span { - padding-left: 7px; - } -/*网站底部END*/ - -/*子栏目导航*/ -.child-nav { - margin: 15px 0; - text-align: center; - height: 39px; - background: #fff; - border-bottom: 1px solid #5FB878; -} - -.child-nav-btn { - padding: 0 20px; - width: auto; - font-size: 14px; - line-height: 40px; - display: inline-block; - cursor: pointer; -} - -.child-nav-btn-this { - background: #5FB878; - color: #fff; -} -/*子栏目导航END*/ - -/*侧边导航*/ -.blog-nav-left { - top: 65px; - border-radius: 0; - border-top: 1px solid #5FB878; - box-shadow: 0 0 8px #fff; -} - -.leftIn { - -moz-animation: leftIn 0.5s; - -o-animation: leftIn 0.5s; - -webkit-animation: leftIn 0.5s; - animation: leftIn 0.5s; -} - -.leftOut { - -moz-animation: leftOut 0.5s; - -o-animation: leftOut 0.5s; - -webkit-animation: leftOut 0.5s; - animation: leftOut 0.5s; -} - -@media (min-width: 992px) { - .blog-nav-left { - display: none !important; - } -} -/*侧边导航END*/ - -/*侧边导航遮罩*/ -.blog-mask { - position: fixed; - left: 0; - right: 0; - top: 65px; - bottom: 0; - background: rgba(0, 0, 0, 0.7); - z-index: 998; -} - -.maskIn { - -moz-animation: maskFadeIn 0.5s; - -o-animation: maskFadeIn 0.5s; - -webkit-animation: maskFadeIn 0.5s; - animation: maskFadeIn 0.5s; -} - -.maskOut { - -moz-animation: maskFadeOut 0.5s; - -o-animation: maskFadeOut 0.5s; - -webkit-animation: maskFadeOut 0.5s; - animation: maskFadeOut 0.5s; -} - -@media (min-width: 992px) { - .blog-mask { - display: none; - } -} -/*侧边导航遮罩END*/ - -/*百度分享*/ -.blog-share { - box-shadow: 0 0 8px #fff; - position: fixed; - right: 80px; - bottom: 15px; - background: #393D49; - z-index: 999; - margin-bottom: 1px; - height: 50px; -} - - .blog-share .blog-share-body { - width: 100%; - height: 100%; - } - -.bdsharebuttonbox { - height: 100%; -} - - .bdsharebuttonbox a { - float: left; - margin: 9px !important; - background-position: 0 !important; - } - - .bdsharebuttonbox .bds_qzone { - background: url(../images/qzone_32.png) no-repeat; - } - - .bdsharebuttonbox .bds_tsina { - background: url(../images/weibo_32.png) no-repeat; - } - - .bdsharebuttonbox .bds_weixin { - background: url(../images/wechat_32.png) no-repeat; - } - - .bdsharebuttonbox .bds_sqq { - background: url(../images/qq_32.png) no-repeat; - } - -.shareIn { - -moz-animation: shareIn 0.5s; - -o-animation: shareIn 0.5s; - -webkit-animation: shareIn 0.5s; - animation: shareIn 0.5s; -} - -.shareOut { - -moz-animation: shareOut 0.5s; - -o-animation: shareOut 0.5s; - -webkit-animation: shareOut 0.5s; - animation: shareOut 0.5s; -} -/*百度分享END*/ - -/*文章列表(网站首页和文章专栏共用)*/ -.article { - padding: 15px; - margin-bottom: 10px; - background: #fff; - border-left: 5px solid #fff; - -moz-transition: all 0.3s linear; - -o-transition: all 0.3s linear; - -webkit-transition: all 0.3s linear; - transition: all 0.3s linear; -} - - .article:hover { - border-left: 5px solid #009688; - -moz-transition: all 0.3s linear; - -o-transition: all 0.3s linear; - -webkit-transition: all 0.3s linear; - transition: all 0.3s linear; - } - - .article > .article-left { - width: 25%; - float: left; - } - - .article > .article-left > img { - width: 100%; - height: auto; - } - - .article > .article-right { - width: 73%; - float: right; - padding-left: 2%; - } - - .article > .article-right > .article-title a { - font-size: 14px; - } - - .article > .article-right > .article-title a:hover { - color: #009688; - } - - .article > .article-right > .article-abstract { - display: none; - } - - .article > .article-footer { - margin-top: 5px; - font-size: 11px; - padding: 2px; - color: #a6a6a6; - } - - .article > .article-footer > span { - padding-right: 3%; - } - - .article > .article-footer a { - color: #009688; - } - - .article > .article-footer .article-viewinfo, - .article > .article-footer .article-author { - display: none; - } - -.icon-stick { - border: 1px solid #FF5722; - color: #FF5722; - padding: 0 2px 0 0; - font-family: SimHei; - display: inline-block; - margin-right: 3px; - position: relative; - top: -1px; - font-size: 13px; -} - -@media (min-width: 768px) { - .article > .article-right > .article-title a { - font-size: 17px; - } - - .article > .article-right > .article-abstract { - font-size: 14px; - display: block; - margin-top: 10px; - text-indent: 2em; - } - - .article > .article-footer { - margin-top: 10px; - font-size: 13px; - } - - .article > .article-footer .article-viewinfo { - display: inline; - float: right; - } - - .article > .article-footer .article-author { - display: inline; - } - - .icon-stick { - font-size: 14px; - } -} - -@media (min-width: 992px) { - .article > .article-right > .article-title a { - font-size: 18px; - } - - .icon-stick { - font-size: 15px; - } -} -/*文章列表END*/ - -/*右侧模块(网站首页和文章列表以及文章详细共用)*/ -.blog-module { - margin-bottom: 10px; - padding: 15px; - background: #fff; - height: 100%; -} - - .blog-module > .blog-module-title { - border-bottom: 1px solid #009688; - font-size: 15px; - font-weight: 500; - padding: 0 0 5px 0; - margin-bottom: 5px; - } - -.blog-module-ul li, -.blog-module-ul .fa { - margin: 3px 0; -} - - .blog-module-ul li .fa { - color: #009688; - } -/*右侧模块END*/ - -/*文章分类导航*/ -.article-category { - position: fixed; - top: 64px; - right: 0; - bottom: 0; - background: #393D49; - color: #eee; - width: 130px; - font-size: 11px; - padding: 10px; - display: none; - margin: 0; - z-index: 999; -} - - .article-category > .article-category-title { - text-align: center; - border-bottom: 1px solid #009688; - font-size: 15px; - font-weight: 500; - padding: 0 0 5px 0; - margin-bottom: 5px; - } - - .article-category > a { - display: block; - color: #eee; - padding: 5px 1%; - margin: 4px 0; - background: #009688; - width: 98%; - text-align: center; - line-height: 19px; - word-break: keep-all; /* 不换行 */ - white-space: nowrap; /* 不换行 */ - overflow: hidden; /* 内容超出宽度时隐藏超出部分的内容 */ - text-overflow: ellipsis; /* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/ - float: left; - } - - .article-category > a:hover { - color: #fff; - background: #5FB878; - } - -.category-toggle { - position: fixed; - right: 0; - top: 40%; - width: 15px; - background: #009688; - color: #fff; - font-size: 16px; - padding: 30px 0; - z-index: 9999; -} - - .category-toggle > i { - display: block; - height: 16px; - } - -.categoryIn { - -moz-animation: categoryIn 0.5s; - -o-animation: categoryIn 0.5s; - -webkit-animation: categoryIn 0.5s; - animation: categoryIn 0.5s; -} - -.categoryOut { - -moz-animation: categoryOut 0.5s; - -o-animation: categoryOut 0.5s; - -webkit-animation: categoryOut 0.5s; - animation: categoryOut 0.5s; -} - -/*分类导航In动画*/ -@keyframes categoryIn { - from { - right: -140px; - } - - to { - right: 0; - } -} - -@-moz-keyframes categoryIn { - from { - right: -140px; - } - - to { - right: 0; - } -} - -@-webkit-keyframes categoryIn { - from { - right: -140px; - } - - to { - right: 0; - } -} - -/*分类导航Out动画*/ -@keyframes categoryOut { - from { - right: 0; - } - - to { - right: -140px; - } -} - -@-moz-keyframes categoryOut { - from { - right: 0; - } - - to { - right: -140px; - } -} - -@-webkit-keyframes categoryOut { - from { - right: 0; - } - - to { - right: -140px; - } -} - -@media (min-width: 768px) { - .article-category { - font-size: 13px; - width: 260px !important; - } - - .article-category > .blog-module-title { - text-align: start; - } - - .article-category > a { - padding: 7px 1%; - margin: 5px 0; - width: 46%; - } - - .article-category > a:nth-child(odd) { - float: right; - } - - .article-category > a:nth-child(even) { - float: left; - } - - @keyframes categoryIn { - from { - right: -280px; - } - - to { - right: 0; - } - } - - @-moz-keyframes categoryIn { - from { - right: -280px; - } - - to { - right: 0; - } - } - - @-webkit-keyframes categoryIn { - from { - right: -280px; - } - - to { - right: 0; - } - } - - @keyframes categoryOut { - from { - right: 0; - } - - to { - right: -280px; - } - } - - @-moz-keyframes categoryOut { - from { - right: 0; - } - - to { - right: -280px; - } - } - - @-webkit-keyframes categoryOut { - from { - right: 0; - } - - to { - right: -280px; - } - } -} - -@media (min-width: 992px) { - .article-category { - display: block; - position: initial; - background: #fff; - color: #333; - width: auto !important; - font-size: 14px; - margin: 0 0 15px 0; - } - - .article-category a { - background: inherit; - border: 1px solid #d2d2d2; - color: #444; - } - - .article-category a:hover { - border: 1px solid #5FB878; - background: inherit; - color: #5FB878; - } - - .category-toggle { - display: none; - } -} -/*文章分类导航END*/ - -/*评论与留言*/ -.blog-comment { - position: relative; - margin-bottom: 10px; -} - - .blog-comment li { - border-bottom: 1px dotted #01AAED; - padding: 15px 0 10px 0; - } - - .blog-comment .content, - .blog-comment .info, - .blog-comment .replycontainer { - margin-left: 53px; - } - - .blog-comment .info-footer { - font-size: 13px; - } - - .blog-comment .info, - .blog-comment .replycontainer { - padding-top: 5px; - } - - .blog-comment .replycontainer .layui-form-item { - margin-bottom: 5px; - } - - .blog-comment .info span { - padding-right: 5px; - } - - .blog-comment .info .username { - color: #01AAED; - } - - .blog-comment .info .btn-reply { - color: #009688; - } - - .blog-comment .content { - padding: 2px 0 5px 0; - min-height: 30px; - font-size: 13px; - } - - .blog-comment hr { - margin-left: 53px; - } - -.comment-parent > img { - width: 45px; - height: 45px; - margin: 5px 5px 5px 0; - position: absolute; - border-radius: 50px; -} - -.comment-child img { - width: 40px; - height: 40px; - margin: 5px 5px 5px 0; - position: absolute; - border-radius: 50px; -} - -.comment-child { - margin-left: 53px; - min-height: 50px; -} - - .comment-child .info { - margin-left: 48px; - font-size: 12px; - line-height: 20px; - } -/*评论与留言END*/ - - - - - - - - - - - -/***********************************************动画定义*************************************************/ -/*侧边导航In动画*/ -@keyframes leftIn { - from { - left: -200px; - } - - to { - left: 0; - } -} - -@-moz-keyframes leftIn { - from { - left: -200px; - } - - to { - left: 0; - } -} - -@-webkit-keyframes leftIn { - from { - left: -200px; - } - - to { - left: 0; - } -} - -/*侧边导航Out动画*/ -@keyframes leftOut { - from { - left: 0; - } - - to { - left: -200px; - } -} - -@-moz-keyframes leftOut { - from { - left: 0; - } - - to { - left: -200px; - } -} - -@-webkit-keyframes leftOut { - from { - left: 0; - } - - to { - left: -200px; - } -} - -/*分享In动画*/ -@keyframes shareIn { - from { - right: -200px; - } - - to { - right: 80px; - } -} - -@-moz-keyframes shareIn { - from { - right: -200px; - } - - to { - right: 80px; - } -} - -@-webkit-keyframes shareIn { - from { - right: -200px; - } - - to { - right: 80px; - } -} - -/*分享Out动画*/ -@keyframes shareOut { - from { - right: 80px; - } - - to { - right: -200px; - } -} - -@-moz-keyframes shareOut { - from { - right: 80px; - } - - to { - right: -200px; - } -} - -@-webkit-keyframes shareOut { - from { - right: 80px; - } - - to { - right: -200px; - } -} - -/*淡入动画*/ -@keyframes maskFadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@-moz-keyframes maskFadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@-webkit-keyframes maskFadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -/*淡出动画*/ -@keyframes maskFadeOut { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -@-moz-keyframes maskFadeOut { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -@-webkit-keyframes maskFadeOut { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/home.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/home.css deleted file mode 100644 index a4f2ddded7b0e6febd747aaca2d6af452c84423c..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/home.css +++ /dev/null @@ -1,70 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -/*博主信息*/ -.blogerinfo { - text-align: center; - padding: 0 15px; - background: #fff; - margin-bottom: 15px; -} - -.blogerinfo-figure { - display: inline-block; - margin: 20px auto; -} - - .blogerinfo-figure img { - border-radius: 50px; - } - -.blogerinfo-nickname { - font-size: 32px; - font-weight: bold; - margin: 0 0 15px 0; -} - -.blogerinfo-introduce { - margin: 15px auto; - font-size: 18px; - width: 90%; -} - -.blogerinfo-location { - color: #808080; - margin: 15px; -} - -.blogerinfo-contact { - padding: 15px; - padding-top: 5px; -} - - .blogerinfo-contact > a { - padding: 0 10px; - } -/*博主信息END*/ - -/*友情链接*/ -.blogroll > li { - display: inline-block; - vertical-align: middle; - padding: 2px 5px; -} -/*友情链接END*/ - -/*一路走来和后台记录*/ -.footprint > dt { - color: #01AAED; -} - -.footprint > dd { - text-indent: 1.3em; - padding: 2px 0; -} -/*一路走来和后台记录END*/ \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/markdown.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/markdown.css deleted file mode 100755 index 77924aab993f8f10b9f619678dba3390ebdf59ee..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/markdown.css +++ /dev/null @@ -1,175 +0,0 @@ -.layui-markdown { - -} -.layui-markdown ul, -.layui-markdown ol { - padding: 0; -} - -.layui-markdown p { - line-height: 200%; - color: #636363; -} -.layui-markdown a { - color: #B34E22; -} -.layui-markdown a:hover { - color: #009688; -} - -.layui-markdown h1, -.layui-markdown h2, -.layui-markdown h3, -.layui-markdown h4, -.layui-markdown h5, -.layui-markdown h6 { - color: #0B8CD6; - font-weight: 500; -} - -.layui-markdown h1 { - color: #0B8CD6; - margin: 35px 0 15px; - font-size: 30px; -} - -.layui-markdown h2 { - margin: 30px 0 15px; - font-size: 26px; -} - -.layui-markdown h3 { - margin-top: 20px; - font-size: 21px; - font-weight: 200; - line-height: 1.5; -} - -.layui-markdown h4 { - margin-top: 10px; - font-size: 18px; - line-height: 1.5; -} -.layui-markdown h5, -.layui-markdown h6 { - font-size: 16px; -} -.layui-markdown h5 { - margin-top: 10px; -} -.layui-markdown h6 { - margin-top: 5px; -} - -.layui-markdown ul li { - list-style: disc; - margin-left: 30px; - color: #009688; -} -.layui-markdown ol li { - list-style: decimal; - margin-left: 30px; - color: #009688; -} - -.layui-markdown hr { - border: 0; - border-bottom: 1px dashed #cfcfcf; - background: none; - margin: 30px 0; - clear: none; -} - -.layui-markdown blockquote { - padding: 8px 5px 8px 15px; - color: #777; - background: rgba(102,128,153,.05); - border-left: 4px solid #009688; - margin-top: 10px; - margin-bottom: 20px; -} -.layui-markdown pre { - padding: 16px; - overflow: auto; - font-size: 85%; - line-height: 1.5; - background-color: #F2F2F2; - border: 0; - border-radius: 3px; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin-bottom: 5px; - margin-top: 10px; -} - -.layui-markdown p code { - padding: 3px 6px 4px; - font-size: 90%; - background-color: rgb(251, 220, 182); - border: 0; - border-radius: 3px; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; -} - -.layui-markdown code { - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; -} - - -.layui-markdown img { - max-width: 100%; - border: 1px solid #fefefe; - box-shadow: rgba(0,0,0,0.35) 0px 0px 10px; - margin-top: 10px; - margin-bottom: 10px; -} -.article-show .layui-markdown img { - cursor: url("/public/img/zoom-in.ico"), default; -} -img.zoom-out { - max-width: 100%; -} -.layui-markdown img.face { - border: none; - box-shadow: none; - margin: 0 1px; -} - -.layui-markdown .footnote-ref { - vertical-align: baseline; - top: -2px; - font-size: 75%; - line-height: 0; - position: relative; -} - -/* table */ -.layui-markdown table { - border-collapse: collapse; - border-spacing: 0; - display: block; - width: 100%; - overflow: auto; - word-break: keep-all; - margin-top: 20px; -} -.layui-markdown table thead tr{ - background: #F2F2F2; -} -.layui-markdown table th, -.layui-markdown table td { - padding: 5px 15px; - border: 1px solid #ddd; -} -.layui-markdown table th { - font-weight: bold; -} -.layui-markdown table > tbody > tr:nth-child(odd) { - background: #fff; -} -.layui-markdown table > tbody > tr:nth-child(even) { - background: #F2F2F2; -} - -.layui-markdown .hljs-tag{ - color: #5f5f2b; -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/prettify.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/prettify.css deleted file mode 100644 index f61520d0345e243c31bdc88844b9364a911c63a0..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/prettify.css +++ /dev/null @@ -1,32 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} - -pre.prettyprint { - border: 1px solid #f2f2f2; - border-radius:5px; - margin-left: 2em; - padding: 0.5em; - font-size: 110%; - display: block; - font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; - margin: 1em 0px; - /*white-space: pre;*/ - background:#f7f7f7; -} - -/*li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:decimal !important;}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} - -.prettyprint.linenums { - -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; -} - -ol.linenums { - padding: 0 0 0 33px; -} -ol.linenums li { - padding-left: 12px; - color: #bebec5; - line-height: 18px; - text-shadow: 0 1px 0 #fff; -}*/ \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/resource.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/resource.css deleted file mode 100644 index 7308469e521f8765c68f5be36de2effd9a0bfd64..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/resource.css +++ /dev/null @@ -1,196 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -.resource { - width: 49%; - margin: 0 1%; - margin-bottom: 10px; - background: #fff; - height: 270px; - float: left; - padding: 8px 8px; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - position: relative; -} - -.resource-main .resource:nth-child(odd) { - margin-left: 0; -} - -.resource-main .resource:nth-child(even) { - margin-right: 0; -} - -.resource-cover { - width: 100%; - height: 92px; - text-align: center; -} - - .resource-cover a { - display: inline-block; - width: 100%; - height: 100%; - border: 1px solid #ddd; - -moz-transition: all 1s; - -o-transition: all 1s; - -webkit-transition: all 1s; - transition: all 1s; - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - - .resource-cover a:hover { - opacity: .7; - border: 1px solid #5FB878; - } - - .resource-cover img { - width: 100%; - height: 100%; - } - -.resource-title { - text-align: center; - padding: 5px 0; - margin-top: 7px; - margin-bottom: 5px; -} - - .resource-title > a { - font-size: 16px; - font-weight: bold; - line-height: 18px; - color: #01AAED; - } - - .resource-title > a:hover { - color: #1E9FFF; - } - -.resource-abstract { - padding: 3px; - text-align: center; - font-size: smaller; - color: #838383; - height: 50px; - overflow: hidden; -} - -.resource-info { - font-size: smaller; - position: absolute; - bottom: 50px; - left: 0; - right: 0; - padding: 2px 10px; -} - - .resource-info .category { - float: left; - } - - .resource-info .author { - float: right; - } - -.resource-footer { - font-size: small; - border-top: 1px solid #e7e7e7; - box-shadow: 0 1px 0 0 #fff inset; - color: #8B8B8C; - height: 50px; - position: absolute; - bottom: 0; - left: 0; - right: 0; - padding: 0 10px; - line-height: 50px; - text-align: center; -} - - .resource-footer a:nth-child(2) { - display: none; - } - - .resource-footer i { - font-size: 12px !important; - } - - -/* 小屏幕(平板,大于等于 768px) */ -@media (min-width: 768px) { - .resource { - width: 32%; - margin: 0 1%; - margin-bottom: 10px; - height: 320px; - } - - .resource-main .resource:nth-child(odd) { - margin-left: 1%; - } - - .resource-main .resource:nth-child(even) { - margin-right: 1%; - } - - .resource-main .resource:nth-child(3n+1) { - margin-left: 0; - } - - .resource-main .resource:nth-child(3n+3) { - margin-right: 0; - } - - .resource-cover { - width: 100%; - height: 150px; - text-align: center; - } - - .resource-footer a:nth-child(2) { - display: inline-block; - } -} - -/* 中等屏幕(桌面显示器,大于等于 992px) */ -@media (min-width: 992px) { - .resource { - width: 23.5%; - margin: 0 1%; - margin-bottom: 10px; - } - - .resource-main .resource:nth-child(odd) { - margin-left: 1%; - } - - .resource-main .resource:nth-child(even) { - margin-right: 1%; - } - - .resource-main .resource:nth-child(3n+1) { - margin-left: 1%; - } - - .resource-main .resource:nth-child(3n+3) { - margin-right: 1%; - } - - .resource-main .resource:nth-child(4n+1) { - margin-left: 0; - } - - .resource-main .resource:nth-child(4n) { - margin-right: 0; - } -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/timeline.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/timeline.css deleted file mode 100644 index df778d4019e369258c59bb66ef42d5beee578277..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/css/timeline.css +++ /dev/null @@ -1,220 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -.timeline-box { - background: #fff; - padding: 8px; - position: relative; - min-height: 90vh; -} - -.timeline-main { - position: relative; - min-height: 85vh; -} - - .timeline-main > h1 { - font-size: 18px; - background: #fff; - z-index: 1; - position: relative; - color: #009688; - margin-left: 33%; /*写给不支持calc()的浏览器*/ - margin-left: -moz-calc(35% - 7px); - margin-left: -webkit-calc(35% - 7px); - margin-left: calc(35% - 7px); - } - - .timeline-main > h1 > i { - padding-right: 10px; - font-size: 20px; - } - - .timeline-main > h1 > span { - display: none; - } - - .timeline-main h2, - .timeline-main h3 { - width: 31%; - text-align: right; - } - - .timeline-main h2, - .timeline-main h2 > a { - font-size: 16px; - margin: 5px 0; - color: #1E9FFF; - } - - .timeline-main h3, - .timeline-main h3 > a { - font-size: 14px; - margin: 2px 0; - color: #FF5722; - } - -.timeline-month > ul > li { - padding: 10px 0; -} - - .timeline-month > ul > li .h4 { - display: inline-block; - width: 31%; - text-align: right; - float: left; - } - -.date { - display: inline-block; - padding: 2px 5px; - color: #009688; -} - -.dot-circle { - color: #009688; - width: 8%; - text-align: center; - font-size: 22px; - z-index: 1; - position: relative; - background: #fff; - float: left; -} - -.content { - max-width: 50%; - float: left; - padding: 10px; - margin-left: 10px; - position: relative; - z-index: 1; - background: #009688; - color: #fff; -} - - .content::before { - position: absolute; - left: -20px; - top: 6px; - height: 0; - width: 0; - content: ''; - border: 10px solid rgba(255, 255, 255, 0.00); - border-top: 6px solid rgba(255, 255, 255, 0.00); - border-bottom: 6px solid rgba(255, 255, 255, 0.00); - border-right-color: #009688; - } - -.timeline-line { - position: absolute; - left: 35%; - top: 0; - height: 100%; - width: 2px; - background: #009688; - z-index: 0; -} - -.timeline-year { - margin: 10px 0; -} - - - -/* 小屏幕(平板,大于等于 768px) */ -@media (min-width: 768px) { - .timeline-box { - background: #fff; - padding: 15px; - position: relative; - min-height: 90vh; - } - - .timeline-main > h1 { - font-size: 26px; - margin-left: 16%; /*写给不支持calc()的浏览器*/ - margin-left: -moz-calc(18% - 13px); - margin-left: -webkit-calc(18% - 13px); - margin-left: calc(18% -13px); - } - - .timeline-main > h1 > i { - font-size: 30px; - } - - .timeline-main > h1 > span { - display: inline; - } - - .timeline-main h2, - .timeline-main h3 { - width: 16%; - } - - .timeline-main h2, - .timeline-main h2 > a { - font-size: 24px; - } - - .timeline-main h3, - .timeline-main h3 > a { - font-size: 20px; - } - - .timeline-month > ul > li .h4 { - width: 16%; - } - - .dot-circle { - width: 4%; - font-size: 22px; - } - - .content { - max-width: 70%; - } - - .timeline-line { - left: 18%; - } -} - -/* 中等屏幕(桌面显示器,大于等于 992px) */ -@media (min-width: 992px) { - .blog-container { - /*width: 962px;*/ - /*width:1050px;*/ - } - - .timeline-main > h1 { - font-size: 34px; - background: #fff; - z-index: 1; - position: relative; - color: #009688; - margin-left: 17%; /*写给不支持calc()的浏览器*/ - margin-left: -moz-calc(18% - 16px); - margin-left: -webkit-calc(18% - 16px); - margin-left: calc(18% - 16px); - } - - .timeline-main > h1 > i { - font-size: 36px; - } - - .timeline-main h2, - .timeline-main h2 > a { - font-size: 30px; - } - - .timeline-main h3, - .timeline-main h3 > a { - font-size: 24px; - } -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/datas/articles.json b/ace-blog-parent/ace-blog-ui/src/main/resources/static/datas/articles.json deleted file mode 100644 index 79a2b82f3e90544881a75039dc415b8cc9e95344..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/datas/articles.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "rel": true, - "msg": "获取成功", - "count": 10, - "list": [ - { - "title": "Hello World", - "remark": "该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用!", - "pageView": 1, - "crtTime": "2017-01-10 10:42:36", - "cover":"../images/cover/201703181909057125.jpg", - "commentCount":12, - "crtUser":"Mr.AG", - "tag":"Spring Cloud", - "url":"http://localhost:8765/blog/api/article/42" - }, { - "title": "Hello World", - "remark": "该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用!", - "pageView": 1, - "crtTime": "2017-01-10 10:42:36", - "cover":"../images/cover/201703181909057125.jpg", - "commentCount":12, - "crtUser":"Mr.AG", - "tag":"Spring Cloud", - "url":"http://localhost:8765/blog/api/article/42" - } - ] -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Absolutely.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Absolutely.jpg deleted file mode 100644 index dfd6a12e02528bb2fdbf1feb123c7c9ddfe444e6..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Absolutely.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Logo_100.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Logo_100.png deleted file mode 100644 index 39f276fb9136d528eec554875b4cc35187c38d9c..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Logo_100.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Logo_40.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Logo_40.png deleted file mode 100644 index 170ff813e40476de430a381e5867fe48ece11c3d..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/Logo_40.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703051349045432.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703051349045432.jpg deleted file mode 100644 index e0551b885b1b4ea1cd6fc55e7331b0110d06b72d..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703051349045432.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703051847567306.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703051847567306.jpg deleted file mode 100644 index 820643b225fb50f74dcf9f599d0f1bc4a19aade8..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703051847567306.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703142313157316.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703142313157316.jpg deleted file mode 100644 index 96ca4fea52f93a5a5e9305612fa45c6538f55a81..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703142313157316.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703152314519971.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703152314519971.jpg deleted file mode 100644 index 5aa8afa1ac3e7bff73db0cab31edd1630c87ccd4..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703152314519971.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703162101115908.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703162101115908.jpg deleted file mode 100644 index 5aa8afa1ac3e7bff73db0cab31edd1630c87ccd4..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703162101115908.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181708141811.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181708141811.jpg deleted file mode 100644 index d0bb54d98c1ba1c65aba3915d86b68e9848cac84..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181708141811.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181740098218.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181740098218.jpg deleted file mode 100644 index c0ba48c5bc3d503f33fc2a152181061123828343..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181740098218.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181909057125.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181909057125.jpg deleted file mode 100644 index 16a4438351c386631d58c85f113de7e32e10b5b3..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/201703181909057125.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/cover.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/cover.jpg deleted file mode 100644 index 2f223a4f4bba821ce9bbde8b6ef7b698e23793a3..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/cover.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/cover_default.jpg b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/cover_default.jpg deleted file mode 100644 index f934dbec17afef74675e658ce030ec9f62c95a43..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/cover/cover_default.jpg and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/handshake.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/handshake.png deleted file mode 100644 index fc06b7d4669f3f34583c720cf32543dcbab5d280..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/handshake.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/messagewall.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/messagewall.png deleted file mode 100644 index 8a7eed5e97d2cdbfd6d5ca33ae27a1733bfb1371..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/messagewall.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/qq_32.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/qq_32.png deleted file mode 100644 index 4968fe567df70f8c84dba64130c0f1e1747b5c3f..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/qq_32.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/qzone_32.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/qzone_32.png deleted file mode 100644 index 8d83011c71821aa51609490661d14403dbecd5b1..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/qzone_32.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/wechat_32.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/wechat_32.png deleted file mode 100644 index 499ff265f22c93f16feeee0dc0ec9a974c1eb369..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/wechat_32.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/weibo_32.png b/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/weibo_32.png deleted file mode 100644 index d2a1ee71f68e3919f5e89c4a8bb265c8c30b005e..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/images/weibo_32.png and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/about.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/about.js deleted file mode 100644 index d8d3d6d4ffac43d3a68f34304a193ed861186669..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/about.js +++ /dev/null @@ -1,114 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -layui.use(['element', 'jquery', 'form', 'layedit'], function () { - var element = layui.element(); - var form = layui.form(); - var $ = layui.jquery; - var layedit = layui.layedit; - - //评论和留言的编辑器 - var editIndex = layedit.build('remarkEditor', { - height: 150, - tool: ['face', '|', 'left', 'center', 'right', '|', 'link'], - }); - //评论和留言的编辑器的验证 - layui.form().verify({ - content: function (value) { - value = $.trim(layedit.getText(editIndex)); - if (value == "") return "自少得有一个字吧"; - layedit.sync(editIndex); - } - }); - - //Hash地址的定位 - var layid = location.hash.replace(/^#tabIndex=/, ''); - if (layid == "") { - element.tabChange('tabAbout', 1); - } - element.tabChange('tabAbout', layid); - - element.on('tab(tabAbout)', function (elem) { - location.hash = 'tabIndex=' + $(this).attr('lay-id'); - }); - - //监听留言提交 - form.on('submit(formLeaveMessage)', function (data) { - var index = layer.load(1); - //模拟留言提交 - setTimeout(function () { - layer.close(index); - var content = data.field.editorContent; - var html = '
  • 模拟留言
    模拟留言
    ' + content + '
  • '; - $('.blog-comment').append(html); - $('#remarkEditor').val(''); - editIndex = layui.layedit.build('remarkEditor', { - height: 150, - tool: ['face', '|', 'left', 'center', 'right', '|', 'link'], - }); - layer.msg("留言成功", { icon: 1 }); - }, 500); - return false; - }); - - //监听留言回复提交 - form.on('submit(formReply)', function (data) { - var index = layer.load(1); - //模拟留言回复 - setTimeout(function () { - layer.close(index); - var content = data.field.replyContent; - var html = '
    Absolutely
    模拟回复' + content + '

    2017-03-18 18:26

    '; - $(data.form).find('textarea').val(''); - $(data.form).parent('.replycontainer').before(html).siblings('.comment-parent').children('p').children('a').click(); - layer.msg("回复成功", { icon: 1 }); - }, 500); - return false; - }); -}); -function btnReplyClick(elem) { - var $ = layui.jquery; - $(elem).parent('p').parent('.comment-parent').siblings('.replycontainer').toggleClass('layui-hide'); - if ($(elem).text() == '回复') { - $(elem).text('收起') - } else { - $(elem).text('回复') - } -} -systemTime(); - -function systemTime() { - //获取系统时间。 - var dateTime = new Date(); - var year = dateTime.getFullYear(); - var month = dateTime.getMonth() + 1; - var day = dateTime.getDate(); - var hh = dateTime.getHours(); - var mm = dateTime.getMinutes(); - var ss = dateTime.getSeconds(); - - //分秒时间是一位数字,在数字前补0。 - mm = extra(mm); - ss = extra(ss); - - //将时间显示到ID为time的位置,时间格式形如:19:18:02 - document.getElementById("time").innerHTML = year + "-" + month + "-" + day + " " + hh + ":" + mm + ":" + ss; - //每隔1000ms执行方法systemTime()。 - setTimeout("systemTime()", 1000); -} - -//补位函数。 -function extra(x) { - //如果传入数字小于10,数字前补一位0。 - if (x < 10) { - return "0" + x; - } - else { - return x; - } -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/detail.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/detail.js deleted file mode 100644 index c2e5ac1f98640b4802fd040df6654d374f1c7c4b..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/detail.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -prettyPrint(); -layui.use(['form', 'layedit'], function () { - var form = layui.form(); - var $ = layui.jquery; - var layedit = layui.layedit; - - //评论和留言的编辑器 - var editIndex = layedit.build('remarkEditor', { - height: 150, - tool: ['face', '|', 'left', 'center', 'right', '|', 'link'], - }); - //评论和留言的编辑器的验证 - layui.form().verify({ - content: function (value) { - value = $.trim(layedit.getText(editIndex)); - if (value == "") return "自少得有一个字吧"; - layedit.sync(editIndex); - } - }); - - //监听评论提交 - form.on('submit(formRemark)', function (data) { - var index = layer.load(1); - //模拟评论提交 - setTimeout(function () { - layer.close(index); - var content = data.field.editorContent; - var html = '
  • absolutely
    Absolutely2017-03-18 18:46:06
    ' + content + '
  • '; - $('.blog-comment').append(html); - $('#remarkEditor').val(''); - editIndex = layui.layedit.build('remarkEditor', { - height: 150, - tool: ['face', '|', 'left', 'center', 'right', '|', 'link'], - }); - layer.msg("评论成功", { icon: 1 }); - }, 500); - return false; - }); -}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/global.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/global.js deleted file mode 100644 index 12fecf910a0502674a1aa3ccfdf026c9bbc921aa..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/global.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - -@Name:不落阁整站模板源码 -@Author:Absolutely -@Site:http://www.lyblogs.cn - -*/ - -layui.use(['element', 'layer', 'util', 'form'], function () { - var $ = layui.jquery; - //模拟QQ登陆 - $('.blog-user').click(function () { - var user = this; - var index = layer.load(1); - setTimeout(function () { - layer.close(index); - $(user).toggleClass('layui-hide').siblings('a.blog-user').toggleClass('layui-hide'); - }, 800); - }); - //分享工具 - layui.util.fixbar({ - bar1: '', - click: function (type) { - if (type === 'bar1') { - var sear = new RegExp('layui-hide'); - if (sear.test($('.blog-share').attr('class'))) { - shareIn(); - } else { - shareOut(); - } - } - } - }); - - //子栏目导航点击事件 - $('.child-nav span').click(function () { - layer.msg('切换到相应栏目'); - $(this).addClass('child-nav-btn-this').siblings().removeClass('child-nav-btn-this'); - }); - - //侧边导航开关点击事件 - $('.blog-navicon').click(function () { - var sear = new RegExp('layui-hide'); - if (sear.test($('.blog-nav-left').attr('class'))) { - leftIn(); - } else { - leftOut(); - } - }); - //侧边导航遮罩点击事件 - $('.blog-mask').click(function () { - leftOut(); - }); - //blog-body和blog-footer点击事件,用来关闭百度分享和类别导航 - $('.blog-body,.blog-footer').click(function () { - shareOut(); - categoryOut(); - }); - //类别导航开关点击事件 - $('.category-toggle').click(function (e) { - e.stopPropagation(); //阻止事件冒泡 - categroyIn(); - }); - //类别导航点击事件,用来关闭类别导航 - $('.article-category').click(function () { - categoryOut(); - }); - //具体类别点击事件 - $('.article-category > a').click(function (e) { - e.stopPropagation(); //阻止事件冒泡 - }); - - //显示百度分享 - function shareIn() { - $('.blog-share').unbind('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'); - $('.blog-share').removeClass('shareOut'); - $('.blog-share').addClass('shareIn'); - $('.blog-share').removeClass('layui-hide'); - $('.blog-share').addClass('layui-show'); - } - //隐藏百度分享 - function shareOut() { - $('.blog-share').on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () { - $('.blog-share').addClass('layui-hide'); - }); - $('.blog-share').removeClass('shareIn'); - $('.blog-share').addClass('shareOut'); - $('.blog-share').removeClass('layui-show'); - } - //显示侧边导航 - function leftIn() { - $('.blog-mask').unbind('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'); - $('.blog-nav-left').unbind('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'); - - $('.blog-mask').removeClass('maskOut'); - $('.blog-mask').addClass('maskIn'); - $('.blog-mask').removeClass('layui-hide'); - $('.blog-mask').addClass('layui-show'); - - $('.blog-nav-left').removeClass('leftOut'); - $('.blog-nav-left').addClass('leftIn'); - $('.blog-nav-left').removeClass('layui-hide'); - $('.blog-nav-left').addClass('layui-show'); - } - //隐藏侧边导航 - function leftOut() { - $('.blog-mask').on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () { - $('.blog-mask').addClass('layui-hide'); - }); - $('.blog-nav-left').on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () { - $('.blog-nav-left').addClass('layui-hide'); - }); - - $('.blog-mask').removeClass('maskIn'); - $('.blog-mask').addClass('maskOut'); - $('.blog-mask').removeClass('layui-show'); - - $('.blog-nav-left').removeClass('leftIn'); - $('.blog-nav-left').addClass('leftOut'); - $('.blog-nav-left').removeClass('layui-show'); - } - //显示类别导航 - function categroyIn() { - $('.category-toggle').addClass('layui-hide'); - $('.article-category').unbind('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'); - - $('.article-category').removeClass('categoryOut'); - $('.article-category').addClass('categoryIn'); - $('.article-category').addClass('layui-show'); - } - //隐藏类别导航 - function categoryOut() { - $('.article-category').on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () { - $('.article-category').removeClass('layui-show'); - $('.category-toggle').removeClass('layui-hide'); - }); - - $('.article-category').removeClass('categoryIn'); - $('.article-category').addClass('categoryOut'); - } - -}); - -var base = {}; -base.url = "http://localhost:8765"; -//百度分享插件 -window._bd_share_config = { - "common": { - "bdSnsKey": {}, - "bdText": "", - "bdStyle": "0", - "bdSize": "32" - }, - "share": {} -}; -with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)]; diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/home.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/home.js deleted file mode 100644 index 72cd8c22a73d25ddf3d7e92cab82da4617bc2eb6..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/home.js +++ /dev/null @@ -1,20 +0,0 @@ - -layui.use('jquery', function () { - var $ = layui.jquery; - $(function () { - //播放公告 - playAnnouncement(3000); - }); - function playAnnouncement(interval) { - var index = 0; - var $announcement = $('.home-tips-container>span'); - //自动轮换 - setInterval(function () { - index++; //下标更新 - if (index >= $announcement.length) { - index = 0; - } - $announcement.eq(index).stop(true, true).fadeIn().siblings('span').fadeOut(); //下标对应的图片显示,同辈元素隐藏 - }, interval); - } -}); diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/paging.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/paging.js deleted file mode 100644 index 2e8c049973411402d095415919e0bbf28d2e0b2c..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/paging.js +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Paging 组件 - * @description 基于laytpl 、laypage、layer 封装的组件 - * @author Van zheng_jinfan@126.com - * @link http://m.zhengjinfan.cn - * @license MIT - * @version 1.0.1 - */ -layui.define(['layer', 'laypage', 'laytpl'], function (exports) { - "use strict"; - var $ = layui.jquery, - layer = parent.layui.layer === undefined ? layui.layer : parent.layui.layer, - laytpl = layui.laytpl; - - var Paging = function () { - this.config = { - url: undefined, //数据远程地址 - type: 'POST', //数据的获取方式 get or post - elem: undefined, //内容容器 - params: {}, //获取数据时传递的额外参数 - openWait: false, //加载数据时是否显示等待框 - tempElem: undefined, //模板容器 - tempType: 0, //如果等于0则需要设置模板容器,1为提供模板内容 - paged: true,//是否显示分页组件 - pageConfig: { //参数应该为object类型 - elem: undefined, - pageSize: 15 //分页大小 - }, - success: undefined, //type:function - fail: function (res) { - console.log(res.msg); - //layer.msg(res.msg, { icon: 2 }); - }, //type:function - complate: undefined, //type:function - serverError: function (xhr, status, error) { //ajax的服务错误 - throwError("错误提示: " + xhr.status + " " + xhr.statusText); - } - }; - }; - /** - * 版本号 - */ - Paging.prototype.v = '1.0.3'; - - /** - * 设置 - * @param {Object} options - */ - Paging.prototype.set = function (options) { - var that = this; - $.extend(true, that.config, options); - return that; - }; - /** - * 初始化 - * @param {Object} options - */ - Paging.prototype.init = function (options) { - var that = this; - $.extend(true, that.config, options); - var _config = that.config; - if (_config.url === undefined) { - throwError('Paging Error:请配置远程URL!'); - } - if (_config.elem === undefined) { - throwError('Paging Error:请配置参数elem!'); - } - if ($(_config.elem).length === 0) { - throwError('Paging Error:找不到配置的容器elem!'); - } - if (_config.tempType === 0) { - if (_config.tempElem === undefined) { - throwError('Paging Error:请配置参数tempElem!'); - } - if ($(_config.tempElem).length === 0) { - throwError('Paging Error:找不到配置的容器tempElem!'); - } - } - if (_config.paged) { - var _pageConfig = _config.pageConfig; - if (_pageConfig.elem === undefined) { - throwError('Paging Error:请配置参数pageConfig.elem!'); - } - } - if (_config.type.toUpperCase() !== 'GET' && _config.type.toUpperCase() !== 'POST') { - throwError('Paging Error:type参数配置出错,只支持GET或都POST'); - } - that.get({ - pageIndex: 1, - pageSize: _config.pageConfig.pageSize - }); - - return that; - }; - /** - * 获取数据 - * @param {Object} options - */ - Paging.prototype.get = function (options) { - var that = this; - var _config = that.config; - var loadIndex = undefined; - if (_config.openWait) { - loadIndex = layer.load(2); - } - //默认参数 - var df = { - pageIndex: 1, - pageSize: _config.pageConfig.pageSize - }; - $.extend(true, _config.params, df, options); - $.ajax({ - type: _config.type, - url: _config.url, - data: _config.params, - contentType: "application/json; charset=utf-8", - dataType: 'jsonp', - jsonp: 'callback', - success: function (result, status, xhr) { - if (loadIndex !== undefined) - layer.close(loadIndex); //关闭等待层 - if (result.rel) { - //获取模板 - var tpl = _config.tempType === 0 ? $(_config.tempElem).html() : _config.tempElem; - //渲染数据 - laytpl(tpl).render(result, function (html) { - if (_config.renderBefore) { - _config.renderBefore(html, function (formatHtml) { - $(_config.elem).html(formatHtml); - }, result.list); - } - else { - $(_config.elem).html(html); - } - }); - if (_config.paged) { - if (result.count === null || result.count === undefined) { - throwError('Paging Error:请返回数据总数!'); - return; - } - var _pageConfig = _config.pageConfig; - var pageSize = _pageConfig.pageSize; - var pages = result.count % pageSize == 0 ? - (result.count / pageSize) : (result.count / pageSize + 1); - var defaults = { - cont: $(_pageConfig.elem), - curr: _config.params.pageIndex, - pages: pages, - jump: function (obj, first) { - //得到了当前页,用于向服务端请求对应数据 - var curr = obj.curr; - if (!first) { - that.get({ - pageIndex: curr, - pageSize: pageSize - }); - } - } - }; - $.extend(defaults, _pageConfig); //参数合并 - layui.laypage(defaults); //调用laypage组件渲染分页 - } - if (_config.success) { - _config.success(); //渲染成功 - } - } else { - var thLength = $(_config.elem).siblings('thead').find('th').length; - $(_config.elem).html('' + result.msg + ''); - if (_config.fail) { - _config.fail(result); //获取数据失败 - } - } - if (_config.complate) { - _config.complate(); //渲染完成 - } - }, - error: function (xhr, status, error) { - if (loadIndex !== undefined) - layer.close(loadIndex); //关闭等待层 - _config.serverError(xhr, status, error); //服务器错误 - } - }); - }; - /** - * 抛出一个异常错误信息 - * @param {String} msg - */ - function throwError(msg) { - throw new Error(msg); - }; - - var paging = new Paging(); - exports('paging', function (options) { - return paging.set(options); - }); -}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/prettify.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/prettify.js deleted file mode 100644 index eef5ad7e6a07676b3919146d583d1c190bf1e163..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/js/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p li { position: relative; } -} -.@{fa-css-prefix}-li { - position: absolute; - left: -@fa-li-width; - width: @fa-li-width; - top: (2em / 14); - text-align: center; - &.@{fa-css-prefix}-lg { - left: (-@fa-li-width + (4em / 14)); - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/mixins.less b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/mixins.less deleted file mode 100644 index beef231d0e176a47375d93fb7365270eea52f7b4..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/mixins.less +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -.fa-icon() { - display: inline-block; - font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -.fa-icon-rotate(@degrees, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; - -webkit-transform: rotate(@degrees); - -ms-transform: rotate(@degrees); - transform: rotate(@degrees); -} - -.fa-icon-flip(@horiz, @vert, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; - -webkit-transform: scale(@horiz, @vert); - -ms-transform: scale(@horiz, @vert); - transform: scale(@horiz, @vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -.sr-only() { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -.sr-only-focusable() { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/path.less b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/path.less deleted file mode 100644 index 835be41f8151b6439f799be29ec7921af1b72593..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/path.less +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); - src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), - url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), - url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), - url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), - url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); - // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/rotated-flipped.less b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/rotated-flipped.less deleted file mode 100644 index f6ba81475b92355723f0dc12767f715995a34162..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/rotated-flipped.less +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } -.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } -.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } - -.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } -.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .@{fa-css-prefix}-rotate-90, -:root .@{fa-css-prefix}-rotate-180, -:root .@{fa-css-prefix}-rotate-270, -:root .@{fa-css-prefix}-flip-horizontal, -:root .@{fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/screen-reader.less b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/screen-reader.less deleted file mode 100644 index 11c188196d5ade55930b7b94fc5a1dd0f6d1a800..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/screen-reader.less +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { .sr-only(); } -.sr-only-focusable { .sr-only-focusable(); } diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/stacked.less b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/stacked.less deleted file mode 100644 index fc53fb0e7ab49594e1eac97208c32a290558efeb..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/stacked.less +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.@{fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.@{fa-css-prefix}-stack-1x { line-height: inherit; } -.@{fa-css-prefix}-stack-2x { font-size: 2em; } -.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/variables.less b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/variables.less deleted file mode 100644 index 7ddbbc0115f5b017bae9f401651f00d824a396b2..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/less/variables.less +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -@fa-font-path: "../fonts"; -@fa-font-size-base: 14px; -@fa-line-height-base: 1; -//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly -@fa-css-prefix: fa; -@fa-version: "4.7.0"; -@fa-border-color: #eee; -@fa-inverse: #fff; -@fa-li-width: (30em / 14); - -@fa-var-500px: "\f26e"; -@fa-var-address-book: "\f2b9"; -@fa-var-address-book-o: "\f2ba"; -@fa-var-address-card: "\f2bb"; -@fa-var-address-card-o: "\f2bc"; -@fa-var-adjust: "\f042"; -@fa-var-adn: "\f170"; -@fa-var-align-center: "\f037"; -@fa-var-align-justify: "\f039"; -@fa-var-align-left: "\f036"; -@fa-var-align-right: "\f038"; -@fa-var-amazon: "\f270"; -@fa-var-ambulance: "\f0f9"; -@fa-var-american-sign-language-interpreting: "\f2a3"; -@fa-var-anchor: "\f13d"; -@fa-var-android: "\f17b"; -@fa-var-angellist: "\f209"; -@fa-var-angle-double-down: "\f103"; -@fa-var-angle-double-left: "\f100"; -@fa-var-angle-double-right: "\f101"; -@fa-var-angle-double-up: "\f102"; -@fa-var-angle-down: "\f107"; -@fa-var-angle-left: "\f104"; -@fa-var-angle-right: "\f105"; -@fa-var-angle-up: "\f106"; -@fa-var-apple: "\f179"; -@fa-var-archive: "\f187"; -@fa-var-area-chart: "\f1fe"; -@fa-var-arrow-circle-down: "\f0ab"; -@fa-var-arrow-circle-left: "\f0a8"; -@fa-var-arrow-circle-o-down: "\f01a"; -@fa-var-arrow-circle-o-left: "\f190"; -@fa-var-arrow-circle-o-right: "\f18e"; -@fa-var-arrow-circle-o-up: "\f01b"; -@fa-var-arrow-circle-right: "\f0a9"; -@fa-var-arrow-circle-up: "\f0aa"; -@fa-var-arrow-down: "\f063"; -@fa-var-arrow-left: "\f060"; -@fa-var-arrow-right: "\f061"; -@fa-var-arrow-up: "\f062"; -@fa-var-arrows: "\f047"; -@fa-var-arrows-alt: "\f0b2"; -@fa-var-arrows-h: "\f07e"; -@fa-var-arrows-v: "\f07d"; -@fa-var-asl-interpreting: "\f2a3"; -@fa-var-assistive-listening-systems: "\f2a2"; -@fa-var-asterisk: "\f069"; -@fa-var-at: "\f1fa"; -@fa-var-audio-description: "\f29e"; -@fa-var-automobile: "\f1b9"; -@fa-var-backward: "\f04a"; -@fa-var-balance-scale: "\f24e"; -@fa-var-ban: "\f05e"; -@fa-var-bandcamp: "\f2d5"; -@fa-var-bank: "\f19c"; -@fa-var-bar-chart: "\f080"; -@fa-var-bar-chart-o: "\f080"; -@fa-var-barcode: "\f02a"; -@fa-var-bars: "\f0c9"; -@fa-var-bath: "\f2cd"; -@fa-var-bathtub: "\f2cd"; -@fa-var-battery: "\f240"; -@fa-var-battery-0: "\f244"; -@fa-var-battery-1: "\f243"; -@fa-var-battery-2: "\f242"; -@fa-var-battery-3: "\f241"; -@fa-var-battery-4: "\f240"; -@fa-var-battery-empty: "\f244"; -@fa-var-battery-full: "\f240"; -@fa-var-battery-half: "\f242"; -@fa-var-battery-quarter: "\f243"; -@fa-var-battery-three-quarters: "\f241"; -@fa-var-bed: "\f236"; -@fa-var-beer: "\f0fc"; -@fa-var-behance: "\f1b4"; -@fa-var-behance-square: "\f1b5"; -@fa-var-bell: "\f0f3"; -@fa-var-bell-o: "\f0a2"; -@fa-var-bell-slash: "\f1f6"; -@fa-var-bell-slash-o: "\f1f7"; -@fa-var-bicycle: "\f206"; -@fa-var-binoculars: "\f1e5"; -@fa-var-birthday-cake: "\f1fd"; -@fa-var-bitbucket: "\f171"; -@fa-var-bitbucket-square: "\f172"; -@fa-var-bitcoin: "\f15a"; -@fa-var-black-tie: "\f27e"; -@fa-var-blind: "\f29d"; -@fa-var-bluetooth: "\f293"; -@fa-var-bluetooth-b: "\f294"; -@fa-var-bold: "\f032"; -@fa-var-bolt: "\f0e7"; -@fa-var-bomb: "\f1e2"; -@fa-var-book: "\f02d"; -@fa-var-bookmark: "\f02e"; -@fa-var-bookmark-o: "\f097"; -@fa-var-braille: "\f2a1"; -@fa-var-briefcase: "\f0b1"; -@fa-var-btc: "\f15a"; -@fa-var-bug: "\f188"; -@fa-var-building: "\f1ad"; -@fa-var-building-o: "\f0f7"; -@fa-var-bullhorn: "\f0a1"; -@fa-var-bullseye: "\f140"; -@fa-var-bus: "\f207"; -@fa-var-buysellads: "\f20d"; -@fa-var-cab: "\f1ba"; -@fa-var-calculator: "\f1ec"; -@fa-var-calendar: "\f073"; -@fa-var-calendar-check-o: "\f274"; -@fa-var-calendar-minus-o: "\f272"; -@fa-var-calendar-o: "\f133"; -@fa-var-calendar-plus-o: "\f271"; -@fa-var-calendar-times-o: "\f273"; -@fa-var-camera: "\f030"; -@fa-var-camera-retro: "\f083"; -@fa-var-car: "\f1b9"; -@fa-var-caret-down: "\f0d7"; -@fa-var-caret-left: "\f0d9"; -@fa-var-caret-right: "\f0da"; -@fa-var-caret-square-o-down: "\f150"; -@fa-var-caret-square-o-left: "\f191"; -@fa-var-caret-square-o-right: "\f152"; -@fa-var-caret-square-o-up: "\f151"; -@fa-var-caret-up: "\f0d8"; -@fa-var-cart-arrow-down: "\f218"; -@fa-var-cart-plus: "\f217"; -@fa-var-cc: "\f20a"; -@fa-var-cc-amex: "\f1f3"; -@fa-var-cc-diners-club: "\f24c"; -@fa-var-cc-discover: "\f1f2"; -@fa-var-cc-jcb: "\f24b"; -@fa-var-cc-mastercard: "\f1f1"; -@fa-var-cc-paypal: "\f1f4"; -@fa-var-cc-stripe: "\f1f5"; -@fa-var-cc-visa: "\f1f0"; -@fa-var-certificate: "\f0a3"; -@fa-var-chain: "\f0c1"; -@fa-var-chain-broken: "\f127"; -@fa-var-check: "\f00c"; -@fa-var-check-circle: "\f058"; -@fa-var-check-circle-o: "\f05d"; -@fa-var-check-square: "\f14a"; -@fa-var-check-square-o: "\f046"; -@fa-var-chevron-circle-down: "\f13a"; -@fa-var-chevron-circle-left: "\f137"; -@fa-var-chevron-circle-right: "\f138"; -@fa-var-chevron-circle-up: "\f139"; -@fa-var-chevron-down: "\f078"; -@fa-var-chevron-left: "\f053"; -@fa-var-chevron-right: "\f054"; -@fa-var-chevron-up: "\f077"; -@fa-var-child: "\f1ae"; -@fa-var-chrome: "\f268"; -@fa-var-circle: "\f111"; -@fa-var-circle-o: "\f10c"; -@fa-var-circle-o-notch: "\f1ce"; -@fa-var-circle-thin: "\f1db"; -@fa-var-clipboard: "\f0ea"; -@fa-var-clock-o: "\f017"; -@fa-var-clone: "\f24d"; -@fa-var-close: "\f00d"; -@fa-var-cloud: "\f0c2"; -@fa-var-cloud-download: "\f0ed"; -@fa-var-cloud-upload: "\f0ee"; -@fa-var-cny: "\f157"; -@fa-var-code: "\f121"; -@fa-var-code-fork: "\f126"; -@fa-var-codepen: "\f1cb"; -@fa-var-codiepie: "\f284"; -@fa-var-coffee: "\f0f4"; -@fa-var-cog: "\f013"; -@fa-var-cogs: "\f085"; -@fa-var-columns: "\f0db"; -@fa-var-comment: "\f075"; -@fa-var-comment-o: "\f0e5"; -@fa-var-commenting: "\f27a"; -@fa-var-commenting-o: "\f27b"; -@fa-var-comments: "\f086"; -@fa-var-comments-o: "\f0e6"; -@fa-var-compass: "\f14e"; -@fa-var-compress: "\f066"; -@fa-var-connectdevelop: "\f20e"; -@fa-var-contao: "\f26d"; -@fa-var-copy: "\f0c5"; -@fa-var-copyright: "\f1f9"; -@fa-var-creative-commons: "\f25e"; -@fa-var-credit-card: "\f09d"; -@fa-var-credit-card-alt: "\f283"; -@fa-var-crop: "\f125"; -@fa-var-crosshairs: "\f05b"; -@fa-var-css3: "\f13c"; -@fa-var-cube: "\f1b2"; -@fa-var-cubes: "\f1b3"; -@fa-var-cut: "\f0c4"; -@fa-var-cutlery: "\f0f5"; -@fa-var-dashboard: "\f0e4"; -@fa-var-dashcube: "\f210"; -@fa-var-database: "\f1c0"; -@fa-var-deaf: "\f2a4"; -@fa-var-deafness: "\f2a4"; -@fa-var-dedent: "\f03b"; -@fa-var-delicious: "\f1a5"; -@fa-var-desktop: "\f108"; -@fa-var-deviantart: "\f1bd"; -@fa-var-diamond: "\f219"; -@fa-var-digg: "\f1a6"; -@fa-var-dollar: "\f155"; -@fa-var-dot-circle-o: "\f192"; -@fa-var-download: "\f019"; -@fa-var-dribbble: "\f17d"; -@fa-var-drivers-license: "\f2c2"; -@fa-var-drivers-license-o: "\f2c3"; -@fa-var-dropbox: "\f16b"; -@fa-var-drupal: "\f1a9"; -@fa-var-edge: "\f282"; -@fa-var-edit: "\f044"; -@fa-var-eercast: "\f2da"; -@fa-var-eject: "\f052"; -@fa-var-ellipsis-h: "\f141"; -@fa-var-ellipsis-v: "\f142"; -@fa-var-empire: "\f1d1"; -@fa-var-envelope: "\f0e0"; -@fa-var-envelope-o: "\f003"; -@fa-var-envelope-open: "\f2b6"; -@fa-var-envelope-open-o: "\f2b7"; -@fa-var-envelope-square: "\f199"; -@fa-var-envira: "\f299"; -@fa-var-eraser: "\f12d"; -@fa-var-etsy: "\f2d7"; -@fa-var-eur: "\f153"; -@fa-var-euro: "\f153"; -@fa-var-exchange: "\f0ec"; -@fa-var-exclamation: "\f12a"; -@fa-var-exclamation-circle: "\f06a"; -@fa-var-exclamation-triangle: "\f071"; -@fa-var-expand: "\f065"; -@fa-var-expeditedssl: "\f23e"; -@fa-var-external-link: "\f08e"; -@fa-var-external-link-square: "\f14c"; -@fa-var-eye: "\f06e"; -@fa-var-eye-slash: "\f070"; -@fa-var-eyedropper: "\f1fb"; -@fa-var-fa: "\f2b4"; -@fa-var-facebook: "\f09a"; -@fa-var-facebook-f: "\f09a"; -@fa-var-facebook-official: "\f230"; -@fa-var-facebook-square: "\f082"; -@fa-var-fast-backward: "\f049"; -@fa-var-fast-forward: "\f050"; -@fa-var-fax: "\f1ac"; -@fa-var-feed: "\f09e"; -@fa-var-female: "\f182"; -@fa-var-fighter-jet: "\f0fb"; -@fa-var-file: "\f15b"; -@fa-var-file-archive-o: "\f1c6"; -@fa-var-file-audio-o: "\f1c7"; -@fa-var-file-code-o: "\f1c9"; -@fa-var-file-excel-o: "\f1c3"; -@fa-var-file-image-o: "\f1c5"; -@fa-var-file-movie-o: "\f1c8"; -@fa-var-file-o: "\f016"; -@fa-var-file-pdf-o: "\f1c1"; -@fa-var-file-photo-o: "\f1c5"; -@fa-var-file-picture-o: "\f1c5"; -@fa-var-file-powerpoint-o: "\f1c4"; -@fa-var-file-sound-o: "\f1c7"; -@fa-var-file-text: "\f15c"; -@fa-var-file-text-o: "\f0f6"; -@fa-var-file-video-o: "\f1c8"; -@fa-var-file-word-o: "\f1c2"; -@fa-var-file-zip-o: "\f1c6"; -@fa-var-files-o: "\f0c5"; -@fa-var-film: "\f008"; -@fa-var-filter: "\f0b0"; -@fa-var-fire: "\f06d"; -@fa-var-fire-extinguisher: "\f134"; -@fa-var-firefox: "\f269"; -@fa-var-first-order: "\f2b0"; -@fa-var-flag: "\f024"; -@fa-var-flag-checkered: "\f11e"; -@fa-var-flag-o: "\f11d"; -@fa-var-flash: "\f0e7"; -@fa-var-flask: "\f0c3"; -@fa-var-flickr: "\f16e"; -@fa-var-floppy-o: "\f0c7"; -@fa-var-folder: "\f07b"; -@fa-var-folder-o: "\f114"; -@fa-var-folder-open: "\f07c"; -@fa-var-folder-open-o: "\f115"; -@fa-var-font: "\f031"; -@fa-var-font-awesome: "\f2b4"; -@fa-var-fonticons: "\f280"; -@fa-var-fort-awesome: "\f286"; -@fa-var-forumbee: "\f211"; -@fa-var-forward: "\f04e"; -@fa-var-foursquare: "\f180"; -@fa-var-free-code-camp: "\f2c5"; -@fa-var-frown-o: "\f119"; -@fa-var-futbol-o: "\f1e3"; -@fa-var-gamepad: "\f11b"; -@fa-var-gavel: "\f0e3"; -@fa-var-gbp: "\f154"; -@fa-var-ge: "\f1d1"; -@fa-var-gear: "\f013"; -@fa-var-gears: "\f085"; -@fa-var-genderless: "\f22d"; -@fa-var-get-pocket: "\f265"; -@fa-var-gg: "\f260"; -@fa-var-gg-circle: "\f261"; -@fa-var-gift: "\f06b"; -@fa-var-git: "\f1d3"; -@fa-var-git-square: "\f1d2"; -@fa-var-github: "\f09b"; -@fa-var-github-alt: "\f113"; -@fa-var-github-square: "\f092"; -@fa-var-gitlab: "\f296"; -@fa-var-gittip: "\f184"; -@fa-var-glass: "\f000"; -@fa-var-glide: "\f2a5"; -@fa-var-glide-g: "\f2a6"; -@fa-var-globe: "\f0ac"; -@fa-var-google: "\f1a0"; -@fa-var-google-plus: "\f0d5"; -@fa-var-google-plus-circle: "\f2b3"; -@fa-var-google-plus-official: "\f2b3"; -@fa-var-google-plus-square: "\f0d4"; -@fa-var-google-wallet: "\f1ee"; -@fa-var-graduation-cap: "\f19d"; -@fa-var-gratipay: "\f184"; -@fa-var-grav: "\f2d6"; -@fa-var-group: "\f0c0"; -@fa-var-h-square: "\f0fd"; -@fa-var-hacker-news: "\f1d4"; -@fa-var-hand-grab-o: "\f255"; -@fa-var-hand-lizard-o: "\f258"; -@fa-var-hand-o-down: "\f0a7"; -@fa-var-hand-o-left: "\f0a5"; -@fa-var-hand-o-right: "\f0a4"; -@fa-var-hand-o-up: "\f0a6"; -@fa-var-hand-paper-o: "\f256"; -@fa-var-hand-peace-o: "\f25b"; -@fa-var-hand-pointer-o: "\f25a"; -@fa-var-hand-rock-o: "\f255"; -@fa-var-hand-scissors-o: "\f257"; -@fa-var-hand-spock-o: "\f259"; -@fa-var-hand-stop-o: "\f256"; -@fa-var-handshake-o: "\f2b5"; -@fa-var-hard-of-hearing: "\f2a4"; -@fa-var-hashtag: "\f292"; -@fa-var-hdd-o: "\f0a0"; -@fa-var-header: "\f1dc"; -@fa-var-headphones: "\f025"; -@fa-var-heart: "\f004"; -@fa-var-heart-o: "\f08a"; -@fa-var-heartbeat: "\f21e"; -@fa-var-history: "\f1da"; -@fa-var-home: "\f015"; -@fa-var-hospital-o: "\f0f8"; -@fa-var-hotel: "\f236"; -@fa-var-hourglass: "\f254"; -@fa-var-hourglass-1: "\f251"; -@fa-var-hourglass-2: "\f252"; -@fa-var-hourglass-3: "\f253"; -@fa-var-hourglass-end: "\f253"; -@fa-var-hourglass-half: "\f252"; -@fa-var-hourglass-o: "\f250"; -@fa-var-hourglass-start: "\f251"; -@fa-var-houzz: "\f27c"; -@fa-var-html5: "\f13b"; -@fa-var-i-cursor: "\f246"; -@fa-var-id-badge: "\f2c1"; -@fa-var-id-card: "\f2c2"; -@fa-var-id-card-o: "\f2c3"; -@fa-var-ils: "\f20b"; -@fa-var-image: "\f03e"; -@fa-var-imdb: "\f2d8"; -@fa-var-inbox: "\f01c"; -@fa-var-indent: "\f03c"; -@fa-var-industry: "\f275"; -@fa-var-info: "\f129"; -@fa-var-info-circle: "\f05a"; -@fa-var-inr: "\f156"; -@fa-var-instagram: "\f16d"; -@fa-var-institution: "\f19c"; -@fa-var-internet-explorer: "\f26b"; -@fa-var-intersex: "\f224"; -@fa-var-ioxhost: "\f208"; -@fa-var-italic: "\f033"; -@fa-var-joomla: "\f1aa"; -@fa-var-jpy: "\f157"; -@fa-var-jsfiddle: "\f1cc"; -@fa-var-key: "\f084"; -@fa-var-keyboard-o: "\f11c"; -@fa-var-krw: "\f159"; -@fa-var-language: "\f1ab"; -@fa-var-laptop: "\f109"; -@fa-var-lastfm: "\f202"; -@fa-var-lastfm-square: "\f203"; -@fa-var-leaf: "\f06c"; -@fa-var-leanpub: "\f212"; -@fa-var-legal: "\f0e3"; -@fa-var-lemon-o: "\f094"; -@fa-var-level-down: "\f149"; -@fa-var-level-up: "\f148"; -@fa-var-life-bouy: "\f1cd"; -@fa-var-life-buoy: "\f1cd"; -@fa-var-life-ring: "\f1cd"; -@fa-var-life-saver: "\f1cd"; -@fa-var-lightbulb-o: "\f0eb"; -@fa-var-line-chart: "\f201"; -@fa-var-link: "\f0c1"; -@fa-var-linkedin: "\f0e1"; -@fa-var-linkedin-square: "\f08c"; -@fa-var-linode: "\f2b8"; -@fa-var-linux: "\f17c"; -@fa-var-list: "\f03a"; -@fa-var-list-alt: "\f022"; -@fa-var-list-ol: "\f0cb"; -@fa-var-list-ul: "\f0ca"; -@fa-var-location-arrow: "\f124"; -@fa-var-lock: "\f023"; -@fa-var-long-arrow-down: "\f175"; -@fa-var-long-arrow-left: "\f177"; -@fa-var-long-arrow-right: "\f178"; -@fa-var-long-arrow-up: "\f176"; -@fa-var-low-vision: "\f2a8"; -@fa-var-magic: "\f0d0"; -@fa-var-magnet: "\f076"; -@fa-var-mail-forward: "\f064"; -@fa-var-mail-reply: "\f112"; -@fa-var-mail-reply-all: "\f122"; -@fa-var-male: "\f183"; -@fa-var-map: "\f279"; -@fa-var-map-marker: "\f041"; -@fa-var-map-o: "\f278"; -@fa-var-map-pin: "\f276"; -@fa-var-map-signs: "\f277"; -@fa-var-mars: "\f222"; -@fa-var-mars-double: "\f227"; -@fa-var-mars-stroke: "\f229"; -@fa-var-mars-stroke-h: "\f22b"; -@fa-var-mars-stroke-v: "\f22a"; -@fa-var-maxcdn: "\f136"; -@fa-var-meanpath: "\f20c"; -@fa-var-medium: "\f23a"; -@fa-var-medkit: "\f0fa"; -@fa-var-meetup: "\f2e0"; -@fa-var-meh-o: "\f11a"; -@fa-var-mercury: "\f223"; -@fa-var-microchip: "\f2db"; -@fa-var-microphone: "\f130"; -@fa-var-microphone-slash: "\f131"; -@fa-var-minus: "\f068"; -@fa-var-minus-circle: "\f056"; -@fa-var-minus-square: "\f146"; -@fa-var-minus-square-o: "\f147"; -@fa-var-mixcloud: "\f289"; -@fa-var-mobile: "\f10b"; -@fa-var-mobile-phone: "\f10b"; -@fa-var-modx: "\f285"; -@fa-var-money: "\f0d6"; -@fa-var-moon-o: "\f186"; -@fa-var-mortar-board: "\f19d"; -@fa-var-motorcycle: "\f21c"; -@fa-var-mouse-pointer: "\f245"; -@fa-var-music: "\f001"; -@fa-var-navicon: "\f0c9"; -@fa-var-neuter: "\f22c"; -@fa-var-newspaper-o: "\f1ea"; -@fa-var-object-group: "\f247"; -@fa-var-object-ungroup: "\f248"; -@fa-var-odnoklassniki: "\f263"; -@fa-var-odnoklassniki-square: "\f264"; -@fa-var-opencart: "\f23d"; -@fa-var-openid: "\f19b"; -@fa-var-opera: "\f26a"; -@fa-var-optin-monster: "\f23c"; -@fa-var-outdent: "\f03b"; -@fa-var-pagelines: "\f18c"; -@fa-var-paint-brush: "\f1fc"; -@fa-var-paper-plane: "\f1d8"; -@fa-var-paper-plane-o: "\f1d9"; -@fa-var-paperclip: "\f0c6"; -@fa-var-paragraph: "\f1dd"; -@fa-var-paste: "\f0ea"; -@fa-var-pause: "\f04c"; -@fa-var-pause-circle: "\f28b"; -@fa-var-pause-circle-o: "\f28c"; -@fa-var-paw: "\f1b0"; -@fa-var-paypal: "\f1ed"; -@fa-var-pencil: "\f040"; -@fa-var-pencil-square: "\f14b"; -@fa-var-pencil-square-o: "\f044"; -@fa-var-percent: "\f295"; -@fa-var-phone: "\f095"; -@fa-var-phone-square: "\f098"; -@fa-var-photo: "\f03e"; -@fa-var-picture-o: "\f03e"; -@fa-var-pie-chart: "\f200"; -@fa-var-pied-piper: "\f2ae"; -@fa-var-pied-piper-alt: "\f1a8"; -@fa-var-pied-piper-pp: "\f1a7"; -@fa-var-pinterest: "\f0d2"; -@fa-var-pinterest-p: "\f231"; -@fa-var-pinterest-square: "\f0d3"; -@fa-var-plane: "\f072"; -@fa-var-play: "\f04b"; -@fa-var-play-circle: "\f144"; -@fa-var-play-circle-o: "\f01d"; -@fa-var-plug: "\f1e6"; -@fa-var-plus: "\f067"; -@fa-var-plus-circle: "\f055"; -@fa-var-plus-square: "\f0fe"; -@fa-var-plus-square-o: "\f196"; -@fa-var-podcast: "\f2ce"; -@fa-var-power-off: "\f011"; -@fa-var-print: "\f02f"; -@fa-var-product-hunt: "\f288"; -@fa-var-puzzle-piece: "\f12e"; -@fa-var-qq: "\f1d6"; -@fa-var-qrcode: "\f029"; -@fa-var-question: "\f128"; -@fa-var-question-circle: "\f059"; -@fa-var-question-circle-o: "\f29c"; -@fa-var-quora: "\f2c4"; -@fa-var-quote-left: "\f10d"; -@fa-var-quote-right: "\f10e"; -@fa-var-ra: "\f1d0"; -@fa-var-random: "\f074"; -@fa-var-ravelry: "\f2d9"; -@fa-var-rebel: "\f1d0"; -@fa-var-recycle: "\f1b8"; -@fa-var-reddit: "\f1a1"; -@fa-var-reddit-alien: "\f281"; -@fa-var-reddit-square: "\f1a2"; -@fa-var-refresh: "\f021"; -@fa-var-registered: "\f25d"; -@fa-var-remove: "\f00d"; -@fa-var-renren: "\f18b"; -@fa-var-reorder: "\f0c9"; -@fa-var-repeat: "\f01e"; -@fa-var-reply: "\f112"; -@fa-var-reply-all: "\f122"; -@fa-var-resistance: "\f1d0"; -@fa-var-retweet: "\f079"; -@fa-var-rmb: "\f157"; -@fa-var-road: "\f018"; -@fa-var-rocket: "\f135"; -@fa-var-rotate-left: "\f0e2"; -@fa-var-rotate-right: "\f01e"; -@fa-var-rouble: "\f158"; -@fa-var-rss: "\f09e"; -@fa-var-rss-square: "\f143"; -@fa-var-rub: "\f158"; -@fa-var-ruble: "\f158"; -@fa-var-rupee: "\f156"; -@fa-var-s15: "\f2cd"; -@fa-var-safari: "\f267"; -@fa-var-save: "\f0c7"; -@fa-var-scissors: "\f0c4"; -@fa-var-scribd: "\f28a"; -@fa-var-search: "\f002"; -@fa-var-search-minus: "\f010"; -@fa-var-search-plus: "\f00e"; -@fa-var-sellsy: "\f213"; -@fa-var-send: "\f1d8"; -@fa-var-send-o: "\f1d9"; -@fa-var-server: "\f233"; -@fa-var-share: "\f064"; -@fa-var-share-alt: "\f1e0"; -@fa-var-share-alt-square: "\f1e1"; -@fa-var-share-square: "\f14d"; -@fa-var-share-square-o: "\f045"; -@fa-var-shekel: "\f20b"; -@fa-var-sheqel: "\f20b"; -@fa-var-shield: "\f132"; -@fa-var-ship: "\f21a"; -@fa-var-shirtsinbulk: "\f214"; -@fa-var-shopping-bag: "\f290"; -@fa-var-shopping-basket: "\f291"; -@fa-var-shopping-cart: "\f07a"; -@fa-var-shower: "\f2cc"; -@fa-var-sign-in: "\f090"; -@fa-var-sign-language: "\f2a7"; -@fa-var-sign-out: "\f08b"; -@fa-var-signal: "\f012"; -@fa-var-signing: "\f2a7"; -@fa-var-simplybuilt: "\f215"; -@fa-var-sitemap: "\f0e8"; -@fa-var-skyatlas: "\f216"; -@fa-var-skype: "\f17e"; -@fa-var-slack: "\f198"; -@fa-var-sliders: "\f1de"; -@fa-var-slideshare: "\f1e7"; -@fa-var-smile-o: "\f118"; -@fa-var-snapchat: "\f2ab"; -@fa-var-snapchat-ghost: "\f2ac"; -@fa-var-snapchat-square: "\f2ad"; -@fa-var-snowflake-o: "\f2dc"; -@fa-var-soccer-ball-o: "\f1e3"; -@fa-var-sort: "\f0dc"; -@fa-var-sort-alpha-asc: "\f15d"; -@fa-var-sort-alpha-desc: "\f15e"; -@fa-var-sort-amount-asc: "\f160"; -@fa-var-sort-amount-desc: "\f161"; -@fa-var-sort-asc: "\f0de"; -@fa-var-sort-desc: "\f0dd"; -@fa-var-sort-down: "\f0dd"; -@fa-var-sort-numeric-asc: "\f162"; -@fa-var-sort-numeric-desc: "\f163"; -@fa-var-sort-up: "\f0de"; -@fa-var-soundcloud: "\f1be"; -@fa-var-space-shuttle: "\f197"; -@fa-var-spinner: "\f110"; -@fa-var-spoon: "\f1b1"; -@fa-var-spotify: "\f1bc"; -@fa-var-square: "\f0c8"; -@fa-var-square-o: "\f096"; -@fa-var-stack-exchange: "\f18d"; -@fa-var-stack-overflow: "\f16c"; -@fa-var-star: "\f005"; -@fa-var-star-half: "\f089"; -@fa-var-star-half-empty: "\f123"; -@fa-var-star-half-full: "\f123"; -@fa-var-star-half-o: "\f123"; -@fa-var-star-o: "\f006"; -@fa-var-steam: "\f1b6"; -@fa-var-steam-square: "\f1b7"; -@fa-var-step-backward: "\f048"; -@fa-var-step-forward: "\f051"; -@fa-var-stethoscope: "\f0f1"; -@fa-var-sticky-note: "\f249"; -@fa-var-sticky-note-o: "\f24a"; -@fa-var-stop: "\f04d"; -@fa-var-stop-circle: "\f28d"; -@fa-var-stop-circle-o: "\f28e"; -@fa-var-street-view: "\f21d"; -@fa-var-strikethrough: "\f0cc"; -@fa-var-stumbleupon: "\f1a4"; -@fa-var-stumbleupon-circle: "\f1a3"; -@fa-var-subscript: "\f12c"; -@fa-var-subway: "\f239"; -@fa-var-suitcase: "\f0f2"; -@fa-var-sun-o: "\f185"; -@fa-var-superpowers: "\f2dd"; -@fa-var-superscript: "\f12b"; -@fa-var-support: "\f1cd"; -@fa-var-table: "\f0ce"; -@fa-var-tablet: "\f10a"; -@fa-var-tachometer: "\f0e4"; -@fa-var-tag: "\f02b"; -@fa-var-tags: "\f02c"; -@fa-var-tasks: "\f0ae"; -@fa-var-taxi: "\f1ba"; -@fa-var-telegram: "\f2c6"; -@fa-var-television: "\f26c"; -@fa-var-tencent-weibo: "\f1d5"; -@fa-var-terminal: "\f120"; -@fa-var-text-height: "\f034"; -@fa-var-text-width: "\f035"; -@fa-var-th: "\f00a"; -@fa-var-th-large: "\f009"; -@fa-var-th-list: "\f00b"; -@fa-var-themeisle: "\f2b2"; -@fa-var-thermometer: "\f2c7"; -@fa-var-thermometer-0: "\f2cb"; -@fa-var-thermometer-1: "\f2ca"; -@fa-var-thermometer-2: "\f2c9"; -@fa-var-thermometer-3: "\f2c8"; -@fa-var-thermometer-4: "\f2c7"; -@fa-var-thermometer-empty: "\f2cb"; -@fa-var-thermometer-full: "\f2c7"; -@fa-var-thermometer-half: "\f2c9"; -@fa-var-thermometer-quarter: "\f2ca"; -@fa-var-thermometer-three-quarters: "\f2c8"; -@fa-var-thumb-tack: "\f08d"; -@fa-var-thumbs-down: "\f165"; -@fa-var-thumbs-o-down: "\f088"; -@fa-var-thumbs-o-up: "\f087"; -@fa-var-thumbs-up: "\f164"; -@fa-var-ticket: "\f145"; -@fa-var-times: "\f00d"; -@fa-var-times-circle: "\f057"; -@fa-var-times-circle-o: "\f05c"; -@fa-var-times-rectangle: "\f2d3"; -@fa-var-times-rectangle-o: "\f2d4"; -@fa-var-tint: "\f043"; -@fa-var-toggle-down: "\f150"; -@fa-var-toggle-left: "\f191"; -@fa-var-toggle-off: "\f204"; -@fa-var-toggle-on: "\f205"; -@fa-var-toggle-right: "\f152"; -@fa-var-toggle-up: "\f151"; -@fa-var-trademark: "\f25c"; -@fa-var-train: "\f238"; -@fa-var-transgender: "\f224"; -@fa-var-transgender-alt: "\f225"; -@fa-var-trash: "\f1f8"; -@fa-var-trash-o: "\f014"; -@fa-var-tree: "\f1bb"; -@fa-var-trello: "\f181"; -@fa-var-tripadvisor: "\f262"; -@fa-var-trophy: "\f091"; -@fa-var-truck: "\f0d1"; -@fa-var-try: "\f195"; -@fa-var-tty: "\f1e4"; -@fa-var-tumblr: "\f173"; -@fa-var-tumblr-square: "\f174"; -@fa-var-turkish-lira: "\f195"; -@fa-var-tv: "\f26c"; -@fa-var-twitch: "\f1e8"; -@fa-var-twitter: "\f099"; -@fa-var-twitter-square: "\f081"; -@fa-var-umbrella: "\f0e9"; -@fa-var-underline: "\f0cd"; -@fa-var-undo: "\f0e2"; -@fa-var-universal-access: "\f29a"; -@fa-var-university: "\f19c"; -@fa-var-unlink: "\f127"; -@fa-var-unlock: "\f09c"; -@fa-var-unlock-alt: "\f13e"; -@fa-var-unsorted: "\f0dc"; -@fa-var-upload: "\f093"; -@fa-var-usb: "\f287"; -@fa-var-usd: "\f155"; -@fa-var-user: "\f007"; -@fa-var-user-circle: "\f2bd"; -@fa-var-user-circle-o: "\f2be"; -@fa-var-user-md: "\f0f0"; -@fa-var-user-o: "\f2c0"; -@fa-var-user-plus: "\f234"; -@fa-var-user-secret: "\f21b"; -@fa-var-user-times: "\f235"; -@fa-var-users: "\f0c0"; -@fa-var-vcard: "\f2bb"; -@fa-var-vcard-o: "\f2bc"; -@fa-var-venus: "\f221"; -@fa-var-venus-double: "\f226"; -@fa-var-venus-mars: "\f228"; -@fa-var-viacoin: "\f237"; -@fa-var-viadeo: "\f2a9"; -@fa-var-viadeo-square: "\f2aa"; -@fa-var-video-camera: "\f03d"; -@fa-var-vimeo: "\f27d"; -@fa-var-vimeo-square: "\f194"; -@fa-var-vine: "\f1ca"; -@fa-var-vk: "\f189"; -@fa-var-volume-control-phone: "\f2a0"; -@fa-var-volume-down: "\f027"; -@fa-var-volume-off: "\f026"; -@fa-var-volume-up: "\f028"; -@fa-var-warning: "\f071"; -@fa-var-wechat: "\f1d7"; -@fa-var-weibo: "\f18a"; -@fa-var-weixin: "\f1d7"; -@fa-var-whatsapp: "\f232"; -@fa-var-wheelchair: "\f193"; -@fa-var-wheelchair-alt: "\f29b"; -@fa-var-wifi: "\f1eb"; -@fa-var-wikipedia-w: "\f266"; -@fa-var-window-close: "\f2d3"; -@fa-var-window-close-o: "\f2d4"; -@fa-var-window-maximize: "\f2d0"; -@fa-var-window-minimize: "\f2d1"; -@fa-var-window-restore: "\f2d2"; -@fa-var-windows: "\f17a"; -@fa-var-won: "\f159"; -@fa-var-wordpress: "\f19a"; -@fa-var-wpbeginner: "\f297"; -@fa-var-wpexplorer: "\f2de"; -@fa-var-wpforms: "\f298"; -@fa-var-wrench: "\f0ad"; -@fa-var-xing: "\f168"; -@fa-var-xing-square: "\f169"; -@fa-var-y-combinator: "\f23b"; -@fa-var-y-combinator-square: "\f1d4"; -@fa-var-yahoo: "\f19e"; -@fa-var-yc: "\f23b"; -@fa-var-yc-square: "\f1d4"; -@fa-var-yelp: "\f1e9"; -@fa-var-yen: "\f157"; -@fa-var-yoast: "\f2b1"; -@fa-var-youtube: "\f167"; -@fa-var-youtube-play: "\f16a"; -@fa-var-youtube-square: "\f166"; - diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_animated.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_animated.scss deleted file mode 100644 index 8a020dbfff7822bf57c7217eafdaa4884b8aa943..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_animated.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Spinning Icons -// -------------------------- - -.#{$fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.#{$fa-css-prefix}-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_bordered-pulled.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_bordered-pulled.scss deleted file mode 100644 index d4b85a02f24adad8890ad69f7a1db6c7e3ec8a7d..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_bordered-pulled.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em $fa-border-color; - border-radius: .1em; -} - -.#{$fa-css-prefix}-pull-left { float: left; } -.#{$fa-css-prefix}-pull-right { float: right; } - -.#{$fa-css-prefix} { - &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } - &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.#{$fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_core.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_core.scss deleted file mode 100644 index 7425ef85fc80ce6b035065906fc27490715e3733..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_core.scss +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.#{$fa-css-prefix} { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_fixed-width.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_fixed-width.scss deleted file mode 100644 index b221c98133a4d4a8449c848ccb69bf631d1c3e5d..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_icons.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_icons.scss deleted file mode 100644 index e63e702c4d9c28fb78922cefa5daf91858b12c9a..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_icons.scss +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } -.#{$fa-css-prefix}-music:before { content: $fa-var-music; } -.#{$fa-css-prefix}-search:before { content: $fa-var-search; } -.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } -.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } -.#{$fa-css-prefix}-star:before { content: $fa-var-star; } -.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } -.#{$fa-css-prefix}-user:before { content: $fa-var-user; } -.#{$fa-css-prefix}-film:before { content: $fa-var-film; } -.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } -.#{$fa-css-prefix}-th:before { content: $fa-var-th; } -.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } -.#{$fa-css-prefix}-check:before { content: $fa-var-check; } -.#{$fa-css-prefix}-remove:before, -.#{$fa-css-prefix}-close:before, -.#{$fa-css-prefix}-times:before { content: $fa-var-times; } -.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } -.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } -.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } -.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } -.#{$fa-css-prefix}-gear:before, -.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } -.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } -.#{$fa-css-prefix}-home:before { content: $fa-var-home; } -.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } -.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } -.#{$fa-css-prefix}-road:before { content: $fa-var-road; } -.#{$fa-css-prefix}-download:before { content: $fa-var-download; } -.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } -.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } -.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } -.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } -.#{$fa-css-prefix}-rotate-right:before, -.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } -.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } -.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } -.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } -.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } -.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } -.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } -.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } -.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } -.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } -.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } -.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } -.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } -.#{$fa-css-prefix}-book:before { content: $fa-var-book; } -.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } -.#{$fa-css-prefix}-print:before { content: $fa-var-print; } -.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } -.#{$fa-css-prefix}-font:before { content: $fa-var-font; } -.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } -.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } -.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } -.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } -.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } -.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } -.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } -.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } -.#{$fa-css-prefix}-list:before { content: $fa-var-list; } -.#{$fa-css-prefix}-dedent:before, -.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } -.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } -.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } -.#{$fa-css-prefix}-photo:before, -.#{$fa-css-prefix}-image:before, -.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } -.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } -.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } -.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } -.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } -.#{$fa-css-prefix}-edit:before, -.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } -.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } -.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } -.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } -.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } -.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } -.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } -.#{$fa-css-prefix}-play:before { content: $fa-var-play; } -.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } -.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } -.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } -.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } -.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } -.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } -.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } -.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } -.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } -.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } -.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } -.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } -.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } -.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } -.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } -.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } -.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } -.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } -.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } -.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } -.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } -.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } -.#{$fa-css-prefix}-mail-forward:before, -.#{$fa-css-prefix}-share:before { content: $fa-var-share; } -.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } -.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } -.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } -.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } -.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } -.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } -.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } -.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } -.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } -.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } -.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } -.#{$fa-css-prefix}-warning:before, -.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } -.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } -.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } -.#{$fa-css-prefix}-random:before { content: $fa-var-random; } -.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } -.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } -.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } -.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } -.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } -.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } -.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } -.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } -.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } -.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } -.#{$fa-css-prefix}-bar-chart-o:before, -.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } -.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } -.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } -.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } -.#{$fa-css-prefix}-key:before { content: $fa-var-key; } -.#{$fa-css-prefix}-gears:before, -.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } -.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } -.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } -.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } -.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } -.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } -.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } -.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } -.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } -.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } -.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } -.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } -.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } -.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } -.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } -.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } -.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } -.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } -.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } -.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } -.#{$fa-css-prefix}-facebook-f:before, -.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } -.#{$fa-css-prefix}-github:before { content: $fa-var-github; } -.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } -.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } -.#{$fa-css-prefix}-feed:before, -.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } -.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } -.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } -.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } -.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } -.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } -.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } -.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } -.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } -.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } -.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } -.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } -.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } -.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } -.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } -.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } -.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } -.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } -.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } -.#{$fa-css-prefix}-group:before, -.#{$fa-css-prefix}-users:before { content: $fa-var-users; } -.#{$fa-css-prefix}-chain:before, -.#{$fa-css-prefix}-link:before { content: $fa-var-link; } -.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } -.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } -.#{$fa-css-prefix}-cut:before, -.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } -.#{$fa-css-prefix}-copy:before, -.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } -.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } -.#{$fa-css-prefix}-save:before, -.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } -.#{$fa-css-prefix}-square:before { content: $fa-var-square; } -.#{$fa-css-prefix}-navicon:before, -.#{$fa-css-prefix}-reorder:before, -.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } -.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } -.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } -.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } -.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } -.#{$fa-css-prefix}-table:before { content: $fa-var-table; } -.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } -.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } -.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } -.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } -.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } -.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } -.#{$fa-css-prefix}-money:before { content: $fa-var-money; } -.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } -.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } -.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } -.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } -.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } -.#{$fa-css-prefix}-unsorted:before, -.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } -.#{$fa-css-prefix}-sort-down:before, -.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } -.#{$fa-css-prefix}-sort-up:before, -.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } -.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } -.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } -.#{$fa-css-prefix}-rotate-left:before, -.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } -.#{$fa-css-prefix}-legal:before, -.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } -.#{$fa-css-prefix}-dashboard:before, -.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } -.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } -.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } -.#{$fa-css-prefix}-flash:before, -.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } -.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } -.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } -.#{$fa-css-prefix}-paste:before, -.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } -.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } -.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } -.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } -.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } -.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } -.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } -.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } -.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } -.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } -.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } -.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } -.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } -.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } -.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } -.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } -.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } -.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } -.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } -.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } -.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } -.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } -.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } -.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } -.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } -.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } -.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } -.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } -.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } -.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } -.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } -.#{$fa-css-prefix}-mobile-phone:before, -.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } -.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } -.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } -.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } -.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } -.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } -.#{$fa-css-prefix}-mail-reply:before, -.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } -.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } -.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } -.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } -.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } -.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } -.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } -.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } -.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } -.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } -.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } -.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } -.#{$fa-css-prefix}-code:before { content: $fa-var-code; } -.#{$fa-css-prefix}-mail-reply-all:before, -.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } -.#{$fa-css-prefix}-star-half-empty:before, -.#{$fa-css-prefix}-star-half-full:before, -.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } -.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } -.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } -.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } -.#{$fa-css-prefix}-unlink:before, -.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } -.#{$fa-css-prefix}-question:before { content: $fa-var-question; } -.#{$fa-css-prefix}-info:before { content: $fa-var-info; } -.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } -.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } -.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } -.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } -.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } -.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } -.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } -.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } -.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } -.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } -.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } -.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } -.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } -.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } -.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } -.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } -.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } -.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } -.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } -.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } -.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } -.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } -.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } -.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } -.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } -.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } -.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } -.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } -.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } -.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } -.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } -.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } -.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } -.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } -.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } -.#{$fa-css-prefix}-toggle-down:before, -.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } -.#{$fa-css-prefix}-toggle-up:before, -.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } -.#{$fa-css-prefix}-toggle-right:before, -.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } -.#{$fa-css-prefix}-euro:before, -.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } -.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } -.#{$fa-css-prefix}-dollar:before, -.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } -.#{$fa-css-prefix}-rupee:before, -.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } -.#{$fa-css-prefix}-cny:before, -.#{$fa-css-prefix}-rmb:before, -.#{$fa-css-prefix}-yen:before, -.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } -.#{$fa-css-prefix}-ruble:before, -.#{$fa-css-prefix}-rouble:before, -.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } -.#{$fa-css-prefix}-won:before, -.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } -.#{$fa-css-prefix}-bitcoin:before, -.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } -.#{$fa-css-prefix}-file:before { content: $fa-var-file; } -.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } -.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } -.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } -.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } -.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } -.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } -.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } -.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } -.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } -.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } -.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } -.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } -.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } -.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } -.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } -.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } -.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } -.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } -.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } -.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } -.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } -.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } -.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } -.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } -.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } -.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } -.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } -.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } -.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } -.#{$fa-css-prefix}-android:before { content: $fa-var-android; } -.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } -.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } -.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } -.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } -.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } -.#{$fa-css-prefix}-female:before { content: $fa-var-female; } -.#{$fa-css-prefix}-male:before { content: $fa-var-male; } -.#{$fa-css-prefix}-gittip:before, -.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } -.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } -.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } -.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } -.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } -.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } -.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } -.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } -.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } -.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } -.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } -.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } -.#{$fa-css-prefix}-toggle-left:before, -.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } -.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } -.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } -.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } -.#{$fa-css-prefix}-turkish-lira:before, -.#{$fa-css-prefix}-try:before { content: $fa-var-try; } -.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } -.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } -.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } -.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } -.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } -.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } -.#{$fa-css-prefix}-institution:before, -.#{$fa-css-prefix}-bank:before, -.#{$fa-css-prefix}-university:before { content: $fa-var-university; } -.#{$fa-css-prefix}-mortar-board:before, -.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } -.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } -.#{$fa-css-prefix}-google:before { content: $fa-var-google; } -.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } -.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } -.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } -.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } -.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } -.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } -.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } -.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } -.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } -.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } -.#{$fa-css-prefix}-language:before { content: $fa-var-language; } -.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } -.#{$fa-css-prefix}-building:before { content: $fa-var-building; } -.#{$fa-css-prefix}-child:before { content: $fa-var-child; } -.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } -.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } -.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } -.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } -.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } -.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } -.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } -.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } -.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } -.#{$fa-css-prefix}-automobile:before, -.#{$fa-css-prefix}-car:before { content: $fa-var-car; } -.#{$fa-css-prefix}-cab:before, -.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } -.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } -.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } -.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } -.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } -.#{$fa-css-prefix}-database:before { content: $fa-var-database; } -.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } -.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } -.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } -.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } -.#{$fa-css-prefix}-file-photo-o:before, -.#{$fa-css-prefix}-file-picture-o:before, -.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } -.#{$fa-css-prefix}-file-zip-o:before, -.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } -.#{$fa-css-prefix}-file-sound-o:before, -.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } -.#{$fa-css-prefix}-file-movie-o:before, -.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } -.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } -.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } -.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } -.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } -.#{$fa-css-prefix}-life-bouy:before, -.#{$fa-css-prefix}-life-buoy:before, -.#{$fa-css-prefix}-life-saver:before, -.#{$fa-css-prefix}-support:before, -.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } -.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } -.#{$fa-css-prefix}-ra:before, -.#{$fa-css-prefix}-resistance:before, -.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } -.#{$fa-css-prefix}-ge:before, -.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } -.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } -.#{$fa-css-prefix}-git:before { content: $fa-var-git; } -.#{$fa-css-prefix}-y-combinator-square:before, -.#{$fa-css-prefix}-yc-square:before, -.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } -.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } -.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } -.#{$fa-css-prefix}-wechat:before, -.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } -.#{$fa-css-prefix}-send:before, -.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } -.#{$fa-css-prefix}-send-o:before, -.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } -.#{$fa-css-prefix}-history:before { content: $fa-var-history; } -.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } -.#{$fa-css-prefix}-header:before { content: $fa-var-header; } -.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } -.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } -.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } -.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } -.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } -.#{$fa-css-prefix}-soccer-ball-o:before, -.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } -.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } -.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } -.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } -.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } -.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } -.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } -.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } -.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } -.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } -.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } -.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } -.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } -.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } -.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } -.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } -.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } -.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } -.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } -.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } -.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } -.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } -.#{$fa-css-prefix}-at:before { content: $fa-var-at; } -.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } -.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } -.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } -.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } -.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } -.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } -.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } -.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } -.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } -.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } -.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } -.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } -.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } -.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } -.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } -.#{$fa-css-prefix}-shekel:before, -.#{$fa-css-prefix}-sheqel:before, -.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } -.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } -.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } -.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } -.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } -.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } -.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } -.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } -.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } -.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } -.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } -.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } -.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } -.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } -.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } -.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } -.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } -.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } -.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } -.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } -.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } -.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } -.#{$fa-css-prefix}-intersex:before, -.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } -.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } -.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } -.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } -.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } -.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } -.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } -.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } -.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } -.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } -.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } -.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } -.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } -.#{$fa-css-prefix}-server:before { content: $fa-var-server; } -.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } -.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } -.#{$fa-css-prefix}-hotel:before, -.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } -.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } -.#{$fa-css-prefix}-train:before { content: $fa-var-train; } -.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } -.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } -.#{$fa-css-prefix}-yc:before, -.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } -.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } -.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } -.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } -.#{$fa-css-prefix}-battery-4:before, -.#{$fa-css-prefix}-battery:before, -.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } -.#{$fa-css-prefix}-battery-3:before, -.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } -.#{$fa-css-prefix}-battery-2:before, -.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } -.#{$fa-css-prefix}-battery-1:before, -.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } -.#{$fa-css-prefix}-battery-0:before, -.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } -.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } -.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } -.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } -.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } -.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } -.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } -.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } -.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } -.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } -.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } -.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } -.#{$fa-css-prefix}-hourglass-1:before, -.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } -.#{$fa-css-prefix}-hourglass-2:before, -.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } -.#{$fa-css-prefix}-hourglass-3:before, -.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } -.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } -.#{$fa-css-prefix}-hand-grab-o:before, -.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } -.#{$fa-css-prefix}-hand-stop-o:before, -.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } -.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } -.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } -.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } -.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } -.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } -.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } -.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } -.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } -.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } -.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } -.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } -.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } -.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } -.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } -.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } -.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } -.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } -.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } -.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } -.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } -.#{$fa-css-prefix}-tv:before, -.#{$fa-css-prefix}-television:before { content: $fa-var-television; } -.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } -.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } -.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } -.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } -.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } -.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } -.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } -.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } -.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } -.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } -.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } -.#{$fa-css-prefix}-map:before { content: $fa-var-map; } -.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } -.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } -.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } -.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } -.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } -.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } -.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } -.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } -.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } -.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } -.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } -.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } -.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } -.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } -.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } -.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } -.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } -.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } -.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } -.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } -.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } -.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } -.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } -.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } -.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } -.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } -.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } -.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } -.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } -.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } -.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } -.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } -.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } -.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } -.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } -.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } -.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } -.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } -.#{$fa-css-prefix}-asl-interpreting:before, -.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } -.#{$fa-css-prefix}-deafness:before, -.#{$fa-css-prefix}-hard-of-hearing:before, -.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } -.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } -.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } -.#{$fa-css-prefix}-signing:before, -.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } -.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } -.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } -.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } -.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } -.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } -.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } -.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } -.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } -.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } -.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } -.#{$fa-css-prefix}-google-plus-circle:before, -.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } -.#{$fa-css-prefix}-fa:before, -.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } -.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } -.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } -.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } -.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } -.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } -.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } -.#{$fa-css-prefix}-vcard:before, -.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } -.#{$fa-css-prefix}-vcard-o:before, -.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } -.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } -.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } -.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } -.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } -.#{$fa-css-prefix}-drivers-license:before, -.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } -.#{$fa-css-prefix}-drivers-license-o:before, -.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } -.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } -.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } -.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } -.#{$fa-css-prefix}-thermometer-4:before, -.#{$fa-css-prefix}-thermometer:before, -.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } -.#{$fa-css-prefix}-thermometer-3:before, -.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } -.#{$fa-css-prefix}-thermometer-2:before, -.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } -.#{$fa-css-prefix}-thermometer-1:before, -.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } -.#{$fa-css-prefix}-thermometer-0:before, -.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } -.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } -.#{$fa-css-prefix}-bathtub:before, -.#{$fa-css-prefix}-s15:before, -.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } -.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } -.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } -.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } -.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } -.#{$fa-css-prefix}-times-rectangle:before, -.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } -.#{$fa-css-prefix}-times-rectangle-o:before, -.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } -.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } -.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } -.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } -.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } -.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } -.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } -.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } -.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } -.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } -.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } -.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_larger.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_larger.scss deleted file mode 100644 index 41e9a8184aa287c5970cc8415e3c5a6310dc9f79..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_larger.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.#{$fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.#{$fa-css-prefix}-2x { font-size: 2em; } -.#{$fa-css-prefix}-3x { font-size: 3em; } -.#{$fa-css-prefix}-4x { font-size: 4em; } -.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_list.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_list.scss deleted file mode 100644 index 7d1e4d54d6c293333eb638aa56feba7b62e15564..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.#{$fa-css-prefix}-ul { - padding-left: 0; - margin-left: $fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.#{$fa-css-prefix}-li { - position: absolute; - left: -$fa-li-width; - width: $fa-li-width; - top: (2em / 14); - text-align: center; - &.#{$fa-css-prefix}-lg { - left: -$fa-li-width + (4em / 14); - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_mixins.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_mixins.scss deleted file mode 100644 index c3bbd5745d35bebda3e16ce18aeff7a4a0ce5ae1..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_mixins.scss +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -@mixin fa-icon() { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -@mixin fa-icon-rotate($degrees, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; - -webkit-transform: rotate($degrees); - -ms-transform: rotate($degrees); - transform: rotate($degrees); -} - -@mixin fa-icon-flip($horiz, $vert, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; - -webkit-transform: scale($horiz, $vert); - -ms-transform: scale($horiz, $vert); - transform: scale($horiz, $vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -@mixin sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -@mixin sr-only-focusable { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_path.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_path.scss deleted file mode 100644 index bb457c23a8e4e0688ebd9383e34ab9f2b3acecab..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_path.scss +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); - src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), - url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), - url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), - url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), - url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); -// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_rotated-flipped.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_rotated-flipped.scss deleted file mode 100644 index a3558fd09ca7cb968166d5445f4df1a0bc2d5a7e..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_rotated-flipped.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } -.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } -.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } - -.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } -.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .#{$fa-css-prefix}-rotate-90, -:root .#{$fa-css-prefix}-rotate-180, -:root .#{$fa-css-prefix}-rotate-270, -:root .#{$fa-css-prefix}-flip-horizontal, -:root .#{$fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_screen-reader.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_screen-reader.scss deleted file mode 100644 index 637426f0da6dcef3602d764d9e359dabb4a5a862..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_screen-reader.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { @include sr-only(); } -.sr-only-focusable { @include sr-only-focusable(); } diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_stacked.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_stacked.scss deleted file mode 100644 index aef7403660c9a2ccc02a264c62c6b105f7d8d532..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_stacked.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.#{$fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.#{$fa-css-prefix}-stack-1x { line-height: inherit; } -.#{$fa-css-prefix}-stack-2x { font-size: 2em; } -.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_variables.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_variables.scss deleted file mode 100644 index 498fc4a087c614614166df2e9f08bb5e0071daf4..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/_variables.scss +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -$fa-font-path: "../fonts" !default; -$fa-font-size-base: 14px !default; -$fa-line-height-base: 1 !default; -//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly -$fa-css-prefix: fa !default; -$fa-version: "4.7.0" !default; -$fa-border-color: #eee !default; -$fa-inverse: #fff !default; -$fa-li-width: (30em / 14) !default; - -$fa-var-500px: "\f26e"; -$fa-var-address-book: "\f2b9"; -$fa-var-address-book-o: "\f2ba"; -$fa-var-address-card: "\f2bb"; -$fa-var-address-card-o: "\f2bc"; -$fa-var-adjust: "\f042"; -$fa-var-adn: "\f170"; -$fa-var-align-center: "\f037"; -$fa-var-align-justify: "\f039"; -$fa-var-align-left: "\f036"; -$fa-var-align-right: "\f038"; -$fa-var-amazon: "\f270"; -$fa-var-ambulance: "\f0f9"; -$fa-var-american-sign-language-interpreting: "\f2a3"; -$fa-var-anchor: "\f13d"; -$fa-var-android: "\f17b"; -$fa-var-angellist: "\f209"; -$fa-var-angle-double-down: "\f103"; -$fa-var-angle-double-left: "\f100"; -$fa-var-angle-double-right: "\f101"; -$fa-var-angle-double-up: "\f102"; -$fa-var-angle-down: "\f107"; -$fa-var-angle-left: "\f104"; -$fa-var-angle-right: "\f105"; -$fa-var-angle-up: "\f106"; -$fa-var-apple: "\f179"; -$fa-var-archive: "\f187"; -$fa-var-area-chart: "\f1fe"; -$fa-var-arrow-circle-down: "\f0ab"; -$fa-var-arrow-circle-left: "\f0a8"; -$fa-var-arrow-circle-o-down: "\f01a"; -$fa-var-arrow-circle-o-left: "\f190"; -$fa-var-arrow-circle-o-right: "\f18e"; -$fa-var-arrow-circle-o-up: "\f01b"; -$fa-var-arrow-circle-right: "\f0a9"; -$fa-var-arrow-circle-up: "\f0aa"; -$fa-var-arrow-down: "\f063"; -$fa-var-arrow-left: "\f060"; -$fa-var-arrow-right: "\f061"; -$fa-var-arrow-up: "\f062"; -$fa-var-arrows: "\f047"; -$fa-var-arrows-alt: "\f0b2"; -$fa-var-arrows-h: "\f07e"; -$fa-var-arrows-v: "\f07d"; -$fa-var-asl-interpreting: "\f2a3"; -$fa-var-assistive-listening-systems: "\f2a2"; -$fa-var-asterisk: "\f069"; -$fa-var-at: "\f1fa"; -$fa-var-audio-description: "\f29e"; -$fa-var-automobile: "\f1b9"; -$fa-var-backward: "\f04a"; -$fa-var-balance-scale: "\f24e"; -$fa-var-ban: "\f05e"; -$fa-var-bandcamp: "\f2d5"; -$fa-var-bank: "\f19c"; -$fa-var-bar-chart: "\f080"; -$fa-var-bar-chart-o: "\f080"; -$fa-var-barcode: "\f02a"; -$fa-var-bars: "\f0c9"; -$fa-var-bath: "\f2cd"; -$fa-var-bathtub: "\f2cd"; -$fa-var-battery: "\f240"; -$fa-var-battery-0: "\f244"; -$fa-var-battery-1: "\f243"; -$fa-var-battery-2: "\f242"; -$fa-var-battery-3: "\f241"; -$fa-var-battery-4: "\f240"; -$fa-var-battery-empty: "\f244"; -$fa-var-battery-full: "\f240"; -$fa-var-battery-half: "\f242"; -$fa-var-battery-quarter: "\f243"; -$fa-var-battery-three-quarters: "\f241"; -$fa-var-bed: "\f236"; -$fa-var-beer: "\f0fc"; -$fa-var-behance: "\f1b4"; -$fa-var-behance-square: "\f1b5"; -$fa-var-bell: "\f0f3"; -$fa-var-bell-o: "\f0a2"; -$fa-var-bell-slash: "\f1f6"; -$fa-var-bell-slash-o: "\f1f7"; -$fa-var-bicycle: "\f206"; -$fa-var-binoculars: "\f1e5"; -$fa-var-birthday-cake: "\f1fd"; -$fa-var-bitbucket: "\f171"; -$fa-var-bitbucket-square: "\f172"; -$fa-var-bitcoin: "\f15a"; -$fa-var-black-tie: "\f27e"; -$fa-var-blind: "\f29d"; -$fa-var-bluetooth: "\f293"; -$fa-var-bluetooth-b: "\f294"; -$fa-var-bold: "\f032"; -$fa-var-bolt: "\f0e7"; -$fa-var-bomb: "\f1e2"; -$fa-var-book: "\f02d"; -$fa-var-bookmark: "\f02e"; -$fa-var-bookmark-o: "\f097"; -$fa-var-braille: "\f2a1"; -$fa-var-briefcase: "\f0b1"; -$fa-var-btc: "\f15a"; -$fa-var-bug: "\f188"; -$fa-var-building: "\f1ad"; -$fa-var-building-o: "\f0f7"; -$fa-var-bullhorn: "\f0a1"; -$fa-var-bullseye: "\f140"; -$fa-var-bus: "\f207"; -$fa-var-buysellads: "\f20d"; -$fa-var-cab: "\f1ba"; -$fa-var-calculator: "\f1ec"; -$fa-var-calendar: "\f073"; -$fa-var-calendar-check-o: "\f274"; -$fa-var-calendar-minus-o: "\f272"; -$fa-var-calendar-o: "\f133"; -$fa-var-calendar-plus-o: "\f271"; -$fa-var-calendar-times-o: "\f273"; -$fa-var-camera: "\f030"; -$fa-var-camera-retro: "\f083"; -$fa-var-car: "\f1b9"; -$fa-var-caret-down: "\f0d7"; -$fa-var-caret-left: "\f0d9"; -$fa-var-caret-right: "\f0da"; -$fa-var-caret-square-o-down: "\f150"; -$fa-var-caret-square-o-left: "\f191"; -$fa-var-caret-square-o-right: "\f152"; -$fa-var-caret-square-o-up: "\f151"; -$fa-var-caret-up: "\f0d8"; -$fa-var-cart-arrow-down: "\f218"; -$fa-var-cart-plus: "\f217"; -$fa-var-cc: "\f20a"; -$fa-var-cc-amex: "\f1f3"; -$fa-var-cc-diners-club: "\f24c"; -$fa-var-cc-discover: "\f1f2"; -$fa-var-cc-jcb: "\f24b"; -$fa-var-cc-mastercard: "\f1f1"; -$fa-var-cc-paypal: "\f1f4"; -$fa-var-cc-stripe: "\f1f5"; -$fa-var-cc-visa: "\f1f0"; -$fa-var-certificate: "\f0a3"; -$fa-var-chain: "\f0c1"; -$fa-var-chain-broken: "\f127"; -$fa-var-check: "\f00c"; -$fa-var-check-circle: "\f058"; -$fa-var-check-circle-o: "\f05d"; -$fa-var-check-square: "\f14a"; -$fa-var-check-square-o: "\f046"; -$fa-var-chevron-circle-down: "\f13a"; -$fa-var-chevron-circle-left: "\f137"; -$fa-var-chevron-circle-right: "\f138"; -$fa-var-chevron-circle-up: "\f139"; -$fa-var-chevron-down: "\f078"; -$fa-var-chevron-left: "\f053"; -$fa-var-chevron-right: "\f054"; -$fa-var-chevron-up: "\f077"; -$fa-var-child: "\f1ae"; -$fa-var-chrome: "\f268"; -$fa-var-circle: "\f111"; -$fa-var-circle-o: "\f10c"; -$fa-var-circle-o-notch: "\f1ce"; -$fa-var-circle-thin: "\f1db"; -$fa-var-clipboard: "\f0ea"; -$fa-var-clock-o: "\f017"; -$fa-var-clone: "\f24d"; -$fa-var-close: "\f00d"; -$fa-var-cloud: "\f0c2"; -$fa-var-cloud-download: "\f0ed"; -$fa-var-cloud-upload: "\f0ee"; -$fa-var-cny: "\f157"; -$fa-var-code: "\f121"; -$fa-var-code-fork: "\f126"; -$fa-var-codepen: "\f1cb"; -$fa-var-codiepie: "\f284"; -$fa-var-coffee: "\f0f4"; -$fa-var-cog: "\f013"; -$fa-var-cogs: "\f085"; -$fa-var-columns: "\f0db"; -$fa-var-comment: "\f075"; -$fa-var-comment-o: "\f0e5"; -$fa-var-commenting: "\f27a"; -$fa-var-commenting-o: "\f27b"; -$fa-var-comments: "\f086"; -$fa-var-comments-o: "\f0e6"; -$fa-var-compass: "\f14e"; -$fa-var-compress: "\f066"; -$fa-var-connectdevelop: "\f20e"; -$fa-var-contao: "\f26d"; -$fa-var-copy: "\f0c5"; -$fa-var-copyright: "\f1f9"; -$fa-var-creative-commons: "\f25e"; -$fa-var-credit-card: "\f09d"; -$fa-var-credit-card-alt: "\f283"; -$fa-var-crop: "\f125"; -$fa-var-crosshairs: "\f05b"; -$fa-var-css3: "\f13c"; -$fa-var-cube: "\f1b2"; -$fa-var-cubes: "\f1b3"; -$fa-var-cut: "\f0c4"; -$fa-var-cutlery: "\f0f5"; -$fa-var-dashboard: "\f0e4"; -$fa-var-dashcube: "\f210"; -$fa-var-database: "\f1c0"; -$fa-var-deaf: "\f2a4"; -$fa-var-deafness: "\f2a4"; -$fa-var-dedent: "\f03b"; -$fa-var-delicious: "\f1a5"; -$fa-var-desktop: "\f108"; -$fa-var-deviantart: "\f1bd"; -$fa-var-diamond: "\f219"; -$fa-var-digg: "\f1a6"; -$fa-var-dollar: "\f155"; -$fa-var-dot-circle-o: "\f192"; -$fa-var-download: "\f019"; -$fa-var-dribbble: "\f17d"; -$fa-var-drivers-license: "\f2c2"; -$fa-var-drivers-license-o: "\f2c3"; -$fa-var-dropbox: "\f16b"; -$fa-var-drupal: "\f1a9"; -$fa-var-edge: "\f282"; -$fa-var-edit: "\f044"; -$fa-var-eercast: "\f2da"; -$fa-var-eject: "\f052"; -$fa-var-ellipsis-h: "\f141"; -$fa-var-ellipsis-v: "\f142"; -$fa-var-empire: "\f1d1"; -$fa-var-envelope: "\f0e0"; -$fa-var-envelope-o: "\f003"; -$fa-var-envelope-open: "\f2b6"; -$fa-var-envelope-open-o: "\f2b7"; -$fa-var-envelope-square: "\f199"; -$fa-var-envira: "\f299"; -$fa-var-eraser: "\f12d"; -$fa-var-etsy: "\f2d7"; -$fa-var-eur: "\f153"; -$fa-var-euro: "\f153"; -$fa-var-exchange: "\f0ec"; -$fa-var-exclamation: "\f12a"; -$fa-var-exclamation-circle: "\f06a"; -$fa-var-exclamation-triangle: "\f071"; -$fa-var-expand: "\f065"; -$fa-var-expeditedssl: "\f23e"; -$fa-var-external-link: "\f08e"; -$fa-var-external-link-square: "\f14c"; -$fa-var-eye: "\f06e"; -$fa-var-eye-slash: "\f070"; -$fa-var-eyedropper: "\f1fb"; -$fa-var-fa: "\f2b4"; -$fa-var-facebook: "\f09a"; -$fa-var-facebook-f: "\f09a"; -$fa-var-facebook-official: "\f230"; -$fa-var-facebook-square: "\f082"; -$fa-var-fast-backward: "\f049"; -$fa-var-fast-forward: "\f050"; -$fa-var-fax: "\f1ac"; -$fa-var-feed: "\f09e"; -$fa-var-female: "\f182"; -$fa-var-fighter-jet: "\f0fb"; -$fa-var-file: "\f15b"; -$fa-var-file-archive-o: "\f1c6"; -$fa-var-file-audio-o: "\f1c7"; -$fa-var-file-code-o: "\f1c9"; -$fa-var-file-excel-o: "\f1c3"; -$fa-var-file-image-o: "\f1c5"; -$fa-var-file-movie-o: "\f1c8"; -$fa-var-file-o: "\f016"; -$fa-var-file-pdf-o: "\f1c1"; -$fa-var-file-photo-o: "\f1c5"; -$fa-var-file-picture-o: "\f1c5"; -$fa-var-file-powerpoint-o: "\f1c4"; -$fa-var-file-sound-o: "\f1c7"; -$fa-var-file-text: "\f15c"; -$fa-var-file-text-o: "\f0f6"; -$fa-var-file-video-o: "\f1c8"; -$fa-var-file-word-o: "\f1c2"; -$fa-var-file-zip-o: "\f1c6"; -$fa-var-files-o: "\f0c5"; -$fa-var-film: "\f008"; -$fa-var-filter: "\f0b0"; -$fa-var-fire: "\f06d"; -$fa-var-fire-extinguisher: "\f134"; -$fa-var-firefox: "\f269"; -$fa-var-first-order: "\f2b0"; -$fa-var-flag: "\f024"; -$fa-var-flag-checkered: "\f11e"; -$fa-var-flag-o: "\f11d"; -$fa-var-flash: "\f0e7"; -$fa-var-flask: "\f0c3"; -$fa-var-flickr: "\f16e"; -$fa-var-floppy-o: "\f0c7"; -$fa-var-folder: "\f07b"; -$fa-var-folder-o: "\f114"; -$fa-var-folder-open: "\f07c"; -$fa-var-folder-open-o: "\f115"; -$fa-var-font: "\f031"; -$fa-var-font-awesome: "\f2b4"; -$fa-var-fonticons: "\f280"; -$fa-var-fort-awesome: "\f286"; -$fa-var-forumbee: "\f211"; -$fa-var-forward: "\f04e"; -$fa-var-foursquare: "\f180"; -$fa-var-free-code-camp: "\f2c5"; -$fa-var-frown-o: "\f119"; -$fa-var-futbol-o: "\f1e3"; -$fa-var-gamepad: "\f11b"; -$fa-var-gavel: "\f0e3"; -$fa-var-gbp: "\f154"; -$fa-var-ge: "\f1d1"; -$fa-var-gear: "\f013"; -$fa-var-gears: "\f085"; -$fa-var-genderless: "\f22d"; -$fa-var-get-pocket: "\f265"; -$fa-var-gg: "\f260"; -$fa-var-gg-circle: "\f261"; -$fa-var-gift: "\f06b"; -$fa-var-git: "\f1d3"; -$fa-var-git-square: "\f1d2"; -$fa-var-github: "\f09b"; -$fa-var-github-alt: "\f113"; -$fa-var-github-square: "\f092"; -$fa-var-gitlab: "\f296"; -$fa-var-gittip: "\f184"; -$fa-var-glass: "\f000"; -$fa-var-glide: "\f2a5"; -$fa-var-glide-g: "\f2a6"; -$fa-var-globe: "\f0ac"; -$fa-var-google: "\f1a0"; -$fa-var-google-plus: "\f0d5"; -$fa-var-google-plus-circle: "\f2b3"; -$fa-var-google-plus-official: "\f2b3"; -$fa-var-google-plus-square: "\f0d4"; -$fa-var-google-wallet: "\f1ee"; -$fa-var-graduation-cap: "\f19d"; -$fa-var-gratipay: "\f184"; -$fa-var-grav: "\f2d6"; -$fa-var-group: "\f0c0"; -$fa-var-h-square: "\f0fd"; -$fa-var-hacker-news: "\f1d4"; -$fa-var-hand-grab-o: "\f255"; -$fa-var-hand-lizard-o: "\f258"; -$fa-var-hand-o-down: "\f0a7"; -$fa-var-hand-o-left: "\f0a5"; -$fa-var-hand-o-right: "\f0a4"; -$fa-var-hand-o-up: "\f0a6"; -$fa-var-hand-paper-o: "\f256"; -$fa-var-hand-peace-o: "\f25b"; -$fa-var-hand-pointer-o: "\f25a"; -$fa-var-hand-rock-o: "\f255"; -$fa-var-hand-scissors-o: "\f257"; -$fa-var-hand-spock-o: "\f259"; -$fa-var-hand-stop-o: "\f256"; -$fa-var-handshake-o: "\f2b5"; -$fa-var-hard-of-hearing: "\f2a4"; -$fa-var-hashtag: "\f292"; -$fa-var-hdd-o: "\f0a0"; -$fa-var-header: "\f1dc"; -$fa-var-headphones: "\f025"; -$fa-var-heart: "\f004"; -$fa-var-heart-o: "\f08a"; -$fa-var-heartbeat: "\f21e"; -$fa-var-history: "\f1da"; -$fa-var-home: "\f015"; -$fa-var-hospital-o: "\f0f8"; -$fa-var-hotel: "\f236"; -$fa-var-hourglass: "\f254"; -$fa-var-hourglass-1: "\f251"; -$fa-var-hourglass-2: "\f252"; -$fa-var-hourglass-3: "\f253"; -$fa-var-hourglass-end: "\f253"; -$fa-var-hourglass-half: "\f252"; -$fa-var-hourglass-o: "\f250"; -$fa-var-hourglass-start: "\f251"; -$fa-var-houzz: "\f27c"; -$fa-var-html5: "\f13b"; -$fa-var-i-cursor: "\f246"; -$fa-var-id-badge: "\f2c1"; -$fa-var-id-card: "\f2c2"; -$fa-var-id-card-o: "\f2c3"; -$fa-var-ils: "\f20b"; -$fa-var-image: "\f03e"; -$fa-var-imdb: "\f2d8"; -$fa-var-inbox: "\f01c"; -$fa-var-indent: "\f03c"; -$fa-var-industry: "\f275"; -$fa-var-info: "\f129"; -$fa-var-info-circle: "\f05a"; -$fa-var-inr: "\f156"; -$fa-var-instagram: "\f16d"; -$fa-var-institution: "\f19c"; -$fa-var-internet-explorer: "\f26b"; -$fa-var-intersex: "\f224"; -$fa-var-ioxhost: "\f208"; -$fa-var-italic: "\f033"; -$fa-var-joomla: "\f1aa"; -$fa-var-jpy: "\f157"; -$fa-var-jsfiddle: "\f1cc"; -$fa-var-key: "\f084"; -$fa-var-keyboard-o: "\f11c"; -$fa-var-krw: "\f159"; -$fa-var-language: "\f1ab"; -$fa-var-laptop: "\f109"; -$fa-var-lastfm: "\f202"; -$fa-var-lastfm-square: "\f203"; -$fa-var-leaf: "\f06c"; -$fa-var-leanpub: "\f212"; -$fa-var-legal: "\f0e3"; -$fa-var-lemon-o: "\f094"; -$fa-var-level-down: "\f149"; -$fa-var-level-up: "\f148"; -$fa-var-life-bouy: "\f1cd"; -$fa-var-life-buoy: "\f1cd"; -$fa-var-life-ring: "\f1cd"; -$fa-var-life-saver: "\f1cd"; -$fa-var-lightbulb-o: "\f0eb"; -$fa-var-line-chart: "\f201"; -$fa-var-link: "\f0c1"; -$fa-var-linkedin: "\f0e1"; -$fa-var-linkedin-square: "\f08c"; -$fa-var-linode: "\f2b8"; -$fa-var-linux: "\f17c"; -$fa-var-list: "\f03a"; -$fa-var-list-alt: "\f022"; -$fa-var-list-ol: "\f0cb"; -$fa-var-list-ul: "\f0ca"; -$fa-var-location-arrow: "\f124"; -$fa-var-lock: "\f023"; -$fa-var-long-arrow-down: "\f175"; -$fa-var-long-arrow-left: "\f177"; -$fa-var-long-arrow-right: "\f178"; -$fa-var-long-arrow-up: "\f176"; -$fa-var-low-vision: "\f2a8"; -$fa-var-magic: "\f0d0"; -$fa-var-magnet: "\f076"; -$fa-var-mail-forward: "\f064"; -$fa-var-mail-reply: "\f112"; -$fa-var-mail-reply-all: "\f122"; -$fa-var-male: "\f183"; -$fa-var-map: "\f279"; -$fa-var-map-marker: "\f041"; -$fa-var-map-o: "\f278"; -$fa-var-map-pin: "\f276"; -$fa-var-map-signs: "\f277"; -$fa-var-mars: "\f222"; -$fa-var-mars-double: "\f227"; -$fa-var-mars-stroke: "\f229"; -$fa-var-mars-stroke-h: "\f22b"; -$fa-var-mars-stroke-v: "\f22a"; -$fa-var-maxcdn: "\f136"; -$fa-var-meanpath: "\f20c"; -$fa-var-medium: "\f23a"; -$fa-var-medkit: "\f0fa"; -$fa-var-meetup: "\f2e0"; -$fa-var-meh-o: "\f11a"; -$fa-var-mercury: "\f223"; -$fa-var-microchip: "\f2db"; -$fa-var-microphone: "\f130"; -$fa-var-microphone-slash: "\f131"; -$fa-var-minus: "\f068"; -$fa-var-minus-circle: "\f056"; -$fa-var-minus-square: "\f146"; -$fa-var-minus-square-o: "\f147"; -$fa-var-mixcloud: "\f289"; -$fa-var-mobile: "\f10b"; -$fa-var-mobile-phone: "\f10b"; -$fa-var-modx: "\f285"; -$fa-var-money: "\f0d6"; -$fa-var-moon-o: "\f186"; -$fa-var-mortar-board: "\f19d"; -$fa-var-motorcycle: "\f21c"; -$fa-var-mouse-pointer: "\f245"; -$fa-var-music: "\f001"; -$fa-var-navicon: "\f0c9"; -$fa-var-neuter: "\f22c"; -$fa-var-newspaper-o: "\f1ea"; -$fa-var-object-group: "\f247"; -$fa-var-object-ungroup: "\f248"; -$fa-var-odnoklassniki: "\f263"; -$fa-var-odnoklassniki-square: "\f264"; -$fa-var-opencart: "\f23d"; -$fa-var-openid: "\f19b"; -$fa-var-opera: "\f26a"; -$fa-var-optin-monster: "\f23c"; -$fa-var-outdent: "\f03b"; -$fa-var-pagelines: "\f18c"; -$fa-var-paint-brush: "\f1fc"; -$fa-var-paper-plane: "\f1d8"; -$fa-var-paper-plane-o: "\f1d9"; -$fa-var-paperclip: "\f0c6"; -$fa-var-paragraph: "\f1dd"; -$fa-var-paste: "\f0ea"; -$fa-var-pause: "\f04c"; -$fa-var-pause-circle: "\f28b"; -$fa-var-pause-circle-o: "\f28c"; -$fa-var-paw: "\f1b0"; -$fa-var-paypal: "\f1ed"; -$fa-var-pencil: "\f040"; -$fa-var-pencil-square: "\f14b"; -$fa-var-pencil-square-o: "\f044"; -$fa-var-percent: "\f295"; -$fa-var-phone: "\f095"; -$fa-var-phone-square: "\f098"; -$fa-var-photo: "\f03e"; -$fa-var-picture-o: "\f03e"; -$fa-var-pie-chart: "\f200"; -$fa-var-pied-piper: "\f2ae"; -$fa-var-pied-piper-alt: "\f1a8"; -$fa-var-pied-piper-pp: "\f1a7"; -$fa-var-pinterest: "\f0d2"; -$fa-var-pinterest-p: "\f231"; -$fa-var-pinterest-square: "\f0d3"; -$fa-var-plane: "\f072"; -$fa-var-play: "\f04b"; -$fa-var-play-circle: "\f144"; -$fa-var-play-circle-o: "\f01d"; -$fa-var-plug: "\f1e6"; -$fa-var-plus: "\f067"; -$fa-var-plus-circle: "\f055"; -$fa-var-plus-square: "\f0fe"; -$fa-var-plus-square-o: "\f196"; -$fa-var-podcast: "\f2ce"; -$fa-var-power-off: "\f011"; -$fa-var-print: "\f02f"; -$fa-var-product-hunt: "\f288"; -$fa-var-puzzle-piece: "\f12e"; -$fa-var-qq: "\f1d6"; -$fa-var-qrcode: "\f029"; -$fa-var-question: "\f128"; -$fa-var-question-circle: "\f059"; -$fa-var-question-circle-o: "\f29c"; -$fa-var-quora: "\f2c4"; -$fa-var-quote-left: "\f10d"; -$fa-var-quote-right: "\f10e"; -$fa-var-ra: "\f1d0"; -$fa-var-random: "\f074"; -$fa-var-ravelry: "\f2d9"; -$fa-var-rebel: "\f1d0"; -$fa-var-recycle: "\f1b8"; -$fa-var-reddit: "\f1a1"; -$fa-var-reddit-alien: "\f281"; -$fa-var-reddit-square: "\f1a2"; -$fa-var-refresh: "\f021"; -$fa-var-registered: "\f25d"; -$fa-var-remove: "\f00d"; -$fa-var-renren: "\f18b"; -$fa-var-reorder: "\f0c9"; -$fa-var-repeat: "\f01e"; -$fa-var-reply: "\f112"; -$fa-var-reply-all: "\f122"; -$fa-var-resistance: "\f1d0"; -$fa-var-retweet: "\f079"; -$fa-var-rmb: "\f157"; -$fa-var-road: "\f018"; -$fa-var-rocket: "\f135"; -$fa-var-rotate-left: "\f0e2"; -$fa-var-rotate-right: "\f01e"; -$fa-var-rouble: "\f158"; -$fa-var-rss: "\f09e"; -$fa-var-rss-square: "\f143"; -$fa-var-rub: "\f158"; -$fa-var-ruble: "\f158"; -$fa-var-rupee: "\f156"; -$fa-var-s15: "\f2cd"; -$fa-var-safari: "\f267"; -$fa-var-save: "\f0c7"; -$fa-var-scissors: "\f0c4"; -$fa-var-scribd: "\f28a"; -$fa-var-search: "\f002"; -$fa-var-search-minus: "\f010"; -$fa-var-search-plus: "\f00e"; -$fa-var-sellsy: "\f213"; -$fa-var-send: "\f1d8"; -$fa-var-send-o: "\f1d9"; -$fa-var-server: "\f233"; -$fa-var-share: "\f064"; -$fa-var-share-alt: "\f1e0"; -$fa-var-share-alt-square: "\f1e1"; -$fa-var-share-square: "\f14d"; -$fa-var-share-square-o: "\f045"; -$fa-var-shekel: "\f20b"; -$fa-var-sheqel: "\f20b"; -$fa-var-shield: "\f132"; -$fa-var-ship: "\f21a"; -$fa-var-shirtsinbulk: "\f214"; -$fa-var-shopping-bag: "\f290"; -$fa-var-shopping-basket: "\f291"; -$fa-var-shopping-cart: "\f07a"; -$fa-var-shower: "\f2cc"; -$fa-var-sign-in: "\f090"; -$fa-var-sign-language: "\f2a7"; -$fa-var-sign-out: "\f08b"; -$fa-var-signal: "\f012"; -$fa-var-signing: "\f2a7"; -$fa-var-simplybuilt: "\f215"; -$fa-var-sitemap: "\f0e8"; -$fa-var-skyatlas: "\f216"; -$fa-var-skype: "\f17e"; -$fa-var-slack: "\f198"; -$fa-var-sliders: "\f1de"; -$fa-var-slideshare: "\f1e7"; -$fa-var-smile-o: "\f118"; -$fa-var-snapchat: "\f2ab"; -$fa-var-snapchat-ghost: "\f2ac"; -$fa-var-snapchat-square: "\f2ad"; -$fa-var-snowflake-o: "\f2dc"; -$fa-var-soccer-ball-o: "\f1e3"; -$fa-var-sort: "\f0dc"; -$fa-var-sort-alpha-asc: "\f15d"; -$fa-var-sort-alpha-desc: "\f15e"; -$fa-var-sort-amount-asc: "\f160"; -$fa-var-sort-amount-desc: "\f161"; -$fa-var-sort-asc: "\f0de"; -$fa-var-sort-desc: "\f0dd"; -$fa-var-sort-down: "\f0dd"; -$fa-var-sort-numeric-asc: "\f162"; -$fa-var-sort-numeric-desc: "\f163"; -$fa-var-sort-up: "\f0de"; -$fa-var-soundcloud: "\f1be"; -$fa-var-space-shuttle: "\f197"; -$fa-var-spinner: "\f110"; -$fa-var-spoon: "\f1b1"; -$fa-var-spotify: "\f1bc"; -$fa-var-square: "\f0c8"; -$fa-var-square-o: "\f096"; -$fa-var-stack-exchange: "\f18d"; -$fa-var-stack-overflow: "\f16c"; -$fa-var-star: "\f005"; -$fa-var-star-half: "\f089"; -$fa-var-star-half-empty: "\f123"; -$fa-var-star-half-full: "\f123"; -$fa-var-star-half-o: "\f123"; -$fa-var-star-o: "\f006"; -$fa-var-steam: "\f1b6"; -$fa-var-steam-square: "\f1b7"; -$fa-var-step-backward: "\f048"; -$fa-var-step-forward: "\f051"; -$fa-var-stethoscope: "\f0f1"; -$fa-var-sticky-note: "\f249"; -$fa-var-sticky-note-o: "\f24a"; -$fa-var-stop: "\f04d"; -$fa-var-stop-circle: "\f28d"; -$fa-var-stop-circle-o: "\f28e"; -$fa-var-street-view: "\f21d"; -$fa-var-strikethrough: "\f0cc"; -$fa-var-stumbleupon: "\f1a4"; -$fa-var-stumbleupon-circle: "\f1a3"; -$fa-var-subscript: "\f12c"; -$fa-var-subway: "\f239"; -$fa-var-suitcase: "\f0f2"; -$fa-var-sun-o: "\f185"; -$fa-var-superpowers: "\f2dd"; -$fa-var-superscript: "\f12b"; -$fa-var-support: "\f1cd"; -$fa-var-table: "\f0ce"; -$fa-var-tablet: "\f10a"; -$fa-var-tachometer: "\f0e4"; -$fa-var-tag: "\f02b"; -$fa-var-tags: "\f02c"; -$fa-var-tasks: "\f0ae"; -$fa-var-taxi: "\f1ba"; -$fa-var-telegram: "\f2c6"; -$fa-var-television: "\f26c"; -$fa-var-tencent-weibo: "\f1d5"; -$fa-var-terminal: "\f120"; -$fa-var-text-height: "\f034"; -$fa-var-text-width: "\f035"; -$fa-var-th: "\f00a"; -$fa-var-th-large: "\f009"; -$fa-var-th-list: "\f00b"; -$fa-var-themeisle: "\f2b2"; -$fa-var-thermometer: "\f2c7"; -$fa-var-thermometer-0: "\f2cb"; -$fa-var-thermometer-1: "\f2ca"; -$fa-var-thermometer-2: "\f2c9"; -$fa-var-thermometer-3: "\f2c8"; -$fa-var-thermometer-4: "\f2c7"; -$fa-var-thermometer-empty: "\f2cb"; -$fa-var-thermometer-full: "\f2c7"; -$fa-var-thermometer-half: "\f2c9"; -$fa-var-thermometer-quarter: "\f2ca"; -$fa-var-thermometer-three-quarters: "\f2c8"; -$fa-var-thumb-tack: "\f08d"; -$fa-var-thumbs-down: "\f165"; -$fa-var-thumbs-o-down: "\f088"; -$fa-var-thumbs-o-up: "\f087"; -$fa-var-thumbs-up: "\f164"; -$fa-var-ticket: "\f145"; -$fa-var-times: "\f00d"; -$fa-var-times-circle: "\f057"; -$fa-var-times-circle-o: "\f05c"; -$fa-var-times-rectangle: "\f2d3"; -$fa-var-times-rectangle-o: "\f2d4"; -$fa-var-tint: "\f043"; -$fa-var-toggle-down: "\f150"; -$fa-var-toggle-left: "\f191"; -$fa-var-toggle-off: "\f204"; -$fa-var-toggle-on: "\f205"; -$fa-var-toggle-right: "\f152"; -$fa-var-toggle-up: "\f151"; -$fa-var-trademark: "\f25c"; -$fa-var-train: "\f238"; -$fa-var-transgender: "\f224"; -$fa-var-transgender-alt: "\f225"; -$fa-var-trash: "\f1f8"; -$fa-var-trash-o: "\f014"; -$fa-var-tree: "\f1bb"; -$fa-var-trello: "\f181"; -$fa-var-tripadvisor: "\f262"; -$fa-var-trophy: "\f091"; -$fa-var-truck: "\f0d1"; -$fa-var-try: "\f195"; -$fa-var-tty: "\f1e4"; -$fa-var-tumblr: "\f173"; -$fa-var-tumblr-square: "\f174"; -$fa-var-turkish-lira: "\f195"; -$fa-var-tv: "\f26c"; -$fa-var-twitch: "\f1e8"; -$fa-var-twitter: "\f099"; -$fa-var-twitter-square: "\f081"; -$fa-var-umbrella: "\f0e9"; -$fa-var-underline: "\f0cd"; -$fa-var-undo: "\f0e2"; -$fa-var-universal-access: "\f29a"; -$fa-var-university: "\f19c"; -$fa-var-unlink: "\f127"; -$fa-var-unlock: "\f09c"; -$fa-var-unlock-alt: "\f13e"; -$fa-var-unsorted: "\f0dc"; -$fa-var-upload: "\f093"; -$fa-var-usb: "\f287"; -$fa-var-usd: "\f155"; -$fa-var-user: "\f007"; -$fa-var-user-circle: "\f2bd"; -$fa-var-user-circle-o: "\f2be"; -$fa-var-user-md: "\f0f0"; -$fa-var-user-o: "\f2c0"; -$fa-var-user-plus: "\f234"; -$fa-var-user-secret: "\f21b"; -$fa-var-user-times: "\f235"; -$fa-var-users: "\f0c0"; -$fa-var-vcard: "\f2bb"; -$fa-var-vcard-o: "\f2bc"; -$fa-var-venus: "\f221"; -$fa-var-venus-double: "\f226"; -$fa-var-venus-mars: "\f228"; -$fa-var-viacoin: "\f237"; -$fa-var-viadeo: "\f2a9"; -$fa-var-viadeo-square: "\f2aa"; -$fa-var-video-camera: "\f03d"; -$fa-var-vimeo: "\f27d"; -$fa-var-vimeo-square: "\f194"; -$fa-var-vine: "\f1ca"; -$fa-var-vk: "\f189"; -$fa-var-volume-control-phone: "\f2a0"; -$fa-var-volume-down: "\f027"; -$fa-var-volume-off: "\f026"; -$fa-var-volume-up: "\f028"; -$fa-var-warning: "\f071"; -$fa-var-wechat: "\f1d7"; -$fa-var-weibo: "\f18a"; -$fa-var-weixin: "\f1d7"; -$fa-var-whatsapp: "\f232"; -$fa-var-wheelchair: "\f193"; -$fa-var-wheelchair-alt: "\f29b"; -$fa-var-wifi: "\f1eb"; -$fa-var-wikipedia-w: "\f266"; -$fa-var-window-close: "\f2d3"; -$fa-var-window-close-o: "\f2d4"; -$fa-var-window-maximize: "\f2d0"; -$fa-var-window-minimize: "\f2d1"; -$fa-var-window-restore: "\f2d2"; -$fa-var-windows: "\f17a"; -$fa-var-won: "\f159"; -$fa-var-wordpress: "\f19a"; -$fa-var-wpbeginner: "\f297"; -$fa-var-wpexplorer: "\f2de"; -$fa-var-wpforms: "\f298"; -$fa-var-wrench: "\f0ad"; -$fa-var-xing: "\f168"; -$fa-var-xing-square: "\f169"; -$fa-var-y-combinator: "\f23b"; -$fa-var-y-combinator-square: "\f1d4"; -$fa-var-yahoo: "\f19e"; -$fa-var-yc: "\f23b"; -$fa-var-yc-square: "\f1d4"; -$fa-var-yelp: "\f1e9"; -$fa-var-yen: "\f157"; -$fa-var-yoast: "\f2b1"; -$fa-var-youtube: "\f167"; -$fa-var-youtube-play: "\f16a"; -$fa-var-youtube-square: "\f166"; - diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/font-awesome.scss b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/font-awesome.scss deleted file mode 100644 index f1c83aaa5d24da542d81b09677307f47f374401e..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/font-awesome/scss/font-awesome.scss +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables"; -@import "mixins"; -@import "path"; -@import "core"; -@import "larger"; -@import "fixed-width"; -@import "list"; -@import "bordered-pulled"; -@import "animated"; -@import "rotated-flipped"; -@import "stacked"; -@import "icons"; -@import "screen-reader"; diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/layui.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/layui.css deleted file mode 100644 index d4ad4bb757cbb52bc87dbfb3b37e0d6cfa9d80d0..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/layui.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - .layui-laypage a,a{text-decoration:none}.layui-btn,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}.layui-btn,.layui-tree li i,.layui-unselect{-moz-user-select:none}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}li{list-style:none}table{border-collapse:collapse;border-spacing:0}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;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-button:vertical{display:none}::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background-color:#e2e2e2}::-webkit-scrollbar-thumb{border-radius:0;background-color:rgba(0,0,0,.3)}::-webkit-scrollbar-thumb:vertical:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar-thumb:vertical:active{background-color:rgba(0,0,0,.38)}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.9);src:url(../font/iconfont.eot?v=1.0.9#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.9) format('woff'),url(../font/iconfont.ttf?v=1.0.9) format('truetype'),url(../font/iconfont.svg?v=1.0.9#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;background-color:#e2e2e2;clear:both}a{color:#333}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge{position:absolute;width:0;height:0;border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.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-main{position:relative;width:1140px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;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;height:44px;background-color:#eee}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-transition:border-color .3s cubic-bezier(.65,.05,.35,.5);transition:border-color .3s cubic-bezier(.65,.05,.35,.5);-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-color:#e2e2e2;border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border:1px solid #e2e2e2}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border:none;border-top:1px solid #e2e2e2}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;width:0;height:6px;border-radius:20px;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px;text-align:right}.layui-progress-text{position:absolute;right:0;top:-16px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border:1px solid #e2e2e2;border-radius:2px}.layui-colla-item{border-top:1px solid #e2e2e2}.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:#f2f2f2;cursor:pointer}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;border-top:1px solid #e2e2e2;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-bg-red{background-color:#FF5722}.layui-bg-orange{background-color:#F7B824}.layui-bg-green{background-color:#009688}.layui-bg-cyan{background-color:#2F4056}.layui-bg-blue{background-color:#1E9FFF}.layui-bg-black{background-color:#393D49}.layui-bg-gray{background-color:#eee}.layui-word-aux{font-size:12px;color:#999;padding:0 5px}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer;opacity:.9;filter:alpha(opacity=90)}.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-radius{border-radius:100px}.layui-btn .layui-icon{font-size:18px;vertical-align:bottom}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#F7B824}.layui-btn-danger{background-color:#FF5722}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-big{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-small{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-small i{font-size:16px!important}.layui-btn-mini{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-mini i{font-size:14px!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:#C9C9C9;color:#009688}.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 #c9c9c9}.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-input,.layui-select,.layui-textarea{height:38px;line-height:38px;line-height:36px\9;border:1px solid #e6e6e6;background-color:#fff;border-radius:2px}.layui-form-label,.layui-form-mid,.layui-textarea{line-height:20px;position:relative}.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:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;text-align:right}.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{float:left;display:block;padding:8px 0;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border:1px solid #FF5722!important}.layui-form-select{position:relative}.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;transition:all .3s;-webkit-transition:all .3s}.layui-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}.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:#f2f2f2}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-radio,.layui-form-radio *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:28px;margin:4px 10px 0 0;padding-right:30px;border:1px solid #d2d2d2;cursor:pointer;font-size:0;border-radius:2px;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box!important}.layui-form-checkbox:hover{border:1px solid #c2c2c2}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;width:30px;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-checkbox[lay-skin=primary]{margin-top:6px;border:none!important;padding-right:0}.layui-form-checkbox[lay-skin=primary] span{float:right;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{position:relative;top:0;width:16px;line-height:16px;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:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-switch{position:relative;height:22px;line-height:22px;width:42px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;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 em{position:absolute;right:5px;top:0;width:25px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-form-onswitch i{left:32px;background-color:#fff}.layui-form-onswitch em{left:5px;right:auto;color:#fff!important}.layui-checkbox-disbaled{border-color:#e2e2e2!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio span{font-size:14px}.layui-form-radio i:hover,.layui-form-radioed i{color:#5FB878}.layui-radio-disbaled i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border:1px solid #e6e6e6;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.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-right:1px solid #e6e6e6;border-radius:2px;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;text-align:left}.layui-laypage button,.layui-laypage input,.layui-nav{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important}.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:1px solid #e6e6e6}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}.layui-layedit{border:1px solid #d2d2d2;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom:1px solid #e2e2e2;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-table{width:100%;margin:10px 0;background-color:#fff}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table thead tr{background-color:#f2f2f2}.layui-table th{text-align:left}.layui-table td,.layui-table th{padding:9px 15px;min-height:20px;line-height:20px;border:1px solid #e2e2e2;font-size:14px}.layui-table tr:hover,.layui-table[lay-even] tr:nth-child(even){background-color:#f8f8f8}.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border:1px solid #e2e2e2}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border:none;border-bottom:1px solid #e2e2e2}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border:none;border-right:1px solid #e2e2e2}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-upload-button{position:relative;display:inline-block;vertical-align:middle;min-width:60px;height:38px;line-height:38px;border:1px solid #DFDFDF;border-radius:2px;overflow:hidden;background-color:#fff;color:#666}.layui-upload-button:hover{border:1px solid #aaa;color:#333}.layui-upload-button:active{border:1px solid #4CAF50;color:#000}.layui-upload-button input,.layui-upload-file{opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-upload-button input{position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%}.layui-upload-icon{display:block;margin:0 15px;text-align:center}.layui-upload-icon i{margin-right:5px;vertical-align:top;font-size:20px;color:#5FB878}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}.layui-upload-enter .layui-upload-icon,.layui-upload-enter .layui-upload-icon i{color:#fff}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.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-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>:first-child,.layui-laypage>:first-child em{border-radius:2px 0 0 2px}.layui-laypage>:last-child,.layui-laypage>:last-child em{border-radius:0 2px 2px 0}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;border:1px solid #e2e2e2;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage em{font-style:normal}.layui-laypage span{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff;font-weight:400}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.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-total{height:30px;line-height:30px;margin-left:1px;border:none;font-weight:400}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border:1px solid #e2e2e2;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box!important}.layui-laypage input{width:50px;margin:0 5px;text-align:center}.layui-laypage button{margin-left:5px;padding:0 15px;cursor:pointer}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#c2c2c2;border-radius:2px;font-size:0;box-sizing:border-box!important}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#c2c2c2;transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#c2c2c2 transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:28px;right:3px;border-width:6px}.layui-nav .layui-nav-mored,.layui-nav-itemed .layui-nav-more{top:22px;border-style:dashed dashed solid;border-color:transparent transparent #c2c2c2}.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 #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#333}.layui-nav-child dd{position:relative}.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this a{color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;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{background-color:#2B2E37!important;color:#fff!important}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#c2c2c2}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{top:20px;right:10px}.layui-nav-itemed .layui-nav-more{top:14px}.layui-nav-itemed .layui-nav-child{display:block;padding:0}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb a{padding-right:8px;line-height:22px;font-size:14px;color:#333!important}.layui-breadcrumb a:hover{color:#01AAED!important}.layui-breadcrumb a cite,.layui-breadcrumb a span{color:#666;cursor:text;font-style:normal}.layui-breadcrumb a span{padding-left:8px;font-family:Sim sun}.layui-tab{margin:10px 0;text-align:left!important}.layui-fixbar li,.layui-tab-bar,.layui-tab-title li,.layui-util-face ul li{cursor:pointer;text-align:center}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom:1px solid #e2e2e2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 10px}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border:1px solid #e2e2e2;border-bottom-color:#fff;border-radius:2px 2px 0 0;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border:1px solid #e2e2e2;border-radius:2px;background-color:#fff}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item,.layui-util-face .layui-layer-TipsG{display:none}.layui-tab-more{padding-right:30px;height:auto;white-space:normal}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;margin-left:8px;top:1px;color:#c2c2c2;transition:all .2s;-webkit-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:#009688}.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:3px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border:1px solid #e2e2e2;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.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:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:9999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;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:#666;box-shadow: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{float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-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,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}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-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;-ms-transform:scale(.5);transform:scale(.5)}80%{opacity:.8;-ms-transform:scale(1.1);transform:scale(1.1)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@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;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}} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/layui.mobile.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/layui.mobile.css deleted file mode 100644 index fde215c69aef4b0da55ca004d9fe9bfc343c46ed..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/layui.mobile.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) 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-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/code.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/code.css deleted file mode 100644 index 7e0c0b7b3a920ef0763955b2e027ec24ebf10328..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/code.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:30px;line-height:30px;border-bottom:1px solid #ddd}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #ddd;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/laydate/laydate.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/laydate/laydate.css deleted file mode 100644 index 08948df172b9a62ea0bc47d51946d7cf1410e25a..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/laydate/laydate.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - #layuicss-laydatecss{display:none;position:absolute;width:1989px}.laydate_body .laydate_box,.laydate_body .laydate_box *{margin:0;padding:0;box-sizing:content-box}.laydate-icon,.laydate-icon-dahong,.laydate-icon-danlan,.laydate-icon-default,.laydate-icon-molv{height:22px;line-height:22px;padding-right:20px;border:1px solid #C6C6C6;background-repeat:no-repeat;background-position:right center;background-color:#fff;outline:0}.laydate-icon-default{background-image:url(../skins/default/icon.png)}.laydate-icon-danlan{border:1px solid #B1D2EC;background-image:url(../skins/danlan/icon.png)}.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}.laydate_body .laydate_box{width:240px;font:12px '\5B8B\4F53';z-index:99999999;*overflow:hidden;_margin:0;_position:absolute!important}.laydate_body .laydate_box li{list-style:none}.laydate_body .laydate_box .laydate_void{cursor:text!important}.laydate_body .laydate_box cite,.laydate_body .laydate_box label{position:absolute;width:0;height:0;border-width:5px;border-style:dashed;border-color:transparent;overflow:hidden;cursor:pointer}.laydate_body .laydate_box .laydate_time,.laydate_body .laydate_box .laydate_yms{display:none}.laydate_body .laydate_box .laydate_show{display:block}.laydate_body .laydate_box input{outline:0;font-size:14px;background-color:#fff;color:#333}.laydate_body .laydate_top{position:relative;height:26px;padding:5px;*width:100%;z-index:99}.laydate_body .laydate_ym{position:relative;float:left;height:24px;cursor:pointer}.laydate_body .laydate_ym input{float:left;height:24px;line-height:24px;text-align:center;border:none;cursor:pointer}.laydate_body .laydate_ym .laydate_yms{position:absolute;left:-1px;top:24px;height:181px}.laydate_body .laydate_y{width:121px;margin-right:6px}.laydate_body .laydate_y input{width:64px;margin-right:15px}.laydate_body .laydate_y .laydate_yms{width:121px;text-align:center}.laydate_body .laydate_y .laydate_yms a{position:relative;display:block;height:20px}.laydate_body .laydate_y .laydate_yms ul{height:139px;padding:0;*overflow:hidden}.laydate_body .laydate_y .laydate_yms ul li{float:left;width:60px;height:20px;line-height:20px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate_body .laydate_m{width:99px}.laydate_body .laydate_m .laydate_yms{width:99px;padding:0}.laydate_body .laydate_m input{width:42px;margin-right:15px}.laydate_body .laydate_m .laydate_yms span{display:block;float:left;width:42px;margin:5px 0 0 5px;line-height:24px;text-align:center;_display:inline}.laydate_body .laydate_choose{display:block;float:left;position:relative;width:20px;height:24px}.laydate_body .laydate_choose cite,.laydate_body .laydate_tab cite{left:50%;top:50%}.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px;border-bottom-style:solid}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{top:50%;margin:-2px 0 0 -5px;border-top-style:solid}.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px}.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px}.laydate_body .laydate_ym label{right:28px}.laydate_body .laydate_table{width:230px;margin:0 5px;border-collapse:collapse;border-spacing:0}.laydate_body .laydate_table td{width:31px;text-align:center;cursor:pointer;font-size:12px}.laydate_body .laydate_table thead th{font-weight:400;font-size:12px;text-align:center}.laydate_body .laydate_bottom{position:relative;height:22px;line-height:20px;padding:5px;font-size:12px}.laydate_body .laydate_bottom #laydate_hms{position:relative;z-index:1;float:left}.laydate_body .laydate_time{position:absolute;left:5px;bottom:26px;width:129px;height:125px;*overflow:hidden}.laydate_body .laydate_time .laydate_hmsno{padding:5px 0 0 5px}.laydate_body .laydate_time .laydate_hmsno span{display:block;float:left;width:24px;height:19px;line-height:19px;text-align:center;cursor:pointer;*margin-bottom:-5px}.laydate_body .laydate_time1{width:228px;height:154px}.laydate_body .laydate_time1 .laydate_hmsno{padding:6px 0 0 8px}.laydate_body .laydate_time1 .laydate_hmsno span{width:21px;height:20px;line-height:20px}.laydate_body .laydate_msg{left:49px;bottom:67px;width:141px;height:auto;overflow:hidden}.laydate_body .laydate_msg p{padding:5px 10px}.laydate_body .laydate_bottom li{float:left;height:20px;line-height:20px;border-right:none;font-weight:900}.laydate_body .laydate_bottom .laydate_sj{width:33px;text-align:center;font-weight:400}.laydate_body .laydate_bottom input{float:left;width:21px;height:20px;line-height:20px;border:none;text-align:center;cursor:pointer;font-size:12px;font-weight:400}.laydate_body .laydate_bottom .laydte_hsmtex{height:20px;line-height:20px;text-align:center}.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute;width:20px;top:0;right:0;cursor:pointer}.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px}.laydate_body .laydate_bottom .laydate_btn{position:absolute;right:5px;top:5px}.laydate_body .laydate_bottom .laydate_btn a{float:left;height:20px;padding:0 6px;_padding:0 5px}.laydate_body .laydate_table td,.laydate_body .laydate_table thead{height:21px!important;line-height:21px!important}.laydate-icon{border:1px solid #C6C6C6;background-image:url(icon.png)}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_bottom .laydate_btn a,.laydate_body .laydate_box,.laydate_body .laydate_table,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_ym,.laydate_body .laydate_ym .laydate_yms{border:1px solid #ccc}.laydate_body .laydate_bottom .laydte_hsmtex,.laydate_body .laydate_choose,.laydate_body .laydate_table thead,.laydate_body .laydate_y .laydate_yms a{background-color:#F6F6F6}.laydate_body .laydate_box,.laydate_body .laydate_time,.laydate_body .laydate_ym .laydate_yms{box-shadow:2px 2px 5px rgba(0,0,0,.1)}.laydate_body .laydate_box{border-top:none;border-bottom:none;background-color:#fff;color:#333}.laydate_body .laydate_box .laydate_void{color:#ccc!important}.laydate_body .laydate_box .laydate_void:hover{background-color:#fff!important}.laydate_body .laydate_box a,.laydate_body .laydate_box a:hover{text-decoration:none;blr:expression(this.onFocus=this.blur());cursor:pointer;color:#333}.laydate_body .laydate_box a:hover{text-decoration:none;color:#666}.laydate_body .laydate_click{background-color:#eee!important}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_choose:hover,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_y .laydate_yms a:hover{background-color:#fff}.laydate_body .laydate_top{border-top:1px solid #C6C6C6}.laydate_body .laydate_ym .laydate_yms{border:1px solid #C6C6C6;background-color:#fff}.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #C6C6C6;border-bottom:none}.laydate_body .laydate_choose{border-left:1px solid #C6C6C6}.laydate_body .laydate_chprev{border-left:none;border-right:1px solid #C6C6C6}.laydate_body .laydate_chtop cite{border-bottom-color:#666}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{border-top-color:#666}.laydate_body .laydate_chprev cite{border-right-style:solid;border-right-color:#666}.laydate_body .laydate_chnext cite{border-left-style:solid;border-left-color:#666}.laydate_body .laydate_table td{border:none}.laydate_body .laydate_table .laydate_nothis{color:#999}.laydate_body .laydate_table thead th{border-bottom:1px solid #ccc}.laydate_body .laydate_bottom,.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_sj{border-right:1px solid #C6C6C6;background-color:#F6F6F6}.laydate_body .laydate_bottom input{background-color:#fff}.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_v{position:absolute;left:10px;top:6px;font-family:Courier;z-index:0;color:#999}.laydate_body .laydate_bottom .laydate_btn a{border-right:none;background-color:#F6F6F6}.laydate_body .laydate_bottom .laydate_btn a:hover{color:#000;background-color:#fff}.laydate_body .laydate_m .laydate_yms span:hover,.laydate_body .laydate_table td:hover,.laydate_body .laydate_time .laydate_hmsno span:hover,.laydate_body .laydate_y .laydate_yms ul li:hover{background-color:#F3F3F3} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/layer/default/layer.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/layer/default/layer.css deleted file mode 100644 index fb04327dbd284e70b8ab33da3ba0b5c8ca06d922..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/layer/default/layer.css +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}*html{background-image:url(about:blank);background-attachment:fixed}html #layuicss-skinlayercss{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;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;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) center center no-repeat #eee}.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}.layui-layer{border-radius:2px;-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{-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:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;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 10px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:6px 6px 0;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;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:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.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:5px 10px;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:1px;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:#BBB5B5;border:none}.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}.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:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.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;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;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.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.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-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_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:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;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%;overflow:hidden;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-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/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/markdown/markdown-editor.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/markdown/markdown-editor.css deleted file mode 100755 index 0e0d991107617ed5cb342ba632d9f9576db391bd..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/markdown/markdown-editor.css +++ /dev/null @@ -1,101 +0,0 @@ -/* markdown editor css */ -.layui-markdown .tools { - position: relative; - display: block; - top: 1px; - left: 0; - padding: 0 10px; - border: 1px solid #e6e6e6; - border-radius: 2px 2px 0 0; - background-color: #FBFBFB; - height: 40px; - overflow: hidden; -} - -.layui-markdown .tools span { - cursor: pointer; - padding: 0 10px; - line-height: 38px; - color: #009E94; -} -.layui-markdown .tools span.tool-tip { - padding: 0; -} -@media screen and (max-width: 500px) { - .layui-markdown .tools span.tool-tip, - span.tool-tip{ - display: none; - } -} -.layui-markdown .tools span.divide { - border-right: 1px solid #d2d2d2; - padding-right: 15px; - margin-right: 5px; -} -.layui-markdown .tools span.hide { - display: none; -} - -.layui-markdown .tools span i { - padding-right: 6px; - font-size: 18px; - position: relative; - top: -1px; -} - -.layui-markdown textarea { - line-height: 20px; - width: 100%; - min-height: 100px; - padding: 6px 10px; - resize: vertical; - font-family: 'YaHei Consolas Hybrid', Consolas, '微软雅黑', 'Meiryo UI', - 'Malgun Gothic', 'Segoe UI', 'Trebuchet MS', Helvetica, Monaco, courier, monospace; - border: 1px solid #e6e6e6; - background-color: #fff; - border-radius: 2px; - -webkit-box-sizing: border-box !important; -} - -.layui-markdown textarea:hover { - border-color: #D2D2D2 !important; -} - -.layui-markdown.full-screen { - position: fixed; - z-index: 1112; - width: 100%; - height: 100%; - top: -2px; - left: 0; -} -.article-preview.full, -.layui-markdown.full-screen{ - animation-name: bounceIn; - animation-fill-mode: both; - animation-duration: .1s; -} -.layui-markdown.full-screen textarea { - height: 95%; -} -.layui-markdown.half { - width: 48%; -} - -/* markdown tools style */ -.btn-upload { - margin-left: 5px; - display: inline-block; - color: #1AA094; - border: 1px solid #1AA094; - transform: translateY(-2px); - font-size: 17px; - padding: 0 10px; -} -@media screen and (max-width: 410px) { - .btn-upload { - display: block; - margin-top: 10px; - margin-left: 0!important; - } -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/markdown/markdown.css b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/markdown/markdown.css deleted file mode 100755 index 8791585f0d6849c6d9af3e7ad2491e84a27dd161..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/css/modules/markdown/markdown.css +++ /dev/null @@ -1,171 +0,0 @@ -.layui-markdown { - -} -.layui-markdown ul, -.layui-markdown ol { - padding: 0; -} - -.layui-markdown p { - line-height: 200%; - color: #636363; -} -.layui-markdown a { - color: #B34E22; -} -.layui-markdown a:hover { - color: #009688; -} - -.layui-markdown h1, -.layui-markdown h2, -.layui-markdown h3, -.layui-markdown h4, -.layui-markdown h5, -.layui-markdown h6 { - color: #0B8CD6; - font-weight: 500; -} - -.layui-markdown h1 { - color: #0B8CD6; - margin: 35px 0 15px; - font-size: 30px; -} - -.layui-markdown h2 { - margin: 30px 0 15px; - font-size: 26px; -} - -.layui-markdown h3 { - margin-top: 20px; - font-size: 21px; - font-weight: 200; - line-height: 1.5; -} - -.layui-markdown h4 { - margin-top: 10px; - font-size: 18px; - line-height: 1.5; -} -.layui-markdown h5, -.layui-markdown h6 { - font-size: 16px; -} -.layui-markdown h5 { - margin-top: 10px; -} -.layui-markdown h6 { - margin-top: 5px; -} - -.layui-markdown ul li { - list-style: disc; - margin-left: 30px; - color: #009688; -} -.layui-markdown ol li { - list-style: decimal; - margin-left: 30px; - color: #009688; -} - -.layui-markdown hr { - border: 0; - border-bottom: 1px dashed #cfcfcf; - background: none; - margin: 30px 0; - clear: none; -} - -.layui-markdown blockquote { - padding: 8px 5px 8px 15px; - color: #777; - background: rgba(102,128,153,.05); - border-left: 4px solid #009688; - margin-top: 10px; - margin-bottom: 20px; -} -.layui-markdown pre { - padding: 16px; - overflow: auto; - font-size: 85%; - line-height: 1.5; - background-color: #F2F2F2; - border: 0; - border-radius: 3px; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin-bottom: 5px; - margin-top: 10px; -} - -.layui-markdown p code { - padding: 3px 6px 4px; - font-size: 90%; - background-color: rgb(251, 220, 182); - border: 0; - border-radius: 3px; - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; -} - -.layui-markdown code { - font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; -} - - -.layui-markdown img { - max-width: 100%; - border: 1px solid #fefefe; - box-shadow: rgba(0,0,0,0.35) 0px 0px 10px; - margin-top: 10px; - margin-bottom: 10px; -} -.article-show .layui-markdown img { - cursor: url("/public/img/zoom-in.ico"), default; -} -img.zoom-out { - max-width: 100%; -} -.layui-markdown img.face { - border: none; - box-shadow: none; - margin: 0 1px; -} - -.layui-markdown .footnote-ref { - vertical-align: baseline; - top: -2px; - font-size: 75%; - line-height: 0; - position: relative; -} - -/* table */ -.layui-markdown table { - border-collapse: collapse; - border-spacing: 0; - display: block; - width: 100%; - overflow: auto; - word-break: keep-all; - margin-top: 20px; -} -.layui-markdown table thead tr{ - background: #F2F2F2; -} -.layui-markdown table th, -.layui-markdown table td { - padding: 5px 15px; - border: 1px solid #ddd; -} -.layui-markdown table th { - font-weight: bold; -} -.layui-markdown table > tbody > tr:nth-child(odd) { - background: #fff; -} -.layui-markdown table > tbody > tr:nth-child(even) { - background: #F2F2F2; -} \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/font/iconfont.eot b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/font/iconfont.eot deleted file mode 100644 index bd899838fd07b3f32bff5b425cb104e81f64afaa..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/font/iconfont.eot and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/font/iconfont.ttf b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/font/iconfont.ttf deleted file mode 100644 index 7410faa92d9bca5deecaeee33012af168c5e32aa..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/font/iconfont.ttf and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/20.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/20.gif deleted file mode 100644 index 50631a6e314179d0761b4ee664616ad2162ba147..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/20.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/21.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/21.gif deleted file mode 100644 index b98421282467fb377dced2eabd72bcc5525f3e8e..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/21.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/23.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/23.gif deleted file mode 100644 index e05e0f97a3674d02e0f160c5193f54f6b3a30fdc..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/23.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/28.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/28.gif deleted file mode 100644 index fc5a0cfafa213e9861135c8ced7b87ebea74c269..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/28.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/30.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/30.gif deleted file mode 100644 index b751f98abcf8173ae3c08402c99ae885a0dfe162..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/30.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/31.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/31.gif deleted file mode 100644 index c9476d79608dacdc613410702804e5ce7483cb67..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/31.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/32.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/32.gif deleted file mode 100644 index 9931b0636bc8f30b2172b608a44a90119b29ced6..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/32.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/40.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/40.gif deleted file mode 100644 index ae429912d6d6f74dfffd19376ec1fdee426d8036..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/40.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/42.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/42.gif deleted file mode 100644 index 0eb1434b4e81d4437098efe06cb4e1ab44a86211..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/42.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/47.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/47.gif deleted file mode 100644 index 58a083611d7c1afd95d136e3a7fa798c86d0c2ef..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/47.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/51.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/51.gif deleted file mode 100644 index ad3f4d3a8158106dbfa48e521084e6c56fc6406f..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/51.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/57.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/57.gif deleted file mode 100644 index 0bf130f0d930a1fb72ca83265bb504304cb08090..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/57.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/58.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/58.gif deleted file mode 100644 index 0f065087d4720326776b26c7b9d2482c9e467bca..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/58.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/60.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/60.gif deleted file mode 100644 index 6e15f89d79ed82cdb1f53aed2378d887915528f3..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/60.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/64.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/64.gif deleted file mode 100644 index a7797198af0f3bb98361b1b8737784d0a8c2cba0..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/64.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/68.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/68.gif deleted file mode 100644 index 1a6c400d2aee3c2bf384ea98105ea143a7be97a9..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/68.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/8.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/8.gif deleted file mode 100644 index 66f967b48da173b68cbfc92986e4426ea35ade74..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/8.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/9.gif b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/9.gif deleted file mode 100644 index 60447400d31b035f56554b29af1aefc76bda1698..0000000000000000000000000000000000000000 Binary files a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/images/face/9.gif and /dev/null differ diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/dest/layui.all.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/dest/layui.all.js deleted file mode 100644 index 3a2208baef576d819905424ff1eebf1efe8b785a..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/dest/layui.all.js +++ /dev/null @@ -1,5 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;!function(e){"use strict";var t=function(){this.v="1.0.9"};t.fn=t.prototype;var n=document,o=t.fn.cache={},i=function(){var e=n.scripts,t=e[e.length-1].src;return t.substring(0,t.lastIndexOf("/")+1)}(),r=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},l="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),a={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"dest/layui.all"};o.modules={},o.status={},o.timeout=10,o.event={},t.fn.define=function(e,t){var n=this,i="function"==typeof e,r=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return i&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?r.call(n):(n.use(e,r),n)},t.fn.use=function(e,t,u){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[m]=t,y.removeChild(p),function i(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void(o.status[m]?c():setTimeout(i,4))}())}function c(){u.push(layui[m]),e.length>1?f.use(e.slice(1),t,u):"function"==typeof t&&t.apply(layui,u)}var f=this,d=o.dir=o.dir?o.dir:i,y=n.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(f.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=jQuery);var m=e[0],v=0;if(u=u||[],o.host=o.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&a[m]||!layui["layui.all"]&&layui["layui.mobile"]&&a[m])return c(),f;var p=n.createElement("script"),h=(a[m]?d+"lay/":o.base||"")+(f.modules[m]||m)+".js";return p.async=!0,p.charset="utf-8",p.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),o.modules[m]?!function g(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void("string"==typeof o.modules[m]&&o.status[m]?c():setTimeout(g,4))}():(y.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||l?p.addEventListener("load",function(e){s(e,h)},!1):p.attachEvent("onreadystatechange",function(e){s(e,h)})),o.modules[m]=h,f},t.fn.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},t.fn.link=function(e,t,i){var l=this,a=n.createElement("link"),u=n.getElementsByTagName("head")[0];"string"==typeof t&&(i=t);var s=(i||e).replace(/\.|\//g,""),c=a.id="layuicss-"+s,f=0;a.rel="stylesheet",a.href=e+(o.debug?"?v="+(new Date).getTime():""),a.media="all",n.getElementById(c)||u.appendChild(a),"function"==typeof t&&!function d(){return++f>1e3*o.timeout/100?r(e+" timeout"):void(1989===parseInt(l.getStyle(n.getElementById(c),"width"))?function(){t()}():setTimeout(d,100))}()},t.fn.addcss=function(e,t,n){layui.link(o.dir+"css/"+e,t,n)},t.fn.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,t(o)},void(o.onerror=function(e){o.onerror=null,n(e)}))},t.fn.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},t.fn.modules=function(){var e={};for(var t in a)e[t]=a[t];return e}(),t.fn.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?r("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},t.fn.router=function(e){for(var t,n=(e||location.hash).replace(/^#/,"").split("/")||[],o={dir:[]},i=0;i/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)});layui.define(function(a){"use strict";function t(a){new p(a)}var e=document,r="getElementById",n="getElementsByTagName",s=0,p=function(a){var t=this,e=t.config=a||{};e.item=s++,t.render(!0)};p.on=function(a,t,e){return a.attachEvent?a.attachEvent("on"+t,function(){e.call(a,window.even)}):a.addEventListener(t,e,!1),p},p.prototype.type=function(){var a=this.config;if("object"==typeof a.cont)return void 0===a.cont.length?2:3},p.prototype.view=function(){var a=this,t=a.config,e=[],r={};if(t.pages=0|t.pages,t.curr=0|t.curr||1,t.groups="groups"in t?0|t.groups:5,t.first="first"in t?t.first:"首页",t.last="last"in t?t.last:"末页",t.prev="prev"in t?t.prev:"上一页",t.next="next"in t?t.next:"下一页",t.pages<=1)return"";for(t.groups>t.pages&&(t.groups=t.pages),r.index=Math.ceil((t.curr+(t.groups>1&&t.groups!==t.pages?1:0))/(0===t.groups?1:t.groups)),t.curr>1&&t.prev&&e.push(''+t.prev+""),r.index>1&&t.first&&0!==t.groups&&e.push(''+t.first+""),r.poor=Math.floor((t.groups-1)/2),r.start=r.index>1?t.curr-r.poor:1,r.end=r.index>1?function(){var a=t.curr+(t.groups-r.poor-1);return a>t.pages?t.pages:a}():t.groups,r.end-r.start"+r.start+""):e.push(''+r.start+"");return t.pages>t.groups&&r.end'+t.last+""),r.flow=!t.prev&&0===t.groups,(t.curr!==t.pages&&t.next||r.flow)&&e.push(function(){return r.flow&&t.curr===t.pages?''+t.next+"":''+t.next+""}()),'
    '+e.join("")+function(){return t.skip?'到第 ':""}()+"
    "},p.prototype.jump=function(a){if(a){for(var t=this,e=t.config,r=a.children,s=a[n]("button")[0],i=a[n]("input")[0],u=0,o=r.length;un.maxs[0]?s=["y",1]:e>=n.mins[0]&&e<=n.maxs[0]&&(e==n.mins[0]&&(tn.maxs[1]?s=["m",1]:t==n.maxs[1]&&a>n.maxs[2]&&(s=["d",1]))),s},n.timeVoid=function(e,t){if(n.ymd[1]+1==n.mins[1]&&n.ymd[2]==n.mins[2]){if(0===t&&en.maxs[3])return 1;if(1===t&&e>n.maxs[4])return 1;if(2===t&&e>n.maxs[5])return 1}if(e>(t?59:23))return 1},n.check=function(){var e=n.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,"\\d+\\").replace(/\\$/g,""),t=new RegExp(e),a=n.elem[d.elemv],s=a.match(/\d+/g)||[],i=n.checkVoid(s[0],s[1],s[2]);if(""!==a.replace(/\s/g,"")){if(!t.test(a))return n.elem[d.elemv]="",n.msg("日期不符合格式,请重新选择。"),1;if(i[0])return n.elem[d.elemv]="",n.msg("日期不在有效期内,请重新选择。"),1;i.value=n.elem[d.elemv].match(t).join(),s=i.value.match(/\d+/g),s[1]<1?(s[1]=1,i.auto=1):s[1]>12?(s[1]=12,i.auto=1):s[1].length<2&&(i.auto=1),s[2]<1?(s[2]=1,i.auto=1):s[2]>n.months[(0|s[1])-1]?(s[2]=31,i.auto=1):s[2].length<2&&(i.auto=1),s.length>3&&(n.timeVoid(s[3],0)&&(i.auto=1),n.timeVoid(s[4],1)&&(i.auto=1),n.timeVoid(s[5],2)&&(i.auto=1)),i.auto?n.creation([s[0],0|s[1],0|s[2]],1):i.value!==n.elem[d.elemv]&&(n.elem[d.elemv]=i.value)}},n.months=[31,null,31,30,31,30,31,31,30,31,30,31],n.viewDate=function(e,t,a){var s=(n.query,{}),i=new Date;e<(0|n.mins[0])&&(e=0|n.mins[0]),e>(0|n.maxs[0])&&(e=0|n.maxs[0]),i.setFullYear(e,t,a),s.ymd=[i.getFullYear(),i.getMonth(),i.getDate()],n.months[1]=n.isleap(s.ymd[0])?29:28,i.setFullYear(s.ymd[0],s.ymd[1],1),s.FDay=i.getDay(),s.PDay=n.months[0===t?11:t-1]-s.FDay+1,s.NDay=1,n.each(d.tds,function(e,t){var a,i=s.ymd[0],o=s.ymd[1]+1;t.className="",e=s.FDay&&e'+e+"年":'
  • '+(e-7+t)+"年
  • "}),t("#laydate_ys").innerHTML=a,n.each(t("#laydate_ys li"),function(e,t){"y"===n.checkVoid(t.getAttribute("y"))[0]?n.addClass(t,d[1]):n.on(t,"click",function(e){n.stopmp(e).reshow(),n.viewDate(0|this.getAttribute("y"),n.ymd[1],n.ymd[2])})})},n.initDate=function(){var e=(n.query,new Date),t=n.elem[d.elemv].match(/\d+/g)||[];t.length<3&&(t=n.options.start.match(/\d+/g)||[],t.length<3&&(t=[e.getFullYear(),e.getMonth()+1,e.getDate()])),n.inymd=t,n.viewDate(t[0],t[1]-1,t[2])},n.iswrite=function(){var e=n.query,t={time:e("#laydate_hms")};n.shde(t.time,!n.options.istime),n.shde(d.oclear,!("isclear"in n.options?n.options.isclear:1)),n.shde(d.otoday,!("istoday"in n.options?n.options.istoday:1)),n.shde(d.ok,!("issure"in n.options?n.options.issure:1))},n.orien=function(e,t){var a,s=n.elem.getBoundingClientRect();e.style.left=s.left+(t?0:n.scroll(1))+"px",a=s.bottom+e.offsetHeight/1.5<=n.winarea()?s.bottom-1:s.top>e.offsetHeight/1.5?s.top-e.offsetHeight+1:n.winarea()-e.offsetHeight,e.style.top=Math.max(a+(t?0:n.scroll()),1)+"px"},n.follow=function(e){n.options.fixed?(e.style.position="fixed",n.orien(e,1)):(e.style.position="absolute",n.orien(e))},n.viewtb=function(){var e,t=[],a=["日","一","二","三","四","五","六"],o={},d=s[i]("table"),r=s[i]("thead");return r.appendChild(s[i]("tr")),o.creath=function(e){var t=s[i]("th");t.innerHTML=a[e],r[l]("tr")[0].appendChild(t),t=null},n.each(new Array(6),function(a){t.push([]),e=d.insertRow(0),n.each(new Array(7),function(n){t[a][n]=0,0===a&&o.creath(n),e.insertCell(n)})}),d.insertBefore(r,d.children[0]),d.id=d.className="laydate_table",e=t=null,d.outerHTML.toLowerCase()}(),n.view=function(e,t){var o,l=n.query,r={};t=t||e,n.elem=e,n.options=t,n.options.format||(n.options.format=a.format),n.options.start=n.options.start||"",n.mm=r.mm=[n.options.min||a.min,n.options.max||a.max],n.mins=r.mm[0].match(/\d+/g),n.maxs=r.mm[1].match(/\d+/g),n.box?n.shde(n.box):(o=s[i]("div"),o.id=d[0],o.className=d[0],o.style.cssText="position: absolute;",o.setAttribute("name","laydate-v"+laydate.v),o.innerHTML=r.html='
      '+function(){var e="";return n.each(new Array(12),function(t){e+=''+n.digit(t+1)+"月"}),e}()+"
      "+n.viewtb+'",s.body.appendChild(o),n.box=l("#"+d[0]),n.events(),o=null),n.follow(n.box),t.zIndex?n.box.style.zIndex=t.zIndex:n.removeCssAttr(n.box,"z-index"),n.stopMosup("click",n.box),n.initDate(),n.iswrite(),n.check()},n.reshow=function(){return n.each(n.query("#"+d[0]+" .laydate_show"),function(e,t){n.removeClass(t,"laydate_show")}),this},n.close=function(){n.reshow(),n.shde(n.query("#"+d[0]),1),n.elem=null},n.parse=function(e,t,s){return e=e.concat(t),s=s||(n.options?n.options.format:a.format),s.replace(/YYYY|MM|DD|hh|mm|ss/g,function(t,a){return e.index=0|++e.index,n.digit(e[e.index])})},n.creation=function(e,t){var a=(n.query,n.hmsin),s=n.parse(e,[a[0].value,a[1].value,a[2].value]);n.elem[d.elemv]=s,t||(n.close(),"function"==typeof n.options.choose&&n.options.choose(s))},n.events=function(){var e=n.query,a={box:"#"+d[0]};n.addClass(s.body,"laydate_body"),d.tds=e("#laydate_table td"),d.mms=e("#laydate_ms span"),d.year=e("#laydate_y"),d.month=e("#laydate_m"),n.each(e(a.box+" .laydate_ym"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.addClass(this[l]("div")[0],"laydate_show"),e||(a.YY=parseInt(d.year.value),n.viewYears(a.YY))})}),n.on(e(a.box),"click",function(){n.reshow()}),a.tabYear=function(e){0===e?n.ymd[0]--:1===e?n.ymd[0]++:2===e?a.YY-=14:a.YY+=14,e<2?(n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2]),n.reshow()):n.viewYears(a.YY)},n.each(e("#laydate_YY .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t),a.tabYear(e)})}),a.tabMonth=function(e){e?(n.ymd[1]++,12===n.ymd[1]&&(n.ymd[0]++,n.ymd[1]=0)):(n.ymd[1]--,n.ymd[1]===-1&&(n.ymd[0]--,n.ymd[1]=11)),n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2])},n.each(e("#laydate_MM .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),a.tabMonth(e)})}),n.each(e("#laydate_ms span"),function(e,t){n.on(t,"click",function(e){n.stopmp(e).reshow(),n.hasClass(this,d[1])||n.viewDate(n.ymd[0],0|this.getAttribute("m"),n.ymd[2])})}),n.each(e("#laydate_table td"),function(e,t){n.on(t,"click",function(e){n.hasClass(this,d[1])||(n.stopmp(e),n.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),d.oclear=e("#laydate_clear"),n.on(d.oclear,"click",function(){n.elem[d.elemv]="",n.close()}),d.otoday=e("#laydate_today"),n.on(d.otoday,"click",function(){var e=new Date;n.creation([e.getFullYear(),e.getMonth()+1,e.getDate()])}),d.ok=e("#laydate_ok"),n.on(d.ok,"click",function(){n.valid&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])}),a.times=e("#laydate_time"),n.hmsin=a.hmsin=e("#laydate_hms input"),a.hmss=["小时","分钟","秒数"],a.hmsarr=[],n.msg=function(t,s){var i='
      '+(s||"提示")+"×
      ";"string"==typeof t?(i+="

      "+t+"

      ",n.shde(e("#"+d[0])),n.removeClass(a.times,"laydate_time1").addClass(a.times,"laydate_msg")):(a.hmsarr[t]?i=a.hmsarr[t]:(i+='
      ',n.each(new Array(0===t?24:60),function(e){i+=""+e+""}),i+="
      ",a.hmsarr[t]=i),n.removeClass(a.times,"laydate_msg"),n[0===t?"removeClass":"addClass"](a.times,"laydate_time1")),n.addClass(a.times,"laydate_show"),a.times.innerHTML=i},a.hmson=function(t,a){var s=e("#laydate_hmsno span"),i=n.valid?null:1;n.each(s,function(e,s){i?n.addClass(s,d[1]):n.timeVoid(e,a)?n.addClass(s,d[1]):n.on(s,"click",function(e){n.hasClass(this,d[1])||(t.value=n.digit(0|this.innerHTML))})}),n.addClass(s[0|t.value],"laydate_click")},n.each(a.hmsin,function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.msg(e,a.hmss[e]),a.hmson(this,e)})}),n.on(s,"mouseup",function(){var t=e("#"+d[0]);t&&"none"!==t.style.display&&(n.check()||n.close())}).on(s,"keydown",function(e){e=e||t.event;var a=e.keyCode;13===a&&n.elem&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])})},laydate.reset=function(){n.box&&n.elem&&n.follow(n.box)},laydate.now=function(e,t){var a=new Date(0|e?function(e){return e<864e5?+new Date+864e5*e:e}(parseInt(e)):+new Date);return n.parse([a.getFullYear(),a.getMonth()+1,a.getDate()],[a.getHours(),a.getMinutes(),a.getSeconds()],t)},layui.addcss("modules/laydate/laydate.css",function(){},"laydatecss"),e("laydate",laydate)});!function(e,t){"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(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(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(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), -l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
      a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
      a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
      ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ -for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.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)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"]},r={v:"3.0.2",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):r.link("skin/"+e.extend),this):this},link:function(t,n,a){if(r.path){var o=i("head")[0],s=document.createElement("link");"string"==typeof n&&(a=n);var l=(a||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,i("#"+f)[0]||o.appendChild(s),"function"==typeof n&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(i("#"+f).css("width"))?n():setTimeout(u,100))}()}},ready:function(e){var t="skinlayercss",i="302";return a?layui.addcss("modules/layer/default/layer.css?v="+r.v+i,e,t):r.link("skin/default/layer.css?v="+r.v+i,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),r.ready(function(){document.body?t.creat():setTimeout(function(){t.creat()},50)})};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
      '+(f?r.title[0]:r.title)+"
      ":"";return r.zIndex=s,t([r.shade?'
      ':"",'
      '+(e&&2!=r.type?"":u)+'
      '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
      '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
      '+e+"
      "}():"")+(r.resize?'':"")+"
      "],u,i('
      ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]&&e.layero.addClass(l.anim[t.anim]).data("anim",!0)}},s.pt.auto=function(e){function t(e){e=s.find(e),e.height(f[1]-c-u-2*(0|parseFloat(e.css("padding"))))}var a=this,o=a.config,s=i("#"+l[0]+e);""===o.area[0]&&o.maxWidth>0&&(r.ie&&r.ie<8&&o.btn&&s.width(s.innerWidth()),s.outerWidth()>o.maxWidth&&s.width(o.maxWidth));var f=[s.innerWidth(),s.innerHeight()],c=s.find(l[1]).outerHeight()||0,u=s.find("."+l[6]).outerHeight()||0;switch(o.type){case 2:t("iframe");break;default:""===o.area[1]?o.fixed&&f[1]>=n.height()&&(f[1]=n.height(),t("."+l[5])):t("."+l[5])}return a},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("anim")&&t.addClass(a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),setTimeout(function(){f()},r.ie&&r.ie<10||!t.data("anim")?0:200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,n="";if(e>0)for(n=''+t[0].title+"";i"+t[i].title+"";return n}(),content:'
        '+function(){var e=t.length,i=1,n="";if(e>0)for(n='
      • '+(t[0].content||"no content")+"
      • ";i'+(t[i].content||"no content")+"";return n}()+"
      ",success:function(t){var a=t.find(".layui-layer-title").children(),o=t.find(".layui-layer-tabmain").children();a.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var n=i(this),a=n.index();n.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),o.eq(a).show().siblings().hide(),"function"==typeof e.change&&e.change(a)}),"function"==typeof n&&n(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){u.length<=1||(f.start=s.imgIndex-1,r.close(s.index),setTimeout(function(){r.photos(t,!0,e)},200))},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
      '+(u.length>1?'':"")+'
      '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
      ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
      是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.jquery),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(i){"use strict";var a=layui.jquery,t=(layui.hint(),layui.device()),l="element",e="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(i){var t=this;return a.extend(!0,t.config,i),t},s.prototype.on=function(i,a){return layui.onevent(l,i,a)},s.prototype.tabAdd=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=e.children(".layui-tab-content");return n.append('
    • '+(t.title||"unnaming")+"
    • "),s.append('
      '+(t.content||"")+"
      "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return f.tabClick(null,null,s),this},s.prototype.progress=function(i,t){var l="layui-progress",e=a("."+l+"[lay-filter="+i+"]"),n=e.find("."+l+"-bar"),s=n.find("."+l+"-text");return n.css("width",t),s.text(t),this};var o=".layui-nav",c="layui-nav-item",r="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",h="layui-nav-more",y="layui-anim layui-anim-upbit",f={tabClick:function(i,t,s){var o=s||a(this),t=t||o.index(),c=o.parents(".layui-tab").eq(0),r=c.children(".layui-tab-content").children(".layui-tab-item"),u=c.attr("lay-filter");o.addClass(e).siblings().removeClass(e),r.eq(t).addClass(n).siblings().removeClass(n),layui.event.call(this,l,"tab("+u+")",{elem:c,index:t})},tabDelete:function(i,t){var l=t||a(this).parent(),n=l.index(),s=l.parents(".layui-tab").eq(0),o=s.children(".layui-tab-content").children(".layui-tab-item");l.hasClass(e)&&(l.next()[0]?f.tabClick.call(l.next()[0],null,n+1):l.prev()[0]&&f.tabClick.call(l.prev()[0],null,n-1)),l.remove(),o.eq(n).remove(),setTimeout(function(){f.tabAuto()},50)},tabAuto:function(){var i="layui-tab-more",l="layui-tab-bar",e="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),c=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),r=a('');if(n===window&&8!=t.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var i=a(this);if(!i.find("."+e)[0]){var t=a('');t.on("click",f.tabDelete),i.append(t)}}),o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+l)[0])return;o.append(r),s.attr("overflow",""),r.on("click",function(a){o[this.title?"removeClass":"addClass"](i),this.title=this.title?"":"收缩"})}else o.find("."+l).remove(),s.removeAttr("overflow")})},hideTabMore:function(i){var t=a(".layui-tab-title");i!==!0&&"tabmore"===a(i.target).attr("lay-stope")||(t.removeClass("layui-tab-more"),t.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter");i.find("."+d)[0]||(t.find("."+e).removeClass(e),i.addClass(e),layui.event.call(this,l,"nav("+n+")",i))},clickChild:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter");t.find("."+e).removeClass(e),i.addClass(e),layui.event.call(this,l,"nav("+n+")",i)},showChild:function(){var i=a(this),t=i.parents(o),l=i.parent(),e=i.siblings("."+d);t.hasClass(u)&&(e.removeClass(y),l["none"===e.css("display")?"addClass":"removeClass"](c+"ed"))},collapse:function(){var i=a(this),t=i.find(".layui-colla-icon"),e=i.siblings(".layui-colla-content"),s=i.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),c="none"===e.css("display");if("string"==typeof s.attr("lay-accordion")){var r=s.children(".layui-colla-item").children("."+n);r.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),r.removeClass(n)}e[c?"addClass":"removeClass"](n),t.html(c?"":""),layui.event.call(this,l,"collapse("+o+")",{title:i,content:e,show:c})}};s.prototype.init=function(i){var l={tab:function(){f.tabAuto.call({})},nav:function(){var i,l,e,s=200,p=function(o,c){var r=a(this),f=r.find("."+d);c.hasClass(u)?o.css({top:r.position().top,height:r.children("a").height(),opacity:1}):(f.addClass(y),o.css({left:r.position().left+parseFloat(r.css("marginLeft")),top:r.position().top+r.height()-5}),i=setTimeout(function(){o.css({width:r.width(),opacity:1})},t.ie&&t.ie<10?0:s),clearTimeout(e),"block"===f.css("display")&&clearTimeout(l),l=setTimeout(function(){f.addClass(n),r.find("."+h).addClass(h+"d")},300))};a(o).each(function(){var t=a(this),o=a(''),y=t.find("."+c);t.find("."+r)[0]||(t.append(o),y.on("mouseenter",function(){p.call(this,o,t)}).on("mouseleave",function(){t.hasClass(u)||(clearTimeout(l),l=setTimeout(function(){t.find("."+d).removeClass(n),t.find("."+h).removeClass(h+"d")},300))}),t.on("mouseleave",function(){clearTimeout(i),e=setTimeout(function(){t.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},s)})),y.each(function(){var i=a(this),t=i.find("."+d);if(t[0]&&!i.find("."+h)[0]){var l=i.children("a");l.append('')}i.off("click",f.clickThis).on("click",f.clickThis),i.children("a").off("click",f.showChild).on("click",f.showChild),t.children("dd").off("click",f.clickChild).on("click",f.clickChild)})})},breadcrumb:function(){var i=".layui-breadcrumb";a(i).each(function(){var i=a(this),t=i.attr("lay-separator")||">",l=i.find("a");l.find(".layui-box")[0]||(l.each(function(i){i!==l.length-1&&a(this).append(''+t+"")}),i.css("visibility","visible"))})},progress:function(){var i="layui-progress";a("."+i).each(function(){var t=a(this),l=t.find(".layui-progress-bar"),e=l.attr("lay-percent");l.css("width",e),t.attr("lay-showPercent")&&setTimeout(function(){l.html(''+Math.round(l.width()/t.width()*100)+"%")},350)})},collapse:function(){var i="layui-collapse";a("."+i).each(function(){var i=a(this).find(".layui-colla-item");i.each(function(){var i=a(this),t=i.find(".layui-colla-title"),l=i.find(".layui-colla-content"),e="none"===l.css("display");t.find(".layui-colla-icon").remove(),t.append(''+(e?"":"")+""),t.off("click",f.collapse).on("click",f.collapse)})})}};return layui.each(l,function(i,a){a()})};var p=new s,v=a(document);p.init();var b=".layui-tab-title li";v.on("click",b,f.tabClick),v.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),i(l,function(i){return p.set(i)})});layui.define("layer",function(e){"use strict";var a=layui.jquery,t=layui.layer,i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"},s=function(e){this.options=e};s.prototype.init=function(){var e=this,t=e.options,r=a("body"),s=a(t.elem||".layui-upload-file"),u=a('');return a("#"+n)[0]||r.append(u),s.each(function(r,s){s=a(s);var u='
      ',l=s.attr("lay-type")||t.type;t.unwrap||(u='
      '+u+''+(s.attr("lay-title")||t.title||"上传"+(o[l]||"图片"))+"
      "),u=a(u),t.unwrap||u.on("dragover",function(e){e.preventDefault(),a(this).addClass(i)}).on("dragleave",function(){a(this).removeClass(i)}).on("drop",function(){a(this).removeClass(i)}),s.parent("form").attr("target")===n&&(t.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=a(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return t.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return t.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return t.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return t.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=a("#"+n),f=setInterval(function(){var a;try{a=c.contents().find("body").text()}catch(i){t.msg("上传接口存在跨域",r),clearInterval(f)}if(a){clearInterval(f),c.contents().find("body").html("");try{a=JSON.parse(a)}catch(i){return a={},t.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(a,e)}},30);e.value=""}},e("upload",function(e){var a=new s(e=e||{});a.init()})});layui.define("layer",function(e){"use strict";var i=layui.jquery,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",c="layui-hide",o="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:[/^\d+$/,"只能填写数字"],date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent(l,e,i)},u.prototype.render=function(e){var t=this,n={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",u="layui-select-none",d="",f=i(r).find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed"),e&&d&&e.val(d)),e=null},v=function(t,r,f){var v=i(this),h=t.find("."+n),m=h.find("input"),p=t.find("dl"),k=p.children("dd");if(!r){var x=function(){t.addClass(a+"ed"),k.removeClass(c)},b=function(){t.removeClass(a+"ed"),m.blur(),g(m.val(),function(e){e&&(d=p.find("."+s).html(),m&&m.val(d))})};h.on("click",function(e){t.hasClass(a+"ed")?b():(y(e,!0),x()),p.find("."+u).remove()}),h.find(".layui-edge").on("click",function(){m.focus()}),m.on("keyup",function(e){var i=e.keyCode;9===i&&x()}).on("keydown",function(e){var i=e.keyCode;9===i?b():13===i&&e.preventDefault()});var g=function(e,t,a){var n=0;layui.each(k,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||(a?r:e!==l))&&n++,a&&t[r?"addClass":"removeClass"](c)});var l=n===k.length;return t(l),l},C=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&void g(i,function(e){e?p.find("."+u)[0]||p.append('

      无匹配项

      '):p.find("."+u).remove()},!0)};f&&m.on("keyup",C).on("blur",function(i){e=m,d=p.find("."+s).html(),d||m.val("")}),k.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=v.attr("lay-filter");return!e.hasClass(o)&&(v.val(a).removeClass("layui-form-danger"),m.val(e.text()),e.addClass(s).siblings().removeClass(s),layui.event.call(this,l,"select("+n+")",{elem:v[0],value:a,othis:t}),b(),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",y).on("click",y)}};f.each(function(e,l){var r=i(this),c=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]);if("string"==typeof r.attr("lay-ignore"))return r.show();var y="string"==typeof r.attr("lay-search"),h=i(['
      ','
      ','
      ','
      '+function(e){var i=[];return layui.each(e,function(e,t){(0!==e||t.value)&&("optgroup"===t.tagName.toLowerCase()?i.push("
      "+t.label+"
      "):i.push('
      '+t.innerHTML+"
      "))}),i.join("")}(r.find("*"))+"
      ","
      "].join(""));c[0]&&c.remove(),r.after(h),v.call(this,h,u,y)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=i(r).find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),c=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=i(['
      ',{_switch:""+((n.checked?s[0]:s[1])||"")+""}[r]||""+(n.title||"勾选")+''+(r?"":"")+"","
      "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=i(r).find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var c=n[0].name,o=n.parents(r),u=n.attr("lay-filter"),d=o.find("input[name="+c.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=i(this),s=r.next("."+e),c=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();var u=i(['
      ',''+t[l.checked?0:1]+"",""+(l.title||"未命名")+"","
      "].join(""));s[0]&&s.remove(),r.after(u),n.call(this,u)})}};return e?n[e]?n[e]():a.error("不支持的"+e+"表单渲染"):layui.each(n,function(e,i){i()}),t};var d=function(){var e=i(this),a=f.config.verify,s=null,c="layui-form-danger",o={},u=e.parents(r),d=u.find("*[lay-verify]"),y=e.parents("form")[0],v=u.find("input,select,textarea"),h=e.attr("lay-filter");return layui.each(d,function(e,l){var r=i(this),o=r.attr("lay-verify").split("|"),u="",d=r.val();if(r.removeClass(c),layui.each(o,function(e,i){var o="function"==typeof a[i];if(a[i]&&(o?u=a[i](d,l):!a[i][0].test(d)))return t.msg(u||a[i][1],{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(c),s=!0}),s)return s}),!s&&(layui.each(v,function(e,i){i.name&&(/^checkbox|radio$/.test(i.type)&&!i.checked||(o[i.name]=i.value))}),layui.event.call(this,l,"submit("+h+")",{elem:this,form:y,field:o}))},f=new u,y=i(document);f.render(),y.on("reset",r,function(){setTimeout(function(){f.render()},50)}),y.on("submit",r,d).on("click","*[lay-submit]",d),e(l,function(e){return f.set(e)})});layui.define("jquery",function(e){"use strict";var o=layui.jquery,a=layui.hint(),r="layui-tree-enter",i=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};i.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},i.prototype.tree=function(e,a){var r=this,i=r.options,n=a||i.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
        '),s=o(["
      • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return i.check?''+("checkbox"===i.check?t.checkbox[0]:"radio"===i.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
      • "].join(""));l&&(s.append(c),r.tree(c,n.children)),e.append(s),"function"==typeof i.click&&r.click(s,n),r.spread(s,n),i.drag&&r.drag(s,n)})},i.prototype.click=function(e,o){var a=this,r=a.options;e.children("a").on("click",function(e){layui.stope(e),r.click(o)})},i.prototype.spread=function(e,o){var a=this,r=(a.options,e.children(".layui-tree-spread")),i=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),i.removeClass("layui-show"),r.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),i.addClass("layui-show"),r.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};i[0]&&(r.on("click",l),n.on("dblclick",l))},i.prototype.on=function(e){var a=this,i=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),i.drag&&o(document).on("mousemove",function(e){var r=a.move;if(r.from){var i=(r.to,o('
        '));e.preventDefault(),o("."+t)[0]||o("body").append(i);var n=o("."+t)[0]?o("."+t):i;n.addClass("layui-show").html(r.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(r),e.to&&e.to.elem.children("a").removeClass(r),a.move={},o("."+t).remove())})},i.prototype.move={},i.prototype.drag=function(e,a){var i=this,t=(i.options,e.children("a")),n=function(){var t=o(this),n=i.move;n.from&&(n.to={item:a,elem:e},t.addClass(r))};t.on("mousedown",function(){var o=i.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=i.move;a.from&&(delete a.to,e.removeClass(r))})},e("tree",function(e){var r=new i(e=e||{}),t=o(e.elem);return t[0]?void r.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define("jquery",function(l){"use strict";var o=layui.jquery,i={fixbar:function(l){l=l||{},l.bgcolor=l.bgcolor?"background-color:"+l.bgcolor:"";var i,a,c="layui-fixbar-top",t=[l.bar1===!0?"":l.bar1,l.bar2===!0?"":l.bar2,""],r=o(['
          ',l.bar1?'
        • '+t[0]+"
        • ":"",l.bar2?'
        • '+t[1]+"
        • ":"",'
        • '+t[2]+"
        • ","
        "].join("")),e=r.find("."+c),s=function(){var i=o(document).scrollTop();i>=(l.showHeight||200)?a||(e.show(),a=1):a&&(e.hide(),a=0)};o(".layui-fixbar")[0]||("object"==typeof l.css&&r.css(l.css),o("body").append(r),s(),r.find("li").on("click",function(){var i=o(this),a=i.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),l.click&&l.click.call(this,a)}),o(document).on("scroll",function(){i&&clearTimeout(i),i=setTimeout(function(){s()},100)}))}};l("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.jquery,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var u=l(e.elem);if(u[0]){var f=l(e.scrollElem||document),m=e.mb||50,s=!("isAuto"in e)||e.isAuto,y=e.end||"没有更多了",v=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");u.find(".layui-flow-more")[0]||u.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(y):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(f.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=m&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var f=e.attr("lay-src");layui.img(f,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",f).removeAttr("lay-src"),l[0]&&u(l),i++})}},u=function(e,o){var u=a?(o||n).height():l(window).height(),f=n.scrollTop(),m=f+u;if(t.lazyimg.elem=l(r),e)c(e,u);else for(var s=0;sm)break}};if(u(),!o){var f;n.on("scroll",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){u(null,e)},50)}),o=!0}return u},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.jquery,i=layui.layer,a=layui.form(),l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",s=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};s.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},s.prototype.on=function(t,e){return layui.onevent(n,t,e)},s.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",s=e("#"+t),u="LAY_layedit_"+ ++a.index,d=s.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
        ','
        '+f+"
        ",'
        ','',"
        ","
        "].join(""));return l.ie&&l.ie<8?s.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),c.call(a,m,s[0],y),s.addClass("layui-hide").after(m),a.index)},s.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},s.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},s.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},s.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var c=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),s=o.find("head"),c=e([""].join("")),u=o.find("body");s.append(c),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,s=e(r.body);s.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

        ")}}),e(n).parents("form").on("submit",function(){var t=s.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),s.on("paste",function(e){r.execCommand("formatBlock",!1,"

        "),setTimeout(function(){f.call(t,s),n.value=s.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),s={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o({url:r.url,method:r.type,elem:e(n).find("input")[0],unwrap:!0,success:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},c=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

        "),setTimeout(function(){o.focus()},10)):s[a]&&s[a].call(this,u),h.call(t,c,i)}},d=/image/;c.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,c),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

          ','
        • ','','
          ','',"
          ","
        • ",'
        • ','','
          ','",'","
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
      • '+e+'
      • ')}),'
          '+t.join("")+"
        "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
          ','
        • ','','
          ','","
          ","
        • ",'
        • ','','
          ','',"
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new s;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.jquery,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
        1. '+o.replace(/[\r\t\n]+/g,"
        2. ")+"
        "),c.find(">.layui-code-h3")[0]||c.prepend('

        '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

        ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/code.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/code.js deleted file mode 100644 index af0fb703fd4fbd308e194fc23c0bbcdff55f6c18..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/code.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
        1. '+o.replace(/[\r\t\n]+/g,"
        2. ")+"
        "),c.find(">.layui-code-h3")[0]||c.prepend('

        '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

        ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/element.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/element.js deleted file mode 100644 index 9522a258e4ff584bf05aaf450257de9e8969f9ef..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/element.js +++ /dev/null @@ -1,296 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ -; -layui.define("jquery", - function (i) { - "use strict"; - var a = layui.jquery, - t = (layui.hint(), layui.device()), - l = "element", - e = "layui-this", - n = "layui-show", - s = function () { - this.config = {} - }; - s.prototype.set = function (i) { - var t = this; - return a.extend(!0, t.config, i), - t - }, - s.prototype.on = function (i, a) { - return layui.onevent(l, i, a) - }, - s.prototype.tabAdd = function (i, t) { - var l = ".layui-tab-title", - e = a(".layui-tab[lay-filter=" + i + "]"), - n = e.children(l), - s = e.children(".layui-tab-content"); - return n.append('
      • ' + (t.title || "unnaming") + "
      • "), - s.append('
        ' + (t.content || "") + "
        "), - f.hideTabMore(!0), - f.tabAuto(), - this - }, - s.prototype.tabDelete = function (i, t) { - var l = ".layui-tab-title", - e = a(".layui-tab[lay-filter=" + i + "]"), - n = e.children(l), - s = n.find('>li[lay-id="' + t + '"]'); - return f.tabDelete(null, s), - this - }, - s.prototype.tabChange = function (i, t) { - var l = ".layui-tab-title", - e = a(".layui-tab[lay-filter=" + i + "]"), - n = e.children(l), - s = n.find('>li[lay-id="' + t + '"]'); - return f.tabClick(null, null, s), - this - }, - s.prototype.progress = function (i, t) { - var l = "layui-progress", - e = a("." + l + "[lay-filter=" + i + "]"), - n = e.find("." + l + "-bar"), - s = n.find("." + l + "-text"); - return n.css("width", t), - s.text(t), - this - }; - var o = ".layui-nav", - c = "layui-nav-item", - r = "layui-nav-bar", - u = "layui-nav-tree", - d = "layui-nav-child", - h = "layui-nav-more", - y = "layui-anim layui-anim-upbit", - f = { - tabClick: function (i, t, s) { - var o = s || a(this), - t = t || o.index(), - c = o.parents(".layui-tab").eq(0), - r = c.children(".layui-tab-content").children(".layui-tab-item"), - u = c.attr("lay-filter"); - o.addClass(e).siblings().removeClass(e), - r.eq(t).addClass(n).siblings().removeClass(n), - layui.event.call(this, l, "tab(" + u + ")", { - elem: c, - index: t - }) - }, - tabDelete: function (i, t) { - var l = t || a(this).parent(), - n = l.index(), - s = l.parents(".layui-tab").eq(0), - o = s.children(".layui-tab-content").children(".layui-tab-item"); - l.hasClass(e) && (l.next()[0] ? f.tabClick.call(l.next()[0], null, n + 1) : l.prev()[0] && f.tabClick.call(l.prev()[0], null, n - 1)), - l.remove(), - o.eq(n).remove(), - setTimeout(function () { - f.tabAuto() - }, - 50) - }, - tabAuto: function () { - var i = "layui-tab-more", - l = "layui-tab-bar", - e = "layui-tab-close", - n = this; - a(".layui-tab").each(function () { - var s = a(this), - o = s.children(".layui-tab-title"), - c = (s.children(".layui-tab-content").children(".layui-tab-item"), 'lay-stope="tabmore"'), - r = a(''); - if (n === window && 8 != t.ie && f.hideTabMore(!0), s.attr("lay-allowClose") && o.find("li").each(function () { - var i = a(this); - if (!i.find("." + e)[0]) { - var t = a(''); - t.on("click", f.tabDelete), - i.append(t) - } - }), o.prop("scrollWidth") > o.outerWidth() + 1) { - if (o.find("." + l)[0]) return; - o.append(r), - s.attr("overflow", ""), - r.on("click", - function (a) { - o[this.title ? "removeClass" : "addClass"](i), - this.title = this.title ? "" : "收缩" - }) - } else o.find("." + l).remove(), - s.removeAttr("overflow") - }) - }, - hideTabMore: function (i) { - var t = a(".layui-tab-title"); - i !== !0 && "tabmore" === a(i.target).attr("lay-stope") || (t.removeClass("layui-tab-more"), t.find(".layui-tab-bar").attr("title", "")) - }, - clickThis: function () { - var i = a(this), - t = i.parents(o), - n = t.attr("lay-filter"); - i.find("." + d)[0] || (t.find("." + e).removeClass(e), i.addClass(e), layui.event.call(this, l, "nav(" + n + ")", i)) - }, - clickChild: function () { - var i = a(this), - t = i.parents(o), - n = t.attr("lay-filter"); - t.find("." + e).removeClass(e), - i.addClass(e), - layui.event.call(this, l, "nav(" + n + ")", i) - }, - showChild: function () { - var i = a(this), - t = i.parents(o), - l = i.parent(), - e = i.siblings("." + d); - t.hasClass(u) && (e.removeClass(y), l["none" === e.css("display") ? "addClass" : "removeClass"](c + "ed")) - }, - collapse: function () { - var i = a(this), - t = i.find(".layui-colla-icon"), - e = i.siblings(".layui-colla-content"), - s = i.parents(".layui-collapse").eq(0), - o = s.attr("lay-filter"), - c = "none" === e.css("display"); - if ("string" == typeof s.attr("lay-accordion")) { - var r = s.children(".layui-colla-item").children("." + n); - r.siblings(".layui-colla-title").children(".layui-colla-icon").html(""), - r.removeClass(n) - } - e[c ? "addClass" : "removeClass"](n), - t.html(c ? "" : ""), - layui.event.call(this, l, "collapse(" + o + ")", { - title: i, - content: e, - show: c - }) - } - }; - s.prototype.init = function (i) { - var l = { - tab: function () { - f.tabAuto.call({}) - }, - nav: function () { - var i, l, e, s = 200, - p = function (o, c) { - var r = a(this), - f = r.find("." + d); - c.hasClass(u) ? o.css({ - top: r.position().top, - height: r.children("a").height(), - opacity: 1 - }) : (f.addClass(y), o.css({ - left: r.position().left + parseFloat(r.css("marginLeft")), - top: r.position().top + r.height() - 5 - }), i = setTimeout(function () { - o.css({ - width: r.width(), - opacity: 1 - }) - }, - t.ie && t.ie < 10 ? 0 : s), clearTimeout(e), "block" === f.css("display") && clearTimeout(l), l = setTimeout(function () { - f.addClass(n), - r.find("." + h).addClass(h + "d") - }, - 300)) - }; - a(o).each(function () { - var t = a(this), - o = a(''), - y = t.find("." + c); - t.find("." + r)[0] || (t.append(o), y.on("mouseenter", - function () { - p.call(this, o, t) - }).on("mouseleave", - function () { - t.hasClass(u) || (clearTimeout(l), l = setTimeout(function () { - t.find("." + d).removeClass(n), - t.find("." + h).removeClass(h + "d") - }, - 300)) - }), t.on("mouseleave", - function () { - clearTimeout(i), - e = setTimeout(function () { - t.hasClass(u) ? o.css({ - height: 0, - top: o.position().top + o.height() / 2, - opacity: 0 - }) : o.css({ - width: 0, - left: o.position().left + o.width() / 2, - opacity: 0 - }) - }, - s) - })), - y.each(function () { - var i = a(this), - t = i.find("." + d); - if (t[0] && !i.find("." + h)[0]) { - var l = i.children("a"); - l.append('') - } - i.off("click", f.clickThis).on("click", f.clickThis), - i.children("a").off("click", f.showChild).on("click", f.showChild), - t.children("dd").off("click", f.clickChild).on("click", f.clickChild) - }) - }) - }, - breadcrumb: function () { - var i = ".layui-breadcrumb"; - a(i).each(function () { - var i = a(this), - t = i.attr("lay-separator") || ">", - l = i.find("a"); - l.find(".layui-box")[0] || (l.each(function (i) { - i !== l.length - 1 && a(this).append('' + t + "") - }), i.css("visibility", "visible")) - }) - }, - progress: function () { - var i = "layui-progress"; - a("." + i).each(function () { - var t = a(this), - l = t.find(".layui-progress-bar"), - e = l.attr("lay-percent"); - l.css("width", e), - t.attr("lay-showPercent") && setTimeout(function () { - l.html('' + Math.round(l.width() / t.width() * 100) + "%") - }, - 350) - }) - }, - collapse: function () { - var i = "layui-collapse"; - a("." + i).each(function () { - var i = a(this).find(".layui-colla-item"); - i.each(function () { - var i = a(this), - t = i.find(".layui-colla-title"), - l = i.find(".layui-colla-content"), - e = "none" === l.css("display"); - t.find(".layui-colla-icon").remove(), - t.append('' + (e ? "" : "") + ""), - t.off("click", f.collapse).on("click", f.collapse) - }) - }) - } - }; - return layui.each(l, - function (i, a) { - a() - }) - }; - var p = new s, - v = a(document); - p.init(); - var b = ".layui-tab-title li"; - v.on("click", b, f.tabClick), - v.on("click", f.hideTabMore), - a(window).on("resize", f.tabAuto), - i(l, - function (i) { - return p.set(i) - }) - }); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/flow.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/flow.js deleted file mode 100644 index 0578a8df0f39e0f472bccdb874021cd0bf41fe73..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/flow.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(e){"use strict";var l=layui.jquery,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var u=l(e.elem);if(u[0]){var f=l(e.scrollElem||document),m=e.mb||50,s=!("isAuto"in e)||e.isAuto,y=e.end||"没有更多了",v=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");u.find(".layui-flow-more")[0]||u.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(y):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(f.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=m&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var f=e.attr("lay-src");layui.img(f,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",f).removeAttr("lay-src"),l[0]&&u(l),i++})}},u=function(e,o){var u=a?(o||n).height():l(window).height(),f=n.scrollTop(),m=f+u;if(t.lazyimg.elem=l(r),e)c(e,u);else for(var s=0;sm)break}};if(u(),!o){var f;n.on("scroll",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){u(null,e)},50)}),o=!0}return u},e("flow",new o)}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/form.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/form.js deleted file mode 100644 index a63b922da1eacb1e79379a5c292941a8ea109416..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/form.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define("layer",function(e){"use strict";var i=layui.jquery,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",c="layui-hide",o="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:[/^\d+$/,"只能填写数字"],date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent(l,e,i)},u.prototype.render=function(e){var t=this,n={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",u="layui-select-none",d="",f=i(r).find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed"),e&&d&&e.val(d)),e=null},v=function(t,r,f){var v=i(this),h=t.find("."+n),m=h.find("input"),p=t.find("dl"),k=p.children("dd");if(!r){var x=function(){t.addClass(a+"ed"),k.removeClass(c)},b=function(){t.removeClass(a+"ed"),m.blur(),g(m.val(),function(e){e&&(d=p.find("."+s).html(),m&&m.val(d))})};h.on("click",function(e){t.hasClass(a+"ed")?b():(y(e,!0),x()),p.find("."+u).remove()}),h.find(".layui-edge").on("click",function(){m.focus()}),m.on("keyup",function(e){var i=e.keyCode;9===i&&x()}).on("keydown",function(e){var i=e.keyCode;9===i?b():13===i&&e.preventDefault()});var g=function(e,t,a){var n=0;layui.each(k,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||(a?r:e!==l))&&n++,a&&t[r?"addClass":"removeClass"](c)});var l=n===k.length;return t(l),l},C=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&void g(i,function(e){e?p.find("."+u)[0]||p.append('

        无匹配项

        '):p.find("."+u).remove()},!0)};f&&m.on("keyup",C).on("blur",function(i){e=m,d=p.find("."+s).html(),d||m.val("")}),k.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=v.attr("lay-filter");return!e.hasClass(o)&&(v.val(a).removeClass("layui-form-danger"),m.val(e.text()),e.addClass(s).siblings().removeClass(s),layui.event.call(this,l,"select("+n+")",{elem:v[0],value:a,othis:t}),b(),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",y).on("click",y)}};f.each(function(e,l){var r=i(this),c=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]);if("string"==typeof r.attr("lay-ignore"))return r.show();var y="string"==typeof r.attr("lay-search"),h=i(['
        ','
        ','
        ','
        '+function(e){var i=[];return layui.each(e,function(e,t){(0!==e||t.value)&&("optgroup"===t.tagName.toLowerCase()?i.push("
        "+t.label+"
        "):i.push('
        '+t.innerHTML+"
        "))}),i.join("")}(r.find("*"))+"
        ","
        "].join(""));c[0]&&c.remove(),r.after(h),v.call(this,h,u,y)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=i(r).find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),c=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=i(['
        ',{_switch:""+((n.checked?s[0]:s[1])||"")+""}[r]||""+(n.title||"勾选")+''+(r?"":"")+"","
        "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=i(r).find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var c=n[0].name,o=n.parents(r),u=n.attr("lay-filter"),d=o.find("input[name="+c.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=i(this),s=r.next("."+e),c=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();var u=i(['
        ',''+t[l.checked?0:1]+"",""+(l.title||"未命名")+"","
        "].join(""));s[0]&&s.remove(),r.after(u),n.call(this,u)})}};return e?n[e]?n[e]():a.error("不支持的"+e+"表单渲染"):layui.each(n,function(e,i){i()}),t};var d=function(){var e=i(this),a=f.config.verify,s=null,c="layui-form-danger",o={},u=e.parents(r),d=u.find("*[lay-verify]"),y=e.parents("form")[0],v=u.find("input,select,textarea"),h=e.attr("lay-filter");return layui.each(d,function(e,l){var r=i(this),o=r.attr("lay-verify").split("|"),u="",d=r.val();if(r.removeClass(c),layui.each(o,function(e,i){var o="function"==typeof a[i];if(a[i]&&(o?u=a[i](d,l):!a[i][0].test(d)))return t.msg(u||a[i][1],{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(c),s=!0}),s)return s}),!s&&(layui.each(v,function(e,i){i.name&&(/^checkbox|radio$/.test(i.type)&&!i.checked||(o[i.name]=i.value))}),layui.event.call(this,l,"submit("+h+")",{elem:this,form:y,field:o}))},f=new u,y=i(document);f.render(),y.on("reset",r,function(){setTimeout(function(){f.render()},50)}),y.on("submit",r,d).on("click","*[lay-submit]",d),e(l,function(e){return f.set(e)})}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/jquery.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/jquery.js deleted file mode 100644 index 3886dcd2ee2dc6b2233b0a9f605f5dc0e8aa530e..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/jquery.js +++ /dev/null @@ -1,5 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;!function(e,t){"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(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===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]||t.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]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(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(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), -l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
        a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
        ","
        "],area:[1,"",""],param:[1,"",""],thead:[1,"","
        "],tr:[2,"","
        "],col:[2,"","
        "],td:[3,"","
        "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
        ","
        "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
        a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
        ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ -for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.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)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){e("jquery",pe)}),pe}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laydate.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laydate.js deleted file mode 100644 index 190246ac512ffe6f22d23e582f22130907d1dfb9..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laydate.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define(function(e){"use strict";var t=window,a={path:"",skin:"default",format:"YYYY-MM-DD",min:"1900-01-01 00:00:00",max:"2099-12-31 23:59:59",isv:!1,init:!0},n={},s=document,i="createElement",o="getElementById",l="getElementsByTagName",d=["laydate_box","laydate_void","laydate_click","LayDateSkin","skins/","/laydate.css"];t.laydate=function(e){return e=e||{},n.run(e),laydate},laydate.v="1.1",n.trim=function(e){return e=e||"",e.replace(/^\s|\s$/g,"").replace(/\s+/g," ")},n.digit=function(e){return e<10?"0"+(0|e):e},n.stopmp=function(e){return e=e||t.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this},n.each=function(e,t){for(var a=0,n=e.length;an.maxs[0]?s=["y",1]:e>=n.mins[0]&&e<=n.maxs[0]&&(e==n.mins[0]&&(tn.maxs[1]?s=["m",1]:t==n.maxs[1]&&a>n.maxs[2]&&(s=["d",1]))),s},n.timeVoid=function(e,t){if(n.ymd[1]+1==n.mins[1]&&n.ymd[2]==n.mins[2]){if(0===t&&en.maxs[3])return 1;if(1===t&&e>n.maxs[4])return 1;if(2===t&&e>n.maxs[5])return 1}if(e>(t?59:23))return 1},n.check=function(){var e=n.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,"\\d+\\").replace(/\\$/g,""),t=new RegExp(e),a=n.elem[d.elemv],s=a.match(/\d+/g)||[],i=n.checkVoid(s[0],s[1],s[2]);if(""!==a.replace(/\s/g,"")){if(!t.test(a))return n.elem[d.elemv]="",n.msg("日期不符合格式,请重新选择。"),1;if(i[0])return n.elem[d.elemv]="",n.msg("日期不在有效期内,请重新选择。"),1;i.value=n.elem[d.elemv].match(t).join(),s=i.value.match(/\d+/g),s[1]<1?(s[1]=1,i.auto=1):s[1]>12?(s[1]=12,i.auto=1):s[1].length<2&&(i.auto=1),s[2]<1?(s[2]=1,i.auto=1):s[2]>n.months[(0|s[1])-1]?(s[2]=31,i.auto=1):s[2].length<2&&(i.auto=1),s.length>3&&(n.timeVoid(s[3],0)&&(i.auto=1),n.timeVoid(s[4],1)&&(i.auto=1),n.timeVoid(s[5],2)&&(i.auto=1)),i.auto?n.creation([s[0],0|s[1],0|s[2]],1):i.value!==n.elem[d.elemv]&&(n.elem[d.elemv]=i.value)}},n.months=[31,null,31,30,31,30,31,31,30,31,30,31],n.viewDate=function(e,t,a){var s=(n.query,{}),i=new Date;e<(0|n.mins[0])&&(e=0|n.mins[0]),e>(0|n.maxs[0])&&(e=0|n.maxs[0]),i.setFullYear(e,t,a),s.ymd=[i.getFullYear(),i.getMonth(),i.getDate()],n.months[1]=n.isleap(s.ymd[0])?29:28,i.setFullYear(s.ymd[0],s.ymd[1],1),s.FDay=i.getDay(),s.PDay=n.months[0===t?11:t-1]-s.FDay+1,s.NDay=1,n.each(d.tds,function(e,t){var a,i=s.ymd[0],o=s.ymd[1]+1;t.className="",e=s.FDay&&e'+e+"年":'
      • '+(e-7+t)+"年
      • "}),t("#laydate_ys").innerHTML=a,n.each(t("#laydate_ys li"),function(e,t){"y"===n.checkVoid(t.getAttribute("y"))[0]?n.addClass(t,d[1]):n.on(t,"click",function(e){n.stopmp(e).reshow(),n.viewDate(0|this.getAttribute("y"),n.ymd[1],n.ymd[2])})})},n.initDate=function(){var e=(n.query,new Date),t=n.elem[d.elemv].match(/\d+/g)||[];t.length<3&&(t=n.options.start.match(/\d+/g)||[],t.length<3&&(t=[e.getFullYear(),e.getMonth()+1,e.getDate()])),n.inymd=t,n.viewDate(t[0],t[1]-1,t[2])},n.iswrite=function(){var e=n.query,t={time:e("#laydate_hms")};n.shde(t.time,!n.options.istime),n.shde(d.oclear,!("isclear"in n.options?n.options.isclear:1)),n.shde(d.otoday,!("istoday"in n.options?n.options.istoday:1)),n.shde(d.ok,!("issure"in n.options?n.options.issure:1))},n.orien=function(e,t){var a,s=n.elem.getBoundingClientRect();e.style.left=s.left+(t?0:n.scroll(1))+"px",a=s.bottom+e.offsetHeight/1.5<=n.winarea()?s.bottom-1:s.top>e.offsetHeight/1.5?s.top-e.offsetHeight+1:n.winarea()-e.offsetHeight,e.style.top=Math.max(a+(t?0:n.scroll()),1)+"px"},n.follow=function(e){n.options.fixed?(e.style.position="fixed",n.orien(e,1)):(e.style.position="absolute",n.orien(e))},n.viewtb=function(){var e,t=[],a=["日","一","二","三","四","五","六"],o={},d=s[i]("table"),r=s[i]("thead");return r.appendChild(s[i]("tr")),o.creath=function(e){var t=s[i]("th");t.innerHTML=a[e],r[l]("tr")[0].appendChild(t),t=null},n.each(new Array(6),function(a){t.push([]),e=d.insertRow(0),n.each(new Array(7),function(n){t[a][n]=0,0===a&&o.creath(n),e.insertCell(n)})}),d.insertBefore(r,d.children[0]),d.id=d.className="laydate_table",e=t=null,d.outerHTML.toLowerCase()}(),n.view=function(e,t){var o,l=n.query,r={};t=t||e,n.elem=e,n.options=t,n.options.format||(n.options.format=a.format),n.options.start=n.options.start||"",n.mm=r.mm=[n.options.min||a.min,n.options.max||a.max],n.mins=r.mm[0].match(/\d+/g),n.maxs=r.mm[1].match(/\d+/g),n.box?n.shde(n.box):(o=s[i]("div"),o.id=d[0],o.className=d[0],o.style.cssText="position: absolute;",o.setAttribute("name","laydate-v"+laydate.v),o.innerHTML=r.html='
          '+function(){var e="";return n.each(new Array(12),function(t){e+=''+n.digit(t+1)+"月"}),e}()+"
          "+n.viewtb+'",s.body.appendChild(o),n.box=l("#"+d[0]),n.events(),o=null),n.follow(n.box),t.zIndex?n.box.style.zIndex=t.zIndex:n.removeCssAttr(n.box,"z-index"),n.stopMosup("click",n.box),n.initDate(),n.iswrite(),n.check()},n.reshow=function(){return n.each(n.query("#"+d[0]+" .laydate_show"),function(e,t){n.removeClass(t,"laydate_show")}),this},n.close=function(){n.reshow(),n.shde(n.query("#"+d[0]),1),n.elem=null},n.parse=function(e,t,s){return e=e.concat(t),s=s||(n.options?n.options.format:a.format),s.replace(/YYYY|MM|DD|hh|mm|ss/g,function(t,a){return e.index=0|++e.index,n.digit(e[e.index])})},n.creation=function(e,t){var a=(n.query,n.hmsin),s=n.parse(e,[a[0].value,a[1].value,a[2].value]);n.elem[d.elemv]=s,t||(n.close(),"function"==typeof n.options.choose&&n.options.choose(s))},n.events=function(){var e=n.query,a={box:"#"+d[0]};n.addClass(s.body,"laydate_body"),d.tds=e("#laydate_table td"),d.mms=e("#laydate_ms span"),d.year=e("#laydate_y"),d.month=e("#laydate_m"),n.each(e(a.box+" .laydate_ym"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.addClass(this[l]("div")[0],"laydate_show"),e||(a.YY=parseInt(d.year.value),n.viewYears(a.YY))})}),n.on(e(a.box),"click",function(){n.reshow()}),a.tabYear=function(e){0===e?n.ymd[0]--:1===e?n.ymd[0]++:2===e?a.YY-=14:a.YY+=14,e<2?(n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2]),n.reshow()):n.viewYears(a.YY)},n.each(e("#laydate_YY .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t),a.tabYear(e)})}),a.tabMonth=function(e){e?(n.ymd[1]++,12===n.ymd[1]&&(n.ymd[0]++,n.ymd[1]=0)):(n.ymd[1]--,n.ymd[1]===-1&&(n.ymd[0]--,n.ymd[1]=11)),n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2])},n.each(e("#laydate_MM .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),a.tabMonth(e)})}),n.each(e("#laydate_ms span"),function(e,t){n.on(t,"click",function(e){n.stopmp(e).reshow(),n.hasClass(this,d[1])||n.viewDate(n.ymd[0],0|this.getAttribute("m"),n.ymd[2])})}),n.each(e("#laydate_table td"),function(e,t){n.on(t,"click",function(e){n.hasClass(this,d[1])||(n.stopmp(e),n.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),d.oclear=e("#laydate_clear"),n.on(d.oclear,"click",function(){n.elem[d.elemv]="",n.close()}),d.otoday=e("#laydate_today"),n.on(d.otoday,"click",function(){var e=new Date;n.creation([e.getFullYear(),e.getMonth()+1,e.getDate()])}),d.ok=e("#laydate_ok"),n.on(d.ok,"click",function(){n.valid&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])}),a.times=e("#laydate_time"),n.hmsin=a.hmsin=e("#laydate_hms input"),a.hmss=["小时","分钟","秒数"],a.hmsarr=[],n.msg=function(t,s){var i='
          '+(s||"提示")+"×
          ";"string"==typeof t?(i+="

          "+t+"

          ",n.shde(e("#"+d[0])),n.removeClass(a.times,"laydate_time1").addClass(a.times,"laydate_msg")):(a.hmsarr[t]?i=a.hmsarr[t]:(i+='
          ',n.each(new Array(0===t?24:60),function(e){i+=""+e+""}),i+="
          ",a.hmsarr[t]=i),n.removeClass(a.times,"laydate_msg"),n[0===t?"removeClass":"addClass"](a.times,"laydate_time1")),n.addClass(a.times,"laydate_show"),a.times.innerHTML=i},a.hmson=function(t,a){var s=e("#laydate_hmsno span"),i=n.valid?null:1;n.each(s,function(e,s){i?n.addClass(s,d[1]):n.timeVoid(e,a)?n.addClass(s,d[1]):n.on(s,"click",function(e){n.hasClass(this,d[1])||(t.value=n.digit(0|this.innerHTML))})}),n.addClass(s[0|t.value],"laydate_click")},n.each(a.hmsin,function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.msg(e,a.hmss[e]),a.hmson(this,e)})}),n.on(s,"mouseup",function(){var t=e("#"+d[0]);t&&"none"!==t.style.display&&(n.check()||n.close())}).on(s,"keydown",function(e){e=e||t.event;var a=e.keyCode;13===a&&n.elem&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])})},laydate.reset=function(){n.box&&n.elem&&n.follow(n.box)},laydate.now=function(e,t){var a=new Date(0|e?function(e){return e<864e5?+new Date+864e5*e:e}(parseInt(e)):+new Date);return n.parse([a.getFullYear(),a.getMonth()+1,a.getDate()],[a.getHours(),a.getMinutes(),a.getSeconds()],t)},layui.addcss("modules/laydate/laydate.css",function(){},"laydatecss"),e("laydate",laydate)}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/layedit.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/layedit.js deleted file mode 100644 index e8d3c66e5bcf2e188ef6a4b9e5cc0b6094e9b8d1..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/layedit.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define(["layer","form"],function(t){"use strict";var e=layui.jquery,i=layui.layer,a=layui.form(),l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",s=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};s.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},s.prototype.on=function(t,e){return layui.onevent(n,t,e)},s.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",s=e("#"+t),u="LAY_layedit_"+ ++a.index,d=s.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
          ','
          '+f+"
          ",'
          ','',"
          ","
          "].join(""));return l.ie&&l.ie<8?s.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),c.call(a,m,s[0],y),s.addClass("layui-hide").after(m),a.index)},s.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},s.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},s.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},s.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var c=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),s=o.find("head"),c=e([""].join("")),u=o.find("body");s.append(c),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,s=e(r.body);s.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

          ")}}),e(n).parents("form").on("submit",function(){var t=s.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),s.on("paste",function(e){r.execCommand("formatBlock",!1,"

          "),setTimeout(function(){f.call(t,s),n.value=s.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),s={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o({url:r.url,method:r.type,elem:e(n).find("input")[0],unwrap:!0,success:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},c=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

          "),setTimeout(function(){o.focus()},10)):s[a]&&s[a].call(this,u),h.call(t,c,i)}},d=/image/;c.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,c),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

            ','
          • ','','
            ','',"
            ","
          • ",'
          • ','','
            ','",'","
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
        • '+e+'
        • ')}),'
            '+t.join("")+"
          "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
            ','
          • ','','
            ','","
            ","
          • ",'
          • ','','
            ','',"
            ","
          • ",'
          • ','','',"
          • ","
          "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new s;t(n,w)}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/layer.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/layer.js deleted file mode 100644 index 9c12558372540336aac8f5b441f7176acea35029..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/layer.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"]},r={v:"3.0.2",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):r.link("skin/"+e.extend),this):this},link:function(t,n,a){if(r.path){var o=i("head")[0],s=document.createElement("link");"string"==typeof n&&(a=n);var l=(a||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,i("#"+f)[0]||o.appendChild(s),"function"==typeof n&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(i("#"+f).css("width"))?n():setTimeout(u,100))}()}},ready:function(e){var t="skinlayercss",i="302";return a?layui.addcss("modules/layer/default/layer.css?v="+r.v+i,e,t):r.link("skin/default/layer.css?v="+r.v+i,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),r.ready(function(){document.body?t.creat():setTimeout(function(){t.creat()},50)})};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
          '+(f?r.title[0]:r.title)+"
          ":"";return r.zIndex=s,t([r.shade?'
          ':"",'
          '+(e&&2!=r.type?"":u)+'
          '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
          '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
          '+e+"
          "}():"")+(r.resize?'':"")+"
          "],u,i('
          ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]&&e.layero.addClass(l.anim[t.anim]).data("anim",!0)}},s.pt.auto=function(e){function t(e){e=s.find(e),e.height(f[1]-c-u-2*(0|parseFloat(e.css("padding"))))}var a=this,o=a.config,s=i("#"+l[0]+e);""===o.area[0]&&o.maxWidth>0&&(r.ie&&r.ie<8&&o.btn&&s.width(s.innerWidth()),s.outerWidth()>o.maxWidth&&s.width(o.maxWidth));var f=[s.innerWidth(),s.innerHeight()],c=s.find(l[1]).outerHeight()||0,u=s.find("."+l[6]).outerHeight()||0;switch(o.type){case 2:t("iframe");break;default:""===o.area[1]?o.fixed&&f[1]>=n.height()&&(f[1]=n.height(),t("."+l[5])):t("."+l[5])}return a},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("anim")&&t.addClass(a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),setTimeout(function(){f()},r.ie&&r.ie<10||!t.data("anim")?0:200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,n="";if(e>0)for(n=''+t[0].title+"";i"+t[i].title+"";return n}(),content:'
            '+function(){var e=t.length,i=1,n="";if(e>0)for(n='
          • '+(t[0].content||"no content")+"
          • ";i'+(t[i].content||"no content")+"";return n}()+"
          ",success:function(t){var a=t.find(".layui-layer-title").children(),o=t.find(".layui-layer-tabmain").children();a.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var n=i(this),a=n.index();n.addClass("layui-layer-tabnow").siblings().removeClass("layui-layer-tabnow"),o.eq(a).show().siblings().hide(),"function"==typeof e.change&&e.change(a)}),"function"==typeof n&&n(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){u.length<=1||(f.start=s.imgIndex-1,r.close(s.index),setTimeout(function(){r.photos(t,!0,e)},200))},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
          '+(u.length>1?'':"")+'
          '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
          ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
          是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.jquery),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laypage.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laypage.js deleted file mode 100644 index 1322587b706eff7f7ce509c1d9ad334fae27c7f6..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laypage.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ -; layui.define(function (a) { "use strict"; function t(a) { new p(a) } var e = document, r = "getElementById", n = "getElementsByTagName", s = 0, p = function (a) { var t = this, e = t.config = a || {}; e.item = s++ , t.render(!0) }; p.on = function (a, t, e) { return a.attachEvent ? a.attachEvent("on" + t, function () { e.call(a, window.even) }) : a.addEventListener(t, e, !1), p }, p.prototype.type = function () { var a = this.config; if ("object" == typeof a.cont) return void 0 === a.cont.length ? 2 : 3 }, p.prototype.view = function () { var a = this, t = a.config, e = [], r = {}; if (t.pages = 0 | t.pages, t.curr = 0 | t.curr || 1, t.groups = "groups" in t ? 0 | t.groups : 5, t.first = "first" in t ? t.first : "首页", t.last = "last" in t ? t.last : "末页", t.prev = "prev" in t ? t.prev : "上一页", t.next = "next" in t ? t.next : "下一页", t.pages <= 1) return ""; for (t.groups > t.pages && (t.groups = t.pages), r.index = Math.ceil((t.curr + (t.groups > 1 && t.groups !== t.pages ? 1 : 0)) / (0 === t.groups ? 1 : t.groups)), t.curr > 1 && t.prev && e.push('' + t.prev + ""), r.index > 1 && t.first && 0 !== t.groups && e.push('' + t.first + ""), r.poor = Math.floor((t.groups - 1) / 2), r.start = r.index > 1 ? t.curr - r.poor : 1, r.end = r.index > 1 ? function () { var a = t.curr + (t.groups - r.poor - 1); return a > t.pages ? t.pages : a }() : t.groups, r.end - r.start < t.groups - 1 && (r.start = r.end - t.groups + 1); r.start <= r.end; r.start++)r.start === t.curr ? e.push('" + r.start + "") : e.push('' + r.start + ""); return t.pages > t.groups && r.end < t.pages && t.last && 0 !== t.groups && e.push('' + t.last + ""), r.flow = !t.prev && 0 === t.groups, (t.curr !== t.pages && t.next || r.flow) && e.push(function () { return r.flow && t.curr === t.pages ? '' + t.next + "" : '' + t.next + "" }()), '
          ' + e.join("") + function () { return t.skip ? '到第 ' : "" }() + "
          " }, p.prototype.jump = function (a) { if (a) { for (var t = this, e = t.config, r = a.children, s = a[n]("button")[0], i = a[n]("input")[0], u = 0, o = r.length; u < o; u++)"a" === r[u].nodeName.toLowerCase() && p.on(r[u], "click", function () { var a = 0 | this.getAttribute("data-page"); e.curr = a, t.render() }); s && p.on(s, "click", function () { var a = 0 | i.value.replace(/\s|\D/g, ""); a && a <= e.pages && (e.curr = a, t.render()) }) } }, p.prototype.render = function (a) { var t = this, n = t.config, s = t.type(), p = t.view(); 2 === s ? n.cont.innerHTML = p : 3 === s ? n.cont.html(p) : e[r](n.cont).innerHTML = p, n.jump && n.jump(n, a), t.jump(e[r]("layui-laypage-" + n.item)), n.hash && !a && (location.hash = "!" + n.hash + "=" + n.curr) }, a("laypage", t) }); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laytpl.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laytpl.js deleted file mode 100644 index 32654fc35f90cdcf0fefd9b98afeb4478a75d6ed..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/laytpl.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},n={exp:function(e){return new RegExp(e,"g")},query:function(e,n,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return c((n||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/markdown.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/markdown.js deleted file mode 100755 index c7edeee3b1bc3dbdf938b27dc35e4050672a2458..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/markdown.js +++ /dev/null @@ -1,399 +0,0 @@ -/** - @Name:layui.markdown markdown编辑器 - @Author:zhangkx - @License:LGPL - */ -layui.define(['layer', 'form'], function (exports) { - var $ = layui.jquery, - _form = layui.form(), - _layer = layui.layer, - markdown = function () { - //全局配置 - this.config = { - //默认工具bar - tools: [ - 'face', 'image', 'link', 'code', 'help', 'full_screen', 'subfield', 'preview' - ], - height: 280 //默认高 - }; - }; - - // markdown 解析器 - var _parser = new HyperDown; - - var tools = { - face: '表情', - image: '图片', - link: '链接', - code: '代码', - full_screen: '全屏', - subfield: '分栏', - preview: '预览' - }; - - // 建立编辑器 - markdown.prototype.build = function (id, settings) { - var dom = $('#' + id); - var _settings = $.extend({}, this.config, (settings || {})); - var image_upload_action = _settings.image_upload_action; // 上传图片的action - var _tools = (function () { - var _nodes = []; - $.each(_settings.tools, function (item) { - if (tools[_settings.tools[item]]) - _nodes.push(tools[_settings.tools[item]]); - }); - return _nodes.join(''); - })(); - - console.log(_settings.required) - var _required = _settings.required ? ' required lay-verify="required" ' : ''; - var editor = $([ - '
          ', - '
          ' + _tools + 'markdown
          ', - ' ', - '
          '].join('') - ); - - dom.empty().append(editor); - - // 表情 - dom.find("i[event='face'], span[event='face']").click(function () { - face($(this), function (img) { - // insertTextarea(document.getElementsByName("markdown_content")[0], "@" + img.alt +"(" + img.src + ")") - insertTextarea(document.getElementsByName("markdown_content")[0], "@" + img.alt); - }) - }); - - // 图片 - dom.find("span[event='image']").click(function () { - // _layer.msg("开发中...", {shift: 6, time: 1000}); - var textarea = document.getElementsByName("markdown_content")[0]; - image($(this), image_upload_action, function (image) { - insertTextarea(textarea, "![" + image.alt + "](" + image.src + ")"); - }); - }); - - // 链接 - dom.find("span[event='link']").click(function () { - var textarea = document.getElementsByName("markdown_content")[0]; - var text = textarea.value.substring(textarea.selectionStart, textarea.selectionEnd); - link($(this), text, function (link) { - var text = ""; - if (link.title && link.url) { - text = link.title ? "[" + link.title + "](" + link.url + ")" : link.url - } else if (!link.title && link.url) { - text = link.url; - } - insertTextarea(textarea, text); - }); - }); - - // 插入代码 - dom.find("span[event='code']").click(function () { - var textarea = document.getElementsByName("markdown_content")[0]; - code($(this), function (_code) { - insertTextarea(textarea, "\n```lang-" + _code.lang + "\n" + _code.content + "\n" + "```" + "\n"); - }); - }); - - // 预览 - dom.find("span[event='preview']").click(function () { - var textarea = document.getElementsByName("markdown_content")[0]; - _layer.open({ - title: "预览", type: 1, area: ["100%", "100%"], btn: null, shadeClose: true, shade: 0.2, - content: "
          " + - _parser.makeHtml(textarea.value) + "
          ", - success: function (layero, index) { - $(document).on('keydown', function (e) { - if (e.keyCode == 27) - _layer.close(index); - }); - Prism.highlightAll(); - } - }); - }); - - // 全屏写作 - var shade = null; - var is_full_screen = false; - var is_half_screen = false; - dom.find("span[event='full_screen']").click(function () { - if (!is_full_screen) { - $(".layui-body").css("position", "static"); - dom.find(".layui-markdown").addClass('full-screen'); - dom.find(".layui-markdown .tools span[event='subfield']").removeClass("hide"); - } else { - // $(".layui-header, .layui-side").show(); - $(".layui-body").css("position", 'absolute'); - dom.find(".layui-markdown").removeClass('full-screen'); - dom.find(".layui-markdown .tools span[event='subfield']").addClass("hide"); - dom.find(".layui-markdown").removeClass('half'); - $(".article-preview").removeClass("full"); - is_half_screen = false; - if (shade) - shade.remove(); - } - is_full_screen = !is_full_screen; - }); - - // 分栏 - dom.find("span[event='subfield']").click(function () { - if (!is_full_screen) { - return false; - } - if (!is_half_screen) { - shade = $('
          ') - $("body").append(shade); - dom.find(".layui-markdown").addClass('half'); - $(".article-preview").addClass("full"); - } else { - dom.find(".layui-markdown").removeClass('half'); - $(".article-preview").removeClass("full"); - if (shade) - shade.remove(); - } - is_half_screen = !is_half_screen; - }); - }; - - // 修改textarea文字 - var insertTextarea = function (textarea, str) { - if (textarea) { - var _value = textarea.value; - textarea.value = _value.substring(0, textarea.selectionStart) + str + _value.substring(textarea.selectionEnd); - } - }; - - // code - var code = function(obj, callback) { - var _width = ($(window).width() < 800) ? "98%" : "800px"; - return _layer.open({ - title: "插入代码:", type: 1, area: [_width, "500px"], btn: null, shadeClose: true, shade: 0.2, - content: "
          " + - "
          " + - "
          " + - " " + - "
          " + - "
          " + - "
          " + - " " + - "
          " + - "
          " + - " " + - " " + - "
          " + - "
          ", - success: function (layero, index) { - _form.render("select"); - layero.find("button[name='yes']").click(function () { - var _lang = layero.find("select[name='lang']"); - var _content = layero.find("textarea[name='content']"); - if (_lang.val() == "") { - _lang.addClass("layui-form-danger").val("").focus(); - _layer.msg("请选择语言", {shift: 6, time: 800}); - } - else if (_content.val() == "") { - _content.addClass("layui-form-danger").val("").focus(); - _layer.msg("请输入代码", {shift: 6, time: 800}); - } else { - callback({ - lang: _lang.val(), content: _content.val() - }); - _layer.close(index); - } - }); - layero.find("button[name='cancel']").click(function () { - _layer.close(index); - }); - $(document).on('keydown', function (e) { - if (e.keyCode == 27) - _layer.close(index); - }); - } - }); - }; - - var image = function (obj, image_upload_action, callback) { - var _width = ($(window).width() < 470) ? "98%" : "470px"; - var _height = ($(window).width() < 420) ? "300px" : "265px"; - var _idx = _layer.open({ - title: "插入图片:", type: 1, area: [_width, _height], btn: null, shadeClose: true, shade: 0.2, - content: "
          " + - " " + - "
          " + - " " + - "
          " + - " " + - "
          " + - " " + - "" + - "
          " + - "
          " + - "
          " + - "
          " + - " " + - " " + - "
          " + - "
          ", - success: function (layero, index) { - layero.find("input[name='url']").focus(); - layero.find("button[name='upload']").click(function () { - if (image_upload_action == null || image_upload_action == '') { - _layer.msg("没有定义上传图片action地址!", {shift: 6, time: 1000}); - } else { - layero.find("input[name='file']").click(); - } - }); - layero.find("input[name='file']").change(function () { - if ($(this).val() == '') return; - var load = _layer.load(8); - layero.find("#upload_image").ajaxSubmit({ - success: function (data) { - _layer.close(load); - if (data.status == 0) { - layero.find("input[name='url']").val(''); - _layer.alert(data.msg, {icon: 5, shade: 0.6}); - } else { - layero.find("input[name='url']").val(data.src); - } - } - }); - }); - layero.find("button[name='yes']").click(function () { - var url = layero.find("input[name='url']"); - if (url.val() == "" || url.val().match(/^((https|http)?:\/\/)?[^\s]+\.(png|jpg|jpeg|gif|svg|bmp)/gi ) == null) { - url.addClass("layui-form-danger").val("").focus(); - _layer.msg("请输入正确的图片地址", {shift: 6, time: 800}); - } else { - callback({ - alt: layero.find("input[name='text']").val(), - src: url.val() - }); - _layer.close(index); - } - }); - layero.find("button[name='cancel']").click(function () { - _layer.close(index); - }); - $(document).on('keydown', function (e) { - if (e.keyCode == 27) - _layer.close(index); - }); - } - }); - // _layer.iframeAuto(_idx); - return _idx; - }; - - // 链接 - var link = function (obj, text, callback) { - var _width = ($(window).width() < 400) ? "98%" : "400px"; - return _layer.open({ - title: "插入链接:", type: 1, area: [_width, "260px"], btn: null, shadeClose: true, shade: 0.2, - content: "
          " + - " " + - "
          " + - " " + - "
          " + - " " + - "
          " + - " " + - "
          " + - "
          " + - " " + - " " + - "
          " + - "
          ", - success: function (layero, index) { - layero.find("input[name='url']").focus(); - layero.find("button[name='yes']").click(function () { - var url = layero.find("input[name='url']"); - if (url.val() == "" || url.val().match(/^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+/g) == null) { - url.addClass("layui-form-danger").val("").focus(); - _layer.msg("请输入正确的链接", {shift: 6, time: 800}); - } else { - callback({ - title: layero.find("input[name='text']").val(), - url: url.val() - }); - _layer.close(index); - } - }); - layero.find("button[name='cancel']").click(function () { - _layer.close(index); - }); - $(document).on('keydown', function (e) { - if (e.keyCode == 27) - _layer.close(index); - }); - } - }); - }; - - // 表情弹窗 - var face = function (obj, callback) { - //表情库 - var faces = function () { - var alt = ["[微笑]", "[嘻嘻]", "[哈哈]", "[可爱]", "[可怜]", "[挖鼻]", "[吃惊]", "[害羞]", "[挤眼]", "[闭嘴]", - "[鄙视]", "[爱你]", "[泪]", "[偷笑]", "[亲亲]", "[生病]", "[太开心]", "[白眼]", "[右哼哼]", "[左哼哼]", - "[嘘]", "[衰]", "[委屈]", "[吐]", "[哈欠]", "[抱抱]", "[怒]", "[疑问]", "[馋嘴]", "[拜拜]", "[思考]", - "[汗]", "[困]", "[睡]", "[钱]", "[失望]", "[酷]", "[色]", "[哼]", "[鼓掌]", "[晕]", "[悲伤]", "[抓狂]", - "[黑线]", "[阴险]", "[怒骂]", "[互粉]", "[心]", "[伤心]", "[猪头]", "[熊猫]", "[兔子]", "[ok]", "[耶]", - "[good]", "[NO]", "[赞]", "[来]", "[弱]", "[草泥马]", "[神马]", "[囧]", "[浮云]", "[给力]", "[围观]", - "[威武]", "[奥特曼]", "[礼物]", "[钟]", "[话筒]", "[蜡烛]", "[蛋糕]"], arr = {}; - layui.each(alt, function (index, item) { - arr[item] = layui.cache.dir + 'images/face/' + index + '.gif'; - }); - return arr; - }(); - face.hide = face.hide || function (e) { - if ($(e.target).attr('event') !== 'face') { - _layer.close(face.index); - } - }; - var _idx = face.index = _layer.tips((function () { - var content = []; - layui.each(faces, function (key, item) { - content.push('
        • ' + key + '
        • '); - }); - return '
            ' + content.join('') + '
          '; - })(), obj, { - tips: 3, time: 0, skin: 'layui-box layui-util-face', maxWidth: 500, - success: function (layero, index) { - layero.css({ - marginTop: -4, marginLeft: -10 - }).find('.layui-clear > li').on('click', function () { - callback && callback({ - src: faces[this.title], alt: this.title - }); - layer.close(index); - }); - $(document).off('click', face.hide).on('click', face.hide); - } - }); - if ($(window).width() < 450) { - $(".layui-util-face").css("left", "17px").css("width", "92%"); - $(".layui-util-face .layui-layer-content").css("width", "92%"); - $(".layui-util-face ul.layui-clear").css("width", "90%");//.css("padding-right", "1px"); - } - return _idx; - }; - - exports('markdown', new markdown()); -}); diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/mobile.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/mobile.js deleted file mode 100644 index 7c59178d35f8a0944f1d32916d1800da1f13764a..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/mobile.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},n={exp:function(e){return new RegExp(e,"g")},query:function(e,n,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return c((n||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

          '+(e?i.title[0]:i.title)+"

          ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
          '+e+"
          "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

          '+(i.content||"")+"

          "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
          ':"")+'
          "+l+'
          '+i.content+"
          "+d+"
          ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
          ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:0})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='
          ',l=s.attr("lay-type")||a.type;a.unwrap||(u='
          '+u+''+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"
          "),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/pagesize.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/pagesize.js deleted file mode 100644 index f651976480060f28e9e3569581e4f6ee20d8c9bf..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/pagesize.js +++ /dev/null @@ -1,20 +0,0 @@ - -layui.define('jquery', function (exports) { - var $ = layui.jquery; - function pagesize(id, pageSize) { - $('#' + id + ' .layui-laypage').append('每页 '); - $('#' + id + ' .laypage-extend-pagesize input[class=layui-laypage-skip]').val(pageSize); - var pagesize = { - btn: $('#' + id + ' .laypage-extend-pagesize .layui-laypage-btn'), - callback: function (callback) { - this.ok = callback; - }, - ok: null - }; - $(pagesize.btn).on('click', function () { - pagesize.ok(pagesize.btn.siblings('input[class=layui-laypage-skip]').val()); - }); - return pagesize; - } - exports('pagesize', pagesize); -}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/tree.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/tree.js deleted file mode 100644 index d1f5dcf6cca8f6147c893c301955857cd2fb71bd..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/tree.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(e){"use strict";var o=layui.jquery,a=layui.hint(),r="layui-tree-enter",i=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};i.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},i.prototype.tree=function(e,a){var r=this,i=r.options,n=a||i.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
            '),s=o(["
          • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return i.check?''+("checkbox"===i.check?t.checkbox[0]:"radio"===i.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
          • "].join(""));l&&(s.append(c),r.tree(c,n.children)),e.append(s),"function"==typeof i.click&&r.click(s,n),r.spread(s,n),i.drag&&r.drag(s,n)})},i.prototype.click=function(e,o){var a=this,r=a.options;e.children("a").on("click",function(e){layui.stope(e),r.click(o)})},i.prototype.spread=function(e,o){var a=this,r=(a.options,e.children(".layui-tree-spread")),i=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),i.removeClass("layui-show"),r.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),i.addClass("layui-show"),r.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};i[0]&&(r.on("click",l),n.on("dblclick",l))},i.prototype.on=function(e){var a=this,i=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),i.drag&&o(document).on("mousemove",function(e){var r=a.move;if(r.from){var i=(r.to,o('
            '));e.preventDefault(),o("."+t)[0]||o("body").append(i);var n=o("."+t)[0]?o("."+t):i;n.addClass("layui-show").html(r.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(r),e.to&&e.to.elem.children("a").removeClass(r),a.move={},o("."+t).remove())})},i.prototype.move={},i.prototype.drag=function(e,a){var i=this,t=(i.options,e.children("a")),n=function(){var t=o(this),n=i.move;n.from&&(n.to={item:a,elem:e},t.addClass(r))};t.on("mousedown",function(){var o=i.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=i.move;a.from&&(delete a.to,e.removeClass(r))})},e("tree",function(e){var r=new i(e=e||{}),t=o(e.elem);return t[0]?void r.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/upload.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/upload.js deleted file mode 100644 index aa65f308d36da4d4e631d4891d00499f044b1fbc..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/upload.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define("layer",function(e){"use strict";var a=layui.jquery,t=layui.layer,i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"},s=function(e){this.options=e};s.prototype.init=function(){var e=this,t=e.options,r=a("body"),s=a(t.elem||".layui-upload-file"),u=a('');return a("#"+n)[0]||r.append(u),s.each(function(r,s){s=a(s);var u='
            ',l=s.attr("lay-type")||t.type;t.unwrap||(u='
            '+u+''+(s.attr("lay-title")||t.title||"上传"+(o[l]||"图片"))+"
            "),u=a(u),t.unwrap||u.on("dragover",function(e){e.preventDefault(),a(this).addClass(i)}).on("dragleave",function(){a(this).removeClass(i)}).on("drop",function(){a(this).removeClass(i)}),s.parent("form").attr("target")===n&&(t.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=a(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return t.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return t.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return t.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return t.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=a("#"+n),f=setInterval(function(){var a;try{a=c.contents().find("body").text()}catch(i){t.msg("上传接口存在跨域",r),clearInterval(f)}if(a){clearInterval(f),c.contents().find("body").html("");try{a=JSON.parse(a)}catch(i){return a={},t.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(a,e)}},30);e.value=""}},e("upload",function(e){var a=new s(e=e||{});a.init()})}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/util.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/util.js deleted file mode 100644 index b96d207ab9127e544ee28491d69103c851a41b3f..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/lay/modules/util.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;layui.define("jquery",function(l){"use strict";var o=layui.jquery,i={fixbar:function(l){l=l||{},l.bgcolor=l.bgcolor?"background-color:"+l.bgcolor:"";var i,a,c="layui-fixbar-top",t=[l.bar1===!0?"":l.bar1,l.bar2===!0?"":l.bar2,""],r=o(['
              ',l.bar1?'
            • '+t[0]+"
            • ":"",l.bar2?'
            • '+t[1]+"
            • ":"",'
            • '+t[2]+"
            • ","
            "].join("")),e=r.find("."+c),s=function(){var i=o(document).scrollTop();i>=(l.showHeight||200)?a||(e.show(),a=1):a&&(e.hide(),a=0)};o(".layui-fixbar")[0]||("object"==typeof l.css&&r.css(l.css),o("body").append(r),s(),r.find("li").on("click",function(){var i=o(this),a=i.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),l.click&&l.click.call(this,a)}),o(document).on("scroll",function(){i&&clearTimeout(i),i=setTimeout(function(){s()},100)}))}};l("util",i)}); \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/layui.js b/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/layui.js deleted file mode 100644 index cc355ca575e70bffa198607c1b3ac6bad854da99..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/static/plug/layui/layui.js +++ /dev/null @@ -1,2 +0,0 @@ -/** layui-v1.0.9 MIT License By http://www.layui.com */ - ;!function(e){"use strict";var t=function(){this.v="1.0.9"};t.fn=t.prototype;var n=document,o=t.fn.cache={},i=function(){var e=n.scripts,t=e[e.length-1].src;return t.substring(0,t.lastIndexOf("/")+1)}(),r=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},l="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),a={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"dest/layui.all"};o.modules={},o.status={},o.timeout=10,o.event={},t.fn.define=function(e,t){var n=this,i="function"==typeof e,r=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return i&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?r.call(n):(n.use(e,r),n)},t.fn.use=function(e,t,u){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[m]=t,y.removeChild(p),function i(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void(o.status[m]?c():setTimeout(i,4))}())}function c(){u.push(layui[m]),e.length>1?f.use(e.slice(1),t,u):"function"==typeof t&&t.apply(layui,u)}var f=this,d=o.dir=o.dir?o.dir:i,y=n.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(f.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=jQuery);var m=e[0],v=0;if(u=u||[],o.host=o.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&a[m]||!layui["layui.all"]&&layui["layui.mobile"]&&a[m])return c(),f;var p=n.createElement("script"),h=(a[m]?d+"lay/":o.base||"")+(f.modules[m]||m)+".js";return p.async=!0,p.charset="utf-8",p.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),o.modules[m]?!function g(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void("string"==typeof o.modules[m]&&o.status[m]?c():setTimeout(g,4))}():(y.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||l?p.addEventListener("load",function(e){s(e,h)},!1):p.attachEvent("onreadystatechange",function(e){s(e,h)})),o.modules[m]=h,f},t.fn.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},t.fn.link=function(e,t,i){var l=this,a=n.createElement("link"),u=n.getElementsByTagName("head")[0];"string"==typeof t&&(i=t);var s=(i||e).replace(/\.|\//g,""),c=a.id="layuicss-"+s,f=0;a.rel="stylesheet",a.href=e+(o.debug?"?v="+(new Date).getTime():""),a.media="all",n.getElementById(c)||u.appendChild(a),"function"==typeof t&&!function d(){return++f>1e3*o.timeout/100?r(e+" timeout"):void(1989===parseInt(l.getStyle(n.getElementById(c),"width"))?function(){t()}():setTimeout(d,100))}()},t.fn.addcss=function(e,t,n){layui.link(o.dir+"css/"+e,t,n)},t.fn.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,t(o)},void(o.onerror=function(e){o.onerror=null,n(e)}))},t.fn.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},t.fn.modules=function(){var e={};for(var t in a)e[t]=a[t];return e}(),t.fn.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?r("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},t.fn.router=function(e){for(var t,n=(e||location.hash).replace(/^#/,"").split("/")||[],o={dir:[]},i=0;i (http://www.christophdorn.com) -// Date: 2013-09-15T16:09Z - -(function(expose) { - - - - - var MarkdownHelpers = {}; - - // For Spidermonkey based engines - function mk_block_toSource() { - return "Markdown.mk_block( " + - uneval(this.toString()) + - ", " + - uneval(this.trailing) + - ", " + - uneval(this.lineNumber) + - " )"; - } - - // node - function mk_block_inspect() { - var util = require("util"); - return "Markdown.mk_block( " + - util.inspect(this.toString()) + - ", " + - util.inspect(this.trailing) + - ", " + - util.inspect(this.lineNumber) + - " )"; - - } - - MarkdownHelpers.mk_block = function(block, trail, line) { - // Be helpful for default case in tests. - if ( arguments.length === 1 ) - trail = "\n\n"; - - // We actually need a String object, not a string primitive - /* jshint -W053 */ - var s = new String(block); - s.trailing = trail; - // To make it clear its not just a string - s.inspect = mk_block_inspect; - s.toSource = mk_block_toSource; - - if ( line !== undefined ) - s.lineNumber = line; - - return s; - }; - - - var isArray = MarkdownHelpers.isArray = Array.isArray || function(obj) { - return Object.prototype.toString.call(obj) === "[object Array]"; - }; - - // Don't mess with Array.prototype. Its not friendly - if ( Array.prototype.forEach ) { - MarkdownHelpers.forEach = function forEach( arr, cb, thisp ) { - return arr.forEach( cb, thisp ); - }; - } - else { - MarkdownHelpers.forEach = function forEach(arr, cb, thisp) { - for (var i = 0; i < arr.length; i++) - cb.call(thisp || arr, arr[i], i, arr); - }; - } - - MarkdownHelpers.isEmpty = function isEmpty( obj ) { - for ( var key in obj ) { - if ( hasOwnProperty.call( obj, key ) ) - return false; - } - return true; - }; - - MarkdownHelpers.extract_attr = function extract_attr( jsonml ) { - return isArray(jsonml) - && jsonml.length > 1 - && typeof jsonml[ 1 ] === "object" - && !( isArray(jsonml[ 1 ]) ) - ? jsonml[ 1 ] - : undefined; - }; - - - - - /** - * class Markdown - * - * Markdown processing in Javascript done right. We have very particular views - * on what constitutes 'right' which include: - * - * - produces well-formed HTML (this means that em and strong nesting is - * important) - * - * - has an intermediate representation to allow processing of parsed data (We - * in fact have two, both as [JsonML]: a markdown tree and an HTML tree). - * - * - is easily extensible to add new dialects without having to rewrite the - * entire parsing mechanics - * - * - has a good test suite - * - * This implementation fulfills all of these (except that the test suite could - * do with expanding to automatically run all the fixtures from other Markdown - * implementations.) - * - * ##### Intermediate Representation - * - * *TODO* Talk about this :) Its JsonML, but document the node names we use. - * - * [JsonML]: http://jsonml.org/ "JSON Markup Language" - **/ - var Markdown = function(dialect) { - switch (typeof dialect) { - case "undefined": - this.dialect = Markdown.dialects.Gruber; - break; - case "object": - this.dialect = dialect; - break; - default: - if ( dialect in Markdown.dialects ) - this.dialect = Markdown.dialects[dialect]; - else - throw new Error("Unknown Markdown dialect '" + String(dialect) + "'"); - break; - } - this.em_state = []; - this.strong_state = []; - this.debug_indent = ""; - }; - - /** - * Markdown.dialects - * - * Namespace of built-in dialects. - **/ - Markdown.dialects = {}; - - - - - // Imported functions - var mk_block = Markdown.mk_block = MarkdownHelpers.mk_block, - isArray = MarkdownHelpers.isArray; - - /** - * parse( markdown, [dialect] ) -> JsonML - * - markdown (String): markdown string to parse - * - dialect (String | Dialect): the dialect to use, defaults to gruber - * - * Parse `markdown` and return a markdown document as a Markdown.JsonML tree. - **/ - Markdown.parse = function( source, dialect ) { - // dialect will default if undefined - var md = new Markdown( dialect ); - return md.toTree( source ); - }; - - function count_lines( str ) { - var n = 0, - i = -1; - while ( ( i = str.indexOf("\n", i + 1) ) !== -1 ) - n++; - return n; - } - - // Internal - split source into rough blocks - Markdown.prototype.split_blocks = function splitBlocks( input ) { - input = input.replace(/(\r\n|\n|\r)/g, "\n"); - // [\s\S] matches _anything_ (newline or space) - // [^] is equivalent but doesn't work in IEs. - var re = /([\s\S]+?)($|\n#|\n(?:\s*\n|$)+)/g, - blocks = [], - m; - - var line_no = 1; - - if ( ( m = /^(\s*\n)/.exec(input) ) !== null ) { - // skip (but count) leading blank lines - line_no += count_lines( m[0] ); - re.lastIndex = m[0].length; - } - - while ( ( m = re.exec(input) ) !== null ) { - if (m[2] === "\n#") { - m[2] = "\n"; - re.lastIndex--; - } - blocks.push( mk_block( m[1], m[2], line_no ) ); - line_no += count_lines( m[0] ); - } - - return blocks; - }; - - /** - * Markdown#processBlock( block, next ) -> undefined | [ JsonML, ... ] - * - block (String): the block to process - * - next (Array): the following blocks - * - * Process `block` and return an array of JsonML nodes representing `block`. - * - * It does this by asking each block level function in the dialect to process - * the block until one can. Succesful handling is indicated by returning an - * array (with zero or more JsonML nodes), failure by a false value. - * - * Blocks handlers are responsible for calling [[Markdown#processInline]] - * themselves as appropriate. - * - * If the blocks were split incorrectly or adjacent blocks need collapsing you - * can adjust `next` in place using shift/splice etc. - * - * If any of this default behaviour is not right for the dialect, you can - * define a `__call__` method on the dialect that will get invoked to handle - * the block processing. - */ - Markdown.prototype.processBlock = function processBlock( block, next ) { - var cbs = this.dialect.block, - ord = cbs.__order__; - - if ( "__call__" in cbs ) - return cbs.__call__.call(this, block, next); - - for ( var i = 0; i < ord.length; i++ ) { - //D:this.debug( "Testing", ord[i] ); - var res = cbs[ ord[i] ].call( this, block, next ); - if ( res ) { - //D:this.debug(" matched"); - if ( !isArray(res) || ( res.length > 0 && !( isArray(res[0]) ) ) ) - this.debug(ord[i], "didn't return a proper array"); - //D:this.debug( "" ); - return res; - } - } - - // Uhoh! no match! Should we throw an error? - return []; - }; - - Markdown.prototype.processInline = function processInline( block ) { - return this.dialect.inline.__call__.call( this, String( block ) ); - }; - - /** - * Markdown#toTree( source ) -> JsonML - * - source (String): markdown source to parse - * - * Parse `source` into a JsonML tree representing the markdown document. - **/ - // custom_tree means set this.tree to `custom_tree` and restore old value on return - Markdown.prototype.toTree = function toTree( source, custom_root ) { - var blocks = source instanceof Array ? source : this.split_blocks( source ); - - // Make tree a member variable so its easier to mess with in extensions - var old_tree = this.tree; - try { - this.tree = custom_root || this.tree || [ "markdown" ]; - - blocks_loop: - while ( blocks.length ) { - var b = this.processBlock( blocks.shift(), blocks ); - - // Reference blocks and the like won't return any content - if ( !b.length ) - continue blocks_loop; - - this.tree.push.apply( this.tree, b ); - } - return this.tree; - } - finally { - if ( custom_root ) - this.tree = old_tree; - } - }; - - // Noop by default - Markdown.prototype.debug = function () { - var args = Array.prototype.slice.call( arguments); - args.unshift(this.debug_indent); - if ( typeof print !== "undefined" ) - print.apply( print, args ); - if ( typeof console !== "undefined" && typeof console.log !== "undefined" ) - console.log.apply( null, args ); - }; - - Markdown.prototype.loop_re_over_block = function( re, block, cb ) { - // Dont use /g regexps with this - var m, - b = block.valueOf(); - - while ( b.length && (m = re.exec(b) ) !== null ) { - b = b.substr( m[0].length ); - cb.call(this, m); - } - return b; - }; - - // Build default order from insertion order. - Markdown.buildBlockOrder = function(d) { - var ord = []; - for ( var i in d ) { - if ( i === "__order__" || i === "__call__" ) - continue; - ord.push( i ); - } - d.__order__ = ord; - }; - - // Build patterns for inline matcher - Markdown.buildInlinePatterns = function(d) { - var patterns = []; - - for ( var i in d ) { - // __foo__ is reserved and not a pattern - if ( i.match( /^__.*__$/) ) - continue; - var l = i.replace( /([\\.*+?|()\[\]{}])/g, "\\$1" ) - .replace( /\n/, "\\n" ); - patterns.push( i.length === 1 ? l : "(?:" + l + ")" ); - } - - patterns = patterns.join("|"); - d.__patterns__ = patterns; - //print("patterns:", uneval( patterns ) ); - - var fn = d.__call__; - d.__call__ = function(text, pattern) { - if ( pattern !== undefined ) - return fn.call(this, text, pattern); - else - return fn.call(this, text, patterns); - }; - }; - - - - - var extract_attr = MarkdownHelpers.extract_attr; - - /** - * renderJsonML( jsonml[, options] ) -> String - * - jsonml (Array): JsonML array to render to XML - * - options (Object): options - * - * Converts the given JsonML into well-formed XML. - * - * The options currently understood are: - * - * - root (Boolean): wether or not the root node should be included in the - * output, or just its children. The default `false` is to not include the - * root itself. - */ - Markdown.renderJsonML = function( jsonml, options ) { - options = options || {}; - // include the root element in the rendered output? - options.root = options.root || false; - - var content = []; - - if ( options.root ) { - content.push( render_tree( jsonml ) ); - } - else { - jsonml.shift(); // get rid of the tag - if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) - jsonml.shift(); // get rid of the attributes - - while ( jsonml.length ) - content.push( render_tree( jsonml.shift() ) ); - } - - return content.join( "\n\n" ); - }; - - - /** - * toHTMLTree( markdown, [dialect] ) -> JsonML - * toHTMLTree( md_tree ) -> JsonML - * - markdown (String): markdown string to parse - * - dialect (String | Dialect): the dialect to use, defaults to gruber - * - md_tree (Markdown.JsonML): parsed markdown tree - * - * Turn markdown into HTML, represented as a JsonML tree. If a string is given - * to this function, it is first parsed into a markdown tree by calling - * [[parse]]. - **/ - Markdown.toHTMLTree = function toHTMLTree( input, dialect , options ) { - - // convert string input to an MD tree - if ( typeof input === "string" ) - input = this.parse( input, dialect ); - - // Now convert the MD tree to an HTML tree - - // remove references from the tree - var attrs = extract_attr( input ), - refs = {}; - - if ( attrs && attrs.references ) - refs = attrs.references; - - var html = convert_tree_to_html( input, refs , options ); - merge_text_nodes( html ); - return html; - }; - - /** - * toHTML( markdown, [dialect] ) -> String - * toHTML( md_tree ) -> String - * - markdown (String): markdown string to parse - * - md_tree (Markdown.JsonML): parsed markdown tree - * - * Take markdown (either as a string or as a JsonML tree) and run it through - * [[toHTMLTree]] then turn it into a well-formated HTML fragment. - **/ - Markdown.toHTML = function toHTML( source , dialect , options ) { - var input = this.toHTMLTree( source , dialect , options ); - - return this.renderJsonML( input ); - }; - - - function escapeHTML( text ) { - return text.replace( /&/g, "&" ) - .replace( //g, ">" ) - .replace( /"/g, """ ) - .replace( /'/g, "'" ); - } - - function render_tree( jsonml ) { - // basic case - if ( typeof jsonml === "string" ) - return escapeHTML( jsonml ); - - var tag = jsonml.shift(), - attributes = {}, - content = []; - - if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) - attributes = jsonml.shift(); - - while ( jsonml.length ) - content.push( render_tree( jsonml.shift() ) ); - - var tag_attrs = ""; - for ( var a in attributes ) - tag_attrs += " " + a + '="' + escapeHTML( attributes[ a ] ) + '"'; - - // be careful about adding whitespace here for inline elements - if ( tag === "img" || tag === "br" || tag === "hr" ) - return "<"+ tag + tag_attrs + "/>"; - else - return "<"+ tag + tag_attrs + ">" + content.join( "" ) + ""; - } - - function convert_tree_to_html( tree, references, options ) { - var i; - options = options || {}; - - // shallow clone - var jsonml = tree.slice( 0 ); - - if ( typeof options.preprocessTreeNode === "function" ) - jsonml = options.preprocessTreeNode(jsonml, references); - - // Clone attributes if they exist - var attrs = extract_attr( jsonml ); - if ( attrs ) { - jsonml[ 1 ] = {}; - for ( i in attrs ) { - jsonml[ 1 ][ i ] = attrs[ i ]; - } - attrs = jsonml[ 1 ]; - } - - // basic case - if ( typeof jsonml === "string" ) - return jsonml; - - // convert this node - switch ( jsonml[ 0 ] ) { - case "header": - jsonml[ 0 ] = "h" + jsonml[ 1 ].level; - delete jsonml[ 1 ].level; - break; - case "bulletlist": - jsonml[ 0 ] = "ul"; - break; - case "numberlist": - jsonml[ 0 ] = "ol"; - break; - case "listitem": - jsonml[ 0 ] = "li"; - break; - case "para": - jsonml[ 0 ] = "p"; - break; - case "markdown": - jsonml[ 0 ] = "html"; - if ( attrs ) - delete attrs.references; - break; - case "code_block": - jsonml[ 0 ] = "pre"; - i = attrs ? 2 : 1; - var code = [ "code" ]; - code.push.apply( code, jsonml.splice( i, jsonml.length - i ) ); - jsonml[ i ] = code; - break; - case "inlinecode": - jsonml[ 0 ] = "code"; - break; - case "img": - jsonml[ 1 ].src = jsonml[ 1 ].href; - delete jsonml[ 1 ].href; - break; - case "linebreak": - jsonml[ 0 ] = "br"; - break; - case "link": - jsonml[ 0 ] = "a"; - break; - case "link_ref": - jsonml[ 0 ] = "a"; - - // grab this ref and clean up the attribute node - var ref = references[ attrs.ref ]; - - // if the reference exists, make the link - if ( ref ) { - delete attrs.ref; - - // add in the href and title, if present - attrs.href = ref.href; - if ( ref.title ) - attrs.title = ref.title; - - // get rid of the unneeded original text - delete attrs.original; - } - // the reference doesn't exist, so revert to plain text - else { - return attrs.original; - } - break; - case "img_ref": - jsonml[ 0 ] = "img"; - - // grab this ref and clean up the attribute node - var ref = references[ attrs.ref ]; - - // if the reference exists, make the link - if ( ref ) { - delete attrs.ref; - - // add in the href and title, if present - attrs.src = ref.href; - if ( ref.title ) - attrs.title = ref.title; - - // get rid of the unneeded original text - delete attrs.original; - } - // the reference doesn't exist, so revert to plain text - else { - return attrs.original; - } - break; - } - - // convert all the children - i = 1; - - // deal with the attribute node, if it exists - if ( attrs ) { - // if there are keys, skip over it - for ( var key in jsonml[ 1 ] ) { - i = 2; - break; - } - // if there aren't, remove it - if ( i === 1 ) - jsonml.splice( i, 1 ); - } - - for ( ; i < jsonml.length; ++i ) { - jsonml[ i ] = convert_tree_to_html( jsonml[ i ], references, options ); - } - - return jsonml; - } - - - // merges adjacent text nodes into a single node - function merge_text_nodes( jsonml ) { - // skip the tag name and attribute hash - var i = extract_attr( jsonml ) ? 2 : 1; - - while ( i < jsonml.length ) { - // if it's a string check the next item too - if ( typeof jsonml[ i ] === "string" ) { - if ( i + 1 < jsonml.length && typeof jsonml[ i + 1 ] === "string" ) { - // merge the second string into the first and remove it - jsonml[ i ] += jsonml.splice( i + 1, 1 )[ 0 ]; - } - else { - ++i; - } - } - // if it's not a string recurse - else { - merge_text_nodes( jsonml[ i ] ); - ++i; - } - } - }; - - - - var DialectHelpers = {}; - DialectHelpers.inline_until_char = function( text, want ) { - var consumed = 0, - nodes = []; - - while ( true ) { - if ( text.charAt( consumed ) === want ) { - // Found the character we were looking for - consumed++; - return [ consumed, nodes ]; - } - - if ( consumed >= text.length ) { - // No closing char found. Abort. - return null; - } - - var res = this.dialect.inline.__oneElement__.call(this, text.substr( consumed ) ); - consumed += res[ 0 ]; - // Add any returned nodes. - nodes.push.apply( nodes, res.slice( 1 ) ); - } - }; - - // Helper function to make sub-classing a dialect easier - DialectHelpers.subclassDialect = function( d ) { - function Block() {} - Block.prototype = d.block; - function Inline() {} - Inline.prototype = d.inline; - - return { block: new Block(), inline: new Inline() }; - }; - - - - - var forEach = MarkdownHelpers.forEach, - extract_attr = MarkdownHelpers.extract_attr, - mk_block = MarkdownHelpers.mk_block, - isEmpty = MarkdownHelpers.isEmpty, - inline_until_char = DialectHelpers.inline_until_char; - - /** - * Gruber dialect - * - * The default dialect that follows the rules set out by John Gruber's - * markdown.pl as closely as possible. Well actually we follow the behaviour of - * that script which in some places is not exactly what the syntax web page - * says. - **/ - var Gruber = { - block: { - atxHeader: function atxHeader( block, next ) { - var m = block.match( /^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/ ); - - if ( !m ) - return undefined; - - var header = [ "header", { level: m[ 1 ].length } ]; - Array.prototype.push.apply(header, this.processInline(m[ 2 ])); - - if ( m[0].length < block.length ) - next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) ); - - return [ header ]; - }, - - setextHeader: function setextHeader( block, next ) { - var m = block.match( /^(.*)\n([-=])\2\2+(?:\n|$)/ ); - - if ( !m ) - return undefined; - - var level = ( m[ 2 ] === "=" ) ? 1 : 2, - header = [ "header", { level : level }, m[ 1 ] ]; - - if ( m[0].length < block.length ) - next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) ); - - return [ header ]; - }, - - code: function code( block, next ) { - // | Foo - // |bar - // should be a code block followed by a paragraph. Fun - // - // There might also be adjacent code block to merge. - - var ret = [], - re = /^(?: {0,3}\t| {4})(.*)\n?/; - - // 4 spaces + content - if ( !block.match( re ) ) - return undefined; - - block_search: - do { - // Now pull out the rest of the lines - var b = this.loop_re_over_block( - re, block.valueOf(), function( m ) { ret.push( m[1] ); } ); - - if ( b.length ) { - // Case alluded to in first comment. push it back on as a new block - next.unshift( mk_block(b, block.trailing) ); - break block_search; - } - else if ( next.length ) { - // Check the next block - it might be code too - if ( !next[0].match( re ) ) - break block_search; - - // Pull how how many blanks lines follow - minus two to account for .join - ret.push ( block.trailing.replace(/[^\n]/g, "").substring(2) ); - - block = next.shift(); - } - else { - break block_search; - } - } while ( true ); - - return [ [ "code_block", ret.join("\n") ] ]; - }, - - horizRule: function horizRule( block, next ) { - // this needs to find any hr in the block to handle abutting blocks - var m = block.match( /^(?:([\s\S]*?)\n)?[ \t]*([-_*])(?:[ \t]*\2){2,}[ \t]*(?:\n([\s\S]*))?$/ ); - - if ( !m ) - return undefined; - - var jsonml = [ [ "hr" ] ]; - - // if there's a leading abutting block, process it - if ( m[ 1 ] ) { - var contained = mk_block( m[ 1 ], "", block.lineNumber ); - jsonml.unshift.apply( jsonml, this.toTree( contained, [] ) ); - } - - // if there's a trailing abutting block, stick it into next - if ( m[ 3 ] ) - next.unshift( mk_block( m[ 3 ], block.trailing, block.lineNumber + 1 ) ); - - return jsonml; - }, - - // There are two types of lists. Tight and loose. Tight lists have no whitespace - // between the items (and result in text just in the
          • ) and loose lists, - // which have an empty line between list items, resulting in (one or more) - // paragraphs inside the
          • . - // - // There are all sorts weird edge cases about the original markdown.pl's - // handling of lists: - // - // * Nested lists are supposed to be indented by four chars per level. But - // if they aren't, you can get a nested list by indenting by less than - // four so long as the indent doesn't match an indent of an existing list - // item in the 'nest stack'. - // - // * The type of the list (bullet or number) is controlled just by the - // first item at the indent. Subsequent changes are ignored unless they - // are for nested lists - // - lists: (function( ) { - // Use a closure to hide a few variables. - var any_list = "[*+-]|\\d+\\.", - bullet_list = /[*+-]/, - // Capture leading indent as it matters for determining nested lists. - is_list_re = new RegExp( "^( {0,3})(" + any_list + ")[ \t]+" ), - indent_re = "(?: {0,3}\\t| {4})"; - - // TODO: Cache this regexp for certain depths. - // Create a regexp suitable for matching an li for a given stack depth - function regex_for_depth( depth ) { - - return new RegExp( - // m[1] = indent, m[2] = list_type - "(?:^(" + indent_re + "{0," + depth + "} {0,3})(" + any_list + ")\\s+)|" + - // m[3] = cont - "(^" + indent_re + "{0," + (depth-1) + "}[ ]{0,4})" - ); - } - function expand_tab( input ) { - return input.replace( / {0,3}\t/g, " " ); - } - - // Add inline content `inline` to `li`. inline comes from processInline - // so is an array of content - function add(li, loose, inline, nl) { - if ( loose ) { - li.push( [ "para" ].concat(inline) ); - return; - } - // Hmmm, should this be any block level element or just paras? - var add_to = li[li.length -1] instanceof Array && li[li.length - 1][0] === "para" - ? li[li.length -1] - : li; - - // If there is already some content in this list, add the new line in - if ( nl && li.length > 1 ) - inline.unshift(nl); - - for ( var i = 0; i < inline.length; i++ ) { - var what = inline[i], - is_str = typeof what === "string"; - if ( is_str && add_to.length > 1 && typeof add_to[add_to.length-1] === "string" ) - add_to[ add_to.length-1 ] += what; - else - add_to.push( what ); - } - } - - // contained means have an indent greater than the current one. On - // *every* line in the block - function get_contained_blocks( depth, blocks ) { - - var re = new RegExp( "^(" + indent_re + "{" + depth + "}.*?\\n?)*$" ), - replace = new RegExp("^" + indent_re + "{" + depth + "}", "gm"), - ret = []; - - while ( blocks.length > 0 ) { - if ( re.exec( blocks[0] ) ) { - var b = blocks.shift(), - // Now remove that indent - x = b.replace( replace, ""); - - ret.push( mk_block( x, b.trailing, b.lineNumber ) ); - } - else - break; - } - return ret; - } - - // passed to stack.forEach to turn list items up the stack into paras - function paragraphify(s, i, stack) { - var list = s.list; - var last_li = list[list.length-1]; - - if ( last_li[1] instanceof Array && last_li[1][0] === "para" ) - return; - if ( i + 1 === stack.length ) { - // Last stack frame - // Keep the same array, but replace the contents - last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ) ); - } - else { - var sublist = last_li.pop(); - last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ), sublist ); - } - } - - // The matcher function - return function( block, next ) { - var m = block.match( is_list_re ); - if ( !m ) - return undefined; - - function make_list( m ) { - var list = bullet_list.exec( m[2] ) - ? ["bulletlist"] - : ["numberlist"]; - - stack.push( { list: list, indent: m[1] } ); - return list; - } - - - var stack = [], // Stack of lists for nesting. - list = make_list( m ), - last_li, - loose = false, - ret = [ stack[0].list ], - i; - - // Loop to search over block looking for inner block elements and loose lists - loose_search: - while ( true ) { - // Split into lines preserving new lines at end of line - var lines = block.split( /(?=\n)/ ); - - // We have to grab all lines for a li and call processInline on them - // once as there are some inline things that can span lines. - var li_accumulate = "", nl = ""; - - // Loop over the lines in this block looking for tight lists. - tight_search: - for ( var line_no = 0; line_no < lines.length; line_no++ ) { - nl = ""; - var l = lines[line_no].replace(/^\n/, function(n) { nl = n; return ""; }); - - - // TODO: really should cache this - var line_re = regex_for_depth( stack.length ); - - m = l.match( line_re ); - //print( "line:", uneval(l), "\nline match:", uneval(m) ); - - // We have a list item - if ( m[1] !== undefined ) { - // Process the previous list item, if any - if ( li_accumulate.length ) { - add( last_li, loose, this.processInline( li_accumulate ), nl ); - // Loose mode will have been dealt with. Reset it - loose = false; - li_accumulate = ""; - } - - m[1] = expand_tab( m[1] ); - var wanted_depth = Math.floor(m[1].length/4)+1; - //print( "want:", wanted_depth, "stack:", stack.length); - if ( wanted_depth > stack.length ) { - // Deep enough for a nested list outright - //print ( "new nested list" ); - list = make_list( m ); - last_li.push( list ); - last_li = list[1] = [ "listitem" ]; - } - else { - // We aren't deep enough to be strictly a new level. This is - // where Md.pl goes nuts. If the indent matches a level in the - // stack, put it there, else put it one deeper then the - // wanted_depth deserves. - var found = false; - for ( i = 0; i < stack.length; i++ ) { - if ( stack[ i ].indent !== m[1] ) - continue; - - list = stack[ i ].list; - stack.splice( i+1, stack.length - (i+1) ); - found = true; - break; - } - - if (!found) { - //print("not found. l:", uneval(l)); - wanted_depth++; - if ( wanted_depth <= stack.length ) { - stack.splice(wanted_depth, stack.length - wanted_depth); - //print("Desired depth now", wanted_depth, "stack:", stack.length); - list = stack[wanted_depth-1].list; - //print("list:", uneval(list) ); - } - else { - //print ("made new stack for messy indent"); - list = make_list(m); - last_li.push(list); - } - } - - //print( uneval(list), "last", list === stack[stack.length-1].list ); - last_li = [ "listitem" ]; - list.push(last_li); - } // end depth of shenegains - nl = ""; - } - - // Add content - if ( l.length > m[0].length ) - li_accumulate += nl + l.substr( m[0].length ); - } // tight_search - - if ( li_accumulate.length ) { - add( last_li, loose, this.processInline( li_accumulate ), nl ); - // Loose mode will have been dealt with. Reset it - loose = false; - li_accumulate = ""; - } - - // Look at the next block - we might have a loose list. Or an extra - // paragraph for the current li - var contained = get_contained_blocks( stack.length, next ); - - // Deal with code blocks or properly nested lists - if ( contained.length > 0 ) { - // Make sure all listitems up the stack are paragraphs - forEach( stack, paragraphify, this); - - last_li.push.apply( last_li, this.toTree( contained, [] ) ); - } - - var next_block = next[0] && next[0].valueOf() || ""; - - if ( next_block.match(is_list_re) || next_block.match( /^ / ) ) { - block = next.shift(); - - // Check for an HR following a list: features/lists/hr_abutting - var hr = this.dialect.block.horizRule( block, next ); - - if ( hr ) { - ret.push.apply(ret, hr); - break; - } - - // Make sure all listitems up the stack are paragraphs - forEach( stack, paragraphify, this); - - loose = true; - continue loose_search; - } - break; - } // loose_search - - return ret; - }; - })(), - - blockquote: function blockquote( block, next ) { - if ( !block.match( /^>/m ) ) - return undefined; - - var jsonml = []; - - // separate out the leading abutting block, if any. I.e. in this case: - // - // a - // > b - // - if ( block[ 0 ] !== ">" ) { - var lines = block.split( /\n/ ), - prev = [], - line_no = block.lineNumber; - - // keep shifting lines until you find a crotchet - while ( lines.length && lines[ 0 ][ 0 ] !== ">" ) { - prev.push( lines.shift() ); - line_no++; - } - - var abutting = mk_block( prev.join( "\n" ), "\n", block.lineNumber ); - jsonml.push.apply( jsonml, this.processBlock( abutting, [] ) ); - // reassemble new block of just block quotes! - block = mk_block( lines.join( "\n" ), block.trailing, line_no ); - } - - - // if the next block is also a blockquote merge it in - while ( next.length && next[ 0 ][ 0 ] === ">" ) { - var b = next.shift(); - block = mk_block( block + block.trailing + b, b.trailing, block.lineNumber ); - } - - // Strip off the leading "> " and re-process as a block. - var input = block.replace( /^> ?/gm, "" ), - old_tree = this.tree, - processedBlock = this.toTree( input, [ "blockquote" ] ), - attr = extract_attr( processedBlock ); - - // If any link references were found get rid of them - if ( attr && attr.references ) { - delete attr.references; - // And then remove the attribute object if it's empty - if ( isEmpty( attr ) ) - processedBlock.splice( 1, 1 ); - } - - jsonml.push( processedBlock ); - return jsonml; - }, - - referenceDefn: function referenceDefn( block, next) { - var re = /^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/; - // interesting matches are [ , ref_id, url, , title, title ] - - if ( !block.match(re) ) - return undefined; - - // make an attribute node if it doesn't exist - if ( !extract_attr( this.tree ) ) - this.tree.splice( 1, 0, {} ); - - var attrs = extract_attr( this.tree ); - - // make a references hash if it doesn't exist - if ( attrs.references === undefined ) - attrs.references = {}; - - var b = this.loop_re_over_block(re, block, function( m ) { - - if ( m[2] && m[2][0] === "<" && m[2][m[2].length-1] === ">" ) - m[2] = m[2].substring( 1, m[2].length - 1 ); - - var ref = attrs.references[ m[1].toLowerCase() ] = { - href: m[2] - }; - - if ( m[4] !== undefined ) - ref.title = m[4]; - else if ( m[5] !== undefined ) - ref.title = m[5]; - - } ); - - if ( b.length ) - next.unshift( mk_block( b, block.trailing ) ); - - return []; - }, - - para: function para( block ) { - // everything's a para! - return [ ["para"].concat( this.processInline( block ) ) ]; - } - }, - - inline: { - - __oneElement__: function oneElement( text, patterns_or_re, previous_nodes ) { - var m, - res; - - patterns_or_re = patterns_or_re || this.dialect.inline.__patterns__; - var re = new RegExp( "([\\s\\S]*?)(" + (patterns_or_re.source || patterns_or_re) + ")" ); - - m = re.exec( text ); - if (!m) { - // Just boring text - return [ text.length, text ]; - } - else if ( m[1] ) { - // Some un-interesting text matched. Return that first - return [ m[1].length, m[1] ]; - } - - var res; - if ( m[2] in this.dialect.inline ) { - res = this.dialect.inline[ m[2] ].call( - this, - text.substr( m.index ), m, previous_nodes || [] ); - } - // Default for now to make dev easier. just slurp special and output it. - res = res || [ m[2].length, m[2] ]; - return res; - }, - - __call__: function inline( text, patterns ) { - - var out = [], - res; - - function add(x) { - //D:self.debug(" adding output", uneval(x)); - if ( typeof x === "string" && typeof out[out.length-1] === "string" ) - out[ out.length-1 ] += x; - else - out.push(x); - } - - while ( text.length > 0 ) { - res = this.dialect.inline.__oneElement__.call(this, text, patterns, out ); - text = text.substr( res.shift() ); - forEach(res, add ); - } - - return out; - }, - - // These characters are intersting elsewhere, so have rules for them so that - // chunks of plain text blocks don't include them - "]": function () {}, - "}": function () {}, - - __escape__ : /^\\[\\`\*_{}\[\]()#\+.!\-]/, - - "\\": function escaped( text ) { - // [ length of input processed, node/children to add... ] - // Only esacape: \ ` * _ { } [ ] ( ) # * + - . ! - if ( this.dialect.inline.__escape__.exec( text ) ) - return [ 2, text.charAt( 1 ) ]; - else - // Not an esacpe - return [ 1, "\\" ]; - }, - - "![": function image( text ) { - - // Unlike images, alt text is plain text only. no other elements are - // allowed in there - - // ![Alt text](/path/to/img.jpg "Optional title") - // 1 2 3 4 <--- captures - var m = text.match( /^!\[(.*?)\][ \t]*\([ \t]*([^")]*?)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/ ); - - if ( m ) { - if ( m[2] && m[2][0] === "<" && m[2][m[2].length-1] === ">" ) - m[2] = m[2].substring( 1, m[2].length - 1 ); - - m[2] = this.dialect.inline.__call__.call( this, m[2], /\\/ )[0]; - - var attrs = { alt: m[1], href: m[2] || "" }; - if ( m[4] !== undefined) - attrs.title = m[4]; - - return [ m[0].length, [ "img", attrs ] ]; - } - - // ![Alt text][id] - m = text.match( /^!\[(.*?)\][ \t]*\[(.*?)\]/ ); - - if ( m ) { - // We can't check if the reference is known here as it likely wont be - // found till after. Check it in md tree->hmtl tree conversion - return [ m[0].length, [ "img_ref", { alt: m[1], ref: m[2].toLowerCase(), original: m[0] } ] ]; - } - - // Just consume the '![' - return [ 2, "![" ]; - }, - - "[": function link( text ) { - - var orig = String(text); - // Inline content is possible inside `link text` - var res = inline_until_char.call( this, text.substr(1), "]" ); - - // No closing ']' found. Just consume the [ - if ( !res ) - return [ 1, "[" ]; - - var consumed = 1 + res[ 0 ], - children = res[ 1 ], - link, - attrs; - - // At this point the first [...] has been parsed. See what follows to find - // out which kind of link we are (reference or direct url) - text = text.substr( consumed ); - - // [link text](/path/to/img.jpg "Optional title") - // 1 2 3 <--- captures - // This will capture up to the last paren in the block. We then pull - // back based on if there a matching ones in the url - // ([here](/url/(test)) - // The parens have to be balanced - var m = text.match( /^\s*\([ \t]*([^"']*)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/ ); - if ( m ) { - var url = m[1]; - consumed += m[0].length; - - if ( url && url[0] === "<" && url[url.length-1] === ">" ) - url = url.substring( 1, url.length - 1 ); - - // If there is a title we don't have to worry about parens in the url - if ( !m[3] ) { - var open_parens = 1; // One open that isn't in the capture - for ( var len = 0; len < url.length; len++ ) { - switch ( url[len] ) { - case "(": - open_parens++; - break; - case ")": - if ( --open_parens === 0) { - consumed -= url.length - len; - url = url.substring(0, len); - } - break; - } - } - } - - // Process escapes only - url = this.dialect.inline.__call__.call( this, url, /\\/ )[0]; - - attrs = { href: url || "" }; - if ( m[3] !== undefined) - attrs.title = m[3]; - - link = [ "link", attrs ].concat( children ); - return [ consumed, link ]; - } - - // [Alt text][id] - // [Alt text] [id] - m = text.match( /^\s*\[(.*?)\]/ ); - - if ( m ) { - - consumed += m[ 0 ].length; - - // [links][] uses links as its reference - attrs = { ref: ( m[ 1 ] || String(children) ).toLowerCase(), original: orig.substr( 0, consumed ) }; - - link = [ "link_ref", attrs ].concat( children ); - - // We can't check if the reference is known here as it likely wont be - // found till after. Check it in md tree->hmtl tree conversion. - // Store the original so that conversion can revert if the ref isn't found. - return [ consumed, link ]; - } - - // [id] - // Only if id is plain (no formatting.) - if ( children.length === 1 && typeof children[0] === "string" ) { - - attrs = { ref: children[0].toLowerCase(), original: orig.substr( 0, consumed ) }; - link = [ "link_ref", attrs, children[0] ]; - return [ consumed, link ]; - } - - // Just consume the "[" - return [ 1, "[" ]; - }, - - - "<": function autoLink( text ) { - var m; - - if ( ( m = text.match( /^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\.[a-zA-Z]+))>/ ) ) !== null ) { - if ( m[3] ) - return [ m[0].length, [ "link", { href: "mailto:" + m[3] }, m[3] ] ]; - else if ( m[2] === "mailto" ) - return [ m[0].length, [ "link", { href: m[1] }, m[1].substr("mailto:".length ) ] ]; - else - return [ m[0].length, [ "link", { href: m[1] }, m[1] ] ]; - } - - return [ 1, "<" ]; - }, - - "`": function inlineCode( text ) { - // Inline code block. as many backticks as you like to start it - // Always skip over the opening ticks. - var m = text.match( /(`+)(([\s\S]*?)\1)/ ); - - if ( m && m[2] ) - return [ m[1].length + m[2].length, [ "inlinecode", m[3] ] ]; - else { - // TODO: No matching end code found - warn! - return [ 1, "`" ]; - } - }, - - " \n": function lineBreak() { - return [ 3, [ "linebreak" ] ]; - } - - } - }; - - // Meta Helper/generator method for em and strong handling - function strong_em( tag, md ) { - - var state_slot = tag + "_state", - other_slot = tag === "strong" ? "em_state" : "strong_state"; - - function CloseTag(len) { - this.len_after = len; - this.name = "close_" + md; - } - - return function ( text ) { - - if ( this[state_slot][0] === md ) { - // Most recent em is of this type - //D:this.debug("closing", md); - this[state_slot].shift(); - - // "Consume" everything to go back to the recrusion in the else-block below - return[ text.length, new CloseTag(text.length-md.length) ]; - } - else { - // Store a clone of the em/strong states - var other = this[other_slot].slice(), - state = this[state_slot].slice(); - - this[state_slot].unshift(md); - - //D:this.debug_indent += " "; - - // Recurse - var res = this.processInline( text.substr( md.length ) ); - //D:this.debug_indent = this.debug_indent.substr(2); - - var last = res[res.length - 1]; - - //D:this.debug("processInline from", tag + ": ", uneval( res ) ); - - var check = this[state_slot].shift(); - if ( last instanceof CloseTag ) { - res.pop(); - // We matched! Huzzah. - var consumed = text.length - last.len_after; - return [ consumed, [ tag ].concat(res) ]; - } - else { - // Restore the state of the other kind. We might have mistakenly closed it. - this[other_slot] = other; - this[state_slot] = state; - - // We can't reuse the processed result as it could have wrong parsing contexts in it. - return [ md.length, md ]; - } - } - }; // End returned function - } - - Gruber.inline["**"] = strong_em("strong", "**"); - Gruber.inline["__"] = strong_em("strong", "__"); - Gruber.inline["*"] = strong_em("em", "*"); - Gruber.inline["_"] = strong_em("em", "_"); - - Markdown.dialects.Gruber = Gruber; - Markdown.buildBlockOrder ( Markdown.dialects.Gruber.block ); - Markdown.buildInlinePatterns( Markdown.dialects.Gruber.inline ); - - - - var Maruku = DialectHelpers.subclassDialect( Gruber ), - extract_attr = MarkdownHelpers.extract_attr, - forEach = MarkdownHelpers.forEach; - - Maruku.processMetaHash = function processMetaHash( meta_string ) { - var meta = split_meta_hash( meta_string ), - attr = {}; - - for ( var i = 0; i < meta.length; ++i ) { - // id: #foo - if ( /^#/.test( meta[ i ] ) ) - attr.id = meta[ i ].substring( 1 ); - // class: .foo - else if ( /^\./.test( meta[ i ] ) ) { - // if class already exists, append the new one - if ( attr["class"] ) - attr["class"] = attr["class"] + meta[ i ].replace( /./, " " ); - else - attr["class"] = meta[ i ].substring( 1 ); - } - // attribute: foo=bar - else if ( /\=/.test( meta[ i ] ) ) { - var s = meta[ i ].split( /\=/ ); - attr[ s[ 0 ] ] = s[ 1 ]; - } - } - - return attr; - }; - - function split_meta_hash( meta_string ) { - var meta = meta_string.split( "" ), - parts = [ "" ], - in_quotes = false; - - while ( meta.length ) { - var letter = meta.shift(); - switch ( letter ) { - case " " : - // if we're in a quoted section, keep it - if ( in_quotes ) - parts[ parts.length - 1 ] += letter; - // otherwise make a new part - else - parts.push( "" ); - break; - case "'" : - case '"' : - // reverse the quotes and move straight on - in_quotes = !in_quotes; - break; - case "\\" : - // shift off the next letter to be used straight away. - // it was escaped so we'll keep it whatever it is - letter = meta.shift(); - /* falls through */ - default : - parts[ parts.length - 1 ] += letter; - break; - } - } - - return parts; - } - - Maruku.block.document_meta = function document_meta( block ) { - // we're only interested in the first block - if ( block.lineNumber > 1 ) - return undefined; - - // document_meta blocks consist of one or more lines of `Key: Value\n` - if ( ! block.match( /^(?:\w+:.*\n)*\w+:.*$/ ) ) - return undefined; - - // make an attribute node if it doesn't exist - if ( !extract_attr( this.tree ) ) - this.tree.splice( 1, 0, {} ); - - var pairs = block.split( /\n/ ); - for ( var p in pairs ) { - var m = pairs[ p ].match( /(\w+):\s*(.*)$/ ), - key = m[ 1 ].toLowerCase(), - value = m[ 2 ]; - - this.tree[ 1 ][ key ] = value; - } - - // document_meta produces no content! - return []; - }; - - Maruku.block.block_meta = function block_meta( block ) { - // check if the last line of the block is an meta hash - var m = block.match( /(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/ ); - if ( !m ) - return undefined; - - // process the meta hash - var attr = this.dialect.processMetaHash( m[ 2 ] ), - hash; - - // if we matched ^ then we need to apply meta to the previous block - if ( m[ 1 ] === "" ) { - var node = this.tree[ this.tree.length - 1 ]; - hash = extract_attr( node ); - - // if the node is a string (rather than JsonML), bail - if ( typeof node === "string" ) - return undefined; - - // create the attribute hash if it doesn't exist - if ( !hash ) { - hash = {}; - node.splice( 1, 0, hash ); - } - - // add the attributes in - for ( var a in attr ) - hash[ a ] = attr[ a ]; - - // return nothing so the meta hash is removed - return []; - } - - // pull the meta hash off the block and process what's left - var b = block.replace( /\n.*$/, "" ), - result = this.processBlock( b, [] ); - - // get or make the attributes hash - hash = extract_attr( result[ 0 ] ); - if ( !hash ) { - hash = {}; - result[ 0 ].splice( 1, 0, hash ); - } - - // attach the attributes to the block - for ( var a in attr ) - hash[ a ] = attr[ a ]; - - return result; - }; - - Maruku.block.definition_list = function definition_list( block, next ) { - // one or more terms followed by one or more definitions, in a single block - var tight = /^((?:[^\s:].*\n)+):\s+([\s\S]+)$/, - list = [ "dl" ], - i, m; - - // see if we're dealing with a tight or loose block - if ( ( m = block.match( tight ) ) ) { - // pull subsequent tight DL blocks out of `next` - var blocks = [ block ]; - while ( next.length && tight.exec( next[ 0 ] ) ) - blocks.push( next.shift() ); - - for ( var b = 0; b < blocks.length; ++b ) { - var m = blocks[ b ].match( tight ), - terms = m[ 1 ].replace( /\n$/, "" ).split( /\n/ ), - defns = m[ 2 ].split( /\n:\s+/ ); - - // print( uneval( m ) ); - - for ( i = 0; i < terms.length; ++i ) - list.push( [ "dt", terms[ i ] ] ); - - for ( i = 0; i < defns.length; ++i ) { - // run inline processing over the definition - list.push( [ "dd" ].concat( this.processInline( defns[ i ].replace( /(\n)\s+/, "$1" ) ) ) ); - } - } - } - else { - return undefined; - } - - return [ list ]; - }; - - // splits on unescaped instances of @ch. If @ch is not a character the result - // can be unpredictable - - Maruku.block.table = function table ( block ) { - - var _split_on_unescaped = function( s, ch ) { - ch = ch || '\\s'; - if ( ch.match(/^[\\|\[\]{}?*.+^$]$/) ) - ch = '\\' + ch; - var res = [ ], - r = new RegExp('^((?:\\\\.|[^\\\\' + ch + '])*)' + ch + '(.*)'), - m; - while ( ( m = s.match( r ) ) ) { - res.push( m[1] ); - s = m[2]; - } - res.push(s); - return res; - }; - - var leading_pipe = /^ {0,3}\|(.+)\n {0,3}\|\s*([\-:]+[\-| :]*)\n((?:\s*\|.*(?:\n|$))*)(?=\n|$)/, - // find at least an unescaped pipe in each line - no_leading_pipe = /^ {0,3}(\S(?:\\.|[^\\|])*\|.*)\n {0,3}([\-:]+\s*\|[\-| :]*)\n((?:(?:\\.|[^\\|])*\|.*(?:\n|$))*)(?=\n|$)/, - i, - m; - if ( ( m = block.match( leading_pipe ) ) ) { - // remove leading pipes in contents - // (header and horizontal rule already have the leading pipe left out) - m[3] = m[3].replace(/^\s*\|/gm, ''); - } else if ( ! ( m = block.match( no_leading_pipe ) ) ) { - return undefined; - } - - var table = [ "table", [ "thead", [ "tr" ] ], [ "tbody" ] ]; - - // remove trailing pipes, then split on pipes - // (no escaped pipes are allowed in horizontal rule) - m[2] = m[2].replace(/\|\s*$/, '').split('|'); - - // process alignment - var html_attrs = [ ]; - forEach (m[2], function (s) { - if (s.match(/^\s*-+:\s*$/)) - html_attrs.push({align: "right"}); - else if (s.match(/^\s*:-+\s*$/)) - html_attrs.push({align: "left"}); - else if (s.match(/^\s*:-+:\s*$/)) - html_attrs.push({align: "center"}); - else - html_attrs.push({}); - }); - - // now for the header, avoid escaped pipes - m[1] = _split_on_unescaped(m[1].replace(/\|\s*$/, ''), '|'); - for (i = 0; i < m[1].length; i++) { - table[1][1].push(['th', html_attrs[i] || {}].concat( - this.processInline(m[1][i].trim()))); - } - - // now for body contents - forEach (m[3].replace(/\|\s*$/mg, '').split('\n'), function (row) { - var html_row = ['tr']; - row = _split_on_unescaped(row, '|'); - for (i = 0; i < row.length; i++) - html_row.push(['td', html_attrs[i] || {}].concat(this.processInline(row[i].trim()))); - table[2].push(html_row); - }, this); - - return [table]; - }; - - Maruku.inline[ "{:" ] = function inline_meta( text, matches, out ) { - if ( !out.length ) - return [ 2, "{:" ]; - - // get the preceeding element - var before = out[ out.length - 1 ]; - - if ( typeof before === "string" ) - return [ 2, "{:" ]; - - // match a meta hash - var m = text.match( /^\{:\s*((?:\\\}|[^\}])*)\s*\}/ ); - - // no match, false alarm - if ( !m ) - return [ 2, "{:" ]; - - // attach the attributes to the preceeding element - var meta = this.dialect.processMetaHash( m[ 1 ] ), - attr = extract_attr( before ); - - if ( !attr ) { - attr = {}; - before.splice( 1, 0, attr ); - } - - for ( var k in meta ) - attr[ k ] = meta[ k ]; - - // cut out the string and replace it with nothing - return [ m[ 0 ].length, "" ]; - }; - - - Markdown.dialects.Maruku = Maruku; - Markdown.dialects.Maruku.inline.__escape__ = /^\\[\\`\*_{}\[\]()#\+.!\-|:]/; - Markdown.buildBlockOrder ( Markdown.dialects.Maruku.block ); - Markdown.buildInlinePatterns( Markdown.dialects.Maruku.inline ); - - -// Include all our depndencies and; - expose.Markdown = Markdown; - expose.parse = Markdown.parse; - expose.toHTML = Markdown.toHTML; - expose.toHTMLTree = Markdown.toHTMLTree; - expose.renderJsonML = Markdown.renderJsonML; - -})(exports); diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/about.html b/ace-blog-parent/ace-blog-ui/src/main/resources/templates/about.html deleted file mode 100644 index 86449dae225583f27bc88b2aa3fe0b6fffd07123..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/about.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - - - - - - 不落阁 - 关于本站 - - - - - - - - - - - - - - -
            -
            -
            - 网站首页 - 关于本站 -
            -
            -
            -
              -
            • 关于博客
            • -
            • 关于作者
            • - -
            • 留言墙
            • -
            -
            -
            -
            -
            - 不落阁 -
            -

            不落阁

            -

            一个.NET程序员的个人博客,记录博主学习和成长之路,分享.NET方面技术和源码

            -

              www.lyblogs.cn

            -
            -
            - - - - -
            - -
            - 简介 -
            -

            不落阁是一个由ASP.NET MVC开发的个人博客网站,诞生于2016年11月7日,起劲为止经历了一次大改,暂且称为不落阁2.0。

            -

            第一个版本

            -

            诞生的版本,采用ASP.NET MVC + Entity Framework作为后台框架,前端几乎自己手写,用了Bootstrap的栅格系统来布局!起初并没有注意美工,只打算完成基本的功能,故视觉体验是比较差的。

            -

            第二个版本

            -

            由于感觉EF查询数据的时候较慢(后来发现是自己搞错了),于是自己写了个ORM,其实也算不上ORM,就是将ADO.NET进行封装,再封装,再利用反射将数据库表与实体类一一对应,有了基本的增删改查、事务、自动建表等功能,同时为了配合这个ORM,将项目改成三层,前端方面加入了Animate.css的动画效果,同时自己手写了几个动画,并制作了浅色于深色两种主题的样式,视觉体验稍有提高。

            -

            当前版本

            -

            从公司的一个后台管理系统的前端发现了Layer弹窗插件,于是追根溯源,发现了Layui前端框架!Layui简洁的风格让我很是喜欢,于是决定再次将网站改版!此次改版从里到外几乎全部更新。后台增加了面向接口开发,使用了IOC框架,同时ORM回归到Entity Framework,前端则移除Bootstarp,引入Layui。视觉体验显著提高。

            -

            The End

            -
            -
            -
            -
            -
            -
            -
            - Absolutely -
            -

            Absolutely

            -

            一枚90后程序员,.NET开发工程师,主攻B/S架构,略懂Web前端

            -

             四川 - 成都

            -
            -
            - - - - -
            -
            - 简介 -
            -

            Absolutely,不落阁创始人,诞生于1996年2月14日,目前是一个码农,从事.NET开发。

            -

            个人信息

            -

            暂无

            -

            个人介绍

            -

            一个没有故事的男同学,没什么介绍......

            -

            The End

            -
            -
            -
            -
            -
            -
            -
            - 友情链接 -
            -

            友情链接

            -

            Name:不落阁    Site:www.lyblogs.cn

            -

            - 经常宕机  - 不合法规  - 插边球站  - 红标报毒  - 原创优先  - 技术优先 -

            -
            -
            -

            互换友链,携手并进!

            -
            -
            - Friend Link - -
            -
            -
            -
            -
            -
            - 留言墙 -
            -

            留言墙

            -

            本页面可留言、吐槽、提问。欢迎灌水,杜绝广告!

            -

            -   -

            -
            -
            -

            沟通交流,拉近你我!

            -
            -
            - Leave a message -
            -
            -
            -
            - -
            -
            - -
            -
            -
              -
            • -
              - 不落阁 -
              - 不落阁 -
              -
              - 我为大家做了模拟留言与回复!试试吧! -
              - -
              -
              -
              - Absolutely -
              - Absolutely这是用户回复内容 -
              -

              2017-03-18 18:26

              -
              -
              - Absolutely -
              - Absolutely这是第二个用户回复内容 -
              -

              2017-03-18 18:26

              -
              - -
              -
              -
              - -
              -
              - -
              -
              -
              -
            • -
            -
            -
            -
            -
            -
            -
            -
            -
            -
            -
            - - - - - -
            -
            -
            -
            - - - - -
            -
            -
            -
            - -
            - - - - - - - - \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/article.html b/ace-blog-parent/ace-blog-ui/src/main/resources/templates/article.html deleted file mode 100644 index 04bff77b630c64bfa1c72e9416a7395aed3fafb7..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/article.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - - AG-BLOG - - - - - - - - - - - - - - -
            -
            -
            - 网站首页 - 文章专栏 -
            -
            -
            -
            - 未搜索到与【keywords】有关的文章,随便看看吧! -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            - 该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用! -
            -
            -
            - -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            - 该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用! -
            -
            -
            - -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            - 该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用! -
            -
            -
            - -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            - 该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用! -
            -
            -
            - -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            - 该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用! -
            -
            -
            - -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            -
            - 基于laypage的layui扩展模块(pagesize.js)! -
            -
            - 该模块主要是针对当前版本laypage没有页容量控制功能而制作,使用该模块后即可实现每页显示多少条数据的控制!本人原创,但是可能有可能只对本人的分页写法有用! -
            -
            -
            - -
            -
            - -
            -
            -
            -
            - - - - - -
            -
            -
            -
            - - - - -
            -
            -
            -
            - -
            - - - - - - \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/detail.html b/ace-blog-parent/ace-blog-ui/src/main/resources/templates/detail.html deleted file mode 100644 index e908b22df5743d83d1e25f117fc816c628f2f9c1..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/detail.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - Mr.AG - - - - - - - - - - - - - - - - - - - -
            -
            -
            - 网站首页 - 文章专栏 - 基于layui的laypage扩展模块! -
            -
            - - -
            - -
            - - -
            -
            - 来说两句吧 -
            -
            -
            - -
            -
            - -
            -
            -
            -
            -
            最新评论
            -
              -
            • -
              - absolutely -
              - Absolutely - 2017-03-18 18:46:06 -
              -
              - 我为大家做了模拟评论功能!还有,这个评论功能也可以改成和留言一样,但是目前没改,有兴趣可以自己改 -
              -
              -
            • -
            -
            - - -
            -
            -
            -
            - - - - - -
            -
            -
            -
            - - - - -
            -
            -
            -
            - -
            - - - - - - - - - - - - - \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/home.html b/ace-blog-parent/ace-blog-ui/src/main/resources/templates/home.html deleted file mode 100644 index 245a83e2d29d63cd0ad42941a0f1db80d7c13b71..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/home.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - - - AG-Blog - - - - - - - - - - - - - - -
            - -
            -
            - -
            - -
            - 偷偷告诉大家,本博客的后台管理也正在制作,为大家准备了游客专用账号! - 网站新增留言回复啦!使用QQ登陆即可回复,人人都可以回复! - 如果你觉得网站做得还不错,来Fly社区点个赞吧!点我前往 - 不落阁  ——  一个.NET程序员的个人博客,新版网站采用Layui为前端框架,目前正在建设中! -
            -
            - -
            -
            -
            -
            -
            -
            -
            - -
            -
            -
            - Absolutely -
            -

            Ace

            -

            一枚90后微服务架构师

            -

             广东 - 广州

            -
            -
            - - - - -
            -
            -
            - -
            -
            最近分享
            - -
            -
            -
            一路走来
            -
            -
            2017年03月12日
            -
            新增留言回复功能!人人都可参与回复!
            -
            2017年03月10日
            -
            不落阁2.0基本功能完成,正式上线!
            -
            2017年03月09日
            -
            新增文章搜索功能!
            -
            2017年02月25日
            -
            QQ互联接入网站,可QQ登陆发表评论与留言!
            -
            -
            -
            -
            后台记录
            -
            -
            2017年03月16日
            -
            分页新增页容量控制
            -
            2017年03月12日
            -
            新增管家提醒功能
            -
            2017年03月10日
            -
            新增Win10快捷菜单
            -
            -
            -
            -
            友情链接
            - -
            -
            -
            -
            -
            -
            - - - - - -
            -
            -
            -
            - - - - -
            -
            -
            -
            - -
            - - - - - - - - - - \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/resource.html b/ace-blog-parent/ace-blog-ui/src/main/resources/templates/resource.html deleted file mode 100644 index fa3c56c48d77337c5905fdb4434c3c884f96f92f..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/resource.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - - - - 不落阁 - 资源分享 - - - - - - - - - - - - - - -
            -
            -
            - 网站首页 - 资源分享 -
            -
            -
            -
            - 全部 - 源码 - 工具 - 电子书 -
            -
            -
            -
            - - 时光轴 - -
            -

            时光轴

            -

            本博客使用的时光轴的源码,手工打造!

            -
            -  源码 - Absolutely -
            -
            - -
            -
            -
            - - 时光轴 - -
            -

            时光轴

            -

            本博客使用的时光轴的源码,手工打造!

            -
            -  源码 - Absolutely -
            -
            - -
            -
            -
            - - 时光轴 - -
            -

            时光轴

            -

            本博客使用的时光轴的源码,手工打造!

            -
            -  源码 - Absolutely -
            -
            - -
            -
            -
            - - 时光轴 - -
            -

            时光轴

            -

            本博客使用的时光轴的源码,手工打造!

            -
            -  源码 - Absolutely -
            -
            - -
            -
            -
            - - 时光轴 - -
            -

            时光轴

            -

            本博客使用的时光轴的源码,手工打造!

            -
            -  源码 - Absolutely -
            -
            - -
            - -
            -
            -
            -
            -
            -
            - - - - - -
            -
            -
            -
            - - - - -
            -
            -
            -
            - -
            - - - - - - \ No newline at end of file diff --git a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/timeline.html b/ace-blog-parent/ace-blog-ui/src/main/resources/templates/timeline.html deleted file mode 100644 index 01ce93541fab867e061999a1b676537dbcae3ca6..0000000000000000000000000000000000000000 --- a/ace-blog-parent/ace-blog-ui/src/main/resources/templates/timeline.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - - 不落阁 - 点点滴滴 - 时光轴 - - - - - - - - - - - - - - - - -
            -
            -
            - 网站首页 - 点点滴滴 - 时光轴 -
            -
            -
            - 时光轴 - 笔记墙 -
            -
            -
            -

            时光轴 —— 记录生活点点滴滴

            -
            -
            -

            2017年

            -
            -

            2月

            -
              -
            • -
              -

              02月23日 19:33

              -
              -

              -
              该时光轴支持手机平板PC,但并不能兼容一些老的浏览器!
              -
              -
            • -
            • -
              -

              02月11日 20:29

              -
              -

              -
              这是2017年2月发表的
              -
              -
            • -
            • -
              -

              02月10日 20:35

              -
              -

              -
              这是2017年2月发表的
              -
              -
            • -
            -
            -
            -

            1月

            -
              -
            • -
              -

              01月23日 19:33

              -
              -

              -
              这是2017年1月发表的
              -
              -
            • -
            • -
              -

              01月11日 20:29

              -
              -

              -
              这是2017年1月发表的
              -
              -
            • -
            • -
              -

              01月10日 20:35

              -
              -

              -
              这是2017年1月发表的
              -
              -
            • -
            -
            -
            -
            -

            2016年

            -
            -

            2月

            -
              -
            • -
              -

              02月23日 19:33

              -
              -

              -
              这是2016年2月发表的
              -
              -
            • -
            • -
              -

              02月11日 20:29

              -
              -

              -
              这是2016年2月发表的
              -
              -
            • -
            • -
              -

              02月10日 20:35

              -
              -

              -
              这是2016年2月发表的
              -
              -
            • -
            -
            -
            -

            1月

            -
              -
            • -
              -

              01月23日 19:33

              -
              -

              -
              这是2016年1月发表的
              -
              -
            • -
            • -
              -

              01月11日 20:29

              -
              -

              -
              这是2016年1月发表的
              -
              -
            • -
            • -
              -

              01月10日 20:35

              -
              -

              -
              这是2016年1月发表的
              -
              -
            • -
            -
            -
            -

            THE END

            -
            -
            -
            -
            -
            - - - - - -
            -
            -
            -
            - - - - -
            -
            -
            -
            - -
            - - - - - - - - \ No newline at end of file diff --git a/ace-blog-parent/pom.xml b/ace-blog-parent/pom.xml deleted file mode 100644 index 9cff14187c1652a998f13ca92727cab264b48507..0000000000000000000000000000000000000000 --- a/ace-blog-parent/pom.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - org.springframework.boot - spring-boot-starter-parent - 1.4.2.RELEASE - - 4.0.0 - pom - - ace-blog-ui - ace-blog-admin - - ace-blog-parent - - - ace - 463540703@qq.com - - - - - - org.projectlombok - lombok - 1.16.14 - provided - - - - - - org.springframework.cloud - spring-cloud-dependencies - Camden.SR3 - pom - import - - - - \ No newline at end of file diff --git a/ace-center/pom.xml b/ace-center/pom.xml index 16b5c72f81a3c832fbae5113279408ba33f235a5..c79019da51405e19370cd40f9fce3b991b220c10 100644 --- a/ace-center/pom.xml +++ b/ace-center/pom.xml @@ -5,7 +5,7 @@ ace-security com.github.wxiaoqi - 1.0-SNAPSHOT + 2.0-SNAPSHOT 4.0.0 @@ -14,24 +14,14 @@ 1.5.12 - org.springframework.cloud - spring-cloud-starter-eureka-server + spring-cloud-netflix-eureka-server - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.boot - spring-boot-starter-test - test + org.springframework.cloud + spring-cloud-starter @@ -41,30 +31,30 @@ org.springframework.boot spring-boot-maven-plugin - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - - package - - build - - - - - ${docker.image.prefix}/${project.artifactId} - ${project.basedir}/src/main/docker - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ace-center/src/main/java/com/github/wxiaoqi/security/center/CenterBootstrap.java b/ace-center/src/main/java/com/github/wxiaoqi/security/center/CenterBootstrap.java index e9c32bbc7916f7f49b9281e8e76670b2da922b0a..e6d22253d635d17bcd030ceeb2e06ac074c1da11 100644 --- a/ace-center/src/main/java/com/github/wxiaoqi/security/center/CenterBootstrap.java +++ b/ace-center/src/main/java/com/github/wxiaoqi/security/center/CenterBootstrap.java @@ -3,7 +3,6 @@ package com.github.wxiaoqi.security.center; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; -import org.springframework.cloud.netflix.zuul.EnableZuulProxy; /** * ${DESCRIPTION} diff --git a/ace-common/pom.xml b/ace-common/pom.xml index 8958da1ac2cf15da3f5e448aac1bcf9c728ef328..921bbee0d5f4df0fd2feee5c0e8bb8f55cb1a327 100644 --- a/ace-common/pom.xml +++ b/ace-common/pom.xml @@ -5,60 +5,82 @@ ace-security com.github.wxiaoqi - 1.0-SNAPSHOT + 2.0-SNAPSHOT 4.0.0 ace-common + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + 3.4.0 - org.springframework.boot - spring-boot-starter + org.apache.commons + commons-lang3 + 3.3.2 + - org.springframework - spring-webmvc - 4.3.4.RELEASE + org.apache.commons + commons-io + 1.3.2 + tk.mybatis mapper - ${mapper.version} + 3.4.0 - javax.servlet - javax.servlet-api - 3.1.0 + org.springframework + spring-beans + 4.3.4.RELEASE - javax.servlet - javax.servlet-api - 3.1.0 + com.github.pagehelper + pagehelper + 5.0.3 + org.springframework - spring-webmvc - 4.1.3.RELEASE + spring-web + 4.3.9.RELEASE + + - org.apache.commons - commons-lang3 - 3.3.2 + org.springframework.boot + spring-boot-starter-test - org.apache.commons - commons-io - 1.3.2 + io.jsonwebtoken + jjwt + 0.7.0 + + + joda-time + joda-time + 2.9.5 + + + javax.servlet + javax.servlet-api + 3.1.0 - - - - - diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/bean/Page.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/bean/Page.java deleted file mode 100644 index 35e94861e8699fce8b6739ae223a9a4a7102061b..0000000000000000000000000000000000000000 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/bean/Page.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.wxiaoqi.security.common.bean; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-08 17:31 - */ -public class Page { - int num; - int size; - - public int getNum() { - return num; - } - - public void setNum(int num) { - this.num = num; - } - - public int getSize() { - return size; - } - - public void setSize(int size) { - this.size = size; - } -} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/biz/BaseBiz.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/biz/BaseBiz.java index 7b15a2deee1b1350e3bec8a4592d9bbe30b9a309..41ee53196ca160ccd22bfd0516092550c315fb30 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/biz/BaseBiz.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/biz/BaseBiz.java @@ -1,15 +1,20 @@ package com.github.wxiaoqi.security.common.biz; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.github.wxiaoqi.security.common.msg.TableResultResponse; import com.github.wxiaoqi.security.common.util.EntityUtils; +import com.github.wxiaoqi.security.common.util.Query; import org.springframework.beans.factory.annotation.Autowired; import tk.mybatis.mapper.common.Mapper; -import tk.mybatis.mapper.common.example.SelectByExampleMapper; -import tk.mybatis.mapper.common.example.SelectCountByExampleMapper; +import tk.mybatis.mapper.entity.Example; +import java.lang.reflect.ParameterizedType; import java.util.List; +import java.util.Map; /** - * Created by zhw + * Created by Mr.AG * Date: 17/1/13 * Time: 15:13 * Version 1.0.0 @@ -17,7 +22,8 @@ import java.util.List; public abstract class BaseBiz, T> { @Autowired protected M mapper; - public void setMapper(M mapper){ + + public void setMapper(M mapper) { this.mapper = mapper; } @@ -31,11 +37,6 @@ public abstract class BaseBiz, T> { } -// public List selectListByIds(List ids) { -// return mapper.selectByIds(ids); -// } - - public List selectList(T entity) { return mapper.select(entity); } @@ -46,11 +47,6 @@ public abstract class BaseBiz, T> { } -// public Long selectCountAll() { -// return mapper.selectCount(null); -// } - - public Long selectCount(T entity) { return new Long(mapper.selectCount(entity)); } @@ -63,7 +59,7 @@ public abstract class BaseBiz, T> { public void insertSelective(T entity) { - EntityUtils.setCreateInfo(entity); + EntityUtils.setCreatAndUpdatInfo(entity); mapper.insertSelective(entity); } @@ -89,19 +85,27 @@ public abstract class BaseBiz, T> { mapper.updateByPrimaryKeySelective(entity); } - public List selectByExample(Object example){ + + public List selectByExample(Object example) { return mapper.selectByExample(example); } - public int selectCountByExample(Object example){ + + public int selectCountByExample(Object example) { return mapper.selectCountByExample(example); } -// public void deleteBatchByIds(List ids) { -// mapper.batchDeleteByIds(ids); -// } - -// public void updateBatch(List entitys) { -// mapper.batchUpdate(entitys); -// } + public TableResultResponse selectByQuery(Query query) { + Class clazz = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1]; + Example example = new Example(clazz); + if(query.entrySet().size()>0) { + Example.Criteria criteria = example.createCriteria(); + for (Map.Entry entry : query.entrySet()) { + criteria.andLike(entry.getKey(), "%" + entry.getValue().toString() + "%"); + } + } + Page result = PageHelper.startPage(query.getPage(), query.getLimit()); + List list = mapper.selectByExample(example); + return new TableResultResponse(result.getTotal(), list); + } } diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/constant/CommonConstants.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/constant/CommonConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..f15787201c731cd43bad8d4ba7968289982a82d3 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/constant/CommonConstants.java @@ -0,0 +1,21 @@ +package com.github.wxiaoqi.security.common.constant; + +/** + * Created by ace on 2017/8/29. + */ +public class CommonConstants { + public final static String RESOURCE_TYPE_MENU = "menu"; + public final static String RESOURCE_TYPE_BTN = "button"; + // 用户token异常 + public static final Integer EX_USER_INVALID_CODE = 40101; + // 客户端token异常 + public static final Integer EX_CLIENT_INVALID_CODE = 40301; + public static final Integer EX_CLIENT_FORBIDDEN_CODE = 40331; + public static final Integer EX_OTHER_CODE = 500; + public static final String CONTEXT_KEY_USER_ID = "currentUserId"; + public static final String CONTEXT_KEY_USERNAME = "currentUserName"; + public static final String CONTEXT_KEY_USER_NAME = "currentUser"; + public static final String CONTEXT_KEY_USER_TOKEN = "currentUserToken"; + public static final String JWT_KEY_USER_ID = "userId"; + public static final String JWT_KEY_NAME = "name"; +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/constant/RestCodeConstants.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/constant/RestCodeConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..4889d0e079926584f84aa9b05e856b0c4b7ba08f --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/constant/RestCodeConstants.java @@ -0,0 +1,10 @@ +package com.github.wxiaoqi.security.common.constant; + +/** + * Created by ace on 2017/8/23. + */ +public class RestCodeConstants { + + public static final int TOKEN_ERROR_CODE = 40101; + public static final int TOKEN_FORBIDDEN_CODE = 40301; +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/context/BaseContextHandler.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/context/BaseContextHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..59efa476dfbe34bb6c0d930edbafc8977524732b --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/context/BaseContextHandler.java @@ -0,0 +1,117 @@ +package com.github.wxiaoqi.security.common.context; + +import com.github.wxiaoqi.security.common.constant.CommonConstants; +import com.github.wxiaoqi.security.common.util.StringHelper; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +/** + * Created by ace on 2017/9/8. + */ +public class BaseContextHandler { + public static ThreadLocal> threadLocal = new ThreadLocal>(); + + public static void set(String key, Object value) { + Map map = threadLocal.get(); + if (map == null) { + map = new HashMap(); + threadLocal.set(map); + } + map.put(key, value); + } + + public static Object get(String key){ + Map map = threadLocal.get(); + if (map == null) { + map = new HashMap(); + threadLocal.set(map); + } + return map.get(key); + } + + public static String getUserID(){ + Object value = get(CommonConstants.CONTEXT_KEY_USER_ID); + return returnObjectValue(value); + } + + public static String getUsername(){ + Object value = get(CommonConstants.CONTEXT_KEY_USERNAME); + return returnObjectValue(value); + } + + + public static String getName(){ + Object value = get(CommonConstants.CONTEXT_KEY_USER_NAME); + return StringHelper.getObjectValue(value); + } + + public static String getToken(){ + Object value = get(CommonConstants.CONTEXT_KEY_USER_TOKEN); + return StringHelper.getObjectValue(value); + } + public static void setToken(String token){set(CommonConstants.CONTEXT_KEY_USER_TOKEN,token);} + + public static void setName(String name){set(CommonConstants.CONTEXT_KEY_USER_NAME,name);} + + public static void setUserID(String userID){ + set(CommonConstants.CONTEXT_KEY_USER_ID,userID); + } + + public static void setUsername(String username){ + set(CommonConstants.CONTEXT_KEY_USERNAME,username); + } + + private static String returnObjectValue(Object value) { + return value==null?null:value.toString(); + } + + public static void remove(){ + threadLocal.remove(); + } + + @RunWith(MockitoJUnitRunner.class) + public static class UnitTest { + private Logger logger = LoggerFactory.getLogger(UnitTest.class); + + @Test + public void testSetContextVariable() throws InterruptedException { + BaseContextHandler.set("test", "main"); + new Thread(()->{ + BaseContextHandler.set("test", "moo"); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + assertEquals(BaseContextHandler.get("test"), "moo"); + logger.info("thread one done!"); + }).start(); + new Thread(()->{ + BaseContextHandler.set("test", "moo2"); + assertEquals(BaseContextHandler.get("test"), "moo2"); + logger.info("thread two done!"); + }).start(); + + Thread.sleep(5000); + assertEquals(BaseContextHandler.get("test"), "main"); + logger.info("main one done!"); + } + + @Test + public void testSetUserInfo(){ + BaseContextHandler.setUserID("test"); + assertEquals(BaseContextHandler.getUserID(), "test"); + BaseContextHandler.setUsername("test2"); + assertEquals(BaseContextHandler.getUsername(), "test2"); + } + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/BaseException.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/BaseException.java new file mode 100644 index 0000000000000000000000000000000000000000..206b0a456015b763689e80e976e3aea53c250508 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/BaseException.java @@ -0,0 +1,40 @@ +package com.github.wxiaoqi.security.common.exception; + +/** + * Created by ace on 2017/9/8. + */ +public class BaseException extends RuntimeException { + private int status = 200; + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public BaseException() { + } + + public BaseException(String message,int status) { + super(message); + this.status = status; + } + + public BaseException(String message) { + super(message); + } + + public BaseException(String message, Throwable cause) { + super(message, cause); + } + + public BaseException(Throwable cause) { + super(cause); + } + + public BaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientForbiddenException.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientForbiddenException.java new file mode 100644 index 0000000000000000000000000000000000000000..d973284cf9d1ee1478177ec128afdd9b0e56a2c0 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientForbiddenException.java @@ -0,0 +1,15 @@ +package com.github.wxiaoqi.security.common.exception.auth; + + +import com.github.wxiaoqi.security.common.constant.CommonConstants; +import com.github.wxiaoqi.security.common.exception.BaseException; + +/** + * Created by ace on 2017/9/12. + */ +public class ClientForbiddenException extends BaseException { + public ClientForbiddenException(String message) { + super(message, CommonConstants.EX_CLIENT_FORBIDDEN_CODE); + } + +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientInvalidException.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientInvalidException.java new file mode 100644 index 0000000000000000000000000000000000000000..8cc0b56e578146d20221b274c68f63c7172ad60a --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientInvalidException.java @@ -0,0 +1,14 @@ +package com.github.wxiaoqi.security.common.exception.auth; + + +import com.github.wxiaoqi.security.common.constant.CommonConstants; +import com.github.wxiaoqi.security.common.exception.BaseException; + +/** + * Created by ace on 2017/9/10. + */ +public class ClientInvalidException extends BaseException { + public ClientInvalidException(String message) { + super(message, CommonConstants.EX_CLIENT_INVALID_CODE); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientTokenException.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientTokenException.java new file mode 100644 index 0000000000000000000000000000000000000000..a4915ddb31f830cd65186f7f1de600cd15ef13cf --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/ClientTokenException.java @@ -0,0 +1,14 @@ +package com.github.wxiaoqi.security.common.exception.auth; + + +import com.github.wxiaoqi.security.common.constant.CommonConstants; +import com.github.wxiaoqi.security.common.exception.BaseException; + +/** + * Created by ace on 2017/9/10. + */ +public class ClientTokenException extends BaseException { + public ClientTokenException(String message) { + super(message, CommonConstants.EX_CLIENT_INVALID_CODE); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/UserTokenException.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/UserTokenException.java new file mode 100644 index 0000000000000000000000000000000000000000..a2c6cf3dd5d9ec395773b04e2f1308290a16c5c8 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/exception/auth/UserTokenException.java @@ -0,0 +1,14 @@ +package com.github.wxiaoqi.security.common.exception.auth; + + +import com.github.wxiaoqi.security.common.constant.CommonConstants; +import com.github.wxiaoqi.security.common.exception.BaseException; + +/** + * Created by ace on 2017/9/8. + */ +public class UserTokenException extends BaseException { + public UserTokenException(String message) { + super(message, CommonConstants.EX_USER_INVALID_CODE); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/handler/GlobalExceptionHandler.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..330033b7bdaf349ce71af3376b8c4e8766ac5b53 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/handler/GlobalExceptionHandler.java @@ -0,0 +1,50 @@ +package com.github.wxiaoqi.security.common.handler; + +import com.github.wxiaoqi.security.common.constant.CommonConstants; +import com.github.wxiaoqi.security.common.exception.BaseException; +import com.github.wxiaoqi.security.common.exception.auth.ClientTokenException; +import com.github.wxiaoqi.security.common.exception.auth.UserTokenException; +import com.github.wxiaoqi.security.common.msg.BaseResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletResponse; + +/** + * Created by ace on 2017/9/8. + */ +@ControllerAdvice("com.github.wxiaoqi.security") +@ResponseBody +public class GlobalExceptionHandler { + private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); + @ExceptionHandler(BaseException.class) + public BaseResponse baseExceptionHandler(HttpServletResponse response, BaseException ex) { + logger.error(ex.getMessage(),ex); + response.setStatus(500); + return new BaseResponse(ex.getStatus(), ex.getMessage()); + } + + @ExceptionHandler(Exception.class) + public BaseResponse otherExceptionHandler(HttpServletResponse response, Exception ex) { + response.setStatus(500); + logger.error(ex.getMessage(),ex); + return new BaseResponse(CommonConstants.EX_OTHER_CODE, ex.getMessage()); + } + + @ExceptionHandler(ClientTokenException.class) + public BaseResponse clientTokenExceptionHandler(HttpServletResponse response, ClientTokenException ex) { + response.setStatus(403); + logger.error(ex.getMessage(),ex); + return new BaseResponse(ex.getStatus(), ex.getMessage()); + } + + @ExceptionHandler(UserTokenException.class) + public BaseResponse userTokenExceptionHandler(HttpServletResponse response, UserTokenException ex) { + response.setStatus(401); + logger.error(ex.getMessage(),ex); + return new BaseResponse(ex.getStatus(), ex.getMessage()); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/BaseResponse.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/BaseResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..27643b51de03545ebbfdf80b6a045545327d7428 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/BaseResponse.java @@ -0,0 +1,35 @@ +package com.github.wxiaoqi.security.common.msg; + +/** + * Created by ace on 2017/8/23. + */ +public class BaseResponse { + private int status = 200; + private String message; + + public BaseResponse(int status, String message) { + this.status = status; + this.message = message; + } + + public BaseResponse() { + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java index d8f542598942dd165b02b719d477b46600c67490..07fc3c4cff4bf41e05bfa0ec4d4c09d151783a2c 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java @@ -7,27 +7,11 @@ package com.github.wxiaoqi.security.common.msg; * @create 2017-06-09 7:32 */ public class ListRestResponse { - boolean rel; String msg; T result; int count; - String callback; - public String getCallback() { - return callback; - } - public void setCallback(String callback) { - this.callback = callback; - } - - public boolean isRel() { - return rel; - } - - public void setRel(boolean rel) { - this.rel = rel; - } public String getMsg() { return msg; @@ -63,11 +47,6 @@ public class ListRestResponse { return this; } - public ListRestResponse rel(boolean rel) { - this.setRel(rel); - return this; - } - public ListRestResponse msg(String msg) { this.setMsg(msg); return this; diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ObjectRestResponse.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ObjectRestResponse.java index b37650d4e6e7258150517bd129df6ce46bd27832..8402985ae0e80d5a9009accbafff4376d739aa58 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ObjectRestResponse.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ObjectRestResponse.java @@ -3,10 +3,10 @@ package com.github.wxiaoqi.security.common.msg; /** * Created by Ace on 2017/6/11. */ -public class ObjectRestResponse { +public class ObjectRestResponse extends BaseResponse { + + T data; boolean rel; - String msg; - T result; public boolean isRel() { return rel; @@ -16,34 +16,24 @@ public class ObjectRestResponse { this.rel = rel; } - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public T getResult() { - return result; - } - - public void setResult(T result) { - this.result = result; - } public ObjectRestResponse rel(boolean rel) { this.setRel(rel); return this; } - public ObjectRestResponse msg(String msg) { - this.setMsg(msg); + + public ObjectRestResponse data(T data) { + this.setData(data); return this; } + public T getData() { + return data; + } - public ObjectRestResponse result(T result) { - this.setResult(result); - return this; + public void setData(T data) { + this.data = data; } + + } diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/TableResultResponse.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/TableResultResponse.java index d8034239d6a5cf8728e0dc6af42e37a732a61a1c..783c19a3da09ff081e16037a7ff138584a9c19b0 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/TableResultResponse.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/TableResultResponse.java @@ -8,40 +8,62 @@ import java.util.List; * @author wanghaobin * @create 2017-06-14 22:40 */ -public class TableResultResponse { - int total; - List rows; +public class TableResultResponse extends BaseResponse { - public TableResultResponse(int total, List rows) { - this.total = total; - this.rows = rows; + TableData data; + + public TableResultResponse(long total, List rows) { + this.data = new TableData(total, rows); } public TableResultResponse() { + this.data = new TableData(); } - TableResultResponse total(int total){ - this.total = total; + TableResultResponse total(int total) { + this.data.setTotal(total); return this; } - TableResultResponse total(List rows){ - this.rows = rows; + + TableResultResponse total(List rows) { + this.data.setRows(rows); return this; } - public int getTotal() { - return total; + public TableData getData() { + return data; } - public void setTotal(int total) { - this.total = total; + public void setData(TableData data) { + this.data = data; } - public List getRows() { - return rows; - } + class TableData { + long total; + List rows; + + public TableData(long total, List rows) { + this.total = total; + this.rows = rows; + } + + public TableData() { + } + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public List getRows() { + return rows; + } - public void setRows(List rows) { - this.rows = rows; + public void setRows(List rows) { + this.rows = rows; + } } } diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/auth/TokenErrorResponse.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/auth/TokenErrorResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..71c132a43979be10e0288076d31c91afabe8d23b --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/auth/TokenErrorResponse.java @@ -0,0 +1,13 @@ +package com.github.wxiaoqi.security.common.msg.auth; + +import com.github.wxiaoqi.security.common.constant.RestCodeConstants; +import com.github.wxiaoqi.security.common.msg.BaseResponse; + +/** + * Created by ace on 2017/8/23. + */ +public class TokenErrorResponse extends BaseResponse { + public TokenErrorResponse(String message) { + super(RestCodeConstants.TOKEN_ERROR_CODE, message); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/auth/TokenForbiddenResponse.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/auth/TokenForbiddenResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..7934ce3e4aa3b9791e0ad48f87af405aca2e2d10 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/auth/TokenForbiddenResponse.java @@ -0,0 +1,13 @@ +package com.github.wxiaoqi.security.common.msg.auth; + +import com.github.wxiaoqi.security.common.constant.RestCodeConstants; +import com.github.wxiaoqi.security.common.msg.BaseResponse; + +/** + * Created by ace on 2017/8/25. + */ +public class TokenForbiddenResponse extends BaseResponse { + public TokenForbiddenResponse(String message) { + super(RestCodeConstants.TOKEN_FORBIDDEN_CODE, message); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java index e1c02c1b1237d50306b242616d0bc835f97a2ae6..94cbba439e41aae3af9b2b623cbf45c638e0984d 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java @@ -1,20 +1,17 @@ package com.github.wxiaoqi.security.common.rest; import com.github.wxiaoqi.security.common.biz.BaseBiz; +import com.github.wxiaoqi.security.common.context.BaseContextHandler; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.TableResultResponse; +import com.github.wxiaoqi.security.common.util.Query; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.security.SecurityProperties; -import org.springframework.util.Base64Utils; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import tk.mybatis.mapper.entity.Example; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import java.util.List; +import java.util.Map; /** * ${DESCRIPTION} @@ -22,6 +19,7 @@ import java.util.List; * @author wanghaobin * @create 2017-06-15 8:48 */ +@Slf4j public class BaseController { @Autowired protected HttpServletRequest request; @@ -30,38 +28,46 @@ public class BaseController { @RequestMapping(value = "",method = RequestMethod.POST) @ResponseBody - public ObjectRestResponse add(Entity entity){ + public ObjectRestResponse add(@RequestBody Entity entity){ baseBiz.insertSelective(entity); - return new ObjectRestResponse().rel(true); + return new ObjectRestResponse(); } @RequestMapping(value = "/{id}",method = RequestMethod.GET) @ResponseBody public ObjectRestResponse get(@PathVariable int id){ - return new ObjectRestResponse().rel(true).result(baseBiz.selectById(id)); + ObjectRestResponse entityObjectRestResponse = new ObjectRestResponse<>(); + Object o = baseBiz.selectById(id); + entityObjectRestResponse.data((Entity)o); + return entityObjectRestResponse; } @RequestMapping(value = "/{id}",method = RequestMethod.PUT) @ResponseBody - public ObjectRestResponse update(Entity entity){ + public ObjectRestResponse update(@RequestBody Entity entity){ baseBiz.updateSelectiveById(entity); - return new ObjectRestResponse().rel(true); + return new ObjectRestResponse(); } @RequestMapping(value = "/{id}",method = RequestMethod.DELETE) @ResponseBody public ObjectRestResponse remove(@PathVariable int id){ baseBiz.deleteById(id); - return new ObjectRestResponse().rel(true); + return new ObjectRestResponse(); } @RequestMapping(value = "/all",method = RequestMethod.GET) @ResponseBody - public List list(){ + public List all(){ return baseBiz.selectListAll(); } - + @RequestMapping(value = "/page",method = RequestMethod.GET) + @ResponseBody + public TableResultResponse list(@RequestParam Map params){ + //查询列表数据 + Query query = new Query(params); + return baseBiz.selectByQuery(query); + } public String getCurrentUserName(){ - String authorization = request.getHeader("Authorization"); - return new String(Base64Utils.decodeFromString(authorization)); + return BaseContextHandler.getUsername(); } } diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/ClientUtil.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/ClientUtil.java index 9a055c295a5ed0d2b851ebc40f246b5e0beee8a4..e799d15c8ac3d0d6f41e6d3246a7205145fec2a1 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/ClientUtil.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/ClientUtil.java @@ -10,12 +10,15 @@ public class ClientUtil { */ public static String getClientIp(HttpServletRequest request){ String ip = request.getHeader("x-forwarded-for"); - if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) + if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); - if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) + } + if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); - if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) + } + if (ip==null||ip.length()==0||"unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); + } return ip; } } diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/EntityUtils.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/EntityUtils.java index 6f3fe22f9529a02689499c60fc2bb7678fb8fc92..e1ad5a8c5efe49afad55c8a0cf6d9b5295a57b55 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/EntityUtils.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/EntityUtils.java @@ -3,11 +3,10 @@ package com.github.wxiaoqi.security.common.util; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field; import java.net.URLDecoder; -import java.sql.Timestamp; import java.util.Date; -import javax.servlet.http.HttpServletRequest; @@ -114,8 +113,9 @@ public class EntityUtils { * @date 2016年4月28日 */ public static boolean isPKNotNull(T entity,String field){ - if(!ReflectionUtils.hasField(entity, field)) + if(!ReflectionUtils.hasField(entity, field)) { return false; + } Object value = ReflectionUtils.getFieldValue(entity, field); return value!=null&&!"".equals(value); } diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/Query.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/Query.java new file mode 100644 index 0000000000000000000000000000000000000000..73a559e5e2cddebd7e5e741fd18eb8711c8b30bd --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/Query.java @@ -0,0 +1,46 @@ +package com.github.wxiaoqi.security.common.util; + + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 查询参数 + */ +public class Query extends LinkedHashMap { + private static final long serialVersionUID = 1L; + //当前页码 + private int page = 1; + //每页条数 + private int limit = 10; + + public Query(Map params){ + this.putAll(params); + //分页参数 + if(params.get("page")!=null) { + this.page = Integer.parseInt(params.get("page").toString()); + } + if(params.get("limit")!=null) { + this.limit = Integer.parseInt(params.get("limit").toString()); + } + this.remove("page"); + this.remove("limit"); + } + + + public int getPage() { + return page; + } + + public void setPage(int page) { + this.page = page; + } + + public int getLimit() { + return limit; + } + + public void setLimit(int limit) { + this.limit = limit; + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/StringHelper.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/StringHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..0343167640342040f8164f526ba5851d604bef36 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/StringHelper.java @@ -0,0 +1,10 @@ +package com.github.wxiaoqi.security.common.util; + +/** + * Created by ace on 2017/9/10. + */ +public class StringHelper { + public static String getObjectValue(Object obj){ + return obj==null?"":obj.toString(); + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/UUIDUtils.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/UUIDUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..15cfefb9dc8f6b6f4804eb611b0f5b4274b384d8 --- /dev/null +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/util/UUIDUtils.java @@ -0,0 +1,28 @@ +package com.github.wxiaoqi.security.common.util; + +import java.util.UUID; + +/** + * Created by ace on 2017/9/27. + */ +public class UUIDUtils { + public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f", + "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", + "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", + "W", "X", "Y", "Z" }; + + + public static String generateShortUuid() { + StringBuffer shortBuffer = new StringBuffer(); + String uuid = UUID.randomUUID().toString().replace("-", ""); + for (int i = 0; i < 8; i++) { + String str = uuid.substring(i * 4, i * 4 + 4); + int x = Integer.parseInt(str, 16); + shortBuffer.append(chars[x % 0x3E]); + } + return shortBuffer.toString(); + + } +} diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/web/ParameterRequestWrapper.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/web/ParameterRequestWrapper.java index 545cdd08f360f59250650d7b1987806ce6358c91..b49c788aaf32011c0ef8c7faf3abc7457720b480 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/web/ParameterRequestWrapper.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/web/ParameterRequestWrapper.java @@ -27,15 +27,18 @@ public class ParameterRequestWrapper extends HttpServletRequestWrapper { this.params = newParams; } + @Override public Map getParameterMap() { return params; } + @Override public Enumeration getParameterNames() { Vector l = new Vector(params.keySet()); return l.elements(); } + @Override public String[] getParameterValues(String name) { Object v = params.get(name); if (v == null) { @@ -49,6 +52,7 @@ public class ParameterRequestWrapper extends HttpServletRequestWrapper { } } + @Override public String getParameter(String name) { Object v = params.get(name); if (v == null) { diff --git a/ace-config/readme.md b/ace-config/readme.md deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/ace-config/src/main/java/com/github/wxiaoqi/security/config/ConfigServerBootstrap.java b/ace-config/src/main/java/com/github/wxiaoqi/security/config/ConfigServerBootstrap.java deleted file mode 100644 index 241f061cc25fd8fea94820d6237092bff5ef531f..0000000000000000000000000000000000000000 --- a/ace-config/src/main/java/com/github/wxiaoqi/security/config/ConfigServerBootstrap.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.wxiaoqi.security.config; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.cloud.config.server.EnableConfigServer; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.bind.annotation.RestController; -/** - * Created by ace on 2017/7/29. - */ -@Configuration -@EnableAutoConfiguration -@RestController -@EnableConfigServer -public class ConfigServerBootstrap { - public static void main(String[] args) { - SpringApplication.run(ConfigServerBootstrap.class, args); - } -} diff --git a/ace-config/src/main/resources/application.yml b/ace-config/src/main/resources/application.yml deleted file mode 100644 index dfed7a26bc8b14c91beec1a438ec7c81f427af57..0000000000000000000000000000000000000000 --- a/ace-config/src/main/resources/application.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - application: - name: ace-config - cloud: - config: - server: - git: - uri: https://git.oschina.net/geek_qi/AG-Config.git - -server: - port: 8750 #启动端口 diff --git a/ace-monitor/pom.xml b/ace-control/ace-monitor/pom.xml similarity index 40% rename from ace-monitor/pom.xml rename to ace-control/ace-monitor/pom.xml index bb61587e1ff59ff1cb99ac65aee7a9fef49a6d15..a28fa0c799255fe5b363167ffa5cd9d07970dab6 100644 --- a/ace-monitor/pom.xml +++ b/ace-control/ace-monitor/pom.xml @@ -3,17 +3,19 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - ace-security + ace-control com.github.wxiaoqi - 1.0-SNAPSHOT + 2.0-SNAPSHOT + 4.0.0 ace-monitor + - 1.5.12 - 1.4.2 + 2.0.0-SNAPSHOT + org.springframework.boot @@ -23,33 +25,16 @@ org.springframework.boot spring-boot-starter-actuator + org.springframework.cloud - spring-cloud-starter-eureka - - - org.springframework.cloud - spring-cloud-starter-hystrix-dashboard + spring-cloud-starter-netflix-eureka-client + org.springframework.boot spring-boot-starter-thymeleaf - - com.netflix.hystrix - hystrix-core - ${hystrix.version} - - - com.netflix.hystrix - hystrix-metrics-event-stream - ${hystrix.version} - - - com.netflix.hystrix - hystrix-javanica - ${hystrix.version} - de.codecentric spring-boot-admin-server @@ -60,17 +45,7 @@ spring-boot-admin-server-ui ${boot.admin.version} - - de.codecentric - spring-boot-admin-starter-client - ${boot.admin.version} - - - - org.springframework.boot - spring-boot-starter-test - test - + ace-monitor @@ -79,30 +54,30 @@ org.springframework.boot spring-boot-maven-plugin - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - - package - - build - - - - - ${docker.image.prefix}/${project.artifactId} - ${project.basedir}/src/main/docker - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ace-monitor/src/main/docker/Dockerfile b/ace-control/ace-monitor/src/main/docker/Dockerfile similarity index 100% rename from ace-monitor/src/main/docker/Dockerfile rename to ace-control/ace-monitor/src/main/docker/Dockerfile diff --git a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/BlogAdminBootstrap.java b/ace-control/ace-monitor/src/main/java/com/github/wxiaoqi/security/monitor/MonitorBootstrap.java similarity index 50% rename from ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/BlogAdminBootstrap.java rename to ace-control/ace-monitor/src/main/java/com/github/wxiaoqi/security/monitor/MonitorBootstrap.java index 6910032ddaa5a4d820d6c416c33b31bd41c59264..71429c57ce3e9ee0a347ecdfd04718c6f05b0505 100644 --- a/ace-blog-parent/ace-blog-admin/src/main/java/com/github/wxiaoqi/blog/admin/BlogAdminBootstrap.java +++ b/ace-control/ace-monitor/src/main/java/com/github/wxiaoqi/security/monitor/MonitorBootstrap.java @@ -1,20 +1,21 @@ -package com.github.wxiaoqi.blog.admin; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.cloud.netflix.hystrix.EnableHystrix; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-05-25 12:44 - */ -@EnableEurekaClient -@EnableHystrix -@SpringBootApplication -public class BlogAdminBootstrap { - public static void main(String[] args) { - new SpringApplicationBuilder(BlogAdminBootstrap.class).web(true).run(args); } -} +package com.github.wxiaoqi.security.monitor; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; + +/** + * ${DESCRIPTION} + * + * @author wanghaobin + * @create 2017-05-25 12:44 + */ +@SpringBootApplication +@EnableAdminServer +@EnableEurekaClient +public class MonitorBootstrap { + public static void main(String[] args) { + SpringApplication.run(MonitorBootstrap.class, args); + } +} diff --git a/ace-monitor/src/main/resources/application.yml b/ace-control/ace-monitor/src/main/resources/application.yml similarity index 59% rename from ace-monitor/src/main/resources/application.yml rename to ace-control/ace-monitor/src/main/resources/application.yml index b6fb76744165e50de3de4865056130b07053d9f8..e82fa3e6b5f64c2d6e81af0fafa69baacba31697 100644 --- a/ace-monitor/src/main/resources/application.yml +++ b/ace-control/ace-monitor/src/main/resources/application.yml @@ -5,16 +5,15 @@ spring: server: port: 8764 #启动端口 -security: - user: - name: whb - password: 123456 - role: USER eureka: instance: preferIpAddress: true + statusPageUrlPath: /actuator/info + healthCheckUrlPath: /actuator/health client: registerWithEureka: true fetchRegistry: true serviceUrl: - defaultZone: http://localhost:8761/eureka/ \ No newline at end of file + defaultZone: http://localhost:8761/eureka/ + + diff --git a/ace-control/ace-trace/db/init.sql b/ace-control/ace-trace/db/init.sql new file mode 100644 index 0000000000000000000000000000000000000000..3144279bac693417ca3f4e254755140158ef4ec4 --- /dev/null +++ b/ace-control/ace-trace/db/init.sql @@ -0,0 +1,51 @@ +CREATE DATABASE ag_zipkin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +Use ag_zipkin; + +CREATE TABLE IF NOT EXISTS zipkin_spans ( + `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', + `trace_id` BIGINT NOT NULL, + `id` BIGINT NOT NULL, + `name` VARCHAR(255) NOT NULL, + `parent_id` BIGINT, + `debug` BIT(1), + `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL', + `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query' +) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; + +ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate'; +ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations'; +ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds'; +ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames'; +ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range'; + +CREATE TABLE IF NOT EXISTS zipkin_annotations ( + `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', + `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id', + `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id', + `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1', + `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB', + `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation', + `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp', + `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null', + `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address', + `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null', + `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null' +) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; + +ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate'; +ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans'; +ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds'; +ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames'; +ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces'; +ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces'; +ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job'; + +CREATE TABLE IF NOT EXISTS zipkin_dependencies ( + `day` DATE NOT NULL, + `parent` VARCHAR(255) NOT NULL, + `child` VARCHAR(255) NOT NULL, + `call_count` BIGINT, + `error_count` BIGINT +) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; + +ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`); diff --git a/ace-control/ace-trace/pom.xml b/ace-control/ace-trace/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..48e7b6632571ac6a9321d2fe84df78f068ad3884 --- /dev/null +++ b/ace-control/ace-trace/pom.xml @@ -0,0 +1,73 @@ + + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + 4.0.0 + + ace-trace + + + + org.springframework.boot + spring-boot-starter-undertow + + + org.springframework.boot + spring-boot-starter-web + + + io.zipkin.java + zipkin-server + 2.5.0 + + + + io.zipkin.java + zipkin-autoconfigure-collector-rabbitmq + 2.5.0 + + + io.zipkin.java + zipkin-autoconfigure-ui + 2.5.0 + + + + io.zipkin.java + zipkin-autoconfigure-storage-mysql + 2.5.0 + + + mysql + mysql-connector-java + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + true + + + + + \ No newline at end of file diff --git a/ace-control/ace-trace/readme.md b/ace-control/ace-trace/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..1f76774921f5c0633d5f29dfec6ae6963a2ae3bf --- /dev/null +++ b/ace-control/ace-trace/readme.md @@ -0,0 +1,9 @@ +# 运行下载命令 +``` +$ curl -sSL https://zipkin.io/quickstart.sh | bash -s +$ java -jar zipkin.jar +``` +# 启动命令 +``` +RABBIT_URI=amqp://guest:guest@localhost:5672 STORAGE_TYPE=mysql MYSQL_DB=ag_zipkin MYSQL_USER=root MYSQL_PASS=123456 MYSQL_HOST=localhost MYSQL_USE_SSL=false java -jar zipkin.jar +``` \ No newline at end of file diff --git a/ace-control/ace-trace/src/main/java/com/github/wxiaoqi/security/trace/TraceBootstrap.java b/ace-control/ace-trace/src/main/java/com/github/wxiaoqi/security/trace/TraceBootstrap.java new file mode 100644 index 0000000000000000000000000000000000000000..1d9f026f9f73d87af77d14029d6e3b7c2ad15f0a --- /dev/null +++ b/ace-control/ace-trace/src/main/java/com/github/wxiaoqi/security/trace/TraceBootstrap.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2018 Wanghaobin<463540703@qq.com> + + * AG-Enterprise 企业版源码 + * 郑重声明: + * 如果你从其他途径获取到,请告知老A传播人,奖励1000。 + * 老A将追究授予人和传播人的法律责任! + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program 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 General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package com.github.wxiaoqi.security.trace; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import zipkin.server.EnableZipkinServer; + +/** + * Created by ace on 2017/7/10. + */ +@SpringBootApplication +@EnableZipkinServer +public class TraceBootstrap { + public static void main(String[] args) { + SpringApplication.run(TraceBootstrap.class,args); + } +} diff --git a/ace-control/ace-trace/src/main/resources/application.yml b/ace-control/ace-trace/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..9f41e6053072ccc1221ad51b3ee0cd4d5cfd81a6 --- /dev/null +++ b/ace-control/ace-trace/src/main/resources/application.yml @@ -0,0 +1,40 @@ +spring: + datasource: + url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/ag_zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false + username: root + password: 123456 + driver-class-name: com.mysql.jdbc.Driver + continue-on-error: true + application: + name: ace-trace + #zipkin数据保存到数据库中需要进行如下配置 + #表示当前程序不使用sleuth + sleuth: + enabled: false + #表示zipkin数据存储方式是mysql + +zipkin: + storage: + type: mysql + collector: + rabbitmq: + addresses: ${RABBIT_MQ_HOST:127.0.0.1} + port: ${RABBIT_MQ_PORT:5672} + password: guest + username: guest + queue: zipkin +server: + port: 9411 + +eureka: + instance: + statusPageUrlPath: /info + healthCheckUrlPath: /health + # docker 部署开启 +# prefer-ip-address: true +# ip-address: 127.0.0.1 + client: + serviceUrl: +# defaultZone: http://localhost:8761/eureka/ + # docker 部署开启 + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ diff --git a/ace-control/ace-trace/zipkin.jar b/ace-control/ace-trace/zipkin.jar new file mode 100644 index 0000000000000000000000000000000000000000..26e51583f604aa34915ee9758dceee545ef1b30e Binary files /dev/null and b/ace-control/ace-trace/zipkin.jar differ diff --git a/ace-control/pom.xml b/ace-control/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..669ffad92edd2d44bf5a2ad9cdc82ed24c5abecc --- /dev/null +++ b/ace-control/pom.xml @@ -0,0 +1,19 @@ + + + + ace-security + com.github.wxiaoqi + 2.0-SNAPSHOT + + 4.0.0 + pom + ace-control + + ace-monitor + ace-trace + + + + \ No newline at end of file diff --git a/ace-gate/ace-gate-ratelimit/pom.xml b/ace-gate/ace-gate-ratelimit/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..700498193657401ee97592515521973a39e5010e --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/pom.xml @@ -0,0 +1,46 @@ + + + + ace-gate + com.github.wxiaoqi + 2.0-SNAPSHOT + + 4.0.0 + + ace-gate-ratelimit + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + org.springframework.cloud + spring-cloud-starter-netflix-zuul + provided + true + + + org.springframework.boot + spring-boot-starter-data-jpa + provided + true + + + org.springframework.boot + spring-boot-starter-data-redis + provided + true + + + + \ No newline at end of file diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/EnableAceGateRateLimit.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/EnableAceGateRateLimit.java new file mode 100644 index 0000000000000000000000000000000000000000..e8ab63f6799904b46ca5c1f1ea01694c78853a3c --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/EnableAceGateRateLimit.java @@ -0,0 +1,16 @@ +package com.github.wxiaoqi.gate.ratelimit; + +import org.springframework.context.annotation.Import; + +import java.lang.annotation.*; + +/** + * Created by ace on 2017/9/24. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Import(RateLimitAutoConfiguration.class) +@Documented +@Inherited +public @interface EnableAceGateRateLimit { +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/RateLimitAutoConfiguration.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/RateLimitAutoConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..aea075833e7185af8881c0d202bbfa69b95d2eb5 --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/RateLimitAutoConfiguration.java @@ -0,0 +1,97 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit; + +import com.github.wxiaoqi.gate.ratelimit.config.IUserPrincipal; +import com.github.wxiaoqi.gate.ratelimit.config.RateLimiter; +import com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties; +import com.github.wxiaoqi.gate.ratelimit.config.repository.InMemoryRateLimiter; +import com.github.wxiaoqi.gate.ratelimit.config.repository.RedisRateLimiter; +import com.github.wxiaoqi.gate.ratelimit.config.repository.springdata.IRateLimiterRepository; +import com.github.wxiaoqi.gate.ratelimit.config.repository.springdata.SpringDataRateLimiter; +import com.github.wxiaoqi.gate.ratelimit.filters.RateLimitFilter; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.netflix.zuul.filters.RouteLocator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; + +import static com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties.PREFIX; + +/** + * @author Marcos Barbero + */ +@Configuration +@EnableConfigurationProperties(RateLimitProperties.class) +@ConditionalOnProperty(prefix = PREFIX, name = "enabled", havingValue = "true") +public class RateLimitAutoConfiguration { + + @Bean + public RateLimitFilter rateLimiterFilter(final RateLimiter rateLimiter, + final RateLimitProperties rateLimitProperties, + final RouteLocator routeLocator, final IUserPrincipal userPrincipal) { + return new RateLimitFilter(rateLimiter, rateLimitProperties, routeLocator,userPrincipal); + } + + @ConditionalOnClass(RedisTemplate.class) + @ConditionalOnMissingBean(RateLimiter.class) + @ConditionalOnProperty(prefix = PREFIX, name = "repository", havingValue = "REDIS") + public static class RedisConfiguration { + + @Bean("rateLimiterRedisTemplate") + public StringRedisTemplate redisTemplate(final RedisConnectionFactory connectionFactory) { + return new StringRedisTemplate(connectionFactory); + } + + @Bean + public RateLimiter redisRateLimiter(@Qualifier("rateLimiterRedisTemplate") final RedisTemplate redisTemplate) { + return new RedisRateLimiter(redisTemplate); + } + } + + @EntityScan + @EnableJpaRepositories + @ConditionalOnMissingBean(RateLimiter.class) + @ConditionalOnProperty(prefix = PREFIX, name = "repository", havingValue = "JPA") + public static class SpringDataConfiguration { + + @Bean + public RateLimiter springDataRateLimiter(IRateLimiterRepository rateLimiterRepository) { + return new SpringDataRateLimiter(rateLimiterRepository); + } + + } + + @ConditionalOnMissingBean(RateLimiter.class) + @ConditionalOnProperty(prefix = PREFIX, name = "repository", havingValue = "IN_MEMORY", matchIfMissing = true) + public static class InMemoryConfiguration { + + @Bean + public RateLimiter inMemoryRateLimiter() { + return new InMemoryRateLimiter(); + } + } + +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/DefaultUserPrincipal.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/DefaultUserPrincipal.java new file mode 100644 index 0000000000000000000000000000000000000000..7c2d61c107060dfc286825fa7aaf96418217f39e --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/DefaultUserPrincipal.java @@ -0,0 +1,16 @@ +package com.github.wxiaoqi.gate.ratelimit.config; + +import javax.servlet.http.HttpServletRequest; + +/** + * Created by ace on 2017/9/23. + */ +public class DefaultUserPrincipal implements IUserPrincipal { + @Override + public String getName(HttpServletRequest request) { + if(request.getUserPrincipal()==null) { + return null; + } + return request.getUserPrincipal().getName(); + } +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/IUserPrincipal.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/IUserPrincipal.java new file mode 100644 index 0000000000000000000000000000000000000000..a93ce546beee0fd3e75a918949616da8d1b36e77 --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/IUserPrincipal.java @@ -0,0 +1,10 @@ +package com.github.wxiaoqi.gate.ratelimit.config; + +import javax.servlet.http.HttpServletRequest; + +/** + * Created by ace on 2017/9/23. + */ +public interface IUserPrincipal { + String getName(HttpServletRequest request); +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/Rate.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/Rate.java new file mode 100644 index 0000000000000000000000000000000000000000..8273bd92d1416f3a8bc9dd4aa6177d6e15c3fcee --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/Rate.java @@ -0,0 +1,48 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit.config; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.Id; +import java.util.Date; + +/** + * Represents a view of rate limit in a giving time for a user. + *

            + * limit - How many requests can be executed by the user. Maps to X-RateLimit-Limit header + * remaining - How many requests are still left on the current window. Maps to X-RateLimit-Remaining header + * reset - Epoch when the rate is replenished by limit. Maps to X-RateLimit-Reset header + * + * @author Marcos Barbero + */ +@Data +@Entity +@NoArgsConstructor +@AllArgsConstructor +public class Rate { + + @Id + private String key; + private Long remaining; + private Long reset; + private Date expiration; + +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/RateLimiter.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/RateLimiter.java new file mode 100644 index 0000000000000000000000000000000000000000..3e1835d0de674deb1a296a94e1c4b3289856fd8c --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/RateLimiter.java @@ -0,0 +1,32 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit.config; + +import com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties.Policy; + +/** + * @author Marcos Barbero + */ +public interface RateLimiter { + + /** + * @param policy - Template for which rates should be created in case there's no rate limit associated with the key + * @param key - Unique key that identifies a request + * @return a view of a user's rate request limit + */ + Rate consume(Policy policy, String key); +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/properties/RateLimitProperties.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/properties/RateLimitProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..a65bd88aabc5f6e11f9accb8a625c48a36aeb1d6 --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/properties/RateLimitProperties.java @@ -0,0 +1,78 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit.config.properties; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +/** + * @author Marcos Barbero + */ +@Data +@Validated +@NoArgsConstructor +@ConfigurationProperties(RateLimitProperties.PREFIX) +public class RateLimitProperties { + + public static final String PREFIX = "zuul.ratelimit"; + + private Policy defaultPolicy; + @NotNull + private Map policies = Maps.newHashMap(); + private boolean behindProxy; + private boolean enabled; + @NotNull + @Value("${spring.application.name:rate-limit-application}") + private String keyPrefix; + @NotNull + private Repository repository = Repository.IN_MEMORY; + + public enum Repository { + REDIS, CONSUL, JPA, IN_MEMORY + } + + public Optional getPolicy(String key) { + return Optional.ofNullable(policies.getOrDefault(key, defaultPolicy)); + } + + @Data + @NoArgsConstructor + public static class Policy { + + @NotNull + private Long refreshInterval = TimeUnit.MINUTES.toSeconds(1L); + @NotNull + private Long limit; + @NotNull + private List type = Lists.newArrayList(); + + public enum Type { + ORIGIN, USER, URL + } + } +} \ No newline at end of file diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/AbstractRateLimiter.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/AbstractRateLimiter.java new file mode 100644 index 0000000000000000000000000000000000000000..e1e6af2efb8d096124dea9dda29177a3b2b84c72 --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/AbstractRateLimiter.java @@ -0,0 +1,55 @@ +package com.github.wxiaoqi.gate.ratelimit.config.repository; + +import com.github.wxiaoqi.gate.ratelimit.config.Rate; +import com.github.wxiaoqi.gate.ratelimit.config.RateLimiter; +import com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties.Policy; + +import java.util.Date; + +import static java.util.concurrent.TimeUnit.SECONDS; + +/** + * Abstract implementation for {@link RateLimiter}. + * + * @author Liel Chayoun + * @author Marcos Barbero + * @since 2017-08-28 + */ +public abstract class AbstractRateLimiter implements RateLimiter { + + protected abstract Rate getRate(String key); + protected abstract void saveRate(Rate rate); + + @Override + public synchronized Rate consume(final Policy policy, final String key) { + Rate rate = this.create(policy, key); + this.updateRate(rate); + this.saveRate(rate); + return rate; + } + + private Rate create(final Policy policy, final String key) { + Rate rate = this.getRate(key); + if (isExpired(rate)) { + + final Long limit = policy.getLimit(); + final Long refreshInterval = SECONDS.toMillis(policy.getRefreshInterval()); + final Date expiration = new Date(System.currentTimeMillis() + refreshInterval); + + rate = new Rate(key, limit, refreshInterval, expiration); + } + return rate; + } + + private void updateRate(final Rate rate) { + if (rate.getReset() > 0) { + Long reset = rate.getExpiration().getTime() - System.currentTimeMillis(); + rate.setReset(reset); + } + rate.setRemaining(Math.max(-1, rate.getRemaining() - 1)); + } + + private boolean isExpired(final Rate rate) { + return rate == null || (rate.getExpiration().getTime() < System.currentTimeMillis()); + } +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/InMemoryRateLimiter.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/InMemoryRateLimiter.java new file mode 100644 index 0000000000000000000000000000000000000000..9fe36e7e6afa98336c13004c42418d9cb4a5933d --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/InMemoryRateLimiter.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit.config.repository; + +import com.github.wxiaoqi.gate.ratelimit.config.Rate; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * In memory rate limiter configuration for dev environment. + * + * @author Marcos Barbero + * @since 2017-06-23 + */ +public class InMemoryRateLimiter extends AbstractRateLimiter { + + private Map repository = new ConcurrentHashMap<>(); + + @Override + protected Rate getRate(String key) { + return this.repository.get(key); + } + + @Override + protected void saveRate(Rate rate) { + this.repository.put(rate.getKey(), rate); + } + +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/RedisRateLimiter.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/RedisRateLimiter.java new file mode 100644 index 0000000000000000000000000000000000000000..ac12cd43db21c18a63ad123ba92f05a072ecf59a --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/RedisRateLimiter.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit.config.repository; + +import com.github.wxiaoqi.gate.ratelimit.config.Rate; +import com.github.wxiaoqi.gate.ratelimit.config.RateLimiter; +import com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties.Policy; +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; + +import static java.util.concurrent.TimeUnit.SECONDS; + +/** + * @author Marcos Barbero + */ +@RequiredArgsConstructor +public class RedisRateLimiter implements RateLimiter { + private final RedisTemplate template; + + @Override + @SuppressWarnings("unchecked") + public Rate consume(final Policy policy, final String key) { + final Long limit = policy.getLimit(); + final Long refreshInterval = policy.getRefreshInterval(); + final Long current = this.template.boundValueOps(key).increment(1L); + Long expire = this.template.getExpire(key); + if (expire == null || expire == -1) { + this.template.expire(key, refreshInterval, SECONDS); + expire = refreshInterval; + } + return new Rate(key, Math.max(-1, limit - current), SECONDS.toMillis(expire), null); + } +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/springdata/IRateLimiterRepository.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/springdata/IRateLimiterRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..a0b1ce906ff8b0786a23d63d15146df810c3888e --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/springdata/IRateLimiterRepository.java @@ -0,0 +1,10 @@ +package com.github.wxiaoqi.gate.ratelimit.config.repository.springdata; + +import com.github.wxiaoqi.gate.ratelimit.config.Rate; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface IRateLimiterRepository extends CrudRepository { + +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/springdata/SpringDataRateLimiter.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/springdata/SpringDataRateLimiter.java new file mode 100644 index 0000000000000000000000000000000000000000..e55481bdbb151185fb5968384d199f9086a526af --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/config/repository/springdata/SpringDataRateLimiter.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit.config.repository.springdata; + +import com.github.wxiaoqi.gate.ratelimit.config.Rate; +import com.github.wxiaoqi.gate.ratelimit.config.repository.AbstractRateLimiter; +import lombok.RequiredArgsConstructor; + +/** + * In memory rate limiter configuration for dev environment. + * + * @author Marcos Barbero + * @since 2017-06-23 + */ +@RequiredArgsConstructor +public class SpringDataRateLimiter extends AbstractRateLimiter { + + private final IRateLimiterRepository repository; + + @Override + protected Rate getRate(String key) { + return this.repository.findById(key).get(); + } + + @Override + protected void saveRate(Rate rate) { + this.repository.save(rate); + } + +} diff --git a/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/filters/RateLimitFilter.java b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/filters/RateLimitFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..5a8a54e9599c099e1be68311218f71616796fd57 --- /dev/null +++ b/ace-gate/ace-gate-ratelimit/src/main/java/com/github/wxiaoqi/gate/ratelimit/filters/RateLimitFilter.java @@ -0,0 +1,136 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * 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. + */ + +package com.github.wxiaoqi.gate.ratelimit.filters; + +import com.github.wxiaoqi.gate.ratelimit.config.IUserPrincipal; +import com.github.wxiaoqi.gate.ratelimit.config.Rate; +import com.github.wxiaoqi.gate.ratelimit.config.RateLimiter; +import com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties; +import com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties.Policy; +import com.github.wxiaoqi.gate.ratelimit.config.properties.RateLimitProperties.Policy.Type; +import com.google.common.net.HttpHeaders; +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; +import com.netflix.zuul.exception.ZuulException; +import lombok.RequiredArgsConstructor; +import org.springframework.cloud.netflix.zuul.filters.Route; +import org.springframework.cloud.netflix.zuul.filters.RouteLocator; +import org.springframework.cloud.netflix.zuul.util.ZuulRuntimeException; +import org.springframework.web.util.UrlPathHelper; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Optional; +import java.util.StringJoiner; + +import static org.springframework.http.HttpStatus.TOO_MANY_REQUESTS; + +/** + * @author Marcos Barbero + * @author Michal Šváb + */ +@RequiredArgsConstructor +public class RateLimitFilter extends ZuulFilter { + + public static final String LIMIT_HEADER = "X-RateLimit-Limit"; + public static final String REMAINING_HEADER = "X-RateLimit-Remaining"; + public static final String RESET_HEADER = "X-RateLimit-Reset"; + + private static final String ANONYMOUS_USER = "anonymous"; + private static final UrlPathHelper URL_PATH_HELPER = new UrlPathHelper(); + + private final RateLimiter rateLimiter; + private final RateLimitProperties properties; + private final RouteLocator routeLocator; + private final IUserPrincipal userPrincipal; + + @Override + public String filterType() { + return "pre"; + } + + @Override + public int filterOrder() { + return -1; + } + + @Override + public boolean shouldFilter() { + return properties.isEnabled() && policy().isPresent(); + } + + @Override + public Object run() { + final RequestContext ctx = RequestContext.getCurrentContext(); + final HttpServletResponse response = ctx.getResponse(); + final HttpServletRequest request = ctx.getRequest(); + + policy().ifPresent(policy -> { + final Rate rate = rateLimiter.consume(policy, key(request, policy.getType())); + response.setHeader(LIMIT_HEADER, policy.getLimit().toString()); + response.setHeader(REMAINING_HEADER, String.valueOf(Math.max(rate.getRemaining(), 0))); + response.setHeader(RESET_HEADER, rate.getReset().toString()); + if (rate.getRemaining() < 0) { + ctx.setResponseStatusCode(TOO_MANY_REQUESTS.value()); + ctx.put("rateLimitExceeded", "true"); + throw new ZuulRuntimeException(new ZuulException(TOO_MANY_REQUESTS.toString(), + TOO_MANY_REQUESTS.value(), null)); + } + }); + return null; + } + + private Route route() { + String requestURI = URL_PATH_HELPER.getPathWithinApplication(RequestContext.getCurrentContext().getRequest()); + return routeLocator.getMatchingRoute(requestURI); + } + + private Optional policy() { + Route route = route(); + if (route != null) { + return properties.getPolicy(route.getId()); + } + return Optional.ofNullable(properties.getDefaultPolicy()); + } + + private String key(final HttpServletRequest request, final List types) { + final Route route = route(); + final StringJoiner joiner = new StringJoiner(":"); + joiner.add(properties.getKeyPrefix()); + joiner.add(route.getId()); + if (!types.isEmpty()) { + if (types.contains(Type.URL)) { + joiner.add(route.getPath()); + } + if (types.contains(Type.ORIGIN)) { + joiner.add(getRemoteAddr(request)); + } + if (types.contains(Type.USER)) { + joiner.add(userPrincipal.getName(request)!= null ? userPrincipal.getName(request) : ANONYMOUS_USER); + } + } + return joiner.toString(); + } + + private String getRemoteAddr(final HttpServletRequest request) { + if (properties.isBehindProxy() && request.getHeader(HttpHeaders.X_FORWARDED_FOR) != null) { + return request.getHeader(HttpHeaders.X_FORWARDED_FOR); + } + return request.getRemoteAddr(); + } +} diff --git a/ace-ui/pom.xml b/ace-gate/ace-gate-zuul/pom.xml similarity index 32% rename from ace-ui/pom.xml rename to ace-gate/ace-gate-zuul/pom.xml index ad2e019e175aab9624b44f879f8d25c08cb72c64..774dd59fc6b27af0484bd825d274dd86a491cfde 100644 --- a/ace-ui/pom.xml +++ b/ace-gate/ace-gate-zuul/pom.xml @@ -3,118 +3,139 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - ace-security + ace-gate com.github.wxiaoqi - 1.0-SNAPSHOT + 2.0-SNAPSHOT 4.0.0 - ace-ui + ace-gate-zuul + org.springframework.boot spring-boot-starter-undertow + + org.springframework.cloud + spring-cloud-starter-netflix-zuul + org.springframework.boot spring-boot-starter-actuator org.springframework.boot - spring-boot-starter-thymeleaf + spring-boot-starter-data-redis - org.webjars - jquery - 2.1.4 + com.github.wxiaoqi + ace-interface + 2.0-SNAPSHOT - org.webjars - bootstrap - 3.1.0 + com.github.wxiaoqi + ace-common + 2.0-SNAPSHOT - net.sourceforge.nekohtml - nekohtml - 1.9.22 + org.springframework.cloud + spring-cloud-starter-openfeign - - org.springframework.boot - spring-boot-devtools - true + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + org.springframework.cloud - spring-cloud-starter-feign + spring-cloud-sleuth-zipkin - org.springframework.cloud - spring-cloud-starter-eureka + org.springframework.amqp + spring-rabbit + + + + com.alibaba + fastjson + 1.2.33 com.github.wxiaoqi - ace-api - 1.0-SNAPSHOT + ace-auth-client + 2.0-SNAPSHOT - com.google.guava - guava - 20.0 + com.github.wxiaoqi + ace-gate-ratelimit + 2.0-SNAPSHOT + + + com.netflix.feign + feign-jackson + 8.18.0 - ace-ui - - - - - - - - - - - + ace-gate org.springframework.boot spring-boot-maven-plugin - - com.github.wxiaoqi.security.ui.UIBootstrap - true - - - - - org.springframework - springloaded - 1.2.1.RELEASE - - - com.spotify - docker-maven-plugin - ${docker.plugin.version} + org.apache.maven.plugins + maven-resources-plugin - package + prepare-dockerfile + validate - build + copy-resources + + ${project.build.directory}/docker + + + ${project.basedir}/src/main/docker + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin - ${docker.image.prefix}/${project.artifactId} - ${project.basedir}/src/main/docker - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - + 1.8 + 1.8 diff --git a/ace-gate/ace-gate-zuul/src/main/docker/Dockerfile b/ace-gate/ace-gate-zuul/src/main/docker/Dockerfile new file mode 100755 index 0000000000000000000000000000000000000000..5bfd8cd41bede8a487926f84c3f3f3d16b7cb473 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/docker/Dockerfile @@ -0,0 +1,7 @@ +FROM java:8 +VOLUME /tmp +ADD ace-gate.jar app.jar +ADD wait-for-it.sh /wait-for-it.sh +RUN sh -c 'touch /app.jar' +RUN bash -c 'chmod 777 /wait-for-it.sh' +CMD exec java -Djava.security.egd=file:/dev/./urandom -jar /app.jar \ No newline at end of file diff --git a/ace-gate/ace-gate-zuul/src/main/docker/wait-for-it.sh b/ace-gate/ace-gate-zuul/src/main/docker/wait-for-it.sh new file mode 100755 index 0000000000000000000000000000000000000000..401a6f1790a2ae9424b84160bb0c1b68e6ff1f45 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/docker/wait-for-it.sh @@ -0,0 +1,177 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +cmdname=$(basename $0) + +echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $TIMEOUT -gt 0 ]]; then + echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" + else + echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" + fi + start_ts=$(date +%s) + while : + do + if [[ $ISBUSY -eq 1 ]]; then + nc -z $HOST $PORT + result=$? + else + (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 + result=$? + fi + if [[ $result -eq 0 ]]; then + end_ts=$(date +%s) + echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" + break + fi + sleep 1 + done + return $result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $QUIET -eq 1 ]]; then + timeout $BUSYTIMEFLAG $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + else + timeout $BUSYTIMEFLAG $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + fi + PID=$! + trap "kill -INT -$PID" INT + wait $PID + RESULT=$? + if [[ $RESULT -ne 0 ]]; then + echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" + fi + return $RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + hostport=(${1//:/ }) + HOST=${hostport[0]} + PORT=${hostport[1]} + shift 1 + ;; + --child) + CHILD=1 + shift 1 + ;; + -q | --quiet) + QUIET=1 + shift 1 + ;; + -s | --strict) + STRICT=1 + shift 1 + ;; + -h) + HOST="$2" + if [[ $HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + HOST="${1#*=}" + shift 1 + ;; + -p) + PORT="$2" + if [[ $PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + PORT="${1#*=}" + shift 1 + ;; + -t) + TIMEOUT="$2" + if [[ $TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + CLI="$@" + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$HOST" == "" || "$PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +TIMEOUT=${TIMEOUT:-15} +STRICT=${STRICT:-0} +CHILD=${CHILD:-0} +QUIET=${QUIET:-0} + +# check to see if timeout is from busybox? +# check to see if timeout is from busybox? +TIMEOUT_PATH=$(realpath $(which timeout)) +if [[ $TIMEOUT_PATH =~ "busybox" ]]; then + ISBUSY=1 + BUSYTIMEFLAG="-t" +else + ISBUSY=0 + BUSYTIMEFLAG="" +fi + +if [[ $CHILD -gt 0 ]]; then + wait_for + RESULT=$? + exit $RESULT +else + if [[ $TIMEOUT -gt 0 ]]; then + wait_for_wrapper + RESULT=$? + else + wait_for + RESULT=$? + fi +fi + +if [[ $CLI != "" ]]; then + if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then + echoerr "$cmdname: strict mode, refusing to execute subprocess" + exit $RESULT + fi + exec $CLI +else + exit $RESULT +fi diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/GateBootstrap.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/GateBootstrap.java similarity index 45% rename from ace-gate/src/main/java/com/github/wxiaoqi/security/gate/GateBootstrap.java rename to ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/GateBootstrap.java index 5875928a3cac9c77583e58e5c09c4394f6a41a4f..35a4342b31b84a07ac7eeebdd73568c3011de203 100644 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/GateBootstrap.java +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/GateBootstrap.java @@ -1,27 +1,39 @@ package com.github.wxiaoqi.security.gate; +import com.github.wxiaoqi.gate.ratelimit.EnableAceGateRateLimit; +import com.github.wxiaoqi.gate.ratelimit.config.IUserPrincipal; +import com.github.wxiaoqi.security.auth.client.EnableAceAuthClient; +import com.github.wxiaoqi.security.gate.config.UserPrincipal; import com.github.wxiaoqi.security.gate.utils.DBLog; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.netflix.eureka.EnableEurekaClient; -import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; -import org.springframework.session.data.redis.RedisFlushMode; -import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.scheduling.annotation.EnableScheduling; /** * Created by Ace on 2017/6/2. */ @SpringBootApplication @EnableDiscoveryClient -@EnableFeignClients +@EnableFeignClients({"com.github.wxiaoqi.security.auth.client.feign","com.github.wxiaoqi.security.gate.feign"}) @EnableZuulProxy -@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE) +@EnableScheduling +@EnableAceAuthClient +@EnableAceGateRateLimit public class GateBootstrap { public static void main(String[] args) { DBLog.getInstance().start(); SpringApplication.run(GateBootstrap.class, args); } + + @Bean + @Primary + IUserPrincipal userPrincipal(){ + return new UserPrincipal(); + } } diff --git a/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/config/UserPrincipal.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/config/UserPrincipal.java new file mode 100644 index 0000000000000000000000000000000000000000..e9b160a2e0913a9ae78db16398e60ef67f563d81 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/config/UserPrincipal.java @@ -0,0 +1,44 @@ +package com.github.wxiaoqi.security.gate.config; + +import com.github.wxiaoqi.gate.ratelimit.config.IUserPrincipal; +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil; +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; + +/** + * Created by ace on 2017/9/23. + */ + +public class UserPrincipal implements IUserPrincipal { + + @Autowired + private UserAuthConfig userAuthConfig; + @Autowired + private UserAuthUtil userAuthUtil; + + @Override + public String getName(HttpServletRequest request) { + IJWTInfo infoFromToken = getJwtInfo(request); + return infoFromToken == null ? null : infoFromToken.getUniqueName(); + } + + private IJWTInfo getJwtInfo(HttpServletRequest request) { + IJWTInfo infoFromToken = null; + try { + String authToken = request.getHeader(userAuthConfig.getTokenHeader()); + if(StringUtils.isEmpty(authToken)) { + infoFromToken = null; + } else { + infoFromToken = userAuthUtil.getInfoFromToken(authToken); + } + } catch (Exception e) { + infoFromToken = null; + } + return infoFromToken; + } + +} diff --git a/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/fallback/RouteFallbackProvider.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/fallback/RouteFallbackProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..da05f13526e2446d6017f6d1b25fa10c45ab3523 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/fallback/RouteFallbackProvider.java @@ -0,0 +1,72 @@ +package com.github.wxiaoqi.security.gate.fallback; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + + +/** + * @author ace + */ +@Slf4j +@Component +public class RouteFallbackProvider implements FallbackProvider { + + public ClientHttpResponse fallbackResponse(Throwable cause) { + return new ClientHttpResponse() { + @Override + public HttpStatus getStatusCode() { + return HttpStatus.SERVICE_UNAVAILABLE; + } + + @Override + public int getRawStatusCode() { + return HttpStatus.SERVICE_UNAVAILABLE.value(); + } + + @Override + public String getStatusText() { + return HttpStatus.SERVICE_UNAVAILABLE.getReasonPhrase(); + } + + @Override + public void close() { + } + + @Override + public InputStream getBody() { + if (cause != null && cause.getMessage() != null) { + log.error("调用:{} 异常:{}", getRoute(), cause.getMessage()); + return new ByteArrayInputStream(cause.getMessage().getBytes()); + } else { + log.error("调用:{} 异常:{}", getRoute(), "服务不可用"); + return new ByteArrayInputStream("服务不可用".getBytes()); + } + } + + @Override + public HttpHeaders getHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + return headers; + } + }; + } + + @Override + public String getRoute() { + return "*"; + } + + @Override + public ClientHttpResponse fallbackResponse(String s, Throwable throwable) { + return fallbackResponse(null); + } +} \ No newline at end of file diff --git a/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/fallback/UserServiceFallback.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/fallback/UserServiceFallback.java new file mode 100644 index 0000000000000000000000000000000000000000..792afd41b3dca8fb1b3b843d54b5f8770965e662 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/fallback/UserServiceFallback.java @@ -0,0 +1,29 @@ +package com.github.wxiaoqi.security.gate.fallback; + +import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; +import com.github.wxiaoqi.security.gate.feign.IUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +/** + * @author ace + * @create 2018/3/7. + */ +@Service +@Slf4j +public class UserServiceFallback implements IUserService{ + @Override + public List getPermissionByUsername(@PathVariable("username") String username) { + log.error("调用{}异常{}","getPermissionByUsername",username); + return null; + } + + @Override + public List getAllPermissionInfo() { + log.error("调用{}异常","getPermissionByUsername"); + return null; + } +} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/rpc/ILogService.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/feign/ILogService.java similarity index 72% rename from ace-gate/src/main/java/com/github/wxiaoqi/security/gate/rpc/ILogService.java rename to ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/feign/ILogService.java index a89938b73cfbd131d07c69ba3941034c806adab6..237c9fa0b11bc7cadf42e9b2fa8327e5483d25cb 100644 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/rpc/ILogService.java +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/feign/ILogService.java @@ -1,7 +1,7 @@ -package com.github.wxiaoqi.security.gate.rpc; +package com.github.wxiaoqi.security.gate.feign; import com.github.wxiaoqi.security.api.vo.log.LogInfo; -import org.springframework.cloud.netflix.feign.FeignClient; +import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestMethod; * @author wanghaobin * @create 2017-07-01 15:16 */ -@FeignClient("admin-back") +@FeignClient("ace-admin") public interface ILogService { @RequestMapping(value="/api/log/save",method = RequestMethod.POST) public void saveLog(LogInfo info); diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/rpc/IUserService.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/feign/IUserService.java similarity index 48% rename from ace-gate/src/main/java/com/github/wxiaoqi/security/gate/rpc/IUserService.java rename to ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/feign/IUserService.java index 242ba7f38501a9401fc56829f70a1c4314ceda23..5595d9819952b9c805766da273c16e2bfce324e5 100644 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/rpc/IUserService.java +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/feign/IUserService.java @@ -1,8 +1,8 @@ -package com.github.wxiaoqi.security.gate.rpc; +package com.github.wxiaoqi.security.gate.feign; import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; -import com.github.wxiaoqi.security.api.vo.user.UserInfo; -import org.springframework.cloud.netflix.feign.FeignClient; +import com.github.wxiaoqi.security.gate.fallback.UserServiceFallback; +import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -16,13 +16,10 @@ import java.util.List; * @author wanghaobin * @create 2017-06-21 8:11 */ -@FeignClient("admin-back") -@RequestMapping("api") +@FeignClient(value = "ace-admin",fallback = UserServiceFallback.class) public interface IUserService { - @RequestMapping(value = "/user/username/{username}", method = RequestMethod.GET) - public UserInfo getUserByUsername(@PathVariable("username") String username); - @RequestMapping(value = "/user/un/{username}/permissions", method = RequestMethod.GET) + @RequestMapping(value="/api/user/un/{username}/permissions",method = RequestMethod.GET) public List getPermissionByUsername(@PathVariable("username") String username); - @RequestMapping(value = "/permissions", method = RequestMethod.GET) + @RequestMapping(value="/api/permissions",method = RequestMethod.GET) List getAllPermissionInfo(); } diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/filter/SessionAccessFilter.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/filter/AdminAccessFilter.java similarity index 34% rename from ace-gate/src/main/java/com/github/wxiaoqi/security/gate/filter/SessionAccessFilter.java rename to ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/filter/AdminAccessFilter.java index d54408a6693177e9c12fc027e369b7e8b284e333..f875083c46297f557fe394eb1fa9a40e71eefa9d 100644 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/filter/SessionAccessFilter.java +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/filter/AdminAccessFilter.java @@ -1,31 +1,38 @@ package com.github.wxiaoqi.security.gate.filter; +import com.alibaba.fastjson.JSON; import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; import com.github.wxiaoqi.security.api.vo.log.LogInfo; -import com.github.wxiaoqi.security.api.vo.user.UserInfo; +import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.client.jwt.ServiceAuthUtil; +import com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil; +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.common.context.BaseContextHandler; +import com.github.wxiaoqi.security.common.msg.auth.TokenErrorResponse; +import com.github.wxiaoqi.security.common.msg.auth.TokenForbiddenResponse; import com.github.wxiaoqi.security.common.util.ClientUtil; -import com.github.wxiaoqi.security.gate.rpc.ILogService; -import com.github.wxiaoqi.security.gate.rpc.IUserService; +import com.github.wxiaoqi.security.gate.feign.ILogService; +import com.github.wxiaoqi.security.gate.feign.IUserService; import com.github.wxiaoqi.security.gate.utils.DBLog; -import com.google.common.base.Predicate; -import com.google.common.collect.Collections2; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.context.SecurityContextImpl; -import org.springframework.security.core.userdetails.User; -import org.springframework.session.Session; -import org.springframework.session.SessionRepository; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; -import org.springframework.util.Base64Utils; +import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; import java.net.URLEncoder; -import java.util.*; +import java.util.Date; +import java.util.List; +import java.util.function.Predicate; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * ${DESCRIPTION} @@ -35,24 +42,30 @@ import java.util.regex.Pattern; */ @Component @Slf4j -public class SessionAccessFilter extends ZuulFilter { - @Autowired - private SessionRepository repository; +public class AdminAccessFilter extends ZuulFilter { @Autowired + @Lazy private IUserService userService; @Autowired + @Lazy private ILogService logService; @Value("${gate.ignore.startWith}") private String startWith; - @Value("${gate.ignore.contain}") - private String contain; - @Value("${gate.oauth.prefix}") - private String oauthPrefix; - public SessionAccessFilter() { - super(); - } + @Value("${zuul.prefix}") + private String zuulPrefix; + @Autowired + private UserAuthUtil userAuthUtil; + + @Autowired + private ServiceAuthConfig serviceAuthConfig; + + @Autowired + private UserAuthConfig userAuthConfig; + + @Autowired + private ServiceAuthUtil serviceAuthUtil; @Override public String filterType() { @@ -72,152 +85,125 @@ public class SessionAccessFilter extends ZuulFilter { @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); - HttpSession httpSession = ctx.getRequest().getSession(); HttpServletRequest request = ctx.getRequest(); - final String requestUri = request.getRequestURI(); + final String requestUri = request.getRequestURI().substring(zuulPrefix.length()); final String method = request.getMethod(); - User user = getSessionUser(httpSession); - String username = null; - if(user!=null) { - username = user.getUsername(); - // 设置头部校验信息 - ctx.addZuulRequestHeader("Authorization", - Base64Utils.encodeToString(user.getUsername().getBytes())); - // 查找合法链接 - } + BaseContextHandler.setToken(null); // 不进行拦截的地址 - if (isStartWith(requestUri) || isContains(requestUri)|| isOAuth(requestUri)) + if (isStartWith(requestUri)) { return null; - List permissionInfos = userService.getAllPermissionInfo(); + } + IJWTInfo user = null; + try { + user = getJWTUser(request, ctx); + } catch (Exception e) { + setFailedRequest(JSON.toJSONString(new TokenErrorResponse(e.getMessage())), 200); + return null; + } + List permissionIfs = userService.getAllPermissionInfo(); // 判断资源是否启用权限约束 - Collection result = getPermissionInfos(requestUri, method, permissionInfos); - if(result.size()>0){ - if(username!=null) - checkAllow(requestUri, method, ctx, username); + Stream stream = getPermissionIfs(requestUri, method, permissionIfs); + List result = stream.collect(Collectors.toList()); + PermissionInfo[] permissions = result.toArray(new PermissionInfo[]{}); + if (permissions.length > 0) { + checkUserPermission(permissions, ctx, user); } + // 申请客户端密钥头 + ctx.addZuulRequestHeader(serviceAuthConfig.getTokenHeader(), serviceAuthUtil.getClientToken()); return null; } /** * 获取目标权限资源 + * * @param requestUri * @param method * @param serviceInfo * @return */ - private Collection getPermissionInfos(final String requestUri, final String method, List serviceInfo) { - return Collections2.filter(serviceInfo, new Predicate() { - @Override - public boolean apply(PermissionInfo permissionInfo) { - String url = permissionInfo.getUri(); - String uri = url.replaceAll("\\{\\*\\}", "[a-zA-Z\\\\d]+"); - String regEx = "^" + uri + "$"; - return (Pattern.compile(regEx).matcher(requestUri).find() || requestUri.startsWith(url + "/")) - && method.equals(permissionInfo.getMethod()); - } - }); + private Stream getPermissionIfs(final String requestUri, final String method, List serviceInfo) { + return serviceInfo.parallelStream().filter(new Predicate() { + @Override + public boolean test(PermissionInfo permissionInfo) { + String url = permissionInfo.getUri(); + String uri = url.replaceAll("\\{\\*\\}", "[a-zA-Z\\\\d]+"); + String regEx = "^" + uri + "$"; + return (Pattern.compile(regEx).matcher(requestUri).find() || requestUri.startsWith(url + "/")) + && method.equals(permissionInfo.getMethod()); + } + }); } - private void setCurrentUserInfoAndLog(RequestContext ctx, String username, PermissionInfo pm) { - UserInfo info = userService.getUserByUsername(username); - String host = ClientUtil.getClientIp(ctx.getRequest()); - ctx.addZuulRequestHeader("userId", info.getId()); - ctx.addZuulRequestHeader("userName", URLEncoder.encode(info.getName())); + private void setCurrentUserInfoAndLog(RequestContext ctx, IJWTInfo user, PermissionInfo pm) { + String host = ClientUtil.getClientIp(ctx.getRequest()); + ctx.addZuulRequestHeader("userId", user.getId()); + ctx.addZuulRequestHeader("userName", URLEncoder.encode(user.getName())); ctx.addZuulRequestHeader("userHost", ClientUtil.getClientIp(ctx.getRequest())); - LogInfo logInfo = new LogInfo(pm.getMenu(),pm.getName(),pm.getUri(),new Date(),info.getId(),info.getName(),host); + LogInfo logInfo = new LogInfo(pm.getMenu(), pm.getName(), pm.getUri(), new Date(), user.getId(), user.getName(), host); DBLog.getInstance().setLogService(logService).offerQueue(logInfo); } - /** - * 判定是否oauth资源 - * @param requestUri - * @return - */ - private boolean isOAuth(String requestUri) { - return requestUri.startsWith(oauthPrefix); - } - /** * 返回session中的用户信息 - * @param httpSession - * @return - */ - private User getSessionUser(HttpSession httpSession) { - Session session = repository.getSession(httpSession.getId()); - if(httpSession.getAttribute("SPRING_SECURITY_CONTEXT")==null) - return null; - SecurityContextImpl securityContextImpl = - (SecurityContextImpl) httpSession.getAttribute("SPRING_SECURITY_CONTEXT"); - return (User) securityContextImpl.getAuthentication().getPrincipal(); - } - - /** - * 读取权限 + * * @param request - * @param username + * @param ctx * @return */ - private List getPermissionInfos(HttpServletRequest request, String username) { - List permissionInfos; - if (request.getSession().getAttribute("permission") == null) { - permissionInfos = userService.getPermissionByUsername(username); - request.getSession().setAttribute("permission", permissionInfos); - } else { - permissionInfos = (List) request.getSession().getAttribute("permission"); + private IJWTInfo getJWTUser(HttpServletRequest request, RequestContext ctx) throws Exception { + String authToken = request.getHeader(userAuthConfig.getTokenHeader()); + if (StringUtils.isBlank(authToken)) { + authToken = request.getParameter("token"); } - return permissionInfos; + ctx.addZuulRequestHeader(userAuthConfig.getTokenHeader(), authToken); + BaseContextHandler.setToken(authToken); + return userAuthUtil.getInfoFromToken(authToken); } - /** - * 权限校验 - * @param requestUri - * @param method - */ - private void checkAllow(final String requestUri, final String method ,RequestContext ctx,String username) { - log.debug("uri:" + requestUri + "----method:" + method); - List permissionInfos = getPermissionInfos(ctx.getRequest(), username) ; - Collection result = getPermissionInfos(requestUri, method, permissionInfos); - if (result.size() <= 0) { - setFailedRequest("403 Forbidden!", 403); - } else{ - PermissionInfo[] pms = result.toArray(new PermissionInfo[]{}); - PermissionInfo pm = pms[0]; - if(!method.equals("GET")){ - setCurrentUserInfoAndLog(ctx, username, pm); + + private void checkUserPermission(PermissionInfo[] permissions, RequestContext ctx, IJWTInfo user) { + List permissionInfos = userService.getPermissionByUsername(user.getUniqueName()); + PermissionInfo current = null; + for (PermissionInfo info : permissions) { + boolean anyMatch = permissionInfos.parallelStream().anyMatch(new Predicate() { + @Override + public boolean test(PermissionInfo permissionInfo) { + return permissionInfo.getCode().equals(info.getCode()); + } + }); + if (anyMatch) { + current = info; + break; } } - } - - /** - * 是否包含某种特征 - * @param requestUri - * @return - */ - private boolean isContains(String requestUri) { - boolean flag = false; - for (String s : contain.split(",")) { - if (requestUri.contains(s)) - return true; + if (current == null) { + setFailedRequest(JSON.toJSONString(new TokenForbiddenResponse("Token Forbidden!")), 200); + } else { + if (!RequestMethod.GET.toString().equals(current.getMethod())) { + setCurrentUserInfoAndLog(ctx, user, current); + } } - return flag; } + /** * URI是否以什么打头 + * * @param requestUri * @return */ private boolean isStartWith(String requestUri) { boolean flag = false; for (String s : startWith.split(",")) { - if (requestUri.startsWith(s)) + if (requestUri.startsWith(s)) { return true; + } } return flag; } /** - * Reports an error message given a response body and code. + * 网关抛异常 * * @param body * @param code @@ -229,7 +215,7 @@ public class SessionAccessFilter extends ZuulFilter { if (ctx.getResponseBody() == null) { ctx.setResponseBody(body); ctx.setSendZuulResponse(false); - throw new RuntimeException("Code: " + code + ", " + body); //optional } } + } diff --git a/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/filter/ClearFilter.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/filter/ClearFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..6454040ddac50b579cf58b34dbc0d4d750070df0 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/filter/ClearFilter.java @@ -0,0 +1,39 @@ +package com.github.wxiaoqi.security.gate.filter; + +import com.github.wxiaoqi.security.common.context.BaseContextHandler; +import com.netflix.zuul.ZuulFilter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * ${DESCRIPTION} + * + * @author wanghaobin + * @create 2017-06-23 8:25 + */ +@Component +@Slf4j +public class ClearFilter extends ZuulFilter { + + @Override + public String filterType() { + return "post"; + } + + @Override + public int filterOrder() { + return 1; + } + + @Override + public boolean shouldFilter() { + return true; + } + + @Override + public Object run() { + BaseContextHandler.remove(); + return null; + } + +} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/utils/DBLog.java b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/utils/DBLog.java similarity index 91% rename from ace-gate/src/main/java/com/github/wxiaoqi/security/gate/utils/DBLog.java rename to ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/utils/DBLog.java index 62a9cc910a73ae4a7e237cdb3d2bb7e37791ea53..8778437fbb46d7df95fe40e1c2c7dbb9fe27ae5f 100644 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/utils/DBLog.java +++ b/ace-gate/ace-gate-zuul/src/main/java/com/github/wxiaoqi/security/gate/utils/DBLog.java @@ -1,7 +1,7 @@ package com.github.wxiaoqi.security.gate.utils; import com.github.wxiaoqi.security.api.vo.log.LogInfo; -import com.github.wxiaoqi.security.gate.rpc.ILogService; +import com.github.wxiaoqi.security.gate.feign.ILogService; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; @@ -25,8 +25,9 @@ public class DBLog extends Thread { } public DBLog setLogService(ILogService logService) { - if(this.logService==null) + if(this.logService==null) { this.logService = logService; + } return this; } @@ -50,6 +51,7 @@ public class DBLog extends Thread { } } + @Override public void run() { List bufferedLogList = new ArrayList(); // 缓冲队列 while (true) { diff --git a/ace-gate/ace-gate-zuul/src/main/resources/application.yml b/ace-gate/ace-gate-zuul/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..62a8b800601132a452d83ed5fe8627fa27fc3da8 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/resources/application.yml @@ -0,0 +1,98 @@ +spring: + application: + name: ace-gate + thymeleaf: + mode: LEGACYHTML5 + cache: false + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + default-property-inclusion: non_null + redis: + database: 1 + host: 127.0.0.1 + jedis: + pool: + max-active: 20 + rabbitmq: + host: ${RABBIT_MQ_HOST:localhost} + port: ${RABBIT_MQ_PORT:5672} + username: guest + password: guest + sleuth: + enabled: true + http: + legacy: + enabled: true +server: + port: 8766 #启动端口 + + +# +zuul: + ignored-services: "*" + sensitive-headers: + prefix: /api #为zuul设置一个公共的前缀 + ratelimit: # 网关限流 + key-prefix: gate_rate + enabled: true + repository: REDIS #REDIS, JPA, IN_MEMORY + behind-proxy: true + default-policy: #optional - will apply unless specific policy exists + limit: 200 + refresh-interval: 60 #default value (in seconds) + type: #optional + - user + - origin + - url + routes: + back: + path: /admin/** + serviceId: ace-admin + + auth: + path: /auth/** + serviceId: ace-auth + +ribbon: + eureka: + enabled: true + ReadTimeout: 30000 + ConnectTimeout: 30000 + MaxAutoRetries: 0 + MaxAutoRetriesNextServer: 1 + OkToRetryOnAllOperations: false + httpclient: + enabled: false + okhttp: + enabled: true + + +hystrix: + threadpool: + default: + coreSize: 1000 ##并发执行的最大线程数,默认10 + maxQueueSize: 1000 ##BlockingQueue的最大队列数 + queueSizeRejectionThreshold: 500 ##即使maxQueueSize没有达到,达到queueSizeRejectionThreshold该值后,请求也会被拒绝 + command: + default: + execution: + isolation: + thread: + timeoutInMilliseconds: 50000 + strategy: SEMAPHORE + + +gate: + ignore: + startWith: /static,/auth/jwt + + +auth: + serviceId: ace-auth + user: + token-header: Authorization + client: + token-header: x-client-token + id: ace-gate #不填则默认读取spring.application.name + secret: 123456 diff --git a/ace-gate/ace-gate-zuul/src/main/resources/bootstrap.yml b/ace-gate/ace-gate-zuul/src/main/resources/bootstrap.yml new file mode 100644 index 0000000000000000000000000000000000000000..637ebced772bffad8f649c45c142c02101ebe1e3 --- /dev/null +++ b/ace-gate/ace-gate-zuul/src/main/resources/bootstrap.yml @@ -0,0 +1,28 @@ +eureka: + instance: + statusPageUrlPath: /actuator/info + healthCheckUrlPath: /actuator/health + home-page-url-path: / + # docker 部署开启 +# prefer-ip-address: true +# ip-address: 127.0.0.1 + client: + serviceUrl: +# defaultZone: http://localhost:8761/eureka/ + # docker 部署开启 + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ + +#请求和响应GZIP压缩支持 +feign: + httpclient: + enabled: false + okhttp: + enabled: true + compression: + request: + enabled: true + mime-types: text/xml,application/xml,application/json + min-request-size: 2048 + response: + enabled: true + diff --git a/ace-gate/ace-gateway-v2/pom.xml b/ace-gate/ace-gateway-v2/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..bc0c083364e170b7878e5f121495a98180112bee --- /dev/null +++ b/ace-gate/ace-gateway-v2/pom.xml @@ -0,0 +1,105 @@ + + + + ace-gate + com.github.wxiaoqi + 2.0-SNAPSHOT + + 4.0.0 + + ace-gateway-v2 + + + UTF-8 + UTF-8 + 1.8 + 1.1.51 + + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.cloud + spring-cloud-starter-gateway + + + org.isomorphism + token-bucket + 1.7 + + + org.springframework.boot + spring-boot-starter-test + test + + + io.projectreactor + reactor-test + test + + + org.assertj + assertj-core + test + + + org.jetbrains.kotlin + kotlin-stdlib + ${kotlin.version} + true + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + true + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + + org.springframework.cloud + spring-cloud-sleuth-zipkin + + + org.springframework.amqp + spring-rabbit + + + + com.github.wxiaoqi + ace-interface + 2.0-SNAPSHOT + + + com.github.wxiaoqi + ace-auth-client + 2.0-SNAPSHOT + + + com.github.wxiaoqi + ace-common + 2.0-SNAPSHOT + + + com.alibaba + fastjson + + + \ No newline at end of file diff --git a/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/GatewayServerBootstrap.java b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/GatewayServerBootstrap.java new file mode 100644 index 0000000000000000000000000000000000000000..6f6e09af27acd80b393359e1b50469689399e401 --- /dev/null +++ b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/GatewayServerBootstrap.java @@ -0,0 +1,21 @@ +package com.github.wxiaoqi.security.gate.v2; + +import com.github.wxiaoqi.security.auth.client.EnableAceAuthClient; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +/** + * @author ace + * @create 2018/3/12. + */ +@SpringBootApplication +@EnableDiscoveryClient +@EnableAceAuthClient +@EnableFeignClients({"com.github.wxiaoqi.security.auth.client.feign","com.github.wxiaoqi.security.gate.v2.feign"}) +public class GatewayServerBootstrap { + public static void main(String[] args) { + SpringApplication.run(GatewayServerBootstrap.class, args); + } +} diff --git a/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/config/RouteConfiguration.java b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/config/RouteConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..a8711f00536d846fa2338ff3eed2efdf687513ae --- /dev/null +++ b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/config/RouteConfiguration.java @@ -0,0 +1,21 @@ +package com.github.wxiaoqi.security.gate.v2.config; + + +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator; +import org.springframework.cloud.gateway.route.RouteDefinitionLocator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * @author ace + * @create 2018/3/12. + */ +@Configuration +public class RouteConfiguration { + @Bean + public RouteDefinitionLocator discoveryClientRouteDefinitionLocator(DiscoveryClient discoveryClient) { + return new DiscoveryClientRouteDefinitionLocator(discoveryClient); + } +} diff --git a/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/fallback/UserServiceFallback.java b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/fallback/UserServiceFallback.java new file mode 100644 index 0000000000000000000000000000000000000000..628dbdb4c41d59482ffe1910143570812bef5ccf --- /dev/null +++ b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/fallback/UserServiceFallback.java @@ -0,0 +1,29 @@ +package com.github.wxiaoqi.security.gate.v2.fallback; + +import com.github.wxiaoqi.security.gate.v2.feign.IUserService; +import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.PathVariable; + +import java.util.List; + +/** + * @author ace + * @create 2018/3/7. + */ +@Service +@Slf4j +public class UserServiceFallback implements IUserService { + @Override + public List getPermissionByUsername(@PathVariable("username") String username) { + log.error("调用{}异常{}","getPermissionByUsername",username); + return null; + } + + @Override + public List getAllPermissionInfo() { + log.error("调用{}异常","getPermissionByUsername"); + return null; + } +} diff --git a/ace-monitor/src/main/java/com/github/wxiaoqi/security/monitor/rest/SecurityController.java b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/feign/ILogService.java similarity index 32% rename from ace-monitor/src/main/java/com/github/wxiaoqi/security/monitor/rest/SecurityController.java rename to ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/feign/ILogService.java index 2efc3864362cdebe1c4a76671802cae220a72a2f..309d70bc990c2c55b6a3d2305aace574dbaf09f5 100644 --- a/ace-monitor/src/main/java/com/github/wxiaoqi/security/monitor/rest/SecurityController.java +++ b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/feign/ILogService.java @@ -1,6 +1,7 @@ -package com.github.wxiaoqi.security.monitor.rest; +package com.github.wxiaoqi.security.gate.v2.feign; -import org.springframework.stereotype.Controller; +import com.github.wxiaoqi.security.api.vo.log.LogInfo; +import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -8,12 +9,10 @@ import org.springframework.web.bind.annotation.RequestMethod; * ${DESCRIPTION} * * @author wanghaobin - * @create 2017-06-02 13:43 + * @create 2017-07-01 15:16 */ -@Controller -public class SecurityController { - @RequestMapping(value = "/login",method = RequestMethod.GET) - public String login() { - return "login"; - } +@FeignClient("ace-admin") +public interface ILogService { + @RequestMapping(value="/api/log/save",method = RequestMethod.POST) + public void saveLog(LogInfo info); } diff --git a/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/feign/IUserService.java b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/feign/IUserService.java new file mode 100644 index 0000000000000000000000000000000000000000..c21b328d4d8d345142d691b3badd35a3a18131dd --- /dev/null +++ b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/feign/IUserService.java @@ -0,0 +1,25 @@ +package com.github.wxiaoqi.security.gate.v2.feign; + +import com.github.wxiaoqi.security.gate.v2.fallback.UserServiceFallback; +import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.List; + + +/** + * ${DESCRIPTION} + * + * @author wanghaobin + * @create 2017-06-21 8:11 + */ +@FeignClient(value = "ace-admin",fallback = UserServiceFallback.class) +public interface IUserService { + @RequestMapping(value="/api/user/un/{username}/permissions",method = RequestMethod.GET) + public List getPermissionByUsername(@PathVariable("username") String username); + @RequestMapping(value="/api/permissions",method = RequestMethod.GET) + List getAllPermissionInfo(); +} diff --git a/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/filter/AccessGatewayFilter.java b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/filter/AccessGatewayFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..e62a79534b0cdf1ed5aef74d65d4e9426965caee --- /dev/null +++ b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/filter/AccessGatewayFilter.java @@ -0,0 +1,233 @@ +package com.github.wxiaoqi.security.gate.v2.filter; + +import com.alibaba.fastjson.JSONObject; +import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; +import com.github.wxiaoqi.security.api.vo.log.LogInfo; +import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; +import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.client.jwt.ServiceAuthUtil; +import com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil; +import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; +import com.github.wxiaoqi.security.common.context.BaseContextHandler; +import com.github.wxiaoqi.security.common.msg.BaseResponse; +import com.github.wxiaoqi.security.common.msg.auth.TokenErrorResponse; +import com.github.wxiaoqi.security.common.msg.auth.TokenForbiddenResponse; +import com.github.wxiaoqi.security.common.util.ClientUtil; +import com.github.wxiaoqi.security.gate.v2.feign.ILogService; +import com.github.wxiaoqi.security.gate.v2.feign.IUserService; +import com.github.wxiaoqi.security.gate.v2.utils.DBLog; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.List; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author ace + * @create 2018/3/12. + */ +@Configuration +@Slf4j +public class AccessGatewayFilter implements GlobalFilter { + @Autowired + @Lazy + private IUserService userService; + @Autowired + @Lazy + private ILogService logService; + + @Value("${gate.ignore.startWith}") + private String startWith; + + // @Value("${zuul.prefix}") +// private String zuulPrefix; + @Autowired + private UserAuthUtil userAuthUtil; + + @Autowired + private ServiceAuthConfig serviceAuthConfig; + + @Autowired + private UserAuthConfig userAuthConfig; + + @Autowired + private ServiceAuthUtil serviceAuthUtil; + + @Override + public Mono filter(ServerWebExchange serverWebExchange, GatewayFilterChain gatewayFilterChain) { + log.info("check token and user permission...."); + ServerHttpRequest request = serverWebExchange.getRequest(); + final String requestUri = request.getPath().pathWithinApplication().value(); + final String method = request.getMethod().toString(); + BaseContextHandler.setToken(null); + ServerHttpRequest.Builder mutate = request.mutate(); + // 不进行拦截的地址 + if (isStartWith(requestUri)) { + ServerHttpRequest build = mutate.build(); + return gatewayFilterChain.filter(serverWebExchange.mutate().request(build).build()); + } + IJWTInfo user = null; + try { + user = getJWTUser(request, mutate); + } catch (Exception e) { + log.error("用户Token过期异常", e); + return getVoidMono(serverWebExchange, new TokenForbiddenResponse("User Token Forbidden or Expired!")); + } + List permissionIfs = userService.getAllPermissionInfo(); + // 判断资源是否启用权限约束 + Stream stream = getPermissionIfs(requestUri, method, permissionIfs); + List result = stream.collect(Collectors.toList()); + PermissionInfo[] permissions = result.toArray(new PermissionInfo[]{}); + if (permissions.length > 0) { + if (checkUserPermission(permissions, serverWebExchange, user)) { + return getVoidMono(serverWebExchange, new TokenForbiddenResponse("User Forbidden!Does not has Permission!")); + } + } + // 申请客户端密钥头 + mutate.header(serviceAuthConfig.getTokenHeader(), serviceAuthUtil.getClientToken()); + ServerHttpRequest build = mutate.build(); + return gatewayFilterChain.filter(serverWebExchange.mutate().request(build).build()); + + } + + /** + * 网关抛异常 + * + * @param body + */ + @NotNull + private Mono getVoidMono(ServerWebExchange serverWebExchange, BaseResponse body) { + serverWebExchange.getResponse().setStatusCode(HttpStatus.OK); + byte[] bytes = JSONObject.toJSONString(body).getBytes(StandardCharsets.UTF_8); + DataBuffer buffer = serverWebExchange.getResponse().bufferFactory().wrap(bytes); + return serverWebExchange.getResponse().writeWith(Flux.just(buffer)); + } + + + /** + * 获取目标权限资源 + * + * @param requestUri + * @param method + * @param serviceInfo + * @return + */ + private Stream getPermissionIfs(final String requestUri, final String method, List serviceInfo) { + return serviceInfo.parallelStream().filter(new Predicate() { + @Override + public boolean test(PermissionInfo permissionInfo) { + String url = permissionInfo.getUri(); + String uri = url.replaceAll("\\{\\*\\}", "[a-zA-Z\\\\d]+"); + String regEx = "^" + uri + "$"; + return (Pattern.compile(regEx).matcher(requestUri).find() || requestUri.startsWith(url + "/")) + && method.equals(permissionInfo.getMethod()); + } + }); + } + + private void setCurrentUserInfoAndLog(ServerWebExchange serverWebExchange, IJWTInfo user, PermissionInfo pm) { + String host = ClientUtil.getClientIp((HttpServletRequest) serverWebExchange.getRequest()); + LogInfo logInfo = new LogInfo(pm.getMenu(), pm.getName(), pm.getUri(), new Date(), user.getId(), user.getName(), host); + DBLog.getInstance().setLogService(logService).offerQueue(logInfo); + } + + /** + * 返回session中的用户信息 + * + * @param request + * @param ctx + * @return + */ + private IJWTInfo getJWTUser(ServerHttpRequest request, ServerHttpRequest.Builder ctx) throws Exception { + List strings = request.getHeaders().get(userAuthConfig.getTokenHeader()); + String authToken = null; + if (strings != null) { + authToken = strings.get(0); + } + if (StringUtils.isBlank(authToken)) { + strings = request.getQueryParams().get("token"); + if (strings != null) { + authToken = strings.get(0); + } + } + ctx.header(userAuthConfig.getTokenHeader(), authToken); + BaseContextHandler.setToken(authToken); + return userAuthUtil.getInfoFromToken(authToken); + } + + + private boolean checkUserPermission(PermissionInfo[] permissions, ServerWebExchange ctx, IJWTInfo user) { + List permissionInfos = userService.getPermissionByUsername(user.getUniqueName()); + PermissionInfo current = null; + for (PermissionInfo info : permissions) { + boolean anyMatch = permissionInfos.parallelStream().anyMatch(new Predicate() { + @Override + public boolean test(PermissionInfo permissionInfo) { + return permissionInfo.getCode().equals(info.getCode()); + } + }); + if (anyMatch) { + current = info; + break; + } + } + if (current == null) { + return true; + } else { + if (!RequestMethod.GET.toString().equals(current.getMethod())) { + setCurrentUserInfoAndLog(ctx, user, current); + } + return false; + } + } + + + /** + * URI是否以什么打头 + * + * @param requestUri + * @return + */ + private boolean isStartWith(String requestUri) { + boolean flag = false; + for (String s : startWith.split(",")) { + if (requestUri.startsWith(s)) { + return true; + } + } + return flag; + } + + /** + * 网关抛异常 + * + * @param body + * @param code + */ + private Mono setFailedRequest(ServerWebExchange serverWebExchange, String body, int code) { + serverWebExchange.getResponse().setStatusCode(HttpStatus.OK); + return serverWebExchange.getResponse().setComplete(); + } + +} diff --git a/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/utils/DBLog.java b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/utils/DBLog.java new file mode 100644 index 0000000000000000000000000000000000000000..0b5794d209583386911c304148607dd514162c3d --- /dev/null +++ b/ace-gate/ace-gateway-v2/src/main/java/com/github/wxiaoqi/security/gate/v2/utils/DBLog.java @@ -0,0 +1,84 @@ +package com.github.wxiaoqi.security.gate.v2.utils; + +import com.github.wxiaoqi.security.api.vo.log.LogInfo; +import com.github.wxiaoqi.security.gate.v2.feign.ILogService; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +/** + * ${DESCRIPTION} + * + * @author wanghaobin + * @create 2017-07-01 15:28 + */ +@Slf4j +public class DBLog extends Thread { + private static DBLog dblog = null; + private static BlockingQueue logInfoQueue = new LinkedBlockingQueue(1024); + + public ILogService getLogService() { + return logService; + } + + public DBLog setLogService(ILogService logService) { + if(this.logService==null) { + this.logService = logService; + } + return this; + } + + private ILogService logService; + public static synchronized DBLog getInstance() { + if (dblog == null) { + dblog = new DBLog(); + } + return dblog; + } + + private DBLog() { + super("CLogOracleWriterThread"); + } + + public void offerQueue(LogInfo logInfo) { + try { + logInfoQueue.offer(logInfo); + } catch (Exception e) { + log.error("日志写入失败", e); + } + } + + @Override + public void run() { + List bufferedLogList = new ArrayList(); // 缓冲队列 + while (true) { + try { + bufferedLogList.add(logInfoQueue.take()); + logInfoQueue.drainTo(bufferedLogList); + if (bufferedLogList != null && bufferedLogList.size() > 0) { + // 写入日志 + for(LogInfo log:bufferedLogList){ + logService.saveLog(log); + } + } + } catch (Exception e) { + e.printStackTrace(); + // 防止缓冲队列填充数据出现异常时不断刷屏 + try { + Thread.sleep(1000); + } catch (Exception eee) { + } + } finally { + if (bufferedLogList != null && bufferedLogList.size() > 0) { + try { + bufferedLogList.clear(); + } catch (Exception e) { + } + } + } + } + } +} \ No newline at end of file diff --git a/ace-gate/ace-gateway-v2/src/main/resources/application.yml b/ace-gate/ace-gateway-v2/src/main/resources/application.yml new file mode 100644 index 0000000000000000000000000000000000000000..7719920e4c620d5a0f2ad502851b46c770b19435 --- /dev/null +++ b/ace-gate/ace-gateway-v2/src/main/resources/application.yml @@ -0,0 +1,97 @@ +server: + port: 8765 + +eureka: + instance: + statusPageUrlPath: /actuator/info + healthCheckUrlPath: /actuator/health + home-page-url-path: / + # docker 部署开启 +# prefer-ip-address: true +# ip-address: 127.0.0.1 + client: + serviceUrl: +# defaultZone: http://localhost:8761/eureka/ + # docker 部署开启 + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ + +#请求和响应GZIP压缩支持 +feign: + httpclient: + enabled: false + okhttp: + enabled: true + compression: + request: + enabled: true + mime-types: text/xml,application/xml,application/json + min-request-size: 2048 + response: + enabled: true + +spring: + application: + name: ace-gateway-v2 + redis: + database: 1 + host: 127.0.0.1 + jedis: + pool: + max-active: 20 + rabbitmq: + host: ${RABBIT_MQ_HOST:localhost} + port: ${RABBIT_MQ_PORT:5672} + username: guest + password: guest + sleuth: + enabled: true + http: + legacy: + enabled: true + cloud: + gateway: + locator: + enabled: true + routes: + # ===================================== + - id: ace-auth + uri: lb://ace-auth + order: 8000 + predicates: + - Path=/api/auth/** + filters: + - StripPrefix=2 + - id: ace-admin + uri: lb://ace-admin + order: 8001 + predicates: + - Path=/api/admin/** + filters: + - StripPrefix=2 + +logging: + level: + com.github.wxiaoqi.security.gate.v2: info + +management: + endpoints: + web: + exposure: + include: '*' + security: + enabled: false + + +gate: + ignore: + startWith: /jwt + + +auth: + serviceId: ace-auth + user: + token-header: Authorization + client: + token-header: x-client-token + id: ace-gate #不填则默认读取spring.application.name + secret: 123456 diff --git a/ace-gate/pom.xml b/ace-gate/pom.xml index 7a9a42ca745f92011ca6b06c9774b3d39d87c6e1..7d566332626db2343d110ac20f36a60a5ab5aece 100644 --- a/ace-gate/pom.xml +++ b/ace-gate/pom.xml @@ -5,114 +5,16 @@ ace-security com.github.wxiaoqi - 1.0-SNAPSHOT + 2.0-SNAPSHOT 4.0.0 ace-gate - - - org.springframework.boot - spring-boot-starter-undertow - - - org.springframework.cloud - spring-cloud-starter-zuul - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - net.sourceforge.nekohtml - nekohtml - - - com.github.wxiaoqi - ace-api - 1.0-SNAPSHOT - - - com.github.wxiaoqi - ace-common - 1.0-SNAPSHOT - - - org.springframework.cloud - spring-cloud-starter-feign - - - org.springframework.cloud - spring-cloud-starter-eureka - - - org.springframework.session - spring-session - - - org.springframework.boot - spring-boot-starter-redis - - - com.github.wxiaoqi - ace-api - 1.0-SNAPSHOT - - - com.alibaba - fastjson - 1.2.33 - - - io.jsonwebtoken - jjwt - 0.6.0 - - - - org.springframework.cloud - spring-cloud-config-client - - - - ace-gate - - - org.springframework.boot - spring-boot-maven-plugin - - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - - package - - build - - - - - ${docker.image.prefix}/${project.artifactId} - ${project.basedir}/src/main/docker - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - - - + pom + + ace-gate-ratelimit + ace-gate-zuul + ace-gateway-v2 + + \ No newline at end of file diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/biz/UserSecurity.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/biz/UserSecurity.java deleted file mode 100644 index f8418776301a55e548b28a03d47c621a42143e60..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/biz/UserSecurity.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.wxiaoqi.security.gate.biz; - -import com.github.wxiaoqi.security.api.vo.user.UserInfo; -import com.github.wxiaoqi.security.gate.rpc.IUserService; -import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-21 8:39 - */ -@Service -public class UserSecurity { - @Lazy - @Autowired - private IUserService userService; - - @HystrixCommand(fallbackMethod = "fallbackMethod") - public UserInfo getUserByUsername(String username){ - return userService.getUserByUsername(username); - } - public UserInfo fallbackMethod(String username){ - return new UserInfo(); - } -} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/config/WebSecurityConfig.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/config/WebSecurityConfig.java deleted file mode 100644 index 4e4e920751c61c37ea128c18131e1f629cae8a6b..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/config/WebSecurityConfig.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.github.wxiaoqi.security.gate.config; - -import com.github.wxiaoqi.security.gate.jwt.JwtAuthenticationTokenFilter; -import com.github.wxiaoqi.security.gate.service.GateUserDetailsService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -import java.util.List; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-02 12:02 - */ -@Configuration -@EnableWebSecurity -public class WebSecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - private GateUserDetailsService detailsService; - @Value("${gate.ignore.startWith}") - private String startWith; - - @Override - protected void configure(HttpSecurity http) throws Exception { - http.formLogin().loginPage("/login").defaultSuccessUrl("/admin/index").permitAll().and() - .logout().logoutSuccessUrl("/login").invalidateHttpSession(true).and().authorizeRequests() - .antMatchers("/**/*.css", "/img/**", "/**/*.js","/api/**","/*/api/**") // 放开"/api/**",通过oauth2.0来鉴权 - .permitAll().and().authorizeRequests().antMatchers("/**").authenticated(); - http.csrf().disable(); - http.headers().frameOptions().disable(); - http.httpBasic(); - // 添加JWT filter - http .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class); - - // 禁用缓存 - http.headers().cacheControl(); - http.headers().contentTypeOptions().disable(); - } - - @Override - public void configure(AuthenticationManagerBuilder auth) throws Exception { - auth.userDetailsService(detailsService).passwordEncoder(new BCryptPasswordEncoder()); - } - @Bean - public JwtAuthenticationTokenFilter authenticationTokenFilterBean() throws Exception { - return new JwtAuthenticationTokenFilter(); - } -} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/controller/SecurityController.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/controller/SecurityController.java deleted file mode 100644 index fc513ad83dc2185210c01d807451ed18c03fc708..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/controller/SecurityController.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.wxiaoqi.security.gate.controller; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-02 13:43 - */ -@Controller -public class SecurityController { - @RequestMapping(value = "/login",method = RequestMethod.GET) - public String login() { - return "login"; - } -} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtAuthenticationTokenFilter.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtAuthenticationTokenFilter.java deleted file mode 100644 index 1dcd7d563cb74ea354ad1e229cbe90f65a68fdc5..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtAuthenticationTokenFilter.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.github.wxiaoqi.security.gate.jwt; - - -import com.github.wxiaoqi.security.gate.service.GateUserDetailsService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@SuppressWarnings("SpringJavaAutowiringInspection") -@Component -public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { - - @Autowired - private GateUserDetailsService userDetailsService; - - @Autowired - private JwtTokenUtil jwtTokenUtil; - - @Value("${gate.jwt.header}") - private String tokenHeader; - - @Override - protected void doFilterInternal( - HttpServletRequest request, - HttpServletResponse response, - FilterChain chain) throws ServletException, IOException { - String authToken = request.getHeader(this.tokenHeader); - if (authToken != null) { - String username = jwtTokenUtil.getUsernameFromToken(authToken); - logger.info("checking authentication " + username); - if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { - UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); - if (jwtTokenUtil.validateToken(authToken, userDetails)) { - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails( - request)); - logger.info("authenticated user " + username + ", setting security context"); - SecurityContextHolder.getContext().setAuthentication(authentication); - }else{ - response.setStatus(401); - response.getWriter().print("Toekn error!"); - return ; - } - } - } - - chain.doFilter(request, response); - } -} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtTokenUtil.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtTokenUtil.java deleted file mode 100755 index 99800fca5f5ca0b677db9118097a93875c952428..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/jwt/JwtTokenUtil.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.github.wxiaoqi.security.gate.jwt; - -import com.github.wxiaoqi.security.api.vo.gate.ClientInfo; -import com.github.wxiaoqi.security.api.vo.user.UserInfo; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.stereotype.Component; - -import java.io.Serializable; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -@Component -public class JwtTokenUtil implements Serializable { - - private static final long serialVersionUID = -3301605591108950415L; - - private static final String CLAIM_KEY_USERNAME = "sub"; - private static final String CLAIM_KEY_CREATED = "created"; - - @Value("${gate.jwt.secret}") - private String secret; - - @Value("${gate.jwt.expiration}") - private Long expiration; - - public String getUsernameFromToken(String token) { - String username; - try { - final Claims claims = getClaimsFromToken(token); - username = claims.getSubject(); - } catch (Exception e) { - username = null; - } - return username; - } - - public Date getCreatedDateFromToken(String token) { - Date created; - try { - final Claims claims = getClaimsFromToken(token); - created = new Date((Long) claims.get(CLAIM_KEY_CREATED)); - } catch (Exception e) { - created = null; - } - return created; - } - - public Date getExpirationDateFromToken(String token) { - Date expiration; - try { - final Claims claims = getClaimsFromToken(token); - expiration = claims.getExpiration(); - } catch (Exception e) { - expiration = null; - } - return expiration; - } - - private Claims getClaimsFromToken(String token) { - Claims claims; - try { - claims = Jwts.parser() - .setSigningKey(secret) - .parseClaimsJws(token) - .getBody(); - } catch (Exception e) { - claims = null; - } - return claims; - } - - private Date generateExpirationDate() { - return new Date(System.currentTimeMillis() + expiration * 1000); - } - - public Boolean isTokenExpired(String token) { - final Date expiration = getExpirationDateFromToken(token); - return expiration.before(new Date()); - } - - private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) { - return (lastPasswordReset != null && created.before(lastPasswordReset)); - } - - public String generateToken(UserInfo info) { - Map claims = new HashMap(); - claims.put(CLAIM_KEY_USERNAME, info.getUsername()); - claims.put(CLAIM_KEY_CREATED, new Date()); - return generateToken(claims); - } - - String generateToken(Map claims) { - return Jwts.builder() - .setClaims(claims) - .setExpiration(generateExpirationDate()) - .signWith(SignatureAlgorithm.HS512, secret) - .compact(); - } - - public Boolean canTokenBeRefreshed(String token, Date lastPasswordReset) { - final Date created = getCreatedDateFromToken(token); - return !isCreatedBeforeLastPasswordReset(created, lastPasswordReset) - && !isTokenExpired(token); - } - - public String refreshToken(String token) { - String refreshedToken; - try { - final Claims claims = getClaimsFromToken(token); - claims.put(CLAIM_KEY_CREATED, new Date()); - refreshedToken = generateToken(claims); - } catch (Exception e) { - refreshedToken = null; - } - return refreshedToken; - } - - public Boolean validateToken(String token, UserDetails info) { - final String username = getUsernameFromToken(token); - final Date created = getCreatedDateFromToken(token); - return ( - username.equals(info.getUsername()) - && !isTokenExpired(token)); - } -} - diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/AuthService.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/AuthService.java deleted file mode 100755 index 5f6208f2e7bec2f6665a53530891a71f09609233..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/AuthService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.wxiaoqi.security.gate.service; - - -public interface AuthService { - String login(String clientId, String secret); - String refresh(String oldToken); - Boolean validate(String token, String resource); -} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/AuthServiceImpl.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/AuthServiceImpl.java deleted file mode 100755 index f15b324e5bba888b15dafd6da2cf753c70e36042..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/AuthServiceImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.github.wxiaoqi.security.gate.service; - -import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; -import com.github.wxiaoqi.security.api.vo.user.UserInfo; -import com.github.wxiaoqi.security.gate.jwt.JwtTokenUtil; -import com.github.wxiaoqi.security.gate.rpc.IUserService; -import com.google.common.base.Predicate; -import com.google.common.collect.Collections2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.stereotype.Service; - -import java.util.Collection; -import java.util.List; -import java.util.regex.Pattern; - -@Service -public class AuthServiceImpl implements AuthService { - - private JwtTokenUtil jwtTokenUtil; - private IUserService userService; - private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(12); - - @Autowired - public AuthServiceImpl( - JwtTokenUtil jwtTokenUtil, - IUserService userService) { - this.jwtTokenUtil = jwtTokenUtil; - this.userService = userService; - } - - - @Override - public String login(String username, String password) { - UserInfo info = userService.getUserByUsername(username); - String token = ""; - if(encoder.matches(password,info.getPassword())) { - token = jwtTokenUtil.generateToken(info); - } - return token; - } - - @Override - public String refresh(String token) { - String username = jwtTokenUtil.getUsernameFromToken(token); - UserInfo info = userService.getUserByUsername(username); - if (jwtTokenUtil.canTokenBeRefreshed(token,info.getUpdTime())){ - return jwtTokenUtil.refreshToken(token); - } - return null; - } - - @Override - public Boolean validate(String token,String resource) { - String username = jwtTokenUtil.getUsernameFromToken(token); - UserInfo info = userService.getUserByUsername(username); - return info.getUsername().equals(username)&&!jwtTokenUtil.isTokenExpired(token)&&validateResource(username,resource); - } - - public Boolean validateResource(String username, String resource){ - String [] res = resource.split(":"); - final String requestUri = res[0]; - final String method = res[1]; - List clientPermissionInfo = userService.getPermissionByUsername(username); - Collection result = Collections2.filter(clientPermissionInfo, new Predicate() { - @Override - public boolean apply(PermissionInfo permissionInfo) { - String url = permissionInfo.getUri(); - String uri = url.replaceAll("\\{\\*\\}", "[a-zA-Z\\\\d]+"); - String regEx = "^" + uri + "$"; - return (Pattern.compile(regEx).matcher(requestUri).find() || requestUri.startsWith(url + "/")) - && method.equals(permissionInfo.getMethod()); - } - }); - if (result.size() <= 0) { - return false; - } - return true; - } -} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/GateUserDetailsService.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/GateUserDetailsService.java deleted file mode 100644 index 7e74f8f5c8f2aa0009c4ee9b8d796cbf5ef231ac..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/service/GateUserDetailsService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.wxiaoqi.security.gate.service; - -import com.github.wxiaoqi.security.api.vo.user.UserInfo; -import com.github.wxiaoqi.security.gate.biz.UserSecurity; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -import java.util.HashSet; -import java.util.Set; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-22 13:00 - */ -@Service -public class GateUserDetailsService implements UserDetailsService { - @Autowired - private UserSecurity userSecurity; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - if (StringUtils.isBlank(username)) { - throw new UsernameNotFoundException("用户名为空"); - } - - UserInfo info = userSecurity.getUserByUsername(username); - Set authorities = new HashSet(); - return new org.springframework.security.core.userdetails.User(username, info.getPassword(), - true, // 是否可用 - true, // 是否过期 - true, // 证书不过期为true - true, // 账户未锁定为true - authorities); - } -} diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/session/SessionApplicationInitializer.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/session/SessionApplicationInitializer.java deleted file mode 100644 index a197a3a371ec4a8827e1fb893faa25806bdf8f66..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/session/SessionApplicationInitializer.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.wxiaoqi.security.gate.session; - -import org.springframework.security.web.session.HttpSessionEventPublisher; -import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer; -import org.springframework.stereotype.Service; - -import javax.servlet.ServletContext; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-23 8:37 - */ -@Service -public class SessionApplicationInitializer extends AbstractHttpSessionApplicationInitializer { - @Override - protected void afterSessionRepositoryFilter(ServletContext servletContext) { - servletContext.addListener(new HttpSessionEventPublisher()); - } -} \ No newline at end of file diff --git a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/session/SessionConfig.java b/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/session/SessionConfig.java deleted file mode 100644 index 26d7932e56699e2d638fcd1ff4b5403589b0c973..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/java/com/github/wxiaoqi/security/gate/session/SessionConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.github.wxiaoqi.security.gate.session; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.session.data.redis.config.ConfigureRedisAction; - -/** - * ${DESCRIPTION} - * - * @author wanghaobin - * @create 2017-06-23 8:33 - */ -@Configuration -public class SessionConfig { - @Bean - public static ConfigureRedisAction configureRedisAction() { - return ConfigureRedisAction.NO_OP; - } -} diff --git a/ace-gate/src/main/resources/application.yml b/ace-gate/src/main/resources/application.yml deleted file mode 100644 index 1168e4e6700426c4aa1dc7545abf7cd5b133cd26..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/resources/application.yml +++ /dev/null @@ -1,65 +0,0 @@ -spring: - application: - name: admin-gate - thymeleaf: - mode: LEGACYHTML5 - cache: false - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: GMT+8 - default-property-inclusion: non_null - redis: - database: 1 - host: 127.0.0.1 - pool: - max-active: 20 -server: - port: 8765 #启动端口 -# -zuul: - routes: - back: - path: /back/** - serviceId: admin-back - - ui: - path: /admin/** - serviceId: admin-ui - - blog: - path: /blog/** - serviceId: blog-admin - -ribbon: - eureka: - enabled: true - -eureka: - instance: - statusPageUrlPath: /info - healthCheckUrlPath: /health - # docker 部署开启 -# prefer-ip-address: true -# ip-address: 127.0.0.1 - client: - serviceUrl: - defaultZone: http://localhost:8761/eureka/ - # docker 部署开启 -# defaultZone: http://center:8761/eureka/ -security: - user: - name: admin - password: admin - role: USER - -#gate: -# ignore: -# startWith: /static -# contain: . -# oauth: -# prefix: /api -# -# jwt: -# secret: Xe*g@1jda -# expiration: 7200 -# header: access-token \ No newline at end of file diff --git a/ace-gate/src/main/resources/bootstrap.yml b/ace-gate/src/main/resources/bootstrap.yml deleted file mode 100644 index f1bf7be3bb28689c2d908112bc5b4845f3ea34b5..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,26 +0,0 @@ -spring: - cloud: - config: - label: master - uri: http://localhost:8750 - name: gate - profile: dev - -hystrix: - command: - default: - execution: - isolation: - thread: - timeoutInMilliseconds: 5000 - -#请求和响应GZIP压缩支持 -feign: - compression: - request: - enabled: true - mime-types: text/xml,application/xml,application/json - min-request-size: 2048 - response: - enabled: true - diff --git a/ace-gate/src/main/resources/static/css/styles.css b/ace-gate/src/main/resources/static/css/styles.css deleted file mode 100644 index 324e742c98b9ea4818db1e38af4d727fa1632a0f..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/resources/static/css/styles.css +++ /dev/null @@ -1,234 +0,0 @@ -/*@import url(http://fonts.useso.com/css?family=Source+Sans+Pro:200,300);*/ -* { - box-sizing: border-box; - margin: 0; - padding: 0; - font-weight: 300; -} -body { - font-family: 'Source Sans Pro', sans-serif; - color: white; - font-weight: 300; -} -body ::-webkit-input-placeholder { - /* WebKit browsers */ - font-family: 'Source Sans Pro', sans-serif; - color: white; - font-weight: 300; -} -body :-moz-placeholder { - /* Mozilla Firefox 4 to 18 */ - font-family: 'Source Sans Pro', sans-serif; - color: white; - opacity: 1; - font-weight: 300; -} -body ::-moz-placeholder { - /* Mozilla Firefox 19+ */ - font-family: 'Source Sans Pro', sans-serif; - color: white; - opacity: 1; - font-weight: 300; -} -body :-ms-input-placeholder { - /* Internet Explorer 10+ */ - font-family: 'Source Sans Pro', sans-serif; - color: white; - font-weight: 300; -} -.wrapper { - background: #50a3a2; - background: -webkit-linear-gradient(top left, #50a3a2 0%, #53e3a6 100%); - background: linear-gradient(to bottom right, #50a3a2 0%, #53e3a6 100%); - opacity: 0.8; - position: absolute; - top: 50%; - left: 0; - width: 100%; - height: 400px; - margin-top: -200px; - overflow: hidden; - -} - -.wrapper.form-success .container h1 { - -webkit-transform: translateY(85px); - -ms-transform: translateY(85px); - transform: translateY(85px); -} -.container { - max-width: 600px; - margin: 0 auto; - padding: 80px 0; - height: 400px; - text-align: center; -} -.container h1 { - font-size: 40px; - -webkit-transition-duration: 1s; - transition-duration: 1s; - -webkit-transition-timing-function: ease-in-put; - transition-timing-function: ease-in-put; - font-weight: 200; -} -form { - padding: 20px 0; - position: relative; - z-index: 2; -} -form input { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - outline: 0; - border: 1px solid rgba(255, 255, 255, 0.4); - background-color: rgba(255, 255, 255, 0.2); - width: 250px; - border-radius: 3px; - padding: 10px 15px; - margin: 0 auto 10px auto; - display: block; - text-align: center; - font-size: 18px; - color: white; - -webkit-transition-duration: 0.25s; - transition-duration: 0.25s; - font-weight: 300; -} -form input:hover { - background-color: rgba(255, 255, 255, 0.4); -} -form input:focus { - background-color: white; - width: 300px; - color: #53e3a6; -} -form button { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - outline: 0; - background-color: white; - border: 0; - padding: 10px 15px; - color: #53e3a6; - border-radius: 3px; - width: 250px; - cursor: pointer; - font-size: 18px; - -webkit-transition-duration: 0.25s; - transition-duration: 0.25s; -} -form button:hover { - background-color: #f5f7f9; -} -.bg-bubbles { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 1; -} -.bg-bubbles li { - position: absolute; - list-style: none; - display: block; - width: 40px; - height: 40px; - background-color: rgba(255, 255, 255, 0.15); - bottom: -160px; - -webkit-animation: square 25s infinite; - animation: square 25s infinite; - -webkit-transition-timing-function: linear; - transition-timing-function: linear; -} -.bg-bubbles li:nth-child(1) { - left: 10%; -} -.bg-bubbles li:nth-child(2) { - left: 20%; - width: 80px; - height: 80px; - -webkit-animation-delay: 2s; - animation-delay: 2s; - -webkit-animation-duration: 17s; - animation-duration: 17s; -} -.bg-bubbles li:nth-child(3) { - left: 25%; - -webkit-animation-delay: 4s; - animation-delay: 4s; -} -.bg-bubbles li:nth-child(4) { - left: 40%; - width: 60px; - height: 60px; - -webkit-animation-duration: 22s; - animation-duration: 22s; - background-color: rgba(255, 255, 255, 0.25); -} -.bg-bubbles li:nth-child(5) { - left: 70%; -} -.bg-bubbles li:nth-child(6) { - left: 80%; - width: 120px; - height: 120px; - -webkit-animation-delay: 3s; - animation-delay: 3s; - background-color: rgba(255, 255, 255, 0.2); -} -.bg-bubbles li:nth-child(7) { - left: 32%; - width: 160px; - height: 160px; - -webkit-animation-delay: 7s; - animation-delay: 7s; -} -.bg-bubbles li:nth-child(8) { - left: 55%; - width: 20px; - height: 20px; - -webkit-animation-delay: 15s; - animation-delay: 15s; - -webkit-animation-duration: 40s; - animation-duration: 40s; -} -.bg-bubbles li:nth-child(9) { - left: 25%; - width: 10px; - height: 10px; - -webkit-animation-delay: 2s; - animation-delay: 2s; - -webkit-animation-duration: 40s; - animation-duration: 40s; - background-color: rgba(255, 255, 255, 0.3); -} -.bg-bubbles li:nth-child(10) { - left: 90%; - width: 160px; - height: 160px; - -webkit-animation-delay: 11s; - animation-delay: 11s; -} -@-webkit-keyframes square { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - 100% { - -webkit-transform: translateY(-700px) rotate(600deg); - transform: translateY(-700px) rotate(600deg); - } -} -@keyframes square { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - 100% { - -webkit-transform: translateY(-700px) rotate(600deg); - transform: translateY(-700px) rotate(600deg); - } -} \ No newline at end of file diff --git a/ace-gate/src/main/resources/static/js/jquery-2.1.1.min.js b/ace-gate/src/main/resources/static/js/jquery-2.1.1.min.js deleted file mode 100644 index c4643af627cb26ee8abe0ecd392847f3340be1a5..0000000000000000000000000000000000000000 --- a/ace-gate/src/main/resources/static/js/jquery-2.1.1.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="

            ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) -},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*\s*$/g,ib={option:[1,""],thead:[1,"","
            "],col:[2,"","
            "],tr:[2,"","
            "],td:[3,"","
            "],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("--> + + +